diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 4dcfbcc..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,91 +0,0 @@ -cmake_minimum_required(VERSION 3.20) -project(finch VERSION 2.4.0 LANGUAGES C CXX) # C: LLVM's CMake config checks C headers on some systems - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -find_package(LLVM REQUIRED CONFIG) -message(STATUS "Using LLVM ${LLVM_PACKAGE_VERSION}") - -add_executable(finch - src/main.cpp - src/lexer.cpp - src/parser.cpp - src/codegen.cpp - src/codegen_types.cpp - src/codegen_builtins.cpp - src/codegen_map.cpp - src/abi.cpp - src/cimport.cpp - src/target.cpp - src/loader.cpp - src/lsp.cpp -) - -# The runtime (runtime/finch_rt.c) is embedded into the compiler as a string; -# finch compiles it once into ~/.cache/finch and links it into every program. -set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/runtime/finch_rt.c) -# (written as several raw string pieces: MSVC limits one literal to 16 KB) -file(READ ${CMAKE_SOURCE_DIR}/runtime/finch_rt.c FINCH_RT_SOURCE) -string(LENGTH "${FINCH_RT_SOURCE}" FINCH_RT_LENGTH) -set(FINCH_RT_INC "static const char *kRuntimeSource =\n") -set(FINCH_RT_POS 0) -while(FINCH_RT_POS LESS FINCH_RT_LENGTH) - string(SUBSTRING "${FINCH_RT_SOURCE}" ${FINCH_RT_POS} 8000 FINCH_RT_PIECE) - string(APPEND FINCH_RT_INC "R\"FINCHRT(${FINCH_RT_PIECE})FINCHRT\"\n") - math(EXPR FINCH_RT_POS "${FINCH_RT_POS} + 8000") -endwhile() -string(APPEND FINCH_RT_INC ";\n") -file(WRITE ${CMAKE_BINARY_DIR}/rt_source.inc "${FINCH_RT_INC}") -target_include_directories(finch PRIVATE ${CMAKE_BINARY_DIR}) - -# libclang reads C headers for `import "stdio.h"` -find_path(LIBCLANG_INCLUDE clang-c/Index.h HINTS ${LLVM_INCLUDE_DIRS}) -find_library(LIBCLANG NAMES clang libclang HINTS ${LLVM_LIBRARY_DIRS}) -if(NOT LIBCLANG_INCLUDE OR NOT LIBCLANG) - message(FATAL_ERROR "libclang not found (on Nix: run inside nix-shell)") -endif() - -target_include_directories(finch SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS} ${LIBCLANG_INCLUDE}) -target_compile_definitions(finch PRIVATE ${LLVM_DEFINITIONS} FINCH_VERSION="${PROJECT_VERSION}") -if(MSVC) - target_compile_options(finch PRIVATE /W3 /utf-8 /EHsc /wd4244 /wd4267 /wd4146 /wd4624) -else() - target_compile_options(finch PRIVATE -Wall -Wextra) -endif() - -# The official Windows LLVM package names the DIA SDK library at the path of the machine it was -# built on (Visual Studio 2019); point it at the Visual Studio installed here. -if(MSVC AND TARGET LLVMDebugInfoPDB AND DEFINED ENV{VSINSTALLDIR}) - get_target_property(FINCH_PDB_LIBS LLVMDebugInfoPDB INTERFACE_LINK_LIBRARIES) - if(FINCH_PDB_LIBS) - file(TO_CMAKE_PATH "$ENV{VSINSTALLDIR}DIA SDK/lib/amd64/diaguids.lib" FINCH_DIA_LIB) - list(TRANSFORM FINCH_PDB_LIBS REPLACE ".*diaguids\\.lib$" "${FINCH_DIA_LIB}") - set_target_properties(LLVMDebugInfoPDB PROPERTIES INTERFACE_LINK_LIBRARIES "${FINCH_PDB_LIBS}") - endif() -endif() - -# Link the one shared libLLVM when available: libclang uses it too, and two copies -# of LLVM in one process crash on exit. -# Finch generates code for x86-64 and ARM64; use whichever of them this LLVM was built with. -set(FINCH_BACKENDS) -foreach(t X86 AArch64) - if(t IN_LIST LLVM_TARGETS_TO_BUILD) - list(APPEND FINCH_BACKENDS ${t}) - string(TOUPPER ${t} T) - target_compile_definitions(finch PRIVATE FINCH_TARGET_${T}) - endif() -endforeach() -message(STATUS "Finch backends: ${FINCH_BACKENDS}") - -if(TARGET LLVM) - set(LLVM_LIBS LLVM) -else() - set(FINCH_COMPONENTS core support passes native) - foreach(t ${FINCH_BACKENDS}) - list(APPEND FINCH_COMPONENTS ${t}codegen ${t}asmparser ${t}desc ${t}info) - endforeach() - llvm_map_components_to_libnames(LLVM_LIBS ${FINCH_COMPONENTS}) -endif() -target_link_libraries(finch PRIVATE ${LLVM_LIBS} ${LIBCLANG}) diff --git a/bootstrap/build.sh b/bootstrap/build.sh new file mode 100755 index 0000000..d359f6e --- /dev/null +++ b/bootstrap/build.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# Builds the Finch compiler without a compiler for Finch: from the seed (the compiler's own LLVM IR), +# then from itself, and checks that the two come out the same. +# +# bootstrap/build.sh build/finch +# bootstrap/build.sh seed also write bootstrap/.ll anew (do this when the compiler got a feature +# its own source uses, or the seed is old: the next build starts from it) +# +# Needs clang and libclang (the C headers are read through it). The compiler is then in build/finch; it looks for the +# runtime and the standard library next to build/, in runtime/ and std/. +set -eu +cd "$(dirname "$0")/.." +mkdir -p build + +case "$(uname -s)-$(uname -m)" in + Linux-x86_64) seed=linux-x86_64 ;; + Linux-aarch64|Linux-arm64) seed=linux-aarch64 ;; + Darwin-arm64) seed=macos-arm64 ;; + Darwin-x86_64) seed=macos-x86_64 ;; + MINGW*|MSYS*|CYGWIN*) seed=windows-x86_64 ;; + *) echo "bootstrap: no seed for $(uname -s) $(uname -m) (see bootstrap/README.md)" >&2; exit 1 ;; +esac +[ -f "bootstrap/$seed.ll" ] || { echo "bootstrap: bootstrap/$seed.ll is missing" >&2; exit 1; } + +CLANG=${FINCH_CLANG:-clang} +LIBS=${FINCH_LIBCLANG:--lclang} +export FINCH_RT=$PWD/runtime/finch_rt.c + +echo "bootstrap: seed ($seed) -> build/finch0" +$CLANG -O1 -w "bootstrap/$seed.ll" runtime/finch_rt.c -o build/finch0 -lm $LIBS +echo "bootstrap: build/finch0 builds the compiler -> build/finch1" +build/finch0 build src/main.fch -o build/finch1 +echo "bootstrap: build/finch1 builds the compiler -> build/finch" +build/finch1 build src/main.fch -o build/finch + +# a compiler that builds itself must come out the same however many times it does +build/finch1 ir src/main.fch > build/stage1.ll +build/finch ir src/main.fch > build/stage2.ll +if cmp -s build/stage1.ll build/stage2.ll; then + echo "bootstrap: build/finch1 and build/finch make the same IR ($(wc -l < build/stage2.ll) lines): done" +else + echo "bootstrap: the compiler does not reproduce itself (build/stage1.ll and build/stage2.ll differ)" >&2 + exit 1 +fi + +if [ "${1:-}" = seed ]; then + cp build/stage2.ll "bootstrap/$seed.ll" + echo "bootstrap: wrote bootstrap/$seed.ll" +fi diff --git a/bootstrap/linux-x86_64.ll b/bootstrap/linux-x86_64.ll new file mode 100644 index 0000000..28068bd --- /dev/null +++ b/bootstrap/linux-x86_64.ll @@ -0,0 +1,79936 @@ +; generated by the Finch compiler written in Finch + +%S.main.Loader = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.lexer.Token = type { { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, i1 } +%S.lexer.Lexer = type { { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, i64, i1 } +%S.ast.Type = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i64 } +%S.ast.Node = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, %S.ast.Type, i1, i1, i1, { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, i64 } +%S.ast.Program = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.parser.Parser = type { { ptr, i64, i64 }, i64, i64, i64, { ptr, i64, i64 } } +%S.gen.Var = type { { ptr, i64, i64 }, %S.ast.Type, { ptr, i64, i64 }, i1, i64 } +%S.platform.Target = type { { ptr, i64, i64 }, i1, i1, i1, i1, i1, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.gen.Options = type { i1, i1, { ptr, i64, i64 }, %S.platform.Target } +%S.gen.Template = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, i1, i1 } +%S.gen.Binds = type { { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.gen.EnumDef = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.gen.Scope = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.gen.Loop = type { { ptr, i64, i64 }, { ptr, i64, i64 }, i64 } +%S.gen.FnSig = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i1, i1, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i1, i1, { ptr, i64, i64 }, %S.ast.Type, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64 } +%S.gen.StructDef = type { { ptr, i64, i64 }, { ptr, i64, i64 }, i1, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, i64, i1 } +%S.gen.Val = type { { ptr, i64, i64 }, %S.ast.Type, i1, i1 } +%S.gen.Place = type { { ptr, i64, i64 }, %S.ast.Type } +%S.gen.Ref = type { i1, %S.gen.Place, %S.gen.Val } +%S.cimport.CImports = type { { ptr, i64, i64, i64, ptr, i64, i64 }, { ptr, i64, i64, i64, ptr, i64, i64 }, { ptr, i64, i64, i64, ptr, i64, i64 }, { ptr, i64, i64, i64, ptr, i64, i64 }, { ptr, i64, i64 } } +%S.gen.Gen = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, i64, i1, { ptr, i64, i64 }, { ptr, i64, i64 }, %S.gen.FnSig, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i64, %S.cimport.CImports, i1, i1, %S.platform.Target, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64, i64, ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, i64, i64, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i1, i64, i64 } +%S.gen.Saved = type { { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i1, i64 } +%S.gen.SizeAlign = type { i64, i64 } +%S.gen.Fallible = type { %S.gen.Val, { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.gen.Abi = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i64 } +%S.gen.Leaf = type { i64, i64, i1, i1 } +%S.gen.Plan = type { %S.gen.Abi, { ptr, i64, i64 }, { ptr, i64, i64 }, i1 } +%S.cimport.CFunc = type { { ptr, i64, i64 }, { ptr, i64, i64 }, %S.ast.Type, { ptr, i64, i64 }, i1, { ptr, i64, i64 } } +%S.cimport.CConst = type { i1, i64, double, { ptr, i64, i64 } } +%S.cimport.CField = type { { ptr, i64, i64 }, %S.ast.Type, i64, i64, i64, i1 } +%S.cimport.CStruct = type { { ptr, i64, i64 }, { ptr, i64, i64 }, i64, i64, { ptr, i64, i64 }, i1 } +%S.cimport.Header = type { { ptr, i64, i64 }, { ptr, i64, i64 } } +%S.cimport.Mapped = type { %S.ast.Type, { ptr, i64, i64 }, i1 } +%S.cimport.Importer = type { %S.cimport.CImports, ptr, { ptr, i64, i64 }, { ptr, i64, i64, i64, ptr, i64, i64 }, { ptr, i64, i64, i64, ptr, i64, i64 }, i64 } +%S.cimport.FieldCtx = type { ptr, ptr } +%S.cimport.Number = type { %S.cimport.CConst, i1 } +%S.linker.Names = type { { ptr, i64, i64 } } +%S.linker.Build = type { { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, { ptr, i64, i64 }, i1, { ptr, i64, i64 } } +%S.C.fd_set = type { [16 x i64] } +%S.C.timeval = type { i64, i64 } +%S.C.timespec = type { i64, i64 } +%S.C.sigset_t = type { [16 x i64] } +%S.C.random_data = type { ptr, ptr, ptr, i32, i32, i32, [4 x i8], ptr } +%S.C.drand48_data = type { [3 x i16], [3 x i16], i16, i16, i64 } +%S.C.div_t = type { i32, i32 } +%S.C.ldiv_t = type { i64, i64 } +%S.C.lldiv_t = type { i64, i64 } +%S.C.CXString = type { ptr, i32, [4 x i8] } +%S.C.CXStringSet = type { ptr, i32, [4 x i8] } +%S.C.tm = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, [4 x i8], i64, ptr } +%S.C.__locale_struct = type { [13 x ptr], ptr, ptr, ptr, [13 x ptr] } +%S.C.itimerspec = type { %S.C.timespec, %S.C.timespec } +%S.C.CXFileUniqueID = type { [3 x i64] } +%S.C.CXSourceLocation = type { [2 x ptr], i32, [4 x i8] } +%S.C.CXSourceRange = type { [2 x ptr], i32, i32 } +%S.C.CXSourceRangeList = type { i32, [4 x i8], ptr } +%S.C.CXIndexOptions = type { i32, i8, i8, [2 x i8], ptr, ptr } +%S.C.CXUnsavedFile = type { ptr, ptr, i64 } +%S.C.CXTUResourceUsageEntry = type { i32, [4 x i8], i64 } +%S.C.CXTUResourceUsage = type { ptr, i32, [4 x i8], ptr } +%S.C.CXCursor = type { i32, i32, [3 x ptr] } +%S.C.CXVersion = type { i32, i32, i32 } +%S.C.CXPlatformAvailability = type { %S.C.CXString, %S.C.CXVersion, %S.C.CXVersion, %S.C.CXVersion, i32, %S.C.CXString } +%S.C.CXType = type { i32, [4 x i8], [2 x ptr] } +%S.C.CXToken = type { [4 x i32], ptr } +%S.C.CXCompletionResult = type { i32, [4 x i8], ptr } +%S.C.CXCodeCompleteResults = type { ptr, i32, [4 x i8] } +%S.C.CXCursorAndRangeVisitor = type { ptr, ptr } +%S.C.CXIdxLoc = type { [2 x ptr], i32, [4 x i8] } +%S.C.CXIdxAttrInfo = type { i32, [4 x i8], %S.C.CXCursor, %S.C.CXIdxLoc } +%S.C.CXIdxEntityInfo = type { i32, i32, i32, [4 x i8], ptr, ptr, %S.C.CXCursor, ptr, i32, [4 x i8] } +%S.C.CXIdxContainerInfo = type { %S.C.CXCursor } +%S.C.CXIdxDeclInfo = type { ptr, %S.C.CXCursor, %S.C.CXIdxLoc, ptr, ptr, i32, i32, i32, [4 x i8], ptr, i32, [4 x i8], ptr, i32, i32 } +%S.C.CXIdxObjCContainerDeclInfo = type { ptr, i32, [4 x i8] } +%S.C.CXIdxBaseClassInfo = type { ptr, %S.C.CXCursor, %S.C.CXIdxLoc } +%S.C.CXIdxObjCProtocolRefInfo = type { ptr, %S.C.CXCursor, %S.C.CXIdxLoc } +%S.C.CXIdxObjCProtocolRefListInfo = type { ptr, i32, [4 x i8] } +%S.C.CXIdxObjCInterfaceDeclInfo = type { ptr, ptr, ptr } +%S.C.CXIdxObjCCategoryDeclInfo = type { ptr, ptr, %S.C.CXCursor, %S.C.CXIdxLoc, ptr } +%S.C.CXIdxObjCPropertyDeclInfo = type { ptr, ptr, ptr } +%S.C.CXIdxIBOutletCollectionAttrInfo = type { ptr, ptr, %S.C.CXCursor, %S.C.CXIdxLoc } +%S.C.CXIdxCXXClassDeclInfo = type { ptr, ptr, i32, [4 x i8] } +%S.C.IndexerCallbacks = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr } +@.str.1 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.2 = private unnamed_addr constant [2 x i8] c".\00" +@.str.3 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.4 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.5 = private unnamed_addr constant [2 x i8] c".\00" +@.str.6 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.7 = private unnamed_addr constant [3 x i8] c"./\00" +@.str.8 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.9 = private unnamed_addr constant [2 x i8] c".\00" +@.str.10 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.11 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.12 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.13 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.14 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.15 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.16 = private unnamed_addr constant [27 x i8] c"used .os on a null pointer\00" +@.str.17 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.18 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.19 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.20 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.21 = private unnamed_addr constant [27 x i8] c"used .os on a null pointer\00" +@.str.22 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.23 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.24 = private unnamed_addr constant [30 x i8] c"used .paths on a null pointer\00" +@.str.25 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.26 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.27 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.28 = private unnamed_addr constant [27 x i8] c"used .os on a null pointer\00" +@.str.29 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.30 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.31 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.32 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.33 = private unnamed_addr constant [27 x i8] c"used .os on a null pointer\00" +@.str.34 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.35 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.36 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.37 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.38 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.39 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.40 = private unnamed_addr constant [28 x i8] c"used .std on a null pointer\00" +@.str.41 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.42 = private unnamed_addr constant [28 x i8] c"used .std on a null pointer\00" +@.str.43 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.44 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.45 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.46 = private unnamed_addr constant [27 x i8] c"used .os on a null pointer\00" +@.str.47 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.48 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.49 = private unnamed_addr constant [28 x i8] c"used .std on a null pointer\00" +@.str.50 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.51 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.52 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.53 = private unnamed_addr constant [27 x i8] c"used .os on a null pointer\00" +@.str.54 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.55 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.56 = private unnamed_addr constant [28 x i8] c"used .std on a null pointer\00" +@.str.57 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.58 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.59 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.60 = private unnamed_addr constant [28 x i8] c"used .std on a null pointer\00" +@.str.61 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.62 = private unnamed_addr constant [5 x i8] c".fch\00" +@.str.63 = private unnamed_addr constant [31 x i8] c"error: can't find the module '\00" +@.str.64 = private unnamed_addr constant [15 x i8] c"' (looked for \00" +@.str.65 = private unnamed_addr constant [2 x i8] c")\00" +@.str.66 = private unnamed_addr constant [1 x i8] c"\00" +@.str.67 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.68 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.69 = private unnamed_addr constant [20 x i8] c"error: can't open '\00" +@.str.70 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.71 = private unnamed_addr constant [1 x i8] c"\00" +@.str.72 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.73 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.74 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.75 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.76 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.77 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.78 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.79 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.80 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.81 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.82 = private unnamed_addr constant [31 x i8] c"used .loaded on a null pointer\00" +@.str.83 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.84 = private unnamed_addr constant [31 x i8] c"used .loaded on a null pointer\00" +@.str.85 = private unnamed_addr constant [42 x i8] c"Finch -- the compiler is written in Finch\00" +@.str.86 = private unnamed_addr constant [1 x i8] c"\00" +@.str.87 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.88 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.89 = private unnamed_addr constant [7 x i8] c"usage:\00" +@.str.90 = private unnamed_addr constant [1 x i8] c"\00" +@.str.91 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.92 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.93 = private unnamed_addr constant [61 x i8] c" finch run [args...] build and run a program\00" +@.str.94 = private unnamed_addr constant [1 x i8] c"\00" +@.str.95 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.96 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.97 = private unnamed_addr constant [53 x i8] c" finch build [-o name] build a program\00" +@.str.98 = private unnamed_addr constant [1 x i8] c"\00" +@.str.99 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.100 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.101 = private unnamed_addr constant [55 x i8] c" finch ir print the LLVM IR\00" +@.str.102 = private unnamed_addr constant [1 x i8] c"\00" +@.str.103 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.104 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.105 = private unnamed_addr constant [54 x i8] c" finch version show the version\00" +@.str.106 = private unnamed_addr constant [1 x i8] c"\00" +@.str.107 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.108 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.109 = private unnamed_addr constant [9 x i8] c"options:\00" +@.str.110 = private unnamed_addr constant [1 x i8] c"\00" +@.str.111 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.112 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.113 = private unnamed_addr constant [54 x i8] c" -O0 no optimization (faster to build)\00" +@.str.114 = private unnamed_addr constant [1 x i8] c"\00" +@.str.115 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.116 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.117 = private unnamed_addr constant [77 x i8] c" -l link a library (the same as link \22lib\22 in the program)\00" +@.str.118 = private unnamed_addr constant [1 x i8] c"\00" +@.str.119 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.120 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.121 = private unnamed_addr constant [58 x i8] c" -I look for imported C headers there too\00" +@.str.122 = private unnamed_addr constant [1 x i8] c"\00" +@.str.123 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.124 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.125 = private unnamed_addr constant [67 x i8] c" -g debug info (for gdb and lldb; use -O0 with it)\00" +@.str.126 = private unnamed_addr constant [1 x i8] c"\00" +@.str.127 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.128 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.129 = private unnamed_addr constant [102 x i8] c" --target build for another system: windows, linux, arm64 (Linux), macos, or an LLVM triple\00" +@.str.130 = private unnamed_addr constant [1 x i8] c"\00" +@.str.131 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.132 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.133 = private unnamed_addr constant [79 x i8] c"not in this compiler yet: lsp. It is in the C++ one (branch before-bootstrap).\00" +@.str.134 = private unnamed_addr constant [1 x i8] c"\00" +@.str.135 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.136 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.137 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.138 = private unnamed_addr constant [8 x i8] c"version\00" +@.str.139 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.140 = private unnamed_addr constant [10 x i8] c"--version\00" +@.str.141 = private unnamed_addr constant [47 x i8] c"Finch 2.4.0 (the compiler is written in Finch)\00" +@.str.142 = private unnamed_addr constant [1 x i8] c"\00" +@.str.143 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.144 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.145 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.146 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.147 = private unnamed_addr constant [6 x i8] c"build\00" +@.str.148 = private unnamed_addr constant [4 x i8] c"run\00" +@.str.149 = private unnamed_addr constant [3 x i8] c"ir\00" +@.str.150 = private unnamed_addr constant [1 x i8] c"\00" +@.str.151 = private unnamed_addr constant [4 x i8] c"-O2\00" +@.str.152 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.153 = private unnamed_addr constant [4 x i8] c"run\00" +@.str.154 = private unnamed_addr constant [3 x i8] c"-o\00" +@.str.155 = private unnamed_addr constant [6 x i8] c"build\00" +@.str.156 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.157 = private unnamed_addr constant [9 x i8] c"--shared\00" +@.str.158 = private unnamed_addr constant [6 x i8] c"build\00" +@.str.159 = private unnamed_addr constant [4 x i8] c"-O0\00" +@.str.160 = private unnamed_addr constant [4 x i8] c"-O0\00" +@.str.161 = private unnamed_addr constant [3 x i8] c"-l\00" +@.str.162 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.163 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.164 = private unnamed_addr constant [3 x i8] c"-l\00" +@.str.165 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.166 = private unnamed_addr constant [3 x i8] c"-I\00" +@.str.167 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.168 = private unnamed_addr constant [3 x i8] c"-g\00" +@.str.169 = private unnamed_addr constant [9 x i8] c"--target\00" +@.str.170 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.171 = private unnamed_addr constant [4 x i8] c"run\00" +@.str.172 = private unnamed_addr constant [4 x i8] c"run\00" +@.str.173 = private unnamed_addr constant [16 x i8] c"/tmp/finch_run_\00" +@.str.174 = private unnamed_addr constant [5 x i8] c".dll\00" +@.str.175 = private unnamed_addr constant [4 x i8] c"lib\00" +@.str.176 = private unnamed_addr constant [7 x i8] c".dylib\00" +@.str.177 = private unnamed_addr constant [4 x i8] c"lib\00" +@.str.178 = private unnamed_addr constant [4 x i8] c".so\00" +@.str.179 = private unnamed_addr constant [6 x i8] c"linux\00" +@.str.180 = private unnamed_addr constant [8 x i8] c"windows\00" +@.str.181 = private unnamed_addr constant [6 x i8] c"macos\00" +@.str.182 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.183 = private unnamed_addr constant [8 x i8] c"/../std\00" +@.str.184 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.185 = private unnamed_addr constant [5 x i8] c"/std\00" +@.str.186 = private unnamed_addr constant [4 x i8] c"std\00" +@.str.187 = private unnamed_addr constant [10 x i8] c"/path.fch\00" +@.str.188 = private unnamed_addr constant [11 x i8] c"FINCH_PATH\00" +@.str.189 = private unnamed_addr constant [1 x i8] c"\00" +declare ptr @getenv(ptr) +@.str.190 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.191 = private unnamed_addr constant [2 x i8] c":\00" +@.str.192 = private unnamed_addr constant [1 x i8] c"\00" +@.str.193 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.194 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.195 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.196 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.197 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.198 = private unnamed_addr constant [3 x i8] c".c\00" +@.str.199 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.200 = private unnamed_addr constant [3 x i8] c".o\00" +@.str.201 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.202 = private unnamed_addr constant [3 x i8] c".a\00" +@.str.203 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.204 = private unnamed_addr constant [1 x i8] c"\00" +@.str.205 = private unnamed_addr constant [1 x i8] c"\00" +@.str.206 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.207 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.208 = private unnamed_addr constant [4 x i8] c"PWD\00" +@.str.209 = private unnamed_addr constant [1 x i8] c"\00" +@.str.210 = private unnamed_addr constant [3 x i8] c"ir\00" +@.str.211 = private unnamed_addr constant [1 x i8] c"\00" +@.str.212 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.213 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.214 = private unnamed_addr constant [9 x i8] c"FINCH_RT\00" +@.str.215 = private unnamed_addr constant [1 x i8] c"\00" +@.str.216 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.217 = private unnamed_addr constant [23 x i8] c"/../runtime/finch_rt.c\00" +@.str.218 = private unnamed_addr constant [13 x i8] c"src/main.fch\00" +@.str.219 = private unnamed_addr constant [20 x i8] c"/runtime/finch_rt.c\00" +@.str.220 = private unnamed_addr constant [19 x i8] c"runtime/finch_rt.c\00" +@.str.221 = private unnamed_addr constant [19 x i8] c"runtime/finch_rt.c\00" +@.str.222 = private unnamed_addr constant [57 x i8] c"error: can't find the Finch runtime (runtime/finch_rt.c)\00" +@.str.223 = private unnamed_addr constant [1 x i8] c"\00" +@.str.224 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.225 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.226 = private unnamed_addr constant [1 x i8] c"\00" +@.str.227 = private unnamed_addr constant [7 x i8] c" -fPIC\00" +@.str.228 = private unnamed_addr constant [4 x i8] c" -g\00" +@.str.229 = private unnamed_addr constant [4 x i8] c"run\00" +@.str.230 = private unnamed_addr constant [2 x i8] c" \00" +@.str.231 = private unnamed_addr constant [2 x i8] c" \00" +@.str.232 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.233 = private unnamed_addr constant [3 x i8] c"fn\00" +@.str.234 = private unnamed_addr constant [7 x i8] c"return\00" +@.str.235 = private unnamed_addr constant [3 x i8] c"if\00" +@.str.236 = private unnamed_addr constant [5 x i8] c"else\00" +@.str.237 = private unnamed_addr constant [6 x i8] c"while\00" +@.str.238 = private unnamed_addr constant [4 x i8] c"for\00" +@.str.239 = private unnamed_addr constant [3 x i8] c"in\00" +@.str.240 = private unnamed_addr constant [6 x i8] c"break\00" +@.str.241 = private unnamed_addr constant [9 x i8] c"continue\00" +@.str.242 = private unnamed_addr constant [5 x i8] c"true\00" +@.str.243 = private unnamed_addr constant [6 x i8] c"false\00" +@.str.244 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.245 = private unnamed_addr constant [7 x i8] c"import\00" +@.str.246 = private unnamed_addr constant [5 x i8] c"link\00" +@.str.247 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.248 = private unnamed_addr constant [6 x i8] c"defer\00" +@.str.249 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.250 = private unnamed_addr constant [4 x i8] c"try\00" +@.str.251 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.252 = private unnamed_addr constant [6 x i8] c"match\00" +@.str.253 = private unnamed_addr constant [7 x i8] c"export\00" +@.str.254 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.255 = private unnamed_addr constant [29 x i8] c"used .path on a null pointer\00" +@.str.256 = private unnamed_addr constant [2 x i8] c":\00" +@.str.257 = private unnamed_addr constant [2 x i8] c":\00" +@.str.258 = private unnamed_addr constant [10 x i8] c": error: \00" +@.str.259 = private unnamed_addr constant [1 x i8] c"\00" +@.str.260 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.261 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.262 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.263 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.264 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.265 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.266 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.267 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.268 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.269 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.270 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.271 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.272 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.273 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.274 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.275 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.276 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.277 = private unnamed_addr constant [29 x i8] c"used .line on a null pointer\00" +@.str.278 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.279 = private unnamed_addr constant [28 x i8] c"used .col on a null pointer\00" +@.str.280 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.281 = private unnamed_addr constant [27 x i8] c"used .nl on a null pointer\00" +@.str.282 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.283 = private unnamed_addr constant [28 x i8] c"used .col on a null pointer\00" +@.str.284 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.285 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.286 = private unnamed_addr constant [3 x i8] c"->\00" +@.str.287 = private unnamed_addr constant [3 x i8] c"<<\00" +@.str.288 = private unnamed_addr constant [3 x i8] c">>\00" +@.str.289 = private unnamed_addr constant [3 x i8] c"<=\00" +@.str.290 = private unnamed_addr constant [3 x i8] c">=\00" +@.str.291 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.292 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.293 = private unnamed_addr constant [3 x i8] c"&&\00" +@.str.294 = private unnamed_addr constant [3 x i8] c"||\00" +@.str.295 = private unnamed_addr constant [3 x i8] c"..\00" +@.str.296 = private unnamed_addr constant [3 x i8] c":=\00" +@.str.297 = private unnamed_addr constant [3 x i8] c"+=\00" +@.str.298 = private unnamed_addr constant [3 x i8] c"-=\00" +@.str.299 = private unnamed_addr constant [3 x i8] c"*=\00" +@.str.300 = private unnamed_addr constant [3 x i8] c"/=\00" +@.str.301 = private unnamed_addr constant [3 x i8] c"%=\00" +@.str.302 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.303 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.304 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.305 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.306 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.307 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.308 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.309 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.310 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.311 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.312 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.313 = private unnamed_addr constant [23 x i8] c"(){}[],.:+-*/%&|^~<>=!\00" +@.str.314 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.315 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.316 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.317 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.318 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.319 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.320 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.321 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.322 = private unnamed_addr constant [1 x i8] c"\00" +@.str.323 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.324 = private unnamed_addr constant [29 x i8] c"used .line on a null pointer\00" +@.str.325 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.326 = private unnamed_addr constant [28 x i8] c"used .col on a null pointer\00" +@.str.327 = private unnamed_addr constant [17 x i8] c"unknown escape \5C\00" +@.str.328 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.329 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.330 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.331 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.332 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.333 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.334 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.335 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.336 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.337 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.338 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.339 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.340 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.341 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.342 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.343 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.344 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.345 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.346 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.347 = private unnamed_addr constant [29 x i8] c"used .line on a null pointer\00" +@.str.348 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.349 = private unnamed_addr constant [28 x i8] c"used .col on a null pointer\00" +@.str.350 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.351 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.352 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.353 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.354 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.355 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.356 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.357 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.358 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.359 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.360 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.361 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.362 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.363 = private unnamed_addr constant [37 x i8] c"comment is never closed (missing */)\00" +@.str.364 = private unnamed_addr constant [1 x i8] c"\00" +@.str.365 = private unnamed_addr constant [1 x i8] c"\00" +@.str.366 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.367 = private unnamed_addr constant [29 x i8] c"used .line on a null pointer\00" +@.str.368 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.369 = private unnamed_addr constant [28 x i8] c"used .col on a null pointer\00" +@.str.370 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.371 = private unnamed_addr constant [27 x i8] c"used .nl on a null pointer\00" +@.str.372 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.373 = private unnamed_addr constant [27 x i8] c"used .nl on a null pointer\00" +@.str.374 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.375 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.376 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.377 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.378 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.379 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.380 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.381 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.382 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.383 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.384 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.385 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.386 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.387 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.388 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.389 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.390 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.391 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.392 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.393 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.394 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.395 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.396 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.397 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.398 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.399 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.400 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.401 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.402 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.403 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.404 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.405 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.406 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.407 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.408 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.409 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.410 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.411 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.412 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.413 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.414 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.415 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.416 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.417 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.418 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.419 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.420 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.421 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.422 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.423 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.424 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.425 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.426 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.427 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.428 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.429 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.430 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.431 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.432 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.433 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.434 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.435 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.436 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.437 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.438 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.439 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.440 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.441 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.442 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.443 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.444 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.445 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.446 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.447 = private unnamed_addr constant [1 x i8] c"\00" +@.str.448 = private unnamed_addr constant [7 x i8] c"string\00" +@.str.449 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.450 = private unnamed_addr constant [35 x i8] c"string is never closed (missing \22)\00" +@.str.451 = private unnamed_addr constant [33 x i8] c"char is never closed (missing ')\00" +@.str.452 = private unnamed_addr constant [1 x i8] c"\00" +@.str.453 = private unnamed_addr constant [45 x i8] c"a char holds exactly one character, like 'a'\00" +@.str.454 = private unnamed_addr constant [1 x i8] c"\00" +@.str.455 = private unnamed_addr constant [75 x i8] c" (names use only a-z, A-Z, 0-9 and _; other letters only go inside \22text\22)\00" +@.str.456 = private unnamed_addr constant [23 x i8] c"unexpected character '\00" +@.str.457 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.458 = private unnamed_addr constant [28 x i8] c"used .src on a null pointer\00" +@.str.459 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.460 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.461 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.462 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.463 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.464 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.465 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.466 = private unnamed_addr constant [1 x i8] c"\00" +@.str.467 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.468 = private unnamed_addr constant [29 x i8] c"used .line on a null pointer\00" +@.str.469 = private unnamed_addr constant [14 x i8] c"src/lexer.fch\00" +@.str.470 = private unnamed_addr constant [28 x i8] c"used .col on a null pointer\00" +@.str.471 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.472 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.473 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.474 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.475 = private unnamed_addr constant [6 x i8] c"named\00" +@.str.476 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.477 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.478 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.479 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.480 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.481 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.482 = private unnamed_addr constant [12 x i8] c"src/ast.fch\00" +@.str.483 = private unnamed_addr constant [12 x i8] c"src/ast.fch\00" +@.str.484 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.485 = private unnamed_addr constant [3 x i8] c"[]\00" +@.str.486 = private unnamed_addr constant [12 x i8] c"src/ast.fch\00" +@.str.487 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.488 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.489 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.490 = private unnamed_addr constant [12 x i8] c"src/ast.fch\00" +@.str.491 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.492 = private unnamed_addr constant [5 x i8] c"map[\00" +@.str.493 = private unnamed_addr constant [12 x i8] c"src/ast.fch\00" +@.str.494 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.495 = private unnamed_addr constant [12 x i8] c"src/ast.fch\00" +@.str.496 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.497 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.498 = private unnamed_addr constant [5 x i8] c"ptr[\00" +@.str.499 = private unnamed_addr constant [12 x i8] c"src/ast.fch\00" +@.str.500 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.501 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.502 = private unnamed_addr constant [6 x i8] c"named\00" +@.str.503 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.504 = private unnamed_addr constant [2 x i8] c".\00" +@.str.505 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.506 = private unnamed_addr constant [8 x i8] c"nothing\00" +@.str.507 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.508 = private unnamed_addr constant [29 x i8] c"used .path on a null pointer\00" +@.str.509 = private unnamed_addr constant [2 x i8] c":\00" +@.str.510 = private unnamed_addr constant [2 x i8] c":\00" +@.str.511 = private unnamed_addr constant [10 x i8] c": error: \00" +@.str.512 = private unnamed_addr constant [1 x i8] c"\00" +@.str.513 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.514 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.515 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.516 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.517 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.518 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.519 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.520 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.521 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.522 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.523 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.524 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.525 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.526 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.527 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.528 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.529 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.530 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.531 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.532 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.533 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.534 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.535 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.536 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.537 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.538 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.539 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.540 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.541 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.542 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.543 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.544 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.545 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.546 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.547 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.548 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.549 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.550 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.551 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.552 = private unnamed_addr constant [12 x i8] c"end of file\00" +@.str.553 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.554 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.555 = private unnamed_addr constant [9 x i8] c"a number\00" +@.str.556 = private unnamed_addr constant [7 x i8] c"string\00" +@.str.557 = private unnamed_addr constant [9 x i8] c"a string\00" +@.str.558 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.559 = private unnamed_addr constant [7 x i8] c"a char\00" +@.str.560 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.561 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.562 = private unnamed_addr constant [10 x i8] c"expected \00" +@.str.563 = private unnamed_addr constant [9 x i8] c", found \00" +@.str.564 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.565 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.566 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.567 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.568 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.569 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.570 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.571 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.572 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.573 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.574 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.575 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.576 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.577 = private unnamed_addr constant [29 x i8] c"used .file on a null pointer\00" +@.str.578 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.579 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.580 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.581 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.582 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.583 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.584 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.585 = private unnamed_addr constant [4 x i8] c"i16\00" +@.str.586 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.587 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.588 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.589 = private unnamed_addr constant [4 x i8] c"u16\00" +@.str.590 = private unnamed_addr constant [4 x i8] c"u32\00" +@.str.591 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.592 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.593 = private unnamed_addr constant [4 x i8] c"f64\00" +@.str.594 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.595 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.596 = private unnamed_addr constant [37 x i8] c"']' (an array type looks like []int)\00" +@.str.597 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.598 = private unnamed_addr constant [12 x i8] c"unexpected \00" +@.str.599 = private unnamed_addr constant [57 x i8] c" (expected a type like int, str, []int or a struct name)\00" +@.str.600 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.601 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.602 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.603 = private unnamed_addr constant [40 x i8] c"']' (a map type looks like map[str]int)\00" +@.str.604 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.605 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.606 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.607 = private unnamed_addr constant [4 x i8] c"']'\00" +@.str.608 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.609 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.610 = private unnamed_addr constant [4 x i8] c"f64\00" +@.str.611 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.612 = private unnamed_addr constant [6 x i8] c"named\00" +@.str.613 = private unnamed_addr constant [2 x i8] c".\00" +@.str.614 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.615 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.616 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.617 = private unnamed_addr constant [2 x i8] c",\00" +@.str.618 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.619 = private unnamed_addr constant [29 x i8] c"']' after the type arguments\00" +@.str.620 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.621 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.622 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.623 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.624 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.625 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.626 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.627 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.628 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.629 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.630 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.631 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.632 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.633 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.634 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.635 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.636 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.637 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.638 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.639 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.640 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.641 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.642 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.643 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.644 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.645 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.646 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.647 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.648 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.649 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.650 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.651 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.652 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.653 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.654 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.655 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.656 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.657 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.658 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.659 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.660 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.661 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.662 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.663 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.664 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.665 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.666 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.667 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.668 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.669 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.670 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.671 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.672 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.673 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.674 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.675 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.676 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.677 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.678 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.679 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.680 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.681 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.682 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.683 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.684 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.685 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.686 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.687 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.688 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.689 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.690 = private unnamed_addr constant [2 x i8] c".\00" +@.str.691 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.692 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.693 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.694 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.695 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.696 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.697 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.698 = private unnamed_addr constant [2 x i8] c"}\00" +@.str.699 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.700 = private unnamed_addr constant [12 x i8] c"unexpected \00" +@.str.701 = private unnamed_addr constant [38 x i8] c" (put each statement on its own line)\00" +@.str.702 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.703 = private unnamed_addr constant [7 x i8] c"import\00" +@.str.704 = private unnamed_addr constant [7 x i8] c"string\00" +@.str.705 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.706 = private unnamed_addr constant [29 x i8] c"used .path on a null pointer\00" +@.str.707 = private unnamed_addr constant [2 x i8] c":\00" +@.str.708 = private unnamed_addr constant [2 x i8] c":\00" +@.str.709 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.710 = private unnamed_addr constant [52 x i8] c"expected a module name or a C header after 'import'\00" +@.str.711 = private unnamed_addr constant [5 x i8] c"link\00" +@.str.712 = private unnamed_addr constant [7 x i8] c"string\00" +@.str.713 = private unnamed_addr constant [43 x i8] c"a library name in quotes, like link \22glfw\22\00" +@.str.714 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.715 = private unnamed_addr constant [3 x i8] c".c\00" +@.str.716 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.717 = private unnamed_addr constant [3 x i8] c".o\00" +@.str.718 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.719 = private unnamed_addr constant [3 x i8] c".a\00" +@.str.720 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.721 = private unnamed_addr constant [4 x i8] c"lib\00" +@.str.722 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.723 = private unnamed_addr constant [4 x i8] c".so\00" +@.str.724 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.725 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.726 = private unnamed_addr constant [66 x i8] c"write just the library's name: for libglfw.so that's link \22glfw\22\00" +@.str.727 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.728 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.729 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.730 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.731 = private unnamed_addr constant [7 x i8] c"'enum'\00" +@.str.732 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.733 = private unnamed_addr constant [13 x i8] c"an enum name\00" +@.str.734 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.735 = private unnamed_addr constant [4 x i8] c"'{'\00" +@.str.736 = private unnamed_addr constant [2 x i8] c"}\00" +@.str.737 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.738 = private unnamed_addr constant [38 x i8] c"an enum is never closed (missing '}')\00" +@.str.739 = private unnamed_addr constant [8 x i8] c"variant\00" +@.str.740 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.741 = private unnamed_addr constant [25 x i8] c"a variant name, like Red\00" +@.str.742 = private unnamed_addr constant [2 x i8] c"=\00" +@.str.743 = private unnamed_addr constant [1 x i8] c"\00" +@.str.744 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.745 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.746 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.747 = private unnamed_addr constant [31 x i8] c"a whole number, like Ok = 200\00" +@.str.748 = private unnamed_addr constant [2 x i8] c",\00" +@.str.749 = private unnamed_addr constant [10 x i8] c"the enum \00" +@.str.750 = private unnamed_addr constant [17 x i8] c" has no variants\00" +@.str.751 = private unnamed_addr constant [6 x i8] c"match\00" +@.str.752 = private unnamed_addr constant [6 x i8] c"match\00" +@.str.753 = private unnamed_addr constant [8 x i8] c"'match'\00" +@.str.754 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.755 = private unnamed_addr constant [4 x i8] c"'{'\00" +@.str.756 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.757 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.758 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.759 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.760 = private unnamed_addr constant [2 x i8] c"}\00" +@.str.761 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.762 = private unnamed_addr constant [38 x i8] c"a match is never closed (missing '}')\00" +@.str.763 = private unnamed_addr constant [4 x i8] c"arm\00" +@.str.764 = private unnamed_addr constant [9 x i8] c"patterns\00" +@.str.765 = private unnamed_addr constant [5 x i8] c"else\00" +@.str.766 = private unnamed_addr constant [2 x i8] c",\00" +@.str.767 = private unnamed_addr constant [3 x i8] c"->\00" +@.str.768 = private unnamed_addr constant [58 x i8] c"'->' after the value to match, like Red -> print(\22red\22)\00" +@.str.769 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.770 = private unnamed_addr constant [2 x i8] c",\00" +@.str.771 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.772 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.773 = private unnamed_addr constant [31 x i8] c"a match needs at least one arm\00" +@.str.774 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.775 = private unnamed_addr constant [4 x i8] c"'['\00" +@.str.776 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.777 = private unnamed_addr constant [30 x i8] c"a type parameter name, like T\00" +@.str.778 = private unnamed_addr constant [2 x i8] c",\00" +@.str.779 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.780 = private unnamed_addr constant [30 x i8] c"']' after the type parameters\00" +@.str.781 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.782 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.783 = private unnamed_addr constant [9 x i8] c"'struct'\00" +@.str.784 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.785 = private unnamed_addr constant [14 x i8] c"a struct name\00" +@.str.786 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.787 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.788 = private unnamed_addr constant [4 x i8] c"'{'\00" +@.str.789 = private unnamed_addr constant [2 x i8] c"}\00" +@.str.790 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.791 = private unnamed_addr constant [39 x i8] c"a struct is never closed (missing '}')\00" +@.str.792 = private unnamed_addr constant [6 x i8] c"field\00" +@.str.793 = private unnamed_addr constant [12 x i8] c"unexpected \00" +@.str.794 = private unnamed_addr constant [29 x i8] c" (a field looks like: int x)\00" +@.str.795 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.796 = private unnamed_addr constant [13 x i8] c"a field name\00" +@.str.797 = private unnamed_addr constant [2 x i8] c"=\00" +@.str.798 = private unnamed_addr constant [3 x i8] c"fn\00" +@.str.799 = private unnamed_addr constant [7 x i8] c"export\00" +@.str.800 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.801 = private unnamed_addr constant [69 x i8] c"functions start with 'fn', like: fn add(int a, int b) -> int { ... }\00" +@.str.802 = private unnamed_addr constant [3 x i8] c"fn\00" +@.str.803 = private unnamed_addr constant [27 x i8] c"'fn', 'struct' or 'import'\00" +@.str.804 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.805 = private unnamed_addr constant [16 x i8] c"a function name\00" +@.str.806 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.807 = private unnamed_addr constant [2 x i8] c".\00" +@.str.808 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.809 = private unnamed_addr constant [14 x i8] c"a method name\00" +@.str.810 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.811 = private unnamed_addr constant [4 x i8] c"'('\00" +@.str.812 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.813 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.814 = private unnamed_addr constant [2 x i8] c")\00" +@.str.815 = private unnamed_addr constant [6 x i8] c"param\00" +@.str.816 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.817 = private unnamed_addr constant [17 x i8] c"a parameter name\00" +@.str.818 = private unnamed_addr constant [2 x i8] c",\00" +@.str.819 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.820 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.821 = private unnamed_addr constant [2 x i8] c")\00" +@.str.822 = private unnamed_addr constant [4 x i8] c"')'\00" +@.str.823 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.824 = private unnamed_addr constant [3 x i8] c"->\00" +@.str.825 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.826 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.827 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.828 = private unnamed_addr constant [12 x i8] c"unexpected \00" +@.str.829 = private unnamed_addr constant [62 x i8] c" (after '->' comes a type, or ! for a function that can fail)\00" +@.str.830 = private unnamed_addr constant [6 x i8] c"block\00" +@.str.831 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.832 = private unnamed_addr constant [4 x i8] c"'{'\00" +@.str.833 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.834 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.835 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.836 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.837 = private unnamed_addr constant [2 x i8] c"}\00" +@.str.838 = private unnamed_addr constant [4 x i8] c"eof\00" +@.str.839 = private unnamed_addr constant [36 x i8] c"a '{' is never closed (missing '}')\00" +@.str.840 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.841 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.842 = private unnamed_addr constant [3 x i8] c"if\00" +@.str.843 = private unnamed_addr constant [6 x i8] c"while\00" +@.str.844 = private unnamed_addr constant [6 x i8] c"while\00" +@.str.845 = private unnamed_addr constant [4 x i8] c"for\00" +@.str.846 = private unnamed_addr constant [4 x i8] c"for\00" +@.str.847 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.848 = private unnamed_addr constant [21 x i8] c"a loop variable name\00" +@.str.849 = private unnamed_addr constant [2 x i8] c",\00" +@.str.850 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.851 = private unnamed_addr constant [28 x i8] c"a second loop variable name\00" +@.str.852 = private unnamed_addr constant [3 x i8] c"in\00" +@.str.853 = private unnamed_addr constant [5 x i8] c"'in'\00" +@.str.854 = private unnamed_addr constant [3 x i8] c"..\00" +@.str.855 = private unnamed_addr constant [56 x i8] c"a range of numbers has one loop variable: for i in 0..n\00" +@.str.856 = private unnamed_addr constant [5 x i8] c"each\00" +@.str.857 = private unnamed_addr constant [6 x i8] c"match\00" +@.str.858 = private unnamed_addr constant [7 x i8] c"return\00" +@.str.859 = private unnamed_addr constant [7 x i8] c"return\00" +@.str.860 = private unnamed_addr constant [2 x i8] c"}\00" +@.str.861 = private unnamed_addr constant [6 x i8] c"break\00" +@.str.862 = private unnamed_addr constant [9 x i8] c"continue\00" +@.str.863 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.864 = private unnamed_addr constant [6 x i8] c"defer\00" +@.str.865 = private unnamed_addr constant [6 x i8] c"defer\00" +@.str.866 = private unnamed_addr constant [6 x i8] c"defer\00" +@.str.867 = private unnamed_addr constant [34 x i8] c"defer inside defer is not allowed\00" +@.str.868 = private unnamed_addr constant [3 x i8] c"fn\00" +@.str.869 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.870 = private unnamed_addr constant [7 x i8] c"import\00" +@.str.871 = private unnamed_addr constant [5 x i8] c"link\00" +@.str.872 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.873 = private unnamed_addr constant [49 x i8] c"' can't be used here in the self-hosted compiler\00" +@.str.874 = private unnamed_addr constant [5 x i8] c"decl\00" +@.str.875 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.876 = private unnamed_addr constant [16 x i8] c"a variable name\00" +@.str.877 = private unnamed_addr constant [2 x i8] c"=\00" +@.str.878 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.879 = private unnamed_addr constant [3 x i8] c":=\00" +@.str.880 = private unnamed_addr constant [5 x i8] c"decl\00" +@.str.881 = private unnamed_addr constant [2 x i8] c"=\00" +@.str.882 = private unnamed_addr constant [3 x i8] c"+=\00" +@.str.883 = private unnamed_addr constant [3 x i8] c"-=\00" +@.str.884 = private unnamed_addr constant [3 x i8] c"*=\00" +@.str.885 = private unnamed_addr constant [3 x i8] c"/=\00" +@.str.886 = private unnamed_addr constant [3 x i8] c"%=\00" +@.str.887 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.888 = private unnamed_addr constant [7 x i8] c"member\00" +@.str.889 = private unnamed_addr constant [6 x i8] c"index\00" +@.str.890 = private unnamed_addr constant [67 x i8] c"only a variable, a field, an element or p.value can be assigned to\00" +@.str.891 = private unnamed_addr constant [7 x i8] c"assign\00" +@.str.892 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.893 = private unnamed_addr constant [29 x i8] c"used .file on a null pointer\00" +@.str.894 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.895 = private unnamed_addr constant [7 x i8] c"method\00" +@.str.896 = private unnamed_addr constant [4 x i8] c"try\00" +@.str.897 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.898 = private unnamed_addr constant [38 x i8] c"this value is computed but never used\00" +@.str.899 = private unnamed_addr constant [5 x i8] c"expr\00" +@.str.900 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.901 = private unnamed_addr constant [29 x i8] c"used .file on a null pointer\00" +@.str.902 = private unnamed_addr constant [3 x i8] c"if\00" +@.str.903 = private unnamed_addr constant [3 x i8] c"if\00" +@.str.904 = private unnamed_addr constant [5 x i8] c"'if'\00" +@.str.905 = private unnamed_addr constant [5 x i8] c"else\00" +@.str.906 = private unnamed_addr constant [3 x i8] c"if\00" +@.str.907 = private unnamed_addr constant [3 x i8] c"||\00" +@.str.908 = private unnamed_addr constant [3 x i8] c"&&\00" +@.str.909 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.910 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.911 = private unnamed_addr constant [2 x i8] c"<\00" +@.str.912 = private unnamed_addr constant [3 x i8] c"<=\00" +@.str.913 = private unnamed_addr constant [2 x i8] c">\00" +@.str.914 = private unnamed_addr constant [3 x i8] c">=\00" +@.str.915 = private unnamed_addr constant [2 x i8] c"+\00" +@.str.916 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.917 = private unnamed_addr constant [2 x i8] c"|\00" +@.str.918 = private unnamed_addr constant [2 x i8] c"^\00" +@.str.919 = private unnamed_addr constant [2 x i8] c"*\00" +@.str.920 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.921 = private unnamed_addr constant [2 x i8] c"%\00" +@.str.922 = private unnamed_addr constant [3 x i8] c"<<\00" +@.str.923 = private unnamed_addr constant [3 x i8] c">>\00" +@.str.924 = private unnamed_addr constant [2 x i8] c"&\00" +@.str.925 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.926 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.927 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.928 = private unnamed_addr constant [7 x i8] c"binary\00" +@.str.929 = private unnamed_addr constant [4 x i8] c"try\00" +@.str.930 = private unnamed_addr constant [4 x i8] c"try\00" +@.str.931 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.932 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.933 = private unnamed_addr constant [2 x i8] c"~\00" +@.str.934 = private unnamed_addr constant [6 x i8] c"unary\00" +@.str.935 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.936 = private unnamed_addr constant [4 x i8] c"'('\00" +@.str.937 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.938 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.939 = private unnamed_addr constant [2 x i8] c")\00" +@.str.940 = private unnamed_addr constant [2 x i8] c")\00" +@.str.941 = private unnamed_addr constant [1 x i8] c"\00" +@.str.942 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.943 = private unnamed_addr constant [2 x i8] c":\00" +@.str.944 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.945 = private unnamed_addr constant [30 x i8] c"used .names on a null pointer\00" +@.str.946 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.947 = private unnamed_addr constant [29 x i8] c"used .kids on a null pointer\00" +@.str.948 = private unnamed_addr constant [2 x i8] c",\00" +@.str.949 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.950 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.951 = private unnamed_addr constant [2 x i8] c")\00" +@.str.952 = private unnamed_addr constant [4 x i8] c"')'\00" +@.str.953 = private unnamed_addr constant [2 x i8] c".\00" +@.str.954 = private unnamed_addr constant [7 x i8] c"member\00" +@.str.955 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.956 = private unnamed_addr constant [17 x i8] c"a name after '.'\00" +@.str.957 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.958 = private unnamed_addr constant [7 x i8] c"method\00" +@.str.959 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.960 = private unnamed_addr constant [6 x i8] c"index\00" +@.str.961 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.962 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.963 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.964 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.965 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.966 = private unnamed_addr constant [4 x i8] c"']'\00" +@.str.967 = private unnamed_addr constant [1 x i8] c"\00" +@.str.968 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.969 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.970 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.971 = private unnamed_addr constant [7 x i8] c"string\00" +@.str.972 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.973 = private unnamed_addr constant [5 x i8] c"true\00" +@.str.974 = private unnamed_addr constant [6 x i8] c"false\00" +@.str.975 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.976 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.977 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.978 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.979 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.980 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.981 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.982 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.983 = private unnamed_addr constant [2 x i8] c")\00" +@.str.984 = private unnamed_addr constant [4 x i8] c"')'\00" +@.str.985 = private unnamed_addr constant [6 x i8] c"match\00" +@.str.986 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.987 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.988 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.989 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.990 = private unnamed_addr constant [2 x i8] c":\00" +@.str.991 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.992 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.993 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.994 = private unnamed_addr constant [2 x i8] c":\00" +@.str.995 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.996 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.997 = private unnamed_addr constant [2 x i8] c":\00" +@.str.998 = private unnamed_addr constant [42 x i8] c"':' (a map entry looks like \22key\22: value)\00" +@.str.999 = private unnamed_addr constant [2 x i8] c",\00" +@.str.1000 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.1001 = private unnamed_addr constant [30 x i8] c"used .depth on a null pointer\00" +@.str.1002 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.1003 = private unnamed_addr constant [4 x i8] c"']'\00" +@.str.1004 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.1005 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.1006 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.1007 = private unnamed_addr constant [29 x i8] c"used .toks on a null pointer\00" +@.str.1008 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.1009 = private unnamed_addr constant [26 x i8] c"used .i on a null pointer\00" +@.str.1010 = private unnamed_addr constant [15 x i8] c"src/parser.fch\00" +@.str.1011 = private unnamed_addr constant [6 x i8] c"ident\00" +@.str.1012 = private unnamed_addr constant [6 x i8] c"targs\00" +@.str.1013 = private unnamed_addr constant [2 x i8] c",\00" +@.str.1014 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.1015 = private unnamed_addr constant [29 x i8] c"']' after the type arguments\00" +@.str.1016 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.1017 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.1018 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.1019 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.1020 = private unnamed_addr constant [12 x i8] c"unexpected \00" +@.str.1021 = private unnamed_addr constant [20 x i8] c" (expected a value)\00" +@.str.1022 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1023 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.1024 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1025 = private unnamed_addr constant [2 x i8] c":\00" +@.str.1026 = private unnamed_addr constant [2 x i8] c":\00" +@.str.1027 = private unnamed_addr constant [10 x i8] c": error: \00" +@.str.1028 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1029 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.1030 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1031 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.1032 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.1033 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1034 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.1035 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1036 = private unnamed_addr constant [6 x i8] c"call \00" +@.str.1037 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1038 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.1039 = private unnamed_addr constant [3 x i8] c" \00" +@.str.1040 = private unnamed_addr constant [9 x i8] c", !dbg !\00" +@.str.1041 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1042 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.1043 = private unnamed_addr constant [3 x i8] c" \00" +@.str.1044 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1045 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.1046 = private unnamed_addr constant [3 x i8] c"%t\00" +@.str.1047 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1048 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.1049 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1050 = private unnamed_addr constant [28 x i8] c"used .lbl on a null pointer\00" +@.str.1051 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1052 = private unnamed_addr constant [28 x i8] c"used .lbl on a null pointer\00" +@.str.1053 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1054 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.1055 = private unnamed_addr constant [2 x i8] c":\00" +@.str.1056 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1057 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1058 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1059 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1060 = private unnamed_addr constant [11 x i8] c"br label %\00" +@.str.1061 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1062 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1063 = private unnamed_addr constant [7 x i8] c"br i1 \00" +@.str.1064 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str.1065 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str.1066 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1067 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1068 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1069 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.1070 = private unnamed_addr constant [3 x i8] c"%a\00" +@.str.1071 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1072 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.1073 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1074 = private unnamed_addr constant [32 x i8] c"used .allocas on a null pointer\00" +@.str.1075 = private unnamed_addr constant [3 x i8] c" \00" +@.str.1076 = private unnamed_addr constant [11 x i8] c" = alloca \00" +@.str.1077 = private unnamed_addr constant [11 x i8] c", align 16\00" +@.str.1078 = private unnamed_addr constant [9 x i8] c" = load \00" +@.str.1079 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1080 = private unnamed_addr constant [7 x i8] c"store \00" +@.str.1081 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1082 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1083 = private unnamed_addr constant [4 x i8] c" = \00" +@.str.1084 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.1085 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.1086 = private unnamed_addr constant [4 x i8] c"i16\00" +@.str.1087 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.1088 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.1089 = private unnamed_addr constant [4 x i8] c"u16\00" +@.str.1090 = private unnamed_addr constant [4 x i8] c"u32\00" +@.str.1091 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.1092 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1093 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.1094 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1095 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1096 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.1097 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.1098 = private unnamed_addr constant [4 x i8] c"i16\00" +@.str.1099 = private unnamed_addr constant [4 x i8] c"u16\00" +@.str.1100 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.1101 = private unnamed_addr constant [4 x i8] c"u32\00" +@.str.1102 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.1103 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1104 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1105 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1106 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1107 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1108 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1109 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1110 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1111 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1112 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1113 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.1114 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1115 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.1116 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1117 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1118 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.1119 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1120 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1121 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1122 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1123 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1124 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1125 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1126 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1127 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1128 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1129 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1130 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.1131 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1132 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.1133 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1134 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1135 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1136 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1137 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.1138 = private unnamed_addr constant [64 x i8] c"a map key must be a whole number, a char, a bool or a str, not \00" +@.str.1139 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1140 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.1141 = private unnamed_addr constant [42 x i8] c"a map value can't have the type 'nothing'\00" +@.str.1142 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.1143 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.1144 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1145 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1146 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1147 = private unnamed_addr constant [6 x i8] c"named\00" +@.str.1148 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1149 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.1150 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1151 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.1152 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1153 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.1154 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1155 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1156 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1157 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1158 = private unnamed_addr constant [37 x i8] c"' is not imported here (add: import \00" +@.str.1159 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1160 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1161 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1162 = private unnamed_addr constant [29 x i8] c"there is no C struct named '\00" +@.str.1163 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1164 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.1165 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1166 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1167 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1168 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1169 = private unnamed_addr constant [37 x i8] c"' is not imported here (add: import \00" +@.str.1170 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1171 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.1172 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1173 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.1174 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1175 = private unnamed_addr constant [25 x i8] c"there is no type named '\00" +@.str.1176 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1177 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.1178 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1179 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.1180 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1181 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1182 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.1183 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1184 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1185 = private unnamed_addr constant [2 x i8] c",\00" +@.str.1186 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1187 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1188 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1189 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1190 = private unnamed_addr constant [5 x i8] c"main\00" +@.str.1191 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1192 = private unnamed_addr constant [3 x i8] c"i1\00" +@.str.1193 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1194 = private unnamed_addr constant [2 x i8] c"i\00" +@.str.1195 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1196 = private unnamed_addr constant [7 x i8] c"double\00" +@.str.1197 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.1198 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1199 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1200 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.1201 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.1202 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.1203 = private unnamed_addr constant [38 x i8] c"{ ptr, i64, i64, i64, ptr, i64, i64 }\00" +@.str.1204 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.1205 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.1206 = private unnamed_addr constant [4 x i8] c" x \00" +@.str.1207 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1208 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.1209 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.1210 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.1211 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1212 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1213 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1214 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.1215 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.1216 = private unnamed_addr constant [4 x i8] c"%S.\00" +@.str.1217 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1218 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.1219 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.1220 = private unnamed_addr constant [7 x i8] c"{ i1, \00" +@.str.1221 = private unnamed_addr constant [22 x i8] c", { ptr, i64, i64 } }\00" +@.str.1222 = private unnamed_addr constant [2 x i8] c":\00" +@.str.1223 = private unnamed_addr constant [2 x i8] c":\00" +@.str.1224 = private unnamed_addr constant [2 x i8] c":\00" +@.str.1225 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1226 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.1227 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.1228 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1229 = private unnamed_addr constant [6 x i8] c"false\00" +@.str.1230 = private unnamed_addr constant [4 x i8] c"0.0\00" +@.str.1231 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1232 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1233 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1234 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.1235 = private unnamed_addr constant [30 x i8] c"ptrtoint (ptr getelementptr (\00" +@.str.1236 = private unnamed_addr constant [27 x i8] c", ptr null, i32 1) to i64)\00" +@.str.1237 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1238 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.1239 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.1240 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.1241 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1242 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1243 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1244 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.1245 = private unnamed_addr constant [5 x i8] c"arr_\00" +@.str.1246 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1247 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.1248 = private unnamed_addr constant [5 x i8] c"map_\00" +@.str.1249 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1250 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.1251 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1252 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.1253 = private unnamed_addr constant [3 x i8] c"E_\00" +@.str.1254 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.1255 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.1256 = private unnamed_addr constant [3 x i8] c"S_\00" +@.str.1257 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.1258 = private unnamed_addr constant [17 x i8] c"0123456789ABCDEF\00" +@.str.1259 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1260 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1261 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1262 = private unnamed_addr constant [29 x i8] c"used .nstr on a null pointer\00" +@.str.1263 = private unnamed_addr constant [7 x i8] c"@.str.\00" +@.str.1264 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1265 = private unnamed_addr constant [29 x i8] c"used .nstr on a null pointer\00" +@.str.1266 = private unnamed_addr constant [2 x i8] c"\5C\00" +@.str.1267 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1268 = private unnamed_addr constant [29 x i8] c"used .head on a null pointer\00" +@.str.1269 = private unnamed_addr constant [35 x i8] c" = private unnamed_addr constant [\00" +@.str.1270 = private unnamed_addr constant [10 x i8] c" x i8] c\22\00" +@.str.1271 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1272 = private unnamed_addr constant [5 x i8] c"\5C00\22\00" +@.str.1273 = private unnamed_addr constant [7 x i8] c"{ ptr \00" +@.str.1274 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1275 = private unnamed_addr constant [10 x i8] c", i64 0 }\00" +@.str.1276 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1277 = private unnamed_addr constant [6 x i8] c"panic\00" +@.str.1278 = private unnamed_addr constant [3 x i8] c"ok\00" +@.str.1279 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1280 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.1281 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1282 = private unnamed_addr constant [28 x i8] c"call void @finch_panic(ptr \00" +@.str.1283 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1284 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1285 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1286 = private unnamed_addr constant [12 x i8] c"unreachable\00" +@.str.1287 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1288 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1289 = private unnamed_addr constant [6 x i8] c"range\00" +@.str.1290 = private unnamed_addr constant [8 x i8] c"inrange\00" +@.str.1291 = private unnamed_addr constant [14 x i8] c"icmp uge i64 \00" +@.str.1292 = private unnamed_addr constant [3 x i8] c", \00" +@.str.1293 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1294 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.1295 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1296 = private unnamed_addr constant [34 x i8] c"call void @finch_panic_index(ptr \00" +@.str.1297 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1298 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1299 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1300 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1301 = private unnamed_addr constant [12 x i8] c"unreachable\00" +@.str.1302 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1303 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1304 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1305 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.1306 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1307 = private unnamed_addr constant [32 x i8] c"used .allocas on a null pointer\00" +@.str.1308 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1309 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.1310 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1311 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1312 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1313 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.1314 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1315 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.1316 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1317 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.1318 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1319 = private unnamed_addr constant [32 x i8] c"used .allocas on a null pointer\00" +@.str.1320 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1321 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.1322 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1323 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1324 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1325 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.1326 = private unnamed_addr constant [11 x i8] c" {\0Aentry:\0A\00" +@.str.1327 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1328 = private unnamed_addr constant [32 x i8] c"used .allocas on a null pointer\00" +@.str.1329 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.1330 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.1331 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1332 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.1333 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.1334 = private unnamed_addr constant [4 x i8] c"\0A}\0A\00" +@.str.1335 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1336 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.1337 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1338 = private unnamed_addr constant [32 x i8] c"used .allocas on a null pointer\00" +@.str.1339 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1340 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.1341 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1342 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1343 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1344 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.1345 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1346 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1347 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.1348 = private unnamed_addr constant [7 x i8] c"n.cond\00" +@.str.1349 = private unnamed_addr constant [7 x i8] c"n.body\00" +@.str.1350 = private unnamed_addr constant [6 x i8] c"n.end\00" +@.str.1351 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1352 = private unnamed_addr constant [14 x i8] c"icmp slt i64 \00" +@.str.1353 = private unnamed_addr constant [3 x i8] c", \00" +@.str.1354 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1355 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1356 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1357 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.1358 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.1359 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1360 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1361 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1362 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1363 = private unnamed_addr constant [31 x i8] c"call void @finch_str_copy(ptr \00" +@.str.1364 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1365 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1366 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.1367 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.1368 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.1369 = private unnamed_addr constant [11 x i8] c"call void \00" +@.str.1370 = private unnamed_addr constant [6 x i8] c"(ptr \00" +@.str.1371 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1372 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1373 = private unnamed_addr constant [13 x i8] c"@finch.copy.\00" +@.str.1374 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1375 = private unnamed_addr constant [29 x i8] c"used .done on a null pointer\00" +@.str.1376 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1377 = private unnamed_addr constant [29 x i8] c"used .done on a null pointer\00" +@.str.1378 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.1379 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1380 = private unnamed_addr constant [56 x i8] c"call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 \00" +@.str.1381 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1382 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1383 = private unnamed_addr constant [5 x i8] c"%dst\00" +@.str.1384 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1385 = private unnamed_addr constant [5 x i8] c"%src\00" +@.str.1386 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1387 = private unnamed_addr constant [65 x i8] c"getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1\00" +@.str.1388 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1389 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1390 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1391 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1392 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1393 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1394 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1395 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1396 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.1397 = private unnamed_addr constant [56 x i8] c"call void @finch_map_clone_raw(ptr %dst, ptr %src, i64 \00" +@.str.1398 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1399 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1400 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1401 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1402 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1403 = private unnamed_addr constant [25 x i8] c", ptr %src, i32 0, i32 2\00" +@.str.1404 = private unnamed_addr constant [5 x i8] c"%src\00" +@.str.1405 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1406 = private unnamed_addr constant [5 x i8] c"%dst\00" +@.str.1407 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1408 = private unnamed_addr constant [11 x i8] c"entry.live\00" +@.str.1409 = private unnamed_addr constant [11 x i8] c"entry.next\00" +@.str.1410 = private unnamed_addr constant [13 x i8] c"icmp ne i64 \00" +@.str.1411 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1412 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1413 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1414 = private unnamed_addr constant [15 x i8] c", i32 0, i32 0\00" +@.str.1415 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.1416 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1417 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1418 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1419 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1420 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1421 = private unnamed_addr constant [5 x i8] c"%src\00" +@.str.1422 = private unnamed_addr constant [5 x i8] c"%dst\00" +@.str.1423 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1424 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1425 = private unnamed_addr constant [24 x i8] c", ptr %dst, i32 0, i32 \00" +@.str.1426 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1427 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1428 = private unnamed_addr constant [24 x i8] c", ptr %src, i32 0, i32 \00" +@.str.1429 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1430 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1431 = private unnamed_addr constant [9 x i8] c"ret void\00" +@.str.1432 = private unnamed_addr constant [22 x i8] c"define internal void \00" +@.str.1433 = private unnamed_addr constant [21 x i8] c"(ptr %dst, ptr %src)\00" +@.str.1434 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1435 = private unnamed_addr constant [3 x i8] c", \00" +@.str.1436 = private unnamed_addr constant [36 x i8] c" = call i32 (ptr, ...) @printf(ptr \00" +@.str.1437 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1438 = private unnamed_addr constant [32 x i8] c"extractvalue { ptr, i64, i64 } \00" +@.str.1439 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.1440 = private unnamed_addr constant [13 x i8] c"icmp eq ptr \00" +@.str.1441 = private unnamed_addr constant [7 x i8] c", null\00" +@.str.1442 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1443 = private unnamed_addr constant [11 x i8] c"select i1 \00" +@.str.1444 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1445 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1446 = private unnamed_addr constant [5 x i8] c"%lld\00" +@.str.1447 = private unnamed_addr constant [5 x i8] c"i64 \00" +@.str.1448 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.1449 = private unnamed_addr constant [5 x i8] c"%llu\00" +@.str.1450 = private unnamed_addr constant [5 x i8] c"i64 \00" +@.str.1451 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.1452 = private unnamed_addr constant [3 x i8] c"%g\00" +@.str.1453 = private unnamed_addr constant [8 x i8] c"double \00" +@.str.1454 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1455 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1456 = private unnamed_addr constant [9 x i8] c"sext i8 \00" +@.str.1457 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.1458 = private unnamed_addr constant [5 x i8] c"'%c'\00" +@.str.1459 = private unnamed_addr constant [5 x i8] c"i32 \00" +@.str.1460 = private unnamed_addr constant [3 x i8] c"%c\00" +@.str.1461 = private unnamed_addr constant [5 x i8] c"i32 \00" +@.str.1462 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1463 = private unnamed_addr constant [5 x i8] c"true\00" +@.str.1464 = private unnamed_addr constant [6 x i8] c"false\00" +@.str.1465 = private unnamed_addr constant [11 x i8] c"select i1 \00" +@.str.1466 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1467 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1468 = private unnamed_addr constant [3 x i8] c"%s\00" +@.str.1469 = private unnamed_addr constant [5 x i8] c"ptr \00" +@.str.1470 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1471 = private unnamed_addr constant [32 x i8] c"extractvalue { ptr, i64, i64 } \00" +@.str.1472 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.1473 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str.1474 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.1475 = private unnamed_addr constant [7 x i8] c"\22%.*s\22\00" +@.str.1476 = private unnamed_addr constant [5 x i8] c"i32 \00" +@.str.1477 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1478 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.1479 = private unnamed_addr constant [5 x i8] c"i32 \00" +@.str.1480 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1481 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1482 = private unnamed_addr constant [13 x i8] c"icmp eq ptr \00" +@.str.1483 = private unnamed_addr constant [7 x i8] c", null\00" +@.str.1484 = private unnamed_addr constant [9 x i8] c"ptr.null\00" +@.str.1485 = private unnamed_addr constant [9 x i8] c"ptr.addr\00" +@.str.1486 = private unnamed_addr constant [9 x i8] c"ptr.done\00" +@.str.1487 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1488 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1489 = private unnamed_addr constant [7 x i8] c"0x%llx\00" +@.str.1490 = private unnamed_addr constant [5 x i8] c"i64 \00" +@.str.1491 = private unnamed_addr constant [14 x i8] c"ptrtoint ptr \00" +@.str.1492 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str.1493 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1494 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1495 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1496 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.1497 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.1498 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.1499 = private unnamed_addr constant [32 x i8] c"call void @finch_buf_print(ptr \00" +@.str.1500 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1501 = private unnamed_addr constant [30 x i8] c"call void @finch_buf_add(ptr \00" +@.str.1502 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1503 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1504 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1505 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.1506 = private unnamed_addr constant [2 x i8] c"1\00" +@.str.1507 = private unnamed_addr constant [30 x i8] c"call void @finch_buf_int(ptr \00" +@.str.1508 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1509 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.1510 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1511 = private unnamed_addr constant [31 x i8] c"call void @finch_buf_uint(ptr \00" +@.str.1512 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1513 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.1514 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1515 = private unnamed_addr constant [32 x i8] c"call void @finch_buf_float(ptr \00" +@.str.1516 = private unnamed_addr constant [10 x i8] c", double \00" +@.str.1517 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1518 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1519 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1520 = private unnamed_addr constant [31 x i8] c"call void @finch_buf_char(ptr \00" +@.str.1521 = private unnamed_addr constant [6 x i8] c", i8 \00" +@.str.1522 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str.1523 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1524 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1525 = private unnamed_addr constant [31 x i8] c"call void @finch_buf_bool(ptr \00" +@.str.1526 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str.1527 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str.1528 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.1529 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1530 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1531 = private unnamed_addr constant [30 x i8] c"call void @finch_buf_str(ptr \00" +@.str.1532 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1533 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str.1534 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1535 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1536 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1537 = private unnamed_addr constant [30 x i8] c"call void @finch_buf_ptr(ptr \00" +@.str.1538 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1539 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1540 = private unnamed_addr constant [11 x i8] c"call void \00" +@.str.1541 = private unnamed_addr constant [6 x i8] c"(ptr \00" +@.str.1542 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1543 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1544 = private unnamed_addr constant [15 x i8] c"@finch.format.\00" +@.str.1545 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1546 = private unnamed_addr constant [29 x i8] c"used .done on a null pointer\00" +@.str.1547 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1548 = private unnamed_addr constant [29 x i8] c"used .done on a null pointer\00" +@.str.1549 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.1550 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1551 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1552 = private unnamed_addr constant [3 x i8] c"%a\00" +@.str.1553 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1554 = private unnamed_addr constant [63 x i8] c"getelementptr inbounds { ptr, i64, i64 }, ptr %a, i32 0, i32 1\00" +@.str.1555 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1556 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.1557 = private unnamed_addr constant [4 x i8] c"sep\00" +@.str.1558 = private unnamed_addr constant [5 x i8] c"item\00" +@.str.1559 = private unnamed_addr constant [14 x i8] c"icmp sgt i64 \00" +@.str.1560 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1561 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.1562 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1563 = private unnamed_addr constant [3 x i8] c", \00" +@.str.1564 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1565 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.1566 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.1567 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1568 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1569 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1570 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.1571 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.1572 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1573 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.1574 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1575 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.1576 = private unnamed_addr constant [3 x i8] c"%a\00" +@.str.1577 = private unnamed_addr constant [11 x i8] c"enum.other\00" +@.str.1578 = private unnamed_addr constant [10 x i8] c"enum.done\00" +@.str.1579 = private unnamed_addr constant [7 x i8] c"enum.v\00" +@.str.1580 = private unnamed_addr constant [5 x i8] c"i32 \00" +@.str.1581 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1582 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str.1583 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1584 = private unnamed_addr constant [12 x i8] c"switch i32 \00" +@.str.1585 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str.1586 = private unnamed_addr constant [4 x i8] c" [ \00" +@.str.1587 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1588 = private unnamed_addr constant [3 x i8] c" ]\00" +@.str.1589 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1590 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1591 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1592 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1593 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1594 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1595 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.1596 = private unnamed_addr constant [40 x i8] c"call void @finch_buf_int(ptr %buf, i64 \00" +@.str.1597 = private unnamed_addr constant [10 x i8] c"sext i32 \00" +@.str.1598 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str.1599 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1600 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1601 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1602 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.1603 = private unnamed_addr constant [3 x i8] c"i1\00" +@.str.1604 = private unnamed_addr constant [3 x i8] c"i1\00" +@.str.1605 = private unnamed_addr constant [5 x i8] c"true\00" +@.str.1606 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1607 = private unnamed_addr constant [2 x i8] c"{\00" +@.str.1608 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1609 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1610 = private unnamed_addr constant [23 x i8] c", ptr %a, i32 0, i32 2\00" +@.str.1611 = private unnamed_addr constant [3 x i8] c"%a\00" +@.str.1612 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1613 = private unnamed_addr constant [11 x i8] c"entry.live\00" +@.str.1614 = private unnamed_addr constant [11 x i8] c"entry.next\00" +@.str.1615 = private unnamed_addr constant [13 x i8] c"icmp ne i64 \00" +@.str.1616 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1617 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.1618 = private unnamed_addr constant [4 x i8] c"sep\00" +@.str.1619 = private unnamed_addr constant [5 x i8] c"item\00" +@.str.1620 = private unnamed_addr constant [3 x i8] c"i1\00" +@.str.1621 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1622 = private unnamed_addr constant [3 x i8] c", \00" +@.str.1623 = private unnamed_addr constant [3 x i8] c"i1\00" +@.str.1624 = private unnamed_addr constant [6 x i8] c"false\00" +@.str.1625 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1626 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1627 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1628 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1629 = private unnamed_addr constant [3 x i8] c": \00" +@.str.1630 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1631 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1632 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1633 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1634 = private unnamed_addr constant [2 x i8] c"}\00" +@.str.1635 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1636 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1637 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1638 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1639 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.1640 = private unnamed_addr constant [3 x i8] c", \00" +@.str.1641 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1642 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1643 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1644 = private unnamed_addr constant [3 x i8] c": \00" +@.str.1645 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.1646 = private unnamed_addr constant [22 x i8] c", ptr %a, i32 0, i32 \00" +@.str.1647 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1648 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1649 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1650 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1651 = private unnamed_addr constant [5 x i8] c"%buf\00" +@.str.1652 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1653 = private unnamed_addr constant [9 x i8] c"ret void\00" +@.str.1654 = private unnamed_addr constant [22 x i8] c"define internal void \00" +@.str.1655 = private unnamed_addr constant [19 x i8] c"(ptr %buf, ptr %a)\00" +@.str.1656 = private unnamed_addr constant [7 x i8] c"trunc \00" +@.str.1657 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1658 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.1659 = private unnamed_addr constant [6 x i8] c"sext \00" +@.str.1660 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1661 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.1662 = private unnamed_addr constant [6 x i8] c"zext \00" +@.str.1663 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1664 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.1665 = private unnamed_addr constant [7 x i8] c"fpext \00" +@.str.1666 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1667 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.1668 = private unnamed_addr constant [9 x i8] c"fptrunc \00" +@.str.1669 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1670 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.1671 = private unnamed_addr constant [8 x i8] c"sitofp \00" +@.str.1672 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1673 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.1674 = private unnamed_addr constant [8 x i8] c"uitofp \00" +@.str.1675 = private unnamed_addr constant [2 x i8] c" \00" +@.str.1676 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.1677 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1678 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1679 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.1680 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1681 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1682 = private unnamed_addr constant [12 x i8] c"the number \00" +@.str.1683 = private unnamed_addr constant [17 x i8] c" doesn't fit in \00" +@.str.1684 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1685 = private unnamed_addr constant [3 x i8] c".0\00" +@.str.1686 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.1687 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1688 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1689 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.1690 = private unnamed_addr constant [10 x i8] c" must be \00" +@.str.1691 = private unnamed_addr constant [15 x i8] c", but this is \00" +@.str.1692 = private unnamed_addr constant [7 x i8] c" (use \00" +@.str.1693 = private unnamed_addr constant [17 x i8] c"(...) to convert\00" +@.str.1694 = private unnamed_addr constant [27 x i8] c", it cuts off the fraction\00" +@.str.1695 = private unnamed_addr constant [2 x i8] c")\00" +@.str.1696 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1697 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1698 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1699 = private unnamed_addr constant [35 x i8] c" (turn it into text with str(...))\00" +@.str.1700 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1701 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1702 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1703 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1704 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1705 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1706 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1707 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1708 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1709 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1710 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1711 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1712 = private unnamed_addr constant [32 x i8] c"used .deferOn on a null pointer\00" +@.str.1713 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1714 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1715 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1716 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1717 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1718 = private unnamed_addr constant [35 x i8] c"used .deferLimit on a null pointer\00" +@.str.1719 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1720 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1721 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1722 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1723 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1724 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1725 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1726 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1727 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1728 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1729 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1730 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1731 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1732 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1733 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1734 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1735 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1736 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1737 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1738 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1739 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1740 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1741 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1742 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1743 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1744 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1745 = private unnamed_addr constant [6 x i8] c"print\00" +@.str.1746 = private unnamed_addr constant [5 x i8] c"addr\00" +@.str.1747 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.1748 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.1749 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.1750 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.1751 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.1752 = private unnamed_addr constant [10 x i8] c"read_file\00" +@.str.1753 = private unnamed_addr constant [11 x i8] c"write_file\00" +@.str.1754 = private unnamed_addr constant [12 x i8] c"file_exists\00" +@.str.1755 = private unnamed_addr constant [6 x i8] c"shell\00" +@.str.1756 = private unnamed_addr constant [5 x i8] c"exit\00" +@.str.1757 = private unnamed_addr constant [6 x i8] c"input\00" +@.str.1758 = private unnamed_addr constant [4 x i8] c"new\00" +@.str.1759 = private unnamed_addr constant [5 x i8] c"free\00" +@.str.1760 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.1761 = private unnamed_addr constant [12 x i8] c"delete_file\00" +@.str.1762 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.1763 = private unnamed_addr constant [4 x i8] c"i16\00" +@.str.1764 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.1765 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.1766 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.1767 = private unnamed_addr constant [4 x i8] c"u16\00" +@.str.1768 = private unnamed_addr constant [4 x i8] c"u32\00" +@.str.1769 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.1770 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.1771 = private unnamed_addr constant [4 x i8] c"f64\00" +@.str.1772 = private unnamed_addr constant [6 x i8] c"error\00" +@.str.1773 = private unnamed_addr constant [4 x i8] c"err\00" +@.str.1774 = private unnamed_addr constant [19 x i8] c"a variable named '\00" +@.str.1775 = private unnamed_addr constant [22 x i8] c"' already exists here\00" +@.str.1776 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1777 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1778 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1779 = private unnamed_addr constant [36 x i8] c"' is already the name of a function\00" +@.str.1780 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1781 = private unnamed_addr constant [39 x i8] c"' is a built-in name, pick another one\00" +@.str.1782 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1783 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1784 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1785 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1786 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1787 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1788 = private unnamed_addr constant [30 x i8] c"used .nvars on a null pointer\00" +@.str.1789 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1790 = private unnamed_addr constant [30 x i8] c"used .nvars on a null pointer\00" +@.str.1791 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1792 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1793 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1794 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1795 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1796 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.1797 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1798 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1799 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1800 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1801 = private unnamed_addr constant [32 x i8] c"used .deferOn on a null pointer\00" +@.str.1802 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1803 = private unnamed_addr constant [35 x i8] c"used .deferLimit on a null pointer\00" +@.str.1804 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1805 = private unnamed_addr constant [32 x i8] c"used .deferOn on a null pointer\00" +@.str.1806 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1807 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1808 = private unnamed_addr constant [35 x i8] c"used .deferLimit on a null pointer\00" +@.str.1809 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1810 = private unnamed_addr constant [32 x i8] c"used .inDefer on a null pointer\00" +@.str.1811 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1812 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1813 = private unnamed_addr constant [32 x i8] c"used .inDefer on a null pointer\00" +@.str.1814 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1815 = private unnamed_addr constant [32 x i8] c"used .deferOn on a null pointer\00" +@.str.1816 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1817 = private unnamed_addr constant [35 x i8] c"used .deferLimit on a null pointer\00" +@.str.1818 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1819 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1820 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1821 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.1822 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1823 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1824 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1825 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.1826 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1827 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.1828 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.1829 = private unnamed_addr constant [7 x i8] c"member\00" +@.str.1830 = private unnamed_addr constant [6 x i8] c"index\00" +@.str.1831 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1832 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1833 = private unnamed_addr constant [5 x i8] c"push\00" +@.str.1834 = private unnamed_addr constant [4 x i8] c"pop\00" +@.str.1835 = private unnamed_addr constant [7 x i8] c"insert\00" +@.str.1836 = private unnamed_addr constant [7 x i8] c"remove\00" +@.str.1837 = private unnamed_addr constant [6 x i8] c"clear\00" +@.str.1838 = private unnamed_addr constant [7 x i8] c"resize\00" +@.str.1839 = private unnamed_addr constant [5 x i8] c"sort\00" +@.str.1840 = private unnamed_addr constant [8 x i8] c"reverse\00" +@.str.1841 = private unnamed_addr constant [7 x i8] c"assign\00" +@.str.1842 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1843 = private unnamed_addr constant [7 x i8] c"method\00" +@.str.1844 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1845 = private unnamed_addr constant [27 x i8] c"used .mm on a null pointer\00" +@.str.1846 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1847 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.1848 = private unnamed_addr constant [5 x i8] c"addr\00" +@.str.1849 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1850 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1851 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1852 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1853 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1854 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1855 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1856 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1857 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1858 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1859 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1860 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1861 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1862 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1863 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1864 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1865 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1866 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1867 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1868 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1869 = private unnamed_addr constant [13 x i8] c"the struct '\00" +@.str.1870 = private unnamed_addr constant [19 x i8] c"' is defined twice\00" +@.str.1871 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1872 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.1873 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1874 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1875 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1876 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1877 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1878 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1879 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1880 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1881 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1882 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1883 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1884 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1885 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1886 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1887 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1888 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1889 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1890 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1891 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1892 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1893 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1894 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1895 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1896 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1897 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1898 = private unnamed_addr constant [19 x i8] c"' is defined twice\00" +@.str.1899 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1900 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1901 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1902 = private unnamed_addr constant [10 x i8] c"the enum \00" +@.str.1903 = private unnamed_addr constant [18 x i8] c" has the variant \00" +@.str.1904 = private unnamed_addr constant [7 x i8] c" twice\00" +@.str.1905 = private unnamed_addr constant [17 x i8] c"two variants of \00" +@.str.1906 = private unnamed_addr constant [18 x i8] c" have the number \00" +@.str.1907 = private unnamed_addr constant [21 x i8] c" (give each its own)\00" +@.str.1908 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1909 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.1910 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1911 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.1912 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1913 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1914 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1915 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1916 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.1917 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1918 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1919 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1920 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1921 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1922 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1923 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1924 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1925 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1926 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1927 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1928 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1929 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1930 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1931 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.1932 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1933 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1934 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1935 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1936 = private unnamed_addr constant [11 x i8] c"function '\00" +@.str.1937 = private unnamed_addr constant [19 x i8] c"' is defined twice\00" +@.str.1938 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1939 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1940 = private unnamed_addr constant [1 x i8] c"\00" +@.str.1941 = private unnamed_addr constant [35 x i8] c"there is no generic struct named '\00" +@.str.1942 = private unnamed_addr constant [54 x i8] c"' here (a method goes in the same file as its struct)\00" +@.str.1943 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1944 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.1945 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1946 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1947 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1948 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1949 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1950 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1951 = private unnamed_addr constant [12 x i8] c"the method \00" +@.str.1952 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1953 = private unnamed_addr constant [18 x i8] c" is defined twice\00" +@.str.1954 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1955 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1956 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1957 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1958 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.1959 = private unnamed_addr constant [27 x i8] c"there is no struct named '\00" +@.str.1960 = private unnamed_addr constant [77 x i8] c"' here (a method goes in the same file as its struct, or on a struct from C)\00" +@.str.1961 = private unnamed_addr constant [12 x i8] c"the method \00" +@.str.1962 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1963 = private unnamed_addr constant [18 x i8] c" is defined twice\00" +@.str.1964 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1965 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.1966 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1967 = private unnamed_addr constant [12 x i8] c"the struct \00" +@.str.1968 = private unnamed_addr constant [29 x i8] c" already has a field named '\00" +@.str.1969 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1970 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1971 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1972 = private unnamed_addr constant [11 x i8] c"function '\00" +@.str.1973 = private unnamed_addr constant [19 x i8] c"' is defined twice\00" +@.str.1974 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.1975 = private unnamed_addr constant [44 x i8] c"' is a built-in function, pick another name\00" +@.str.1976 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1977 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1978 = private unnamed_addr constant [8 x i8] c"@finch.\00" +@.str.1979 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1980 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1981 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1982 = private unnamed_addr constant [8 x i8] c"@finch.\00" +@.str.1983 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1984 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.1985 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1986 = private unnamed_addr constant [2 x i8] c".\00" +@.str.1987 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1988 = private unnamed_addr constant [5 x i8] c"self\00" +@.str.1989 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1990 = private unnamed_addr constant [23 x i8] c"'self' is already the \00" +@.str.1991 = private unnamed_addr constant [25 x i8] c" the method is called on\00" +@.str.1992 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1993 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1994 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1995 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1996 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1997 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.1998 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.1999 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2000 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2001 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2002 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2003 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2004 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2005 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2006 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2007 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2008 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2009 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2010 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2011 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2012 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2013 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2014 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2015 = private unnamed_addr constant [5 x i8] c"self\00" +@.str.2016 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2017 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2018 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2019 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2020 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2021 = private unnamed_addr constant [27 x i8] c"used .mm on a null pointer\00" +@.str.2022 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2023 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2024 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2025 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2026 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2027 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2028 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2029 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2030 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2031 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2032 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2033 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2034 = private unnamed_addr constant [5 x i8] c"self\00" +@.str.2035 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2036 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2037 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2038 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2039 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2040 = private unnamed_addr constant [27 x i8] c"used .mm on a null pointer\00" +@.str.2041 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2042 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2043 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2044 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2045 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2046 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2047 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2048 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2049 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2050 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2051 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2052 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2053 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2054 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2055 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2056 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2057 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2058 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2059 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2060 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2061 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2062 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2063 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2064 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2065 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2066 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2067 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2068 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2069 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2070 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2071 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2072 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2073 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2074 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2075 = private unnamed_addr constant [35 x i8] c"there is no generic struct named '\00" +@.str.2076 = private unnamed_addr constant [29 x i8] c"' (a struct written struct \00" +@.str.2077 = private unnamed_addr constant [35 x i8] c"[T] { ... } takes type arguments)\00" +@.str.2078 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2079 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2080 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2081 = private unnamed_addr constant [8 x i8] c" takes \00" +@.str.2082 = private unnamed_addr constant [25 x i8] c" type argument(s), like \00" +@.str.2083 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.2084 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2085 = private unnamed_addr constant [12 x i8] c"], but got \00" +@.str.2086 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.2087 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.2088 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2089 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2090 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2091 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2092 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2093 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2094 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2095 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2096 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.2097 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.2098 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2099 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2100 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2101 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2102 = private unnamed_addr constant [8 x i8] c"@finch.\00" +@.str.2103 = private unnamed_addr constant [2 x i8] c".\00" +@.str.2104 = private unnamed_addr constant [2 x i8] c".\00" +@.str.2105 = private unnamed_addr constant [8 x i8] c"@finch.\00" +@.str.2106 = private unnamed_addr constant [2 x i8] c".\00" +@.str.2107 = private unnamed_addr constant [2 x i8] c".\00" +@.str.2108 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2109 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.2110 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2111 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.2112 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2113 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.2114 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2115 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2116 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2117 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.2118 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2119 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.2120 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2121 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.2122 = private unnamed_addr constant [18 x i8] c" (while building \00" +@.str.2123 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2124 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2125 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2126 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2127 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2128 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2129 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2130 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2131 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2132 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.2133 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2134 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.2135 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2136 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.2137 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2138 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2139 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2140 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2141 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2142 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2143 = private unnamed_addr constant [6 x i8] c"named\00" +@.str.2144 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2145 = private unnamed_addr constant [30 x i8] c"used .bound on a null pointer\00" +@.str.2146 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2147 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2148 = private unnamed_addr constant [30 x i8] c"used .types on a null pointer\00" +@.str.2149 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2150 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2151 = private unnamed_addr constant [30 x i8] c"used .bound on a null pointer\00" +@.str.2152 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2153 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.2154 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.2155 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.2156 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2157 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2158 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.2159 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.2160 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2161 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2162 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2163 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2164 = private unnamed_addr constant [6 x i8] c"named\00" +@.str.2165 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2166 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2167 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2168 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2169 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2170 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2171 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2172 = private unnamed_addr constant [34 x i8] c"used .templates on a null pointer\00" +@.str.2173 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2174 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2175 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2176 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2177 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2178 = private unnamed_addr constant [8 x i8] c" takes \00" +@.str.2179 = private unnamed_addr constant [28 x i8] c" type argument(s), but got \00" +@.str.2180 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2181 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2182 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2183 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2184 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2185 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2186 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.2187 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2188 = private unnamed_addr constant [30 x i8] c"this has no type to work out \00" +@.str.2189 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2190 = private unnamed_addr constant [6 x i8] c" from\00" +@.str.2191 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2192 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2193 = private unnamed_addr constant [17 x i8] c"can't tell what \00" +@.str.2194 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2195 = private unnamed_addr constant [25 x i8] c" is here; write it out: \00" +@.str.2196 = private unnamed_addr constant [11 x i8] c"[int](...)\00" +@.str.2197 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2198 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2199 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2200 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2201 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2202 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2203 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2204 = private unnamed_addr constant [11 x i8] c"argument '\00" +@.str.2205 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2206 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.2207 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2208 = private unnamed_addr constant [2 x i8] c" \00" +@.str.2209 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2210 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.2211 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2212 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2213 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2214 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2215 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2216 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2217 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2218 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2219 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.2220 = private unnamed_addr constant [7 x i8] c" x i8]\00" +@.str.2221 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2222 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2223 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2224 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2225 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2226 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2227 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2228 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2229 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2230 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2231 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2232 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2233 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.2234 = private unnamed_addr constant [7 x i8] c" x i8]\00" +@.str.2235 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2236 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2237 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2238 = private unnamed_addr constant [50 x i8] c"has fields Finch can't see (unions or bit fields)\00" +@.str.2239 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2240 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2241 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2242 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2243 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2244 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2245 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2246 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2247 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2248 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2249 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2250 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2251 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2252 = private unnamed_addr constant [29 x i8] c"used .head on a null pointer\00" +@.str.2253 = private unnamed_addr constant [6 x i8] c"%S.C.\00" +@.str.2254 = private unnamed_addr constant [11 x i8] c" = type { \00" +@.str.2255 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2256 = private unnamed_addr constant [3 x i8] c" }\00" +@.str.2257 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2258 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2259 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2260 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2261 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2262 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2263 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2264 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2265 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2266 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2267 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.2268 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2269 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.2270 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2271 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2272 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2273 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2274 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2275 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2276 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.2277 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2278 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2279 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2280 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2281 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.2282 = private unnamed_addr constant [18 x i8] c" (while building \00" +@.str.2283 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2284 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2285 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2286 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2287 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2288 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2289 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2290 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.2291 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2292 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.2293 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2294 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2295 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2296 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2297 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2298 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2299 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2300 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2301 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2302 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2303 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2304 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2305 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2306 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2307 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2308 = private unnamed_addr constant [12 x i8] c"the struct \00" +@.str.2309 = private unnamed_addr constant [27 x i8] c" contains itself; use ptr[\00" +@.str.2310 = private unnamed_addr constant [8 x i8] c"] or []\00" +@.str.2311 = private unnamed_addr constant [16 x i8] c" for that field\00" +@.str.2312 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2313 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2314 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2315 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2316 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.2317 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2318 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2319 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2320 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2321 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.2322 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2323 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2324 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2325 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2326 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2327 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2328 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2329 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2330 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2331 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2332 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2333 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2334 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2335 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2336 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2337 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2338 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2339 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.2340 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2341 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2342 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2343 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2344 = private unnamed_addr constant [29 x i8] c"used .head on a null pointer\00" +@.str.2345 = private unnamed_addr constant [4 x i8] c"%S.\00" +@.str.2346 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2347 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2348 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2349 = private unnamed_addr constant [2 x i8] c".\00" +@.str.2350 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2351 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2352 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2353 = private unnamed_addr constant [11 x i8] c" = type { \00" +@.str.2354 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2355 = private unnamed_addr constant [3 x i8] c" }\00" +@.str.2356 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2357 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2358 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2359 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2360 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.2361 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.2362 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2363 = private unnamed_addr constant [17 x i8] c"division by zero\00" +@.str.2364 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.2365 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.2366 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.2367 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.2368 = private unnamed_addr constant [4 x i8] c"i16\00" +@.str.2369 = private unnamed_addr constant [4 x i8] c"u16\00" +@.str.2370 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.2371 = private unnamed_addr constant [4 x i8] c"u32\00" +@.str.2372 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.2373 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.2374 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.2375 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.2376 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.2377 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.2378 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2379 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2380 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2381 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2382 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2383 = private unnamed_addr constant [43 x i8] c"!DIDerivedType(tag: DW_TAG_member, name: \22\00" +@.str.2384 = private unnamed_addr constant [12 x i8] c"\22, scope: !\00" +@.str.2385 = private unnamed_addr constant [10 x i8] c", file: !\00" +@.str.2386 = private unnamed_addr constant [9 x i8] c", line: \00" +@.str.2387 = private unnamed_addr constant [13 x i8] c", baseType: \00" +@.str.2388 = private unnamed_addr constant [9 x i8] c", size: \00" +@.str.2389 = private unnamed_addr constant [11 x i8] c", offset: \00" +@.str.2390 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2391 = private unnamed_addr constant [21 x i8] c"!DIBasicType(name: \22\00" +@.str.2392 = private unnamed_addr constant [10 x i8] c"\22, size: \00" +@.str.2393 = private unnamed_addr constant [13 x i8] c", encoding: \00" +@.str.2394 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2395 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2396 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.2397 = private unnamed_addr constant [3 x i8] c"T:\00" +@.str.2398 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2399 = private unnamed_addr constant [32 x i8] c"used .mdcache on a null pointer\00" +@.str.2400 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2401 = private unnamed_addr constant [32 x i8] c"used .mdcache on a null pointer\00" +@.str.2402 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2403 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2404 = private unnamed_addr constant [32 x i8] c"used .mdfiles on a null pointer\00" +@.str.2405 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2406 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.2407 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.2408 = private unnamed_addr constant [15 x i8] c"DW_ATE_boolean\00" +@.str.2409 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.2410 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.2411 = private unnamed_addr constant [19 x i8] c"DW_ATE_signed_char\00" +@.str.2412 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2413 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2414 = private unnamed_addr constant [14 x i8] c"DW_ATE_signed\00" +@.str.2415 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.2416 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.2417 = private unnamed_addr constant [13 x i8] c"DW_ATE_float\00" +@.str.2418 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.2419 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.2420 = private unnamed_addr constant [13 x i8] c"DW_ATE_float\00" +@.str.2421 = private unnamed_addr constant [16 x i8] c"DW_ATE_unsigned\00" +@.str.2422 = private unnamed_addr constant [14 x i8] c"DW_ATE_signed\00" +@.str.2423 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.2424 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2425 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.2426 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2427 = private unnamed_addr constant [22 x i8] c"!DIEnumerator(name: \22\00" +@.str.2428 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2429 = private unnamed_addr constant [11 x i8] c"\22, value: \00" +@.str.2430 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2431 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2432 = private unnamed_addr constant [55 x i8] c"!DICompositeType(tag: DW_TAG_enumeration_type, name: \22\00" +@.str.2433 = private unnamed_addr constant [11 x i8] c"\22, file: !\00" +@.str.2434 = private unnamed_addr constant [25 x i8] c", size: 32, elements: !{\00" +@.str.2435 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2436 = private unnamed_addr constant [3 x i8] c"})\00" +@.str.2437 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2438 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2439 = private unnamed_addr constant [32 x i8] c"used .mdcache on a null pointer\00" +@.str.2440 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.2441 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2442 = private unnamed_addr constant [52 x i8] c"!DIDerivedType(tag: DW_TAG_pointer_type, baseType: \00" +@.str.2443 = private unnamed_addr constant [12 x i8] c", size: 64)\00" +@.str.2444 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2445 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2446 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2447 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.2448 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2449 = private unnamed_addr constant [20 x i8] c"!DISubrange(count: \00" +@.str.2450 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2451 = private unnamed_addr constant [52 x i8] c"!DICompositeType(tag: DW_TAG_array_type, baseType: \00" +@.str.2452 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2453 = private unnamed_addr constant [9 x i8] c", size: \00" +@.str.2454 = private unnamed_addr constant [16 x i8] c", elements: !{!\00" +@.str.2455 = private unnamed_addr constant [3 x i8] c"})\00" +@.str.2456 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2457 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2458 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2459 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.2460 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.2461 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.2462 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.2463 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2464 = private unnamed_addr constant [52 x i8] c"!DIDerivedType(tag: DW_TAG_pointer_type, baseType: \00" +@.str.2465 = private unnamed_addr constant [12 x i8] c", size: 64)\00" +@.str.2466 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2467 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.2468 = private unnamed_addr constant [4 x i8] c"len\00" +@.str.2469 = private unnamed_addr constant [4 x i8] c"cap\00" +@.str.2470 = private unnamed_addr constant [53 x i8] c"!DICompositeType(tag: DW_TAG_structure_type, name: \22\00" +@.str.2471 = private unnamed_addr constant [11 x i8] c"\22, file: !\00" +@.str.2472 = private unnamed_addr constant [38 x i8] c", size: 192, align: 64, elements: !{!\00" +@.str.2473 = private unnamed_addr constant [4 x i8] c", !\00" +@.str.2474 = private unnamed_addr constant [4 x i8] c", !\00" +@.str.2475 = private unnamed_addr constant [3 x i8] c"})\00" +@.str.2476 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2477 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2478 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2479 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.2480 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2481 = private unnamed_addr constant [67 x i8] c"!DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)\00" +@.str.2482 = private unnamed_addr constant [8 x i8] c"entries\00" +@.str.2483 = private unnamed_addr constant [4 x i8] c"len\00" +@.str.2484 = private unnamed_addr constant [5 x i8] c"used\00" +@.str.2485 = private unnamed_addr constant [4 x i8] c"cap\00" +@.str.2486 = private unnamed_addr constant [6 x i8] c"index\00" +@.str.2487 = private unnamed_addr constant [5 x i8] c"icap\00" +@.str.2488 = private unnamed_addr constant [5 x i8] c"adds\00" +@.str.2489 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.2490 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2491 = private unnamed_addr constant [53 x i8] c"!DICompositeType(tag: DW_TAG_structure_type, name: \22\00" +@.str.2492 = private unnamed_addr constant [11 x i8] c"\22, file: !\00" +@.str.2493 = private unnamed_addr constant [37 x i8] c", size: 448, align: 64, elements: !{\00" +@.str.2494 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2495 = private unnamed_addr constant [3 x i8] c"})\00" +@.str.2496 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2497 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2498 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2499 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2500 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2501 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2502 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2503 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2504 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.2505 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2506 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2507 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2508 = private unnamed_addr constant [53 x i8] c"!DICompositeType(tag: DW_TAG_structure_type, name: \22\00" +@.str.2509 = private unnamed_addr constant [11 x i8] c"\22, file: !\00" +@.str.2510 = private unnamed_addr constant [9 x i8] c", size: \00" +@.str.2511 = private unnamed_addr constant [25 x i8] c", align: 8, elements: !{\00" +@.str.2512 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2513 = private unnamed_addr constant [3 x i8] c"})\00" +@.str.2514 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2515 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2516 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2517 = private unnamed_addr constant [21 x i8] c"!DIBasicType(name: \22\00" +@.str.2518 = private unnamed_addr constant [40 x i8] c"\22, size: 64, encoding: DW_ATE_unsigned)\00" +@.str.2519 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2520 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2521 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2522 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2523 = private unnamed_addr constant [32 x i8] c"used .mdcache on a null pointer\00" +@.str.2524 = private unnamed_addr constant [3 x i8] c"L:\00" +@.str.2525 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2526 = private unnamed_addr constant [32 x i8] c"used .dbgLine on a null pointer\00" +@.str.2527 = private unnamed_addr constant [2 x i8] c":\00" +@.str.2528 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2529 = private unnamed_addr constant [31 x i8] c"used .dbgCol on a null pointer\00" +@.str.2530 = private unnamed_addr constant [2 x i8] c":\00" +@.str.2531 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2532 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.2533 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2534 = private unnamed_addr constant [32 x i8] c"used .mdcache on a null pointer\00" +@.str.2535 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2536 = private unnamed_addr constant [32 x i8] c"used .mdcache on a null pointer\00" +@.str.2537 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2538 = private unnamed_addr constant [19 x i8] c"!DILocation(line: \00" +@.str.2539 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2540 = private unnamed_addr constant [32 x i8] c"used .dbgLine on a null pointer\00" +@.str.2541 = private unnamed_addr constant [11 x i8] c", column: \00" +@.str.2542 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2543 = private unnamed_addr constant [31 x i8] c"used .dbgCol on a null pointer\00" +@.str.2544 = private unnamed_addr constant [11 x i8] c", scope: !\00" +@.str.2545 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2546 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.2547 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2548 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2549 = private unnamed_addr constant [32 x i8] c"used .mdcache on a null pointer\00" +@.str.2550 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2551 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2552 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.2553 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2554 = private unnamed_addr constant [32 x i8] c"used .mdfiles on a null pointer\00" +@.str.2555 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2556 = private unnamed_addr constant [28 x i8] c"!DISubroutineType(types: !{\00" +@.str.2557 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2558 = private unnamed_addr constant [3 x i8] c"})\00" +@.str.2559 = private unnamed_addr constant [31 x i8] c"distinct !DISubprogram(name: \22\00" +@.str.2560 = private unnamed_addr constant [18 x i8] c"\22, linkageName: \22\00" +@.str.2561 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2562 = private unnamed_addr constant [12 x i8] c"\22, scope: !\00" +@.str.2563 = private unnamed_addr constant [10 x i8] c", file: !\00" +@.str.2564 = private unnamed_addr constant [9 x i8] c", line: \00" +@.str.2565 = private unnamed_addr constant [10 x i8] c", type: !\00" +@.str.2566 = private unnamed_addr constant [14 x i8] c", scopeLine: \00" +@.str.2567 = private unnamed_addr constant [88 x i8] c", flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagLocalToUnit, unit: !0)\00" +@.str.2568 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2569 = private unnamed_addr constant [30 x i8] c"used .debug on a null pointer\00" +@.str.2570 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2571 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.2572 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2573 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2574 = private unnamed_addr constant [31 x i8] c"used .dbgArg on a null pointer\00" +@.str.2575 = private unnamed_addr constant [8 x i8] c", arg: \00" +@.str.2576 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2577 = private unnamed_addr constant [31 x i8] c"used .dbgArg on a null pointer\00" +@.str.2578 = private unnamed_addr constant [25 x i8] c"!DILocalVariable(name: \22\00" +@.str.2579 = private unnamed_addr constant [12 x i8] c"\22, scope: !\00" +@.str.2580 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2581 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.2582 = private unnamed_addr constant [10 x i8] c", file: !\00" +@.str.2583 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2584 = private unnamed_addr constant [32 x i8] c"used .mdfiles on a null pointer\00" +@.str.2585 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2586 = private unnamed_addr constant [9 x i8] c", line: \00" +@.str.2587 = private unnamed_addr constant [10 x i8] c", type: !\00" +@.str.2588 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2589 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2590 = private unnamed_addr constant [32 x i8] c"used .dbgLine on a null pointer\00" +@.str.2591 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2592 = private unnamed_addr constant [31 x i8] c"used .dbgCol on a null pointer\00" +@.str.2593 = private unnamed_addr constant [42 x i8] c"call void @llvm.dbg.declare(metadata ptr \00" +@.str.2594 = private unnamed_addr constant [13 x i8] c", metadata !\00" +@.str.2595 = private unnamed_addr constant [28 x i8] c", metadata !DIExpression())\00" +@.str.2596 = private unnamed_addr constant [21 x i8] c"!llvm.dbg.cu = !{!0}\00" +@.str.2597 = private unnamed_addr constant [31 x i8] c"!llvm.module.flags = !{!1, !2}\00" +@.str.2598 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2599 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2600 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.2601 = private unnamed_addr constant [4 x i8] c" = \00" +@.str.2602 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2603 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.2604 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2605 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.2606 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.2607 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2608 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.2609 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2610 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2611 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2612 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2613 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2614 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2615 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.2616 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2617 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2618 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2619 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.2620 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2621 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2622 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2623 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.2624 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2625 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2626 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2627 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2628 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2629 = private unnamed_addr constant [18 x i8] c" (while building \00" +@.str.2630 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2631 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2632 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2633 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2634 = private unnamed_addr constant [33 x i8] c"used .instNote on a null pointer\00" +@.str.2635 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2636 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2637 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2638 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2639 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2640 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2641 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2642 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2643 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2644 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.2645 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2646 = private unnamed_addr constant [32 x i8] c"used .allocas on a null pointer\00" +@.str.2647 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2648 = private unnamed_addr constant [28 x i8] c"used .tmp on a null pointer\00" +@.str.2649 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2650 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.2651 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2652 = private unnamed_addr constant [30 x i8] c"used .nvars on a null pointer\00" +@.str.2653 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2654 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.2655 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2656 = private unnamed_addr constant [30 x i8] c"used .debug on a null pointer\00" +@.str.2657 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2658 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.2659 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2660 = private unnamed_addr constant [32 x i8] c"used .dbgLine on a null pointer\00" +@.str.2661 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2662 = private unnamed_addr constant [31 x i8] c"used .dbgCol on a null pointer\00" +@.str.2663 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2664 = private unnamed_addr constant [32 x i8] c"used .deferOn on a null pointer\00" +@.str.2665 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2666 = private unnamed_addr constant [32 x i8] c"used .inDefer on a null pointer\00" +@.str.2667 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2668 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2669 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2670 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2671 = private unnamed_addr constant [10 x i8] c"ptr %self\00" +@.str.2672 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2673 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2674 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2675 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.2676 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2677 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2678 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2679 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2680 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2681 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2682 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2683 = private unnamed_addr constant [5 x i8] c"self\00" +@.str.2684 = private unnamed_addr constant [6 x i8] c"%self\00" +@.str.2685 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2686 = private unnamed_addr constant [30 x i8] c"used .debug on a null pointer\00" +@.str.2687 = private unnamed_addr constant [5 x i8] c"self\00" +@.str.2688 = private unnamed_addr constant [6 x i8] c"%self\00" +@.str.2689 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2690 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2691 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2692 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2693 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2694 = private unnamed_addr constant [4 x i8] c" %p\00" +@.str.2695 = private unnamed_addr constant [3 x i8] c"%p\00" +@.str.2696 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2697 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2698 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2699 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2700 = private unnamed_addr constant [31 x i8] c"used .dbgArg on a null pointer\00" +@.str.2701 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2702 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2703 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2704 = private unnamed_addr constant [31 x i8] c"used .dbgArg on a null pointer\00" +@.str.2705 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2706 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2707 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2708 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2709 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2710 = private unnamed_addr constant [31 x i8] c"used .dbgArg on a null pointer\00" +@.str.2711 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2712 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2713 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.2714 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2715 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2716 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2717 = private unnamed_addr constant [11 x i8] c"function '\00" +@.str.2718 = private unnamed_addr constant [39 x i8] c"' can reach its end without returning \00" +@.str.2719 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2720 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2721 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2722 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2723 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.2724 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2725 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2726 = private unnamed_addr constant [54 x i8] c" { i1 true, i8 0, { ptr, i64, i64 } zeroinitializer }\00" +@.str.2727 = private unnamed_addr constant [9 x i8] c"ret void\00" +@.str.2728 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2729 = private unnamed_addr constant [8 x i8] c" !dbg !\00" +@.str.2730 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2731 = private unnamed_addr constant [33 x i8] c"used .dbgScope on a null pointer\00" +@.str.2732 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2733 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.2734 = private unnamed_addr constant [17 x i8] c"define internal \00" +@.str.2735 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2736 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2737 = private unnamed_addr constant [2 x i8] c" \00" +@.str.2738 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2739 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.2740 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.2741 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2742 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2743 = private unnamed_addr constant [11 x i8] c" {\0Aentry:\0A\00" +@.str.2744 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2745 = private unnamed_addr constant [32 x i8] c"used .allocas on a null pointer\00" +@.str.2746 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.2747 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.2748 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2749 = private unnamed_addr constant [29 x i8] c"used .body on a null pointer\00" +@.str.2750 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.2751 = private unnamed_addr constant [4 x i8] c"\0A}\0A\00" +@.str.2752 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2753 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.2754 = private unnamed_addr constant [67 x i8] c"this code can never run (it comes after return, break or continue)\00" +@.str.2755 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2756 = private unnamed_addr constant [32 x i8] c"used .dbgLine on a null pointer\00" +@.str.2757 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2758 = private unnamed_addr constant [31 x i8] c"used .dbgCol on a null pointer\00" +@.str.2759 = private unnamed_addr constant [6 x i8] c"block\00" +@.str.2760 = private unnamed_addr constant [5 x i8] c"decl\00" +@.str.2761 = private unnamed_addr constant [7 x i8] c"assign\00" +@.str.2762 = private unnamed_addr constant [5 x i8] c"expr\00" +@.str.2763 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2764 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.2765 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2766 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2767 = private unnamed_addr constant [6 x i8] c"match\00" +@.str.2768 = private unnamed_addr constant [3 x i8] c"if\00" +@.str.2769 = private unnamed_addr constant [6 x i8] c"while\00" +@.str.2770 = private unnamed_addr constant [4 x i8] c"for\00" +@.str.2771 = private unnamed_addr constant [5 x i8] c"each\00" +@.str.2772 = private unnamed_addr constant [7 x i8] c"return\00" +@.str.2773 = private unnamed_addr constant [6 x i8] c"defer\00" +@.str.2774 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2775 = private unnamed_addr constant [32 x i8] c"used .inDefer on a null pointer\00" +@.str.2776 = private unnamed_addr constant [34 x i8] c"defer inside defer is not allowed\00" +@.str.2777 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2778 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2779 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2780 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2781 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2782 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2783 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2784 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2785 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2786 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2787 = private unnamed_addr constant [30 x i8] c"used .nvars on a null pointer\00" +@.str.2788 = private unnamed_addr constant [6 x i8] c"break\00" +@.str.2789 = private unnamed_addr constant [9 x i8] c"continue\00" +@.str.2790 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2791 = private unnamed_addr constant [32 x i8] c"used .inDefer on a null pointer\00" +@.str.2792 = private unnamed_addr constant [28 x i8] c" can't be used inside defer\00" +@.str.2793 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2794 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2795 = private unnamed_addr constant [32 x i8] c" can only be used inside a loop\00" +@.str.2796 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2797 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2798 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2799 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2800 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2801 = private unnamed_addr constant [6 x i8] c"break\00" +@.str.2802 = private unnamed_addr constant [19 x i8] c"unknown statement \00" +@.str.2803 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2804 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2805 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2806 = private unnamed_addr constant [47 x i8] c"this gives back nothing, so it can't be stored\00" +@.str.2807 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.2808 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2809 = private unnamed_addr constant [35 x i8] c"null needs a type, like: ptr[int] \00" +@.str.2810 = private unnamed_addr constant [8 x i8] c" = null\00" +@.str.2811 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.2812 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2813 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2814 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.2815 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.2816 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2817 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.2818 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2819 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2820 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.2821 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2822 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2823 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2824 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.2825 = private unnamed_addr constant [29 x i8] c"there is no variable named '\00" +@.str.2826 = private unnamed_addr constant [19 x i8] c"' (create it with \00" +@.str.2827 = private unnamed_addr constant [9 x i8] c" := ...)\00" +@.str.2828 = private unnamed_addr constant [20 x i8] c"the loop variable '\00" +@.str.2829 = private unnamed_addr constant [19 x i8] c"' can't be changed\00" +@.str.2830 = private unnamed_addr constant [10 x i8] c"the value\00" +@.str.2831 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.2832 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.2833 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.2834 = private unnamed_addr constant [2 x i8] c"=\00" +@.str.2835 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2836 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2837 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2838 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2839 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.2840 = private unnamed_addr constant [12 x i8] c"a condition\00" +@.str.2841 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2842 = private unnamed_addr constant [5 x i8] c"then\00" +@.str.2843 = private unnamed_addr constant [5 x i8] c"else\00" +@.str.2844 = private unnamed_addr constant [6 x i8] c"endif\00" +@.str.2845 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2846 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2847 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.2848 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2849 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2850 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.2851 = private unnamed_addr constant [11 x i8] c"while.cond\00" +@.str.2852 = private unnamed_addr constant [11 x i8] c"while.body\00" +@.str.2853 = private unnamed_addr constant [10 x i8] c"while.end\00" +@.str.2854 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2855 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.2856 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2857 = private unnamed_addr constant [5 x i8] c"true\00" +@.str.2858 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2859 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2860 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2861 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2862 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2863 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2864 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2865 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2866 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2867 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2868 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.2869 = private unnamed_addr constant [6 x i8] c"break\00" +@.str.2870 = private unnamed_addr constant [6 x i8] c"while\00" +@.str.2871 = private unnamed_addr constant [4 x i8] c"for\00" +@.str.2872 = private unnamed_addr constant [5 x i8] c"each\00" +@.str.2873 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2874 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2875 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2876 = private unnamed_addr constant [21 x i8] c"the start of a range\00" +@.str.2877 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2878 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2879 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2880 = private unnamed_addr constant [19 x i8] c"the end of a range\00" +@.str.2881 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2882 = private unnamed_addr constant [9 x i8] c"for.cond\00" +@.str.2883 = private unnamed_addr constant [9 x i8] c"for.body\00" +@.str.2884 = private unnamed_addr constant [9 x i8] c"for.step\00" +@.str.2885 = private unnamed_addr constant [8 x i8] c"for.end\00" +@.str.2886 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2887 = private unnamed_addr constant [14 x i8] c"icmp slt i64 \00" +@.str.2888 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2889 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2890 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2891 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2892 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2893 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2894 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2895 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2896 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2897 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.2898 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2899 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2900 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.2901 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.2902 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2903 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2904 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2905 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2906 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2907 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2908 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.2909 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2910 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2911 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.2912 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.2913 = private unnamed_addr constant [15 x i8] c", i32 0, i32 6\00" +@.str.2914 = private unnamed_addr constant [9 x i8] c"map.cond\00" +@.str.2915 = private unnamed_addr constant [10 x i8] c"map.check\00" +@.str.2916 = private unnamed_addr constant [9 x i8] c"map.body\00" +@.str.2917 = private unnamed_addr constant [9 x i8] c"map.step\00" +@.str.2918 = private unnamed_addr constant [8 x i8] c"map.end\00" +@.str.2919 = private unnamed_addr constant [12 x i8] c"map.changed\00" +@.str.2920 = private unnamed_addr constant [9 x i8] c"map.same\00" +@.str.2921 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2922 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.2923 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.2924 = private unnamed_addr constant [15 x i8] c", i32 0, i32 6\00" +@.str.2925 = private unnamed_addr constant [13 x i8] c"icmp ne i64 \00" +@.str.2926 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2927 = private unnamed_addr constant [34 x i8] c"call void @finch_map_changed(ptr \00" +@.str.2928 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2929 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.2930 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2931 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.2932 = private unnamed_addr constant [2 x i8] c")\00" +@.str.2933 = private unnamed_addr constant [12 x i8] c"unreachable\00" +@.str.2934 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2935 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.2936 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2937 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2938 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.2939 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.2940 = private unnamed_addr constant [15 x i8] c", i32 0, i32 2\00" +@.str.2941 = private unnamed_addr constant [14 x i8] c"icmp slt i64 \00" +@.str.2942 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2943 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2944 = private unnamed_addr constant [13 x i8] c"icmp eq i64 \00" +@.str.2945 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.2946 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2947 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2948 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2949 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2950 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2951 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2952 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2953 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2954 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.2955 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2956 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2957 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.2958 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.2959 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2960 = private unnamed_addr constant [1 x i8] c"\00" +@.str.2961 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.2962 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.2963 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.2964 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.2965 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2966 = private unnamed_addr constant [56 x i8] c"for ... in needs an array, a str or a map, but this is \00" +@.str.2967 = private unnamed_addr constant [37 x i8] c" (for a range of numbers write 0..n)\00" +@.str.2968 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.2969 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.2970 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2971 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2972 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2973 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2974 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2975 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.2976 = private unnamed_addr constant [10 x i8] c"each.cond\00" +@.str.2977 = private unnamed_addr constant [10 x i8] c"each.body\00" +@.str.2978 = private unnamed_addr constant [10 x i8] c"each.step\00" +@.str.2979 = private unnamed_addr constant [9 x i8] c"each.end\00" +@.str.2980 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2981 = private unnamed_addr constant [47 x i8] c"getelementptr inbounds { ptr, i64, i64 }, ptr \00" +@.str.2982 = private unnamed_addr constant [15 x i8] c", i32 0, i32 1\00" +@.str.2983 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.2984 = private unnamed_addr constant [14 x i8] c"icmp slt i64 \00" +@.str.2985 = private unnamed_addr constant [3 x i8] c", \00" +@.str.2986 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.2987 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.2988 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.2989 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.2990 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2991 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2992 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2993 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.2994 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.2995 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2996 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2997 = private unnamed_addr constant [30 x i8] c"used .loops on a null pointer\00" +@.str.2998 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.2999 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.3000 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3001 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3002 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.3003 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.3004 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3005 = private unnamed_addr constant [32 x i8] c"used .inDefer on a null pointer\00" +@.str.3006 = private unnamed_addr constant [34 x i8] c"return can't be used inside defer\00" +@.str.3007 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3008 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.3009 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3010 = private unnamed_addr constant [6 x i8] c"error\00" +@.str.3011 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3012 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3013 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3014 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.3015 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3016 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3017 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3018 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3019 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3020 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.3021 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3022 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3023 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3024 = private unnamed_addr constant [65 x i8] c"' can't fail, so it can't return an error (make it fallible: -> \00" +@.str.3025 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3026 = private unnamed_addr constant [6 x i8] c"error\00" +@.str.3027 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3028 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3029 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3030 = private unnamed_addr constant [18 x i8] c"the error message\00" +@.str.3031 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.3032 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3033 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3034 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3035 = private unnamed_addr constant [13 x i8] c"insertvalue \00" +@.str.3036 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3037 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3038 = private unnamed_addr constant [37 x i8] c" zeroinitializer, { ptr, i64, i64 } \00" +@.str.3039 = private unnamed_addr constant [4 x i8] c", 2\00" +@.str.3040 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3041 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3042 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3043 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3044 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3045 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3046 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3047 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3048 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3049 = private unnamed_addr constant [47 x i8] c"' doesn't return a value (it has no '-> type')\00" +@.str.3050 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3051 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3052 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.3053 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3054 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3055 = private unnamed_addr constant [54 x i8] c" { i1 true, i8 0, { ptr, i64, i64 } zeroinitializer }\00" +@.str.3056 = private unnamed_addr constant [9 x i8] c"ret void\00" +@.str.3057 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3058 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3059 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3060 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3061 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3062 = private unnamed_addr constant [15 x i8] c"' must return \00" +@.str.3063 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3064 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3065 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3066 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3067 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3068 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3069 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3070 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3071 = private unnamed_addr constant [19 x i8] c"the returned value\00" +@.str.3072 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3073 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.3074 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3075 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3076 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3077 = private unnamed_addr constant [13 x i8] c"insertvalue \00" +@.str.3078 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3079 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3080 = private unnamed_addr constant [29 x i8] c" zeroinitializer, i1 true, 0\00" +@.str.3081 = private unnamed_addr constant [13 x i8] c"insertvalue \00" +@.str.3082 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3083 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3084 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3085 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3086 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3087 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3088 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3089 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.3090 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.3091 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3092 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3093 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3094 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.3095 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3096 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3097 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3098 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3099 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3100 = private unnamed_addr constant [8 x i8] c"{ i64, \00" +@.str.3101 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3102 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3103 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3104 = private unnamed_addr constant [3 x i8] c" }\00" +@.str.3105 = private unnamed_addr constant [30 x i8] c"ptrtoint (ptr getelementptr (\00" +@.str.3106 = private unnamed_addr constant [27 x i8] c", ptr null, i32 1) to i64)\00" +@.str.3107 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3108 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3109 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3110 = private unnamed_addr constant [15 x i8] c", i32 0, i32 0\00" +@.str.3111 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3112 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3113 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3114 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3115 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3116 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str.3117 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.3118 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3119 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3120 = private unnamed_addr constant [2 x i8] c"1\00" +@.str.3121 = private unnamed_addr constant [5 x i8] c"ptr \00" +@.str.3122 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3123 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3124 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3125 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3126 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str.3127 = private unnamed_addr constant [26 x i8] c"call i64 @finch_map_find(\00" +@.str.3128 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3129 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.3130 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.3131 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.3132 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.3133 = private unnamed_addr constant [26 x i8] c"call i64 @finch_map_slot(\00" +@.str.3134 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3135 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3136 = private unnamed_addr constant [8 x i8] c"map.new\00" +@.str.3137 = private unnamed_addr constant [9 x i8] c"map.have\00" +@.str.3138 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str.3139 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.3140 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3141 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3142 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3143 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3144 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3145 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3146 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3147 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3148 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3149 = private unnamed_addr constant [8 x i8] c"the key\00" +@.str.3150 = private unnamed_addr constant [45 x i8] c"this is a temporary map, it can't be changed\00" +@.str.3151 = private unnamed_addr constant [1 x i8] c"\00" +@.str.3152 = private unnamed_addr constant [12 x i8] c"map.missing\00" +@.str.3153 = private unnamed_addr constant [10 x i8] c"map.found\00" +@.str.3154 = private unnamed_addr constant [14 x i8] c"icmp slt i64 \00" +@.str.3155 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3156 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.3157 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.3158 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.3159 = private unnamed_addr constant [34 x i8] c"call void @finch_map_missing(ptr \00" +@.str.3160 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3161 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.3162 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3163 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3164 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3165 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3166 = private unnamed_addr constant [12 x i8] c"unreachable\00" +@.str.3167 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3168 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3169 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.3170 = private unnamed_addr constant [53 x i8] c"an empty [:] needs a type, like: map[str]int m = [:]\00" +@.str.3171 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3172 = private unnamed_addr constant [6 x i8] c"unary\00" +@.str.3173 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.3174 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3175 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3176 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3177 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3178 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3179 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3180 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3181 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3182 = private unnamed_addr constant [36 x i8] c"a map key needs a value with a type\00" +@.str.3183 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3184 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3185 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3186 = private unnamed_addr constant [38 x i8] c"a map value needs a value with a type\00" +@.str.3187 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3188 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.3189 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3190 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3191 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3192 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3193 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3194 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3195 = private unnamed_addr constant [22 x i8] c"every key of this map\00" +@.str.3196 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3197 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3198 = private unnamed_addr constant [24 x i8] c"every value of this map\00" +@.str.3199 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3200 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3201 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3202 = private unnamed_addr constant [4 x i8] c"has\00" +@.str.3203 = private unnamed_addr constant [4 x i8] c"get\00" +@.str.3204 = private unnamed_addr constant [7 x i8] c"remove\00" +@.str.3205 = private unnamed_addr constant [4 x i8] c"get\00" +@.str.3206 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3207 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3208 = private unnamed_addr constant [8 x i8] c"the key\00" +@.str.3209 = private unnamed_addr constant [14 x i8] c"icmp sge i64 \00" +@.str.3210 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3211 = private unnamed_addr constant [4 x i8] c"has\00" +@.str.3212 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3213 = private unnamed_addr constant [7 x i8] c"remove\00" +@.str.3214 = private unnamed_addr constant [11 x i8] c"remove.hit\00" +@.str.3215 = private unnamed_addr constant [11 x i8] c"remove.end\00" +@.str.3216 = private unnamed_addr constant [36 x i8] c"call void @finch_map_remove_at(ptr \00" +@.str.3217 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3218 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3219 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3220 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3221 = private unnamed_addr constant [10 x i8] c"get.found\00" +@.str.3222 = private unnamed_addr constant [12 x i8] c"get.missing\00" +@.str.3223 = private unnamed_addr constant [9 x i8] c"get.fend\00" +@.str.3224 = private unnamed_addr constant [9 x i8] c"get.mend\00" +@.str.3225 = private unnamed_addr constant [8 x i8] c"get.end\00" +@.str.3226 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3227 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3228 = private unnamed_addr constant [12 x i8] c"the default\00" +@.str.3229 = private unnamed_addr constant [5 x i8] c"phi \00" +@.str.3230 = private unnamed_addr constant [4 x i8] c" [ \00" +@.str.3231 = private unnamed_addr constant [4 x i8] c", %\00" +@.str.3232 = private unnamed_addr constant [7 x i8] c" ], [ \00" +@.str.3233 = private unnamed_addr constant [4 x i8] c", %\00" +@.str.3234 = private unnamed_addr constant [3 x i8] c" ]\00" +@.str.3235 = private unnamed_addr constant [6 x i8] c"clear\00" +@.str.3236 = private unnamed_addr constant [32 x i8] c"call void @finch_map_clear(ptr \00" +@.str.3237 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3238 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3239 = private unnamed_addr constant [5 x i8] c"keys\00" +@.str.3240 = private unnamed_addr constant [7 x i8] c"values\00" +@.str.3241 = private unnamed_addr constant [7 x i8] c"values\00" +@.str.3242 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.3243 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.3244 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.3245 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3246 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3247 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3248 = private unnamed_addr constant [15 x i8] c", i32 0, i32 1\00" +@.str.3249 = private unnamed_addr constant [31 x i8] c"call void @finch_arr_make(ptr \00" +@.str.3250 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3251 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3252 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3253 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3254 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3255 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3256 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.3257 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3258 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3259 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3260 = private unnamed_addr constant [15 x i8] c", i32 0, i32 2\00" +@.str.3261 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3262 = private unnamed_addr constant [11 x i8] c"entry.live\00" +@.str.3263 = private unnamed_addr constant [11 x i8] c"entry.next\00" +@.str.3264 = private unnamed_addr constant [13 x i8] c"icmp ne i64 \00" +@.str.3265 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3266 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3267 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3268 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3269 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3270 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3271 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3272 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.3273 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.3274 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.3275 = private unnamed_addr constant [22 x i8] c"a map has no method '\00" +@.str.3276 = private unnamed_addr constant [50 x i8] c"' (it has: has, get, remove, clear, keys, values)\00" +@.str.3277 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.3278 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.3279 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3280 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.3281 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3282 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3283 = private unnamed_addr constant [23 x i8] c"' is not a variant of \00" +@.str.3284 = private unnamed_addr constant [11 x i8] c" (it has: \00" +@.str.3285 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3286 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3287 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3288 = private unnamed_addr constant [13 x i8] c"this pattern\00" +@.str.3289 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3290 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3291 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3292 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3293 = private unnamed_addr constant [31 x i8] c"there is nothing to match here\00" +@.str.3294 = private unnamed_addr constant [10 x i8] c"match.end\00" +@.str.3295 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3296 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3297 = private unnamed_addr constant [73 x i8] c"this arm can never be used: 'else' already takes everything that is left\00" +@.str.3298 = private unnamed_addr constant [10 x i8] c"match.arm\00" +@.str.3299 = private unnamed_addr constant [11 x i8] c"match.next\00" +@.str.3300 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3301 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3302 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.3303 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3304 = private unnamed_addr constant [50 x i8] c"this variant is already handled by an earlier arm\00" +@.str.3305 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.3306 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3307 = private unnamed_addr constant [9 x i8] c"match.or\00" +@.str.3308 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3309 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3310 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3311 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3312 = private unnamed_addr constant [53 x i8] c"an arm of a match that gives a value has to give one\00" +@.str.3313 = private unnamed_addr constant [58 x i8] c"this arm (the arms of a match have to give the same type)\00" +@.str.3314 = private unnamed_addr constant [11 x i8] c"match.from\00" +@.str.3315 = private unnamed_addr constant [6 x i8] c"block\00" +@.str.3316 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3317 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3318 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.3319 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3320 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.3321 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3322 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3323 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3324 = private unnamed_addr constant [27 x i8] c"this match doesn't handle \00" +@.str.3325 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3326 = private unnamed_addr constant [30 x i8] c" (add them, or an 'else' arm)\00" +@.str.3327 = private unnamed_addr constant [12 x i8] c"a match on \00" +@.str.3328 = private unnamed_addr constant [55 x i8] c" needs an 'else' arm for everything that is not listed\00" +@.str.3329 = private unnamed_addr constant [5 x i8] c"true\00" +@.str.3330 = private unnamed_addr constant [36 x i8] c"no arm of this match fits the value\00" +@.str.3331 = private unnamed_addr constant [12 x i8] c"unreachable\00" +@.str.3332 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3333 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3334 = private unnamed_addr constant [12 x i8] c"unreachable\00" +@.str.3335 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3336 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3337 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3338 = private unnamed_addr constant [5 x i8] c"phi \00" +@.str.3339 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3340 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3341 = private unnamed_addr constant [3 x i8] c"[ \00" +@.str.3342 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3343 = private unnamed_addr constant [4 x i8] c", %\00" +@.str.3344 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3345 = private unnamed_addr constant [3 x i8] c" ]\00" +@.str.3346 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3347 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.3348 = private unnamed_addr constant [7 x i8] c"method\00" +@.str.3349 = private unnamed_addr constant [81 x i8] c"only a function call can fail; 'or' and 'try' go after one, like int(text) or 0\00" +@.str.3350 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3351 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.3352 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3353 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.3354 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3355 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.3356 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3357 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.3358 = private unnamed_addr constant [1 x i8] c"\00" +@.str.3359 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3360 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.3361 = private unnamed_addr constant [1 x i8] c"\00" +@.str.3362 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3363 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.3364 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3365 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.3366 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3367 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.3368 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3369 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.3370 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3371 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.3372 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3373 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.3374 = private unnamed_addr constant [51 x i8] c"this call can't fail, so it needs no 'or' or 'try'\00" +@.str.3375 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3376 = private unnamed_addr constant [32 x i8] c"used .inDefer on a null pointer\00" +@.str.3377 = private unnamed_addr constant [31 x i8] c"try can't be used inside defer\00" +@.str.3378 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3379 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3380 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.3381 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3382 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3383 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3384 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3385 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3386 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.3387 = private unnamed_addr constant [30 x i8] c"try passes the error on, so '\00" +@.str.3388 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3389 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3390 = private unnamed_addr constant [32 x i8] c"' must be able to fail too (-> \00" +@.str.3391 = private unnamed_addr constant [56 x i8] c"); or handle it here: ... or / ... or { ... }\00" +@.str.3392 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3393 = private unnamed_addr constant [11 x i8] c"try.failed\00" +@.str.3394 = private unnamed_addr constant [7 x i8] c"try.ok\00" +@.str.3395 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.3396 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3397 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3398 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3399 = private unnamed_addr constant [13 x i8] c"insertvalue \00" +@.str.3400 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3401 = private unnamed_addr constant [28 x i8] c"used .cur on a null pointer\00" +@.str.3402 = private unnamed_addr constant [37 x i8] c" zeroinitializer, { ptr, i64, i64 } \00" +@.str.3403 = private unnamed_addr constant [4 x i8] c", 2\00" +@.str.3404 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3405 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3406 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3407 = private unnamed_addr constant [10 x i8] c"or.failed\00" +@.str.3408 = private unnamed_addr constant [6 x i8] c"or.ok\00" +@.str.3409 = private unnamed_addr constant [4 x i8] c"err\00" +@.str.3410 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3411 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3412 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3413 = private unnamed_addr constant [29 x i8] c"used .term on a null pointer\00" +@.str.3414 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3415 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3416 = private unnamed_addr constant [143 x i8] c"this block must leave with return, break, continue or exit(...): after a failure there is no value to go on with (or give one: ... or )\00" +@.str.3417 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3418 = private unnamed_addr constant [7 x i8] c"or.end\00" +@.str.3419 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3420 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3421 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3422 = private unnamed_addr constant [99 x i8] c"this call gives back no value, so there is nothing to replace; handle the failure with or { ... }\00" +@.str.3423 = private unnamed_addr constant [4 x i8] c"err\00" +@.str.3424 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3425 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3426 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3427 = private unnamed_addr constant [21 x i8] c"the value after 'or'\00" +@.str.3428 = private unnamed_addr constant [8 x i8] c"or.bend\00" +@.str.3429 = private unnamed_addr constant [7 x i8] c"or.end\00" +@.str.3430 = private unnamed_addr constant [5 x i8] c"phi \00" +@.str.3431 = private unnamed_addr constant [4 x i8] c" [ \00" +@.str.3432 = private unnamed_addr constant [4 x i8] c", %\00" +@.str.3433 = private unnamed_addr constant [7 x i8] c" ], [ \00" +@.str.3434 = private unnamed_addr constant [4 x i8] c", %\00" +@.str.3435 = private unnamed_addr constant [3 x i8] c" ]\00" +@.str.3436 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.3437 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.3438 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3439 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3440 = private unnamed_addr constant [3 x i8] c"0x\00" +@.str.3441 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3442 = private unnamed_addr constant [3 x i8] c"0X\00" +@.str.3443 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3444 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3445 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3446 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3447 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3448 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3449 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3450 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3451 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.3452 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3453 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.3454 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3455 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3456 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3457 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3458 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.3459 = private unnamed_addr constant [7 x i8] c"member\00" +@.str.3460 = private unnamed_addr constant [6 x i8] c"index\00" +@.str.3461 = private unnamed_addr constant [6 x i8] c"match\00" +@.str.3462 = private unnamed_addr constant [4 x i8] c"try\00" +@.str.3463 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.3464 = private unnamed_addr constant [6 x i8] c"unary\00" +@.str.3465 = private unnamed_addr constant [7 x i8] c"binary\00" +@.str.3466 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.3467 = private unnamed_addr constant [7 x i8] c"method\00" +@.str.3468 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.3469 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3470 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.3471 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3472 = private unnamed_addr constant [20 x i8] c"unknown expression \00" +@.str.3473 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3474 = private unnamed_addr constant [2 x i8] c"!\00" +@.str.3475 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3476 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3477 = private unnamed_addr constant [20 x i8] c"the value after '!'\00" +@.str.3478 = private unnamed_addr constant [8 x i8] c"xor i1 \00" +@.str.3479 = private unnamed_addr constant [7 x i8] c", true\00" +@.str.3480 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3481 = private unnamed_addr constant [2 x i8] c"~\00" +@.str.3482 = private unnamed_addr constant [46 x i8] c"'~' flips the bits of a whole number, not of \00" +@.str.3483 = private unnamed_addr constant [5 x i8] c"xor \00" +@.str.3484 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3485 = private unnamed_addr constant [5 x i8] c", -1\00" +@.str.3486 = private unnamed_addr constant [35 x i8] c" can't be negative (it's unsigned)\00" +@.str.3487 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3488 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.3489 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3490 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.3491 = private unnamed_addr constant [5 x i8] c"sub \00" +@.str.3492 = private unnamed_addr constant [5 x i8] c" 0, \00" +@.str.3493 = private unnamed_addr constant [6 x i8] c"fneg \00" +@.str.3494 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3495 = private unnamed_addr constant [27 x i8] c"can't put '-' in front of \00" +@.str.3496 = private unnamed_addr constant [12 x i8] c"can't use '\00" +@.str.3497 = private unnamed_addr constant [6 x i8] c"' on \00" +@.str.3498 = private unnamed_addr constant [6 x i8] c" and \00" +@.str.3499 = private unnamed_addr constant [2 x i8] c"+\00" +@.str.3500 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3501 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3502 = private unnamed_addr constant [49 x i8] c" (turn the other side into text first: str(...))\00" +@.str.3503 = private unnamed_addr constant [2 x i8] c"&\00" +@.str.3504 = private unnamed_addr constant [2 x i8] c"|\00" +@.str.3505 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3506 = private unnamed_addr constant [2 x i8] c"&\00" +@.str.3507 = private unnamed_addr constant [27 x i8] c" (for true/false use '&&')\00" +@.str.3508 = private unnamed_addr constant [27 x i8] c" (for true/false use '||')\00" +@.str.3509 = private unnamed_addr constant [2 x i8] c"&\00" +@.str.3510 = private unnamed_addr constant [2 x i8] c"|\00" +@.str.3511 = private unnamed_addr constant [2 x i8] c"^\00" +@.str.3512 = private unnamed_addr constant [3 x i8] c"<<\00" +@.str.3513 = private unnamed_addr constant [3 x i8] c">>\00" +@.str.3514 = private unnamed_addr constant [44 x i8] c" (bit operators work on whole numbers only)\00" +@.str.3515 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.3516 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.3517 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.3518 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3519 = private unnamed_addr constant [32 x i8] c" (compare the parts one by one)\00" +@.str.3520 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3521 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3522 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3523 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3524 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3525 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3526 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3527 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3528 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3529 = private unnamed_addr constant [28 x i8] c"used .lit on a null pointer\00" +@.str.3530 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3531 = private unnamed_addr constant [28 x i8] c"used .lit on a null pointer\00" +@.str.3532 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3533 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3534 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3535 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3536 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3537 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3538 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3539 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3540 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3541 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3542 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3543 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3544 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3545 = private unnamed_addr constant [28 x i8] c"used .lit on a null pointer\00" +@.str.3546 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3547 = private unnamed_addr constant [28 x i8] c"used .lit on a null pointer\00" +@.str.3548 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3549 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3550 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3551 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3552 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3553 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3554 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3555 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3556 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3557 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3558 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3559 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3560 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3561 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3562 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3563 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3564 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3565 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3566 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3567 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3568 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3569 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3570 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3571 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3572 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3573 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3574 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3575 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3576 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3577 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3578 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3579 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3580 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3581 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3582 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3583 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3584 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3585 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3586 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3587 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3588 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3589 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3590 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3591 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3592 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3593 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3594 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3595 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3596 = private unnamed_addr constant [1 x i8] c"\00" +@.str.3597 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3598 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3599 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3600 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3601 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3602 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3603 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3604 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3605 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3606 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3607 = private unnamed_addr constant [1 x i8] c"\00" +@.str.3608 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3609 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3610 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3611 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3612 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3613 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3614 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3615 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3616 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.3617 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3618 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3619 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3620 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3621 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3622 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3623 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3624 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3625 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3626 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3627 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.3628 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3629 = private unnamed_addr constant [26 x i8] c"used .v on a null pointer\00" +@.str.3630 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3631 = private unnamed_addr constant [27 x i8] c"used .ty on a null pointer\00" +@.str.3632 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3633 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3634 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3635 = private unnamed_addr constant [30 x i8] c"used .value on a null pointer\00" +@.str.3636 = private unnamed_addr constant [2 x i8] c"+\00" +@.str.3637 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3638 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3639 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.3640 = private unnamed_addr constant [33 x i8] c"call void @finch_str_concat(ptr \00" +@.str.3641 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3642 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3643 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3644 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.3645 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3646 = private unnamed_addr constant [2 x i8] c"+\00" +@.str.3647 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.3648 = private unnamed_addr constant [2 x i8] c"*\00" +@.str.3649 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.3650 = private unnamed_addr constant [2 x i8] c"%\00" +@.str.3651 = private unnamed_addr constant [2 x i8] c"&\00" +@.str.3652 = private unnamed_addr constant [2 x i8] c"|\00" +@.str.3653 = private unnamed_addr constant [2 x i8] c"^\00" +@.str.3654 = private unnamed_addr constant [3 x i8] c"<<\00" +@.str.3655 = private unnamed_addr constant [3 x i8] c">>\00" +@.str.3656 = private unnamed_addr constant [4 x i8] c"add\00" +@.str.3657 = private unnamed_addr constant [4 x i8] c"sub\00" +@.str.3658 = private unnamed_addr constant [4 x i8] c"mul\00" +@.str.3659 = private unnamed_addr constant [5 x i8] c"sdiv\00" +@.str.3660 = private unnamed_addr constant [5 x i8] c"srem\00" +@.str.3661 = private unnamed_addr constant [4 x i8] c"and\00" +@.str.3662 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.3663 = private unnamed_addr constant [4 x i8] c"xor\00" +@.str.3664 = private unnamed_addr constant [4 x i8] c"shl\00" +@.str.3665 = private unnamed_addr constant [5 x i8] c"ashr\00" +@.str.3666 = private unnamed_addr constant [4 x i8] c"add\00" +@.str.3667 = private unnamed_addr constant [4 x i8] c"sub\00" +@.str.3668 = private unnamed_addr constant [4 x i8] c"mul\00" +@.str.3669 = private unnamed_addr constant [5 x i8] c"udiv\00" +@.str.3670 = private unnamed_addr constant [5 x i8] c"urem\00" +@.str.3671 = private unnamed_addr constant [4 x i8] c"and\00" +@.str.3672 = private unnamed_addr constant [3 x i8] c"or\00" +@.str.3673 = private unnamed_addr constant [4 x i8] c"xor\00" +@.str.3674 = private unnamed_addr constant [4 x i8] c"shl\00" +@.str.3675 = private unnamed_addr constant [5 x i8] c"lshr\00" +@.str.3676 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.3677 = private unnamed_addr constant [2 x i8] c"%\00" +@.str.3678 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.3679 = private unnamed_addr constant [17 x i8] c"division by zero\00" +@.str.3680 = private unnamed_addr constant [9 x i8] c"icmp eq \00" +@.str.3681 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3682 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3683 = private unnamed_addr constant [17 x i8] c"division by zero\00" +@.str.3684 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3685 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3686 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3687 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3688 = private unnamed_addr constant [2 x i8] c"+\00" +@.str.3689 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.3690 = private unnamed_addr constant [2 x i8] c"*\00" +@.str.3691 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.3692 = private unnamed_addr constant [2 x i8] c"%\00" +@.str.3693 = private unnamed_addr constant [5 x i8] c"fadd\00" +@.str.3694 = private unnamed_addr constant [5 x i8] c"fsub\00" +@.str.3695 = private unnamed_addr constant [5 x i8] c"fmul\00" +@.str.3696 = private unnamed_addr constant [5 x i8] c"fdiv\00" +@.str.3697 = private unnamed_addr constant [5 x i8] c"frem\00" +@.str.3698 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3699 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3700 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3701 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3702 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.3703 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3704 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3705 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3706 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3707 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3708 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3709 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3710 = private unnamed_addr constant [60 x i8] c"a str is never null; to check for empty text use s.len == 0\00" +@.str.3711 = private unnamed_addr constant [3 x i8] c"eq\00" +@.str.3712 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3713 = private unnamed_addr constant [3 x i8] c"ne\00" +@.str.3714 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str.3715 = private unnamed_addr constant [6 x i8] c" ptr \00" +@.str.3716 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3717 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3718 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3719 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3720 = private unnamed_addr constant [28 x i8] c"call i32 @finch_str_eq(ptr \00" +@.str.3721 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3722 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3723 = private unnamed_addr constant [3 x i8] c"ne\00" +@.str.3724 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3725 = private unnamed_addr constant [3 x i8] c"eq\00" +@.str.3726 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str.3727 = private unnamed_addr constant [6 x i8] c" i32 \00" +@.str.3728 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3729 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3730 = private unnamed_addr constant [29 x i8] c"call i64 @finch_str_cmp(ptr \00" +@.str.3731 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3732 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3733 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str.3734 = private unnamed_addr constant [6 x i8] c" i64 \00" +@.str.3735 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3736 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3737 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.3738 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3739 = private unnamed_addr constant [2 x i8] c"<\00" +@.str.3740 = private unnamed_addr constant [3 x i8] c"<=\00" +@.str.3741 = private unnamed_addr constant [2 x i8] c">\00" +@.str.3742 = private unnamed_addr constant [3 x i8] c">=\00" +@.str.3743 = private unnamed_addr constant [4 x i8] c"oeq\00" +@.str.3744 = private unnamed_addr constant [4 x i8] c"une\00" +@.str.3745 = private unnamed_addr constant [4 x i8] c"olt\00" +@.str.3746 = private unnamed_addr constant [4 x i8] c"ole\00" +@.str.3747 = private unnamed_addr constant [4 x i8] c"ogt\00" +@.str.3748 = private unnamed_addr constant [4 x i8] c"oge\00" +@.str.3749 = private unnamed_addr constant [6 x i8] c"fcmp \00" +@.str.3750 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3751 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3752 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3753 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3754 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3755 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.3756 = private unnamed_addr constant [116 x i8] c"enums can only be compared with == and != (to go through them in order, give the variants numbers and use int(...))\00" +@.str.3757 = private unnamed_addr constant [3 x i8] c"eq\00" +@.str.3758 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3759 = private unnamed_addr constant [3 x i8] c"ne\00" +@.str.3760 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str.3761 = private unnamed_addr constant [6 x i8] c" i32 \00" +@.str.3762 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3763 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3764 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3765 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.3766 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3767 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str.3768 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3769 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3770 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3771 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3772 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.3773 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3774 = private unnamed_addr constant [2 x i8] c"<\00" +@.str.3775 = private unnamed_addr constant [3 x i8] c"<=\00" +@.str.3776 = private unnamed_addr constant [2 x i8] c">\00" +@.str.3777 = private unnamed_addr constant [3 x i8] c">=\00" +@.str.3778 = private unnamed_addr constant [3 x i8] c"eq\00" +@.str.3779 = private unnamed_addr constant [3 x i8] c"ne\00" +@.str.3780 = private unnamed_addr constant [4 x i8] c"ult\00" +@.str.3781 = private unnamed_addr constant [4 x i8] c"ule\00" +@.str.3782 = private unnamed_addr constant [4 x i8] c"ugt\00" +@.str.3783 = private unnamed_addr constant [4 x i8] c"uge\00" +@.str.3784 = private unnamed_addr constant [3 x i8] c"eq\00" +@.str.3785 = private unnamed_addr constant [3 x i8] c"ne\00" +@.str.3786 = private unnamed_addr constant [4 x i8] c"slt\00" +@.str.3787 = private unnamed_addr constant [4 x i8] c"sle\00" +@.str.3788 = private unnamed_addr constant [4 x i8] c"sgt\00" +@.str.3789 = private unnamed_addr constant [4 x i8] c"sge\00" +@.str.3790 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3791 = private unnamed_addr constant [3 x i8] c"&&\00" +@.str.3792 = private unnamed_addr constant [3 x i8] c"||\00" +@.str.3793 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3794 = private unnamed_addr constant [11 x i8] c"logic.from\00" +@.str.3795 = private unnamed_addr constant [10 x i8] c"logic.rhs\00" +@.str.3796 = private unnamed_addr constant [10 x i8] c"logic.end\00" +@.str.3797 = private unnamed_addr constant [3 x i8] c"&&\00" +@.str.3798 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3799 = private unnamed_addr constant [11 x i8] c"logic.rend\00" +@.str.3800 = private unnamed_addr constant [5 x i8] c"true\00" +@.str.3801 = private unnamed_addr constant [3 x i8] c"&&\00" +@.str.3802 = private unnamed_addr constant [6 x i8] c"false\00" +@.str.3803 = private unnamed_addr constant [10 x i8] c"phi i1 [ \00" +@.str.3804 = private unnamed_addr constant [4 x i8] c", %\00" +@.str.3805 = private unnamed_addr constant [7 x i8] c" ], [ \00" +@.str.3806 = private unnamed_addr constant [4 x i8] c", %\00" +@.str.3807 = private unnamed_addr constant [3 x i8] c" ]\00" +@.str.3808 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.3809 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3810 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3811 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.3812 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str.3813 = private unnamed_addr constant [2 x i8] c"<\00" +@.str.3814 = private unnamed_addr constant [3 x i8] c"<=\00" +@.str.3815 = private unnamed_addr constant [2 x i8] c">\00" +@.str.3816 = private unnamed_addr constant [3 x i8] c">=\00" +@.str.3817 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3818 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.3819 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3820 = private unnamed_addr constant [48 x i8] c"an empty [] needs a type, like: []int nums = []\00" +@.str.3821 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.3822 = private unnamed_addr constant [28 x i8] c"every element of this array\00" +@.str.3823 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.3824 = private unnamed_addr constant [9 x i8] c"mul i64 \00" +@.str.3825 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3826 = private unnamed_addr constant [27 x i8] c"call ptr @finch_alloc(i64 \00" +@.str.3827 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3828 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3829 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3830 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3831 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3832 = private unnamed_addr constant [42 x i8] c"insertvalue { ptr, i64, i64 } undef, ptr \00" +@.str.3833 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3834 = private unnamed_addr constant [31 x i8] c"insertvalue { ptr, i64, i64 } \00" +@.str.3835 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3836 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.3837 = private unnamed_addr constant [31 x i8] c"insertvalue { ptr, i64, i64 } \00" +@.str.3838 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.3839 = private unnamed_addr constant [4 x i8] c", 2\00" +@.str.3840 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.3841 = private unnamed_addr constant [29 x i8] c"there is no variable named '\00" +@.str.3842 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3843 = private unnamed_addr constant [61 x i8] c"this is a temporary value, it can't be changed or pointed to\00" +@.str.3844 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.3845 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3846 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.3847 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3848 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.3849 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3850 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.3851 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3852 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3853 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.3854 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3855 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.3856 = private unnamed_addr constant [8 x i8] c"fprintf\00" +@.str.3857 = private unnamed_addr constant [6 x i8] c"stdin\00" +@.str.3858 = private unnamed_addr constant [7 x i8] c"stdout\00" +@.str.3859 = private unnamed_addr constant [7 x i8] c"stderr\00" +@.str.3860 = private unnamed_addr constant [2 x i8] c"2\00" +@.str.3861 = private unnamed_addr constant [6 x i8] c"stdin\00" +@.str.3862 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.3863 = private unnamed_addr constant [7 x i8] c"stdout\00" +@.str.3864 = private unnamed_addr constant [2 x i8] c"1\00" +@.str.3865 = private unnamed_addr constant [32 x i8] c"call ptr @finch_std_stream(i32 \00" +@.str.3866 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3867 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3868 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3869 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.3870 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3871 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.3872 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3873 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3874 = private unnamed_addr constant [30 x i8] c"used .cdone on a null pointer\00" +@.str.3875 = private unnamed_addr constant [3 x i8] c"g:\00" +@.str.3876 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3877 = private unnamed_addr constant [30 x i8] c"used .cdone on a null pointer\00" +@.str.3878 = private unnamed_addr constant [3 x i8] c"g:\00" +@.str.3879 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3880 = private unnamed_addr constant [29 x i8] c"used .head on a null pointer\00" +@.str.3881 = private unnamed_addr constant [2 x i8] c"@\00" +@.str.3882 = private unnamed_addr constant [20 x i8] c" = external global \00" +@.str.3883 = private unnamed_addr constant [2 x i8] c"@\00" +@.str.3884 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3885 = private unnamed_addr constant [44 x i8] c"' is a module; use something from it, like \00" +@.str.3886 = private unnamed_addr constant [11 x i8] c".name(...)\00" +@.str.3887 = private unnamed_addr constant [29 x i8] c"there is no variable named '\00" +@.str.3888 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3889 = private unnamed_addr constant [7 x i8] c"member\00" +@.str.3890 = private unnamed_addr constant [6 x i8] c"index\00" +@.str.3891 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3892 = private unnamed_addr constant [2 x i8] c".\00" +@.str.3893 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.3894 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3895 = private unnamed_addr constant [2 x i8] c".\00" +@.str.3896 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3897 = private unnamed_addr constant [2 x i8] c"e\00" +@.str.3898 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3899 = private unnamed_addr constant [2 x i8] c"E\00" +@.str.3900 = private unnamed_addr constant [3 x i8] c".0\00" +@.str.3901 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3902 = private unnamed_addr constant [3 x i8] c".0\00" +@.str.3903 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3904 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.3905 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3906 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.3907 = private unnamed_addr constant [7 x i8] c"member\00" +@.str.3908 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3909 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.3910 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3911 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3912 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3913 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3914 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.3915 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3916 = private unnamed_addr constant [10 x i8] c"the enum \00" +@.str.3917 = private unnamed_addr constant [18 x i8] c" has no variant '\00" +@.str.3918 = private unnamed_addr constant [12 x i8] c"' (it has: \00" +@.str.3919 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3920 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3921 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3922 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.3923 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3924 = private unnamed_addr constant [38 x i8] c"a variant of an enum can't be changed\00" +@.str.3925 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3926 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3927 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3928 = private unnamed_addr constant [58 x i8] c"this ptr has no type, so Finch doesn't know what's inside\00" +@.str.3929 = private unnamed_addr constant [13 x i8] c"icmp eq ptr \00" +@.str.3930 = private unnamed_addr constant [7 x i8] c", null\00" +@.str.3931 = private unnamed_addr constant [7 x i8] c"used .\00" +@.str.3932 = private unnamed_addr constant [19 x i8] c" on a null pointer\00" +@.str.3933 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3934 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.3935 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3936 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.3937 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3938 = private unnamed_addr constant [6 x i8] c"value\00" +@.str.3939 = private unnamed_addr constant [6 x i8] c"value\00" +@.str.3940 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.3941 = private unnamed_addr constant [3 x i8] c"a \00" +@.str.3942 = private unnamed_addr constant [44 x i8] c" only has '.value' (the thing it points to)\00" +@.str.3943 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.3944 = private unnamed_addr constant [2 x i8] c".\00" +@.str.3945 = private unnamed_addr constant [27 x i8] c" can't be changed directly\00" +@.str.3946 = private unnamed_addr constant [4 x i8] c"len\00" +@.str.3947 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3948 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3949 = private unnamed_addr constant [35 x i8] c"an array has .len and .ptr, not '.\00" +@.str.3950 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3951 = private unnamed_addr constant [49 x i8] c".ptr of a temporary value would point to nothing\00" +@.str.3952 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3953 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.3954 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3955 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.3956 = private unnamed_addr constant [31 x i8] c".ptr can't be changed directly\00" +@.str.3957 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3958 = private unnamed_addr constant [2 x i8] c"%\00" +@.str.3959 = private unnamed_addr constant [54 x i8] c".ptr of a temporary value would point to freed memory\00" +@.str.3960 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3961 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.3962 = private unnamed_addr constant [32 x i8] c"extractvalue { ptr, i64, i64 } \00" +@.str.3963 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.3964 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3965 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.3966 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.3967 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.3968 = private unnamed_addr constant [4 x i8] c"len\00" +@.str.3969 = private unnamed_addr constant [38 x i8] c"an array, map or str has .len, not '.\00" +@.str.3970 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.3971 = private unnamed_addr constant [49 x i8] c".len can't be changed directly (use push or pop)\00" +@.str.3972 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3973 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3974 = private unnamed_addr constant [15 x i8] c", i32 0, i32 1\00" +@.str.3975 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.3976 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3977 = private unnamed_addr constant [14 x i8] c"extractvalue \00" +@.str.3978 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3979 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.3980 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.3981 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.3982 = private unnamed_addr constant [22 x i8] c" has no fields (no '.\00" +@.str.3983 = private unnamed_addr constant [3 x i8] c"')\00" +@.str.3984 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3985 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.3986 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3987 = private unnamed_addr constant [12 x i8] c"the struct \00" +@.str.3988 = private unnamed_addr constant [16 x i8] c" has no field '\00" +@.str.3989 = private unnamed_addr constant [12 x i8] c"' (it has: \00" +@.str.3990 = private unnamed_addr constant [3 x i8] c", \00" +@.str.3991 = private unnamed_addr constant [2 x i8] c")\00" +@.str.3992 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3993 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.3994 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.3995 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str.3996 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.3997 = private unnamed_addr constant [14 x i8] c"extractvalue \00" +@.str.3998 = private unnamed_addr constant [2 x i8] c" \00" +@.str.3999 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4000 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4001 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4002 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.4003 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4004 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4005 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4006 = private unnamed_addr constant [9 x i8] c"an index\00" +@.str.4007 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.4008 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4009 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.4010 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4011 = private unnamed_addr constant [14 x i8] c", i64 0, i64 \00" +@.str.4012 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4013 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4014 = private unnamed_addr constant [58 x i8] c"this ptr has no type, so Finch doesn't know what's inside\00" +@.str.4015 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4016 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4017 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.4018 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4019 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4020 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.4021 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4022 = private unnamed_addr constant [47 x i8] c"[ ] works on arrays, str and pointers, not on \00" +@.str.4023 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4024 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.4025 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4026 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4027 = private unnamed_addr constant [45 x i8] c"this is a temporary str, it can't be changed\00" +@.str.4028 = private unnamed_addr constant [30 x i8] c"call void @finch_str_own(ptr \00" +@.str.4029 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4030 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4031 = private unnamed_addr constant [32 x i8] c"extractvalue { ptr, i64, i64 } \00" +@.str.4032 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.4033 = private unnamed_addr constant [32 x i8] c"extractvalue { ptr, i64, i64 } \00" +@.str.4034 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4035 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.4036 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4037 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4038 = private unnamed_addr constant [18 x i8] c"named arguments (\00" +@.str.4039 = private unnamed_addr constant [37 x i8] c": ...) are only for creating structs\00" +@.str.4040 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4041 = private unnamed_addr constant [9 x i8] c"' takes \00" +@.str.4042 = private unnamed_addr constant [23 x i8] c" argument(s), but got \00" +@.str.4043 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4044 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4045 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.4046 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4047 = private unnamed_addr constant [4 x i8] c"f64\00" +@.str.4048 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4049 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4050 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4051 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4052 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4053 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.4054 = private unnamed_addr constant [4 x i8] c"i16\00" +@.str.4055 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.4056 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.4057 = private unnamed_addr constant [4 x i8] c"u16\00" +@.str.4058 = private unnamed_addr constant [4 x i8] c"u32\00" +@.str.4059 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.4060 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.4061 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4062 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4063 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4064 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4065 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4066 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.4067 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4068 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4069 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4070 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.4071 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.4072 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.4073 = private unnamed_addr constant [33 x i8] c"call i32 @finch_str_try_int(ptr \00" +@.str.4074 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4075 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4076 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4077 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str.4078 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4079 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4080 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.4081 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4082 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4083 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.4084 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.4085 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4086 = private unnamed_addr constant [7 x i8] c"double\00" +@.str.4087 = private unnamed_addr constant [7 x i8] c"double\00" +@.str.4088 = private unnamed_addr constant [4 x i8] c"0.0\00" +@.str.4089 = private unnamed_addr constant [35 x i8] c"call i32 @finch_str_try_float(ptr \00" +@.str.4090 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4091 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4092 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4093 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str.4094 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4095 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4096 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.4097 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4098 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4099 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.4100 = private unnamed_addr constant [7 x i8] c"double\00" +@.str.4101 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4102 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4103 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4104 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.4105 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4106 = private unnamed_addr constant [32 x i8] c"call i64 @finch_str_to_int(ptr \00" +@.str.4107 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4108 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4109 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4110 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4111 = private unnamed_addr constant [37 x i8] c"call double @finch_str_to_float(ptr \00" +@.str.4112 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4113 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4114 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4115 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4116 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.4117 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.4118 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4119 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4120 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4121 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str.4122 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.4123 = private unnamed_addr constant [7 x i8] c"fptoui\00" +@.str.4124 = private unnamed_addr constant [7 x i8] c"fptosi\00" +@.str.4125 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4126 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4127 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.4128 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4129 = private unnamed_addr constant [9 x i8] c"icmp ne \00" +@.str.4130 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4131 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4132 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4133 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4134 = private unnamed_addr constant [5 x i8] c"null\00" +@.str.4135 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4136 = private unnamed_addr constant [14 x i8] c"inttoptr i64 \00" +@.str.4137 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.4138 = private unnamed_addr constant [8 x i8] c" to ptr\00" +@.str.4139 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4140 = private unnamed_addr constant [14 x i8] c"ptrtoint ptr \00" +@.str.4141 = private unnamed_addr constant [5 x i8] c" to \00" +@.str.4142 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4143 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4144 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4145 = private unnamed_addr constant [71 x i8] c"use .ptr to get a str's address (it is only valid while the str lives)\00" +@.str.4146 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4147 = private unnamed_addr constant [12 x i8] c"can't turn \00" +@.str.4148 = private unnamed_addr constant [7 x i8] c" into \00" +@.str.4149 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4150 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4151 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4152 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4153 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.4154 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4155 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4156 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4157 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4158 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.4159 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4160 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4161 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4162 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4163 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4164 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4165 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4166 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.4167 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4168 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4169 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4170 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4171 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4172 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4173 = private unnamed_addr constant [7 x i8] c"double\00" +@.str.4174 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4175 = private unnamed_addr constant [2 x i8] c"[\00" +@.str.4176 = private unnamed_addr constant [4 x i8] c" x \00" +@.str.4177 = private unnamed_addr constant [2 x i8] c"]\00" +@.str.4178 = private unnamed_addr constant [3 x i8] c"{ \00" +@.str.4179 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4180 = private unnamed_addr constant [3 x i8] c" }\00" +@.str.4181 = private unnamed_addr constant [9 x i8] c"indirect\00" +@.str.4182 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4183 = private unnamed_addr constant [5 x i8] c"i128\00" +@.str.4184 = private unnamed_addr constant [5 x i8] c"i128\00" +@.str.4185 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.4186 = private unnamed_addr constant [2 x i8] c"i\00" +@.str.4187 = private unnamed_addr constant [10 x i8] c"[2 x i64]\00" +@.str.4188 = private unnamed_addr constant [10 x i8] c"[2 x i64]\00" +@.str.4189 = private unnamed_addr constant [7 x i8] c"direct\00" +@.str.4190 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4191 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4192 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4193 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4194 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4195 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.4196 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4197 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.4198 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4199 = private unnamed_addr constant [2 x i8] c"i\00" +@.str.4200 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4201 = private unnamed_addr constant [9 x i8] c"indirect\00" +@.str.4202 = private unnamed_addr constant [7 x i8] c"memory\00" +@.str.4203 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4204 = private unnamed_addr constant [17 x i8] c"division by zero\00" +@.str.4205 = private unnamed_addr constant [7 x i8] c"memory\00" +@.str.4206 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4207 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4208 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4209 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4210 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4211 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4212 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4213 = private unnamed_addr constant [7 x i8] c"double\00" +@.str.4214 = private unnamed_addr constant [12 x i8] c"<2 x float>\00" +@.str.4215 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4216 = private unnamed_addr constant [2 x i8] c"i\00" +@.str.4217 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4218 = private unnamed_addr constant [3 x i8] c"{ \00" +@.str.4219 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4220 = private unnamed_addr constant [3 x i8] c" }\00" +@.str.4221 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4222 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4223 = private unnamed_addr constant [9 x i8] c"indirect\00" +@.str.4224 = private unnamed_addr constant [7 x i8] c"memory\00" +@.str.4225 = private unnamed_addr constant [7 x i8] c"memory\00" +@.str.4226 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4227 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4228 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4229 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4230 = private unnamed_addr constant [2 x i8] c"i\00" +@.str.4231 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4232 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.4233 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4234 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.4235 = private unnamed_addr constant [7 x i8] c"memory\00" +@.str.4236 = private unnamed_addr constant [7 x i8] c"direct\00" +@.str.4237 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4238 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4239 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4240 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4241 = private unnamed_addr constant [17 x i8] c"the C function '\00" +@.str.4242 = private unnamed_addr constant [3 x i8] c"' \00" +@.str.4243 = private unnamed_addr constant [19 x i8] c" the Finch struct \00" +@.str.4244 = private unnamed_addr constant [21 x i8] c", which C can't take\00" +@.str.4245 = private unnamed_addr constant [17 x i8] c"the C function '\00" +@.str.4246 = private unnamed_addr constant [3 x i8] c"' \00" +@.str.4247 = private unnamed_addr constant [13 x i8] c" the struct \00" +@.str.4248 = private unnamed_addr constant [41 x i8] c" by value, which Finch can't do yet: it \00" +@.str.4249 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4250 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4251 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4252 = private unnamed_addr constant [60 x i8] c"methods can't be exported (export a plain fn that calls it)\00" +@.str.4253 = private unnamed_addr constant [75 x i8] c"an export fn can't fail (C has no errors as values): handle them inside it\00" +@.str.4254 = private unnamed_addr constant [30 x i8] c"an export fn can't be generic\00" +@.str.4255 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4256 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4257 = private unnamed_addr constant [67 x i8] c"an export fn takes numbers, bool, char and pointers only (this is \00" +@.str.4258 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4259 = private unnamed_addr constant [51 x i8] c"; pass text as ptr[char] and make it a str inside)\00" +@.str.4260 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4261 = private unnamed_addr constant [70 x i8] c"an export fn returns nothing, a number, bool, char or a pointer (not \00" +@.str.4262 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4263 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4264 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.4265 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4266 = private unnamed_addr constant [39 x i8] c"' is exported twice (from two modules)\00" +@.str.4267 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4268 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4269 = private unnamed_addr constant [14 x i8] c"i8 zeroext %e\00" +@.str.4270 = private unnamed_addr constant [4 x i8] c"i1 \00" +@.str.4271 = private unnamed_addr constant [14 x i8] c"icmp ne i8 %e\00" +@.str.4272 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4273 = private unnamed_addr constant [4 x i8] c" %e\00" +@.str.4274 = private unnamed_addr constant [4 x i8] c" %e\00" +@.str.4275 = private unnamed_addr constant [6 x i8] c"call \00" +@.str.4276 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4277 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.4278 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4279 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4280 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4281 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4282 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4283 = private unnamed_addr constant [9 x i8] c"ret void\00" +@.str.4284 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4285 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.4286 = private unnamed_addr constant [9 x i8] c" zeroext\00" +@.str.4287 = private unnamed_addr constant [8 x i8] c"ret i8 \00" +@.str.4288 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str.4289 = private unnamed_addr constant [7 x i8] c" to i8\00" +@.str.4290 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.4291 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4292 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4293 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4294 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.4295 = private unnamed_addr constant [11 x i8] c" dllexport\00" +@.str.4296 = private unnamed_addr constant [7 x i8] c"define\00" +@.str.4297 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4298 = private unnamed_addr constant [3 x i8] c" @\00" +@.str.4299 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.4300 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4301 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4302 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4303 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.4304 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4305 = private unnamed_addr constant [10 x i8] c"@finch.c.\00" +@.str.4306 = private unnamed_addr constant [2 x i8] c".\00" +@.str.4307 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4308 = private unnamed_addr constant [30 x i8] c"used .cdone on a null pointer\00" +@.str.4309 = private unnamed_addr constant [3 x i8] c"t:\00" +@.str.4310 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4311 = private unnamed_addr constant [30 x i8] c"used .cdone on a null pointer\00" +@.str.4312 = private unnamed_addr constant [3 x i8] c"t:\00" +@.str.4313 = private unnamed_addr constant [6 x i8] c"addr(\00" +@.str.4314 = private unnamed_addr constant [82 x i8] c") gives C a function pointer, so it can't be a method or a function that can fail\00" +@.str.4315 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4316 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4317 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4318 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4319 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4320 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4321 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4322 = private unnamed_addr constant [6 x i8] c"addr(\00" +@.str.4323 = private unnamed_addr constant [96 x i8] c") gives C a function pointer, so its parameters must be C types (numbers, ptr, C structs), not \00" +@.str.4324 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4325 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4326 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4327 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4328 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4329 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4330 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4331 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4332 = private unnamed_addr constant [6 x i8] c"addr(\00" +@.str.4333 = private unnamed_addr constant [39 x i8] c"): a function given to C can't return \00" +@.str.4334 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4335 = private unnamed_addr constant [10 x i8] c"ptr sret(\00" +@.str.4336 = private unnamed_addr constant [15 x i8] c") align 16 %c0\00" +@.str.4337 = private unnamed_addr constant [4 x i8] c"%c0\00" +@.str.4338 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4339 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4340 = private unnamed_addr constant [7 x i8] c"memory\00" +@.str.4341 = private unnamed_addr constant [11 x i8] c"ptr byval(\00" +@.str.4342 = private unnamed_addr constant [9 x i8] c") align \00" +@.str.4343 = private unnamed_addr constant [4 x i8] c" %c\00" +@.str.4344 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4345 = private unnamed_addr constant [3 x i8] c"%c\00" +@.str.4346 = private unnamed_addr constant [9 x i8] c"indirect\00" +@.str.4347 = private unnamed_addr constant [7 x i8] c"ptr %c\00" +@.str.4348 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4349 = private unnamed_addr constant [3 x i8] c"%c\00" +@.str.4350 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4351 = private unnamed_addr constant [10 x i8] c"[32 x i8]\00" +@.str.4352 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4353 = private unnamed_addr constant [4 x i8] c" %c\00" +@.str.4354 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4355 = private unnamed_addr constant [3 x i8] c"%c\00" +@.str.4356 = private unnamed_addr constant [32 x i8] c"getelementptr inbounds i8, ptr \00" +@.str.4357 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4358 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4359 = private unnamed_addr constant [4 x i8] c" %c\00" +@.str.4360 = private unnamed_addr constant [4 x i8] c" %c\00" +@.str.4361 = private unnamed_addr constant [6 x i8] c"call \00" +@.str.4362 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4363 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.4364 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4365 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4366 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4367 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4368 = private unnamed_addr constant [9 x i8] c"ret void\00" +@.str.4369 = private unnamed_addr constant [9 x i8] c"ret void\00" +@.str.4370 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4371 = private unnamed_addr constant [10 x i8] c"[32 x i8]\00" +@.str.4372 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.4373 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4374 = private unnamed_addr constant [5 x i8] c"ret \00" +@.str.4375 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4376 = private unnamed_addr constant [16 x i8] c"define internal\00" +@.str.4377 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4378 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4379 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.4380 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4381 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4382 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4383 = private unnamed_addr constant [30 x i8] c"used .enums on a null pointer\00" +@.str.4384 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4385 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4386 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4387 = private unnamed_addr constant [55 x i8] c"(...) turns a whole number into the enum, but this is \00" +@.str.4388 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.4389 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4390 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4391 = private unnamed_addr constant [38 x i8] c" is not the number of any variant of \00" +@.str.4392 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4393 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4394 = private unnamed_addr constant [13 x i8] c"icmp eq i64 \00" +@.str.4395 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4396 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4397 = private unnamed_addr constant [7 x i8] c"or i1 \00" +@.str.4398 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4399 = private unnamed_addr constant [8 x i8] c"xor i1 \00" +@.str.4400 = private unnamed_addr constant [7 x i8] c", true\00" +@.str.4401 = private unnamed_addr constant [33 x i8] c"this number is not a variant of \00" +@.str.4402 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str.4403 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.4404 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4405 = private unnamed_addr constant [9 x i8] c" zeroext\00" +@.str.4406 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4407 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4408 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.4409 = private unnamed_addr constant [9 x i8] c" signext\00" +@.str.4410 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4411 = private unnamed_addr constant [9 x i8] c" zeroext\00" +@.str.4412 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4413 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4414 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4415 = private unnamed_addr constant [17 x i8] c"the C function '\00" +@.str.4416 = private unnamed_addr constant [36 x i8] c"' can't be used from Finch yet: it \00" +@.str.4417 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4418 = private unnamed_addr constant [18 x i8] c"' takes at least \00" +@.str.4419 = private unnamed_addr constant [23 x i8] c" argument(s), but got \00" +@.str.4420 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4421 = private unnamed_addr constant [9 x i8] c"' takes \00" +@.str.4422 = private unnamed_addr constant [23 x i8] c" argument(s), but got \00" +@.str.4423 = private unnamed_addr constant [8 x i8] c"returns\00" +@.str.4424 = private unnamed_addr constant [6 x i8] c"takes\00" +@.str.4425 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4426 = private unnamed_addr constant [10 x i8] c"ptr sret(\00" +@.str.4427 = private unnamed_addr constant [11 x i8] c") align 16\00" +@.str.4428 = private unnamed_addr constant [10 x i8] c"ptr sret(\00" +@.str.4429 = private unnamed_addr constant [12 x i8] c") align 16 \00" +@.str.4430 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4431 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4432 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4433 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4434 = private unnamed_addr constant [10 x i8] c"argument \00" +@.str.4435 = private unnamed_addr constant [5 x i8] c" of \00" +@.str.4436 = private unnamed_addr constant [7 x i8] c"memory\00" +@.str.4437 = private unnamed_addr constant [11 x i8] c"ptr byval(\00" +@.str.4438 = private unnamed_addr constant [9 x i8] c") align \00" +@.str.4439 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4440 = private unnamed_addr constant [9 x i8] c"indirect\00" +@.str.4441 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4442 = private unnamed_addr constant [5 x i8] c"ptr \00" +@.str.4443 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4444 = private unnamed_addr constant [10 x i8] c"[32 x i8]\00" +@.str.4445 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4446 = private unnamed_addr constant [32 x i8] c"getelementptr inbounds i8, ptr \00" +@.str.4447 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4448 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4449 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4450 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4451 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4452 = private unnamed_addr constant [5 x i8] c"ptr \00" +@.str.4453 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4454 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4455 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4456 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4457 = private unnamed_addr constant [24 x i8] c"this gives back nothing\00" +@.str.4458 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4459 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.4460 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4461 = private unnamed_addr constant [69 x i8] c"structs and arrays can't be passed to the '...' part of a C function\00" +@.str.4462 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.4463 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4464 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4465 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4466 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4467 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4468 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str.4469 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.4470 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.4471 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4472 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.4473 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.4474 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4475 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4476 = private unnamed_addr constant [7 x i8] c"direct\00" +@.str.4477 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4478 = private unnamed_addr constant [6 x i8] c", ...\00" +@.str.4479 = private unnamed_addr constant [4 x i8] c"...\00" +@.str.4480 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4481 = private unnamed_addr constant [30 x i8] c"used .cdone on a null pointer\00" +@.str.4482 = private unnamed_addr constant [3 x i8] c"f:\00" +@.str.4483 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4484 = private unnamed_addr constant [30 x i8] c"used .cdone on a null pointer\00" +@.str.4485 = private unnamed_addr constant [3 x i8] c"f:\00" +@.str.4486 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4487 = private unnamed_addr constant [29 x i8] c"used .head on a null pointer\00" +@.str.4488 = private unnamed_addr constant [8 x i8] c"declare\00" +@.str.4489 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4490 = private unnamed_addr constant [3 x i8] c" @\00" +@.str.4491 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.4492 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4493 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4494 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4495 = private unnamed_addr constant [3 x i8] c" (\00" +@.str.4496 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4497 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4498 = private unnamed_addr constant [5 x i8] c"call\00" +@.str.4499 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4500 = private unnamed_addr constant [3 x i8] c" @\00" +@.str.4501 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.4502 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4503 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4504 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4505 = private unnamed_addr constant [7 x i8] c"expand\00" +@.str.4506 = private unnamed_addr constant [10 x i8] c"[32 x i8]\00" +@.str.4507 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4508 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4509 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4510 = private unnamed_addr constant [33 x i8] c"call void @finch_str_from_c(ptr \00" +@.str.4511 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4512 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4513 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4514 = private unnamed_addr constant [7 x i8] c"printf\00" +@.str.4515 = private unnamed_addr constant [7 x i8] c"fflush\00" +@.str.4516 = private unnamed_addr constant [5 x i8] c"exit\00" +@.str.4517 = private unnamed_addr constant [5 x i8] c"free\00" +@.str.4518 = private unnamed_addr constant [6 x i8] c"qsort\00" +@.str.4519 = private unnamed_addr constant [7 x i8] c"printf\00" +@.str.4520 = private unnamed_addr constant [5 x i8] c"puts\00" +@.str.4521 = private unnamed_addr constant [8 x i8] c"putchar\00" +@.str.4522 = private unnamed_addr constant [6 x i8] c"scanf\00" +@.str.4523 = private unnamed_addr constant [6 x i8] c"fopen\00" +@.str.4524 = private unnamed_addr constant [8 x i8] c"getchar\00" +@.str.4525 = private unnamed_addr constant [5 x i8] c"sqrt\00" +@.str.4526 = private unnamed_addr constant [4 x i8] c"pow\00" +@.str.4527 = private unnamed_addr constant [4 x i8] c"sin\00" +@.str.4528 = private unnamed_addr constant [4 x i8] c"cos\00" +@.str.4529 = private unnamed_addr constant [6 x i8] c"floor\00" +@.str.4530 = private unnamed_addr constant [5 x i8] c"fabs\00" +@.str.4531 = private unnamed_addr constant [7 x i8] c"malloc\00" +@.str.4532 = private unnamed_addr constant [5 x i8] c"rand\00" +@.str.4533 = private unnamed_addr constant [6 x i8] c"srand\00" +@.str.4534 = private unnamed_addr constant [4 x i8] c"abs\00" +@.str.4535 = private unnamed_addr constant [5 x i8] c"atoi\00" +@.str.4536 = private unnamed_addr constant [7 x i8] c"strlen\00" +@.str.4537 = private unnamed_addr constant [7 x i8] c"strcpy\00" +@.str.4538 = private unnamed_addr constant [7 x i8] c"memcpy\00" +@.str.4539 = private unnamed_addr constant [5 x i8] c"time\00" +@.str.4540 = private unnamed_addr constant [6 x i8] c"sleep\00" +@.str.4541 = private unnamed_addr constant [7 x i8] c"usleep\00" +@.str.4542 = private unnamed_addr constant [8 x i8] c"stdio.h\00" +@.str.4543 = private unnamed_addr constant [8 x i8] c"stdio.h\00" +@.str.4544 = private unnamed_addr constant [8 x i8] c"stdio.h\00" +@.str.4545 = private unnamed_addr constant [8 x i8] c"stdio.h\00" +@.str.4546 = private unnamed_addr constant [8 x i8] c"stdio.h\00" +@.str.4547 = private unnamed_addr constant [8 x i8] c"stdio.h\00" +@.str.4548 = private unnamed_addr constant [7 x i8] c"math.h\00" +@.str.4549 = private unnamed_addr constant [7 x i8] c"math.h\00" +@.str.4550 = private unnamed_addr constant [7 x i8] c"math.h\00" +@.str.4551 = private unnamed_addr constant [7 x i8] c"math.h\00" +@.str.4552 = private unnamed_addr constant [7 x i8] c"math.h\00" +@.str.4553 = private unnamed_addr constant [7 x i8] c"math.h\00" +@.str.4554 = private unnamed_addr constant [9 x i8] c"stdlib.h\00" +@.str.4555 = private unnamed_addr constant [9 x i8] c"stdlib.h\00" +@.str.4556 = private unnamed_addr constant [9 x i8] c"stdlib.h\00" +@.str.4557 = private unnamed_addr constant [9 x i8] c"stdlib.h\00" +@.str.4558 = private unnamed_addr constant [9 x i8] c"stdlib.h\00" +@.str.4559 = private unnamed_addr constant [9 x i8] c"string.h\00" +@.str.4560 = private unnamed_addr constant [9 x i8] c"string.h\00" +@.str.4561 = private unnamed_addr constant [9 x i8] c"string.h\00" +@.str.4562 = private unnamed_addr constant [7 x i8] c"time.h\00" +@.str.4563 = private unnamed_addr constant [9 x i8] c"unistd.h\00" +@.str.4564 = private unnamed_addr constant [9 x i8] c"unistd.h\00" +@.str.4565 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4566 = private unnamed_addr constant [29 x i8] c" (it's from C: add import \22\00" +@.str.4567 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4568 = private unnamed_addr constant [15 x i8] c"\22 at the top)\00" +@.str.4569 = private unnamed_addr constant [6 x i8] c"error\00" +@.str.4570 = private unnamed_addr constant [87 x i8] c"error(...) makes an error to return from a function that can fail: return error(\22...\22)\00" +@.str.4571 = private unnamed_addr constant [6 x i8] c"print\00" +@.str.4572 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4573 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4574 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4575 = private unnamed_addr constant [54 x i8] c"this gives back nothing, so there is nothing to print\00" +@.str.4576 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4577 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4578 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.4579 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4580 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4581 = private unnamed_addr constant [5 x i8] c"addr\00" +@.str.4582 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4583 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.4584 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4585 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4586 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4587 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.4588 = private unnamed_addr constant [7 x i8] c"member\00" +@.str.4589 = private unnamed_addr constant [6 x i8] c"index\00" +@.str.4590 = private unnamed_addr constant [64 x i8] c"addr(...) needs a variable, a field or an element, like addr(x)\00" +@.str.4591 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4592 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4593 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4594 = private unnamed_addr constant [35 x i8] c"call void @finch_str_from_int(ptr \00" +@.str.4595 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4596 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4597 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4598 = private unnamed_addr constant [36 x i8] c"call void @finch_str_from_uint(ptr \00" +@.str.4599 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4600 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.4601 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4602 = private unnamed_addr constant [37 x i8] c"call void @finch_str_from_float(ptr \00" +@.str.4603 = private unnamed_addr constant [10 x i8] c", double \00" +@.str.4604 = private unnamed_addr constant [6 x i8] c"float\00" +@.str.4605 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4606 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4607 = private unnamed_addr constant [36 x i8] c"call void @finch_str_from_char(ptr \00" +@.str.4608 = private unnamed_addr constant [14 x i8] c", i8 signext \00" +@.str.4609 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4610 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4611 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str.4612 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.4613 = private unnamed_addr constant [36 x i8] c"call void @finch_str_from_bool(ptr \00" +@.str.4614 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str.4615 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4616 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4617 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4618 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4619 = private unnamed_addr constant [33 x i8] c"call void @finch_str_from_c(ptr \00" +@.str.4620 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4621 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4622 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.4623 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4624 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.4625 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4626 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4627 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4628 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4629 = private unnamed_addr constant [37 x i8] c"call void @finch_str_from_bytes(ptr \00" +@.str.4630 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4631 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4632 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4633 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.4634 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.4635 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.4636 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4637 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.4638 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4639 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4640 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4641 = private unnamed_addr constant [12 x i8] c"can't turn \00" +@.str.4642 = private unnamed_addr constant [10 x i8] c" into str\00" +@.str.4643 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4644 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4645 = private unnamed_addr constant [10 x i8] c"read_file\00" +@.str.4646 = private unnamed_addr constant [12 x i8] c"file_exists\00" +@.str.4647 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4648 = private unnamed_addr constant [14 x i8] c"the file name\00" +@.str.4649 = private unnamed_addr constant [12 x i8] c"file_exists\00" +@.str.4650 = private unnamed_addr constant [33 x i8] c"call i32 @finch_file_exists(ptr \00" +@.str.4651 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4652 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str.4653 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4654 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4655 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4656 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.4657 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4658 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4659 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4660 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4661 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4662 = private unnamed_addr constant [35 x i8] c"call i32 @finch_try_read_file(ptr \00" +@.str.4663 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4664 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4665 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4666 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str.4667 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4668 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4669 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.4670 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4671 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4672 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.4673 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4674 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4675 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4676 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.4677 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4678 = private unnamed_addr constant [32 x i8] c"call void @finch_read_file(ptr \00" +@.str.4679 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4680 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4681 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.4682 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4683 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4684 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4685 = private unnamed_addr constant [11 x i8] c"write_file\00" +@.str.4686 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4687 = private unnamed_addr constant [14 x i8] c"the file name\00" +@.str.4688 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4689 = private unnamed_addr constant [9 x i8] c"the text\00" +@.str.4690 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4691 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.4692 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4693 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4694 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4695 = private unnamed_addr constant [36 x i8] c"call i32 @finch_try_write_file(ptr \00" +@.str.4696 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4697 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4698 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4699 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str.4700 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4701 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4702 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.4703 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4704 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4705 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.4706 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4707 = private unnamed_addr constant [32 x i8] c"call i32 @finch_write_file(ptr \00" +@.str.4708 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4709 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4710 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str.4711 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4712 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4713 = private unnamed_addr constant [12 x i8] c"delete_file\00" +@.str.4714 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4715 = private unnamed_addr constant [14 x i8] c"the file name\00" +@.str.4716 = private unnamed_addr constant [31 x i8] c"call void @finch_str_copy(ptr \00" +@.str.4717 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4718 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4719 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4720 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.4721 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4722 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4723 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4724 = private unnamed_addr constant [37 x i8] c"call i32 @finch_try_delete_file(ptr \00" +@.str.4725 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4726 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4727 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str.4728 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4729 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4730 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.4731 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4732 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4733 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.4734 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4735 = private unnamed_addr constant [33 x i8] c"call i32 @finch_delete_file(ptr \00" +@.str.4736 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4737 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str.4738 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4739 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.4740 = private unnamed_addr constant [6 x i8] c"shell\00" +@.str.4741 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4742 = private unnamed_addr constant [12 x i8] c"the command\00" +@.str.4743 = private unnamed_addr constant [31 x i8] c"call void @finch_str_copy(ptr \00" +@.str.4744 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4745 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4746 = private unnamed_addr constant [27 x i8] c"call i64 @finch_shell(ptr \00" +@.str.4747 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4748 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4749 = private unnamed_addr constant [5 x i8] c"exit\00" +@.str.4750 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4751 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.4752 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4753 = private unnamed_addr constant [14 x i8] c"the exit code\00" +@.str.4754 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str.4755 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.4756 = private unnamed_addr constant [27 x i8] c"call i32 @fflush(ptr null)\00" +@.str.4757 = private unnamed_addr constant [21 x i8] c"call void @exit(i32 \00" +@.str.4758 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4759 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4760 = private unnamed_addr constant [6 x i8] c"input\00" +@.str.4761 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4762 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4763 = private unnamed_addr constant [13 x i8] c"the question\00" +@.str.4764 = private unnamed_addr constant [28 x i8] c"call void @finch_input(ptr \00" +@.str.4765 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.4766 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4767 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4768 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4769 = private unnamed_addr constant [4 x i8] c"new\00" +@.str.4770 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4771 = private unnamed_addr constant [27 x i8] c"call ptr @finch_alloc(i64 \00" +@.str.4772 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4773 = private unnamed_addr constant [5 x i8] c"free\00" +@.str.4774 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4775 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4776 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4777 = private unnamed_addr constant [120 x i8] c"free(...) is only for pointers from new(...) or C; arrays, str and structs are freed by Finch at the end of their block\00" +@.str.4778 = private unnamed_addr constant [21 x i8] c"call void @free(ptr \00" +@.str.4779 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4780 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4781 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4782 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4783 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4784 = private unnamed_addr constant [48 x i8] c"' is not generic, so it takes no type arguments\00" +@.str.4785 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4786 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4787 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4788 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4789 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4790 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4791 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4792 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4793 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4794 = private unnamed_addr constant [43 x i8] c"' is generic, so say which type it holds: \00" +@.str.4795 = private unnamed_addr constant [11 x i8] c"[int](...)\00" +@.str.4796 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4797 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4798 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4799 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4800 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4801 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4802 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4803 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.4804 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4805 = private unnamed_addr constant [27 x i8] c"used .ci on a null pointer\00" +@.str.4806 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4807 = private unnamed_addr constant [2 x i8] c"C\00" +@.str.4808 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4809 = private unnamed_addr constant [32 x i8] c"' is a variable, not a function\00" +@.str.4810 = private unnamed_addr constant [29 x i8] c"there is no function named '\00" +@.str.4811 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4812 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4813 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.4814 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4815 = private unnamed_addr constant [5 x i8] c"main\00" +@.str.4816 = private unnamed_addr constant [53 x i8] c"main can't be called, it is where the program starts\00" +@.str.4817 = private unnamed_addr constant [5 x i8] c"ptr \00" +@.str.4818 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4819 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4820 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4821 = private unnamed_addr constant [11 x i8] c"argument '\00" +@.str.4822 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4823 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4824 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4825 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4826 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4827 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4828 = private unnamed_addr constant [32 x i8] c"used .ftarget on a null pointer\00" +@.str.4829 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4830 = private unnamed_addr constant [40 x i8] c"' can fail, so say what happens then: \00" +@.str.4831 = private unnamed_addr constant [20 x i8] c"(...) or , \00" +@.str.4832 = private unnamed_addr constant [28 x i8] c"(...) or { ... }, or try \00" +@.str.4833 = private unnamed_addr constant [6 x i8] c"(...)\00" +@.str.4834 = private unnamed_addr constant [6 x i8] c"call \00" +@.str.4835 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4836 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.4837 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4838 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4839 = private unnamed_addr constant [14 x i8] c"extractvalue \00" +@.str.4840 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4841 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.4842 = private unnamed_addr constant [8 x i8] c"xor i1 \00" +@.str.4843 = private unnamed_addr constant [7 x i8] c", true\00" +@.str.4844 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4845 = private unnamed_addr constant [32 x i8] c"used .ffailed on a null pointer\00" +@.str.4846 = private unnamed_addr constant [14 x i8] c"extractvalue \00" +@.str.4847 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4848 = private unnamed_addr constant [4 x i8] c", 2\00" +@.str.4849 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4850 = private unnamed_addr constant [29 x i8] c"used .fmsg on a null pointer\00" +@.str.4851 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4852 = private unnamed_addr constant [14 x i8] c"extractvalue \00" +@.str.4853 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4854 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.4855 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.4856 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4857 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4858 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4859 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4860 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.4861 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4862 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4863 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4864 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4865 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4866 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4867 = private unnamed_addr constant [70 x i8] c"give either all fields by name (x: 1, y: 2) or none (1, 2), not a mix\00" +@.str.4868 = private unnamed_addr constant [6 x i8] c" has \00" +@.str.4869 = private unnamed_addr constant [18 x i8] c" fields, but got \00" +@.str.4870 = private unnamed_addr constant [24 x i8] c" values (or name them: \00" +@.str.4871 = private unnamed_addr constant [16 x i8] c"(field: value))\00" +@.str.4872 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4873 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4874 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4875 = private unnamed_addr constant [16 x i8] c" has no field '\00" +@.str.4876 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4877 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4878 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4879 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4880 = private unnamed_addr constant [12 x i8] c"the field '\00" +@.str.4881 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4882 = private unnamed_addr constant [17 x i8] c"' is given twice\00" +@.str.4883 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4884 = private unnamed_addr constant [16 x i8] c"zeroinitializer\00" +@.str.4885 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4886 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4887 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4888 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4889 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4890 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4891 = private unnamed_addr constant [12 x i8] c"the field '\00" +@.str.4892 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4893 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4894 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4895 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4896 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.4897 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4898 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4899 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4900 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.4901 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4902 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.4903 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4904 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.4905 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4906 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.4907 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4908 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.4909 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4910 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4911 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4912 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4913 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4914 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4915 = private unnamed_addr constant [17 x i8] c"the default of '\00" +@.str.4916 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4917 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4918 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4919 = private unnamed_addr constant [31 x i8] c"used .module on a null pointer\00" +@.str.4920 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4921 = private unnamed_addr constant [31 x i8] c"used .tnames on a null pointer\00" +@.str.4922 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4923 = private unnamed_addr constant [30 x i8] c"used .targs on a null pointer\00" +@.str.4924 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4925 = private unnamed_addr constant [31 x i8] c"used .scopes on a null pointer\00" +@.str.4926 = private unnamed_addr constant [13 x i8] c"insertvalue \00" +@.str.4927 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4928 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4929 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4930 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4931 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4932 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4933 = private unnamed_addr constant [4 x i8] c"var\00" +@.str.4934 = private unnamed_addr constant [39 x i8] c"there is no variable or module named '\00" +@.str.4935 = private unnamed_addr constant [33 x i8] c"' (to use a module, add import \00" +@.str.4936 = private unnamed_addr constant [14 x i8] c" at the top)\00" +@.str.4937 = private unnamed_addr constant [2 x i8] c".\00" +@.str.4938 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4939 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4940 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4941 = private unnamed_addr constant [2 x i8] c".\00" +@.str.4942 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4943 = private unnamed_addr constant [13 x i8] c"the module '\00" +@.str.4944 = private unnamed_addr constant [36 x i8] c"' has no function or struct named '\00" +@.str.4945 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.4946 = private unnamed_addr constant [5 x i8] c"push\00" +@.str.4947 = private unnamed_addr constant [4 x i8] c"pop\00" +@.str.4948 = private unnamed_addr constant [7 x i8] c"insert\00" +@.str.4949 = private unnamed_addr constant [7 x i8] c"remove\00" +@.str.4950 = private unnamed_addr constant [6 x i8] c"clear\00" +@.str.4951 = private unnamed_addr constant [7 x i8] c"resize\00" +@.str.4952 = private unnamed_addr constant [5 x i8] c"sort\00" +@.str.4953 = private unnamed_addr constant [8 x i8] c"reverse\00" +@.str.4954 = private unnamed_addr constant [6 x i8] c"array\00" +@.str.4955 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4956 = private unnamed_addr constant [64 x i8] c"() would change a temporary array; store it in a variable first\00" +@.str.4957 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.4958 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.4959 = private unnamed_addr constant [4 x i8] c"map\00" +@.str.4960 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4961 = private unnamed_addr constant [62 x i8] c"() would change a temporary map; store it in a variable first\00" +@.str.4962 = private unnamed_addr constant [1 x i8] c"\00" +@.str.4963 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4964 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4965 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4966 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.4967 = private unnamed_addr constant [13 x i8] c"icmp eq ptr \00" +@.str.4968 = private unnamed_addr constant [7 x i8] c", null\00" +@.str.4969 = private unnamed_addr constant [9 x i8] c"called .\00" +@.str.4970 = private unnamed_addr constant [21 x i8] c"() on a null pointer\00" +@.str.4971 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4972 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4973 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.4974 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4975 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.4976 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.4977 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4978 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4979 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4980 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4981 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4982 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4983 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4984 = private unnamed_addr constant [32 x i8] c"used .structs on a null pointer\00" +@.str.4985 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4986 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.4987 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.4988 = private unnamed_addr constant [5 x i8] c"the \00" +@.str.4989 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4990 = private unnamed_addr constant [35 x i8] c" has no methods; add one with fn \00" +@.str.4991 = private unnamed_addr constant [2 x i8] c".\00" +@.str.4992 = private unnamed_addr constant [14 x i8] c"(...) { ... }\00" +@.str.4993 = private unnamed_addr constant [5 x i8] c"the \00" +@.str.4994 = private unnamed_addr constant [2 x i8] c" \00" +@.str.4995 = private unnamed_addr constant [17 x i8] c" has no method '\00" +@.str.4996 = private unnamed_addr constant [12 x i8] c"' (it has: \00" +@.str.4997 = private unnamed_addr constant [3 x i8] c", \00" +@.str.4998 = private unnamed_addr constant [2 x i8] c")\00" +@.str.4999 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5000 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.5001 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5002 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str.5003 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str.5004 = private unnamed_addr constant [29 x i8] c"() would change a temporary \00" +@.str.5005 = private unnamed_addr constant [31 x i8] c"; store it in a variable first\00" +@.str.5006 = private unnamed_addr constant [20 x i8] c"the loop variable '\00" +@.str.5007 = private unnamed_addr constant [19 x i8] c"' can't be changed\00" +@.str.5008 = private unnamed_addr constant [2 x i8] c".\00" +@.str.5009 = private unnamed_addr constant [16 x i8] c" has no methods\00" +@.str.5010 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5011 = private unnamed_addr constant [47 x i8] c"getelementptr inbounds { ptr, i64, i64 }, ptr \00" +@.str.5012 = private unnamed_addr constant [15 x i8] c", i32 0, i32 1\00" +@.str.5013 = private unnamed_addr constant [5 x i8] c"push\00" +@.str.5014 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5015 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5016 = private unnamed_addr constant [12 x i8] c"the element\00" +@.str.5017 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5018 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.5019 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.5020 = private unnamed_addr constant [34 x i8] c"call void @finch_arr_reserve(ptr \00" +@.str.5021 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5022 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5023 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5024 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5025 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5026 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5027 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5028 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5029 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5030 = private unnamed_addr constant [4 x i8] c"pop\00" +@.str.5031 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5032 = private unnamed_addr constant [13 x i8] c"icmp eq i64 \00" +@.str.5033 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.5034 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.5035 = private unnamed_addr constant [9 x i8] c"sub i64 \00" +@.str.5036 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.5037 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5038 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5039 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5040 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5041 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5042 = private unnamed_addr constant [6 x i8] c"clear\00" +@.str.5043 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5044 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.5045 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5046 = private unnamed_addr constant [5 x i8] c"find\00" +@.str.5047 = private unnamed_addr constant [9 x i8] c"contains\00" +@.str.5048 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5049 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5050 = private unnamed_addr constant [22 x i8] c"the value to look for\00" +@.str.5051 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5052 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5053 = private unnamed_addr constant [3 x i8] c"-1\00" +@.str.5054 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5055 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5056 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5057 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5058 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.5059 = private unnamed_addr constant [10 x i8] c"find.cond\00" +@.str.5060 = private unnamed_addr constant [10 x i8] c"find.body\00" +@.str.5061 = private unnamed_addr constant [9 x i8] c"find.hit\00" +@.str.5062 = private unnamed_addr constant [10 x i8] c"find.next\00" +@.str.5063 = private unnamed_addr constant [9 x i8] c"find.end\00" +@.str.5064 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5065 = private unnamed_addr constant [14 x i8] c"icmp slt i64 \00" +@.str.5066 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5067 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5068 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5069 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5070 = private unnamed_addr constant [3 x i8] c"==\00" +@.str.5071 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5072 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5073 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.5074 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.5075 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5076 = private unnamed_addr constant [5 x i8] c"find\00" +@.str.5077 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5078 = private unnamed_addr constant [14 x i8] c"icmp sge i64 \00" +@.str.5079 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.5080 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.5081 = private unnamed_addr constant [5 x i8] c"join\00" +@.str.5082 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5083 = private unnamed_addr constant [32 x i8] c"join() works on an array of str\00" +@.str.5084 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5085 = private unnamed_addr constant [14 x i8] c"the separator\00" +@.str.5086 = private unnamed_addr constant [31 x i8] c"call void @finch_str_join(ptr \00" +@.str.5087 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5088 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5089 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5090 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5091 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5092 = private unnamed_addr constant [7 x i8] c"insert\00" +@.str.5093 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5094 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5095 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5096 = private unnamed_addr constant [13 x i8] c"the position\00" +@.str.5097 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5098 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5099 = private unnamed_addr constant [12 x i8] c"the element\00" +@.str.5100 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5101 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.5102 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5103 = private unnamed_addr constant [37 x i8] c"call void @finch_arr_insert_gap(ptr \00" +@.str.5104 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5105 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5106 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5107 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5108 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5109 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5110 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5111 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5112 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5113 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5114 = private unnamed_addr constant [7 x i8] c"remove\00" +@.str.5115 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5116 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5117 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5118 = private unnamed_addr constant [13 x i8] c"the position\00" +@.str.5119 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5120 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5121 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5122 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5123 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5124 = private unnamed_addr constant [37 x i8] c"call void @finch_arr_remove_gap(ptr \00" +@.str.5125 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5126 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5127 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5128 = private unnamed_addr constant [7 x i8] c"resize\00" +@.str.5129 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5130 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5131 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5132 = private unnamed_addr constant [15 x i8] c"the new length\00" +@.str.5133 = private unnamed_addr constant [33 x i8] c"call void @finch_arr_resize(ptr \00" +@.str.5134 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5135 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5136 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5137 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5138 = private unnamed_addr constant [8 x i8] c"reverse\00" +@.str.5139 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5140 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5141 = private unnamed_addr constant [10 x i8] c"sdiv i64 \00" +@.str.5142 = private unnamed_addr constant [4 x i8] c", 2\00" +@.str.5143 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5144 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5145 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5146 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5147 = private unnamed_addr constant [9 x i8] c"sub i64 \00" +@.str.5148 = private unnamed_addr constant [9 x i8] c"sub i64 \00" +@.str.5149 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str.5150 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5151 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5152 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5153 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5154 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5155 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5156 = private unnamed_addr constant [6 x i8] c"slice\00" +@.str.5157 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5158 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5159 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5160 = private unnamed_addr constant [10 x i8] c"the start\00" +@.str.5161 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5162 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5163 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5164 = private unnamed_addr constant [8 x i8] c"the end\00" +@.str.5165 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5166 = private unnamed_addr constant [14 x i8] c"icmp slt i64 \00" +@.str.5167 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.5168 = private unnamed_addr constant [14 x i8] c"icmp sgt i64 \00" +@.str.5169 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5170 = private unnamed_addr constant [14 x i8] c"icmp sgt i64 \00" +@.str.5171 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5172 = private unnamed_addr constant [7 x i8] c"or i1 \00" +@.str.5173 = private unnamed_addr constant [7 x i8] c"or i1 \00" +@.str.5174 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5175 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5176 = private unnamed_addr constant [34 x i8] c"slice(start, end) is out of range\00" +@.str.5177 = private unnamed_addr constant [9 x i8] c"sub i64 \00" +@.str.5178 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5179 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5180 = private unnamed_addr constant [31 x i8] c"call void @finch_arr_make(ptr \00" +@.str.5181 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5182 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5183 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5184 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5185 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5186 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5187 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5188 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5189 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5190 = private unnamed_addr constant [24 x i8] c"getelementptr inbounds \00" +@.str.5191 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5192 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5193 = private unnamed_addr constant [9 x i8] c"add i64 \00" +@.str.5194 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5195 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5196 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5197 = private unnamed_addr constant [5 x i8] c"sort\00" +@.str.5198 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.5199 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5200 = private unnamed_addr constant [48 x i8] c"sort() works on arrays of numbers, chars or str\00" +@.str.5201 = private unnamed_addr constant [4 x i8] c"i64\00" +@.str.5202 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5203 = private unnamed_addr constant [22 x i8] c"call void @qsort(ptr \00" +@.str.5204 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5205 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5206 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5207 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5208 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5209 = private unnamed_addr constant [25 x i8] c"an array has no method '\00" +@.str.5210 = private unnamed_addr constant [97 x i8] c"' (it has: push, pop, insert, remove, clear, resize, find, contains, join, slice, reverse, sort)\00" +@.str.5211 = private unnamed_addr constant [12 x i8] c"@finch.cmp.\00" +@.str.5212 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5213 = private unnamed_addr constant [29 x i8] c"used .done on a null pointer\00" +@.str.5214 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5215 = private unnamed_addr constant [29 x i8] c"used .done on a null pointer\00" +@.str.5216 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5217 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5218 = private unnamed_addr constant [40 x i8] c"call i64 @finch_str_cmp(ptr %x, ptr %y)\00" +@.str.5219 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str.5220 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.5221 = private unnamed_addr constant [3 x i8] c"%x\00" +@.str.5222 = private unnamed_addr constant [3 x i8] c"%y\00" +@.str.5223 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5224 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5225 = private unnamed_addr constant [10 x i8] c"fcmp olt \00" +@.str.5226 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5227 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5228 = private unnamed_addr constant [10 x i8] c"fcmp ogt \00" +@.str.5229 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5230 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5231 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str.5232 = private unnamed_addr constant [2 x i8] c"<\00" +@.str.5233 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5234 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5235 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5236 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str.5237 = private unnamed_addr constant [2 x i8] c">\00" +@.str.5238 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5239 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5240 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5241 = private unnamed_addr constant [9 x i8] c"sub i32 \00" +@.str.5242 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str.5243 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.5244 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5245 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str.5246 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str.5247 = private unnamed_addr constant [9 x i8] c"ret i32 \00" +@.str.5248 = private unnamed_addr constant [21 x i8] c"define internal i32 \00" +@.str.5249 = private unnamed_addr constant [17 x i8] c"(ptr %x, ptr %y)\00" +@.str.5250 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5251 = private unnamed_addr constant [30 x i8] c"used .files on a null pointer\00" +@.str.5252 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5253 = private unnamed_addr constant [4 x i8] c"sub\00" +@.str.5254 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5255 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5256 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5257 = private unnamed_addr constant [10 x i8] c"the start\00" +@.str.5258 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5259 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5260 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5261 = private unnamed_addr constant [8 x i8] c"the end\00" +@.str.5262 = private unnamed_addr constant [30 x i8] c"call void @finch_str_sub(ptr \00" +@.str.5263 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5264 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5265 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5266 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5267 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5268 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5269 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5270 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5271 = private unnamed_addr constant [5 x i8] c"find\00" +@.str.5272 = private unnamed_addr constant [9 x i8] c"contains\00" +@.str.5273 = private unnamed_addr constant [12 x i8] c"starts_with\00" +@.str.5274 = private unnamed_addr constant [10 x i8] c"ends_with\00" +@.str.5275 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5276 = private unnamed_addr constant [21 x i8] c"the text to look for\00" +@.str.5277 = private unnamed_addr constant [5 x i8] c"find\00" +@.str.5278 = private unnamed_addr constant [30 x i8] c"call i64 @finch_str_find(ptr \00" +@.str.5279 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5280 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5281 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5282 = private unnamed_addr constant [9 x i8] c"contains\00" +@.str.5283 = private unnamed_addr constant [30 x i8] c"call i64 @finch_str_find(ptr \00" +@.str.5284 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5285 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5286 = private unnamed_addr constant [14 x i8] c"icmp sge i64 \00" +@.str.5287 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.5288 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.5289 = private unnamed_addr constant [18 x i8] c"@finch_str_starts\00" +@.str.5290 = private unnamed_addr constant [10 x i8] c"ends_with\00" +@.str.5291 = private unnamed_addr constant [16 x i8] c"@finch_str_ends\00" +@.str.5292 = private unnamed_addr constant [10 x i8] c"call i32 \00" +@.str.5293 = private unnamed_addr constant [6 x i8] c"(ptr \00" +@.str.5294 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5295 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5296 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str.5297 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str.5298 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.5299 = private unnamed_addr constant [5 x i8] c"trim\00" +@.str.5300 = private unnamed_addr constant [6 x i8] c"upper\00" +@.str.5301 = private unnamed_addr constant [6 x i8] c"lower\00" +@.str.5302 = private unnamed_addr constant [22 x i8] c"call void @finch_str_\00" +@.str.5303 = private unnamed_addr constant [6 x i8] c"(ptr \00" +@.str.5304 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5305 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5306 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5307 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5308 = private unnamed_addr constant [8 x i8] c"replace\00" +@.str.5309 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5310 = private unnamed_addr constant [20 x i8] c"the text to replace\00" +@.str.5311 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5312 = private unnamed_addr constant [13 x i8] c"the new text\00" +@.str.5313 = private unnamed_addr constant [34 x i8] c"call void @finch_str_replace(ptr \00" +@.str.5314 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5315 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5316 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5317 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5318 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5319 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5320 = private unnamed_addr constant [6 x i8] c"split\00" +@.str.5321 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5322 = private unnamed_addr constant [14 x i8] c"the separator\00" +@.str.5323 = private unnamed_addr constant [32 x i8] c"call void @finch_str_split(ptr \00" +@.str.5324 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5325 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5326 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5327 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5328 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5329 = private unnamed_addr constant [7 x i8] c"repeat\00" +@.str.5330 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5331 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5332 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5333 = private unnamed_addr constant [10 x i8] c"the count\00" +@.str.5334 = private unnamed_addr constant [33 x i8] c"call void @finch_str_repeat(ptr \00" +@.str.5335 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5336 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str.5337 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5338 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5339 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5340 = private unnamed_addr constant [6 x i8] c"bytes\00" +@.str.5341 = private unnamed_addr constant [37 x i8] c"call void @finch_bytes_from_str(ptr \00" +@.str.5342 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str.5343 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5344 = private unnamed_addr constant [18 x i8] c"{ ptr, i64, i64 }\00" +@.str.5345 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.5346 = private unnamed_addr constant [22 x i8] c"a str has no method '\00" +@.str.5347 = private unnamed_addr constant [107 x i8] c"' (it has: sub, find, contains, starts_with, ends_with, split, trim, upper, lower, replace, repeat, bytes)\00" +@.str.5348 = private unnamed_addr constant [55 x i8] c"declare void @finch_panic(ptr, i64, ptr) noreturn cold\00" +@.str.5349 = private unnamed_addr constant [66 x i8] c"declare void @finch_panic_index(ptr, i64, i64, i64) noreturn cold\00" +@.str.5350 = private unnamed_addr constant [30 x i8] c"declare ptr @finch_alloc(i64)\00" +@.str.5351 = private unnamed_addr constant [39 x i8] c"declare void @finch_str_copy(ptr, ptr)\00" +@.str.5352 = private unnamed_addr constant [33 x i8] c"declare void @finch_str_own(ptr)\00" +@.str.5353 = private unnamed_addr constant [46 x i8] c"declare void @finch_str_concat(ptr, ptr, ptr)\00" +@.str.5354 = private unnamed_addr constant [36 x i8] c"declare i32 @finch_str_eq(ptr, ptr)\00" +@.str.5355 = private unnamed_addr constant [37 x i8] c"declare i64 @finch_str_cmp(ptr, ptr)\00" +@.str.5356 = private unnamed_addr constant [43 x i8] c"declare void @finch_buf_add(ptr, ptr, i64)\00" +@.str.5357 = private unnamed_addr constant [38 x i8] c"declare void @finch_buf_int(ptr, i64)\00" +@.str.5358 = private unnamed_addr constant [39 x i8] c"declare void @finch_buf_uint(ptr, i64)\00" +@.str.5359 = private unnamed_addr constant [43 x i8] c"declare void @finch_buf_float(ptr, double)\00" +@.str.5360 = private unnamed_addr constant [39 x i8] c"declare void @finch_buf_bool(ptr, i32)\00" +@.str.5361 = private unnamed_addr constant [38 x i8] c"declare void @finch_buf_ptr(ptr, ptr)\00" +@.str.5362 = private unnamed_addr constant [43 x i8] c"declare void @finch_buf_char(ptr, i8, i32)\00" +@.str.5363 = private unnamed_addr constant [43 x i8] c"declare void @finch_buf_str(ptr, ptr, i32)\00" +@.str.5364 = private unnamed_addr constant [35 x i8] c"declare void @finch_buf_print(ptr)\00" +@.str.5365 = private unnamed_addr constant [43 x i8] c"declare void @finch_str_from_int(ptr, i64)\00" +@.str.5366 = private unnamed_addr constant [44 x i8] c"declare void @finch_str_from_uint(ptr, i64)\00" +@.str.5367 = private unnamed_addr constant [48 x i8] c"declare void @finch_str_from_float(ptr, double)\00" +@.str.5368 = private unnamed_addr constant [51 x i8] c"declare void @finch_str_from_char(ptr, i8 signext)\00" +@.str.5369 = private unnamed_addr constant [44 x i8] c"declare void @finch_str_from_bool(ptr, i32)\00" +@.str.5370 = private unnamed_addr constant [45 x i8] c"declare i64 @finch_str_to_int(ptr, ptr, i64)\00" +@.str.5371 = private unnamed_addr constant [50 x i8] c"declare double @finch_str_to_float(ptr, ptr, i64)\00" +@.str.5372 = private unnamed_addr constant [58 x i8] c"declare void @finch_str_sub(ptr, ptr, i64, i64, ptr, i64)\00" +@.str.5373 = private unnamed_addr constant [38 x i8] c"declare i64 @finch_str_find(ptr, ptr)\00" +@.str.5374 = private unnamed_addr constant [40 x i8] c"declare i32 @finch_str_starts(ptr, ptr)\00" +@.str.5375 = private unnamed_addr constant [38 x i8] c"declare i32 @finch_str_ends(ptr, ptr)\00" +@.str.5376 = private unnamed_addr constant [39 x i8] c"declare void @finch_str_trim(ptr, ptr)\00" +@.str.5377 = private unnamed_addr constant [40 x i8] c"declare void @finch_str_upper(ptr, ptr)\00" +@.str.5378 = private unnamed_addr constant [40 x i8] c"declare void @finch_str_lower(ptr, ptr)\00" +@.str.5379 = private unnamed_addr constant [52 x i8] c"declare void @finch_str_replace(ptr, ptr, ptr, ptr)\00" +@.str.5380 = private unnamed_addr constant [45 x i8] c"declare void @finch_str_split(ptr, ptr, ptr)\00" +@.str.5381 = private unnamed_addr constant [44 x i8] c"declare void @finch_str_join(ptr, ptr, ptr)\00" +@.str.5382 = private unnamed_addr constant [46 x i8] c"declare void @finch_str_repeat(ptr, ptr, i64)\00" +@.str.5383 = private unnamed_addr constant [45 x i8] c"declare void @finch_bytes_from_str(ptr, ptr)\00" +@.str.5384 = private unnamed_addr constant [53 x i8] c"declare i64 @finch_map_find(ptr, ptr, i64, i64, i32)\00" +@.str.5385 = private unnamed_addr constant [58 x i8] c"declare i64 @finch_map_slot(ptr, ptr, i64, i64, i32, ptr)\00" +@.str.5386 = private unnamed_addr constant [49 x i8] c"declare void @finch_map_remove_at(ptr, i64, i64)\00" +@.str.5387 = private unnamed_addr constant [35 x i8] c"declare void @finch_map_clear(ptr)\00" +@.str.5388 = private unnamed_addr constant [49 x i8] c"declare void @finch_map_clone_raw(ptr, ptr, i64)\00" +@.str.5389 = private unnamed_addr constant [61 x i8] c"declare void @finch_map_missing(ptr, i64, ptr) noreturn cold\00" +@.str.5390 = private unnamed_addr constant [56 x i8] c"declare void @finch_map_changed(ptr, i64) noreturn cold\00" +@.str.5391 = private unnamed_addr constant [47 x i8] c"declare void @finch_arr_reserve(ptr, i64, i64)\00" +@.str.5392 = private unnamed_addr constant [49 x i8] c"declare void @finch_arr_clone_raw(ptr, ptr, i64)\00" +@.str.5393 = private unnamed_addr constant [44 x i8] c"declare void @finch_arr_make(ptr, i64, i64)\00" +@.str.5394 = private unnamed_addr constant [46 x i8] c"declare void @finch_arr_resize(ptr, i64, i64)\00" +@.str.5395 = private unnamed_addr constant [60 x i8] c"declare void @finch_arr_insert_gap(ptr, i64, i64, ptr, i64)\00" +@.str.5396 = private unnamed_addr constant [50 x i8] c"declare void @finch_arr_remove_gap(ptr, i64, i64)\00" +@.str.5397 = private unnamed_addr constant [40 x i8] c"declare void @qsort(ptr, i64, i64, ptr)\00" +@.str.5398 = private unnamed_addr constant [40 x i8] c"declare void @finch_args(ptr, i32, ptr)\00" +@.str.5399 = private unnamed_addr constant [36 x i8] c"declare void @finch_input(ptr, ptr)\00" +@.str.5400 = private unnamed_addr constant [36 x i8] c"declare i32 @finch_file_exists(ptr)\00" +@.str.5401 = private unnamed_addr constant [46 x i8] c"declare i32 @finch_str_try_int(ptr, ptr, ptr)\00" +@.str.5402 = private unnamed_addr constant [48 x i8] c"declare i32 @finch_str_try_float(ptr, ptr, ptr)\00" +@.str.5403 = private unnamed_addr constant [48 x i8] c"declare i32 @finch_try_read_file(ptr, ptr, ptr)\00" +@.str.5404 = private unnamed_addr constant [49 x i8] c"declare i32 @finch_try_write_file(ptr, ptr, ptr)\00" +@.str.5405 = private unnamed_addr constant [45 x i8] c"declare i32 @finch_try_delete_file(ptr, ptr)\00" +@.str.5406 = private unnamed_addr constant [38 x i8] c"declare void @finch_report_error(ptr)\00" +@.str.5407 = private unnamed_addr constant [50 x i8] c"declare void @finch_read_file(ptr, ptr, ptr, i64)\00" +@.str.5408 = private unnamed_addr constant [40 x i8] c"declare i32 @finch_write_file(ptr, ptr)\00" +@.str.5409 = private unnamed_addr constant [30 x i8] c"declare i64 @finch_shell(ptr)\00" +@.str.5410 = private unnamed_addr constant [36 x i8] c"declare i32 @finch_delete_file(ptr)\00" +@.str.5411 = private unnamed_addr constant [30 x i8] c"declare i32 @printf(ptr, ...)\00" +@.str.5412 = private unnamed_addr constant [25 x i8] c"declare i32 @fflush(ptr)\00" +@.str.5413 = private unnamed_addr constant [41 x i8] c"declare void @finch_str_from_c(ptr, ptr)\00" +@.str.5414 = private unnamed_addr constant [34 x i8] c"declare void @finch_on_fatal(ptr)\00" +@.str.5415 = private unnamed_addr constant [35 x i8] c"declare ptr @finch_std_stream(i32)\00" +@.str.5416 = private unnamed_addr constant [45 x i8] c"declare void @finch_str_from_bytes(ptr, ptr)\00" +@.str.5417 = private unnamed_addr constant [33 x i8] c"declare void @exit(i32) noreturn\00" +@.str.5418 = private unnamed_addr constant [24 x i8] c"declare void @free(ptr)\00" +@.str.5419 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5420 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5421 = private unnamed_addr constant [53 x i8] c"; generated by the Finch compiler written in Finch\0A\0A\00" +@.str.5422 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5423 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.5424 = private unnamed_addr constant [18 x i8] c"target triple = \22\00" +@.str.5425 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5426 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.5427 = private unnamed_addr constant [4 x i8] c"\22\0A\0A\00" +@.str.5428 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5429 = private unnamed_addr constant [29 x i8] c"used .head on a null pointer\00" +@.str.5430 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5431 = private unnamed_addr constant [3 x i8] c"\0A\0A\00" +@.str.5432 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5433 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5434 = private unnamed_addr constant [30 x i8] c"used .debug on a null pointer\00" +@.str.5435 = private unnamed_addr constant [63 x i8] c"declare void @llvm.dbg.declare(metadata, metadata, metadata)\0A\0A\00" +@.str.5436 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5437 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5438 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5439 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5440 = private unnamed_addr constant [30 x i8] c"used .debug on a null pointer\00" +@.str.5441 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5442 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5443 = private unnamed_addr constant [30 x i8] c"used .debug on a null pointer\00" +@.str.5444 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5445 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.5446 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5447 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5448 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.5449 = private unnamed_addr constant [34 x i8] c"!{i32 7, !\22Dwarf Version\22, i32 4}\00" +@.str.5450 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5451 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.5452 = private unnamed_addr constant [39 x i8] c"!{i32 2, !\22Debug Info Version\22, i32 3}\00" +@.str.5453 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5454 = private unnamed_addr constant [32 x i8] c"used .mdfiles on a null pointer\00" +@.str.5455 = private unnamed_addr constant [20 x i8] c"!DIFile(filename: \22\00" +@.str.5456 = private unnamed_addr constant [16 x i8] c"\22, directory: \22\00" +@.str.5457 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5458 = private unnamed_addr constant [28 x i8] c"used .cwd on a null pointer\00" +@.str.5459 = private unnamed_addr constant [3 x i8] c"\22)\00" +@.str.5460 = private unnamed_addr constant [53 x i8] c"distinct !DICompileUnit(language: DW_LANG_C, file: !\00" +@.str.5461 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5462 = private unnamed_addr constant [32 x i8] c"used .mdfiles on a null pointer\00" +@.str.5463 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5464 = private unnamed_addr constant [85 x i8] c", producer: \22finch\22, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)\00" +@.str.5465 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5466 = private unnamed_addr constant [27 x i8] c"used .md on a null pointer\00" +@.str.5467 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5468 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5469 = private unnamed_addr constant [5 x i8] c"main\00" +@.str.5470 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5471 = private unnamed_addr constant [30 x i8] c"used .progs on a null pointer\00" +@.str.5472 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5473 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.5474 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5475 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5476 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5477 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.5478 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5479 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5480 = private unnamed_addr constant [83 x i8] c"a library (--shared) has no main: the program that loads it calls its 'export fn's\00" +@.str.5481 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5482 = private unnamed_addr constant [65 x i8] c":1:1: error: there is no main function (add 'fn main() { ... }')\00" +@.str.5483 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5484 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5485 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5486 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5487 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.5488 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5489 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.5490 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5491 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5492 = private unnamed_addr constant [27 x i8] c"used .tg on a null pointer\00" +@.str.5493 = private unnamed_addr constant [11 x i8] c" dllexport\00" +@.str.5494 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5495 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5496 = private unnamed_addr constant [7 x i8] c"define\00" +@.str.5497 = private unnamed_addr constant [108 x i8] c" void @finch_module_on_fatal(ptr %handler) {\0Aentry:\0A call void @finch_on_fatal(ptr %handler)\0A ret void\0A}\0A\00" +@.str.5498 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5499 = private unnamed_addr constant [29 x i8] c"used .sigs on a null pointer\00" +@.str.5500 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5501 = private unnamed_addr constant [6 x i8] c"call \00" +@.str.5502 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5503 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.5504 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5505 = private unnamed_addr constant [134 x i8] c" %args = alloca { ptr, i64, i64 }\0A call void @finch_args(ptr %args, i32 %argc, ptr %argv)\0A %a = load { ptr, i64, i64 }, ptr %args\0A\00" +@.str.5506 = private unnamed_addr constant [21 x i8] c"{ ptr, i64, i64 } %a\00" +@.str.5507 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5508 = private unnamed_addr constant [13 x i8] c" ret i32 0\0A\00" +@.str.5509 = private unnamed_addr constant [6 x i8] c"%r = \00" +@.str.5510 = private unnamed_addr constant [3 x i8] c" \00" +@.str.5511 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5512 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5513 = private unnamed_addr constant [22 x i8] c" %ok = extractvalue \00" +@.str.5514 = private unnamed_addr constant [63 x i8] c" %r, 0\0A br i1 %ok, label %main.ok, label %main.bad\0Amain.bad:\0A\00" +@.str.5515 = private unnamed_addr constant [21 x i8] c" %m = extractvalue \00" +@.str.5516 = private unnamed_addr constant [79 x i8] c" %r, 2\0A %mp = alloca { ptr, i64, i64 }\0A store { ptr, i64, i64 } %m, ptr %mp\0A\00" +@.str.5517 = private unnamed_addr constant [63 x i8] c" call void @finch_report_error(ptr %mp)\0A ret i32 1\0Amain.ok:\0A\00" +@.str.5518 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5519 = private unnamed_addr constant [21 x i8] c" %v = extractvalue \00" +@.str.5520 = private unnamed_addr constant [54 x i8] c" %r, 1\0A %code = trunc i64 %v to i32\0A ret i32 %code\0A\00" +@.str.5521 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5522 = private unnamed_addr constant [6 x i8] c"%r = \00" +@.str.5523 = private unnamed_addr constant [47 x i8] c" %code = trunc i64 %r to i32\0A ret i32 %code\0A\00" +@.str.5524 = private unnamed_addr constant [12 x i8] c"src/gen.fch\00" +@.str.5525 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5526 = private unnamed_addr constant [49 x i8] c"define i32 @main(i32 %argc, ptr %argv) {\0Aentry:\0A\00" +@.str.5527 = private unnamed_addr constant [3 x i8] c" \00" +@.str.5528 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5529 = private unnamed_addr constant [3 x i8] c"}\0A\00" +declare ptr @clang_getCString(i64, i64) +declare void @clang_disposeString(i64, i64) +@.str.5530 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.5531 = private unnamed_addr constant [23 x i8] c"/tmp/finch_cc_dirs.txt\00" +@.str.5532 = private unnamed_addr constant [27 x i8] c" -E -v -x c /dev/null 2> '\00" +@.str.5533 = private unnamed_addr constant [14 x i8] c"' > /dev/null\00" +@.str.5534 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5535 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5536 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5537 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5538 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5539 = private unnamed_addr constant [35 x i8] c"#include <...> search starts here:\00" +@.str.5540 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5541 = private unnamed_addr constant [20 x i8] c"End of search list.\00" +@.str.5542 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5543 = private unnamed_addr constant [23 x i8] c" (framework directory)\00" +@.str.5544 = private unnamed_addr constant [12 x i8] c"-iframework\00" +@.str.5545 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5546 = private unnamed_addr constant [9 x i8] c"-isystem\00" +@.str.5547 = private unnamed_addr constant [8 x i8] c"rm -f '\00" +@.str.5548 = private unnamed_addr constant [2 x i8] c"'\00" +declare void @clang_getTypeDeclaration(ptr sret(%S.C.CXCursor) align 16, ptr byval(%S.C.CXType) align 8) +declare { i64, i64 } @clang_getCursorUSR(ptr byval(%S.C.CXCursor) align 8) +@.str.5549 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5550 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +@.str.5551 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5552 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +@.str.5553 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +declare { i64, i64 } @clang_getCursorSpelling(ptr byval(%S.C.CXCursor) align 8) +@.str.5554 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5555 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5556 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5557 = private unnamed_addr constant [29 x i8] c"used .anon on a null pointer\00" +@.str.5558 = private unnamed_addr constant [13 x i8] c"anon_struct_\00" +@.str.5559 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5560 = private unnamed_addr constant [29 x i8] c"used .anon on a null pointer\00" +@.str.5561 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5562 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +declare void @clang_getCanonicalType(ptr sret(%S.C.CXType) align 16, ptr byval(%S.C.CXType) align 8) +@.str.5563 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5564 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5565 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5566 = private unnamed_addr constant [33 x i8] c"used .defining on a null pointer\00" +declare i64 @clang_Type_getSizeOf(ptr byval(%S.C.CXType) align 8) +@.str.5567 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5568 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5569 = private unnamed_addr constant [33 x i8] c"used .defining on a null pointer\00" +declare i64 @clang_Type_getAlignOf(ptr byval(%S.C.CXType) align 8) +declare i32 @clang_getCursorKind(ptr byval(%S.C.CXCursor) align 8) +@.str.5570 = private unnamed_addr constant [13 x i8] c"is a C union\00" +declare i32 @clang_Type_visitFields(ptr byval(%S.C.CXType) align 8, ptr, ptr) +@.str.5571 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5572 = private unnamed_addr constant [33 x i8] c"used .defining on a null pointer\00" +@.str.5573 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5574 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5575 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5576 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +declare void @clang_getCursorType(ptr sret(%S.C.CXType) align 16, ptr byval(%S.C.CXCursor) align 8) +declare i64 @clang_Cursor_getOffsetOfField(ptr byval(%S.C.CXCursor) align 8) +declare i32 @clang_Cursor_isBitField(ptr byval(%S.C.CXCursor) align 8) +@.str.5577 = private unnamed_addr constant [15 x i8] c"has bit fields\00" +@.str.5578 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5579 = private unnamed_addr constant [26 x i8] c"used .s on a null pointer\00" +@.str.5580 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5581 = private unnamed_addr constant [36 x i8] c"used .unsupported on a null pointer\00" +@.str.5582 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5583 = private unnamed_addr constant [28 x i8] c"used .imp on a null pointer\00" +@.str.5584 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5585 = private unnamed_addr constant [26 x i8] c"used .s on a null pointer\00" +@.str.5586 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5587 = private unnamed_addr constant [34 x i8] c"used .hasHidden on a null pointer\00" +@.str.5588 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5589 = private unnamed_addr constant [26 x i8] c"used .s on a null pointer\00" +@.str.5590 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5591 = private unnamed_addr constant [31 x i8] c"used .fields on a null pointer\00" +@.str.5592 = private unnamed_addr constant [3 x i8] c"i8\00" +@.str.5593 = private unnamed_addr constant [3 x i8] c"u8\00" +@.str.5594 = private unnamed_addr constant [4 x i8] c"i16\00" +@.str.5595 = private unnamed_addr constant [4 x i8] c"u16\00" +@.str.5596 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str.5597 = private unnamed_addr constant [4 x i8] c"u32\00" +@.str.5598 = private unnamed_addr constant [4 x i8] c"int\00" +@.str.5599 = private unnamed_addr constant [4 x i8] c"u64\00" +@.str.5600 = private unnamed_addr constant [8 x i8] c"uses a \00" +@.str.5601 = private unnamed_addr constant [12 x i8] c"-bit number\00" +@.str.5602 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5603 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str.5604 = private unnamed_addr constant [5 x i8] c"char\00" +@.str.5605 = private unnamed_addr constant [4 x i8] c"f32\00" +@.str.5606 = private unnamed_addr constant [6 x i8] c"float\00" +declare void @clang_getPointeeType(ptr sret(%S.C.CXType) align 16, ptr byval(%S.C.CXType) align 8) +declare i32 @clang_isConstQualifiedType(ptr byval(%S.C.CXType) align 8) +@.str.5607 = private unnamed_addr constant [4 x i8] c"str\00" +@.str.5608 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5609 = private unnamed_addr constant [5 x i8] c"void\00" +@.str.5610 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str.5611 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str.5612 = private unnamed_addr constant [24 x i8] c"uses a C union by value\00" +@.str.5613 = private unnamed_addr constant [37 x i8] c"uses an incomplete C struct by value\00" +@.str.5614 = private unnamed_addr constant [6 x i8] c"named\00" +@.str.5615 = private unnamed_addr constant [2 x i8] c"C\00" +declare void @clang_getArrayElementType(ptr sret(%S.C.CXType) align 16, ptr byval(%S.C.CXType) align 8) +declare i64 @clang_getArraySize(ptr byval(%S.C.CXType) align 8) +@.str.5616 = private unnamed_addr constant [17 x i8] c"uses long double\00" +@.str.5617 = private unnamed_addr constant [18 x i8] c"uses the C type '\00" +declare { i64, i64 } @clang_getTypeSpelling(ptr byval(%S.C.CXType) align 8) +@.str.5618 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5619 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5620 = private unnamed_addr constant [3 x i8] c"0x\00" +@.str.5621 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5622 = private unnamed_addr constant [3 x i8] c"0X\00" +@.str.5623 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5624 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5625 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5626 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5627 = private unnamed_addr constant [5 x i8] c"uUlL\00" +@.str.5628 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5629 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5630 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5631 = private unnamed_addr constant [27 x i8] c"used .tu on a null pointer\00" +declare void @clang_getCursorExtent(ptr sret(%S.C.CXSourceRange) align 16, ptr byval(%S.C.CXCursor) align 8) +declare void @clang_tokenize(ptr, ptr byval(%S.C.CXSourceRange) align 8, ptr, ptr) +declare i32 @clang_getTokenKind(ptr byval(%S.C.CXToken) align 8) +@.str.5632 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5633 = private unnamed_addr constant [27 x i8] c"used .tu on a null pointer\00" +declare { i64, i64 } @clang_getTokenSpelling(ptr, ptr byval(%S.C.CXToken) align 8) +@.str.5634 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5635 = private unnamed_addr constant [27 x i8] c"used .tu on a null pointer\00" +declare void @clang_disposeTokens(ptr, ptr, i32) +@.str.5636 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5637 = private unnamed_addr constant [2 x i8] c"(\00" +@.str.5638 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5639 = private unnamed_addr constant [2 x i8] c")\00" +@.str.5640 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5641 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5642 = private unnamed_addr constant [24 x i8] c"pop() on an empty array\00" +@.str.5643 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5644 = private unnamed_addr constant [2 x i8] c"-\00" +@.str.5645 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5646 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5647 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5648 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5649 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5650 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5651 = private unnamed_addr constant [2 x i8] c".\00" +@.str.5652 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5653 = private unnamed_addr constant [2 x i8] c"e\00" +@.str.5654 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5655 = private unnamed_addr constant [2 x i8] c"E\00" +@.str.5656 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5657 = private unnamed_addr constant [3 x i8] c"0x\00" +@.str.5658 = private unnamed_addr constant [5 x i8] c"fFlL\00" +@.str.5659 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5660 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5661 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +declare void @clang_getTypedefDeclUnderlyingType(ptr sret(%S.C.CXType) align 16, ptr byval(%S.C.CXCursor) align 8) +@.str.5662 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5663 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +@.str.5664 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5665 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5666 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5667 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +@.str.5668 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5669 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5670 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5671 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5672 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +@.str.5673 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5674 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5675 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5676 = private unnamed_addr constant [31 x i8] c"used .header on a null pointer\00" +declare i32 @clang_Cursor_getStorageClass(ptr byval(%S.C.CXCursor) align 8) +@.str.5677 = private unnamed_addr constant [63 x i8] c"is a static inline C function (it has no code to link against)\00" +@.str.5678 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5679 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5680 = private unnamed_addr constant [43 x i8] c"has no parameter list in its C declaration\00" +@.str.5681 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5682 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +declare void @clang_getResultType(ptr sret(%S.C.CXType) align 16, ptr byval(%S.C.CXType) align 8) +declare i32 @clang_getNumArgTypes(ptr byval(%S.C.CXType) align 8) +declare void @clang_getArgType(ptr sret(%S.C.CXType) align 16, ptr byval(%S.C.CXType) align 8, i32) +declare i32 @clang_isFunctionTypeVariadic(ptr byval(%S.C.CXType) align 8) +@.str.5683 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5684 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5685 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5686 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5687 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5688 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +declare i32 @clang_isCursorDefinition(ptr byval(%S.C.CXCursor) align 8) +@.str.5689 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5690 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5691 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5692 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +@.str.5693 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5694 = private unnamed_addr constant [36 x i8] c"used .recordNames on a null pointer\00" +declare i32 @clang_visitChildren(ptr byval(%S.C.CXCursor) align 8, ptr, ptr) +@.str.5695 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5696 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +declare i64 @clang_getEnumConstantDeclValue(ptr byval(%S.C.CXCursor) align 8) +@.str.5697 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5698 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +declare i32 @clang_Cursor_isMacroBuiltin(ptr byval(%S.C.CXCursor) align 8) +declare i32 @clang_Cursor_isMacroFunctionLike(ptr byval(%S.C.CXCursor) align 8) +@.str.5699 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5700 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5701 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5702 = private unnamed_addr constant [28 x i8] c"used .out on a null pointer\00" +@.str.5703 = private unnamed_addr constant [3 x i8] c"-x\00" +@.str.5704 = private unnamed_addr constant [2 x i8] c"c\00" +@.str.5705 = private unnamed_addr constant [11 x i8] c"-std=gnu11\00" +@.str.5706 = private unnamed_addr constant [10 x i8] c"--target=\00" +@.str.5707 = private unnamed_addr constant [20 x i8] c"-D_USE_MATH_DEFINES\00" +@.str.5708 = private unnamed_addr constant [3 x i8] c"-I\00" +@.str.5709 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5710 = private unnamed_addr constant [1 x i8] c"\00" +declare ptr @clang_createIndex(i32, i32) +@.str.5711 = private unnamed_addr constant [11 x i8] c"#include \22\00" +@.str.5712 = private unnamed_addr constant [3 x i8] c"\22\0A\00" +@.str.5713 = private unnamed_addr constant [15 x i8] c"finch_import.c\00" +@.str.5714 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5715 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5716 = private unnamed_addr constant [15 x i8] c"finch_import.c\00" +@.str.5717 = private unnamed_addr constant [1 x i8] c"\00" +declare i32 @clang_parseTranslationUnit2(ptr, ptr, ptr, i32, ptr, i32, i32, ptr) +@.str.5718 = private unnamed_addr constant [34 x i8] c": error: couldn't read C header '\00" +@.str.5719 = private unnamed_addr constant [2 x i8] c"'\00" +declare i32 @clang_getNumDiagnostics(ptr) +declare ptr @clang_getDiagnostic(ptr, i32) +declare i32 @clang_getDiagnosticSeverity(ptr) +declare { i64, i64 } @clang_getDiagnosticSpelling(ptr) +declare void @clang_disposeDiagnostic(ptr) +@.str.5720 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5721 = private unnamed_addr constant [15 x i8] c"file not found\00" +@.str.5722 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5723 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5724 = private unnamed_addr constant [16 x i8] c"src/cimport.fch\00" +@.str.5725 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5726 = private unnamed_addr constant [35 x i8] c": error: can't find the C header '\00" +@.str.5727 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5728 = private unnamed_addr constant [35 x i8] c": error: can't find the C header '\00" +@.str.5729 = private unnamed_addr constant [11 x i8] c"', which '\00" +@.str.5730 = private unnamed_addr constant [61 x i8] c"' includes (is its library's development package installed?)\00" +@.str.5731 = private unnamed_addr constant [20 x i8] c": error: C header '\00" +@.str.5732 = private unnamed_addr constant [17 x i8] c"' has an error: \00" +declare void @clang_getTranslationUnitCursor(ptr sret(%S.C.CXCursor) align 16, ptr) +declare void @clang_disposeTranslationUnit(ptr) +declare void @clang_disposeIndex(ptr) +@.str.5733 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5734 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5735 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5736 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5737 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5738 = private unnamed_addr constant [22 x i8] c"/tmp/finch_triple.txt\00" +@.str.5739 = private unnamed_addr constant [23 x i8] c"clang -dumpmachine > '\00" +@.str.5740 = private unnamed_addr constant [15 x i8] c"' 2> /dev/null\00" +@.str.5741 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5742 = private unnamed_addr constant [8 x i8] c"rm -f '\00" +@.str.5743 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5744 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5745 = private unnamed_addr constant [25 x i8] c"x86_64-unknown-linux-gnu\00" +@.str.5746 = private unnamed_addr constant [8 x i8] c"windows\00" +@.str.5747 = private unnamed_addr constant [19 x i8] c"x86_64-w64-mingw32\00" +@.str.5748 = private unnamed_addr constant [6 x i8] c"linux\00" +@.str.5749 = private unnamed_addr constant [25 x i8] c"x86_64-unknown-linux-gnu\00" +@.str.5750 = private unnamed_addr constant [6 x i8] c"arm64\00" +@.str.5751 = private unnamed_addr constant [8 x i8] c"aarch64\00" +@.str.5752 = private unnamed_addr constant [12 x i8] c"linux-arm64\00" +@.str.5753 = private unnamed_addr constant [26 x i8] c"aarch64-unknown-linux-gnu\00" +@.str.5754 = private unnamed_addr constant [6 x i8] c"macos\00" +@.str.5755 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5756 = private unnamed_addr constant [8 x i8] c"aarch64\00" +@.str.5757 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5758 = private unnamed_addr constant [6 x i8] c"arm64\00" +@.str.5759 = private unnamed_addr constant [25 x i8] c"arm64-apple-macosx14.0.0\00" +@.str.5760 = private unnamed_addr constant [26 x i8] c"x86_64-apple-macosx14.0.0\00" +@.str.5761 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5762 = private unnamed_addr constant [8 x i8] c"windows\00" +@.str.5763 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5764 = private unnamed_addr constant [6 x i8] c"mingw\00" +@.str.5765 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5766 = private unnamed_addr constant [5 x i8] c"msvc\00" +@.str.5767 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5768 = private unnamed_addr constant [6 x i8] c"win32\00" +@.str.5769 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5770 = private unnamed_addr constant [5 x i8] c"msvc\00" +@.str.5771 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5772 = private unnamed_addr constant [6 x i8] c"apple\00" +@.str.5773 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5774 = private unnamed_addr constant [7 x i8] c"darwin\00" +@.str.5775 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5776 = private unnamed_addr constant [6 x i8] c"macos\00" +@.str.5777 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5778 = private unnamed_addr constant [8 x i8] c"aarch64\00" +@.str.5779 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5780 = private unnamed_addr constant [6 x i8] c"arm64\00" +@.str.5781 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5782 = private unnamed_addr constant [8 x i8] c"aarch64\00" +@.str.5783 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5784 = private unnamed_addr constant [6 x i8] c"arm64\00" +@.str.5785 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5786 = private unnamed_addr constant [6 x i8] c"apple\00" +@.str.5787 = private unnamed_addr constant [17 x i8] c"src/platform.fch\00" +@.str.5788 = private unnamed_addr constant [7 x i8] c"darwin\00" +@.str.5789 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5790 = private unnamed_addr constant [5 x i8] c".exe\00" +@.str.5791 = private unnamed_addr constant [9 x i8] c"FINCH_CC\00" +@.str.5792 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5793 = private unnamed_addr constant [23 x i8] c"x86_64-w64-mingw32-gcc\00" +@.str.5794 = private unnamed_addr constant [22 x i8] c"aarch64-linux-gnu-gcc\00" +@.str.5795 = private unnamed_addr constant [16 x i8] c"clang --target=\00" +@.str.5796 = private unnamed_addr constant [3 x i8] c"cc\00" +@.str.5797 = private unnamed_addr constant [6 x i8] c"wine \00" +@.str.5798 = private unnamed_addr constant [14 x i8] c"qemu-aarch64 \00" +@.str.5799 = private unnamed_addr constant [17 x i8] c"0123456789abcdef\00" +@.str.5800 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5801 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5802 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5803 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5804 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5805 = private unnamed_addr constant [5 x i8] c"'\5C''\00" +@.str.5806 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5807 = private unnamed_addr constant [15 x i8] c"XDG_CACHE_HOME\00" +@.str.5808 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5809 = private unnamed_addr constant [7 x i8] c"/finch\00" +@.str.5810 = private unnamed_addr constant [5 x i8] c"HOME\00" +@.str.5811 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5812 = private unnamed_addr constant [14 x i8] c"/.cache/finch\00" +@.str.5813 = private unnamed_addr constant [17 x i8] c"/tmp/finch-cache\00" +@.str.5814 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5815 = private unnamed_addr constant [11 x i8] c".framework\00" +@.str.5816 = private unnamed_addr constant [12 x i8] c"-framework \00" +@.str.5817 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5818 = private unnamed_addr constant [25 x i8] c"/tmp/finch_pkg_flags.txt\00" +@.str.5819 = private unnamed_addr constant [19 x i8] c"pkg-config --libs \00" +@.str.5820 = private unnamed_addr constant [5 x i8] c" > '\00" +@.str.5821 = private unnamed_addr constant [15 x i8] c"' 2> /dev/null\00" +@.str.5822 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5823 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5824 = private unnamed_addr constant [8 x i8] c"rm -f '\00" +@.str.5825 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5826 = private unnamed_addr constant [3 x i8] c"-l\00" +@.str.5827 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5828 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.5829 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5830 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5831 = private unnamed_addr constant [2 x i8] c"/\00" +@.str.5832 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5833 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5834 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5835 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5836 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5837 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5838 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5839 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5840 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5841 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5842 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5843 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5844 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5845 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5846 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5847 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5848 = private unnamed_addr constant [25 x i8] c"undefined reference to `\00" +@.str.5849 = private unnamed_addr constant [25 x i8] c"undefined reference to `\00" +@.str.5850 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5851 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5852 = private unnamed_addr constant [19 x i8] c"undefined symbol: \00" +@.str.5853 = private unnamed_addr constant [19 x i8] c"undefined symbol: \00" +@.str.5854 = private unnamed_addr constant [3 x i8] c" \0A\00" +@.str.5855 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5856 = private unnamed_addr constant [28 x i8] c"unresolved external symbol \00" +@.str.5857 = private unnamed_addr constant [28 x i8] c"unresolved external symbol \00" +@.str.5858 = private unnamed_addr constant [4 x i8] c" \0A\0D\00" +@.str.5859 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5860 = private unnamed_addr constant [15 x i8] c"cannot find -l\00" +@.str.5861 = private unnamed_addr constant [15 x i8] c"cannot find -l\00" +@.str.5862 = private unnamed_addr constant [5 x i8] c": \0A\0D\00" +@.str.5863 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5864 = private unnamed_addr constant [25 x i8] c"library not found for -l\00" +@.str.5865 = private unnamed_addr constant [25 x i8] c"library not found for -l\00" +@.str.5866 = private unnamed_addr constant [5 x i8] c": \0A\0D\00" +@.str.5867 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5868 = private unnamed_addr constant [14 x i8] c"ld: library '\00" +@.str.5869 = private unnamed_addr constant [14 x i8] c"ld: library '\00" +@.str.5870 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5871 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5872 = private unnamed_addr constant [12 x i8] c"framework '\00" +@.str.5873 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5874 = private unnamed_addr constant [10 x i8] c"not found\00" +@.str.5875 = private unnamed_addr constant [12 x i8] c"framework '\00" +@.str.5876 = private unnamed_addr constant [2 x i8] c"'\00" +@.str.5877 = private unnamed_addr constant [11 x i8] c".framework\00" +@.str.5878 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5879 = private unnamed_addr constant [2 x i8] c"\22\00" +@.str.5880 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5881 = private unnamed_addr constant [20 x i8] c"\22, referenced from:\00" +@.str.5882 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5883 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5884 = private unnamed_addr constant [20 x i8] c"\22, referenced from:\00" +@.str.5885 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5886 = private unnamed_addr constant [2 x i8] c"_\00" +@.str.5887 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5888 = private unnamed_addr constant [22 x i8] c"error: linking failed\00" +@.str.5889 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5890 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5891 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5892 = private unnamed_addr constant [21 x i8] c"error: the library '\00" +@.str.5893 = private unnamed_addr constant [63 x i8] c"' wasn't found. Is it installed? (on Nix: add it to shell.nix)\00" +@.str.5894 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5895 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5896 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5897 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5898 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5899 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5900 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5901 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5902 = private unnamed_addr constant [3 x i8] c", \00" +@.str.5903 = private unnamed_addr constant [6 x i8] c" and \00" +@.str.5904 = private unnamed_addr constant [6 x i8] c" more\00" +@.str.5905 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5906 = private unnamed_addr constant [26 x i8] c"error: no code found for \00" +@.str.5907 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5908 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5909 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5910 = private unnamed_addr constant [5 x i8] c"come\00" +@.str.5911 = private unnamed_addr constant [6 x i8] c"comes\00" +@.str.5912 = private unnamed_addr constant [8 x i8] c"error: \00" +@.str.5913 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5914 = private unnamed_addr constant [8 x i8] c" from \22\00" +@.str.5915 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5916 = private unnamed_addr constant [32 x i8] c"\22, but its library isn't linked\00" +@.str.5917 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5918 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5919 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5920 = private unnamed_addr constant [75 x i8] c" the header only says the functions exist; their code lives in a library.\00" +@.str.5921 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5922 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5923 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5924 = private unnamed_addr constant [67 x i8] c" add this at the top of your file (with the library's real name):\00" +@.str.5925 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5926 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5927 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5928 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5929 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5930 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5931 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5932 = private unnamed_addr constant [13 x i8] c" link \22\00" +@.str.5933 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.5934 = private unnamed_addr constant [2 x i8] c"\22\00" +@.str.5935 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5936 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5937 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5938 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5939 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5940 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5941 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5942 = private unnamed_addr constant [5 x i8] c"/rt-\00" +@.str.5943 = private unnamed_addr constant [4 x i8] c"2.5\00" +@.str.5944 = private unnamed_addr constant [3 x i8] c".o\00" +@.str.5945 = private unnamed_addr constant [10 x i8] c"mkdir -p \00" +@.str.5946 = private unnamed_addr constant [6 x i8] c".part\00" +declare i32 @getpid() +@.str.5947 = private unnamed_addr constant [7 x i8] c" -fPIC\00" +@.str.5948 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5949 = private unnamed_addr constant [5 x i8] c".log\00" +@.str.5950 = private unnamed_addr constant [5 x i8] c" -O2\00" +@.str.5951 = private unnamed_addr constant [5 x i8] c" -c \00" +@.str.5952 = private unnamed_addr constant [5 x i8] c" -o \00" +@.str.5953 = private unnamed_addr constant [4 x i8] c" > \00" +@.str.5954 = private unnamed_addr constant [6 x i8] c" 2>&1\00" +@.str.5955 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5956 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.5957 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5958 = private unnamed_addr constant [47 x i8] c"error: couldn't build the Finch runtime with '\00" +@.str.5959 = private unnamed_addr constant [31 x i8] c"' (is a C compiler installed?)\00" +@.str.5960 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.5961 = private unnamed_addr constant [8 x i8] c" && mv \00" +@.str.5962 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5963 = private unnamed_addr constant [12 x i8] c"FINCH_CLANG\00" +@.str.5964 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5965 = private unnamed_addr constant [6 x i8] c"clang\00" +@.str.5966 = private unnamed_addr constant [9 x i8] c"FINCH_CC\00" +@.str.5967 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5968 = private unnamed_addr constant [9 x i8] c"FINCH_CC\00" +@.str.5969 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5970 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5971 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5972 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5973 = private unnamed_addr constant [4 x i8] c".ll\00" +@.str.5974 = private unnamed_addr constant [3 x i8] c".o\00" +@.str.5975 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5976 = private unnamed_addr constant [11 x i8] c" --target=\00" +@.str.5977 = private unnamed_addr constant [5 x i8] c".log\00" +@.str.5978 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5979 = private unnamed_addr constant [8 x i8] c" -w -c \00" +@.str.5980 = private unnamed_addr constant [5 x i8] c" -o \00" +@.str.5981 = private unnamed_addr constant [4 x i8] c" > \00" +@.str.5982 = private unnamed_addr constant [6 x i8] c" 2>&1\00" +@.str.5983 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.5984 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5985 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5986 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5987 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5988 = private unnamed_addr constant [47 x i8] c"error: clang couldn't compile the program's IR\00" +@.str.5989 = private unnamed_addr constant [1 x i8] c"\00" +@.str.5990 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.5991 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.5992 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.5993 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5994 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5995 = private unnamed_addr constant [2 x i8] c" \00" +@.str.5996 = private unnamed_addr constant [5 x i8] c" -o \00" +@.str.5997 = private unnamed_addr constant [5 x i8] c" -lm\00" +@.str.5998 = private unnamed_addr constant [13 x i8] c" -dynamiclib\00" +@.str.5999 = private unnamed_addr constant [9 x i8] c" -shared\00" +@.str.6000 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.6001 = private unnamed_addr constant [3 x i8] c".c\00" +@.str.6002 = private unnamed_addr constant [2 x i8] c".\00" +@.str.6003 = private unnamed_addr constant [3 x i8] c".o\00" +@.str.6004 = private unnamed_addr constant [7 x i8] c" -fPIC\00" +@.str.6005 = private unnamed_addr constant [1 x i8] c"\00" +@.str.6006 = private unnamed_addr constant [5 x i8] c" -O2\00" +@.str.6007 = private unnamed_addr constant [5 x i8] c" -c \00" +@.str.6008 = private unnamed_addr constant [5 x i8] c" -o \00" +@.str.6009 = private unnamed_addr constant [4 x i8] c" > \00" +@.str.6010 = private unnamed_addr constant [6 x i8] c" 2>&1\00" +@.str.6011 = private unnamed_addr constant [1 x i8] c"\00" +@.str.6012 = private unnamed_addr constant [25 x i8] c"error: couldn't compile \00" +@.str.6013 = private unnamed_addr constant [1 x i8] c"\00" +@.str.6014 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.6015 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.6016 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.6017 = private unnamed_addr constant [2 x i8] c" \00" +@.str.6018 = private unnamed_addr constant [2 x i8] c" \00" +@.str.6019 = private unnamed_addr constant [2 x i8] c" \00" +@.str.6020 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.6021 = private unnamed_addr constant [3 x i8] c".o\00" +@.str.6022 = private unnamed_addr constant [15 x i8] c"src/linker.fch\00" +@.str.6023 = private unnamed_addr constant [3 x i8] c".a\00" +@.str.6024 = private unnamed_addr constant [2 x i8] c" \00" +@.str.6025 = private unnamed_addr constant [2 x i8] c" \00" +@.str.6026 = private unnamed_addr constant [4 x i8] c" > \00" +@.str.6027 = private unnamed_addr constant [6 x i8] c" 2>&1\00" +@.str.6028 = private unnamed_addr constant [1 x i8] c"\00" +@.str.6029 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.6030 = private unnamed_addr constant [2 x i8] c" \00" +@.str.6031 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str.6032 = private unnamed_addr constant [43 x i8] c"error: no C compiler found to link with ('\00" +@.str.6033 = private unnamed_addr constant [33 x i8] c"'; install one, or set FINCH_CC)\00" +@.str.6034 = private unnamed_addr constant [1 x i8] c"\00" +@.str.6035 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.6036 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str.6037 = private unnamed_addr constant [1 x i8] c"\00" +@.str.6038 = private unnamed_addr constant [5 x i8] c"%.*s\00" +@.str.6039 = private unnamed_addr constant [2 x i8] c"\0A\00" + +declare void @finch_panic(ptr, i64, ptr) noreturn cold +declare void @finch_panic_index(ptr, i64, i64, i64) noreturn cold +declare ptr @finch_alloc(i64) +declare void @finch_str_copy(ptr, ptr) +declare void @finch_str_own(ptr) +declare void @finch_str_concat(ptr, ptr, ptr) +declare i32 @finch_str_eq(ptr, ptr) +declare i64 @finch_str_cmp(ptr, ptr) +declare void @finch_buf_add(ptr, ptr, i64) +declare void @finch_buf_int(ptr, i64) +declare void @finch_buf_uint(ptr, i64) +declare void @finch_buf_float(ptr, double) +declare void @finch_buf_bool(ptr, i32) +declare void @finch_buf_ptr(ptr, ptr) +declare void @finch_buf_char(ptr, i8, i32) +declare void @finch_buf_str(ptr, ptr, i32) +declare void @finch_buf_print(ptr) +declare void @finch_str_from_int(ptr, i64) +declare void @finch_str_from_uint(ptr, i64) +declare void @finch_str_from_float(ptr, double) +declare void @finch_str_from_char(ptr, i8 signext) +declare void @finch_str_from_bool(ptr, i32) +declare i64 @finch_str_to_int(ptr, ptr, i64) +declare double @finch_str_to_float(ptr, ptr, i64) +declare void @finch_str_sub(ptr, ptr, i64, i64, ptr, i64) +declare i64 @finch_str_find(ptr, ptr) +declare i32 @finch_str_starts(ptr, ptr) +declare i32 @finch_str_ends(ptr, ptr) +declare void @finch_str_trim(ptr, ptr) +declare void @finch_str_upper(ptr, ptr) +declare void @finch_str_lower(ptr, ptr) +declare void @finch_str_replace(ptr, ptr, ptr, ptr) +declare void @finch_str_split(ptr, ptr, ptr) +declare void @finch_str_join(ptr, ptr, ptr) +declare void @finch_str_repeat(ptr, ptr, i64) +declare void @finch_bytes_from_str(ptr, ptr) +declare i64 @finch_map_find(ptr, ptr, i64, i64, i32) +declare i64 @finch_map_slot(ptr, ptr, i64, i64, i32, ptr) +declare void @finch_map_remove_at(ptr, i64, i64) +declare void @finch_map_clear(ptr) +declare void @finch_map_clone_raw(ptr, ptr, i64) +declare void @finch_map_missing(ptr, i64, ptr) noreturn cold +declare void @finch_map_changed(ptr, i64) noreturn cold +declare void @finch_arr_reserve(ptr, i64, i64) +declare void @finch_arr_clone_raw(ptr, ptr, i64) +declare void @finch_arr_make(ptr, i64, i64) +declare void @finch_arr_resize(ptr, i64, i64) +declare void @finch_arr_insert_gap(ptr, i64, i64, ptr, i64) +declare void @finch_arr_remove_gap(ptr, i64, i64) +declare void @qsort(ptr, i64, i64, ptr) +declare void @finch_args(ptr, i32, ptr) +declare void @finch_input(ptr, ptr) +declare i32 @finch_file_exists(ptr) +declare i32 @finch_str_try_int(ptr, ptr, ptr) +declare i32 @finch_str_try_float(ptr, ptr, ptr) +declare i32 @finch_try_read_file(ptr, ptr, ptr) +declare i32 @finch_try_write_file(ptr, ptr, ptr) +declare i32 @finch_try_delete_file(ptr, ptr) +declare void @finch_report_error(ptr) +declare void @finch_read_file(ptr, ptr, ptr, i64) +declare i32 @finch_write_file(ptr, ptr) +declare i64 @finch_shell(ptr) +declare i32 @finch_delete_file(ptr) +declare i32 @printf(ptr, ...) +declare i32 @fflush(ptr) +declare void @finch_str_from_c(ptr, ptr) +declare void @finch_on_fatal(ptr) +declare ptr @finch_std_stream(i32) +declare void @finch_str_from_bytes(ptr, ptr) +declare void @exit(i32) noreturn +declare void @free(ptr) + +define internal { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca i64, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t3 = load i64, ptr %t2 + %t4 = sub i64 %t3, 1 + store i64 %t4, ptr %a5 + br label %while.cond1 +while.cond1: + %t6 = load i64, ptr %a5 + %t7 = icmp sge i64 %t6, 0 + br label %logic.from4 +logic.from4: + br i1 %t7, label %logic.rhs5, label %logic.end6 +logic.rhs5: + %t8 = load i64, ptr %a5 + %t9 = load { ptr, i64, i64 }, ptr %a1 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 %t8, %t10 + br i1 %t11, label %range7, label %inrange8 +range7: + call void @finch_panic_index(ptr @.str.1, i64 19, i64 %t8, i64 %t10) + unreachable +inrange8: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds i8, ptr %t12, i64 %t8 + %t14 = load i8, ptr %t13 + %t15 = icmp ne i8 %t14, 47 + br label %logic.rend9 +logic.rend9: + br label %logic.end6 +logic.end6: + %t16 = phi i1 [ false, %logic.from4 ], [ %t15, %logic.rend9 ] + br i1 %t16, label %while.body2, label %while.end3 +while.body2: + %t17 = load i64, ptr %a5 + %t18 = sub i64 %t17, 1 + store i64 %t18, ptr %a5 + br label %while.cond1 +while.end3: + %t19 = load i64, ptr %a5 + %t20 = icmp slt i64 %t19, 0 + br i1 %t20, label %then10, label %endif12 +then10: + ret { ptr, i64, i64 } { ptr @.str.2, i64 1, i64 0 } +endif12: + %t21 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t21, ptr %a22 + %t24 = load i64, ptr %a5 + call void @finch_str_sub(ptr %a23, ptr %a22, i64 0, i64 %t24, ptr @.str.3, i64 25) + %t25 = load { ptr, i64, i64 }, ptr %a23 + ret { ptr, i64, i64 } %t25 +} + +define internal { ptr, i64, i64 } @finch.main.stem({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca i64, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + %t5 = load { ptr, i64, i64 }, ptr %a1 + %t6 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t5) + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = add i64 %t7, 1 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t10 = load i64, ptr %t9 + call void @finch_str_sub(ptr %a4, ptr %a3, i64 %t8, i64 %t10, ptr @.str.4, i64 29) + %t11 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t11, ptr %a12 + %t13 = load { ptr, i64, i64 }, ptr %a1 + %t14 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t13) + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.5, i64 1, i64 0 }, ptr %a16 + %t17 = call i32 @finch_str_eq(ptr %a15, ptr %a16) + %t18 = icmp ne i32 %t17, 0 + br label %logic.from13 +logic.from13: + br i1 %t18, label %logic.rhs14, label %logic.end15 +logic.rhs14: + %t19 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.7, i64 2, i64 0 }, ptr %a22 + %t23 = call i32 @finch_str_starts(ptr %a20, ptr %a22) + %t24 = icmp ne i32 %t23, 0 + %t25 = xor i1 %t24, true + br label %logic.rend16 +logic.rend16: + br label %logic.end15 +logic.end15: + %t26 = phi i1 [ false, %logic.from13 ], [ %t25, %logic.rend16 ] + br i1 %t26, label %then17, label %endif19 +then17: + %t27 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t27, ptr %a28 + call void @finch_str_copy(ptr %a29, ptr %a28) + %t30 = load { ptr, i64, i64 }, ptr %a29 + store { ptr, i64, i64 } %t30, ptr %a12 + br label %endif19 +endif19: + %t31 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t31, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.9, i64 1, i64 0 }, ptr %a34 + %t35 = call i64 @finch_str_find(ptr %a32, ptr %a34) + store i64 %t35, ptr %a36 + %t37 = load i64, ptr %a36 + %t38 = icmp sgt i64 %t37, 0 + br i1 %t38, label %then20, label %endif22 +then20: + %t39 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t39, ptr %a40 + %t42 = load i64, ptr %a36 + call void @finch_str_sub(ptr %a41, ptr %a40, i64 0, i64 %t42, ptr @.str.10, i64 35) + %t43 = load { ptr, i64, i64 }, ptr %a41 + ret { ptr, i64, i64 } %t43 +endif22: + %t44 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t44, ptr %a45 + call void @finch_str_copy(ptr %a46, ptr %a45) + %t47 = load { ptr, i64, i64 }, ptr %a46 + ret { ptr, i64, i64 } %t47 +} + +define internal { ptr, i64, i64 } @finch.main.findModule(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca i64, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load { ptr, i64, i64 }, ptr %a2 + %t5 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t4) + store { ptr, i64, i64 } %t5, ptr %a7 + store { ptr, i64, i64 } { ptr @.str.11, i64 1, i64 0 }, ptr %a8 + call void @finch_str_concat(ptr %a6, ptr %a7, ptr %a8) + %t9 = load { ptr, i64, i64 }, ptr %a6 + %t10 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t9, ptr %a12 + store { ptr, i64, i64 } %t10, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t14, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.12, i64 4, i64 0 }, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + store { ptr, i64, i64 } %t18, ptr %a19 + %t20 = load { ptr, i64, i64 }, ptr %a2 + %t21 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t20) + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.13, i64 1, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + %t26 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t25, ptr %a28 + store { ptr, i64, i64 } %t26, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t30, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.14, i64 1, i64 0 }, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = load ptr, ptr %a1 + %t36 = icmp eq ptr %t35, null + br i1 %t36, label %panic23, label %ok24 +panic23: + call void @finch_panic(ptr @.str.15, i64 54, ptr @.str.16) + unreachable +ok24: + %t37 = getelementptr inbounds %S.main.Loader, ptr %t35, i32 0, i32 3 + %t38 = load { ptr, i64, i64 }, ptr %t37 + store { ptr, i64, i64 } %t34, ptr %a40 + store { ptr, i64, i64 } %t38, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + store { ptr, i64, i64 } %t42, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.17, i64 4, i64 0 }, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + store { ptr, i64, i64 } %t46, ptr %a47 + %t48 = call i32 @finch_file_exists(ptr %a47) + %t49 = icmp ne i32 %t48, 0 + br i1 %t49, label %then25, label %endif27 +then25: + %t50 = load { ptr, i64, i64 }, ptr %a2 + %t51 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t50) + store { ptr, i64, i64 } %t51, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.18, i64 1, i64 0 }, ptr %a54 + call void @finch_str_concat(ptr %a52, ptr %a53, ptr %a54) + %t55 = load { ptr, i64, i64 }, ptr %a52 + %t56 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t55, ptr %a58 + store { ptr, i64, i64 } %t56, ptr %a59 + call void @finch_str_concat(ptr %a57, ptr %a58, ptr %a59) + %t60 = load { ptr, i64, i64 }, ptr %a57 + store { ptr, i64, i64 } %t60, ptr %a62 + store { ptr, i64, i64 } { ptr @.str.19, i64 1, i64 0 }, ptr %a63 + call void @finch_str_concat(ptr %a61, ptr %a62, ptr %a63) + %t64 = load { ptr, i64, i64 }, ptr %a61 + %t65 = load ptr, ptr %a1 + %t66 = icmp eq ptr %t65, null + br i1 %t66, label %panic28, label %ok29 +panic28: + call void @finch_panic(ptr @.str.20, i64 55, ptr @.str.21) + unreachable +ok29: + %t67 = getelementptr inbounds %S.main.Loader, ptr %t65, i32 0, i32 3 + %t68 = load { ptr, i64, i64 }, ptr %t67 + store { ptr, i64, i64 } %t64, ptr %a70 + store { ptr, i64, i64 } %t68, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + store { ptr, i64, i64 } %t72, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.22, i64 4, i64 0 }, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + ret { ptr, i64, i64 } %t76 +endif27: + %t77 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t77, ptr %a78 + %t79 = call i32 @finch_file_exists(ptr %a78) + %t80 = icmp ne i32 %t79, 0 + br i1 %t80, label %then30, label %endif32 +then30: + %t81 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t81, ptr %a82 + call void @finch_str_copy(ptr %a83, ptr %a82) + %t84 = load { ptr, i64, i64 }, ptr %a83 + ret { ptr, i64, i64 } %t84 +endif32: + %t85 = load ptr, ptr %a1 + %t86 = icmp eq ptr %t85, null + br i1 %t86, label %panic33, label %ok34 +panic33: + call void @finch_panic(ptr @.str.23, i64 60, ptr @.str.24) + unreachable +ok34: + %t87 = getelementptr inbounds %S.main.Loader, ptr %t85, i32 0, i32 5 + store i64 0, ptr %a88 + br label %each.cond35 +each.cond35: + %t89 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i32 0, i32 1 + %t90 = load i64, ptr %t89 + %t91 = load i64, ptr %a88 + %t92 = icmp slt i64 %t91, %t90 + br i1 %t92, label %each.body36, label %each.end38 +each.body36: + %t93 = load ptr, ptr %t87 + %t94 = getelementptr inbounds { ptr, i64, i64 }, ptr %t93, i64 %t91 + %t95 = load { ptr, i64, i64 }, ptr %t94 + store { ptr, i64, i64 } %t95, ptr %a96 + %t97 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t97, ptr %a99 + store { ptr, i64, i64 } { ptr @.str.25, i64 1, i64 0 }, ptr %a100 + call void @finch_str_concat(ptr %a98, ptr %a99, ptr %a100) + %t101 = load { ptr, i64, i64 }, ptr %a98 + %t102 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t101, ptr %a104 + store { ptr, i64, i64 } %t102, ptr %a105 + call void @finch_str_concat(ptr %a103, ptr %a104, ptr %a105) + %t106 = load { ptr, i64, i64 }, ptr %a103 + store { ptr, i64, i64 } %t106, ptr %a108 + store { ptr, i64, i64 } { ptr @.str.26, i64 1, i64 0 }, ptr %a109 + call void @finch_str_concat(ptr %a107, ptr %a108, ptr %a109) + %t110 = load { ptr, i64, i64 }, ptr %a107 + %t111 = load ptr, ptr %a1 + %t112 = icmp eq ptr %t111, null + br i1 %t112, label %panic39, label %ok40 +panic39: + call void @finch_panic(ptr @.str.27, i64 61, ptr @.str.28) + unreachable +ok40: + %t113 = getelementptr inbounds %S.main.Loader, ptr %t111, i32 0, i32 3 + %t114 = load { ptr, i64, i64 }, ptr %t113 + store { ptr, i64, i64 } %t110, ptr %a116 + store { ptr, i64, i64 } %t114, ptr %a117 + call void @finch_str_concat(ptr %a115, ptr %a116, ptr %a117) + %t118 = load { ptr, i64, i64 }, ptr %a115 + store { ptr, i64, i64 } %t118, ptr %a120 + store { ptr, i64, i64 } { ptr @.str.29, i64 4, i64 0 }, ptr %a121 + call void @finch_str_concat(ptr %a119, ptr %a120, ptr %a121) + %t122 = load { ptr, i64, i64 }, ptr %a119 + store { ptr, i64, i64 } %t122, ptr %a123 + %t124 = call i32 @finch_file_exists(ptr %a123) + %t125 = icmp ne i32 %t124, 0 + br i1 %t125, label %then41, label %endif43 +then41: + %t126 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t126, ptr %a128 + store { ptr, i64, i64 } { ptr @.str.30, i64 1, i64 0 }, ptr %a129 + call void @finch_str_concat(ptr %a127, ptr %a128, ptr %a129) + %t130 = load { ptr, i64, i64 }, ptr %a127 + %t131 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t130, ptr %a133 + store { ptr, i64, i64 } %t131, ptr %a134 + call void @finch_str_concat(ptr %a132, ptr %a133, ptr %a134) + %t135 = load { ptr, i64, i64 }, ptr %a132 + store { ptr, i64, i64 } %t135, ptr %a137 + store { ptr, i64, i64 } { ptr @.str.31, i64 1, i64 0 }, ptr %a138 + call void @finch_str_concat(ptr %a136, ptr %a137, ptr %a138) + %t139 = load { ptr, i64, i64 }, ptr %a136 + %t140 = load ptr, ptr %a1 + %t141 = icmp eq ptr %t140, null + br i1 %t141, label %panic44, label %ok45 +panic44: + call void @finch_panic(ptr @.str.32, i64 62, ptr @.str.33) + unreachable +ok45: + %t142 = getelementptr inbounds %S.main.Loader, ptr %t140, i32 0, i32 3 + %t143 = load { ptr, i64, i64 }, ptr %t142 + store { ptr, i64, i64 } %t139, ptr %a145 + store { ptr, i64, i64 } %t143, ptr %a146 + call void @finch_str_concat(ptr %a144, ptr %a145, ptr %a146) + %t147 = load { ptr, i64, i64 }, ptr %a144 + store { ptr, i64, i64 } %t147, ptr %a149 + store { ptr, i64, i64 } { ptr @.str.34, i64 4, i64 0 }, ptr %a150 + call void @finch_str_concat(ptr %a148, ptr %a149, ptr %a150) + %t151 = load { ptr, i64, i64 }, ptr %a148 + ret { ptr, i64, i64 } %t151 +endif43: + %t152 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t152, ptr %a154 + store { ptr, i64, i64 } { ptr @.str.35, i64 1, i64 0 }, ptr %a155 + call void @finch_str_concat(ptr %a153, ptr %a154, ptr %a155) + %t156 = load { ptr, i64, i64 }, ptr %a153 + %t157 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t156, ptr %a159 + store { ptr, i64, i64 } %t157, ptr %a160 + call void @finch_str_concat(ptr %a158, ptr %a159, ptr %a160) + %t161 = load { ptr, i64, i64 }, ptr %a158 + store { ptr, i64, i64 } %t161, ptr %a163 + store { ptr, i64, i64 } { ptr @.str.36, i64 4, i64 0 }, ptr %a164 + call void @finch_str_concat(ptr %a162, ptr %a163, ptr %a164) + %t165 = load { ptr, i64, i64 }, ptr %a162 + store { ptr, i64, i64 } %t165, ptr %a166 + %t167 = call i32 @finch_file_exists(ptr %a166) + %t168 = icmp ne i32 %t167, 0 + br i1 %t168, label %then46, label %endif48 +then46: + %t169 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t169, ptr %a171 + store { ptr, i64, i64 } { ptr @.str.37, i64 1, i64 0 }, ptr %a172 + call void @finch_str_concat(ptr %a170, ptr %a171, ptr %a172) + %t173 = load { ptr, i64, i64 }, ptr %a170 + %t174 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t173, ptr %a176 + store { ptr, i64, i64 } %t174, ptr %a177 + call void @finch_str_concat(ptr %a175, ptr %a176, ptr %a177) + %t178 = load { ptr, i64, i64 }, ptr %a175 + store { ptr, i64, i64 } %t178, ptr %a180 + store { ptr, i64, i64 } { ptr @.str.38, i64 4, i64 0 }, ptr %a181 + call void @finch_str_concat(ptr %a179, ptr %a180, ptr %a181) + %t182 = load { ptr, i64, i64 }, ptr %a179 + ret { ptr, i64, i64 } %t182 +endif48: + br label %each.step37 +each.step37: + %t183 = load i64, ptr %a88 + %t184 = add i64 %t183, 1 + store i64 %t184, ptr %a88 + br label %each.cond35 +each.end38: + %t185 = load ptr, ptr %a1 + %t186 = icmp eq ptr %t185, null + br i1 %t186, label %panic49, label %ok50 +panic49: + call void @finch_panic(ptr @.str.39, i64 68, ptr @.str.40) + unreachable +ok50: + %t187 = getelementptr inbounds %S.main.Loader, ptr %t185, i32 0, i32 4 + %t188 = getelementptr inbounds { ptr, i64, i64 }, ptr %t187, i32 0, i32 1 + %t189 = load i64, ptr %t188 + %t190 = icmp sgt i64 %t189, 0 + br i1 %t190, label %then51, label %endif53 +then51: + %t191 = load ptr, ptr %a1 + %t192 = icmp eq ptr %t191, null + br i1 %t192, label %panic54, label %ok55 +panic54: + call void @finch_panic(ptr @.str.41, i64 69, ptr @.str.42) + unreachable +ok55: + %t193 = getelementptr inbounds %S.main.Loader, ptr %t191, i32 0, i32 4 + %t194 = load { ptr, i64, i64 }, ptr %t193 + store { ptr, i64, i64 } %t194, ptr %a196 + store { ptr, i64, i64 } { ptr @.str.43, i64 1, i64 0 }, ptr %a197 + call void @finch_str_concat(ptr %a195, ptr %a196, ptr %a197) + %t198 = load { ptr, i64, i64 }, ptr %a195 + %t199 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t198, ptr %a201 + store { ptr, i64, i64 } %t199, ptr %a202 + call void @finch_str_concat(ptr %a200, ptr %a201, ptr %a202) + %t203 = load { ptr, i64, i64 }, ptr %a200 + store { ptr, i64, i64 } %t203, ptr %a205 + store { ptr, i64, i64 } { ptr @.str.44, i64 1, i64 0 }, ptr %a206 + call void @finch_str_concat(ptr %a204, ptr %a205, ptr %a206) + %t207 = load { ptr, i64, i64 }, ptr %a204 + %t208 = load ptr, ptr %a1 + %t209 = icmp eq ptr %t208, null + br i1 %t209, label %panic56, label %ok57 +panic56: + call void @finch_panic(ptr @.str.45, i64 69, ptr @.str.46) + unreachable +ok57: + %t210 = getelementptr inbounds %S.main.Loader, ptr %t208, i32 0, i32 3 + %t211 = load { ptr, i64, i64 }, ptr %t210 + store { ptr, i64, i64 } %t207, ptr %a213 + store { ptr, i64, i64 } %t211, ptr %a214 + call void @finch_str_concat(ptr %a212, ptr %a213, ptr %a214) + %t215 = load { ptr, i64, i64 }, ptr %a212 + store { ptr, i64, i64 } %t215, ptr %a217 + store { ptr, i64, i64 } { ptr @.str.47, i64 4, i64 0 }, ptr %a218 + call void @finch_str_concat(ptr %a216, ptr %a217, ptr %a218) + %t219 = load { ptr, i64, i64 }, ptr %a216 + store { ptr, i64, i64 } %t219, ptr %a220 + %t221 = call i32 @finch_file_exists(ptr %a220) + %t222 = icmp ne i32 %t221, 0 + br i1 %t222, label %then58, label %endif60 +then58: + %t223 = load ptr, ptr %a1 + %t224 = icmp eq ptr %t223, null + br i1 %t224, label %panic61, label %ok62 +panic61: + call void @finch_panic(ptr @.str.48, i64 70, ptr @.str.49) + unreachable +ok62: + %t225 = getelementptr inbounds %S.main.Loader, ptr %t223, i32 0, i32 4 + %t226 = load { ptr, i64, i64 }, ptr %t225 + store { ptr, i64, i64 } %t226, ptr %a228 + store { ptr, i64, i64 } { ptr @.str.50, i64 1, i64 0 }, ptr %a229 + call void @finch_str_concat(ptr %a227, ptr %a228, ptr %a229) + %t230 = load { ptr, i64, i64 }, ptr %a227 + %t231 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t230, ptr %a233 + store { ptr, i64, i64 } %t231, ptr %a234 + call void @finch_str_concat(ptr %a232, ptr %a233, ptr %a234) + %t235 = load { ptr, i64, i64 }, ptr %a232 + store { ptr, i64, i64 } %t235, ptr %a237 + store { ptr, i64, i64 } { ptr @.str.51, i64 1, i64 0 }, ptr %a238 + call void @finch_str_concat(ptr %a236, ptr %a237, ptr %a238) + %t239 = load { ptr, i64, i64 }, ptr %a236 + %t240 = load ptr, ptr %a1 + %t241 = icmp eq ptr %t240, null + br i1 %t241, label %panic63, label %ok64 +panic63: + call void @finch_panic(ptr @.str.52, i64 70, ptr @.str.53) + unreachable +ok64: + %t242 = getelementptr inbounds %S.main.Loader, ptr %t240, i32 0, i32 3 + %t243 = load { ptr, i64, i64 }, ptr %t242 + store { ptr, i64, i64 } %t239, ptr %a245 + store { ptr, i64, i64 } %t243, ptr %a246 + call void @finch_str_concat(ptr %a244, ptr %a245, ptr %a246) + %t247 = load { ptr, i64, i64 }, ptr %a244 + store { ptr, i64, i64 } %t247, ptr %a249 + store { ptr, i64, i64 } { ptr @.str.54, i64 4, i64 0 }, ptr %a250 + call void @finch_str_concat(ptr %a248, ptr %a249, ptr %a250) + %t251 = load { ptr, i64, i64 }, ptr %a248 + ret { ptr, i64, i64 } %t251 +endif60: + %t252 = load ptr, ptr %a1 + %t253 = icmp eq ptr %t252, null + br i1 %t253, label %panic65, label %ok66 +panic65: + call void @finch_panic(ptr @.str.55, i64 72, ptr @.str.56) + unreachable +ok66: + %t254 = getelementptr inbounds %S.main.Loader, ptr %t252, i32 0, i32 4 + %t255 = load { ptr, i64, i64 }, ptr %t254 + store { ptr, i64, i64 } %t255, ptr %a257 + store { ptr, i64, i64 } { ptr @.str.57, i64 1, i64 0 }, ptr %a258 + call void @finch_str_concat(ptr %a256, ptr %a257, ptr %a258) + %t259 = load { ptr, i64, i64 }, ptr %a256 + %t260 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t259, ptr %a262 + store { ptr, i64, i64 } %t260, ptr %a263 + call void @finch_str_concat(ptr %a261, ptr %a262, ptr %a263) + %t264 = load { ptr, i64, i64 }, ptr %a261 + store { ptr, i64, i64 } %t264, ptr %a266 + store { ptr, i64, i64 } { ptr @.str.58, i64 4, i64 0 }, ptr %a267 + call void @finch_str_concat(ptr %a265, ptr %a266, ptr %a267) + %t268 = load { ptr, i64, i64 }, ptr %a265 + store { ptr, i64, i64 } %t268, ptr %a269 + %t270 = call i32 @finch_file_exists(ptr %a269) + %t271 = icmp ne i32 %t270, 0 + br i1 %t271, label %then67, label %endif69 +then67: + %t272 = load ptr, ptr %a1 + %t273 = icmp eq ptr %t272, null + br i1 %t273, label %panic70, label %ok71 +panic70: + call void @finch_panic(ptr @.str.59, i64 73, ptr @.str.60) + unreachable +ok71: + %t274 = getelementptr inbounds %S.main.Loader, ptr %t272, i32 0, i32 4 + %t275 = load { ptr, i64, i64 }, ptr %t274 + store { ptr, i64, i64 } %t275, ptr %a277 + store { ptr, i64, i64 } { ptr @.str.61, i64 1, i64 0 }, ptr %a278 + call void @finch_str_concat(ptr %a276, ptr %a277, ptr %a278) + %t279 = load { ptr, i64, i64 }, ptr %a276 + %t280 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t279, ptr %a282 + store { ptr, i64, i64 } %t280, ptr %a283 + call void @finch_str_concat(ptr %a281, ptr %a282, ptr %a283) + %t284 = load { ptr, i64, i64 }, ptr %a281 + store { ptr, i64, i64 } %t284, ptr %a286 + store { ptr, i64, i64 } { ptr @.str.62, i64 4, i64 0 }, ptr %a287 + call void @finch_str_concat(ptr %a285, ptr %a286, ptr %a287) + %t288 = load { ptr, i64, i64 }, ptr %a285 + ret { ptr, i64, i64 } %t288 +endif69: + br label %endif53 +endif53: + %t289 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t289, ptr %a290 + call void @finch_str_copy(ptr %a291, ptr %a290) + %t292 = load { ptr, i64, i64 }, ptr %a291 + ret { ptr, i64, i64 } %t292 +} + +define internal void @finch.copy.arr_str(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond82 +n.cond82: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body83, label %n.end84 +n.body83: + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 %t6 + call void @finch_str_copy(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond82 +n.end84: + ret void +} + +define internal void @finch.copy.arr_S_ast_Type(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond90 +n.cond90: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body91, label %n.end92 +n.body91: + %t8 = getelementptr inbounds %S.ast.Type, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.ast.Type, ptr %t2, i64 %t6 + call void @finch.copy.S_ast_Type(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond90 +n.end92: + ret void +} + +define internal void @finch.copy.S_ast_Type(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.ast.Type, ptr %src + store %S.ast.Type %t1, ptr %dst + %t2 = getelementptr inbounds %S.ast.Type, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.ast.Type, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.ast.Type, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.ast.Type, ptr %src, i32 0, i32 1 + call void @finch.copy.arr_S_ast_Type(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.ast.Type, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.ast.Type, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.ast.Type, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.ast.Type, ptr %src, i32 0, i32 3 + call void @finch_str_copy(ptr %t8, ptr %t9) + ret void +} + +define internal void @finch.copy.S_ast_Node(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.ast.Node, ptr %src + store %S.ast.Node %t1, ptr %dst + %t2 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 3 + call void @finch.copy.arr_str(ptr %t8, ptr %t9) + %t10 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 4 + %t11 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 4 + call void @finch_str_copy(ptr %t10, ptr %t11) + %t12 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 5 + %t13 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 5 + call void @finch.copy.S_ast_Type(ptr %t12, ptr %t13) + %t14 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 9 + %t15 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 9 + call void @finch.copy.arr_S_ast_Node(ptr %t14, ptr %t15) + %t16 = getelementptr inbounds %S.ast.Node, ptr %dst, i32 0, i32 10 + %t17 = getelementptr inbounds %S.ast.Node, ptr %src, i32 0, i32 10 + call void @finch.copy.arr_str(ptr %t16, ptr %t17) + ret void +} + +define internal void @finch.copy.arr_S_ast_Node(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond87 +n.cond87: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body88, label %n.end89 +n.body88: + %t8 = getelementptr inbounds %S.ast.Node, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.ast.Node, ptr %t2, i64 %t6 + call void @finch.copy.S_ast_Node(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond87 +n.end89: + ret void +} + +define internal void @finch.copy.S_ast_Program(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.ast.Program, ptr %src + store %S.ast.Program %t1, ptr %dst + %t2 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 2 + call void @finch.copy.arr_str(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 3 + call void @finch.copy.arr_str(ptr %t8, ptr %t9) + %t10 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 4 + %t11 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 4 + call void @finch.copy.arr_str(ptr %t10, ptr %t11) + %t12 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 5 + %t13 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 5 + call void @finch.copy.arr_str(ptr %t12, ptr %t13) + %t14 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 6 + %t15 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 6 + call void @finch.copy.arr_S_ast_Node(ptr %t14, ptr %t15) + %t16 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 7 + %t17 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 7 + call void @finch.copy.arr_S_ast_Node(ptr %t16, ptr %t17) + %t18 = getelementptr inbounds %S.ast.Program, ptr %dst, i32 0, i32 8 + %t19 = getelementptr inbounds %S.ast.Program, ptr %src, i32 0, i32 8 + call void @finch.copy.arr_S_ast_Node(ptr %t18, ptr %t19) + ret void +} + +define internal void @finch.main.load(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca i64, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca %S.ast.Program, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca %S.ast.Program, align 16 + %a107 = alloca %S.ast.Program, align 16 + %a113 = alloca i64, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca i64, align 16 + %a130 = alloca i64, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t4, ptr %a5 + %t6 = call i32 @finch_file_exists(ptr %a5) + %t7 = icmp ne i32 %t6, 0 + %t8 = xor i1 %t7, true + br i1 %t8, label %then72, label %endif74 +then72: + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t10 = load i64, ptr %t9 + %t11 = icmp sgt i64 %t10, 0 + br i1 %t11, label %then75, label %else76 +then75: + %t12 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.63, i64 30, i64 0 }, ptr %a14 + store { ptr, i64, i64 } %t12, ptr %a15 + call void @finch_str_concat(ptr %a13, ptr %a14, ptr %a15) + %t16 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t16, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.64, i64 14, i64 0 }, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + %t21 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t20, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.65, i64 1, i64 0 }, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + %t30 = extractvalue { ptr, i64, i64 } %t29, 1 + %t31 = trunc i64 %t30 to i32 + %t32 = extractvalue { ptr, i64, i64 } %t29, 0 + %t33 = icmp eq ptr %t32, null + %t34 = select i1 %t33, ptr @.str.66, ptr %t32 + %t35 = call i32 (ptr, ...) @printf(ptr @.str.67, i32 %t31, ptr %t34) + %t36 = call i32 (ptr, ...) @printf(ptr @.str.68) + br label %endif77 +else76: + %t37 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.69, i64 19, i64 0 }, ptr %a39 + store { ptr, i64, i64 } %t37, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + store { ptr, i64, i64 } %t41, ptr %a43 + store { ptr, i64, i64 } { ptr @.str.70, i64 1, i64 0 }, ptr %a44 + call void @finch_str_concat(ptr %a42, ptr %a43, ptr %a44) + %t45 = load { ptr, i64, i64 }, ptr %a42 + %t46 = extractvalue { ptr, i64, i64 } %t45, 1 + %t47 = trunc i64 %t46 to i32 + %t48 = extractvalue { ptr, i64, i64 } %t45, 0 + %t49 = icmp eq ptr %t48, null + %t50 = select i1 %t49, ptr @.str.71, ptr %t48 + %t51 = call i32 (ptr, ...) @printf(ptr @.str.72, i32 %t47, ptr %t50) + %t52 = call i32 (ptr, ...) @printf(ptr @.str.73) + br label %endif77 +endif77: + %t53 = trunc i64 1 to i32 + %t54 = call i32 @fflush(ptr null) + call void @exit(i32 %t53) + br label %endif74 +endif74: + %t55 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t55, ptr %a56 + call void @finch_read_file(ptr %a57, ptr %a56, ptr @.str.74, i64 88) + %t58 = load { ptr, i64, i64 }, ptr %a57 + store { ptr, i64, i64 } %t58, ptr %a59 + %t60 = load ptr, ptr %a1 + %t61 = icmp eq ptr %t60, null + br i1 %t61, label %panic78, label %ok79 +panic78: + call void @finch_panic(ptr @.str.75, i64 89, ptr @.str.76) + unreachable +ok79: + %t62 = getelementptr inbounds %S.main.Loader, ptr %t60, i32 0, i32 1 + %t63 = getelementptr inbounds { ptr, i64, i64 }, ptr %t62, i32 0, i32 1 + %t64 = load i64, ptr %t63 + store i64 %t64, ptr %a65 + %t66 = load ptr, ptr %a1 + %t67 = icmp eq ptr %t66, null + br i1 %t67, label %panic80, label %ok81 +panic80: + call void @finch_panic(ptr @.str.77, i64 90, ptr @.str.78) + unreachable +ok81: + %t68 = getelementptr inbounds %S.main.Loader, ptr %t66, i32 0, i32 1 + %t69 = getelementptr inbounds { ptr, i64, i64 }, ptr %t68, i32 0, i32 1 + %t70 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t70, ptr %a71 + call void @finch_str_copy(ptr %a72, ptr %a71) + %t73 = load { ptr, i64, i64 }, ptr %a72 + %t74 = load i64, ptr %t69 + %t75 = add i64 %t74, 1 + call void @finch_arr_reserve(ptr %t68, i64 %t75, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t76 = load ptr, ptr %t68 + %t77 = getelementptr inbounds { ptr, i64, i64 }, ptr %t76, i64 %t74 + store { ptr, i64, i64 } %t73, ptr %t77 + store i64 %t75, ptr %t69 + %t78 = load { ptr, i64, i64 }, ptr %a59 + %t79 = load { ptr, i64, i64 }, ptr %a2 + %t80 = call { ptr, i64, i64 } @finch.lexer.lex({ ptr, i64, i64 } %t78, { ptr, i64, i64 } %t79) + %t81 = load i64, ptr %a65 + %t82 = load { ptr, i64, i64 }, ptr %a2 + %t83 = call %S.ast.Program @finch.parser.parse({ ptr, i64, i64 } %t80, i64 %t81, { ptr, i64, i64 } %t82) + store %S.ast.Program %t83, ptr %a84 + %t85 = load { ptr, i64, i64 }, ptr %a3 + %t86 = getelementptr inbounds %S.ast.Program, ptr %a84, i32 0, i32 0 + store { ptr, i64, i64 } %t85, ptr %a87 + call void @finch_str_copy(ptr %a88, ptr %a87) + %t89 = load { ptr, i64, i64 }, ptr %a88 + store { ptr, i64, i64 } %t89, ptr %t86 + %t90 = load { ptr, i64, i64 }, ptr %a2 + %t91 = getelementptr inbounds %S.ast.Program, ptr %a84, i32 0, i32 1 + store { ptr, i64, i64 } %t90, ptr %a92 + call void @finch_str_copy(ptr %a93, ptr %a92) + %t94 = load { ptr, i64, i64 }, ptr %a93 + store { ptr, i64, i64 } %t94, ptr %t91 + %t95 = getelementptr inbounds %S.ast.Program, ptr %a84, i32 0, i32 2 + %t96 = load { ptr, i64, i64 }, ptr %t95 + store { ptr, i64, i64 } %t96, ptr %a97 + call void @finch.copy.arr_str(ptr %a98, ptr %a97) + %t99 = load { ptr, i64, i64 }, ptr %a98 + store { ptr, i64, i64 } %t99, ptr %a100 + %t101 = load ptr, ptr %a1 + %t102 = icmp eq ptr %t101, null + br i1 %t102, label %panic85, label %ok86 +panic85: + call void @finch_panic(ptr @.str.79, i64 95, ptr @.str.80) + unreachable +ok86: + %t103 = getelementptr inbounds %S.main.Loader, ptr %t101, i32 0, i32 0 + %t104 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i32 0, i32 1 + %t105 = load %S.ast.Program, ptr %a84 + store %S.ast.Program %t105, ptr %a106 + call void @finch.copy.S_ast_Program(ptr %a107, ptr %a106) + %t108 = load %S.ast.Program, ptr %a107 + %t109 = load i64, ptr %t104 + %t110 = add i64 %t109, 1 + call void @finch_arr_reserve(ptr %t103, i64 %t110, i64 ptrtoint (ptr getelementptr (%S.ast.Program, ptr null, i32 1) to i64)) + %t111 = load ptr, ptr %t103 + %t112 = getelementptr inbounds %S.ast.Program, ptr %t111, i64 %t109 + store %S.ast.Program %t108, ptr %t112 + store i64 %t110, ptr %t104 + store i64 0, ptr %a113 + br label %each.cond93 +each.cond93: + %t114 = getelementptr inbounds { ptr, i64, i64 }, ptr %a100, i32 0, i32 1 + %t115 = load i64, ptr %t114 + %t116 = load i64, ptr %a113 + %t117 = icmp slt i64 %t116, %t115 + br i1 %t117, label %each.body94, label %each.end96 +each.body94: + %t118 = load ptr, ptr %a100 + %t119 = getelementptr inbounds { ptr, i64, i64 }, ptr %t118, i64 %t116 + %t120 = load { ptr, i64, i64 }, ptr %t119 + store { ptr, i64, i64 } %t120, ptr %a121 + %t122 = load ptr, ptr %a1 + %t123 = icmp eq ptr %t122, null + br i1 %t123, label %panic97, label %ok98 +panic97: + call void @finch_panic(ptr @.str.81, i64 97, ptr @.str.82) + unreachable +ok98: + %t124 = getelementptr inbounds %S.main.Loader, ptr %t122, i32 0, i32 2 + %t125 = getelementptr inbounds { ptr, i64, i64 }, ptr %t124, i32 0, i32 1 + %t126 = load { ptr, i64, i64 }, ptr %a121 + store i64 -1, ptr %a127 + %t128 = load i64, ptr %t125 + %t129 = load ptr, ptr %t124 + store i64 0, ptr %a130 + br label %find.cond99 +find.cond99: + %t131 = load i64, ptr %a130 + %t132 = icmp slt i64 %t131, %t128 + br i1 %t132, label %find.body100, label %find.end103 +find.body100: + %t133 = getelementptr inbounds { ptr, i64, i64 }, ptr %t129, i64 %t131 + %t134 = load { ptr, i64, i64 }, ptr %t133 + store { ptr, i64, i64 } %t134, ptr %a135 + store { ptr, i64, i64 } %t126, ptr %a136 + %t137 = call i32 @finch_str_eq(ptr %a135, ptr %a136) + %t138 = icmp ne i32 %t137, 0 + br i1 %t138, label %find.hit101, label %find.next102 +find.hit101: + store i64 %t131, ptr %a127 + br label %find.end103 +find.next102: + %t139 = add i64 %t131, 1 + store i64 %t139, ptr %a130 + br label %find.cond99 +find.end103: + %t140 = load i64, ptr %a127 + %t141 = icmp sge i64 %t140, 0 + %t142 = xor i1 %t141, true + br i1 %t142, label %then104, label %endif106 +then104: + %t143 = load ptr, ptr %a1 + %t144 = icmp eq ptr %t143, null + br i1 %t144, label %panic107, label %ok108 +panic107: + call void @finch_panic(ptr @.str.83, i64 98, ptr @.str.84) + unreachable +ok108: + %t145 = getelementptr inbounds %S.main.Loader, ptr %t143, i32 0, i32 2 + %t146 = getelementptr inbounds { ptr, i64, i64 }, ptr %t145, i32 0, i32 1 + %t147 = load { ptr, i64, i64 }, ptr %a121 + store { ptr, i64, i64 } %t147, ptr %a148 + call void @finch_str_copy(ptr %a149, ptr %a148) + %t150 = load { ptr, i64, i64 }, ptr %a149 + %t151 = load i64, ptr %t146 + %t152 = add i64 %t151, 1 + call void @finch_arr_reserve(ptr %t145, i64 %t152, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t153 = load ptr, ptr %t145 + %t154 = getelementptr inbounds { ptr, i64, i64 }, ptr %t153, i64 %t151 + store { ptr, i64, i64 } %t150, ptr %t154 + store i64 %t152, ptr %t146 + %t155 = load ptr, ptr %a1 + %t156 = load ptr, ptr %a1 + %t157 = load { ptr, i64, i64 }, ptr %a2 + %t158 = load { ptr, i64, i64 }, ptr %a121 + %t159 = call { ptr, i64, i64 } @finch.main.findModule(ptr %t156, { ptr, i64, i64 } %t157, { ptr, i64, i64 } %t158) + %t160 = load { ptr, i64, i64 }, ptr %a121 + call void @finch.main.load(ptr %t155, { ptr, i64, i64 } %t159, { ptr, i64, i64 } %t160) + br label %endif106 +endif106: + br label %each.step95 +each.step95: + %t161 = load i64, ptr %a113 + %t162 = add i64 %t161, 1 + store i64 %t162, ptr %a113 + br label %each.cond93 +each.end96: + ret void +} + +define internal void @finch.main.usage() { +entry: + + %t1 = extractvalue { ptr, i64, i64 } { ptr @.str.85, i64 41, i64 0 }, 1 + %t2 = trunc i64 %t1 to i32 + %t3 = extractvalue { ptr, i64, i64 } { ptr @.str.85, i64 41, i64 0 }, 0 + %t4 = icmp eq ptr %t3, null + %t5 = select i1 %t4, ptr @.str.86, ptr %t3 + %t6 = call i32 (ptr, ...) @printf(ptr @.str.87, i32 %t2, ptr %t5) + %t7 = call i32 (ptr, ...) @printf(ptr @.str.88) + %t8 = extractvalue { ptr, i64, i64 } { ptr @.str.89, i64 6, i64 0 }, 1 + %t9 = trunc i64 %t8 to i32 + %t10 = extractvalue { ptr, i64, i64 } { ptr @.str.89, i64 6, i64 0 }, 0 + %t11 = icmp eq ptr %t10, null + %t12 = select i1 %t11, ptr @.str.90, ptr %t10 + %t13 = call i32 (ptr, ...) @printf(ptr @.str.91, i32 %t9, ptr %t12) + %t14 = call i32 (ptr, ...) @printf(ptr @.str.92) + %t15 = extractvalue { ptr, i64, i64 } { ptr @.str.93, i64 60, i64 0 }, 1 + %t16 = trunc i64 %t15 to i32 + %t17 = extractvalue { ptr, i64, i64 } { ptr @.str.93, i64 60, i64 0 }, 0 + %t18 = icmp eq ptr %t17, null + %t19 = select i1 %t18, ptr @.str.94, ptr %t17 + %t20 = call i32 (ptr, ...) @printf(ptr @.str.95, i32 %t16, ptr %t19) + %t21 = call i32 (ptr, ...) @printf(ptr @.str.96) + %t22 = extractvalue { ptr, i64, i64 } { ptr @.str.97, i64 52, i64 0 }, 1 + %t23 = trunc i64 %t22 to i32 + %t24 = extractvalue { ptr, i64, i64 } { ptr @.str.97, i64 52, i64 0 }, 0 + %t25 = icmp eq ptr %t24, null + %t26 = select i1 %t25, ptr @.str.98, ptr %t24 + %t27 = call i32 (ptr, ...) @printf(ptr @.str.99, i32 %t23, ptr %t26) + %t28 = call i32 (ptr, ...) @printf(ptr @.str.100) + %t29 = extractvalue { ptr, i64, i64 } { ptr @.str.101, i64 54, i64 0 }, 1 + %t30 = trunc i64 %t29 to i32 + %t31 = extractvalue { ptr, i64, i64 } { ptr @.str.101, i64 54, i64 0 }, 0 + %t32 = icmp eq ptr %t31, null + %t33 = select i1 %t32, ptr @.str.102, ptr %t31 + %t34 = call i32 (ptr, ...) @printf(ptr @.str.103, i32 %t30, ptr %t33) + %t35 = call i32 (ptr, ...) @printf(ptr @.str.104) + %t36 = extractvalue { ptr, i64, i64 } { ptr @.str.105, i64 53, i64 0 }, 1 + %t37 = trunc i64 %t36 to i32 + %t38 = extractvalue { ptr, i64, i64 } { ptr @.str.105, i64 53, i64 0 }, 0 + %t39 = icmp eq ptr %t38, null + %t40 = select i1 %t39, ptr @.str.106, ptr %t38 + %t41 = call i32 (ptr, ...) @printf(ptr @.str.107, i32 %t37, ptr %t40) + %t42 = call i32 (ptr, ...) @printf(ptr @.str.108) + %t43 = extractvalue { ptr, i64, i64 } { ptr @.str.109, i64 8, i64 0 }, 1 + %t44 = trunc i64 %t43 to i32 + %t45 = extractvalue { ptr, i64, i64 } { ptr @.str.109, i64 8, i64 0 }, 0 + %t46 = icmp eq ptr %t45, null + %t47 = select i1 %t46, ptr @.str.110, ptr %t45 + %t48 = call i32 (ptr, ...) @printf(ptr @.str.111, i32 %t44, ptr %t47) + %t49 = call i32 (ptr, ...) @printf(ptr @.str.112) + %t50 = extractvalue { ptr, i64, i64 } { ptr @.str.113, i64 53, i64 0 }, 1 + %t51 = trunc i64 %t50 to i32 + %t52 = extractvalue { ptr, i64, i64 } { ptr @.str.113, i64 53, i64 0 }, 0 + %t53 = icmp eq ptr %t52, null + %t54 = select i1 %t53, ptr @.str.114, ptr %t52 + %t55 = call i32 (ptr, ...) @printf(ptr @.str.115, i32 %t51, ptr %t54) + %t56 = call i32 (ptr, ...) @printf(ptr @.str.116) + %t57 = extractvalue { ptr, i64, i64 } { ptr @.str.117, i64 76, i64 0 }, 1 + %t58 = trunc i64 %t57 to i32 + %t59 = extractvalue { ptr, i64, i64 } { ptr @.str.117, i64 76, i64 0 }, 0 + %t60 = icmp eq ptr %t59, null + %t61 = select i1 %t60, ptr @.str.118, ptr %t59 + %t62 = call i32 (ptr, ...) @printf(ptr @.str.119, i32 %t58, ptr %t61) + %t63 = call i32 (ptr, ...) @printf(ptr @.str.120) + %t64 = extractvalue { ptr, i64, i64 } { ptr @.str.121, i64 57, i64 0 }, 1 + %t65 = trunc i64 %t64 to i32 + %t66 = extractvalue { ptr, i64, i64 } { ptr @.str.121, i64 57, i64 0 }, 0 + %t67 = icmp eq ptr %t66, null + %t68 = select i1 %t67, ptr @.str.122, ptr %t66 + %t69 = call i32 (ptr, ...) @printf(ptr @.str.123, i32 %t65, ptr %t68) + %t70 = call i32 (ptr, ...) @printf(ptr @.str.124) + %t71 = extractvalue { ptr, i64, i64 } { ptr @.str.125, i64 66, i64 0 }, 1 + %t72 = trunc i64 %t71 to i32 + %t73 = extractvalue { ptr, i64, i64 } { ptr @.str.125, i64 66, i64 0 }, 0 + %t74 = icmp eq ptr %t73, null + %t75 = select i1 %t74, ptr @.str.126, ptr %t73 + %t76 = call i32 (ptr, ...) @printf(ptr @.str.127, i32 %t72, ptr %t75) + %t77 = call i32 (ptr, ...) @printf(ptr @.str.128) + %t78 = extractvalue { ptr, i64, i64 } { ptr @.str.129, i64 101, i64 0 }, 1 + %t79 = trunc i64 %t78 to i32 + %t80 = extractvalue { ptr, i64, i64 } { ptr @.str.129, i64 101, i64 0 }, 0 + %t81 = icmp eq ptr %t80, null + %t82 = select i1 %t81, ptr @.str.130, ptr %t80 + %t83 = call i32 (ptr, ...) @printf(ptr @.str.131, i32 %t79, ptr %t82) + %t84 = call i32 (ptr, ...) @printf(ptr @.str.132) + %t85 = extractvalue { ptr, i64, i64 } { ptr @.str.133, i64 78, i64 0 }, 1 + %t86 = trunc i64 %t85 to i32 + %t87 = extractvalue { ptr, i64, i64 } { ptr @.str.133, i64 78, i64 0 }, 0 + %t88 = icmp eq ptr %t87, null + %t89 = select i1 %t88, ptr @.str.134, ptr %t87 + %t90 = call i32 (ptr, ...) @printf(ptr @.str.135, i32 %t86, ptr %t89) + %t91 = call i32 (ptr, ...) @printf(ptr @.str.136) + %t92 = trunc i64 1 to i32 + %t93 = call i32 @fflush(ptr null) + call void @exit(i32 %t92) + ret void +} + +define internal void @finch.copy.S_platform_Target(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.platform.Target, ptr %src + store %S.platform.Target %t1, ptr %dst + %t2 = getelementptr inbounds %S.platform.Target, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.platform.Target, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.platform.Target, ptr %dst, i32 0, i32 6 + %t5 = getelementptr inbounds %S.platform.Target, ptr %src, i32 0, i32 6 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.platform.Target, ptr %dst, i32 0, i32 7 + %t7 = getelementptr inbounds %S.platform.Target, ptr %src, i32 0, i32 7 + call void @finch_str_copy(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.platform.Target, ptr %dst, i32 0, i32 8 + %t9 = getelementptr inbounds %S.platform.Target, ptr %src, i32 0, i32 8 + call void @finch_str_copy(ptr %t8, ptr %t9) + ret void +} + +define internal i64 @finch.main.main({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca i1, align 16 + %a78 = alloca i1, align 16 + %a79 = alloca i1, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca i64, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca %S.platform.Target, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a301 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a336 = alloca { ptr, i64, i64 }, align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a347 = alloca { ptr, i64, i64 }, align 16 + %a349 = alloca %S.main.Loader, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a377 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca i64, align 16 + %a396 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a403 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a423 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca i64, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + %a444 = alloca { ptr, i64, i64 }, align 16 + %a445 = alloca { ptr, i64, i64 }, align 16 + %a454 = alloca { ptr, i64, i64 }, align 16 + %a455 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a458 = alloca { ptr, i64, i64 }, align 16 + %a460 = alloca { ptr, i64, i64 }, align 16 + %a462 = alloca { ptr, i64, i64 }, align 16 + %a463 = alloca { ptr, i64, i64 }, align 16 + %a465 = alloca { ptr, i64, i64 }, align 16 + %a467 = alloca i64, align 16 + %a475 = alloca %S.ast.Program, align 16 + %a479 = alloca { ptr, i64, i64 }, align 16 + %a482 = alloca i64, align 16 + %a485 = alloca i64, align 16 + %a490 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca { ptr, i64, i64 }, align 16 + %a501 = alloca { ptr, i64, i64 }, align 16 + %a510 = alloca i64, align 16 + %a522 = alloca i64, align 16 + %a525 = alloca i64, align 16 + %a530 = alloca { ptr, i64, i64 }, align 16 + %a531 = alloca { ptr, i64, i64 }, align 16 + %a547 = alloca { ptr, i64, i64 }, align 16 + %a548 = alloca { ptr, i64, i64 }, align 16 + %a563 = alloca { ptr, i64, i64 }, align 16 + %a564 = alloca { ptr, i64, i64 }, align 16 + %a575 = alloca { ptr, i64, i64 }, align 16 + %a576 = alloca { ptr, i64, i64 }, align 16 + %a586 = alloca i64, align 16 + %a594 = alloca { ptr, i64, i64 }, align 16 + %a596 = alloca { ptr, i64, i64 }, align 16 + %a597 = alloca { ptr, i64, i64 }, align 16 + %a598 = alloca { ptr, i64, i64 }, align 16 + %a602 = alloca { ptr, i64, i64 }, align 16 + %a603 = alloca { ptr, i64, i64 }, align 16 + %a604 = alloca { ptr, i64, i64 }, align 16 + %a609 = alloca { ptr, i64, i64 }, align 16 + %a610 = alloca { ptr, i64, i64 }, align 16 + %a611 = alloca { ptr, i64, i64 }, align 16 + %a617 = alloca { ptr, i64, i64 }, align 16 + %a618 = alloca { ptr, i64, i64 }, align 16 + %a619 = alloca { ptr, i64, i64 }, align 16 + %a622 = alloca { ptr, i64, i64 }, align 16 + %a623 = alloca { ptr, i64, i64 }, align 16 + %a624 = alloca { ptr, i64, i64 }, align 16 + %a632 = alloca { ptr, i64, i64 }, align 16 + %a633 = alloca { ptr, i64, i64 }, align 16 + %a643 = alloca { ptr, i64, i64 }, align 16 + %a648 = alloca { ptr, i64, i64 }, align 16 + %a649 = alloca { ptr, i64, i64 }, align 16 + %a663 = alloca { ptr, i64, i64 }, align 16 + %a672 = alloca %S.cimport.CImports, align 16 + %a686 = alloca { ptr, i64, i64 }, align 16 + %a688 = alloca { ptr, i64, i64 }, align 16 + %a689 = alloca { ptr, i64, i64 }, align 16 + %a693 = alloca %S.platform.Target, align 16 + %a694 = alloca %S.platform.Target, align 16 + %a698 = alloca { ptr, i64, i64 }, align 16 + %a700 = alloca { ptr, i64, i64 }, align 16 + %a701 = alloca { ptr, i64, i64 }, align 16 + %a716 = alloca { ptr, i64, i64 }, align 16 + %a718 = alloca { ptr, i64, i64 }, align 16 + %a719 = alloca { ptr, i64, i64 }, align 16 + %a721 = alloca { ptr, i64, i64 }, align 16 + %a732 = alloca { ptr, i64, i64 }, align 16 + %a733 = alloca { ptr, i64, i64 }, align 16 + %a734 = alloca { ptr, i64, i64 }, align 16 + %a737 = alloca { ptr, i64, i64 }, align 16 + %a748 = alloca { ptr, i64, i64 }, align 16 + %a749 = alloca { ptr, i64, i64 }, align 16 + %a750 = alloca { ptr, i64, i64 }, align 16 + %a753 = alloca { ptr, i64, i64 }, align 16 + %a757 = alloca { ptr, i64, i64 }, align 16 + %a762 = alloca { ptr, i64, i64 }, align 16 + %a773 = alloca { ptr, i64, i64 }, align 16 + %a777 = alloca { ptr, i64, i64 }, align 16 + %a778 = alloca { ptr, i64, i64 }, align 16 + %a779 = alloca { ptr, i64, i64 }, align 16 + %a782 = alloca { ptr, i64, i64 }, align 16 + %a783 = alloca { ptr, i64, i64 }, align 16 + %a787 = alloca { ptr, i64, i64 }, align 16 + %a788 = alloca { ptr, i64, i64 }, align 16 + %a792 = alloca { ptr, i64, i64 }, align 16 + %a793 = alloca { ptr, i64, i64 }, align 16 + %a797 = alloca { ptr, i64, i64 }, align 16 + %a798 = alloca { ptr, i64, i64 }, align 16 + %a802 = alloca { ptr, i64, i64 }, align 16 + %a803 = alloca { ptr, i64, i64 }, align 16 + %a809 = alloca { ptr, i64, i64 }, align 16 + %a810 = alloca { ptr, i64, i64 }, align 16 + %a818 = alloca { ptr, i64, i64 }, align 16 + %a819 = alloca { ptr, i64, i64 }, align 16 + %a822 = alloca { ptr, i64, i64 }, align 16 + %a823 = alloca i64, align 16 + %a831 = alloca { ptr, i64, i64 }, align 16 + %a845 = alloca { ptr, i64, i64 }, align 16 + %a846 = alloca { ptr, i64, i64 }, align 16 + %a847 = alloca { ptr, i64, i64 }, align 16 + %a849 = alloca { ptr, i64, i64 }, align 16 + %a850 = alloca { ptr, i64, i64 }, align 16 + %a851 = alloca { ptr, i64, i64 }, align 16 + %a854 = alloca { ptr, i64, i64 }, align 16 + %a855 = alloca { ptr, i64, i64 }, align 16 + %a857 = alloca { ptr, i64, i64 }, align 16 + %a858 = alloca { ptr, i64, i64 }, align 16 + %a859 = alloca { ptr, i64, i64 }, align 16 + %a861 = alloca { ptr, i64, i64 }, align 16 + %a862 = alloca { ptr, i64, i64 }, align 16 + %a864 = alloca i64, align 16 + %a867 = alloca { ptr, i64, i64 }, align 16 + %a868 = alloca { ptr, i64, i64 }, align 16 + %a869 = alloca { ptr, i64, i64 }, align 16 + %a871 = alloca { ptr, i64, i64 }, align 16 + %a872 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t3 = load i64, ptr %t2 + %t4 = icmp eq i64 %t3, 2 + br label %logic.from109 +logic.from109: + br i1 %t4, label %logic.rhs110, label %logic.end111 +logic.rhs110: + %t5 = load { ptr, i64, i64 }, ptr %a1 + %t6 = extractvalue { ptr, i64, i64 } %t5, 1 + %t7 = icmp uge i64 1, %t6 + br i1 %t7, label %range112, label %inrange113 +range112: + call void @finch_panic_index(ptr @.str.137, i64 122, i64 1, i64 %t6) + unreachable +inrange113: + %t8 = extractvalue { ptr, i64, i64 } %t5, 0 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t8, i64 1 + %t10 = load { ptr, i64, i64 }, ptr %t9 + store { ptr, i64, i64 } %t10, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.138, i64 7, i64 0 }, ptr %a12 + %t13 = call i32 @finch_str_eq(ptr %a11, ptr %a12) + %t14 = icmp ne i32 %t13, 0 + br label %logic.from114 +logic.from114: + br i1 %t14, label %logic.end116, label %logic.rhs115 +logic.rhs115: + %t15 = load { ptr, i64, i64 }, ptr %a1 + %t16 = extractvalue { ptr, i64, i64 } %t15, 1 + %t17 = icmp uge i64 1, %t16 + br i1 %t17, label %range117, label %inrange118 +range117: + call void @finch_panic_index(ptr @.str.139, i64 122, i64 1, i64 %t16) + unreachable +inrange118: + %t18 = extractvalue { ptr, i64, i64 } %t15, 0 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i64 1 + %t20 = load { ptr, i64, i64 }, ptr %t19 + store { ptr, i64, i64 } %t20, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.140, i64 9, i64 0 }, ptr %a22 + %t23 = call i32 @finch_str_eq(ptr %a21, ptr %a22) + %t24 = icmp ne i32 %t23, 0 + br label %logic.rend119 +logic.rend119: + br label %logic.end116 +logic.end116: + %t25 = phi i1 [ true, %logic.from114 ], [ %t24, %logic.rend119 ] + br label %logic.rend120 +logic.rend120: + br label %logic.end111 +logic.end111: + %t26 = phi i1 [ false, %logic.from109 ], [ %t25, %logic.rend120 ] + br i1 %t26, label %then121, label %endif123 +then121: + %t27 = extractvalue { ptr, i64, i64 } { ptr @.str.141, i64 46, i64 0 }, 1 + %t28 = trunc i64 %t27 to i32 + %t29 = extractvalue { ptr, i64, i64 } { ptr @.str.141, i64 46, i64 0 }, 0 + %t30 = icmp eq ptr %t29, null + %t31 = select i1 %t30, ptr @.str.142, ptr %t29 + %t32 = call i32 (ptr, ...) @printf(ptr @.str.143, i32 %t28, ptr %t31) + %t33 = call i32 (ptr, ...) @printf(ptr @.str.144) + ret i64 0 +endif123: + %t34 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t35 = load i64, ptr %t34 + %t36 = icmp slt i64 %t35, 3 + br i1 %t36, label %then124, label %endif126 +then124: + call void @finch.main.usage() + br label %endif126 +endif126: + %t37 = load { ptr, i64, i64 }, ptr %a1 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 1, %t38 + br i1 %t39, label %range127, label %inrange128 +range127: + call void @finch_panic_index(ptr @.str.145, i64 129, i64 1, i64 %t38) + unreachable +inrange128: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds { ptr, i64, i64 }, ptr %t40, i64 1 + %t42 = load { ptr, i64, i64 }, ptr %t41 + store { ptr, i64, i64 } %t42, ptr %a43 + call void @finch_str_copy(ptr %a44, ptr %a43) + %t45 = load { ptr, i64, i64 }, ptr %a44 + store { ptr, i64, i64 } %t45, ptr %a46 + %t47 = load { ptr, i64, i64 }, ptr %a1 + %t48 = extractvalue { ptr, i64, i64 } %t47, 1 + %t49 = icmp uge i64 2, %t48 + br i1 %t49, label %range129, label %inrange130 +range129: + call void @finch_panic_index(ptr @.str.146, i64 130, i64 2, i64 %t48) + unreachable +inrange130: + %t50 = extractvalue { ptr, i64, i64 } %t47, 0 + %t51 = getelementptr inbounds { ptr, i64, i64 }, ptr %t50, i64 2 + %t52 = load { ptr, i64, i64 }, ptr %t51 + store { ptr, i64, i64 } %t52, ptr %a53 + call void @finch_str_copy(ptr %a54, ptr %a53) + %t55 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t55, ptr %a56 + %t57 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t57, ptr %a58 + store { ptr, i64, i64 } { ptr @.str.147, i64 5, i64 0 }, ptr %a59 + %t60 = call i32 @finch_str_eq(ptr %a58, ptr %a59) + %t61 = icmp eq i32 %t60, 0 + br label %logic.from131 +logic.from131: + br i1 %t61, label %logic.rhs132, label %logic.end133 +logic.rhs132: + %t62 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t62, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.148, i64 3, i64 0 }, ptr %a64 + %t65 = call i32 @finch_str_eq(ptr %a63, ptr %a64) + %t66 = icmp eq i32 %t65, 0 + br label %logic.rend134 +logic.rend134: + br label %logic.end133 +logic.end133: + %t67 = phi i1 [ false, %logic.from131 ], [ %t66, %logic.rend134 ] + br label %logic.from135 +logic.from135: + br i1 %t67, label %logic.rhs136, label %logic.end137 +logic.rhs136: + %t68 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t68, ptr %a69 + store { ptr, i64, i64 } { ptr @.str.149, i64 2, i64 0 }, ptr %a70 + %t71 = call i32 @finch_str_eq(ptr %a69, ptr %a70) + %t72 = icmp eq i32 %t71, 0 + br label %logic.rend138 +logic.rend138: + br label %logic.end137 +logic.end137: + %t73 = phi i1 [ false, %logic.from135 ], [ %t72, %logic.rend138 ] + br i1 %t73, label %then139, label %endif141 +then139: + call void @finch.main.usage() + br label %endif141 +endif141: + %t74 = load { ptr, i64, i64 }, ptr %a56 + %t75 = call { ptr, i64, i64 } @finch.main.stem({ ptr, i64, i64 } %t74) + store { ptr, i64, i64 } %t75, ptr %a76 + store i1 false, ptr %a77 + store i1 false, ptr %a78 + store i1 false, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.150, i64 0, i64 0 }, ptr %a80 + store { ptr, i64, i64 } { ptr @.str.151, i64 3, i64 0 }, ptr %a81 + store { ptr, i64, i64 } zeroinitializer, ptr %a82 + store { ptr, i64, i64 } zeroinitializer, ptr %a83 + store { ptr, i64, i64 } zeroinitializer, ptr %a84 + store i64 3, ptr %a85 + br label %while.cond142 +while.cond142: + %t86 = load i64, ptr %a85 + %t87 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t88 = load i64, ptr %t87 + %t89 = icmp slt i64 %t86, %t88 + br i1 %t89, label %while.body143, label %while.end144 +while.body143: + %t90 = load i64, ptr %a85 + %t91 = load { ptr, i64, i64 }, ptr %a1 + %t92 = extractvalue { ptr, i64, i64 } %t91, 1 + %t93 = icmp uge i64 %t90, %t92 + br i1 %t93, label %range145, label %inrange146 +range145: + call void @finch_panic_index(ptr @.str.152, i64 145, i64 %t90, i64 %t92) + unreachable +inrange146: + %t94 = extractvalue { ptr, i64, i64 } %t91, 0 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %t94, i64 %t90 + %t96 = load { ptr, i64, i64 }, ptr %t95 + store { ptr, i64, i64 } %t96, ptr %a97 + call void @finch_str_copy(ptr %a98, ptr %a97) + %t99 = load { ptr, i64, i64 }, ptr %a98 + store { ptr, i64, i64 } %t99, ptr %a100 + %t101 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t101, ptr %a102 + store { ptr, i64, i64 } { ptr @.str.153, i64 3, i64 0 }, ptr %a103 + %t104 = call i32 @finch_str_eq(ptr %a102, ptr %a103) + %t105 = icmp ne i32 %t104, 0 + br label %logic.from147 +logic.from147: + br i1 %t105, label %logic.rhs148, label %logic.end149 +logic.rhs148: + %t106 = getelementptr inbounds { ptr, i64, i64 }, ptr %a84, i32 0, i32 1 + %t107 = load i64, ptr %t106 + %t108 = icmp sgt i64 %t107, 0 + br label %logic.rend150 +logic.rend150: + br label %logic.end149 +logic.end149: + %t109 = phi i1 [ false, %logic.from147 ], [ %t108, %logic.rend150 ] + br i1 %t109, label %then151, label %else152 +then151: + %t110 = getelementptr inbounds { ptr, i64, i64 }, ptr %a84, i32 0, i32 1 + %t111 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t111, ptr %a112 + call void @finch_str_copy(ptr %a113, ptr %a112) + %t114 = load { ptr, i64, i64 }, ptr %a113 + %t115 = load i64, ptr %t110 + %t116 = add i64 %t115, 1 + call void @finch_arr_reserve(ptr %a84, i64 %t116, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t117 = load ptr, ptr %a84 + %t118 = getelementptr inbounds { ptr, i64, i64 }, ptr %t117, i64 %t115 + store { ptr, i64, i64 } %t114, ptr %t118 + store i64 %t116, ptr %t110 + br label %endif153 +else152: + %t119 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t119, ptr %a120 + store { ptr, i64, i64 } { ptr @.str.154, i64 2, i64 0 }, ptr %a121 + %t122 = call i32 @finch_str_eq(ptr %a120, ptr %a121) + %t123 = icmp ne i32 %t122, 0 + br label %logic.from154 +logic.from154: + br i1 %t123, label %logic.rhs155, label %logic.end156 +logic.rhs155: + %t124 = load i64, ptr %a85 + %t125 = add i64 %t124, 1 + %t126 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t127 = load i64, ptr %t126 + %t128 = icmp slt i64 %t125, %t127 + br label %logic.rend157 +logic.rend157: + br label %logic.end156 +logic.end156: + %t129 = phi i1 [ false, %logic.from154 ], [ %t128, %logic.rend157 ] + br label %logic.from158 +logic.from158: + br i1 %t129, label %logic.rhs159, label %logic.end160 +logic.rhs159: + %t130 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t130, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.155, i64 5, i64 0 }, ptr %a132 + %t133 = call i32 @finch_str_eq(ptr %a131, ptr %a132) + %t134 = icmp ne i32 %t133, 0 + br label %logic.rend161 +logic.rend161: + br label %logic.end160 +logic.end160: + %t135 = phi i1 [ false, %logic.from158 ], [ %t134, %logic.rend161 ] + br i1 %t135, label %then162, label %else163 +then162: + %t136 = load i64, ptr %a85 + %t137 = add i64 %t136, 1 + %t138 = load { ptr, i64, i64 }, ptr %a1 + %t139 = extractvalue { ptr, i64, i64 } %t138, 1 + %t140 = icmp uge i64 %t137, %t139 + br i1 %t140, label %range165, label %inrange166 +range165: + call void @finch_panic_index(ptr @.str.156, i64 149, i64 %t137, i64 %t139) + unreachable +inrange166: + %t141 = extractvalue { ptr, i64, i64 } %t138, 0 + %t142 = getelementptr inbounds { ptr, i64, i64 }, ptr %t141, i64 %t137 + %t143 = load { ptr, i64, i64 }, ptr %t142 + store { ptr, i64, i64 } %t143, ptr %a144 + call void @finch_str_copy(ptr %a145, ptr %a144) + %t146 = load { ptr, i64, i64 }, ptr %a145 + store { ptr, i64, i64 } %t146, ptr %a76 + store i1 true, ptr %a77 + %t147 = load i64, ptr %a85 + %t148 = add i64 %t147, 1 + store i64 %t148, ptr %a85 + br label %endif164 +else163: + %t149 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t149, ptr %a150 + store { ptr, i64, i64 } { ptr @.str.157, i64 8, i64 0 }, ptr %a151 + %t152 = call i32 @finch_str_eq(ptr %a150, ptr %a151) + %t153 = icmp ne i32 %t152, 0 + br label %logic.from167 +logic.from167: + br i1 %t153, label %logic.rhs168, label %logic.end169 +logic.rhs168: + %t154 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t154, ptr %a155 + store { ptr, i64, i64 } { ptr @.str.158, i64 5, i64 0 }, ptr %a156 + %t157 = call i32 @finch_str_eq(ptr %a155, ptr %a156) + %t158 = icmp ne i32 %t157, 0 + br label %logic.rend170 +logic.rend170: + br label %logic.end169 +logic.end169: + %t159 = phi i1 [ false, %logic.from167 ], [ %t158, %logic.rend170 ] + br i1 %t159, label %then171, label %else172 +then171: + store i1 true, ptr %a78 + br label %endif173 +else172: + %t160 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t160, ptr %a161 + store { ptr, i64, i64 } { ptr @.str.159, i64 3, i64 0 }, ptr %a162 + %t163 = call i32 @finch_str_eq(ptr %a161, ptr %a162) + %t164 = icmp ne i32 %t163, 0 + br i1 %t164, label %then174, label %else175 +then174: + store { ptr, i64, i64 } { ptr @.str.160, i64 3, i64 0 }, ptr %a81 + br label %endif176 +else175: + %t165 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t165, ptr %a166 + store { ptr, i64, i64 } { ptr @.str.161, i64 2, i64 0 }, ptr %a167 + %t168 = call i32 @finch_str_eq(ptr %a166, ptr %a167) + %t169 = icmp ne i32 %t168, 0 + br label %logic.from177 +logic.from177: + br i1 %t169, label %logic.rhs178, label %logic.end179 +logic.rhs178: + %t170 = load i64, ptr %a85 + %t171 = add i64 %t170, 1 + %t172 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t173 = load i64, ptr %t172 + %t174 = icmp slt i64 %t171, %t173 + br label %logic.rend180 +logic.rend180: + br label %logic.end179 +logic.end179: + %t175 = phi i1 [ false, %logic.from177 ], [ %t174, %logic.rend180 ] + br i1 %t175, label %then181, label %else182 +then181: + %t176 = getelementptr inbounds { ptr, i64, i64 }, ptr %a82, i32 0, i32 1 + %t177 = load i64, ptr %a85 + %t178 = add i64 %t177, 1 + %t179 = load { ptr, i64, i64 }, ptr %a1 + %t180 = extractvalue { ptr, i64, i64 } %t179, 1 + %t181 = icmp uge i64 %t178, %t180 + br i1 %t181, label %range184, label %inrange185 +range184: + call void @finch_panic_index(ptr @.str.162, i64 157, i64 %t178, i64 %t180) + unreachable +inrange185: + %t182 = extractvalue { ptr, i64, i64 } %t179, 0 + %t183 = getelementptr inbounds { ptr, i64, i64 }, ptr %t182, i64 %t178 + %t184 = load { ptr, i64, i64 }, ptr %t183 + store { ptr, i64, i64 } %t184, ptr %a185 + call void @finch_str_copy(ptr %a186, ptr %a185) + %t187 = load { ptr, i64, i64 }, ptr %a186 + %t188 = load i64, ptr %t176 + %t189 = add i64 %t188, 1 + call void @finch_arr_reserve(ptr %a82, i64 %t189, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t190 = load ptr, ptr %a82 + %t191 = getelementptr inbounds { ptr, i64, i64 }, ptr %t190, i64 %t188 + store { ptr, i64, i64 } %t187, ptr %t191 + store i64 %t189, ptr %t176 + %t192 = load i64, ptr %a85 + %t193 = add i64 %t192, 1 + store i64 %t193, ptr %a85 + br label %endif183 +else182: + %t194 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t194, ptr %a195 + store { ptr, i64, i64 } { ptr @.str.164, i64 2, i64 0 }, ptr %a197 + %t198 = call i32 @finch_str_starts(ptr %a195, ptr %a197) + %t199 = icmp ne i32 %t198, 0 + br label %logic.from186 +logic.from186: + br i1 %t199, label %logic.rhs187, label %logic.end188 +logic.rhs187: + %t200 = getelementptr inbounds { ptr, i64, i64 }, ptr %a100, i32 0, i32 1 + %t201 = load i64, ptr %t200 + %t202 = icmp sgt i64 %t201, 2 + br label %logic.rend189 +logic.rend189: + br label %logic.end188 +logic.end188: + %t203 = phi i1 [ false, %logic.from186 ], [ %t202, %logic.rend189 ] + br i1 %t203, label %then190, label %else191 +then190: + %t204 = getelementptr inbounds { ptr, i64, i64 }, ptr %a82, i32 0, i32 1 + %t205 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t205, ptr %a206 + %t208 = getelementptr inbounds { ptr, i64, i64 }, ptr %a100, i32 0, i32 1 + %t209 = load i64, ptr %t208 + call void @finch_str_sub(ptr %a207, ptr %a206, i64 2, i64 %t209, ptr @.str.165, i64 160) + %t210 = load { ptr, i64, i64 }, ptr %a207 + %t211 = load i64, ptr %t204 + %t212 = add i64 %t211, 1 + call void @finch_arr_reserve(ptr %a82, i64 %t212, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t213 = load ptr, ptr %a82 + %t214 = getelementptr inbounds { ptr, i64, i64 }, ptr %t213, i64 %t211 + store { ptr, i64, i64 } %t210, ptr %t214 + store i64 %t212, ptr %t204 + br label %endif192 +else191: + %t215 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t215, ptr %a216 + store { ptr, i64, i64 } { ptr @.str.166, i64 2, i64 0 }, ptr %a217 + %t218 = call i32 @finch_str_eq(ptr %a216, ptr %a217) + %t219 = icmp ne i32 %t218, 0 + br label %logic.from193 +logic.from193: + br i1 %t219, label %logic.rhs194, label %logic.end195 +logic.rhs194: + %t220 = load i64, ptr %a85 + %t221 = add i64 %t220, 1 + %t222 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t223 = load i64, ptr %t222 + %t224 = icmp slt i64 %t221, %t223 + br label %logic.rend196 +logic.rend196: + br label %logic.end195 +logic.end195: + %t225 = phi i1 [ false, %logic.from193 ], [ %t224, %logic.rend196 ] + br i1 %t225, label %then197, label %else198 +then197: + %t226 = getelementptr inbounds { ptr, i64, i64 }, ptr %a83, i32 0, i32 1 + %t227 = load i64, ptr %a85 + %t228 = add i64 %t227, 1 + %t229 = load { ptr, i64, i64 }, ptr %a1 + %t230 = extractvalue { ptr, i64, i64 } %t229, 1 + %t231 = icmp uge i64 %t228, %t230 + br i1 %t231, label %range200, label %inrange201 +range200: + call void @finch_panic_index(ptr @.str.167, i64 162, i64 %t228, i64 %t230) + unreachable +inrange201: + %t232 = extractvalue { ptr, i64, i64 } %t229, 0 + %t233 = getelementptr inbounds { ptr, i64, i64 }, ptr %t232, i64 %t228 + %t234 = load { ptr, i64, i64 }, ptr %t233 + store { ptr, i64, i64 } %t234, ptr %a235 + call void @finch_str_copy(ptr %a236, ptr %a235) + %t237 = load { ptr, i64, i64 }, ptr %a236 + %t238 = load i64, ptr %t226 + %t239 = add i64 %t238, 1 + call void @finch_arr_reserve(ptr %a83, i64 %t239, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t240 = load ptr, ptr %a83 + %t241 = getelementptr inbounds { ptr, i64, i64 }, ptr %t240, i64 %t238 + store { ptr, i64, i64 } %t237, ptr %t241 + store i64 %t239, ptr %t226 + %t242 = load i64, ptr %a85 + %t243 = add i64 %t242, 1 + store i64 %t243, ptr %a85 + br label %endif199 +else198: + %t244 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t244, ptr %a245 + store { ptr, i64, i64 } { ptr @.str.168, i64 2, i64 0 }, ptr %a246 + %t247 = call i32 @finch_str_eq(ptr %a245, ptr %a246) + %t248 = icmp ne i32 %t247, 0 + br i1 %t248, label %then202, label %else203 +then202: + store i1 true, ptr %a79 + br label %endif204 +else203: + %t249 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t249, ptr %a250 + store { ptr, i64, i64 } { ptr @.str.169, i64 8, i64 0 }, ptr %a251 + %t252 = call i32 @finch_str_eq(ptr %a250, ptr %a251) + %t253 = icmp ne i32 %t252, 0 + br label %logic.from205 +logic.from205: + br i1 %t253, label %logic.rhs206, label %logic.end207 +logic.rhs206: + %t254 = load i64, ptr %a85 + %t255 = add i64 %t254, 1 + %t256 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t257 = load i64, ptr %t256 + %t258 = icmp slt i64 %t255, %t257 + br label %logic.rend208 +logic.rend208: + br label %logic.end207 +logic.end207: + %t259 = phi i1 [ false, %logic.from205 ], [ %t258, %logic.rend208 ] + br i1 %t259, label %then209, label %else210 +then209: + %t260 = load i64, ptr %a85 + %t261 = add i64 %t260, 1 + %t262 = load { ptr, i64, i64 }, ptr %a1 + %t263 = extractvalue { ptr, i64, i64 } %t262, 1 + %t264 = icmp uge i64 %t261, %t263 + br i1 %t264, label %range212, label %inrange213 +range212: + call void @finch_panic_index(ptr @.str.170, i64 167, i64 %t261, i64 %t263) + unreachable +inrange213: + %t265 = extractvalue { ptr, i64, i64 } %t262, 0 + %t266 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i64 %t261 + %t267 = load { ptr, i64, i64 }, ptr %t266 + store { ptr, i64, i64 } %t267, ptr %a268 + call void @finch_str_copy(ptr %a269, ptr %a268) + %t270 = load { ptr, i64, i64 }, ptr %a269 + store { ptr, i64, i64 } %t270, ptr %a80 + %t271 = load i64, ptr %a85 + %t272 = add i64 %t271, 1 + store i64 %t272, ptr %a85 + br label %endif211 +else210: + %t273 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t273, ptr %a274 + store { ptr, i64, i64 } { ptr @.str.171, i64 3, i64 0 }, ptr %a275 + %t276 = call i32 @finch_str_eq(ptr %a274, ptr %a275) + %t277 = icmp ne i32 %t276, 0 + br i1 %t277, label %then214, label %else215 +then214: + %t278 = getelementptr inbounds { ptr, i64, i64 }, ptr %a84, i32 0, i32 1 + %t279 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t279, ptr %a280 + call void @finch_str_copy(ptr %a281, ptr %a280) + %t282 = load { ptr, i64, i64 }, ptr %a281 + %t283 = load i64, ptr %t278 + %t284 = add i64 %t283, 1 + call void @finch_arr_reserve(ptr %a84, i64 %t284, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t285 = load ptr, ptr %a84 + %t286 = getelementptr inbounds { ptr, i64, i64 }, ptr %t285, i64 %t283 + store { ptr, i64, i64 } %t282, ptr %t286 + store i64 %t284, ptr %t278 + br label %endif216 +else215: + call void @finch.main.usage() + br label %endif216 +endif216: + br label %endif211 +endif211: + br label %endif204 +endif204: + br label %endif199 +endif199: + br label %endif192 +endif192: + br label %endif183 +endif183: + br label %endif176 +endif176: + br label %endif173 +endif173: + br label %endif164 +endif164: + br label %endif153 +endif153: + %t287 = load i64, ptr %a85 + %t288 = add i64 %t287, 1 + store i64 %t288, ptr %a85 + br label %while.cond142 +while.end144: + %t289 = load { ptr, i64, i64 }, ptr %a80 + %t290 = call %S.platform.Target @finch.platform.select({ ptr, i64, i64 } %t289) + store %S.platform.Target %t290, ptr %a291 + %t292 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t292, ptr %a293 + store { ptr, i64, i64 } { ptr @.str.172, i64 3, i64 0 }, ptr %a294 + %t295 = call i32 @finch_str_eq(ptr %a293, ptr %a294) + %t296 = icmp ne i32 %t295, 0 + br i1 %t296, label %then217, label %else218 +then217: + %t297 = load { ptr, i64, i64 }, ptr %a56 + %t298 = call { ptr, i64, i64 } @finch.main.stem({ ptr, i64, i64 } %t297) + store { ptr, i64, i64 } { ptr @.str.173, i64 15, i64 0 }, ptr %a300 + store { ptr, i64, i64 } %t298, ptr %a301 + call void @finch_str_concat(ptr %a299, ptr %a300, ptr %a301) + %t302 = load { ptr, i64, i64 }, ptr %a299 + %t303 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 6 + %t304 = load { ptr, i64, i64 }, ptr %t303 + store { ptr, i64, i64 } %t302, ptr %a306 + store { ptr, i64, i64 } %t304, ptr %a307 + call void @finch_str_concat(ptr %a305, ptr %a306, ptr %a307) + %t308 = load { ptr, i64, i64 }, ptr %a305 + store { ptr, i64, i64 } %t308, ptr %a76 + br label %endif219 +else218: + %t309 = load i1, ptr %a78 + br label %logic.from220 +logic.from220: + br i1 %t309, label %logic.rhs221, label %logic.end222 +logic.rhs221: + %t310 = load i1, ptr %a77 + %t311 = xor i1 %t310, true + br label %logic.rend223 +logic.rend223: + br label %logic.end222 +logic.end222: + %t312 = phi i1 [ false, %logic.from220 ], [ %t311, %logic.rend223 ] + br i1 %t312, label %then224, label %else225 +then224: + %t313 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 1 + %t314 = load i1, ptr %t313 + br i1 %t314, label %then227, label %else228 +then227: + %t315 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t315, ptr %a317 + store { ptr, i64, i64 } { ptr @.str.174, i64 4, i64 0 }, ptr %a318 + call void @finch_str_concat(ptr %a316, ptr %a317, ptr %a318) + %t319 = load { ptr, i64, i64 }, ptr %a316 + store { ptr, i64, i64 } %t319, ptr %a76 + br label %endif229 +else228: + %t320 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 3 + %t321 = load i1, ptr %t320 + br i1 %t321, label %then230, label %else231 +then230: + %t322 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.175, i64 3, i64 0 }, ptr %a324 + store { ptr, i64, i64 } %t322, ptr %a325 + call void @finch_str_concat(ptr %a323, ptr %a324, ptr %a325) + %t326 = load { ptr, i64, i64 }, ptr %a323 + store { ptr, i64, i64 } %t326, ptr %a328 + store { ptr, i64, i64 } { ptr @.str.176, i64 6, i64 0 }, ptr %a329 + call void @finch_str_concat(ptr %a327, ptr %a328, ptr %a329) + %t330 = load { ptr, i64, i64 }, ptr %a327 + store { ptr, i64, i64 } %t330, ptr %a76 + br label %endif232 +else231: + %t331 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.177, i64 3, i64 0 }, ptr %a333 + store { ptr, i64, i64 } %t331, ptr %a334 + call void @finch_str_concat(ptr %a332, ptr %a333, ptr %a334) + %t335 = load { ptr, i64, i64 }, ptr %a332 + store { ptr, i64, i64 } %t335, ptr %a337 + store { ptr, i64, i64 } { ptr @.str.178, i64 3, i64 0 }, ptr %a338 + call void @finch_str_concat(ptr %a336, ptr %a337, ptr %a338) + %t339 = load { ptr, i64, i64 }, ptr %a336 + store { ptr, i64, i64 } %t339, ptr %a76 + br label %endif232 +endif232: + br label %endif229 +endif229: + br label %endif226 +else225: + %t340 = load i1, ptr %a77 + %t341 = xor i1 %t340, true + br i1 %t341, label %then233, label %endif235 +then233: + %t342 = load { ptr, i64, i64 }, ptr %a76 + %t343 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 6 + %t344 = load { ptr, i64, i64 }, ptr %t343 + store { ptr, i64, i64 } %t342, ptr %a346 + store { ptr, i64, i64 } %t344, ptr %a347 + call void @finch_str_concat(ptr %a345, ptr %a346, ptr %a347) + %t348 = load { ptr, i64, i64 }, ptr %a345 + store { ptr, i64, i64 } %t348, ptr %a76 + br label %endif235 +endif235: + br label %endif226 +endif226: + br label %endif219 +endif219: + store %S.main.Loader zeroinitializer, ptr %a349 + %t350 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 3 + store { ptr, i64, i64 } { ptr @.str.179, i64 5, i64 0 }, ptr %t350 + %t351 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 1 + %t352 = load i1, ptr %t351 + br i1 %t352, label %then236, label %else237 +then236: + %t353 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 3 + store { ptr, i64, i64 } { ptr @.str.180, i64 7, i64 0 }, ptr %t353 + br label %endif238 +else237: + %t354 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 3 + %t355 = load i1, ptr %t354 + br i1 %t355, label %then239, label %endif241 +then239: + %t356 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 3 + store { ptr, i64, i64 } { ptr @.str.181, i64 5, i64 0 }, ptr %t356 + br label %endif241 +endif241: + br label %endif238 +endif238: + %t357 = load { ptr, i64, i64 }, ptr %a1 + %t358 = extractvalue { ptr, i64, i64 } %t357, 1 + %t359 = icmp uge i64 0, %t358 + br i1 %t359, label %range242, label %inrange243 +range242: + call void @finch_panic_index(ptr @.str.182, i64 198, i64 0, i64 %t358) + unreachable +inrange243: + %t360 = extractvalue { ptr, i64, i64 } %t357, 0 + %t361 = getelementptr inbounds { ptr, i64, i64 }, ptr %t360, i64 0 + %t362 = load { ptr, i64, i64 }, ptr %t361 + %t363 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t362) + store { ptr, i64, i64 } %t363, ptr %a365 + store { ptr, i64, i64 } { ptr @.str.183, i64 7, i64 0 }, ptr %a366 + call void @finch_str_concat(ptr %a364, ptr %a365, ptr %a366) + %t367 = load { ptr, i64, i64 }, ptr %a364 + %t368 = load { ptr, i64, i64 }, ptr %a1 + %t369 = extractvalue { ptr, i64, i64 } %t368, 1 + %t370 = icmp uge i64 0, %t369 + br i1 %t370, label %range244, label %inrange245 +range244: + call void @finch_panic_index(ptr @.str.184, i64 198, i64 0, i64 %t369) + unreachable +inrange245: + %t371 = extractvalue { ptr, i64, i64 } %t368, 0 + %t372 = getelementptr inbounds { ptr, i64, i64 }, ptr %t371, i64 0 + %t373 = load { ptr, i64, i64 }, ptr %t372 + %t374 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t373) + store { ptr, i64, i64 } %t374, ptr %a376 + store { ptr, i64, i64 } { ptr @.str.185, i64 4, i64 0 }, ptr %a377 + call void @finch_str_concat(ptr %a375, ptr %a376, ptr %a377) + %t378 = load { ptr, i64, i64 }, ptr %a375 + %t379 = mul i64 3, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t380 = call ptr @finch_alloc(i64 %t379) + %t381 = getelementptr inbounds { ptr, i64, i64 }, ptr %t380, i64 0 + store { ptr, i64, i64 } %t367, ptr %t381 + %t382 = getelementptr inbounds { ptr, i64, i64 }, ptr %t380, i64 1 + store { ptr, i64, i64 } %t378, ptr %t382 + %t383 = getelementptr inbounds { ptr, i64, i64 }, ptr %t380, i64 2 + store { ptr, i64, i64 } { ptr @.str.186, i64 3, i64 0 }, ptr %t383 + %t384 = insertvalue { ptr, i64, i64 } undef, ptr %t380, 0 + %t385 = insertvalue { ptr, i64, i64 } %t384, i64 3, 1 + %t386 = insertvalue { ptr, i64, i64 } %t385, i64 3, 2 + store { ptr, i64, i64 } %t386, ptr %a387 + store i64 0, ptr %a388 + br label %each.cond246 +each.cond246: + %t389 = getelementptr inbounds { ptr, i64, i64 }, ptr %a387, i32 0, i32 1 + %t390 = load i64, ptr %t389 + %t391 = load i64, ptr %a388 + %t392 = icmp slt i64 %t391, %t390 + br i1 %t392, label %each.body247, label %each.end249 +each.body247: + %t393 = load ptr, ptr %a387 + %t394 = getelementptr inbounds { ptr, i64, i64 }, ptr %t393, i64 %t391 + %t395 = load { ptr, i64, i64 }, ptr %t394 + store { ptr, i64, i64 } %t395, ptr %a396 + %t397 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 4 + %t398 = getelementptr inbounds { ptr, i64, i64 }, ptr %t397, i32 0, i32 1 + %t399 = load i64, ptr %t398 + %t400 = icmp eq i64 %t399, 0 + br label %logic.from250 +logic.from250: + br i1 %t400, label %logic.rhs251, label %logic.end252 +logic.rhs251: + %t401 = load { ptr, i64, i64 }, ptr %a396 + store { ptr, i64, i64 } %t401, ptr %a403 + store { ptr, i64, i64 } { ptr @.str.187, i64 9, i64 0 }, ptr %a404 + call void @finch_str_concat(ptr %a402, ptr %a403, ptr %a404) + %t405 = load { ptr, i64, i64 }, ptr %a402 + store { ptr, i64, i64 } %t405, ptr %a406 + %t407 = call i32 @finch_file_exists(ptr %a406) + %t408 = icmp ne i32 %t407, 0 + br label %logic.rend253 +logic.rend253: + br label %logic.end252 +logic.end252: + %t409 = phi i1 [ false, %logic.from250 ], [ %t408, %logic.rend253 ] + br i1 %t409, label %then254, label %endif256 +then254: + %t410 = load { ptr, i64, i64 }, ptr %a396 + %t411 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 4 + store { ptr, i64, i64 } %t410, ptr %a412 + call void @finch_str_copy(ptr %a413, ptr %a412) + %t414 = load { ptr, i64, i64 }, ptr %a413 + store { ptr, i64, i64 } %t414, ptr %t411 + br label %endif256 +endif256: + br label %each.step248 +each.step248: + %t415 = load i64, ptr %a388 + %t416 = add i64 %t415, 1 + store i64 %t416, ptr %a388 + br label %each.cond246 +each.end249: + %t417 = extractvalue { ptr, i64, i64 } { ptr @.str.188, i64 10, i64 0 }, 0 + %t418 = icmp eq ptr %t417, null + %t419 = select i1 %t418, ptr @.str.189, ptr %t417 + %t420 = call ptr @getenv(ptr %t419) + store { ptr, i64, i64 } zeroinitializer, ptr %a421 + call void @finch_str_from_c(ptr %a421, ptr %t420) + %t422 = load { ptr, i64, i64 }, ptr %a421 + store { ptr, i64, i64 } %t422, ptr %a423 + store { ptr, i64, i64 } { ptr @.str.191, i64 1, i64 0 }, ptr %a425 + call void @finch_str_split(ptr %a426, ptr %a423, ptr %a425) + %t427 = load { ptr, i64, i64 }, ptr %a426 + store { ptr, i64, i64 } %t427, ptr %a428 + store i64 0, ptr %a429 + br label %each.cond257 +each.cond257: + %t430 = getelementptr inbounds { ptr, i64, i64 }, ptr %a428, i32 0, i32 1 + %t431 = load i64, ptr %t430 + %t432 = load i64, ptr %a429 + %t433 = icmp slt i64 %t432, %t431 + br i1 %t433, label %each.body258, label %each.end260 +each.body258: + %t434 = load ptr, ptr %a428 + %t435 = getelementptr inbounds { ptr, i64, i64 }, ptr %t434, i64 %t432 + %t436 = load { ptr, i64, i64 }, ptr %t435 + store { ptr, i64, i64 } %t436, ptr %a437 + %t438 = getelementptr inbounds { ptr, i64, i64 }, ptr %a437, i32 0, i32 1 + %t439 = load i64, ptr %t438 + %t440 = icmp sgt i64 %t439, 0 + br i1 %t440, label %then261, label %endif263 +then261: + %t441 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 5 + %t442 = getelementptr inbounds { ptr, i64, i64 }, ptr %t441, i32 0, i32 1 + %t443 = load { ptr, i64, i64 }, ptr %a437 + store { ptr, i64, i64 } %t443, ptr %a444 + call void @finch_str_copy(ptr %a445, ptr %a444) + %t446 = load { ptr, i64, i64 }, ptr %a445 + %t447 = load i64, ptr %t442 + %t448 = add i64 %t447, 1 + call void @finch_arr_reserve(ptr %t441, i64 %t448, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t449 = load ptr, ptr %t441 + %t450 = getelementptr inbounds { ptr, i64, i64 }, ptr %t449, i64 %t447 + store { ptr, i64, i64 } %t446, ptr %t450 + store i64 %t448, ptr %t442 + br label %endif263 +endif263: + br label %each.step259 +each.step259: + %t451 = load i64, ptr %a429 + %t452 = add i64 %t451, 1 + store i64 %t452, ptr %a429 + br label %each.cond257 +each.end260: + %t453 = load { ptr, i64, i64 }, ptr %a56 + call void @finch.main.load(ptr %a349, { ptr, i64, i64 } %t453, { ptr, i64, i64 } { ptr @.str.192, i64 0, i64 0 }) + store { ptr, i64, i64 } zeroinitializer, ptr %a454 + store { ptr, i64, i64 } zeroinitializer, ptr %a455 + %t456 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t456, ptr %a457 + call void @finch.copy.arr_str(ptr %a458, ptr %a457) + %t459 = load { ptr, i64, i64 }, ptr %a458 + store { ptr, i64, i64 } %t459, ptr %a460 + %t461 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t461, ptr %a462 + call void @finch.copy.arr_str(ptr %a463, ptr %a462) + %t464 = load { ptr, i64, i64 }, ptr %a463 + store { ptr, i64, i64 } %t464, ptr %a465 + %t466 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 0 + store i64 0, ptr %a467 + br label %each.cond264 +each.cond264: + %t468 = getelementptr inbounds { ptr, i64, i64 }, ptr %t466, i32 0, i32 1 + %t469 = load i64, ptr %t468 + %t470 = load i64, ptr %a467 + %t471 = icmp slt i64 %t470, %t469 + br i1 %t471, label %each.body265, label %each.end267 +each.body265: + %t472 = load ptr, ptr %t466 + %t473 = getelementptr inbounds %S.ast.Program, ptr %t472, i64 %t470 + %t474 = load %S.ast.Program, ptr %t473 + store %S.ast.Program %t474, ptr %a475 + %t476 = getelementptr inbounds %S.ast.Program, ptr %a475, i32 0, i32 1 + %t477 = load { ptr, i64, i64 }, ptr %t476 + %t478 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t477) + store { ptr, i64, i64 } %t478, ptr %a479 + %t480 = getelementptr inbounds { ptr, i64, i64 }, ptr %a460, i32 0, i32 1 + %t481 = load { ptr, i64, i64 }, ptr %a479 + store i64 -1, ptr %a482 + %t483 = load i64, ptr %t480 + %t484 = load ptr, ptr %a460 + store i64 0, ptr %a485 + br label %find.cond268 +find.cond268: + %t486 = load i64, ptr %a485 + %t487 = icmp slt i64 %t486, %t483 + br i1 %t487, label %find.body269, label %find.end272 +find.body269: + %t488 = getelementptr inbounds { ptr, i64, i64 }, ptr %t484, i64 %t486 + %t489 = load { ptr, i64, i64 }, ptr %t488 + store { ptr, i64, i64 } %t489, ptr %a490 + store { ptr, i64, i64 } %t481, ptr %a491 + %t492 = call i32 @finch_str_eq(ptr %a490, ptr %a491) + %t493 = icmp ne i32 %t492, 0 + br i1 %t493, label %find.hit270, label %find.next271 +find.hit270: + store i64 %t486, ptr %a482 + br label %find.end272 +find.next271: + %t494 = add i64 %t486, 1 + store i64 %t494, ptr %a485 + br label %find.cond268 +find.end272: + %t495 = load i64, ptr %a482 + %t496 = icmp sge i64 %t495, 0 + %t497 = xor i1 %t496, true + br i1 %t497, label %then273, label %endif275 +then273: + %t498 = getelementptr inbounds { ptr, i64, i64 }, ptr %a460, i32 0, i32 1 + %t499 = load { ptr, i64, i64 }, ptr %a479 + store { ptr, i64, i64 } %t499, ptr %a500 + call void @finch_str_copy(ptr %a501, ptr %a500) + %t502 = load { ptr, i64, i64 }, ptr %a501 + %t503 = load i64, ptr %t498 + %t504 = add i64 %t503, 1 + call void @finch_arr_reserve(ptr %a460, i64 %t504, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t505 = load ptr, ptr %a460 + %t506 = getelementptr inbounds { ptr, i64, i64 }, ptr %t505, i64 %t503 + store { ptr, i64, i64 } %t502, ptr %t506 + store i64 %t504, ptr %t498 + br label %endif275 +endif275: + %t507 = getelementptr inbounds %S.ast.Program, ptr %a475, i32 0, i32 3 + %t508 = getelementptr inbounds { ptr, i64, i64 }, ptr %t507, i32 0, i32 1 + %t509 = load i64, ptr %t508 + store i64 0, ptr %a510 + br label %for.cond276 +for.cond276: + %t511 = load i64, ptr %a510 + %t512 = icmp slt i64 %t511, %t509 + br i1 %t512, label %for.body277, label %for.end279 +for.body277: + %t513 = getelementptr inbounds { ptr, i64, i64 }, ptr %a455, i32 0, i32 1 + %t514 = getelementptr inbounds %S.ast.Program, ptr %a475, i32 0, i32 3 + %t515 = load i64, ptr %a510 + %t516 = load { ptr, i64, i64 }, ptr %t514 + %t517 = extractvalue { ptr, i64, i64 } %t516, 1 + %t518 = icmp uge i64 %t515, %t517 + br i1 %t518, label %range280, label %inrange281 +range280: + call void @finch_panic_index(ptr @.str.193, i64 221, i64 %t515, i64 %t517) + unreachable +inrange281: + %t519 = extractvalue { ptr, i64, i64 } %t516, 0 + %t520 = getelementptr inbounds { ptr, i64, i64 }, ptr %t519, i64 %t515 + %t521 = load { ptr, i64, i64 }, ptr %t520 + store i64 -1, ptr %a522 + %t523 = load i64, ptr %t513 + %t524 = load ptr, ptr %a455 + store i64 0, ptr %a525 + br label %find.cond282 +find.cond282: + %t526 = load i64, ptr %a525 + %t527 = icmp slt i64 %t526, %t523 + br i1 %t527, label %find.body283, label %find.end286 +find.body283: + %t528 = getelementptr inbounds { ptr, i64, i64 }, ptr %t524, i64 %t526 + %t529 = load { ptr, i64, i64 }, ptr %t528 + store { ptr, i64, i64 } %t529, ptr %a530 + store { ptr, i64, i64 } %t521, ptr %a531 + %t532 = call i32 @finch_str_eq(ptr %a530, ptr %a531) + %t533 = icmp ne i32 %t532, 0 + br i1 %t533, label %find.hit284, label %find.next285 +find.hit284: + store i64 %t526, ptr %a522 + br label %find.end286 +find.next285: + %t534 = add i64 %t526, 1 + store i64 %t534, ptr %a525 + br label %find.cond282 +find.end286: + %t535 = load i64, ptr %a522 + %t536 = icmp sge i64 %t535, 0 + %t537 = xor i1 %t536, true + br i1 %t537, label %then287, label %endif289 +then287: + %t538 = getelementptr inbounds { ptr, i64, i64 }, ptr %a455, i32 0, i32 1 + %t539 = getelementptr inbounds %S.ast.Program, ptr %a475, i32 0, i32 3 + %t540 = load i64, ptr %a510 + %t541 = load { ptr, i64, i64 }, ptr %t539 + %t542 = extractvalue { ptr, i64, i64 } %t541, 1 + %t543 = icmp uge i64 %t540, %t542 + br i1 %t543, label %range290, label %inrange291 +range290: + call void @finch_panic_index(ptr @.str.194, i64 222, i64 %t540, i64 %t542) + unreachable +inrange291: + %t544 = extractvalue { ptr, i64, i64 } %t541, 0 + %t545 = getelementptr inbounds { ptr, i64, i64 }, ptr %t544, i64 %t540 + %t546 = load { ptr, i64, i64 }, ptr %t545 + store { ptr, i64, i64 } %t546, ptr %a547 + call void @finch_str_copy(ptr %a548, ptr %a547) + %t549 = load { ptr, i64, i64 }, ptr %a548 + %t550 = load i64, ptr %t538 + %t551 = add i64 %t550, 1 + call void @finch_arr_reserve(ptr %a455, i64 %t551, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t552 = load ptr, ptr %a455 + %t553 = getelementptr inbounds { ptr, i64, i64 }, ptr %t552, i64 %t550 + store { ptr, i64, i64 } %t549, ptr %t553 + store i64 %t551, ptr %t538 + %t554 = getelementptr inbounds { ptr, i64, i64 }, ptr %a454, i32 0, i32 1 + %t555 = getelementptr inbounds %S.ast.Program, ptr %a475, i32 0, i32 3 + %t556 = load i64, ptr %a510 + %t557 = load { ptr, i64, i64 }, ptr %t555 + %t558 = extractvalue { ptr, i64, i64 } %t557, 1 + %t559 = icmp uge i64 %t556, %t558 + br i1 %t559, label %range292, label %inrange293 +range292: + call void @finch_panic_index(ptr @.str.195, i64 223, i64 %t556, i64 %t558) + unreachable +inrange293: + %t560 = extractvalue { ptr, i64, i64 } %t557, 0 + %t561 = getelementptr inbounds { ptr, i64, i64 }, ptr %t560, i64 %t556 + %t562 = load { ptr, i64, i64 }, ptr %t561 + store { ptr, i64, i64 } %t562, ptr %a563 + call void @finch_str_copy(ptr %a564, ptr %a563) + %t565 = load { ptr, i64, i64 }, ptr %a564 + %t566 = insertvalue %S.cimport.Header zeroinitializer, { ptr, i64, i64 } %t565, 0 + %t567 = getelementptr inbounds %S.ast.Program, ptr %a475, i32 0, i32 4 + %t568 = load i64, ptr %a510 + %t569 = load { ptr, i64, i64 }, ptr %t567 + %t570 = extractvalue { ptr, i64, i64 } %t569, 1 + %t571 = icmp uge i64 %t568, %t570 + br i1 %t571, label %range294, label %inrange295 +range294: + call void @finch_panic_index(ptr @.str.196, i64 223, i64 %t568, i64 %t570) + unreachable +inrange295: + %t572 = extractvalue { ptr, i64, i64 } %t569, 0 + %t573 = getelementptr inbounds { ptr, i64, i64 }, ptr %t572, i64 %t568 + %t574 = load { ptr, i64, i64 }, ptr %t573 + store { ptr, i64, i64 } %t574, ptr %a575 + call void @finch_str_copy(ptr %a576, ptr %a575) + %t577 = load { ptr, i64, i64 }, ptr %a576 + %t578 = insertvalue %S.cimport.Header %t566, { ptr, i64, i64 } %t577, 1 + %t579 = load i64, ptr %t554 + %t580 = add i64 %t579, 1 + call void @finch_arr_reserve(ptr %a454, i64 %t580, i64 ptrtoint (ptr getelementptr (%S.cimport.Header, ptr null, i32 1) to i64)) + %t581 = load ptr, ptr %a454 + %t582 = getelementptr inbounds %S.cimport.Header, ptr %t581, i64 %t579 + store %S.cimport.Header %t578, ptr %t582 + store i64 %t580, ptr %t554 + br label %endif289 +endif289: + br label %for.step278 +for.step278: + %t583 = load i64, ptr %a510 + %t584 = add i64 %t583, 1 + store i64 %t584, ptr %a510 + br label %for.cond276 +for.end279: + %t585 = getelementptr inbounds %S.ast.Program, ptr %a475, i32 0, i32 5 + store i64 0, ptr %a586 + br label %each.cond296 +each.cond296: + %t587 = getelementptr inbounds { ptr, i64, i64 }, ptr %t585, i32 0, i32 1 + %t588 = load i64, ptr %t587 + %t589 = load i64, ptr %a586 + %t590 = icmp slt i64 %t589, %t588 + br i1 %t590, label %each.body297, label %each.end299 +each.body297: + %t591 = load ptr, ptr %t585 + %t592 = getelementptr inbounds { ptr, i64, i64 }, ptr %t591, i64 %t589 + %t593 = load { ptr, i64, i64 }, ptr %t592 + store { ptr, i64, i64 } %t593, ptr %a594 + %t595 = load { ptr, i64, i64 }, ptr %a594 + store { ptr, i64, i64 } %t595, ptr %a596 + store { ptr, i64, i64 } { ptr @.str.198, i64 2, i64 0 }, ptr %a598 + %t599 = call i32 @finch_str_ends(ptr %a596, ptr %a598) + %t600 = icmp ne i32 %t599, 0 + br label %logic.from300 +logic.from300: + br i1 %t600, label %logic.end302, label %logic.rhs301 +logic.rhs301: + %t601 = load { ptr, i64, i64 }, ptr %a594 + store { ptr, i64, i64 } %t601, ptr %a602 + store { ptr, i64, i64 } { ptr @.str.200, i64 2, i64 0 }, ptr %a604 + %t605 = call i32 @finch_str_ends(ptr %a602, ptr %a604) + %t606 = icmp ne i32 %t605, 0 + br label %logic.rend303 +logic.rend303: + br label %logic.end302 +logic.end302: + %t607 = phi i1 [ true, %logic.from300 ], [ %t606, %logic.rend303 ] + br label %logic.from304 +logic.from304: + br i1 %t607, label %logic.end306, label %logic.rhs305 +logic.rhs305: + %t608 = load { ptr, i64, i64 }, ptr %a594 + store { ptr, i64, i64 } %t608, ptr %a609 + store { ptr, i64, i64 } { ptr @.str.202, i64 2, i64 0 }, ptr %a611 + %t612 = call i32 @finch_str_ends(ptr %a609, ptr %a611) + %t613 = icmp ne i32 %t612, 0 + br label %logic.rend307 +logic.rend307: + br label %logic.end306 +logic.end306: + %t614 = phi i1 [ true, %logic.from304 ], [ %t613, %logic.rend307 ] + br i1 %t614, label %then308, label %else309 +then308: + %t615 = getelementptr inbounds { ptr, i64, i64 }, ptr %a465, i32 0, i32 1 + %t616 = load { ptr, i64, i64 }, ptr %a479 + store { ptr, i64, i64 } %t616, ptr %a618 + store { ptr, i64, i64 } { ptr @.str.203, i64 1, i64 0 }, ptr %a619 + call void @finch_str_concat(ptr %a617, ptr %a618, ptr %a619) + %t620 = load { ptr, i64, i64 }, ptr %a617 + %t621 = load { ptr, i64, i64 }, ptr %a594 + store { ptr, i64, i64 } %t620, ptr %a623 + store { ptr, i64, i64 } %t621, ptr %a624 + call void @finch_str_concat(ptr %a622, ptr %a623, ptr %a624) + %t625 = load { ptr, i64, i64 }, ptr %a622 + %t626 = load i64, ptr %t615 + %t627 = add i64 %t626, 1 + call void @finch_arr_reserve(ptr %a465, i64 %t627, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t628 = load ptr, ptr %a465 + %t629 = getelementptr inbounds { ptr, i64, i64 }, ptr %t628, i64 %t626 + store { ptr, i64, i64 } %t625, ptr %t629 + store i64 %t627, ptr %t615 + br label %endif310 +else309: + %t630 = getelementptr inbounds { ptr, i64, i64 }, ptr %a465, i32 0, i32 1 + %t631 = load { ptr, i64, i64 }, ptr %a594 + store { ptr, i64, i64 } %t631, ptr %a632 + call void @finch_str_copy(ptr %a633, ptr %a632) + %t634 = load { ptr, i64, i64 }, ptr %a633 + %t635 = load i64, ptr %t630 + %t636 = add i64 %t635, 1 + call void @finch_arr_reserve(ptr %a465, i64 %t636, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t637 = load ptr, ptr %a465 + %t638 = getelementptr inbounds { ptr, i64, i64 }, ptr %t637, i64 %t635 + store { ptr, i64, i64 } %t634, ptr %t638 + store i64 %t636, ptr %t630 + br label %endif310 +endif310: + br label %each.step298 +each.step298: + %t639 = load i64, ptr %a586 + %t640 = add i64 %t639, 1 + store i64 %t640, ptr %a586 + br label %each.cond296 +each.end299: + br label %each.step266 +each.step266: + %t641 = load i64, ptr %a467 + %t642 = add i64 %t641, 1 + store i64 %t642, ptr %a467 + br label %each.cond264 +each.end267: + store { ptr, i64, i64 } { ptr @.str.204, i64 0, i64 0 }, ptr %a643 + %t644 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 5 + %t645 = load i1, ptr %t644 + br i1 %t645, label %then311, label %endif313 +then311: + %t646 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 0 + %t647 = load { ptr, i64, i64 }, ptr %t646 + store { ptr, i64, i64 } %t647, ptr %a648 + call void @finch_str_copy(ptr %a649, ptr %a648) + %t650 = load { ptr, i64, i64 }, ptr %a649 + store { ptr, i64, i64 } %t650, ptr %a643 + br label %endif313 +endif313: + %t651 = load { ptr, i64, i64 }, ptr %a454 + %t652 = load { ptr, i64, i64 }, ptr %a460 + %t653 = load { ptr, i64, i64 }, ptr %a643 + %t654 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 1 + %t655 = load i1, ptr %t654 + %t656 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 7 + %t657 = load { ptr, i64, i64 }, ptr %t656 + %t658 = call { i1, %S.cimport.CImports, { ptr, i64, i64 } } @finch.cimport.importHeaders({ ptr, i64, i64 } %t651, { ptr, i64, i64 } %t652, { ptr, i64, i64 } %t653, i1 %t655, { ptr, i64, i64 } %t657) + %t659 = extractvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t658, 0 + %t660 = xor i1 %t659, true + %t661 = extractvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t658, 2 + %t662 = extractvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t658, 1 + br i1 %t660, label %or.failed314, label %or.ok315 +or.failed314: + store { ptr, i64, i64 } %t661, ptr %a663 + %t664 = load { ptr, i64, i64 }, ptr %a663 + %t665 = extractvalue { ptr, i64, i64 } %t664, 1 + %t666 = trunc i64 %t665 to i32 + %t667 = extractvalue { ptr, i64, i64 } %t664, 0 + %t668 = icmp eq ptr %t667, null + %t669 = select i1 %t668, ptr @.str.205, ptr %t667 + %t670 = call i32 (ptr, ...) @printf(ptr @.str.206, i32 %t666, ptr %t669) + %t671 = call i32 (ptr, ...) @printf(ptr @.str.207) + ret i64 1 +or.ok315: + store %S.cimport.CImports %t662, ptr %a672 + %t673 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 0 + %t674 = load { ptr, i64, i64 }, ptr %t673 + %t675 = getelementptr inbounds %S.main.Loader, ptr %a349, i32 0, i32 1 + %t676 = load { ptr, i64, i64 }, ptr %t675 + %t677 = load %S.cimport.CImports, ptr %a672 + %t678 = load i1, ptr %a78 + %t679 = insertvalue %S.gen.Options zeroinitializer, i1 %t678, 0 + %t680 = load i1, ptr %a79 + %t681 = insertvalue %S.gen.Options %t679, i1 %t680, 1 + %t682 = extractvalue { ptr, i64, i64 } { ptr @.str.208, i64 3, i64 0 }, 0 + %t683 = icmp eq ptr %t682, null + %t684 = select i1 %t683, ptr @.str.209, ptr %t682 + %t685 = call ptr @getenv(ptr %t684) + store { ptr, i64, i64 } zeroinitializer, ptr %a686 + call void @finch_str_from_c(ptr %a686, ptr %t685) + %t687 = load { ptr, i64, i64 }, ptr %a686 + store { ptr, i64, i64 } %t687, ptr %a688 + call void @finch_str_copy(ptr %a689, ptr %a688) + %t690 = load { ptr, i64, i64 }, ptr %a689 + %t691 = insertvalue %S.gen.Options %t681, { ptr, i64, i64 } %t690, 2 + %t692 = load %S.platform.Target, ptr %a291 + store %S.platform.Target %t692, ptr %a693 + call void @finch.copy.S_platform_Target(ptr %a694, ptr %a693) + %t695 = load %S.platform.Target, ptr %a694 + %t696 = insertvalue %S.gen.Options %t691, %S.platform.Target %t695, 3 + %t697 = call { ptr, i64, i64 } @finch.gen.generate({ ptr, i64, i64 } %t674, { ptr, i64, i64 } %t676, %S.cimport.CImports %t677, %S.gen.Options %t696) + store { ptr, i64, i64 } %t697, ptr %a698 + %t699 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t699, ptr %a700 + store { ptr, i64, i64 } { ptr @.str.210, i64 2, i64 0 }, ptr %a701 + %t702 = call i32 @finch_str_eq(ptr %a700, ptr %a701) + %t703 = icmp ne i32 %t702, 0 + br i1 %t703, label %then316, label %endif318 +then316: + %t704 = load { ptr, i64, i64 }, ptr %a698 + %t705 = extractvalue { ptr, i64, i64 } %t704, 1 + %t706 = trunc i64 %t705 to i32 + %t707 = extractvalue { ptr, i64, i64 } %t704, 0 + %t708 = icmp eq ptr %t707, null + %t709 = select i1 %t708, ptr @.str.211, ptr %t707 + %t710 = call i32 (ptr, ...) @printf(ptr @.str.212, i32 %t706, ptr %t709) + %t711 = call i32 (ptr, ...) @printf(ptr @.str.213) + ret i64 0 +endif318: + %t712 = extractvalue { ptr, i64, i64 } { ptr @.str.214, i64 8, i64 0 }, 0 + %t713 = icmp eq ptr %t712, null + %t714 = select i1 %t713, ptr @.str.215, ptr %t712 + %t715 = call ptr @getenv(ptr %t714) + store { ptr, i64, i64 } zeroinitializer, ptr %a716 + call void @finch_str_from_c(ptr %a716, ptr %t715) + %t717 = load { ptr, i64, i64 }, ptr %a716 + store { ptr, i64, i64 } %t717, ptr %a718 + call void @finch_str_copy(ptr %a719, ptr %a718) + %t720 = load { ptr, i64, i64 }, ptr %a719 + store { ptr, i64, i64 } %t720, ptr %a721 + %t722 = getelementptr inbounds { ptr, i64, i64 }, ptr %a721, i32 0, i32 1 + %t723 = load i64, ptr %t722 + %t724 = icmp eq i64 %t723, 0 + br i1 %t724, label %then319, label %endif321 +then319: + %t725 = load { ptr, i64, i64 }, ptr %a1 + %t726 = extractvalue { ptr, i64, i64 } %t725, 1 + %t727 = icmp uge i64 0, %t726 + br i1 %t727, label %range322, label %inrange323 +range322: + call void @finch_panic_index(ptr @.str.216, i64 251, i64 0, i64 %t726) + unreachable +inrange323: + %t728 = extractvalue { ptr, i64, i64 } %t725, 0 + %t729 = getelementptr inbounds { ptr, i64, i64 }, ptr %t728, i64 0 + %t730 = load { ptr, i64, i64 }, ptr %t729 + %t731 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t730) + store { ptr, i64, i64 } %t731, ptr %a733 + store { ptr, i64, i64 } { ptr @.str.217, i64 22, i64 0 }, ptr %a734 + call void @finch_str_concat(ptr %a732, ptr %a733, ptr %a734) + %t735 = load { ptr, i64, i64 }, ptr %a732 + store { ptr, i64, i64 } %t735, ptr %a721 + br label %endif321 +endif321: + %t736 = load { ptr, i64, i64 }, ptr %a721 + store { ptr, i64, i64 } %t736, ptr %a737 + %t738 = call i32 @finch_file_exists(ptr %a737) + %t739 = icmp ne i32 %t738, 0 + %t740 = xor i1 %t739, true + br i1 %t740, label %then324, label %endif326 +then324: + %t741 = load { ptr, i64, i64 }, ptr %a1 + %t742 = extractvalue { ptr, i64, i64 } %t741, 1 + %t743 = icmp uge i64 0, %t742 + br i1 %t743, label %range327, label %inrange328 +range327: + call void @finch_panic_index(ptr @.str.218, i64 254, i64 0, i64 %t742) + unreachable +inrange328: + %t744 = extractvalue { ptr, i64, i64 } %t741, 0 + %t745 = getelementptr inbounds { ptr, i64, i64 }, ptr %t744, i64 0 + %t746 = load { ptr, i64, i64 }, ptr %t745 + %t747 = call { ptr, i64, i64 } @finch.main.dirOf({ ptr, i64, i64 } %t746) + store { ptr, i64, i64 } %t747, ptr %a749 + store { ptr, i64, i64 } { ptr @.str.219, i64 19, i64 0 }, ptr %a750 + call void @finch_str_concat(ptr %a748, ptr %a749, ptr %a750) + %t751 = load { ptr, i64, i64 }, ptr %a748 + store { ptr, i64, i64 } %t751, ptr %a721 + br label %endif326 +endif326: + %t752 = load { ptr, i64, i64 }, ptr %a721 + store { ptr, i64, i64 } %t752, ptr %a753 + %t754 = call i32 @finch_file_exists(ptr %a753) + %t755 = icmp ne i32 %t754, 0 + %t756 = xor i1 %t755, true + br label %logic.from329 +logic.from329: + br i1 %t756, label %logic.rhs330, label %logic.end331 +logic.rhs330: + store { ptr, i64, i64 } { ptr @.str.220, i64 18, i64 0 }, ptr %a757 + %t758 = call i32 @finch_file_exists(ptr %a757) + %t759 = icmp ne i32 %t758, 0 + br label %logic.rend332 +logic.rend332: + br label %logic.end331 +logic.end331: + %t760 = phi i1 [ false, %logic.from329 ], [ %t759, %logic.rend332 ] + br i1 %t760, label %then333, label %endif335 +then333: + store { ptr, i64, i64 } { ptr @.str.221, i64 18, i64 0 }, ptr %a721 + br label %endif335 +endif335: + %t761 = load { ptr, i64, i64 }, ptr %a721 + store { ptr, i64, i64 } %t761, ptr %a762 + %t763 = call i32 @finch_file_exists(ptr %a762) + %t764 = icmp ne i32 %t763, 0 + %t765 = xor i1 %t764, true + br i1 %t765, label %then336, label %endif338 +then336: + %t766 = extractvalue { ptr, i64, i64 } { ptr @.str.222, i64 56, i64 0 }, 1 + %t767 = trunc i64 %t766 to i32 + %t768 = extractvalue { ptr, i64, i64 } { ptr @.str.222, i64 56, i64 0 }, 0 + %t769 = icmp eq ptr %t768, null + %t770 = select i1 %t769, ptr @.str.223, ptr %t768 + %t771 = call i32 (ptr, ...) @printf(ptr @.str.224, i32 %t767, ptr %t770) + %t772 = call i32 (ptr, ...) @printf(ptr @.str.225) + ret i64 1 +endif338: + store { ptr, i64, i64 } { ptr @.str.226, i64 0, i64 0 }, ptr %a773 + %t774 = load i1, ptr %a78 + br i1 %t774, label %then339, label %endif341 +then339: + store { ptr, i64, i64 } { ptr @.str.227, i64 6, i64 0 }, ptr %a773 + br label %endif341 +endif341: + %t775 = load i1, ptr %a79 + br i1 %t775, label %then342, label %endif344 +then342: + %t776 = load { ptr, i64, i64 }, ptr %a773 + store { ptr, i64, i64 } %t776, ptr %a778 + store { ptr, i64, i64 } { ptr @.str.228, i64 3, i64 0 }, ptr %a779 + call void @finch_str_concat(ptr %a777, ptr %a778, ptr %a779) + %t780 = load { ptr, i64, i64 }, ptr %a777 + store { ptr, i64, i64 } %t780, ptr %a773 + br label %endif344 +endif344: + %t781 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t781, ptr %a782 + call void @finch_str_copy(ptr %a783, ptr %a782) + %t784 = load { ptr, i64, i64 }, ptr %a783 + %t785 = insertvalue %S.linker.Build zeroinitializer, { ptr, i64, i64 } %t784, 0 + %t786 = load { ptr, i64, i64 }, ptr %a698 + store { ptr, i64, i64 } %t786, ptr %a787 + call void @finch_str_copy(ptr %a788, ptr %a787) + %t789 = load { ptr, i64, i64 }, ptr %a788 + %t790 = insertvalue %S.linker.Build %t785, { ptr, i64, i64 } %t789, 1 + %t791 = load { ptr, i64, i64 }, ptr %a721 + store { ptr, i64, i64 } %t791, ptr %a792 + call void @finch_str_copy(ptr %a793, ptr %a792) + %t794 = load { ptr, i64, i64 }, ptr %a793 + %t795 = insertvalue %S.linker.Build %t790, { ptr, i64, i64 } %t794, 2 + %t796 = load { ptr, i64, i64 }, ptr %a81 + store { ptr, i64, i64 } %t796, ptr %a797 + call void @finch_str_copy(ptr %a798, ptr %a797) + %t799 = load { ptr, i64, i64 }, ptr %a798 + %t800 = insertvalue %S.linker.Build %t795, { ptr, i64, i64 } %t799, 3 + %t801 = load { ptr, i64, i64 }, ptr %a773 + store { ptr, i64, i64 } %t801, ptr %a802 + call void @finch_str_copy(ptr %a803, ptr %a802) + %t804 = load { ptr, i64, i64 }, ptr %a803 + %t805 = insertvalue %S.linker.Build %t800, { ptr, i64, i64 } %t804, 4 + %t806 = load i1, ptr %a78 + %t807 = insertvalue %S.linker.Build %t805, i1 %t806, 5 + %t808 = load { ptr, i64, i64 }, ptr %a465 + store { ptr, i64, i64 } %t808, ptr %a809 + call void @finch.copy.arr_str(ptr %a810, ptr %a809) + %t811 = load { ptr, i64, i64 }, ptr %a810 + %t812 = insertvalue %S.linker.Build %t807, { ptr, i64, i64 } %t811, 6 + %t813 = load %S.platform.Target, ptr %a291 + %t814 = load %S.cimport.CImports, ptr %a672 + %t815 = call i64 @finch.linker.build(%S.linker.Build %t812, %S.platform.Target %t813, %S.cimport.CImports %t814) + %t816 = icmp ne i64 %t815, 0 + br i1 %t816, label %then345, label %endif347 +then345: + ret i64 1 +endif347: + %t817 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t817, ptr %a818 + store { ptr, i64, i64 } { ptr @.str.229, i64 3, i64 0 }, ptr %a819 + %t820 = call i32 @finch_str_eq(ptr %a818, ptr %a819) + %t821 = icmp ne i32 %t820, 0 + br i1 %t821, label %then348, label %endif350 +then348: + store { ptr, i64, i64 } zeroinitializer, ptr %a822 + store i64 0, ptr %a823 + br label %each.cond351 +each.cond351: + %t824 = getelementptr inbounds { ptr, i64, i64 }, ptr %a84, i32 0, i32 1 + %t825 = load i64, ptr %t824 + %t826 = load i64, ptr %a823 + %t827 = icmp slt i64 %t826, %t825 + br i1 %t827, label %each.body352, label %each.end354 +each.body352: + %t828 = load ptr, ptr %a84 + %t829 = getelementptr inbounds { ptr, i64, i64 }, ptr %t828, i64 %t826 + %t830 = load { ptr, i64, i64 }, ptr %t829 + store { ptr, i64, i64 } %t830, ptr %a831 + %t832 = getelementptr inbounds { ptr, i64, i64 }, ptr %a822, i32 0, i32 1 + %t833 = load { ptr, i64, i64 }, ptr %a831 + %t834 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t833) + %t835 = load i64, ptr %t832 + %t836 = add i64 %t835, 1 + call void @finch_arr_reserve(ptr %a822, i64 %t836, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t837 = load ptr, ptr %a822 + %t838 = getelementptr inbounds { ptr, i64, i64 }, ptr %t837, i64 %t835 + store { ptr, i64, i64 } %t834, ptr %t838 + store i64 %t836, ptr %t832 + br label %each.step353 +each.step353: + %t839 = load i64, ptr %a823 + %t840 = add i64 %t839, 1 + store i64 %t840, ptr %a823 + br label %each.cond351 +each.end354: + %t841 = getelementptr inbounds %S.platform.Target, ptr %a291, i32 0, i32 8 + %t842 = load { ptr, i64, i64 }, ptr %t841 + %t843 = load { ptr, i64, i64 }, ptr %a76 + %t844 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t843) + store { ptr, i64, i64 } %t842, ptr %a846 + store { ptr, i64, i64 } %t844, ptr %a847 + call void @finch_str_concat(ptr %a845, ptr %a846, ptr %a847) + %t848 = load { ptr, i64, i64 }, ptr %a845 + store { ptr, i64, i64 } %t848, ptr %a850 + store { ptr, i64, i64 } { ptr @.str.230, i64 1, i64 0 }, ptr %a851 + call void @finch_str_concat(ptr %a849, ptr %a850, ptr %a851) + %t852 = load { ptr, i64, i64 }, ptr %a849 + %t853 = getelementptr inbounds { ptr, i64, i64 }, ptr %a822, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.231, i64 1, i64 0 }, ptr %a854 + call void @finch_str_join(ptr %a855, ptr %a822, ptr %a854) + %t856 = load { ptr, i64, i64 }, ptr %a855 + store { ptr, i64, i64 } %t852, ptr %a858 + store { ptr, i64, i64 } %t856, ptr %a859 + call void @finch_str_concat(ptr %a857, ptr %a858, ptr %a859) + %t860 = load { ptr, i64, i64 }, ptr %a857 + store { ptr, i64, i64 } %t860, ptr %a862 + call void @finch_str_copy(ptr %a861, ptr %a862) + %t863 = call i64 @finch_shell(ptr %a861) + store i64 %t863, ptr %a864 + %t865 = load { ptr, i64, i64 }, ptr %a76 + %t866 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t865) + store { ptr, i64, i64 } { ptr @.str.232, i64 6, i64 0 }, ptr %a868 + store { ptr, i64, i64 } %t866, ptr %a869 + call void @finch_str_concat(ptr %a867, ptr %a868, ptr %a869) + %t870 = load { ptr, i64, i64 }, ptr %a867 + store { ptr, i64, i64 } %t870, ptr %a872 + call void @finch_str_copy(ptr %a871, ptr %a872) + %t873 = call i64 @finch_shell(ptr %a871) + %t874 = load i64, ptr %a864 + ret i64 %t874 +endif350: + ret i64 0 +} + +define internal i1 @finch.lexer.isAlpha(i8 %p0) { +entry: + %a1 = alloca i8, align 16 + store i8 %p0, ptr %a1 + %t2 = load i8, ptr %a1 + %t3 = icmp uge i8 %t2, 97 + br label %logic.from355 +logic.from355: + br i1 %t3, label %logic.rhs356, label %logic.end357 +logic.rhs356: + %t4 = load i8, ptr %a1 + %t5 = icmp ule i8 %t4, 122 + br label %logic.rend358 +logic.rend358: + br label %logic.end357 +logic.end357: + %t6 = phi i1 [ false, %logic.from355 ], [ %t5, %logic.rend358 ] + br label %logic.from359 +logic.from359: + br i1 %t6, label %logic.end361, label %logic.rhs360 +logic.rhs360: + %t7 = load i8, ptr %a1 + %t8 = icmp uge i8 %t7, 65 + br label %logic.from362 +logic.from362: + br i1 %t8, label %logic.rhs363, label %logic.end364 +logic.rhs363: + %t9 = load i8, ptr %a1 + %t10 = icmp ule i8 %t9, 90 + br label %logic.rend365 +logic.rend365: + br label %logic.end364 +logic.end364: + %t11 = phi i1 [ false, %logic.from362 ], [ %t10, %logic.rend365 ] + br label %logic.rend366 +logic.rend366: + br label %logic.end361 +logic.end361: + %t12 = phi i1 [ true, %logic.from359 ], [ %t11, %logic.rend366 ] + br label %logic.from367 +logic.from367: + br i1 %t12, label %logic.end369, label %logic.rhs368 +logic.rhs368: + %t13 = load i8, ptr %a1 + %t14 = icmp eq i8 %t13, 95 + br label %logic.rend370 +logic.rend370: + br label %logic.end369 +logic.end369: + %t15 = phi i1 [ true, %logic.from367 ], [ %t14, %logic.rend370 ] + ret i1 %t15 +} + +define internal i1 @finch.lexer.isDigit(i8 %p0) { +entry: + %a1 = alloca i8, align 16 + store i8 %p0, ptr %a1 + %t2 = load i8, ptr %a1 + %t3 = icmp uge i8 %t2, 48 + br label %logic.from371 +logic.from371: + br i1 %t3, label %logic.rhs372, label %logic.end373 +logic.rhs372: + %t4 = load i8, ptr %a1 + %t5 = icmp ule i8 %t4, 57 + br label %logic.rend374 +logic.rend374: + br label %logic.end373 +logic.end373: + %t6 = phi i1 [ false, %logic.from371 ], [ %t5, %logic.rend374 ] + ret i1 %t6 +} + +define internal i1 @finch.lexer.isHex(i8 %p0) { +entry: + %a1 = alloca i8, align 16 + store i8 %p0, ptr %a1 + %t2 = load i8, ptr %a1 + %t3 = call i1 @finch.lexer.isDigit(i8 %t2) + br label %logic.from375 +logic.from375: + br i1 %t3, label %logic.end377, label %logic.rhs376 +logic.rhs376: + %t4 = load i8, ptr %a1 + %t5 = icmp uge i8 %t4, 97 + br label %logic.from378 +logic.from378: + br i1 %t5, label %logic.rhs379, label %logic.end380 +logic.rhs379: + %t6 = load i8, ptr %a1 + %t7 = icmp ule i8 %t6, 102 + br label %logic.rend381 +logic.rend381: + br label %logic.end380 +logic.end380: + %t8 = phi i1 [ false, %logic.from378 ], [ %t7, %logic.rend381 ] + br label %logic.rend382 +logic.rend382: + br label %logic.end377 +logic.end377: + %t9 = phi i1 [ true, %logic.from375 ], [ %t8, %logic.rend382 ] + br label %logic.from383 +logic.from383: + br i1 %t9, label %logic.end385, label %logic.rhs384 +logic.rhs384: + %t10 = load i8, ptr %a1 + %t11 = icmp uge i8 %t10, 65 + br label %logic.from386 +logic.from386: + br i1 %t11, label %logic.rhs387, label %logic.end388 +logic.rhs387: + %t12 = load i8, ptr %a1 + %t13 = icmp ule i8 %t12, 70 + br label %logic.rend389 +logic.rend389: + br label %logic.end388 +logic.end388: + %t14 = phi i1 [ false, %logic.from386 ], [ %t13, %logic.rend389 ] + br label %logic.rend390 +logic.rend390: + br label %logic.end385 +logic.end385: + %t15 = phi i1 [ true, %logic.from383 ], [ %t14, %logic.rend390 ] + ret i1 %t15 +} + +define internal i1 @finch.lexer.isKeyword({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca i64, align 16 + %a34 = alloca i64, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = mul i64 21, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t3 = call ptr @finch_alloc(i64 %t2) + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 0 + store { ptr, i64, i64 } { ptr @.str.233, i64 2, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 1 + store { ptr, i64, i64 } { ptr @.str.234, i64 6, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 2 + store { ptr, i64, i64 } { ptr @.str.235, i64 2, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 3 + store { ptr, i64, i64 } { ptr @.str.236, i64 4, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 4 + store { ptr, i64, i64 } { ptr @.str.237, i64 5, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 5 + store { ptr, i64, i64 } { ptr @.str.238, i64 3, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 6 + store { ptr, i64, i64 } { ptr @.str.239, i64 2, i64 0 }, ptr %t10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 7 + store { ptr, i64, i64 } { ptr @.str.240, i64 5, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 8 + store { ptr, i64, i64 } { ptr @.str.241, i64 8, i64 0 }, ptr %t12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 9 + store { ptr, i64, i64 } { ptr @.str.242, i64 4, i64 0 }, ptr %t13 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 10 + store { ptr, i64, i64 } { ptr @.str.243, i64 5, i64 0 }, ptr %t14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 11 + store { ptr, i64, i64 } { ptr @.str.244, i64 4, i64 0 }, ptr %t15 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 12 + store { ptr, i64, i64 } { ptr @.str.245, i64 6, i64 0 }, ptr %t16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 13 + store { ptr, i64, i64 } { ptr @.str.246, i64 4, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 14 + store { ptr, i64, i64 } { ptr @.str.247, i64 6, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 15 + store { ptr, i64, i64 } { ptr @.str.248, i64 5, i64 0 }, ptr %t19 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 16 + store { ptr, i64, i64 } { ptr @.str.249, i64 2, i64 0 }, ptr %t20 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 17 + store { ptr, i64, i64 } { ptr @.str.250, i64 3, i64 0 }, ptr %t21 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 18 + store { ptr, i64, i64 } { ptr @.str.251, i64 4, i64 0 }, ptr %t22 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 19 + store { ptr, i64, i64 } { ptr @.str.252, i64 5, i64 0 }, ptr %t23 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 20 + store { ptr, i64, i64 } { ptr @.str.253, i64 6, i64 0 }, ptr %t24 + %t25 = insertvalue { ptr, i64, i64 } undef, ptr %t3, 0 + %t26 = insertvalue { ptr, i64, i64 } %t25, i64 21, 1 + %t27 = insertvalue { ptr, i64, i64 } %t26, i64 21, 2 + store { ptr, i64, i64 } %t27, ptr %a28 + %t29 = getelementptr inbounds { ptr, i64, i64 }, ptr %a28, i32 0, i32 1 + %t30 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a31 + %t32 = load i64, ptr %t29 + %t33 = load ptr, ptr %a28 + store i64 0, ptr %a34 + br label %find.cond391 +find.cond391: + %t35 = load i64, ptr %a34 + %t36 = icmp slt i64 %t35, %t32 + br i1 %t36, label %find.body392, label %find.end395 +find.body392: + %t37 = getelementptr inbounds { ptr, i64, i64 }, ptr %t33, i64 %t35 + %t38 = load { ptr, i64, i64 }, ptr %t37 + store { ptr, i64, i64 } %t38, ptr %a39 + store { ptr, i64, i64 } %t30, ptr %a40 + %t41 = call i32 @finch_str_eq(ptr %a39, ptr %a40) + %t42 = icmp ne i32 %t41, 0 + br i1 %t42, label %find.hit393, label %find.next394 +find.hit393: + store i64 %t35, ptr %a31 + br label %find.end395 +find.next394: + %t43 = add i64 %t35, 1 + store i64 %t43, ptr %a34 + br label %find.cond391 +find.end395: + %t44 = load i64, ptr %a31 + %t45 = icmp sge i64 %t44, 0 + ret i1 %t45 +} + +define internal void @finch.lexer.fail(ptr %p0, i64 %p1, i64 %p2, { ptr, i64, i64 } %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a3 = alloca i64, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + store i64 %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic396, label %ok397 +panic396: + call void @finch_panic(ptr @.str.254, i64 41, ptr @.str.255) + unreachable +ok397: + %t7 = getelementptr inbounds %S.lexer.Lexer, ptr %t5, i32 0, i32 1 + %t8 = load { ptr, i64, i64 }, ptr %t7 + store { ptr, i64, i64 } %t8, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.256, i64 1, i64 0 }, ptr %a11 + call void @finch_str_concat(ptr %a9, ptr %a10, ptr %a11) + %t12 = load { ptr, i64, i64 }, ptr %a9 + %t13 = load i64, ptr %a2 + call void @finch_str_from_int(ptr %a14, i64 %t13) + %t15 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t12, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t19, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.257, i64 1, i64 0 }, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + %t24 = load i64, ptr %a3 + call void @finch_str_from_int(ptr %a25, i64 %t24) + %t26 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t23, ptr %a28 + store { ptr, i64, i64 } %t26, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t30, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.258, i64 9, i64 0 }, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t34, ptr %a37 + store { ptr, i64, i64 } %t35, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + %t40 = extractvalue { ptr, i64, i64 } %t39, 1 + %t41 = trunc i64 %t40 to i32 + %t42 = extractvalue { ptr, i64, i64 } %t39, 0 + %t43 = icmp eq ptr %t42, null + %t44 = select i1 %t43, ptr @.str.259, ptr %t42 + %t45 = call i32 (ptr, ...) @printf(ptr @.str.260, i32 %t41, ptr %t44) + %t46 = call i32 (ptr, ...) @printf(ptr @.str.261) + %t47 = trunc i64 1 to i32 + %t48 = call i32 @fflush(ptr null) + call void @exit(i32 %t47) + ret void +} + +define internal i8 @finch.lexer.peek(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic398, label %ok399 +panic398: + call void @finch_panic(ptr @.str.262, i64 46, ptr @.str.263) + unreachable +ok399: + %t5 = getelementptr inbounds %S.lexer.Lexer, ptr %t3, i32 0, i32 2 + %t6 = load i64, ptr %t5 + %t7 = load i64, ptr %a2 + %t8 = add i64 %t6, %t7 + %t9 = load ptr, ptr %a1 + %t10 = icmp eq ptr %t9, null + br i1 %t10, label %panic400, label %ok401 +panic400: + call void @finch_panic(ptr @.str.264, i64 46, ptr @.str.265) + unreachable +ok401: + %t11 = getelementptr inbounds %S.lexer.Lexer, ptr %t9, i32 0, i32 0 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t11, i32 0, i32 1 + %t13 = load i64, ptr %t12 + %t14 = icmp slt i64 %t8, %t13 + br i1 %t14, label %then402, label %endif404 +then402: + %t15 = load ptr, ptr %a1 + %t16 = icmp eq ptr %t15, null + br i1 %t16, label %panic405, label %ok406 +panic405: + call void @finch_panic(ptr @.str.266, i64 47, ptr @.str.267) + unreachable +ok406: + %t17 = getelementptr inbounds %S.lexer.Lexer, ptr %t15, i32 0, i32 0 + %t18 = load ptr, ptr %a1 + %t19 = icmp eq ptr %t18, null + br i1 %t19, label %panic407, label %ok408 +panic407: + call void @finch_panic(ptr @.str.268, i64 47, ptr @.str.269) + unreachable +ok408: + %t20 = getelementptr inbounds %S.lexer.Lexer, ptr %t18, i32 0, i32 2 + %t21 = load i64, ptr %t20 + %t22 = load i64, ptr %a2 + %t23 = add i64 %t21, %t22 + %t24 = load { ptr, i64, i64 }, ptr %t17 + %t25 = extractvalue { ptr, i64, i64 } %t24, 1 + %t26 = icmp uge i64 %t23, %t25 + br i1 %t26, label %range409, label %inrange410 +range409: + call void @finch_panic_index(ptr @.str.270, i64 47, i64 %t23, i64 %t25) + unreachable +inrange410: + %t27 = extractvalue { ptr, i64, i64 } %t24, 0 + %t28 = getelementptr inbounds i8, ptr %t27, i64 %t23 + %t29 = load i8, ptr %t28 + ret i8 %t29 +endif404: + %t30 = trunc i64 0 to i8 + ret i8 %t30 +} + +define internal void @finch.lexer.advance(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a15 = alloca i8, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic411, label %ok412 +panic411: + call void @finch_panic(ptr @.str.271, i64 53, ptr @.str.272) + unreachable +ok412: + %t4 = getelementptr inbounds %S.lexer.Lexer, ptr %t2, i32 0, i32 0 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic413, label %ok414 +panic413: + call void @finch_panic(ptr @.str.273, i64 53, ptr @.str.274) + unreachable +ok414: + %t7 = getelementptr inbounds %S.lexer.Lexer, ptr %t5, i32 0, i32 2 + %t8 = load i64, ptr %t7 + %t9 = load { ptr, i64, i64 }, ptr %t4 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 %t8, %t10 + br i1 %t11, label %range415, label %inrange416 +range415: + call void @finch_panic_index(ptr @.str.275, i64 53, i64 %t8, i64 %t10) + unreachable +inrange416: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds i8, ptr %t12, i64 %t8 + %t14 = load i8, ptr %t13 + store i8 %t14, ptr %a15 + %t16 = load i8, ptr %a15 + %t17 = icmp eq i8 %t16, 10 + br i1 %t17, label %then417, label %else418 +then417: + %t18 = load ptr, ptr %a1 + %t19 = icmp eq ptr %t18, null + br i1 %t19, label %panic420, label %ok421 +panic420: + call void @finch_panic(ptr @.str.276, i64 55, ptr @.str.277) + unreachable +ok421: + %t20 = getelementptr inbounds %S.lexer.Lexer, ptr %t18, i32 0, i32 3 + %t21 = load i64, ptr %t20 + %t22 = add i64 %t21, 1 + store i64 %t22, ptr %t20 + %t23 = load ptr, ptr %a1 + %t24 = icmp eq ptr %t23, null + br i1 %t24, label %panic422, label %ok423 +panic422: + call void @finch_panic(ptr @.str.278, i64 56, ptr @.str.279) + unreachable +ok423: + %t25 = getelementptr inbounds %S.lexer.Lexer, ptr %t23, i32 0, i32 4 + store i64 1, ptr %t25 + %t26 = load ptr, ptr %a1 + %t27 = icmp eq ptr %t26, null + br i1 %t27, label %panic424, label %ok425 +panic424: + call void @finch_panic(ptr @.str.280, i64 57, ptr @.str.281) + unreachable +ok425: + %t28 = getelementptr inbounds %S.lexer.Lexer, ptr %t26, i32 0, i32 5 + store i1 true, ptr %t28 + br label %endif419 +else418: + %t29 = load i8, ptr %a15 + %t30 = zext i8 %t29 to i64 + %t31 = and i64 %t30, 192 + %t32 = icmp ne i64 %t31, 128 + br i1 %t32, label %then426, label %endif428 +then426: + %t33 = load ptr, ptr %a1 + %t34 = icmp eq ptr %t33, null + br i1 %t34, label %panic429, label %ok430 +panic429: + call void @finch_panic(ptr @.str.282, i64 59, ptr @.str.283) + unreachable +ok430: + %t35 = getelementptr inbounds %S.lexer.Lexer, ptr %t33, i32 0, i32 4 + %t36 = load i64, ptr %t35 + %t37 = add i64 %t36, 1 + store i64 %t37, ptr %t35 + br label %endif428 +endif428: + br label %endif419 +endif419: + %t38 = load ptr, ptr %a1 + %t39 = icmp eq ptr %t38, null + br i1 %t39, label %panic431, label %ok432 +panic431: + call void @finch_panic(ptr @.str.284, i64 61, ptr @.str.285) + unreachable +ok432: + %t40 = getelementptr inbounds %S.lexer.Lexer, ptr %t38, i32 0, i32 2 + %t41 = load i64, ptr %t40 + %t42 = add i64 %t41, 1 + store i64 %t42, ptr %t40 + ret void +} + +define internal { ptr, i64, i64 } @finch.lexer.operator(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca i64, align 16 + %a57 = alloca i64, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = mul i64 16, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t3 = call ptr @finch_alloc(i64 %t2) + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 0 + store { ptr, i64, i64 } { ptr @.str.286, i64 2, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 1 + store { ptr, i64, i64 } { ptr @.str.287, i64 2, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 2 + store { ptr, i64, i64 } { ptr @.str.288, i64 2, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 3 + store { ptr, i64, i64 } { ptr @.str.289, i64 2, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 4 + store { ptr, i64, i64 } { ptr @.str.290, i64 2, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 5 + store { ptr, i64, i64 } { ptr @.str.291, i64 2, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 6 + store { ptr, i64, i64 } { ptr @.str.292, i64 2, i64 0 }, ptr %t10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 7 + store { ptr, i64, i64 } { ptr @.str.293, i64 2, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 8 + store { ptr, i64, i64 } { ptr @.str.294, i64 2, i64 0 }, ptr %t12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 9 + store { ptr, i64, i64 } { ptr @.str.295, i64 2, i64 0 }, ptr %t13 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 10 + store { ptr, i64, i64 } { ptr @.str.296, i64 2, i64 0 }, ptr %t14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 11 + store { ptr, i64, i64 } { ptr @.str.297, i64 2, i64 0 }, ptr %t15 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 12 + store { ptr, i64, i64 } { ptr @.str.298, i64 2, i64 0 }, ptr %t16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 13 + store { ptr, i64, i64 } { ptr @.str.299, i64 2, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 14 + store { ptr, i64, i64 } { ptr @.str.300, i64 2, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 15 + store { ptr, i64, i64 } { ptr @.str.301, i64 2, i64 0 }, ptr %t19 + %t20 = insertvalue { ptr, i64, i64 } undef, ptr %t3, 0 + %t21 = insertvalue { ptr, i64, i64 } %t20, i64 16, 1 + %t22 = insertvalue { ptr, i64, i64 } %t21, i64 16, 2 + store { ptr, i64, i64 } %t22, ptr %a23 + %t24 = load ptr, ptr %a1 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic433, label %ok434 +panic433: + call void @finch_panic(ptr @.str.302, i64 67, ptr @.str.303) + unreachable +ok434: + %t26 = getelementptr inbounds %S.lexer.Lexer, ptr %t24, i32 0, i32 2 + %t27 = load i64, ptr %t26 + %t28 = add i64 %t27, 1 + %t29 = load ptr, ptr %a1 + %t30 = icmp eq ptr %t29, null + br i1 %t30, label %panic435, label %ok436 +panic435: + call void @finch_panic(ptr @.str.304, i64 67, ptr @.str.305) + unreachable +ok436: + %t31 = getelementptr inbounds %S.lexer.Lexer, ptr %t29, i32 0, i32 0 + %t32 = getelementptr inbounds { ptr, i64, i64 }, ptr %t31, i32 0, i32 1 + %t33 = load i64, ptr %t32 + %t34 = icmp slt i64 %t28, %t33 + br i1 %t34, label %then437, label %endif439 +then437: + %t35 = load ptr, ptr %a1 + %t36 = icmp eq ptr %t35, null + br i1 %t36, label %panic440, label %ok441 +panic440: + call void @finch_panic(ptr @.str.306, i64 68, ptr @.str.307) + unreachable +ok441: + %t37 = getelementptr inbounds %S.lexer.Lexer, ptr %t35, i32 0, i32 0 + %t38 = load { ptr, i64, i64 }, ptr %t37 + store { ptr, i64, i64 } %t38, ptr %a39 + %t41 = load ptr, ptr %a1 + %t42 = icmp eq ptr %t41, null + br i1 %t42, label %panic442, label %ok443 +panic442: + call void @finch_panic(ptr @.str.309, i64 68, ptr @.str.310) + unreachable +ok443: + %t43 = getelementptr inbounds %S.lexer.Lexer, ptr %t41, i32 0, i32 2 + %t44 = load i64, ptr %t43 + %t45 = load ptr, ptr %a1 + %t46 = icmp eq ptr %t45, null + br i1 %t46, label %panic444, label %ok445 +panic444: + call void @finch_panic(ptr @.str.311, i64 68, ptr @.str.312) + unreachable +ok445: + %t47 = getelementptr inbounds %S.lexer.Lexer, ptr %t45, i32 0, i32 2 + %t48 = load i64, ptr %t47 + %t49 = add i64 %t48, 2 + call void @finch_str_sub(ptr %a40, ptr %a39, i64 %t44, i64 %t49, ptr @.str.308, i64 68) + %t50 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t50, ptr %a51 + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %a23, i32 0, i32 1 + %t53 = load { ptr, i64, i64 }, ptr %a51 + store i64 -1, ptr %a54 + %t55 = load i64, ptr %t52 + %t56 = load ptr, ptr %a23 + store i64 0, ptr %a57 + br label %find.cond446 +find.cond446: + %t58 = load i64, ptr %a57 + %t59 = icmp slt i64 %t58, %t55 + br i1 %t59, label %find.body447, label %find.end450 +find.body447: + %t60 = getelementptr inbounds { ptr, i64, i64 }, ptr %t56, i64 %t58 + %t61 = load { ptr, i64, i64 }, ptr %t60 + store { ptr, i64, i64 } %t61, ptr %a62 + store { ptr, i64, i64 } %t53, ptr %a63 + %t64 = call i32 @finch_str_eq(ptr %a62, ptr %a63) + %t65 = icmp ne i32 %t64, 0 + br i1 %t65, label %find.hit448, label %find.next449 +find.hit448: + store i64 %t58, ptr %a54 + br label %find.end450 +find.next449: + %t66 = add i64 %t58, 1 + store i64 %t66, ptr %a57 + br label %find.cond446 +find.end450: + %t67 = load i64, ptr %a54 + %t68 = icmp sge i64 %t67, 0 + br i1 %t68, label %then451, label %endif453 +then451: + %t69 = load { ptr, i64, i64 }, ptr %a51 + ret { ptr, i64, i64 } %t69 +endif453: + br label %endif439 +endif439: + store { ptr, i64, i64 } { ptr @.str.313, i64 22, i64 0 }, ptr %a70 + %t71 = load ptr, ptr %a1 + %t72 = icmp eq ptr %t71, null + br i1 %t72, label %panic454, label %ok455 +panic454: + call void @finch_panic(ptr @.str.314, i64 74, ptr @.str.315) + unreachable +ok455: + %t73 = getelementptr inbounds %S.lexer.Lexer, ptr %t71, i32 0, i32 0 + %t74 = load { ptr, i64, i64 }, ptr %t73 + store { ptr, i64, i64 } %t74, ptr %a75 + %t77 = load ptr, ptr %a1 + %t78 = icmp eq ptr %t77, null + br i1 %t78, label %panic456, label %ok457 +panic456: + call void @finch_panic(ptr @.str.317, i64 74, ptr @.str.318) + unreachable +ok457: + %t79 = getelementptr inbounds %S.lexer.Lexer, ptr %t77, i32 0, i32 2 + %t80 = load i64, ptr %t79 + %t81 = load ptr, ptr %a1 + %t82 = icmp eq ptr %t81, null + br i1 %t82, label %panic458, label %ok459 +panic458: + call void @finch_panic(ptr @.str.319, i64 74, ptr @.str.320) + unreachable +ok459: + %t83 = getelementptr inbounds %S.lexer.Lexer, ptr %t81, i32 0, i32 2 + %t84 = load i64, ptr %t83 + %t85 = add i64 %t84, 1 + call void @finch_str_sub(ptr %a76, ptr %a75, i64 %t80, i64 %t85, ptr @.str.316, i64 74) + %t86 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t86, ptr %a87 + %t88 = load { ptr, i64, i64 }, ptr %a70 + store { ptr, i64, i64 } %t88, ptr %a89 + %t91 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t91, ptr %a92 + %t93 = call i64 @finch_str_find(ptr %a89, ptr %a92) + %t94 = icmp sge i64 %t93, 0 + br i1 %t94, label %then460, label %endif462 +then460: + %t95 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t95, ptr %a96 + call void @finch_str_copy(ptr %a97, ptr %a96) + %t98 = load { ptr, i64, i64 }, ptr %a97 + ret { ptr, i64, i64 } %t98 +endif462: + ret { ptr, i64, i64 } { ptr @.str.322, i64 0, i64 0 } +} + +define internal i8 @finch.lexer.escape(ptr %p0, i8 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i8, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i8 %p1, ptr %a2 + %t3 = load i8, ptr %a2 + %t4 = icmp eq i8 %t3, 110 + br i1 %t4, label %then463, label %endif465 +then463: + ret i8 10 +endif465: + %t5 = load i8, ptr %a2 + %t6 = icmp eq i8 %t5, 116 + br i1 %t6, label %then466, label %endif468 +then466: + ret i8 9 +endif468: + %t7 = load i8, ptr %a2 + %t8 = icmp eq i8 %t7, 114 + br i1 %t8, label %then469, label %endif471 +then469: + ret i8 13 +endif471: + %t9 = load i8, ptr %a2 + %t10 = icmp eq i8 %t9, 48 + br i1 %t10, label %then472, label %endif474 +then472: + %t11 = trunc i64 0 to i8 + ret i8 %t11 +endif474: + %t12 = load i8, ptr %a2 + %t13 = icmp eq i8 %t12, 92 + br label %logic.from475 +logic.from475: + br i1 %t13, label %logic.end477, label %logic.rhs476 +logic.rhs476: + %t14 = load i8, ptr %a2 + %t15 = icmp eq i8 %t14, 34 + br label %logic.rend478 +logic.rend478: + br label %logic.end477 +logic.end477: + %t16 = phi i1 [ true, %logic.from475 ], [ %t15, %logic.rend478 ] + br label %logic.from479 +logic.from479: + br i1 %t16, label %logic.end481, label %logic.rhs480 +logic.rhs480: + %t17 = load i8, ptr %a2 + %t18 = icmp eq i8 %t17, 39 + br label %logic.rend482 +logic.rend482: + br label %logic.end481 +logic.end481: + %t19 = phi i1 [ true, %logic.from479 ], [ %t18, %logic.rend482 ] + br i1 %t19, label %then483, label %endif485 +then483: + %t20 = load i8, ptr %a2 + ret i8 %t20 +endif485: + %t21 = load ptr, ptr %a1 + %t22 = load ptr, ptr %a1 + %t23 = icmp eq ptr %t22, null + br i1 %t23, label %panic486, label %ok487 +panic486: + call void @finch_panic(ptr @.str.323, i64 97, ptr @.str.324) + unreachable +ok487: + %t24 = getelementptr inbounds %S.lexer.Lexer, ptr %t22, i32 0, i32 3 + %t25 = load i64, ptr %t24 + %t26 = load ptr, ptr %a1 + %t27 = icmp eq ptr %t26, null + br i1 %t27, label %panic488, label %ok489 +panic488: + call void @finch_panic(ptr @.str.325, i64 97, ptr @.str.326) + unreachable +ok489: + %t28 = getelementptr inbounds %S.lexer.Lexer, ptr %t26, i32 0, i32 4 + %t29 = load i64, ptr %t28 + %t30 = sub i64 %t29, 1 + %t31 = load i8, ptr %a2 + call void @finch_str_from_char(ptr %a32, i8 signext %t31) + %t33 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.327, i64 16, i64 0 }, ptr %a35 + store { ptr, i64, i64 } %t33, ptr %a36 + call void @finch_str_concat(ptr %a34, ptr %a35, ptr %a36) + %t37 = load { ptr, i64, i64 }, ptr %a34 + call void @finch.lexer.fail(ptr %t21, i64 %t25, i64 %t30, { ptr, i64, i64 } %t37) + %t38 = load i8, ptr %a2 + ret i8 %t38 +} + +define internal void @finch.copy.S_lexer_Token(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.lexer.Token, ptr %src + store %S.lexer.Token %t1, ptr %dst + %t2 = getelementptr inbounds %S.lexer.Token, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.lexer.Token, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.lexer.Token, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.lexer.Token, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + ret void +} + +define internal void @finch.copy.arr_S_lexer_Token(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.lexer.Token, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond796 +n.cond796: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body797, label %n.end798 +n.body797: + %t8 = getelementptr inbounds %S.lexer.Token, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.lexer.Token, ptr %t2, i64 %t6 + call void @finch.copy.S_lexer_Token(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond796 +n.end798: + ret void +} + +define internal { ptr, i64, i64 } @finch.lexer.lex({ ptr, i64, i64 } %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca %S.lexer.Lexer, align 16 + %a18 = alloca ptr, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca i8, align 16 + %a98 = alloca i64, align 16 + %a103 = alloca i64, align 16 + %a169 = alloca %S.lexer.Token, align 16 + %a177 = alloca i64, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca { ptr, i64, i64 }, align 16 + %a395 = alloca { ptr, i64, i64 }, align 16 + %a396 = alloca { ptr, i64, i64 }, align 16 + %a403 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a405 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a415 = alloca i8, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a448 = alloca i8, align 16 + %a454 = alloca i8, align 16 + %a461 = alloca { ptr, i64, i64 }, align 16 + %a469 = alloca { ptr, i64, i64 }, align 16 + %a470 = alloca { ptr, i64, i64 }, align 16 + %a487 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca i64, align 16 + %a504 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a518 = alloca { ptr, i64, i64 }, align 16 + %a530 = alloca { ptr, i64, i64 }, align 16 + %a531 = alloca { ptr, i64, i64 }, align 16 + %a532 = alloca { ptr, i64, i64 }, align 16 + %a534 = alloca { ptr, i64, i64 }, align 16 + %a535 = alloca { ptr, i64, i64 }, align 16 + %a536 = alloca { ptr, i64, i64 }, align 16 + %a539 = alloca { ptr, i64, i64 }, align 16 + %a540 = alloca { ptr, i64, i64 }, align 16 + %a541 = alloca { ptr, i64, i64 }, align 16 + %a545 = alloca i64, align 16 + %a553 = alloca { ptr, i64, i64 }, align 16 + %a554 = alloca { ptr, i64, i64 }, align 16 + %a558 = alloca { ptr, i64, i64 }, align 16 + %a559 = alloca { ptr, i64, i64 }, align 16 + %a563 = alloca %S.lexer.Token, align 16 + %a564 = alloca %S.lexer.Token, align 16 + %a589 = alloca { ptr, i64, i64 }, align 16 + %a590 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t3, ptr %a4 + call void @finch_str_copy(ptr %a5, ptr %a4) + %t6 = load { ptr, i64, i64 }, ptr %a5 + %t7 = insertvalue %S.lexer.Lexer zeroinitializer, { ptr, i64, i64 } %t6, 0 + %t8 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t8, ptr %a9 + call void @finch_str_copy(ptr %a10, ptr %a9) + %t11 = load { ptr, i64, i64 }, ptr %a10 + %t12 = insertvalue %S.lexer.Lexer %t7, { ptr, i64, i64 } %t11, 1 + %t13 = insertvalue %S.lexer.Lexer %t12, i64 0, 2 + %t14 = insertvalue %S.lexer.Lexer %t13, i64 1, 3 + %t15 = insertvalue %S.lexer.Lexer %t14, i64 1, 4 + %t16 = insertvalue %S.lexer.Lexer %t15, i1 true, 5 + store %S.lexer.Lexer %t16, ptr %a17 + store ptr %a17, ptr %a18 + store { ptr, i64, i64 } zeroinitializer, ptr %a19 + br label %while.cond490 +while.cond490: + %t20 = load ptr, ptr %a18 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic493, label %ok494 +panic493: + call void @finch_panic(ptr @.str.328, i64 105, ptr @.str.329) + unreachable +ok494: + %t22 = getelementptr inbounds %S.lexer.Lexer, ptr %t20, i32 0, i32 2 + %t23 = load i64, ptr %t22 + %t24 = load ptr, ptr %a18 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic495, label %ok496 +panic495: + call void @finch_panic(ptr @.str.330, i64 105, ptr @.str.331) + unreachable +ok496: + %t26 = getelementptr inbounds %S.lexer.Lexer, ptr %t24, i32 0, i32 0 + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %t26, i32 0, i32 1 + %t28 = load i64, ptr %t27 + %t29 = icmp slt i64 %t23, %t28 + br i1 %t29, label %while.body491, label %while.end492 +while.body491: + %t30 = load ptr, ptr %a18 + %t31 = icmp eq ptr %t30, null + br i1 %t31, label %panic497, label %ok498 +panic497: + call void @finch_panic(ptr @.str.332, i64 106, ptr @.str.333) + unreachable +ok498: + %t32 = getelementptr inbounds %S.lexer.Lexer, ptr %t30, i32 0, i32 0 + %t33 = load ptr, ptr %a18 + %t34 = icmp eq ptr %t33, null + br i1 %t34, label %panic499, label %ok500 +panic499: + call void @finch_panic(ptr @.str.334, i64 106, ptr @.str.335) + unreachable +ok500: + %t35 = getelementptr inbounds %S.lexer.Lexer, ptr %t33, i32 0, i32 2 + %t36 = load i64, ptr %t35 + %t37 = load { ptr, i64, i64 }, ptr %t32 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 %t36, %t38 + br i1 %t39, label %range501, label %inrange502 +range501: + call void @finch_panic_index(ptr @.str.336, i64 106, i64 %t36, i64 %t38) + unreachable +inrange502: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds i8, ptr %t40, i64 %t36 + %t42 = load i8, ptr %t41 + store i8 %t42, ptr %a43 + %t44 = load i8, ptr %a43 + %t45 = icmp eq i8 %t44, 32 + br label %logic.from503 +logic.from503: + br i1 %t45, label %logic.end505, label %logic.rhs504 +logic.rhs504: + %t46 = load i8, ptr %a43 + %t47 = icmp eq i8 %t46, 9 + br label %logic.rend506 +logic.rend506: + br label %logic.end505 +logic.end505: + %t48 = phi i1 [ true, %logic.from503 ], [ %t47, %logic.rend506 ] + br label %logic.from507 +logic.from507: + br i1 %t48, label %logic.end509, label %logic.rhs508 +logic.rhs508: + %t49 = load i8, ptr %a43 + %t50 = icmp eq i8 %t49, 10 + br label %logic.rend510 +logic.rend510: + br label %logic.end509 +logic.end509: + %t51 = phi i1 [ true, %logic.from507 ], [ %t50, %logic.rend510 ] + br label %logic.from511 +logic.from511: + br i1 %t51, label %logic.end513, label %logic.rhs512 +logic.rhs512: + %t52 = load i8, ptr %a43 + %t53 = icmp eq i8 %t52, 13 + br label %logic.rend514 +logic.rend514: + br label %logic.end513 +logic.end513: + %t54 = phi i1 [ true, %logic.from511 ], [ %t53, %logic.rend514 ] + br i1 %t54, label %then515, label %endif517 +then515: + %t55 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t55) + br label %while.cond490 +endif517: + %t56 = load i8, ptr %a43 + %t57 = icmp eq i8 %t56, 47 + br label %logic.from518 +logic.from518: + br i1 %t57, label %logic.rhs519, label %logic.end520 +logic.rhs519: + %t58 = load ptr, ptr %a18 + %t59 = call i8 @finch.lexer.peek(ptr %t58, i64 1) + %t60 = icmp eq i8 %t59, 47 + br label %logic.rend521 +logic.rend521: + br label %logic.end520 +logic.end520: + %t61 = phi i1 [ false, %logic.from518 ], [ %t60, %logic.rend521 ] + br i1 %t61, label %then522, label %endif524 +then522: + br label %while.cond525 +while.cond525: + %t62 = load ptr, ptr %a18 + %t63 = icmp eq ptr %t62, null + br i1 %t63, label %panic528, label %ok529 +panic528: + call void @finch_panic(ptr @.str.337, i64 112, ptr @.str.338) + unreachable +ok529: + %t64 = getelementptr inbounds %S.lexer.Lexer, ptr %t62, i32 0, i32 2 + %t65 = load i64, ptr %t64 + %t66 = load ptr, ptr %a18 + %t67 = icmp eq ptr %t66, null + br i1 %t67, label %panic530, label %ok531 +panic530: + call void @finch_panic(ptr @.str.339, i64 112, ptr @.str.340) + unreachable +ok531: + %t68 = getelementptr inbounds %S.lexer.Lexer, ptr %t66, i32 0, i32 0 + %t69 = getelementptr inbounds { ptr, i64, i64 }, ptr %t68, i32 0, i32 1 + %t70 = load i64, ptr %t69 + %t71 = icmp slt i64 %t65, %t70 + br label %logic.from532 +logic.from532: + br i1 %t71, label %logic.rhs533, label %logic.end534 +logic.rhs533: + %t72 = load ptr, ptr %a18 + %t73 = icmp eq ptr %t72, null + br i1 %t73, label %panic535, label %ok536 +panic535: + call void @finch_panic(ptr @.str.341, i64 112, ptr @.str.342) + unreachable +ok536: + %t74 = getelementptr inbounds %S.lexer.Lexer, ptr %t72, i32 0, i32 0 + %t75 = load ptr, ptr %a18 + %t76 = icmp eq ptr %t75, null + br i1 %t76, label %panic537, label %ok538 +panic537: + call void @finch_panic(ptr @.str.343, i64 112, ptr @.str.344) + unreachable +ok538: + %t77 = getelementptr inbounds %S.lexer.Lexer, ptr %t75, i32 0, i32 2 + %t78 = load i64, ptr %t77 + %t79 = load { ptr, i64, i64 }, ptr %t74 + %t80 = extractvalue { ptr, i64, i64 } %t79, 1 + %t81 = icmp uge i64 %t78, %t80 + br i1 %t81, label %range539, label %inrange540 +range539: + call void @finch_panic_index(ptr @.str.345, i64 112, i64 %t78, i64 %t80) + unreachable +inrange540: + %t82 = extractvalue { ptr, i64, i64 } %t79, 0 + %t83 = getelementptr inbounds i8, ptr %t82, i64 %t78 + %t84 = load i8, ptr %t83 + %t85 = icmp ne i8 %t84, 10 + br label %logic.rend541 +logic.rend541: + br label %logic.end534 +logic.end534: + %t86 = phi i1 [ false, %logic.from532 ], [ %t85, %logic.rend541 ] + br i1 %t86, label %while.body526, label %while.end527 +while.body526: + %t87 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t87) + br label %while.cond525 +while.end527: + br label %while.cond490 +endif524: + %t88 = load i8, ptr %a43 + %t89 = icmp eq i8 %t88, 47 + br label %logic.from542 +logic.from542: + br i1 %t89, label %logic.rhs543, label %logic.end544 +logic.rhs543: + %t90 = load ptr, ptr %a18 + %t91 = call i8 @finch.lexer.peek(ptr %t90, i64 1) + %t92 = icmp eq i8 %t91, 42 + br label %logic.rend545 +logic.rend545: + br label %logic.end544 +logic.end544: + %t93 = phi i1 [ false, %logic.from542 ], [ %t92, %logic.rend545 ] + br i1 %t93, label %then546, label %endif548 +then546: + %t94 = load ptr, ptr %a18 + %t95 = icmp eq ptr %t94, null + br i1 %t95, label %panic549, label %ok550 +panic549: + call void @finch_panic(ptr @.str.346, i64 118, ptr @.str.347) + unreachable +ok550: + %t96 = getelementptr inbounds %S.lexer.Lexer, ptr %t94, i32 0, i32 3 + %t97 = load i64, ptr %t96 + store i64 %t97, ptr %a98 + %t99 = load ptr, ptr %a18 + %t100 = icmp eq ptr %t99, null + br i1 %t100, label %panic551, label %ok552 +panic551: + call void @finch_panic(ptr @.str.348, i64 119, ptr @.str.349) + unreachable +ok552: + %t101 = getelementptr inbounds %S.lexer.Lexer, ptr %t99, i32 0, i32 4 + %t102 = load i64, ptr %t101 + store i64 %t102, ptr %a103 + %t104 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t104) + %t105 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t105) + br label %while.cond553 +while.cond553: + %t106 = load ptr, ptr %a18 + %t107 = icmp eq ptr %t106, null + br i1 %t107, label %panic556, label %ok557 +panic556: + call void @finch_panic(ptr @.str.350, i64 122, ptr @.str.351) + unreachable +ok557: + %t108 = getelementptr inbounds %S.lexer.Lexer, ptr %t106, i32 0, i32 2 + %t109 = load i64, ptr %t108 + %t110 = load ptr, ptr %a18 + %t111 = icmp eq ptr %t110, null + br i1 %t111, label %panic558, label %ok559 +panic558: + call void @finch_panic(ptr @.str.352, i64 122, ptr @.str.353) + unreachable +ok559: + %t112 = getelementptr inbounds %S.lexer.Lexer, ptr %t110, i32 0, i32 0 + %t113 = getelementptr inbounds { ptr, i64, i64 }, ptr %t112, i32 0, i32 1 + %t114 = load i64, ptr %t113 + %t115 = icmp slt i64 %t109, %t114 + br label %logic.from560 +logic.from560: + br i1 %t115, label %logic.rhs561, label %logic.end562 +logic.rhs561: + %t116 = load ptr, ptr %a18 + %t117 = icmp eq ptr %t116, null + br i1 %t117, label %panic563, label %ok564 +panic563: + call void @finch_panic(ptr @.str.354, i64 122, ptr @.str.355) + unreachable +ok564: + %t118 = getelementptr inbounds %S.lexer.Lexer, ptr %t116, i32 0, i32 0 + %t119 = load ptr, ptr %a18 + %t120 = icmp eq ptr %t119, null + br i1 %t120, label %panic565, label %ok566 +panic565: + call void @finch_panic(ptr @.str.356, i64 122, ptr @.str.357) + unreachable +ok566: + %t121 = getelementptr inbounds %S.lexer.Lexer, ptr %t119, i32 0, i32 2 + %t122 = load i64, ptr %t121 + %t123 = load { ptr, i64, i64 }, ptr %t118 + %t124 = extractvalue { ptr, i64, i64 } %t123, 1 + %t125 = icmp uge i64 %t122, %t124 + br i1 %t125, label %range567, label %inrange568 +range567: + call void @finch_panic_index(ptr @.str.358, i64 122, i64 %t122, i64 %t124) + unreachable +inrange568: + %t126 = extractvalue { ptr, i64, i64 } %t123, 0 + %t127 = getelementptr inbounds i8, ptr %t126, i64 %t122 + %t128 = load i8, ptr %t127 + %t129 = icmp eq i8 %t128, 42 + br label %logic.from569 +logic.from569: + br i1 %t129, label %logic.rhs570, label %logic.end571 +logic.rhs570: + %t130 = load ptr, ptr %a18 + %t131 = call i8 @finch.lexer.peek(ptr %t130, i64 1) + %t132 = icmp eq i8 %t131, 47 + br label %logic.rend572 +logic.rend572: + br label %logic.end571 +logic.end571: + %t133 = phi i1 [ false, %logic.from569 ], [ %t132, %logic.rend572 ] + %t134 = xor i1 %t133, true + br label %logic.rend573 +logic.rend573: + br label %logic.end562 +logic.end562: + %t135 = phi i1 [ false, %logic.from560 ], [ %t134, %logic.rend573 ] + br i1 %t135, label %while.body554, label %while.end555 +while.body554: + %t136 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t136) + br label %while.cond553 +while.end555: + %t137 = load ptr, ptr %a18 + %t138 = icmp eq ptr %t137, null + br i1 %t138, label %panic574, label %ok575 +panic574: + call void @finch_panic(ptr @.str.359, i64 125, ptr @.str.360) + unreachable +ok575: + %t139 = getelementptr inbounds %S.lexer.Lexer, ptr %t137, i32 0, i32 2 + %t140 = load i64, ptr %t139 + %t141 = load ptr, ptr %a18 + %t142 = icmp eq ptr %t141, null + br i1 %t142, label %panic576, label %ok577 +panic576: + call void @finch_panic(ptr @.str.361, i64 125, ptr @.str.362) + unreachable +ok577: + %t143 = getelementptr inbounds %S.lexer.Lexer, ptr %t141, i32 0, i32 0 + %t144 = getelementptr inbounds { ptr, i64, i64 }, ptr %t143, i32 0, i32 1 + %t145 = load i64, ptr %t144 + %t146 = icmp sge i64 %t140, %t145 + br i1 %t146, label %then578, label %endif580 +then578: + %t147 = load ptr, ptr %a18 + %t148 = load i64, ptr %a98 + %t149 = load i64, ptr %a103 + call void @finch.lexer.fail(ptr %t147, i64 %t148, i64 %t149, { ptr, i64, i64 } { ptr @.str.363, i64 36, i64 0 }) + br label %endif580 +endif580: + %t150 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t150) + %t151 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t151) + br label %while.cond490 +endif548: + %t152 = insertvalue %S.lexer.Token zeroinitializer, { ptr, i64, i64 } { ptr @.str.364, i64 0, i64 0 }, 0 + %t153 = insertvalue %S.lexer.Token %t152, { ptr, i64, i64 } { ptr @.str.365, i64 0, i64 0 }, 1 + %t154 = load ptr, ptr %a18 + %t155 = icmp eq ptr %t154, null + br i1 %t155, label %panic581, label %ok582 +panic581: + call void @finch_panic(ptr @.str.366, i64 133, ptr @.str.367) + unreachable +ok582: + %t156 = getelementptr inbounds %S.lexer.Lexer, ptr %t154, i32 0, i32 3 + %t157 = load i64, ptr %t156 + %t158 = insertvalue %S.lexer.Token %t153, i64 %t157, 2 + %t159 = load ptr, ptr %a18 + %t160 = icmp eq ptr %t159, null + br i1 %t160, label %panic583, label %ok584 +panic583: + call void @finch_panic(ptr @.str.368, i64 133, ptr @.str.369) + unreachable +ok584: + %t161 = getelementptr inbounds %S.lexer.Lexer, ptr %t159, i32 0, i32 4 + %t162 = load i64, ptr %t161 + %t163 = insertvalue %S.lexer.Token %t158, i64 %t162, 3 + %t164 = load ptr, ptr %a18 + %t165 = icmp eq ptr %t164, null + br i1 %t165, label %panic585, label %ok586 +panic585: + call void @finch_panic(ptr @.str.370, i64 133, ptr @.str.371) + unreachable +ok586: + %t166 = getelementptr inbounds %S.lexer.Lexer, ptr %t164, i32 0, i32 5 + %t167 = load i1, ptr %t166 + %t168 = insertvalue %S.lexer.Token %t163, i1 %t167, 4 + store %S.lexer.Token %t168, ptr %a169 + %t170 = load ptr, ptr %a18 + %t171 = icmp eq ptr %t170, null + br i1 %t171, label %panic587, label %ok588 +panic587: + call void @finch_panic(ptr @.str.372, i64 134, ptr @.str.373) + unreachable +ok588: + %t172 = getelementptr inbounds %S.lexer.Lexer, ptr %t170, i32 0, i32 5 + store i1 false, ptr %t172 + %t173 = load ptr, ptr %a18 + %t174 = icmp eq ptr %t173, null + br i1 %t174, label %panic589, label %ok590 +panic589: + call void @finch_panic(ptr @.str.374, i64 135, ptr @.str.375) + unreachable +ok590: + %t175 = getelementptr inbounds %S.lexer.Lexer, ptr %t173, i32 0, i32 2 + %t176 = load i64, ptr %t175 + store i64 %t176, ptr %a177 + %t178 = load i8, ptr %a43 + %t179 = call i1 @finch.lexer.isAlpha(i8 %t178) + br i1 %t179, label %then591, label %else592 +then591: + br label %while.cond594 +while.cond594: + %t180 = load ptr, ptr %a18 + %t181 = icmp eq ptr %t180, null + br i1 %t181, label %panic597, label %ok598 +panic597: + call void @finch_panic(ptr @.str.376, i64 137, ptr @.str.377) + unreachable +ok598: + %t182 = getelementptr inbounds %S.lexer.Lexer, ptr %t180, i32 0, i32 2 + %t183 = load i64, ptr %t182 + %t184 = load ptr, ptr %a18 + %t185 = icmp eq ptr %t184, null + br i1 %t185, label %panic599, label %ok600 +panic599: + call void @finch_panic(ptr @.str.378, i64 137, ptr @.str.379) + unreachable +ok600: + %t186 = getelementptr inbounds %S.lexer.Lexer, ptr %t184, i32 0, i32 0 + %t187 = getelementptr inbounds { ptr, i64, i64 }, ptr %t186, i32 0, i32 1 + %t188 = load i64, ptr %t187 + %t189 = icmp slt i64 %t183, %t188 + br label %logic.from601 +logic.from601: + br i1 %t189, label %logic.rhs602, label %logic.end603 +logic.rhs602: + %t190 = load ptr, ptr %a18 + %t191 = icmp eq ptr %t190, null + br i1 %t191, label %panic604, label %ok605 +panic604: + call void @finch_panic(ptr @.str.380, i64 137, ptr @.str.381) + unreachable +ok605: + %t192 = getelementptr inbounds %S.lexer.Lexer, ptr %t190, i32 0, i32 0 + %t193 = load ptr, ptr %a18 + %t194 = icmp eq ptr %t193, null + br i1 %t194, label %panic606, label %ok607 +panic606: + call void @finch_panic(ptr @.str.382, i64 137, ptr @.str.383) + unreachable +ok607: + %t195 = getelementptr inbounds %S.lexer.Lexer, ptr %t193, i32 0, i32 2 + %t196 = load i64, ptr %t195 + %t197 = load { ptr, i64, i64 }, ptr %t192 + %t198 = extractvalue { ptr, i64, i64 } %t197, 1 + %t199 = icmp uge i64 %t196, %t198 + br i1 %t199, label %range608, label %inrange609 +range608: + call void @finch_panic_index(ptr @.str.384, i64 137, i64 %t196, i64 %t198) + unreachable +inrange609: + %t200 = extractvalue { ptr, i64, i64 } %t197, 0 + %t201 = getelementptr inbounds i8, ptr %t200, i64 %t196 + %t202 = load i8, ptr %t201 + %t203 = call i1 @finch.lexer.isAlpha(i8 %t202) + br label %logic.from610 +logic.from610: + br i1 %t203, label %logic.end612, label %logic.rhs611 +logic.rhs611: + %t204 = load ptr, ptr %a18 + %t205 = icmp eq ptr %t204, null + br i1 %t205, label %panic613, label %ok614 +panic613: + call void @finch_panic(ptr @.str.385, i64 137, ptr @.str.386) + unreachable +ok614: + %t206 = getelementptr inbounds %S.lexer.Lexer, ptr %t204, i32 0, i32 0 + %t207 = load ptr, ptr %a18 + %t208 = icmp eq ptr %t207, null + br i1 %t208, label %panic615, label %ok616 +panic615: + call void @finch_panic(ptr @.str.387, i64 137, ptr @.str.388) + unreachable +ok616: + %t209 = getelementptr inbounds %S.lexer.Lexer, ptr %t207, i32 0, i32 2 + %t210 = load i64, ptr %t209 + %t211 = load { ptr, i64, i64 }, ptr %t206 + %t212 = extractvalue { ptr, i64, i64 } %t211, 1 + %t213 = icmp uge i64 %t210, %t212 + br i1 %t213, label %range617, label %inrange618 +range617: + call void @finch_panic_index(ptr @.str.389, i64 137, i64 %t210, i64 %t212) + unreachable +inrange618: + %t214 = extractvalue { ptr, i64, i64 } %t211, 0 + %t215 = getelementptr inbounds i8, ptr %t214, i64 %t210 + %t216 = load i8, ptr %t215 + %t217 = call i1 @finch.lexer.isDigit(i8 %t216) + br label %logic.rend619 +logic.rend619: + br label %logic.end612 +logic.end612: + %t218 = phi i1 [ true, %logic.from610 ], [ %t217, %logic.rend619 ] + br label %logic.rend620 +logic.rend620: + br label %logic.end603 +logic.end603: + %t219 = phi i1 [ false, %logic.from601 ], [ %t218, %logic.rend620 ] + br i1 %t219, label %while.body595, label %while.end596 +while.body595: + %t220 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t220) + br label %while.cond594 +while.end596: + %t221 = load ptr, ptr %a18 + %t222 = icmp eq ptr %t221, null + br i1 %t222, label %panic621, label %ok622 +panic621: + call void @finch_panic(ptr @.str.390, i64 140, ptr @.str.391) + unreachable +ok622: + %t223 = getelementptr inbounds %S.lexer.Lexer, ptr %t221, i32 0, i32 0 + %t224 = load { ptr, i64, i64 }, ptr %t223 + store { ptr, i64, i64 } %t224, ptr %a225 + %t227 = load i64, ptr %a177 + %t228 = load ptr, ptr %a18 + %t229 = icmp eq ptr %t228, null + br i1 %t229, label %panic623, label %ok624 +panic623: + call void @finch_panic(ptr @.str.393, i64 140, ptr @.str.394) + unreachable +ok624: + %t230 = getelementptr inbounds %S.lexer.Lexer, ptr %t228, i32 0, i32 2 + %t231 = load i64, ptr %t230 + call void @finch_str_sub(ptr %a226, ptr %a225, i64 %t227, i64 %t231, ptr @.str.392, i64 140) + %t232 = load { ptr, i64, i64 }, ptr %a226 + %t233 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 1 + store { ptr, i64, i64 } %t232, ptr %t233 + %t234 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.395, i64 5, i64 0 }, ptr %t234 + %t235 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 1 + %t236 = load { ptr, i64, i64 }, ptr %t235 + %t237 = call i1 @finch.lexer.isKeyword({ ptr, i64, i64 } %t236) + br i1 %t237, label %then625, label %endif627 +then625: + %t238 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 1 + %t239 = load { ptr, i64, i64 }, ptr %t238 + %t240 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 0 + store { ptr, i64, i64 } %t239, ptr %a241 + call void @finch_str_copy(ptr %a242, ptr %a241) + %t243 = load { ptr, i64, i64 }, ptr %a242 + store { ptr, i64, i64 } %t243, ptr %t240 + br label %endif627 +endif627: + br label %endif593 +else592: + %t244 = load i8, ptr %a43 + %t245 = call i1 @finch.lexer.isDigit(i8 %t244) + br i1 %t245, label %then628, label %else629 +then628: + %t246 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.396, i64 3, i64 0 }, ptr %t246 + %t247 = load i8, ptr %a43 + %t248 = icmp eq i8 %t247, 48 + br label %logic.from631 +logic.from631: + br i1 %t248, label %logic.rhs632, label %logic.end633 +logic.rhs632: + %t249 = load ptr, ptr %a18 + %t250 = call i8 @finch.lexer.peek(ptr %t249, i64 1) + %t251 = icmp eq i8 %t250, 120 + br label %logic.from634 +logic.from634: + br i1 %t251, label %logic.end636, label %logic.rhs635 +logic.rhs635: + %t252 = load ptr, ptr %a18 + %t253 = call i8 @finch.lexer.peek(ptr %t252, i64 1) + %t254 = icmp eq i8 %t253, 88 + br label %logic.rend637 +logic.rend637: + br label %logic.end636 +logic.end636: + %t255 = phi i1 [ true, %logic.from634 ], [ %t254, %logic.rend637 ] + br label %logic.rend638 +logic.rend638: + br label %logic.end633 +logic.end633: + %t256 = phi i1 [ false, %logic.from631 ], [ %t255, %logic.rend638 ] + br i1 %t256, label %then639, label %else640 +then639: + %t257 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t257) + %t258 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t258) + br label %while.cond642 +while.cond642: + %t259 = load ptr, ptr %a18 + %t260 = icmp eq ptr %t259, null + br i1 %t260, label %panic645, label %ok646 +panic645: + call void @finch_panic(ptr @.str.397, i64 150, ptr @.str.398) + unreachable +ok646: + %t261 = getelementptr inbounds %S.lexer.Lexer, ptr %t259, i32 0, i32 2 + %t262 = load i64, ptr %t261 + %t263 = load ptr, ptr %a18 + %t264 = icmp eq ptr %t263, null + br i1 %t264, label %panic647, label %ok648 +panic647: + call void @finch_panic(ptr @.str.399, i64 150, ptr @.str.400) + unreachable +ok648: + %t265 = getelementptr inbounds %S.lexer.Lexer, ptr %t263, i32 0, i32 0 + %t266 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i32 0, i32 1 + %t267 = load i64, ptr %t266 + %t268 = icmp slt i64 %t262, %t267 + br label %logic.from649 +logic.from649: + br i1 %t268, label %logic.rhs650, label %logic.end651 +logic.rhs650: + %t269 = load ptr, ptr %a18 + %t270 = icmp eq ptr %t269, null + br i1 %t270, label %panic652, label %ok653 +panic652: + call void @finch_panic(ptr @.str.401, i64 150, ptr @.str.402) + unreachable +ok653: + %t271 = getelementptr inbounds %S.lexer.Lexer, ptr %t269, i32 0, i32 0 + %t272 = load ptr, ptr %a18 + %t273 = icmp eq ptr %t272, null + br i1 %t273, label %panic654, label %ok655 +panic654: + call void @finch_panic(ptr @.str.403, i64 150, ptr @.str.404) + unreachable +ok655: + %t274 = getelementptr inbounds %S.lexer.Lexer, ptr %t272, i32 0, i32 2 + %t275 = load i64, ptr %t274 + %t276 = load { ptr, i64, i64 }, ptr %t271 + %t277 = extractvalue { ptr, i64, i64 } %t276, 1 + %t278 = icmp uge i64 %t275, %t277 + br i1 %t278, label %range656, label %inrange657 +range656: + call void @finch_panic_index(ptr @.str.405, i64 150, i64 %t275, i64 %t277) + unreachable +inrange657: + %t279 = extractvalue { ptr, i64, i64 } %t276, 0 + %t280 = getelementptr inbounds i8, ptr %t279, i64 %t275 + %t281 = load i8, ptr %t280 + %t282 = call i1 @finch.lexer.isHex(i8 %t281) + br label %logic.from658 +logic.from658: + br i1 %t282, label %logic.end660, label %logic.rhs659 +logic.rhs659: + %t283 = load ptr, ptr %a18 + %t284 = icmp eq ptr %t283, null + br i1 %t284, label %panic661, label %ok662 +panic661: + call void @finch_panic(ptr @.str.406, i64 150, ptr @.str.407) + unreachable +ok662: + %t285 = getelementptr inbounds %S.lexer.Lexer, ptr %t283, i32 0, i32 0 + %t286 = load ptr, ptr %a18 + %t287 = icmp eq ptr %t286, null + br i1 %t287, label %panic663, label %ok664 +panic663: + call void @finch_panic(ptr @.str.408, i64 150, ptr @.str.409) + unreachable +ok664: + %t288 = getelementptr inbounds %S.lexer.Lexer, ptr %t286, i32 0, i32 2 + %t289 = load i64, ptr %t288 + %t290 = load { ptr, i64, i64 }, ptr %t285 + %t291 = extractvalue { ptr, i64, i64 } %t290, 1 + %t292 = icmp uge i64 %t289, %t291 + br i1 %t292, label %range665, label %inrange666 +range665: + call void @finch_panic_index(ptr @.str.410, i64 150, i64 %t289, i64 %t291) + unreachable +inrange666: + %t293 = extractvalue { ptr, i64, i64 } %t290, 0 + %t294 = getelementptr inbounds i8, ptr %t293, i64 %t289 + %t295 = load i8, ptr %t294 + %t296 = icmp eq i8 %t295, 95 + br label %logic.rend667 +logic.rend667: + br label %logic.end660 +logic.end660: + %t297 = phi i1 [ true, %logic.from658 ], [ %t296, %logic.rend667 ] + br label %logic.rend668 +logic.rend668: + br label %logic.end651 +logic.end651: + %t298 = phi i1 [ false, %logic.from649 ], [ %t297, %logic.rend668 ] + br i1 %t298, label %while.body643, label %while.end644 +while.body643: + %t299 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t299) + br label %while.cond642 +while.end644: + br label %endif641 +else640: + br label %while.cond669 +while.cond669: + %t300 = load ptr, ptr %a18 + %t301 = icmp eq ptr %t300, null + br i1 %t301, label %panic672, label %ok673 +panic672: + call void @finch_panic(ptr @.str.411, i64 154, ptr @.str.412) + unreachable +ok673: + %t302 = getelementptr inbounds %S.lexer.Lexer, ptr %t300, i32 0, i32 2 + %t303 = load i64, ptr %t302 + %t304 = load ptr, ptr %a18 + %t305 = icmp eq ptr %t304, null + br i1 %t305, label %panic674, label %ok675 +panic674: + call void @finch_panic(ptr @.str.413, i64 154, ptr @.str.414) + unreachable +ok675: + %t306 = getelementptr inbounds %S.lexer.Lexer, ptr %t304, i32 0, i32 0 + %t307 = getelementptr inbounds { ptr, i64, i64 }, ptr %t306, i32 0, i32 1 + %t308 = load i64, ptr %t307 + %t309 = icmp slt i64 %t303, %t308 + br label %logic.from676 +logic.from676: + br i1 %t309, label %logic.rhs677, label %logic.end678 +logic.rhs677: + %t310 = load ptr, ptr %a18 + %t311 = icmp eq ptr %t310, null + br i1 %t311, label %panic679, label %ok680 +panic679: + call void @finch_panic(ptr @.str.415, i64 154, ptr @.str.416) + unreachable +ok680: + %t312 = getelementptr inbounds %S.lexer.Lexer, ptr %t310, i32 0, i32 0 + %t313 = load ptr, ptr %a18 + %t314 = icmp eq ptr %t313, null + br i1 %t314, label %panic681, label %ok682 +panic681: + call void @finch_panic(ptr @.str.417, i64 154, ptr @.str.418) + unreachable +ok682: + %t315 = getelementptr inbounds %S.lexer.Lexer, ptr %t313, i32 0, i32 2 + %t316 = load i64, ptr %t315 + %t317 = load { ptr, i64, i64 }, ptr %t312 + %t318 = extractvalue { ptr, i64, i64 } %t317, 1 + %t319 = icmp uge i64 %t316, %t318 + br i1 %t319, label %range683, label %inrange684 +range683: + call void @finch_panic_index(ptr @.str.419, i64 154, i64 %t316, i64 %t318) + unreachable +inrange684: + %t320 = extractvalue { ptr, i64, i64 } %t317, 0 + %t321 = getelementptr inbounds i8, ptr %t320, i64 %t316 + %t322 = load i8, ptr %t321 + %t323 = call i1 @finch.lexer.isDigit(i8 %t322) + br label %logic.from685 +logic.from685: + br i1 %t323, label %logic.end687, label %logic.rhs686 +logic.rhs686: + %t324 = load ptr, ptr %a18 + %t325 = icmp eq ptr %t324, null + br i1 %t325, label %panic688, label %ok689 +panic688: + call void @finch_panic(ptr @.str.420, i64 154, ptr @.str.421) + unreachable +ok689: + %t326 = getelementptr inbounds %S.lexer.Lexer, ptr %t324, i32 0, i32 0 + %t327 = load ptr, ptr %a18 + %t328 = icmp eq ptr %t327, null + br i1 %t328, label %panic690, label %ok691 +panic690: + call void @finch_panic(ptr @.str.422, i64 154, ptr @.str.423) + unreachable +ok691: + %t329 = getelementptr inbounds %S.lexer.Lexer, ptr %t327, i32 0, i32 2 + %t330 = load i64, ptr %t329 + %t331 = load { ptr, i64, i64 }, ptr %t326 + %t332 = extractvalue { ptr, i64, i64 } %t331, 1 + %t333 = icmp uge i64 %t330, %t332 + br i1 %t333, label %range692, label %inrange693 +range692: + call void @finch_panic_index(ptr @.str.424, i64 154, i64 %t330, i64 %t332) + unreachable +inrange693: + %t334 = extractvalue { ptr, i64, i64 } %t331, 0 + %t335 = getelementptr inbounds i8, ptr %t334, i64 %t330 + %t336 = load i8, ptr %t335 + %t337 = icmp eq i8 %t336, 95 + br label %logic.rend694 +logic.rend694: + br label %logic.end687 +logic.end687: + %t338 = phi i1 [ true, %logic.from685 ], [ %t337, %logic.rend694 ] + br label %logic.rend695 +logic.rend695: + br label %logic.end678 +logic.end678: + %t339 = phi i1 [ false, %logic.from676 ], [ %t338, %logic.rend695 ] + br i1 %t339, label %while.body670, label %while.end671 +while.body670: + %t340 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t340) + br label %while.cond669 +while.end671: + %t341 = load ptr, ptr %a18 + %t342 = call i8 @finch.lexer.peek(ptr %t341, i64 0) + %t343 = icmp eq i8 %t342, 46 + br label %logic.from696 +logic.from696: + br i1 %t343, label %logic.rhs697, label %logic.end698 +logic.rhs697: + %t344 = load ptr, ptr %a18 + %t345 = call i8 @finch.lexer.peek(ptr %t344, i64 1) + %t346 = call i1 @finch.lexer.isDigit(i8 %t345) + br label %logic.rend699 +logic.rend699: + br label %logic.end698 +logic.end698: + %t347 = phi i1 [ false, %logic.from696 ], [ %t346, %logic.rend699 ] + br i1 %t347, label %then700, label %endif702 +then700: + %t348 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.425, i64 5, i64 0 }, ptr %t348 + %t349 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t349) + br label %while.cond703 +while.cond703: + %t350 = load ptr, ptr %a18 + %t351 = icmp eq ptr %t350, null + br i1 %t351, label %panic706, label %ok707 +panic706: + call void @finch_panic(ptr @.str.426, i64 160, ptr @.str.427) + unreachable +ok707: + %t352 = getelementptr inbounds %S.lexer.Lexer, ptr %t350, i32 0, i32 2 + %t353 = load i64, ptr %t352 + %t354 = load ptr, ptr %a18 + %t355 = icmp eq ptr %t354, null + br i1 %t355, label %panic708, label %ok709 +panic708: + call void @finch_panic(ptr @.str.428, i64 160, ptr @.str.429) + unreachable +ok709: + %t356 = getelementptr inbounds %S.lexer.Lexer, ptr %t354, i32 0, i32 0 + %t357 = getelementptr inbounds { ptr, i64, i64 }, ptr %t356, i32 0, i32 1 + %t358 = load i64, ptr %t357 + %t359 = icmp slt i64 %t353, %t358 + br label %logic.from710 +logic.from710: + br i1 %t359, label %logic.rhs711, label %logic.end712 +logic.rhs711: + %t360 = load ptr, ptr %a18 + %t361 = icmp eq ptr %t360, null + br i1 %t361, label %panic713, label %ok714 +panic713: + call void @finch_panic(ptr @.str.430, i64 160, ptr @.str.431) + unreachable +ok714: + %t362 = getelementptr inbounds %S.lexer.Lexer, ptr %t360, i32 0, i32 0 + %t363 = load ptr, ptr %a18 + %t364 = icmp eq ptr %t363, null + br i1 %t364, label %panic715, label %ok716 +panic715: + call void @finch_panic(ptr @.str.432, i64 160, ptr @.str.433) + unreachable +ok716: + %t365 = getelementptr inbounds %S.lexer.Lexer, ptr %t363, i32 0, i32 2 + %t366 = load i64, ptr %t365 + %t367 = load { ptr, i64, i64 }, ptr %t362 + %t368 = extractvalue { ptr, i64, i64 } %t367, 1 + %t369 = icmp uge i64 %t366, %t368 + br i1 %t369, label %range717, label %inrange718 +range717: + call void @finch_panic_index(ptr @.str.434, i64 160, i64 %t366, i64 %t368) + unreachable +inrange718: + %t370 = extractvalue { ptr, i64, i64 } %t367, 0 + %t371 = getelementptr inbounds i8, ptr %t370, i64 %t366 + %t372 = load i8, ptr %t371 + %t373 = call i1 @finch.lexer.isDigit(i8 %t372) + br label %logic.from719 +logic.from719: + br i1 %t373, label %logic.end721, label %logic.rhs720 +logic.rhs720: + %t374 = load ptr, ptr %a18 + %t375 = icmp eq ptr %t374, null + br i1 %t375, label %panic722, label %ok723 +panic722: + call void @finch_panic(ptr @.str.435, i64 160, ptr @.str.436) + unreachable +ok723: + %t376 = getelementptr inbounds %S.lexer.Lexer, ptr %t374, i32 0, i32 0 + %t377 = load ptr, ptr %a18 + %t378 = icmp eq ptr %t377, null + br i1 %t378, label %panic724, label %ok725 +panic724: + call void @finch_panic(ptr @.str.437, i64 160, ptr @.str.438) + unreachable +ok725: + %t379 = getelementptr inbounds %S.lexer.Lexer, ptr %t377, i32 0, i32 2 + %t380 = load i64, ptr %t379 + %t381 = load { ptr, i64, i64 }, ptr %t376 + %t382 = extractvalue { ptr, i64, i64 } %t381, 1 + %t383 = icmp uge i64 %t380, %t382 + br i1 %t383, label %range726, label %inrange727 +range726: + call void @finch_panic_index(ptr @.str.439, i64 160, i64 %t380, i64 %t382) + unreachable +inrange727: + %t384 = extractvalue { ptr, i64, i64 } %t381, 0 + %t385 = getelementptr inbounds i8, ptr %t384, i64 %t380 + %t386 = load i8, ptr %t385 + %t387 = icmp eq i8 %t386, 95 + br label %logic.rend728 +logic.rend728: + br label %logic.end721 +logic.end721: + %t388 = phi i1 [ true, %logic.from719 ], [ %t387, %logic.rend728 ] + br label %logic.rend729 +logic.rend729: + br label %logic.end712 +logic.end712: + %t389 = phi i1 [ false, %logic.from710 ], [ %t388, %logic.rend729 ] + br i1 %t389, label %while.body704, label %while.end705 +while.body704: + %t390 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t390) + br label %while.cond703 +while.end705: + br label %endif702 +endif702: + br label %endif641 +endif641: + %t391 = load ptr, ptr %a18 + %t392 = icmp eq ptr %t391, null + br i1 %t392, label %panic730, label %ok731 +panic730: + call void @finch_panic(ptr @.str.440, i64 165, ptr @.str.441) + unreachable +ok731: + %t393 = getelementptr inbounds %S.lexer.Lexer, ptr %t391, i32 0, i32 0 + %t394 = load { ptr, i64, i64 }, ptr %t393 + store { ptr, i64, i64 } %t394, ptr %a395 + %t397 = load i64, ptr %a177 + %t398 = load ptr, ptr %a18 + %t399 = icmp eq ptr %t398, null + br i1 %t399, label %panic732, label %ok733 +panic732: + call void @finch_panic(ptr @.str.443, i64 165, ptr @.str.444) + unreachable +ok733: + %t400 = getelementptr inbounds %S.lexer.Lexer, ptr %t398, i32 0, i32 2 + %t401 = load i64, ptr %t400 + call void @finch_str_sub(ptr %a396, ptr %a395, i64 %t397, i64 %t401, ptr @.str.442, i64 165) + %t402 = load { ptr, i64, i64 }, ptr %a396 + store { ptr, i64, i64 } %t402, ptr %a403 + store { ptr, i64, i64 } { ptr @.str.446, i64 1, i64 0 }, ptr %a405 + store { ptr, i64, i64 } { ptr @.str.447, i64 0, i64 0 }, ptr %a406 + call void @finch_str_replace(ptr %a404, ptr %a403, ptr %a405, ptr %a406) + %t407 = load { ptr, i64, i64 }, ptr %a404 + %t408 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 1 + store { ptr, i64, i64 } %t407, ptr %t408 + br label %endif630 +else629: + %t409 = load i8, ptr %a43 + %t410 = icmp eq i8 %t409, 34 + br label %logic.from734 +logic.from734: + br i1 %t410, label %logic.end736, label %logic.rhs735 +logic.rhs735: + %t411 = load i8, ptr %a43 + %t412 = icmp eq i8 %t411, 39 + br label %logic.rend737 +logic.rend737: + br label %logic.end736 +logic.end736: + %t413 = phi i1 [ true, %logic.from734 ], [ %t412, %logic.rend737 ] + br i1 %t413, label %then738, label %else739 +then738: + %t414 = load i8, ptr %a43 + store i8 %t414, ptr %a415 + %t416 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.448, i64 6, i64 0 }, ptr %t416 + %t417 = load i8, ptr %a415 + %t418 = icmp eq i8 %t417, 39 + br i1 %t418, label %then741, label %endif743 +then741: + %t419 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.449, i64 4, i64 0 }, ptr %t419 + br label %endif743 +endif743: + %t420 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t420) + store { ptr, i64, i64 } zeroinitializer, ptr %a421 + br label %while.cond744 +while.cond744: + %t422 = load ptr, ptr %a18 + %t423 = call i8 @finch.lexer.peek(ptr %t422, i64 0) + %t424 = load i8, ptr %a415 + %t425 = icmp ne i8 %t423, %t424 + br i1 %t425, label %while.body745, label %while.end746 +while.body745: + %t426 = load ptr, ptr %a18 + %t427 = call i8 @finch.lexer.peek(ptr %t426, i64 0) + %t428 = trunc i64 0 to i8 + %t429 = icmp eq i8 %t427, %t428 + br label %logic.from747 +logic.from747: + br i1 %t429, label %logic.end749, label %logic.rhs748 +logic.rhs748: + %t430 = load ptr, ptr %a18 + %t431 = call i8 @finch.lexer.peek(ptr %t430, i64 0) + %t432 = icmp eq i8 %t431, 10 + br label %logic.rend750 +logic.rend750: + br label %logic.end749 +logic.end749: + %t433 = phi i1 [ true, %logic.from747 ], [ %t432, %logic.rend750 ] + br i1 %t433, label %then751, label %endif753 +then751: + %t434 = load i8, ptr %a415 + %t435 = icmp eq i8 %t434, 34 + br i1 %t435, label %then754, label %endif756 +then754: + %t436 = load ptr, ptr %a18 + %t437 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 2 + %t438 = load i64, ptr %t437 + %t439 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 3 + %t440 = load i64, ptr %t439 + call void @finch.lexer.fail(ptr %t436, i64 %t438, i64 %t440, { ptr, i64, i64 } { ptr @.str.450, i64 34, i64 0 }) + br label %endif756 +endif756: + %t441 = load ptr, ptr %a18 + %t442 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 2 + %t443 = load i64, ptr %t442 + %t444 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 3 + %t445 = load i64, ptr %t444 + call void @finch.lexer.fail(ptr %t441, i64 %t443, i64 %t445, { ptr, i64, i64 } { ptr @.str.451, i64 32, i64 0 }) + br label %endif753 +endif753: + %t446 = load ptr, ptr %a18 + %t447 = call i8 @finch.lexer.peek(ptr %t446, i64 0) + store i8 %t447, ptr %a448 + %t449 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t449) + %t450 = load i8, ptr %a448 + %t451 = icmp eq i8 %t450, 92 + br i1 %t451, label %then757, label %endif759 +then757: + %t452 = load ptr, ptr %a18 + %t453 = call i8 @finch.lexer.peek(ptr %t452, i64 0) + store i8 %t453, ptr %a454 + %t455 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t455) + %t456 = load ptr, ptr %a18 + %t457 = load i8, ptr %a454 + %t458 = call i8 @finch.lexer.escape(ptr %t456, i8 %t457) + store i8 %t458, ptr %a448 + br label %endif759 +endif759: + %t459 = getelementptr inbounds { ptr, i64, i64 }, ptr %a421, i32 0, i32 1 + %t460 = load i8, ptr %a448 + call void @finch_str_from_char(ptr %a461, i8 signext %t460) + %t462 = load { ptr, i64, i64 }, ptr %a461 + %t463 = load i64, ptr %t459 + %t464 = add i64 %t463, 1 + call void @finch_arr_reserve(ptr %a421, i64 %t464, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t465 = load ptr, ptr %a421 + %t466 = getelementptr inbounds { ptr, i64, i64 }, ptr %t465, i64 %t463 + store { ptr, i64, i64 } %t462, ptr %t466 + store i64 %t464, ptr %t459 + br label %while.cond744 +while.end746: + %t467 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t467) + %t468 = getelementptr inbounds { ptr, i64, i64 }, ptr %a421, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.452, i64 0, i64 0 }, ptr %a469 + call void @finch_str_join(ptr %a470, ptr %a421, ptr %a469) + %t471 = load { ptr, i64, i64 }, ptr %a470 + %t472 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 1 + store { ptr, i64, i64 } %t471, ptr %t472 + %t473 = load i8, ptr %a415 + %t474 = icmp eq i8 %t473, 39 + br label %logic.from760 +logic.from760: + br i1 %t474, label %logic.rhs761, label %logic.end762 +logic.rhs761: + %t475 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 1 + %t476 = getelementptr inbounds { ptr, i64, i64 }, ptr %t475, i32 0, i32 1 + %t477 = load i64, ptr %t476 + %t478 = icmp ne i64 %t477, 1 + br label %logic.rend763 +logic.rend763: + br label %logic.end762 +logic.end762: + %t479 = phi i1 [ false, %logic.from760 ], [ %t478, %logic.rend763 ] + br i1 %t479, label %then764, label %endif766 +then764: + %t480 = load ptr, ptr %a18 + %t481 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 2 + %t482 = load i64, ptr %t481 + %t483 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 3 + %t484 = load i64, ptr %t483 + call void @finch.lexer.fail(ptr %t480, i64 %t482, i64 %t484, { ptr, i64, i64 } { ptr @.str.453, i64 44, i64 0 }) + br label %endif766 +endif766: + br label %endif740 +else739: + %t485 = load ptr, ptr %a18 + %t486 = call { ptr, i64, i64 } @finch.lexer.operator(ptr %t485) + store { ptr, i64, i64 } %t486, ptr %a487 + %t488 = getelementptr inbounds { ptr, i64, i64 }, ptr %a487, i32 0, i32 1 + %t489 = load i64, ptr %t488 + %t490 = icmp eq i64 %t489, 0 + br i1 %t490, label %then767, label %endif769 +then767: + store i64 1, ptr %a491 + %t492 = load i8, ptr %a43 + %t493 = zext i8 %t492 to i64 + %t494 = and i64 %t493, 224 + %t495 = icmp eq i64 %t494, 192 + br i1 %t495, label %then770, label %else771 +then770: + store i64 2, ptr %a491 + br label %endif772 +else771: + %t496 = load i8, ptr %a43 + %t497 = zext i8 %t496 to i64 + %t498 = and i64 %t497, 240 + %t499 = icmp eq i64 %t498, 224 + br i1 %t499, label %then773, label %else774 +then773: + store i64 3, ptr %a491 + br label %endif775 +else774: + %t500 = load i8, ptr %a43 + %t501 = zext i8 %t500 to i64 + %t502 = and i64 %t501, 248 + %t503 = icmp eq i64 %t502, 240 + br i1 %t503, label %then776, label %endif778 +then776: + store i64 4, ptr %a491 + br label %endif778 +endif778: + br label %endif775 +endif775: + br label %endif772 +endif772: + store { ptr, i64, i64 } { ptr @.str.454, i64 0, i64 0 }, ptr %a504 + %t505 = load i8, ptr %a43 + %t506 = zext i8 %t505 to i64 + %t507 = icmp sge i64 %t506, 128 + br i1 %t507, label %then779, label %endif781 +then779: + store { ptr, i64, i64 } { ptr @.str.455, i64 74, i64 0 }, ptr %a504 + br label %endif781 +endif781: + %t508 = load ptr, ptr %a18 + %t509 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 2 + %t510 = load i64, ptr %t509 + %t511 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 3 + %t512 = load i64, ptr %t511 + %t513 = load ptr, ptr %a18 + %t514 = icmp eq ptr %t513, null + br i1 %t514, label %panic782, label %ok783 +panic782: + call void @finch_panic(ptr @.str.457, i64 211, ptr @.str.458) + unreachable +ok783: + %t515 = getelementptr inbounds %S.lexer.Lexer, ptr %t513, i32 0, i32 0 + %t516 = load { ptr, i64, i64 }, ptr %t515 + store { ptr, i64, i64 } %t516, ptr %a517 + %t519 = load ptr, ptr %a18 + %t520 = icmp eq ptr %t519, null + br i1 %t520, label %panic784, label %ok785 +panic784: + call void @finch_panic(ptr @.str.460, i64 211, ptr @.str.461) + unreachable +ok785: + %t521 = getelementptr inbounds %S.lexer.Lexer, ptr %t519, i32 0, i32 2 + %t522 = load i64, ptr %t521 + %t523 = load ptr, ptr %a18 + %t524 = icmp eq ptr %t523, null + br i1 %t524, label %panic786, label %ok787 +panic786: + call void @finch_panic(ptr @.str.462, i64 211, ptr @.str.463) + unreachable +ok787: + %t525 = getelementptr inbounds %S.lexer.Lexer, ptr %t523, i32 0, i32 2 + %t526 = load i64, ptr %t525 + %t527 = load i64, ptr %a491 + %t528 = add i64 %t526, %t527 + call void @finch_str_sub(ptr %a518, ptr %a517, i64 %t522, i64 %t528, ptr @.str.459, i64 211) + %t529 = load { ptr, i64, i64 }, ptr %a518 + store { ptr, i64, i64 } { ptr @.str.456, i64 22, i64 0 }, ptr %a531 + store { ptr, i64, i64 } %t529, ptr %a532 + call void @finch_str_concat(ptr %a530, ptr %a531, ptr %a532) + %t533 = load { ptr, i64, i64 }, ptr %a530 + store { ptr, i64, i64 } %t533, ptr %a535 + store { ptr, i64, i64 } { ptr @.str.464, i64 1, i64 0 }, ptr %a536 + call void @finch_str_concat(ptr %a534, ptr %a535, ptr %a536) + %t537 = load { ptr, i64, i64 }, ptr %a534 + %t538 = load { ptr, i64, i64 }, ptr %a504 + store { ptr, i64, i64 } %t537, ptr %a540 + store { ptr, i64, i64 } %t538, ptr %a541 + call void @finch_str_concat(ptr %a539, ptr %a540, ptr %a541) + %t542 = load { ptr, i64, i64 }, ptr %a539 + call void @finch.lexer.fail(ptr %t508, i64 %t510, i64 %t512, { ptr, i64, i64 } %t542) + br label %endif769 +endif769: + %t543 = getelementptr inbounds { ptr, i64, i64 }, ptr %a487, i32 0, i32 1 + %t544 = load i64, ptr %t543 + store i64 0, ptr %a545 + br label %for.cond788 +for.cond788: + %t546 = load i64, ptr %a545 + %t547 = icmp slt i64 %t546, %t544 + br i1 %t547, label %for.body789, label %for.end791 +for.body789: + %t548 = load ptr, ptr %a18 + call void @finch.lexer.advance(ptr %t548) + br label %for.step790 +for.step790: + %t549 = load i64, ptr %a545 + %t550 = add i64 %t549, 1 + store i64 %t550, ptr %a545 + br label %for.cond788 +for.end791: + %t551 = load { ptr, i64, i64 }, ptr %a487 + %t552 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 0 + store { ptr, i64, i64 } %t551, ptr %a553 + call void @finch_str_copy(ptr %a554, ptr %a553) + %t555 = load { ptr, i64, i64 }, ptr %a554 + store { ptr, i64, i64 } %t555, ptr %t552 + %t556 = load { ptr, i64, i64 }, ptr %a487 + %t557 = getelementptr inbounds %S.lexer.Token, ptr %a169, i32 0, i32 1 + store { ptr, i64, i64 } %t556, ptr %a558 + call void @finch_str_copy(ptr %a559, ptr %a558) + %t560 = load { ptr, i64, i64 }, ptr %a559 + store { ptr, i64, i64 } %t560, ptr %t557 + br label %endif740 +endif740: + br label %endif630 +endif630: + br label %endif593 +endif593: + %t561 = getelementptr inbounds { ptr, i64, i64 }, ptr %a19, i32 0, i32 1 + %t562 = load %S.lexer.Token, ptr %a169 + store %S.lexer.Token %t562, ptr %a563 + call void @finch.copy.S_lexer_Token(ptr %a564, ptr %a563) + %t565 = load %S.lexer.Token, ptr %a564 + %t566 = load i64, ptr %t561 + %t567 = add i64 %t566, 1 + call void @finch_arr_reserve(ptr %a19, i64 %t567, i64 ptrtoint (ptr getelementptr (%S.lexer.Token, ptr null, i32 1) to i64)) + %t568 = load ptr, ptr %a19 + %t569 = getelementptr inbounds %S.lexer.Token, ptr %t568, i64 %t566 + store %S.lexer.Token %t565, ptr %t569 + store i64 %t567, ptr %t561 + br label %while.cond490 +while.end492: + %t570 = getelementptr inbounds { ptr, i64, i64 }, ptr %a19, i32 0, i32 1 + %t571 = insertvalue %S.lexer.Token zeroinitializer, { ptr, i64, i64 } { ptr @.str.465, i64 3, i64 0 }, 0 + %t572 = insertvalue %S.lexer.Token %t571, { ptr, i64, i64 } { ptr @.str.466, i64 0, i64 0 }, 1 + %t573 = load ptr, ptr %a18 + %t574 = icmp eq ptr %t573, null + br i1 %t574, label %panic792, label %ok793 +panic792: + call void @finch_panic(ptr @.str.467, i64 221, ptr @.str.468) + unreachable +ok793: + %t575 = getelementptr inbounds %S.lexer.Lexer, ptr %t573, i32 0, i32 3 + %t576 = load i64, ptr %t575 + %t577 = insertvalue %S.lexer.Token %t572, i64 %t576, 2 + %t578 = load ptr, ptr %a18 + %t579 = icmp eq ptr %t578, null + br i1 %t579, label %panic794, label %ok795 +panic794: + call void @finch_panic(ptr @.str.469, i64 221, ptr @.str.470) + unreachable +ok795: + %t580 = getelementptr inbounds %S.lexer.Lexer, ptr %t578, i32 0, i32 4 + %t581 = load i64, ptr %t580 + %t582 = insertvalue %S.lexer.Token %t577, i64 %t581, 3 + %t583 = insertvalue %S.lexer.Token %t582, i1 true, 4 + %t584 = load i64, ptr %t570 + %t585 = add i64 %t584, 1 + call void @finch_arr_reserve(ptr %a19, i64 %t585, i64 ptrtoint (ptr getelementptr (%S.lexer.Token, ptr null, i32 1) to i64)) + %t586 = load ptr, ptr %a19 + %t587 = getelementptr inbounds %S.lexer.Token, ptr %t586, i64 %t584 + store %S.lexer.Token %t583, ptr %t587 + store i64 %t585, ptr %t570 + %t588 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t588, ptr %a589 + call void @finch.copy.arr_S_lexer_Token(ptr %a590, ptr %a589) + %t591 = load { ptr, i64, i64 }, ptr %a590 + ret { ptr, i64, i64 } %t591 +} + +define internal %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + call void @finch_str_copy(ptr %a4, ptr %a3) + %t5 = load { ptr, i64, i64 }, ptr %a4 + %t6 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } %t5, 0 + ret %S.ast.Type %t6 +} + +define internal %S.ast.Type @finch.ast.arrayOf(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a7 = alloca %S.ast.Type, align 16 + %a8 = alloca %S.ast.Type, align 16 + %a15 = alloca %S.ast.Type, align 16 + %a16 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.471, i64 5, i64 0 }, 0 + store %S.ast.Type %t2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i32 0, i32 1 + %t6 = load %S.ast.Type, ptr %a1 + store %S.ast.Type %t6, ptr %a7 + call void @finch.copy.S_ast_Type(ptr %a8, ptr %a7) + %t9 = load %S.ast.Type, ptr %a8 + %t10 = load i64, ptr %t5 + %t11 = add i64 %t10, 1 + call void @finch_arr_reserve(ptr %t4, i64 %t11, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t12 = load ptr, ptr %t4 + %t13 = getelementptr inbounds %S.ast.Type, ptr %t12, i64 %t10 + store %S.ast.Type %t9, ptr %t13 + store i64 %t11, ptr %t5 + %t14 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t14, ptr %a15 + call void @finch.copy.S_ast_Type(ptr %a16, ptr %a15) + %t17 = load %S.ast.Type, ptr %a16 + ret %S.ast.Type %t17 +} + +define internal %S.ast.Type @finch.ast.mapOf(%S.ast.Type %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a8 = alloca %S.ast.Type, align 16 + %a9 = alloca %S.ast.Type, align 16 + %a18 = alloca %S.ast.Type, align 16 + %a19 = alloca %S.ast.Type, align 16 + %a26 = alloca %S.ast.Type, align 16 + %a27 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.472, i64 3, i64 0 }, 0 + store %S.ast.Type %t3, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i32 0, i32 1 + %t7 = load %S.ast.Type, ptr %a1 + store %S.ast.Type %t7, ptr %a8 + call void @finch.copy.S_ast_Type(ptr %a9, ptr %a8) + %t10 = load %S.ast.Type, ptr %a9 + %t11 = load i64, ptr %t6 + %t12 = add i64 %t11, 1 + call void @finch_arr_reserve(ptr %t5, i64 %t12, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t13 = load ptr, ptr %t5 + %t14 = getelementptr inbounds %S.ast.Type, ptr %t13, i64 %t11 + store %S.ast.Type %t10, ptr %t14 + store i64 %t12, ptr %t6 + %t15 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t15, i32 0, i32 1 + %t17 = load %S.ast.Type, ptr %a2 + store %S.ast.Type %t17, ptr %a18 + call void @finch.copy.S_ast_Type(ptr %a19, ptr %a18) + %t20 = load %S.ast.Type, ptr %a19 + %t21 = load i64, ptr %t16 + %t22 = add i64 %t21, 1 + call void @finch_arr_reserve(ptr %t15, i64 %t22, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t23 = load ptr, ptr %t15 + %t24 = getelementptr inbounds %S.ast.Type, ptr %t23, i64 %t21 + store %S.ast.Type %t20, ptr %t24 + store i64 %t22, ptr %t16 + %t25 = load %S.ast.Type, ptr %a4 + store %S.ast.Type %t25, ptr %a26 + call void @finch.copy.S_ast_Type(ptr %a27, ptr %a26) + %t28 = load %S.ast.Type, ptr %a27 + ret %S.ast.Type %t28 +} + +define internal %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a7 = alloca %S.ast.Type, align 16 + %a8 = alloca %S.ast.Type, align 16 + %a15 = alloca %S.ast.Type, align 16 + %a16 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.473, i64 3, i64 0 }, 0 + store %S.ast.Type %t2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i32 0, i32 1 + %t6 = load %S.ast.Type, ptr %a1 + store %S.ast.Type %t6, ptr %a7 + call void @finch.copy.S_ast_Type(ptr %a8, ptr %a7) + %t9 = load %S.ast.Type, ptr %a8 + %t10 = load i64, ptr %t5 + %t11 = add i64 %t10, 1 + call void @finch_arr_reserve(ptr %t4, i64 %t11, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t12 = load ptr, ptr %t4 + %t13 = getelementptr inbounds %S.ast.Type, ptr %t12, i64 %t10 + store %S.ast.Type %t9, ptr %t13 + store i64 %t11, ptr %t5 + %t14 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t14, ptr %a15 + call void @finch.copy.S_ast_Type(ptr %a16, ptr %a15) + %t17 = load %S.ast.Type, ptr %a16 + ret %S.ast.Type %t17 +} + +define internal i1 @finch.ast.same(%S.ast.Type %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca i64, align 16 + store %S.ast.Type %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t6 = load { ptr, i64, i64 }, ptr %t5 + store { ptr, i64, i64 } %t4, ptr %a7 + store { ptr, i64, i64 } %t6, ptr %a8 + %t9 = call i32 @finch_str_eq(ptr %a7, ptr %a8) + %t10 = icmp eq i32 %t9, 0 + br i1 %t10, label %then799, label %endif801 +then799: + ret i1 false +endif801: + %t11 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t12 = load { ptr, i64, i64 }, ptr %t11 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.474, i64 6, i64 0 }, ptr %a14 + %t15 = call i32 @finch_str_eq(ptr %a13, ptr %a14) + %t16 = icmp ne i32 %t15, 0 + br label %logic.from802 +logic.from802: + br i1 %t16, label %logic.end804, label %logic.rhs803 +logic.rhs803: + %t17 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t18 = load { ptr, i64, i64 }, ptr %t17 + store { ptr, i64, i64 } %t18, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.475, i64 5, i64 0 }, ptr %a20 + %t21 = call i32 @finch_str_eq(ptr %a19, ptr %a20) + %t22 = icmp ne i32 %t21, 0 + br label %logic.rend805 +logic.rend805: + br label %logic.end804 +logic.end804: + %t23 = phi i1 [ true, %logic.from802 ], [ %t22, %logic.rend805 ] + br label %logic.from806 +logic.from806: + br i1 %t23, label %logic.end808, label %logic.rhs807 +logic.rhs807: + %t24 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t25 = load { ptr, i64, i64 }, ptr %t24 + store { ptr, i64, i64 } %t25, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.476, i64 4, i64 0 }, ptr %a27 + %t28 = call i32 @finch_str_eq(ptr %a26, ptr %a27) + %t29 = icmp ne i32 %t28, 0 + br label %logic.rend809 +logic.rend809: + br label %logic.end808 +logic.end808: + %t30 = phi i1 [ true, %logic.from806 ], [ %t29, %logic.rend809 ] + br i1 %t30, label %then810, label %endif812 +then810: + %t31 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 2 + %t32 = load { ptr, i64, i64 }, ptr %t31 + %t33 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t34 = load { ptr, i64, i64 }, ptr %t33 + store { ptr, i64, i64 } %t32, ptr %a35 + store { ptr, i64, i64 } %t34, ptr %a36 + %t37 = call i32 @finch_str_eq(ptr %a35, ptr %a36) + %t38 = icmp ne i32 %t37, 0 + br label %logic.from813 +logic.from813: + br i1 %t38, label %logic.rhs814, label %logic.end815 +logic.rhs814: + %t39 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 3 + %t40 = load { ptr, i64, i64 }, ptr %t39 + %t41 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t42 = load { ptr, i64, i64 }, ptr %t41 + store { ptr, i64, i64 } %t40, ptr %a43 + store { ptr, i64, i64 } %t42, ptr %a44 + %t45 = call i32 @finch_str_eq(ptr %a43, ptr %a44) + %t46 = icmp ne i32 %t45, 0 + br label %logic.rend816 +logic.rend816: + br label %logic.end815 +logic.end815: + %t47 = phi i1 [ false, %logic.from813 ], [ %t46, %logic.rend816 ] + ret i1 %t47 +endif812: + %t48 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t49 = load { ptr, i64, i64 }, ptr %t48 + store { ptr, i64, i64 } %t49, ptr %a50 + store { ptr, i64, i64 } { ptr @.str.477, i64 5, i64 0 }, ptr %a51 + %t52 = call i32 @finch_str_eq(ptr %a50, ptr %a51) + %t53 = icmp ne i32 %t52, 0 + br label %logic.from817 +logic.from817: + br i1 %t53, label %logic.rhs818, label %logic.end819 +logic.rhs818: + %t54 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 4 + %t55 = load i64, ptr %t54 + %t56 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t57 = load i64, ptr %t56 + %t58 = icmp ne i64 %t55, %t57 + br label %logic.rend820 +logic.rend820: + br label %logic.end819 +logic.end819: + %t59 = phi i1 [ false, %logic.from817 ], [ %t58, %logic.rend820 ] + br i1 %t59, label %then821, label %endif823 +then821: + ret i1 false +endif823: + %t60 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t61 = load { ptr, i64, i64 }, ptr %t60 + store { ptr, i64, i64 } %t61, ptr %a62 + store { ptr, i64, i64 } { ptr @.str.478, i64 5, i64 0 }, ptr %a63 + %t64 = call i32 @finch_str_eq(ptr %a62, ptr %a63) + %t65 = icmp ne i32 %t64, 0 + br label %logic.from824 +logic.from824: + br i1 %t65, label %logic.end826, label %logic.rhs825 +logic.rhs825: + %t66 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t67 = load { ptr, i64, i64 }, ptr %t66 + store { ptr, i64, i64 } %t67, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.479, i64 3, i64 0 }, ptr %a69 + %t70 = call i32 @finch_str_eq(ptr %a68, ptr %a69) + %t71 = icmp ne i32 %t70, 0 + br label %logic.rend827 +logic.rend827: + br label %logic.end826 +logic.end826: + %t72 = phi i1 [ true, %logic.from824 ], [ %t71, %logic.rend827 ] + br label %logic.from828 +logic.from828: + br i1 %t72, label %logic.end830, label %logic.rhs829 +logic.rhs829: + %t73 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t74 = load { ptr, i64, i64 }, ptr %t73 + store { ptr, i64, i64 } %t74, ptr %a75 + store { ptr, i64, i64 } { ptr @.str.480, i64 3, i64 0 }, ptr %a76 + %t77 = call i32 @finch_str_eq(ptr %a75, ptr %a76) + %t78 = icmp ne i32 %t77, 0 + br label %logic.rend831 +logic.rend831: + br label %logic.end830 +logic.end830: + %t79 = phi i1 [ true, %logic.from828 ], [ %t78, %logic.rend831 ] + br label %logic.from832 +logic.from832: + br i1 %t79, label %logic.end834, label %logic.rhs833 +logic.rhs833: + %t80 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t81 = load { ptr, i64, i64 }, ptr %t80 + store { ptr, i64, i64 } %t81, ptr %a82 + store { ptr, i64, i64 } { ptr @.str.481, i64 5, i64 0 }, ptr %a83 + %t84 = call i32 @finch_str_eq(ptr %a82, ptr %a83) + %t85 = icmp ne i32 %t84, 0 + br label %logic.rend835 +logic.rend835: + br label %logic.end834 +logic.end834: + %t86 = phi i1 [ true, %logic.from832 ], [ %t85, %logic.rend835 ] + br i1 %t86, label %then836, label %endif838 +then836: + %t87 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t88 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i32 0, i32 1 + %t89 = load i64, ptr %t88 + %t90 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t91 = getelementptr inbounds { ptr, i64, i64 }, ptr %t90, i32 0, i32 1 + %t92 = load i64, ptr %t91 + %t93 = icmp ne i64 %t89, %t92 + br i1 %t93, label %then839, label %endif841 +then839: + ret i1 false +endif841: + %t94 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %t94, i32 0, i32 1 + %t96 = load i64, ptr %t95 + store i64 0, ptr %a97 + br label %for.cond842 +for.cond842: + %t98 = load i64, ptr %a97 + %t99 = icmp slt i64 %t98, %t96 + br i1 %t99, label %for.body843, label %for.end845 +for.body843: + %t100 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t101 = load i64, ptr %a97 + %t102 = load { ptr, i64, i64 }, ptr %t100 + %t103 = extractvalue { ptr, i64, i64 } %t102, 1 + %t104 = icmp uge i64 %t101, %t103 + br i1 %t104, label %range846, label %inrange847 +range846: + call void @finch_panic_index(ptr @.str.482, i64 54, i64 %t101, i64 %t103) + unreachable +inrange847: + %t105 = extractvalue { ptr, i64, i64 } %t102, 0 + %t106 = getelementptr inbounds %S.ast.Type, ptr %t105, i64 %t101 + %t107 = load %S.ast.Type, ptr %t106 + %t108 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t109 = load i64, ptr %a97 + %t110 = load { ptr, i64, i64 }, ptr %t108 + %t111 = extractvalue { ptr, i64, i64 } %t110, 1 + %t112 = icmp uge i64 %t109, %t111 + br i1 %t112, label %range848, label %inrange849 +range848: + call void @finch_panic_index(ptr @.str.483, i64 54, i64 %t109, i64 %t111) + unreachable +inrange849: + %t113 = extractvalue { ptr, i64, i64 } %t110, 0 + %t114 = getelementptr inbounds %S.ast.Type, ptr %t113, i64 %t109 + %t115 = load %S.ast.Type, ptr %t114 + %t116 = call i1 @finch.ast.same(%S.ast.Type %t107, %S.ast.Type %t115) + %t117 = xor i1 %t116, true + br i1 %t117, label %then850, label %endif852 +then850: + ret i1 false +endif852: + br label %for.step844 +for.step844: + %t118 = load i64, ptr %a97 + %t119 = add i64 %t118, 1 + store i64 %t119, ptr %a97 + br label %for.cond842 +for.end845: + ret i1 true +endif838: + ret i1 true +} + +define internal { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.484, i64 5, i64 0 }, ptr %a5 + %t6 = call i32 @finch_str_eq(ptr %a4, ptr %a5) + %t7 = icmp ne i32 %t6, 0 + br i1 %t7, label %then853, label %endif855 +then853: + %t8 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t9 = load { ptr, i64, i64 }, ptr %t8 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 0, %t10 + br i1 %t11, label %range856, label %inrange857 +range856: + call void @finch_panic_index(ptr @.str.486, i64 65, i64 0, i64 %t10) + unreachable +inrange857: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds %S.ast.Type, ptr %t12, i64 0 + %t14 = load %S.ast.Type, ptr %t13 + %t15 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t14) + store { ptr, i64, i64 } { ptr @.str.485, i64 2, i64 0 }, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + ret { ptr, i64, i64 } %t19 +endif855: + %t20 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.487, i64 5, i64 0 }, ptr %a23 + %t24 = call i32 @finch_str_eq(ptr %a22, ptr %a23) + %t25 = icmp ne i32 %t24, 0 + br i1 %t25, label %then858, label %endif860 +then858: + %t26 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 4 + %t27 = load i64, ptr %t26 + call void @finch_str_from_int(ptr %a28, i64 %t27) + %t29 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.488, i64 1, i64 0 }, ptr %a31 + store { ptr, i64, i64 } %t29, ptr %a32 + call void @finch_str_concat(ptr %a30, ptr %a31, ptr %a32) + %t33 = load { ptr, i64, i64 }, ptr %a30 + store { ptr, i64, i64 } %t33, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.489, i64 1, i64 0 }, ptr %a36 + call void @finch_str_concat(ptr %a34, ptr %a35, ptr %a36) + %t37 = load { ptr, i64, i64 }, ptr %a34 + %t38 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t39 = load { ptr, i64, i64 }, ptr %t38 + %t40 = extractvalue { ptr, i64, i64 } %t39, 1 + %t41 = icmp uge i64 0, %t40 + br i1 %t41, label %range861, label %inrange862 +range861: + call void @finch_panic_index(ptr @.str.490, i64 68, i64 0, i64 %t40) + unreachable +inrange862: + %t42 = extractvalue { ptr, i64, i64 } %t39, 0 + %t43 = getelementptr inbounds %S.ast.Type, ptr %t42, i64 0 + %t44 = load %S.ast.Type, ptr %t43 + %t45 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t44) + store { ptr, i64, i64 } %t37, ptr %a47 + store { ptr, i64, i64 } %t45, ptr %a48 + call void @finch_str_concat(ptr %a46, ptr %a47, ptr %a48) + %t49 = load { ptr, i64, i64 }, ptr %a46 + ret { ptr, i64, i64 } %t49 +endif860: + %t50 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t51 = load { ptr, i64, i64 }, ptr %t50 + store { ptr, i64, i64 } %t51, ptr %a52 + store { ptr, i64, i64 } { ptr @.str.491, i64 3, i64 0 }, ptr %a53 + %t54 = call i32 @finch_str_eq(ptr %a52, ptr %a53) + %t55 = icmp ne i32 %t54, 0 + br i1 %t55, label %then863, label %endif865 +then863: + %t56 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t57 = load { ptr, i64, i64 }, ptr %t56 + %t58 = extractvalue { ptr, i64, i64 } %t57, 1 + %t59 = icmp uge i64 0, %t58 + br i1 %t59, label %range866, label %inrange867 +range866: + call void @finch_panic_index(ptr @.str.493, i64 71, i64 0, i64 %t58) + unreachable +inrange867: + %t60 = extractvalue { ptr, i64, i64 } %t57, 0 + %t61 = getelementptr inbounds %S.ast.Type, ptr %t60, i64 0 + %t62 = load %S.ast.Type, ptr %t61 + %t63 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t62) + store { ptr, i64, i64 } { ptr @.str.492, i64 4, i64 0 }, ptr %a65 + store { ptr, i64, i64 } %t63, ptr %a66 + call void @finch_str_concat(ptr %a64, ptr %a65, ptr %a66) + %t67 = load { ptr, i64, i64 }, ptr %a64 + store { ptr, i64, i64 } %t67, ptr %a69 + store { ptr, i64, i64 } { ptr @.str.494, i64 1, i64 0 }, ptr %a70 + call void @finch_str_concat(ptr %a68, ptr %a69, ptr %a70) + %t71 = load { ptr, i64, i64 }, ptr %a68 + %t72 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t73 = load { ptr, i64, i64 }, ptr %t72 + %t74 = extractvalue { ptr, i64, i64 } %t73, 1 + %t75 = icmp uge i64 1, %t74 + br i1 %t75, label %range868, label %inrange869 +range868: + call void @finch_panic_index(ptr @.str.495, i64 71, i64 1, i64 %t74) + unreachable +inrange869: + %t76 = extractvalue { ptr, i64, i64 } %t73, 0 + %t77 = getelementptr inbounds %S.ast.Type, ptr %t76, i64 1 + %t78 = load %S.ast.Type, ptr %t77 + %t79 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t78) + store { ptr, i64, i64 } %t71, ptr %a81 + store { ptr, i64, i64 } %t79, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + ret { ptr, i64, i64 } %t83 +endif865: + %t84 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t85 = load { ptr, i64, i64 }, ptr %t84 + store { ptr, i64, i64 } %t85, ptr %a86 + store { ptr, i64, i64 } { ptr @.str.496, i64 3, i64 0 }, ptr %a87 + %t88 = call i32 @finch_str_eq(ptr %a86, ptr %a87) + %t89 = icmp ne i32 %t88, 0 + br i1 %t89, label %then870, label %endif872 +then870: + %t90 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t91 = getelementptr inbounds { ptr, i64, i64 }, ptr %t90, i32 0, i32 1 + %t92 = load i64, ptr %t91 + %t93 = icmp eq i64 %t92, 0 + br i1 %t93, label %then873, label %endif875 +then873: + ret { ptr, i64, i64 } { ptr @.str.497, i64 3, i64 0 } +endif875: + %t94 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t95 = load { ptr, i64, i64 }, ptr %t94 + %t96 = extractvalue { ptr, i64, i64 } %t95, 1 + %t97 = icmp uge i64 0, %t96 + br i1 %t97, label %range876, label %inrange877 +range876: + call void @finch_panic_index(ptr @.str.499, i64 77, i64 0, i64 %t96) + unreachable +inrange877: + %t98 = extractvalue { ptr, i64, i64 } %t95, 0 + %t99 = getelementptr inbounds %S.ast.Type, ptr %t98, i64 0 + %t100 = load %S.ast.Type, ptr %t99 + %t101 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t100) + store { ptr, i64, i64 } { ptr @.str.498, i64 4, i64 0 }, ptr %a103 + store { ptr, i64, i64 } %t101, ptr %a104 + call void @finch_str_concat(ptr %a102, ptr %a103, ptr %a104) + %t105 = load { ptr, i64, i64 }, ptr %a102 + store { ptr, i64, i64 } %t105, ptr %a107 + store { ptr, i64, i64 } { ptr @.str.500, i64 1, i64 0 }, ptr %a108 + call void @finch_str_concat(ptr %a106, ptr %a107, ptr %a108) + %t109 = load { ptr, i64, i64 }, ptr %a106 + ret { ptr, i64, i64 } %t109 +endif872: + %t110 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t111 = load { ptr, i64, i64 }, ptr %t110 + store { ptr, i64, i64 } %t111, ptr %a112 + store { ptr, i64, i64 } { ptr @.str.501, i64 6, i64 0 }, ptr %a113 + %t114 = call i32 @finch_str_eq(ptr %a112, ptr %a113) + %t115 = icmp ne i32 %t114, 0 + br label %logic.from878 +logic.from878: + br i1 %t115, label %logic.end880, label %logic.rhs879 +logic.rhs879: + %t116 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t117 = load { ptr, i64, i64 }, ptr %t116 + store { ptr, i64, i64 } %t117, ptr %a118 + store { ptr, i64, i64 } { ptr @.str.502, i64 5, i64 0 }, ptr %a119 + %t120 = call i32 @finch_str_eq(ptr %a118, ptr %a119) + %t121 = icmp ne i32 %t120, 0 + br label %logic.rend881 +logic.rend881: + br label %logic.end880 +logic.end880: + %t122 = phi i1 [ true, %logic.from878 ], [ %t121, %logic.rend881 ] + br label %logic.from882 +logic.from882: + br i1 %t122, label %logic.end884, label %logic.rhs883 +logic.rhs883: + %t123 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t124 = load { ptr, i64, i64 }, ptr %t123 + store { ptr, i64, i64 } %t124, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.503, i64 4, i64 0 }, ptr %a126 + %t127 = call i32 @finch_str_eq(ptr %a125, ptr %a126) + %t128 = icmp ne i32 %t127, 0 + br label %logic.rend885 +logic.rend885: + br label %logic.end884 +logic.end884: + %t129 = phi i1 [ true, %logic.from882 ], [ %t128, %logic.rend885 ] + br i1 %t129, label %then886, label %endif888 +then886: + %t130 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 3 + %t131 = getelementptr inbounds { ptr, i64, i64 }, ptr %t130, i32 0, i32 1 + %t132 = load i64, ptr %t131 + %t133 = icmp sgt i64 %t132, 0 + br i1 %t133, label %then889, label %endif891 +then889: + %t134 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 3 + %t135 = load { ptr, i64, i64 }, ptr %t134 + store { ptr, i64, i64 } %t135, ptr %a137 + store { ptr, i64, i64 } { ptr @.str.504, i64 1, i64 0 }, ptr %a138 + call void @finch_str_concat(ptr %a136, ptr %a137, ptr %a138) + %t139 = load { ptr, i64, i64 }, ptr %a136 + %t140 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 2 + %t141 = load { ptr, i64, i64 }, ptr %t140 + store { ptr, i64, i64 } %t139, ptr %a143 + store { ptr, i64, i64 } %t141, ptr %a144 + call void @finch_str_concat(ptr %a142, ptr %a143, ptr %a144) + %t145 = load { ptr, i64, i64 }, ptr %a142 + ret { ptr, i64, i64 } %t145 +endif891: + %t146 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 2 + %t147 = load { ptr, i64, i64 }, ptr %t146 + store { ptr, i64, i64 } %t147, ptr %a148 + call void @finch_str_copy(ptr %a149, ptr %a148) + %t150 = load { ptr, i64, i64 }, ptr %a149 + ret { ptr, i64, i64 } %t150 +endif888: + %t151 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t152 = load { ptr, i64, i64 }, ptr %t151 + store { ptr, i64, i64 } %t152, ptr %a153 + store { ptr, i64, i64 } { ptr @.str.505, i64 4, i64 0 }, ptr %a154 + %t155 = call i32 @finch_str_eq(ptr %a153, ptr %a154) + %t156 = icmp ne i32 %t155, 0 + br i1 %t156, label %then892, label %endif894 +then892: + ret { ptr, i64, i64 } { ptr @.str.506, i64 7, i64 0 } +endif894: + %t157 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t158 = load { ptr, i64, i64 }, ptr %t157 + store { ptr, i64, i64 } %t158, ptr %a159 + call void @finch_str_copy(ptr %a160, ptr %a159) + %t161 = load { ptr, i64, i64 }, ptr %a160 + ret { ptr, i64, i64 } %t161 +} + +define internal void @finch.parser.fail(ptr %p0, %S.lexer.Token %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.lexer.Token, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.lexer.Token %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic895, label %ok896 +panic895: + call void @finch_panic(ptr @.str.507, i64 14, ptr @.str.508) + unreachable +ok896: + %t6 = getelementptr inbounds %S.parser.Parser, ptr %t4, i32 0, i32 4 + %t7 = load { ptr, i64, i64 }, ptr %t6 + store { ptr, i64, i64 } %t7, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.509, i64 1, i64 0 }, ptr %a10 + call void @finch_str_concat(ptr %a8, ptr %a9, ptr %a10) + %t11 = load { ptr, i64, i64 }, ptr %a8 + %t12 = getelementptr inbounds %S.lexer.Token, ptr %a2, i32 0, i32 2 + %t13 = load i64, ptr %t12 + call void @finch_str_from_int(ptr %a14, i64 %t13) + %t15 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t11, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t19, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.510, i64 1, i64 0 }, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + %t24 = getelementptr inbounds %S.lexer.Token, ptr %a2, i32 0, i32 3 + %t25 = load i64, ptr %t24 + call void @finch_str_from_int(ptr %a26, i64 %t25) + %t27 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t23, ptr %a29 + store { ptr, i64, i64 } %t27, ptr %a30 + call void @finch_str_concat(ptr %a28, ptr %a29, ptr %a30) + %t31 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } %t31, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.511, i64 9, i64 0 }, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + %t36 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t35, ptr %a38 + store { ptr, i64, i64 } %t36, ptr %a39 + call void @finch_str_concat(ptr %a37, ptr %a38, ptr %a39) + %t40 = load { ptr, i64, i64 }, ptr %a37 + %t41 = extractvalue { ptr, i64, i64 } %t40, 1 + %t42 = trunc i64 %t41 to i32 + %t43 = extractvalue { ptr, i64, i64 } %t40, 0 + %t44 = icmp eq ptr %t43, null + %t45 = select i1 %t44, ptr @.str.512, ptr %t43 + %t46 = call i32 (ptr, ...) @printf(ptr @.str.513, i32 %t42, ptr %t45) + %t47 = call i32 (ptr, ...) @printf(ptr @.str.514) + %t48 = trunc i64 1 to i32 + %t49 = call i32 @fflush(ptr null) + call void @exit(i32 %t48) + ret void +} + +define internal %S.lexer.Token @finch.parser.cur(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a15 = alloca %S.lexer.Token, align 16 + %a16 = alloca %S.lexer.Token, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic897, label %ok898 +panic897: + call void @finch_panic(ptr @.str.515, i64 19, ptr @.str.516) + unreachable +ok898: + %t4 = getelementptr inbounds %S.parser.Parser, ptr %t2, i32 0, i32 0 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic899, label %ok900 +panic899: + call void @finch_panic(ptr @.str.517, i64 19, ptr @.str.518) + unreachable +ok900: + %t7 = getelementptr inbounds %S.parser.Parser, ptr %t5, i32 0, i32 1 + %t8 = load i64, ptr %t7 + %t9 = load { ptr, i64, i64 }, ptr %t4 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 %t8, %t10 + br i1 %t11, label %range901, label %inrange902 +range901: + call void @finch_panic_index(ptr @.str.519, i64 19, i64 %t8, i64 %t10) + unreachable +inrange902: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds %S.lexer.Token, ptr %t12, i64 %t8 + %t14 = load %S.lexer.Token, ptr %t13 + store %S.lexer.Token %t14, ptr %a15 + call void @finch.copy.S_lexer_Token(ptr %a16, ptr %a15) + %t17 = load %S.lexer.Token, ptr %a16 + ret %S.lexer.Token %t17 +} + +define internal { ptr, i64, i64 } @finch.parser.curKind(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic903, label %ok904 +panic903: + call void @finch_panic(ptr @.str.520, i64 23, ptr @.str.521) + unreachable +ok904: + %t4 = getelementptr inbounds %S.parser.Parser, ptr %t2, i32 0, i32 0 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic905, label %ok906 +panic905: + call void @finch_panic(ptr @.str.522, i64 23, ptr @.str.523) + unreachable +ok906: + %t7 = getelementptr inbounds %S.parser.Parser, ptr %t5, i32 0, i32 1 + %t8 = load i64, ptr %t7 + %t9 = load { ptr, i64, i64 }, ptr %t4 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 %t8, %t10 + br i1 %t11, label %range907, label %inrange908 +range907: + call void @finch_panic_index(ptr @.str.524, i64 23, i64 %t8, i64 %t10) + unreachable +inrange908: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds %S.lexer.Token, ptr %t12, i64 %t8 + %t14 = getelementptr inbounds %S.lexer.Token, ptr %t13, i32 0, i32 0 + %t15 = load { ptr, i64, i64 }, ptr %t14 + store { ptr, i64, i64 } %t15, ptr %a16 + call void @finch_str_copy(ptr %a17, ptr %a16) + %t18 = load { ptr, i64, i64 }, ptr %a17 + ret { ptr, i64, i64 } %t18 +} + +define internal { ptr, i64, i64 } @finch.parser.peekKind(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a9 = alloca i64, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic909, label %ok910 +panic909: + call void @finch_panic(ptr @.str.525, i64 27, ptr @.str.526) + unreachable +ok910: + %t5 = getelementptr inbounds %S.parser.Parser, ptr %t3, i32 0, i32 1 + %t6 = load i64, ptr %t5 + %t7 = load i64, ptr %a2 + %t8 = add i64 %t6, %t7 + store i64 %t8, ptr %a9 + %t10 = load i64, ptr %a9 + %t11 = load ptr, ptr %a1 + %t12 = icmp eq ptr %t11, null + br i1 %t12, label %panic911, label %ok912 +panic911: + call void @finch_panic(ptr @.str.527, i64 28, ptr @.str.528) + unreachable +ok912: + %t13 = getelementptr inbounds %S.parser.Parser, ptr %t11, i32 0, i32 0 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i32 0, i32 1 + %t15 = load i64, ptr %t14 + %t16 = icmp sge i64 %t10, %t15 + br i1 %t16, label %then913, label %endif915 +then913: + %t17 = load ptr, ptr %a1 + %t18 = icmp eq ptr %t17, null + br i1 %t18, label %panic916, label %ok917 +panic916: + call void @finch_panic(ptr @.str.529, i64 29, ptr @.str.530) + unreachable +ok917: + %t19 = getelementptr inbounds %S.parser.Parser, ptr %t17, i32 0, i32 0 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t19, i32 0, i32 1 + %t21 = load i64, ptr %t20 + %t22 = sub i64 %t21, 1 + store i64 %t22, ptr %a9 + br label %endif915 +endif915: + %t23 = load ptr, ptr %a1 + %t24 = icmp eq ptr %t23, null + br i1 %t24, label %panic918, label %ok919 +panic918: + call void @finch_panic(ptr @.str.531, i64 31, ptr @.str.532) + unreachable +ok919: + %t25 = getelementptr inbounds %S.parser.Parser, ptr %t23, i32 0, i32 0 + %t26 = load i64, ptr %a9 + %t27 = load { ptr, i64, i64 }, ptr %t25 + %t28 = extractvalue { ptr, i64, i64 } %t27, 1 + %t29 = icmp uge i64 %t26, %t28 + br i1 %t29, label %range920, label %inrange921 +range920: + call void @finch_panic_index(ptr @.str.533, i64 31, i64 %t26, i64 %t28) + unreachable +inrange921: + %t30 = extractvalue { ptr, i64, i64 } %t27, 0 + %t31 = getelementptr inbounds %S.lexer.Token, ptr %t30, i64 %t26 + %t32 = getelementptr inbounds %S.lexer.Token, ptr %t31, i32 0, i32 0 + %t33 = load { ptr, i64, i64 }, ptr %t32 + store { ptr, i64, i64 } %t33, ptr %a34 + call void @finch_str_copy(ptr %a35, ptr %a34) + %t36 = load { ptr, i64, i64 }, ptr %a35 + ret { ptr, i64, i64 } %t36 +} + +define internal i1 @finch.parser.at(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic922, label %ok923 +panic922: + call void @finch_panic(ptr @.str.534, i64 35, ptr @.str.535) + unreachable +ok923: + %t5 = getelementptr inbounds %S.parser.Parser, ptr %t3, i32 0, i32 0 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic924, label %ok925 +panic924: + call void @finch_panic(ptr @.str.536, i64 35, ptr @.str.537) + unreachable +ok925: + %t8 = getelementptr inbounds %S.parser.Parser, ptr %t6, i32 0, i32 1 + %t9 = load i64, ptr %t8 + %t10 = load { ptr, i64, i64 }, ptr %t5 + %t11 = extractvalue { ptr, i64, i64 } %t10, 1 + %t12 = icmp uge i64 %t9, %t11 + br i1 %t12, label %range926, label %inrange927 +range926: + call void @finch_panic_index(ptr @.str.538, i64 35, i64 %t9, i64 %t11) + unreachable +inrange927: + %t13 = extractvalue { ptr, i64, i64 } %t10, 0 + %t14 = getelementptr inbounds %S.lexer.Token, ptr %t13, i64 %t9 + %t15 = getelementptr inbounds %S.lexer.Token, ptr %t14, i32 0, i32 0 + %t16 = load { ptr, i64, i64 }, ptr %t15 + %t17 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t16, ptr %a18 + store { ptr, i64, i64 } %t17, ptr %a19 + %t20 = call i32 @finch_str_eq(ptr %a18, ptr %a19) + %t21 = icmp ne i32 %t20, 0 + ret i1 %t21 +} + +define internal %S.lexer.Token @finch.parser.next(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a15 = alloca %S.lexer.Token, align 16 + %a16 = alloca %S.lexer.Token, align 16 + %a18 = alloca %S.lexer.Token, align 16 + %a25 = alloca %S.lexer.Token, align 16 + %a26 = alloca %S.lexer.Token, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic928, label %ok929 +panic928: + call void @finch_panic(ptr @.str.539, i64 39, ptr @.str.540) + unreachable +ok929: + %t4 = getelementptr inbounds %S.parser.Parser, ptr %t2, i32 0, i32 0 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic930, label %ok931 +panic930: + call void @finch_panic(ptr @.str.541, i64 39, ptr @.str.542) + unreachable +ok931: + %t7 = getelementptr inbounds %S.parser.Parser, ptr %t5, i32 0, i32 1 + %t8 = load i64, ptr %t7 + %t9 = load { ptr, i64, i64 }, ptr %t4 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 %t8, %t10 + br i1 %t11, label %range932, label %inrange933 +range932: + call void @finch_panic_index(ptr @.str.543, i64 39, i64 %t8, i64 %t10) + unreachable +inrange933: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds %S.lexer.Token, ptr %t12, i64 %t8 + %t14 = load %S.lexer.Token, ptr %t13 + store %S.lexer.Token %t14, ptr %a15 + call void @finch.copy.S_lexer_Token(ptr %a16, ptr %a15) + %t17 = load %S.lexer.Token, ptr %a16 + store %S.lexer.Token %t17, ptr %a18 + %t19 = load ptr, ptr %a1 + %t20 = icmp eq ptr %t19, null + br i1 %t20, label %panic934, label %ok935 +panic934: + call void @finch_panic(ptr @.str.544, i64 40, ptr @.str.545) + unreachable +ok935: + %t21 = getelementptr inbounds %S.parser.Parser, ptr %t19, i32 0, i32 1 + %t22 = load i64, ptr %t21 + %t23 = add i64 %t22, 1 + store i64 %t23, ptr %t21 + %t24 = load %S.lexer.Token, ptr %a18 + store %S.lexer.Token %t24, ptr %a25 + call void @finch.copy.S_lexer_Token(ptr %a26, ptr %a25) + %t27 = load %S.lexer.Token, ptr %a26 + ret %S.lexer.Token %t27 +} + +define internal i1 @finch.parser.accept(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load { ptr, i64, i64 }, ptr %a2 + %t5 = call i1 @finch.parser.at(ptr %t3, { ptr, i64, i64 } %t4) + br i1 %t5, label %then936, label %endif938 +then936: + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic939, label %ok940 +panic939: + call void @finch_panic(ptr @.str.546, i64 46, ptr @.str.547) + unreachable +ok940: + %t8 = getelementptr inbounds %S.parser.Parser, ptr %t6, i32 0, i32 1 + %t9 = load i64, ptr %t8 + %t10 = add i64 %t9, 1 + store i64 %t10, ptr %t8 + ret i1 true +endif938: + ret i1 false +} + +define internal { ptr, i64, i64 } @finch.parser.describe(%S.lexer.Token %p0) { +entry: + %a1 = alloca %S.lexer.Token, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + store %S.lexer.Token %p0, ptr %a1 + %t2 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.548, i64 5, i64 0 }, ptr %a5 + %t6 = call i32 @finch_str_eq(ptr %a4, ptr %a5) + %t7 = icmp ne i32 %t6, 0 + br i1 %t7, label %then941, label %endif943 +then941: + %t8 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 1 + %t9 = load { ptr, i64, i64 }, ptr %t8 + store { ptr, i64, i64 } { ptr @.str.549, i64 1, i64 0 }, ptr %a11 + store { ptr, i64, i64 } %t9, ptr %a12 + call void @finch_str_concat(ptr %a10, ptr %a11, ptr %a12) + %t13 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t13, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.550, i64 1, i64 0 }, ptr %a16 + call void @finch_str_concat(ptr %a14, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + ret { ptr, i64, i64 } %t17 +endif943: + %t18 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 0 + %t19 = load { ptr, i64, i64 }, ptr %t18 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.551, i64 3, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br i1 %t23, label %then944, label %endif946 +then944: + ret { ptr, i64, i64 } { ptr @.str.552, i64 11, i64 0 } +endif946: + %t24 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 0 + %t25 = load { ptr, i64, i64 }, ptr %t24 + store { ptr, i64, i64 } %t25, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.553, i64 3, i64 0 }, ptr %a27 + %t28 = call i32 @finch_str_eq(ptr %a26, ptr %a27) + %t29 = icmp ne i32 %t28, 0 + br label %logic.from947 +logic.from947: + br i1 %t29, label %logic.end949, label %logic.rhs948 +logic.rhs948: + %t30 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 0 + %t31 = load { ptr, i64, i64 }, ptr %t30 + store { ptr, i64, i64 } %t31, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.554, i64 5, i64 0 }, ptr %a33 + %t34 = call i32 @finch_str_eq(ptr %a32, ptr %a33) + %t35 = icmp ne i32 %t34, 0 + br label %logic.rend950 +logic.rend950: + br label %logic.end949 +logic.end949: + %t36 = phi i1 [ true, %logic.from947 ], [ %t35, %logic.rend950 ] + br i1 %t36, label %then951, label %endif953 +then951: + ret { ptr, i64, i64 } { ptr @.str.555, i64 8, i64 0 } +endif953: + %t37 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 0 + %t38 = load { ptr, i64, i64 }, ptr %t37 + store { ptr, i64, i64 } %t38, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.556, i64 6, i64 0 }, ptr %a40 + %t41 = call i32 @finch_str_eq(ptr %a39, ptr %a40) + %t42 = icmp ne i32 %t41, 0 + br i1 %t42, label %then954, label %endif956 +then954: + ret { ptr, i64, i64 } { ptr @.str.557, i64 8, i64 0 } +endif956: + %t43 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 0 + %t44 = load { ptr, i64, i64 }, ptr %t43 + store { ptr, i64, i64 } %t44, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.558, i64 4, i64 0 }, ptr %a46 + %t47 = call i32 @finch_str_eq(ptr %a45, ptr %a46) + %t48 = icmp ne i32 %t47, 0 + br i1 %t48, label %then957, label %endif959 +then957: + ret { ptr, i64, i64 } { ptr @.str.559, i64 6, i64 0 } +endif959: + %t49 = getelementptr inbounds %S.lexer.Token, ptr %a1, i32 0, i32 0 + %t50 = load { ptr, i64, i64 }, ptr %t49 + store { ptr, i64, i64 } { ptr @.str.560, i64 1, i64 0 }, ptr %a52 + store { ptr, i64, i64 } %t50, ptr %a53 + call void @finch_str_concat(ptr %a51, ptr %a52, ptr %a53) + %t54 = load { ptr, i64, i64 }, ptr %a51 + store { ptr, i64, i64 } %t54, ptr %a56 + store { ptr, i64, i64 } { ptr @.str.561, i64 1, i64 0 }, ptr %a57 + call void @finch_str_concat(ptr %a55, ptr %a56, ptr %a57) + %t58 = load { ptr, i64, i64 }, ptr %a55 + ret { ptr, i64, i64 } %t58 +} + +define internal %S.lexer.Token @finch.parser.expect(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = load { ptr, i64, i64 }, ptr %a2 + %t6 = call i1 @finch.parser.at(ptr %t4, { ptr, i64, i64 } %t5) + %t7 = xor i1 %t6, true + br i1 %t7, label %then960, label %endif962 +then960: + %t8 = load ptr, ptr %a1 + %t9 = load ptr, ptr %a1 + %t10 = call %S.lexer.Token @finch.parser.cur(ptr %t9) + %t11 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.562, i64 9, i64 0 }, ptr %a13 + store { ptr, i64, i64 } %t11, ptr %a14 + call void @finch_str_concat(ptr %a12, ptr %a13, ptr %a14) + %t15 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t15, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.563, i64 8, i64 0 }, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + %t20 = load ptr, ptr %a1 + %t21 = call %S.lexer.Token @finch.parser.cur(ptr %t20) + %t22 = call { ptr, i64, i64 } @finch.parser.describe(%S.lexer.Token %t21) + store { ptr, i64, i64 } %t19, ptr %a24 + store { ptr, i64, i64 } %t22, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + call void @finch.parser.fail(ptr %t8, %S.lexer.Token %t10, { ptr, i64, i64 } %t26) + br label %endif962 +endif962: + %t27 = load ptr, ptr %a1 + %t28 = call %S.lexer.Token @finch.parser.next(ptr %t27) + ret %S.lexer.Token %t28 +} + +define internal i1 @finch.parser.sameLine(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic963, label %ok964 +panic963: + call void @finch_panic(ptr @.str.564, i64 79, ptr @.str.565) + unreachable +ok964: + %t4 = getelementptr inbounds %S.parser.Parser, ptr %t2, i32 0, i32 2 + %t5 = load i64, ptr %t4 + %t6 = icmp sgt i64 %t5, 0 + br label %logic.from965 +logic.from965: + br i1 %t6, label %logic.end967, label %logic.rhs966 +logic.rhs966: + %t7 = load ptr, ptr %a1 + %t8 = icmp eq ptr %t7, null + br i1 %t8, label %panic968, label %ok969 +panic968: + call void @finch_panic(ptr @.str.566, i64 79, ptr @.str.567) + unreachable +ok969: + %t9 = getelementptr inbounds %S.parser.Parser, ptr %t7, i32 0, i32 0 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic970, label %ok971 +panic970: + call void @finch_panic(ptr @.str.568, i64 79, ptr @.str.569) + unreachable +ok971: + %t12 = getelementptr inbounds %S.parser.Parser, ptr %t10, i32 0, i32 1 + %t13 = load i64, ptr %t12 + %t14 = load { ptr, i64, i64 }, ptr %t9 + %t15 = extractvalue { ptr, i64, i64 } %t14, 1 + %t16 = icmp uge i64 %t13, %t15 + br i1 %t16, label %range972, label %inrange973 +range972: + call void @finch_panic_index(ptr @.str.570, i64 79, i64 %t13, i64 %t15) + unreachable +inrange973: + %t17 = extractvalue { ptr, i64, i64 } %t14, 0 + %t18 = getelementptr inbounds %S.lexer.Token, ptr %t17, i64 %t13 + %t19 = getelementptr inbounds %S.lexer.Token, ptr %t18, i32 0, i32 4 + %t20 = load i1, ptr %t19 + %t21 = xor i1 %t20, true + br label %logic.rend974 +logic.rend974: + br label %logic.end967 +logic.end967: + %t22 = phi i1 [ true, %logic.from965 ], [ %t21, %logic.rend974 ] + ret i1 %t22 +} + +define internal %S.ast.Node @finch.parser.node(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca %S.lexer.Token, align 16 + %a17 = alloca %S.lexer.Token, align 16 + %a19 = alloca %S.lexer.Token, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic975, label %ok976 +panic975: + call void @finch_panic(ptr @.str.571, i64 83, ptr @.str.572) + unreachable +ok976: + %t5 = getelementptr inbounds %S.parser.Parser, ptr %t3, i32 0, i32 0 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic977, label %ok978 +panic977: + call void @finch_panic(ptr @.str.573, i64 83, ptr @.str.574) + unreachable +ok978: + %t8 = getelementptr inbounds %S.parser.Parser, ptr %t6, i32 0, i32 1 + %t9 = load i64, ptr %t8 + %t10 = load { ptr, i64, i64 }, ptr %t5 + %t11 = extractvalue { ptr, i64, i64 } %t10, 1 + %t12 = icmp uge i64 %t9, %t11 + br i1 %t12, label %range979, label %inrange980 +range979: + call void @finch_panic_index(ptr @.str.575, i64 83, i64 %t9, i64 %t11) + unreachable +inrange980: + %t13 = extractvalue { ptr, i64, i64 } %t10, 0 + %t14 = getelementptr inbounds %S.lexer.Token, ptr %t13, i64 %t9 + %t15 = load %S.lexer.Token, ptr %t14 + store %S.lexer.Token %t15, ptr %a16 + call void @finch.copy.S_lexer_Token(ptr %a17, ptr %a16) + %t18 = load %S.lexer.Token, ptr %a17 + store %S.lexer.Token %t18, ptr %a19 + %t20 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t20, ptr %a21 + call void @finch_str_copy(ptr %a22, ptr %a21) + %t23 = load { ptr, i64, i64 }, ptr %a22 + %t24 = insertvalue %S.ast.Node zeroinitializer, { ptr, i64, i64 } %t23, 0 + %t25 = getelementptr inbounds %S.lexer.Token, ptr %a19, i32 0, i32 2 + %t26 = load i64, ptr %t25 + %t27 = insertvalue %S.ast.Node %t24, i64 %t26, 11 + %t28 = getelementptr inbounds %S.lexer.Token, ptr %a19, i32 0, i32 3 + %t29 = load i64, ptr %t28 + %t30 = insertvalue %S.ast.Node %t27, i64 %t29, 12 + %t31 = load ptr, ptr %a1 + %t32 = icmp eq ptr %t31, null + br i1 %t32, label %panic981, label %ok982 +panic981: + call void @finch_panic(ptr @.str.576, i64 84, ptr @.str.577) + unreachable +ok982: + %t33 = getelementptr inbounds %S.parser.Parser, ptr %t31, i32 0, i32 3 + %t34 = load i64, ptr %t33 + %t35 = insertvalue %S.ast.Node %t30, i64 %t34, 13 + ret %S.ast.Node %t35 +} + +define internal i1 @finch.parser.isTypeName({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca i64, align 16 + %a29 = alloca i64, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = mul i64 16, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t3 = call ptr @finch_alloc(i64 %t2) + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 0 + store { ptr, i64, i64 } { ptr @.str.578, i64 3, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 1 + store { ptr, i64, i64 } { ptr @.str.579, i64 5, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 2 + store { ptr, i64, i64 } { ptr @.str.580, i64 4, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 3 + store { ptr, i64, i64 } { ptr @.str.581, i64 4, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 4 + store { ptr, i64, i64 } { ptr @.str.582, i64 3, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 5 + store { ptr, i64, i64 } { ptr @.str.583, i64 3, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 6 + store { ptr, i64, i64 } { ptr @.str.584, i64 2, i64 0 }, ptr %t10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 7 + store { ptr, i64, i64 } { ptr @.str.585, i64 3, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 8 + store { ptr, i64, i64 } { ptr @.str.586, i64 3, i64 0 }, ptr %t12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 9 + store { ptr, i64, i64 } { ptr @.str.587, i64 3, i64 0 }, ptr %t13 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 10 + store { ptr, i64, i64 } { ptr @.str.588, i64 2, i64 0 }, ptr %t14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 11 + store { ptr, i64, i64 } { ptr @.str.589, i64 3, i64 0 }, ptr %t15 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 12 + store { ptr, i64, i64 } { ptr @.str.590, i64 3, i64 0 }, ptr %t16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 13 + store { ptr, i64, i64 } { ptr @.str.591, i64 3, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 14 + store { ptr, i64, i64 } { ptr @.str.592, i64 3, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 15 + store { ptr, i64, i64 } { ptr @.str.593, i64 3, i64 0 }, ptr %t19 + %t20 = insertvalue { ptr, i64, i64 } undef, ptr %t3, 0 + %t21 = insertvalue { ptr, i64, i64 } %t20, i64 16, 1 + %t22 = insertvalue { ptr, i64, i64 } %t21, i64 16, 2 + store { ptr, i64, i64 } %t22, ptr %a23 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %a23, i32 0, i32 1 + %t25 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a26 + %t27 = load i64, ptr %t24 + %t28 = load ptr, ptr %a23 + store i64 0, ptr %a29 + br label %find.cond983 +find.cond983: + %t30 = load i64, ptr %a29 + %t31 = icmp slt i64 %t30, %t27 + br i1 %t31, label %find.body984, label %find.end987 +find.body984: + %t32 = getelementptr inbounds { ptr, i64, i64 }, ptr %t28, i64 %t30 + %t33 = load { ptr, i64, i64 }, ptr %t32 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } %t25, ptr %a35 + %t36 = call i32 @finch_str_eq(ptr %a34, ptr %a35) + %t37 = icmp ne i32 %t36, 0 + br i1 %t37, label %find.hit985, label %find.next986 +find.hit985: + store i64 %t30, ptr %a26 + br label %find.end987 +find.next986: + %t38 = add i64 %t30, 1 + store i64 %t38, ptr %a29 + br label %find.cond983 +find.end987: + %t39 = load i64, ptr %a26 + %t40 = icmp sge i64 %t39, 0 + ret i1 %t40 +} + +define internal %S.ast.Type @finch.parser.parseType(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca %S.ast.Type, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca %S.ast.Type, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca %S.ast.Type, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca %S.ast.Type, align 16 + %a144 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call i1 @finch.parser.accept(ptr %t2, { ptr, i64, i64 } { ptr @.str.594, i64 1, i64 0 }) + br i1 %t3, label %then988, label %endif990 +then988: + %t4 = load ptr, ptr %a1 + %t5 = call %S.lexer.Token @finch.parser.expect(ptr %t4, { ptr, i64, i64 } { ptr @.str.595, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.596, i64 36, i64 0 }) + %t6 = load ptr, ptr %a1 + %t7 = call %S.ast.Type @finch.parser.parseType(ptr %t6) + %t8 = call %S.ast.Type @finch.ast.arrayOf(%S.ast.Type %t7) + ret %S.ast.Type %t8 +endif990: + %t9 = load ptr, ptr %a1 + %t10 = call i1 @finch.parser.at(ptr %t9, { ptr, i64, i64 } { ptr @.str.597, i64 5, i64 0 }) + %t11 = xor i1 %t10, true + br i1 %t11, label %then991, label %endif993 +then991: + %t12 = load ptr, ptr %a1 + %t13 = load ptr, ptr %a1 + %t14 = call %S.lexer.Token @finch.parser.cur(ptr %t13) + %t15 = load ptr, ptr %a1 + %t16 = call %S.lexer.Token @finch.parser.cur(ptr %t15) + %t17 = call { ptr, i64, i64 } @finch.parser.describe(%S.lexer.Token %t16) + store { ptr, i64, i64 } { ptr @.str.598, i64 11, i64 0 }, ptr %a19 + store { ptr, i64, i64 } %t17, ptr %a20 + call void @finch_str_concat(ptr %a18, ptr %a19, ptr %a20) + %t21 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.599, i64 56, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + call void @finch.parser.fail(ptr %t12, %S.lexer.Token %t14, { ptr, i64, i64 } %t25) + br label %endif993 +endif993: + %t26 = load ptr, ptr %a1 + %t27 = call %S.lexer.Token @finch.parser.next(ptr %t26) + %t28 = extractvalue %S.lexer.Token %t27, 1 + store { ptr, i64, i64 } %t28, ptr %a29 + call void @finch_str_copy(ptr %a30, ptr %a29) + %t31 = load { ptr, i64, i64 }, ptr %a30 + store { ptr, i64, i64 } %t31, ptr %a32 + %t33 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.600, i64 3, i64 0 }, ptr %a35 + %t36 = call i32 @finch_str_eq(ptr %a34, ptr %a35) + %t37 = icmp ne i32 %t36, 0 + br label %logic.from994 +logic.from994: + br i1 %t37, label %logic.rhs995, label %logic.end996 +logic.rhs995: + %t38 = load ptr, ptr %a1 + %t39 = call i1 @finch.parser.at(ptr %t38, { ptr, i64, i64 } { ptr @.str.601, i64 1, i64 0 }) + br label %logic.rend997 +logic.rend997: + br label %logic.end996 +logic.end996: + %t40 = phi i1 [ false, %logic.from994 ], [ %t39, %logic.rend997 ] + br i1 %t40, label %then998, label %endif1000 +then998: + %t41 = load ptr, ptr %a1 + %t42 = call %S.lexer.Token @finch.parser.next(ptr %t41) + %t43 = load ptr, ptr %a1 + %t44 = call %S.ast.Type @finch.parser.parseType(ptr %t43) + store %S.ast.Type %t44, ptr %a45 + %t46 = load ptr, ptr %a1 + %t47 = call %S.lexer.Token @finch.parser.expect(ptr %t46, { ptr, i64, i64 } { ptr @.str.602, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.603, i64 39, i64 0 }) + %t48 = load %S.ast.Type, ptr %a45 + %t49 = load ptr, ptr %a1 + %t50 = call %S.ast.Type @finch.parser.parseType(ptr %t49) + %t51 = call %S.ast.Type @finch.ast.mapOf(%S.ast.Type %t48, %S.ast.Type %t50) + ret %S.ast.Type %t51 +endif1000: + %t52 = load { ptr, i64, i64 }, ptr %a32 + %t53 = call i1 @finch.parser.isTypeName({ ptr, i64, i64 } %t52) + br i1 %t53, label %then1001, label %endif1003 +then1001: + %t54 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t54, ptr %a55 + store { ptr, i64, i64 } { ptr @.str.604, i64 3, i64 0 }, ptr %a56 + %t57 = call i32 @finch_str_eq(ptr %a55, ptr %a56) + %t58 = icmp ne i32 %t57, 0 + br label %logic.from1004 +logic.from1004: + br i1 %t58, label %logic.rhs1005, label %logic.end1006 +logic.rhs1005: + %t59 = load ptr, ptr %a1 + %t60 = call i1 @finch.parser.accept(ptr %t59, { ptr, i64, i64 } { ptr @.str.605, i64 1, i64 0 }) + br label %logic.rend1007 +logic.rend1007: + br label %logic.end1006 +logic.end1006: + %t61 = phi i1 [ false, %logic.from1004 ], [ %t60, %logic.rend1007 ] + br i1 %t61, label %then1008, label %endif1010 +then1008: + %t62 = load ptr, ptr %a1 + %t63 = call %S.ast.Type @finch.parser.parseType(ptr %t62) + %t64 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t63) + store %S.ast.Type %t64, ptr %a65 + %t66 = load ptr, ptr %a1 + %t67 = call %S.lexer.Token @finch.parser.expect(ptr %t66, { ptr, i64, i64 } { ptr @.str.606, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.607, i64 3, i64 0 }) + %t68 = load %S.ast.Type, ptr %a65 + ret %S.ast.Type %t68 +endif1010: + %t69 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t69, ptr %a70 + store { ptr, i64, i64 } { ptr @.str.608, i64 3, i64 0 }, ptr %a71 + %t72 = call i32 @finch_str_eq(ptr %a70, ptr %a71) + %t73 = icmp ne i32 %t72, 0 + br i1 %t73, label %then1011, label %endif1013 +then1011: + %t74 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.609, i64 3, i64 0 }) + ret %S.ast.Type %t74 +endif1013: + %t75 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t75, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.610, i64 3, i64 0 }, ptr %a77 + %t78 = call i32 @finch_str_eq(ptr %a76, ptr %a77) + %t79 = icmp ne i32 %t78, 0 + br i1 %t79, label %then1014, label %endif1016 +then1014: + %t80 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.611, i64 5, i64 0 }) + ret %S.ast.Type %t80 +endif1016: + %t81 = load { ptr, i64, i64 }, ptr %a32 + %t82 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } %t81) + ret %S.ast.Type %t82 +endif1003: + %t83 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.612, i64 5, i64 0 }, 0 + %t84 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t84, ptr %a85 + call void @finch_str_copy(ptr %a86, ptr %a85) + %t87 = load { ptr, i64, i64 }, ptr %a86 + %t88 = insertvalue %S.ast.Type %t83, { ptr, i64, i64 } %t87, 2 + store %S.ast.Type %t88, ptr %a89 + %t90 = load ptr, ptr %a1 + %t91 = call i1 @finch.parser.at(ptr %t90, { ptr, i64, i64 } { ptr @.str.613, i64 1, i64 0 }) + br label %logic.from1017 +logic.from1017: + br i1 %t91, label %logic.rhs1018, label %logic.end1019 +logic.rhs1018: + %t92 = load ptr, ptr %a1 + %t93 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t92, i64 1) + store { ptr, i64, i64 } %t93, ptr %a94 + store { ptr, i64, i64 } { ptr @.str.614, i64 5, i64 0 }, ptr %a95 + %t96 = call i32 @finch_str_eq(ptr %a94, ptr %a95) + %t97 = icmp ne i32 %t96, 0 + br label %logic.rend1020 +logic.rend1020: + br label %logic.end1019 +logic.end1019: + %t98 = phi i1 [ false, %logic.from1017 ], [ %t97, %logic.rend1020 ] + br i1 %t98, label %then1021, label %endif1023 +then1021: + %t99 = load ptr, ptr %a1 + %t100 = call %S.lexer.Token @finch.parser.next(ptr %t99) + %t101 = load { ptr, i64, i64 }, ptr %a32 + %t102 = getelementptr inbounds %S.ast.Type, ptr %a89, i32 0, i32 3 + store { ptr, i64, i64 } %t101, ptr %a103 + call void @finch_str_copy(ptr %a104, ptr %a103) + %t105 = load { ptr, i64, i64 }, ptr %a104 + store { ptr, i64, i64 } %t105, ptr %t102 + %t106 = load ptr, ptr %a1 + %t107 = call %S.lexer.Token @finch.parser.next(ptr %t106) + %t108 = extractvalue %S.lexer.Token %t107, 1 + store { ptr, i64, i64 } %t108, ptr %a109 + call void @finch_str_copy(ptr %a110, ptr %a109) + %t111 = load { ptr, i64, i64 }, ptr %a110 + %t112 = getelementptr inbounds %S.ast.Type, ptr %a89, i32 0, i32 2 + store { ptr, i64, i64 } %t111, ptr %t112 + br label %endif1023 +endif1023: + %t113 = load ptr, ptr %a1 + %t114 = call i1 @finch.parser.at(ptr %t113, { ptr, i64, i64 } { ptr @.str.615, i64 1, i64 0 }) + br label %logic.from1024 +logic.from1024: + br i1 %t114, label %logic.rhs1025, label %logic.end1026 +logic.rhs1025: + %t115 = load ptr, ptr %a1 + %t116 = call %S.lexer.Token @finch.parser.cur(ptr %t115) + %t117 = extractvalue %S.lexer.Token %t116, 4 + %t118 = xor i1 %t117, true + br label %logic.rend1027 +logic.rend1027: + br label %logic.end1026 +logic.end1026: + %t119 = phi i1 [ false, %logic.from1024 ], [ %t118, %logic.rend1027 ] + br label %logic.from1028 +logic.from1028: + br i1 %t119, label %logic.rhs1029, label %logic.end1030 +logic.rhs1029: + %t120 = load ptr, ptr %a1 + %t121 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t120, i64 1) + store { ptr, i64, i64 } %t121, ptr %a122 + store { ptr, i64, i64 } { ptr @.str.616, i64 1, i64 0 }, ptr %a123 + %t124 = call i32 @finch_str_eq(ptr %a122, ptr %a123) + %t125 = icmp eq i32 %t124, 0 + br label %logic.rend1031 +logic.rend1031: + br label %logic.end1030 +logic.end1030: + %t126 = phi i1 [ false, %logic.from1028 ], [ %t125, %logic.rend1031 ] + br i1 %t126, label %then1032, label %endif1034 +then1032: + %t127 = load ptr, ptr %a1 + %t128 = call %S.lexer.Token @finch.parser.next(ptr %t127) + br label %while.cond1035 +while.cond1035: + br label %while.body1036 +while.body1036: + %t129 = getelementptr inbounds %S.ast.Type, ptr %a89, i32 0, i32 1 + %t130 = getelementptr inbounds { ptr, i64, i64 }, ptr %t129, i32 0, i32 1 + %t131 = load ptr, ptr %a1 + %t132 = call %S.ast.Type @finch.parser.parseType(ptr %t131) + %t133 = load i64, ptr %t130 + %t134 = add i64 %t133, 1 + call void @finch_arr_reserve(ptr %t129, i64 %t134, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t135 = load ptr, ptr %t129 + %t136 = getelementptr inbounds %S.ast.Type, ptr %t135, i64 %t133 + store %S.ast.Type %t132, ptr %t136 + store i64 %t134, ptr %t130 + %t137 = load ptr, ptr %a1 + %t138 = call i1 @finch.parser.accept(ptr %t137, { ptr, i64, i64 } { ptr @.str.617, i64 1, i64 0 }) + %t139 = xor i1 %t138, true + br i1 %t139, label %then1038, label %endif1040 +then1038: + br label %while.end1037 +endif1040: + br label %while.cond1035 +while.end1037: + %t140 = load ptr, ptr %a1 + %t141 = call %S.lexer.Token @finch.parser.expect(ptr %t140, { ptr, i64, i64 } { ptr @.str.618, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.619, i64 28, i64 0 }) + br label %endif1034 +endif1034: + %t142 = load %S.ast.Type, ptr %a89 + store %S.ast.Type %t142, ptr %a143 + call void @finch.copy.S_ast_Type(ptr %a144, ptr %a143) + %t145 = load %S.ast.Type, ptr %a144 + ret %S.ast.Type %t145 +} + +define internal i1 @finch.parser.genericDeclAhead(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca i64, align 16 + %a25 = alloca i64, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call i1 @finch.parser.at(ptr %t2, { ptr, i64, i64 } { ptr @.str.620, i64 5, i64 0 }) + %t4 = xor i1 %t3, true + br label %logic.from1041 +logic.from1041: + br i1 %t4, label %logic.end1043, label %logic.rhs1042 +logic.rhs1042: + %t5 = load ptr, ptr %a1 + %t6 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t5, i64 1) + store { ptr, i64, i64 } %t6, ptr %a7 + store { ptr, i64, i64 } { ptr @.str.621, i64 1, i64 0 }, ptr %a8 + %t9 = call i32 @finch_str_eq(ptr %a7, ptr %a8) + %t10 = icmp eq i32 %t9, 0 + br label %logic.rend1044 +logic.rend1044: + br label %logic.end1043 +logic.end1043: + %t11 = phi i1 [ true, %logic.from1041 ], [ %t10, %logic.rend1044 ] + br label %logic.from1045 +logic.from1045: + br i1 %t11, label %logic.end1047, label %logic.rhs1046 +logic.rhs1046: + %t12 = load ptr, ptr %a1 + %t13 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t12, i64 2) + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.622, i64 1, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp ne i32 %t16, 0 + br label %logic.rend1048 +logic.rend1048: + br label %logic.end1047 +logic.end1047: + %t18 = phi i1 [ true, %logic.from1045 ], [ %t17, %logic.rend1048 ] + br i1 %t18, label %then1049, label %endif1051 +then1049: + ret i1 false +endif1051: + store i64 0, ptr %a19 + %t20 = load ptr, ptr %a1 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic1052, label %ok1053 +panic1052: + call void @finch_panic(ptr @.str.623, i64 148, ptr @.str.624) + unreachable +ok1053: + %t22 = getelementptr inbounds %S.parser.Parser, ptr %t20, i32 0, i32 1 + %t23 = load i64, ptr %t22 + %t24 = add i64 %t23, 1 + store i64 %t24, ptr %a25 + br label %while.cond1054 +while.cond1054: + %t26 = load i64, ptr %a25 + %t27 = load ptr, ptr %a1 + %t28 = icmp eq ptr %t27, null + br i1 %t28, label %panic1057, label %ok1058 +panic1057: + call void @finch_panic(ptr @.str.625, i64 149, ptr @.str.626) + unreachable +ok1058: + %t29 = getelementptr inbounds %S.parser.Parser, ptr %t27, i32 0, i32 0 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i32 0, i32 1 + %t31 = load i64, ptr %t30 + %t32 = icmp slt i64 %t26, %t31 + br i1 %t32, label %while.body1055, label %while.end1056 +while.body1055: + %t33 = load ptr, ptr %a1 + %t34 = icmp eq ptr %t33, null + br i1 %t34, label %panic1059, label %ok1060 +panic1059: + call void @finch_panic(ptr @.str.627, i64 150, ptr @.str.628) + unreachable +ok1060: + %t35 = getelementptr inbounds %S.parser.Parser, ptr %t33, i32 0, i32 0 + %t36 = load i64, ptr %a25 + %t37 = load { ptr, i64, i64 }, ptr %t35 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 %t36, %t38 + br i1 %t39, label %range1061, label %inrange1062 +range1061: + call void @finch_panic_index(ptr @.str.629, i64 150, i64 %t36, i64 %t38) + unreachable +inrange1062: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds %S.lexer.Token, ptr %t40, i64 %t36 + %t42 = getelementptr inbounds %S.lexer.Token, ptr %t41, i32 0, i32 0 + %t43 = load { ptr, i64, i64 }, ptr %t42 + store { ptr, i64, i64 } %t43, ptr %a44 + call void @finch_str_copy(ptr %a45, ptr %a44) + %t46 = load { ptr, i64, i64 }, ptr %a45 + store { ptr, i64, i64 } %t46, ptr %a47 + %t48 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } %t48, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.630, i64 1, i64 0 }, ptr %a50 + %t51 = call i32 @finch_str_eq(ptr %a49, ptr %a50) + %t52 = icmp ne i32 %t51, 0 + br i1 %t52, label %then1063, label %else1064 +then1063: + %t53 = load i64, ptr %a19 + %t54 = add i64 %t53, 1 + store i64 %t54, ptr %a19 + br label %endif1065 +else1064: + %t55 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } %t55, ptr %a56 + store { ptr, i64, i64 } { ptr @.str.631, i64 1, i64 0 }, ptr %a57 + %t58 = call i32 @finch_str_eq(ptr %a56, ptr %a57) + %t59 = icmp ne i32 %t58, 0 + br i1 %t59, label %then1066, label %else1067 +then1066: + %t60 = load i64, ptr %a19 + %t61 = sub i64 %t60, 1 + store i64 %t61, ptr %a19 + %t62 = load i64, ptr %a19 + %t63 = icmp eq i64 %t62, 0 + br i1 %t63, label %then1069, label %endif1071 +then1069: + %t64 = load i64, ptr %a25 + %t65 = add i64 %t64, 1 + %t66 = load ptr, ptr %a1 + %t67 = icmp eq ptr %t66, null + br i1 %t67, label %panic1072, label %ok1073 +panic1072: + call void @finch_panic(ptr @.str.632, i64 156, ptr @.str.633) + unreachable +ok1073: + %t68 = getelementptr inbounds %S.parser.Parser, ptr %t66, i32 0, i32 0 + %t69 = getelementptr inbounds { ptr, i64, i64 }, ptr %t68, i32 0, i32 1 + %t70 = load i64, ptr %t69 + %t71 = icmp slt i64 %t65, %t70 + br label %logic.from1074 +logic.from1074: + br i1 %t71, label %logic.rhs1075, label %logic.end1076 +logic.rhs1075: + %t72 = load ptr, ptr %a1 + %t73 = icmp eq ptr %t72, null + br i1 %t73, label %panic1077, label %ok1078 +panic1077: + call void @finch_panic(ptr @.str.634, i64 156, ptr @.str.635) + unreachable +ok1078: + %t74 = getelementptr inbounds %S.parser.Parser, ptr %t72, i32 0, i32 0 + %t75 = load i64, ptr %a25 + %t76 = add i64 %t75, 1 + %t77 = load { ptr, i64, i64 }, ptr %t74 + %t78 = extractvalue { ptr, i64, i64 } %t77, 1 + %t79 = icmp uge i64 %t76, %t78 + br i1 %t79, label %range1079, label %inrange1080 +range1079: + call void @finch_panic_index(ptr @.str.636, i64 156, i64 %t76, i64 %t78) + unreachable +inrange1080: + %t80 = extractvalue { ptr, i64, i64 } %t77, 0 + %t81 = getelementptr inbounds %S.lexer.Token, ptr %t80, i64 %t76 + %t82 = getelementptr inbounds %S.lexer.Token, ptr %t81, i32 0, i32 0 + %t83 = load { ptr, i64, i64 }, ptr %t82 + store { ptr, i64, i64 } %t83, ptr %a84 + store { ptr, i64, i64 } { ptr @.str.637, i64 5, i64 0 }, ptr %a85 + %t86 = call i32 @finch_str_eq(ptr %a84, ptr %a85) + %t87 = icmp ne i32 %t86, 0 + br label %logic.rend1081 +logic.rend1081: + br label %logic.end1076 +logic.end1076: + %t88 = phi i1 [ false, %logic.from1074 ], [ %t87, %logic.rend1081 ] + br label %logic.from1082 +logic.from1082: + br i1 %t88, label %logic.rhs1083, label %logic.end1084 +logic.rhs1083: + %t89 = load ptr, ptr %a1 + %t90 = icmp eq ptr %t89, null + br i1 %t90, label %panic1085, label %ok1086 +panic1085: + call void @finch_panic(ptr @.str.638, i64 156, ptr @.str.639) + unreachable +ok1086: + %t91 = getelementptr inbounds %S.parser.Parser, ptr %t89, i32 0, i32 0 + %t92 = load i64, ptr %a25 + %t93 = add i64 %t92, 1 + %t94 = load { ptr, i64, i64 }, ptr %t91 + %t95 = extractvalue { ptr, i64, i64 } %t94, 1 + %t96 = icmp uge i64 %t93, %t95 + br i1 %t96, label %range1087, label %inrange1088 +range1087: + call void @finch_panic_index(ptr @.str.640, i64 156, i64 %t93, i64 %t95) + unreachable +inrange1088: + %t97 = extractvalue { ptr, i64, i64 } %t94, 0 + %t98 = getelementptr inbounds %S.lexer.Token, ptr %t97, i64 %t93 + %t99 = getelementptr inbounds %S.lexer.Token, ptr %t98, i32 0, i32 4 + %t100 = load i1, ptr %t99 + %t101 = xor i1 %t100, true + br label %logic.rend1089 +logic.rend1089: + br label %logic.end1084 +logic.end1084: + %t102 = phi i1 [ false, %logic.from1082 ], [ %t101, %logic.rend1089 ] + ret i1 %t102 +endif1071: + br label %endif1068 +else1067: + %t103 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } %t103, ptr %a104 + store { ptr, i64, i64 } { ptr @.str.641, i64 3, i64 0 }, ptr %a105 + %t106 = call i32 @finch_str_eq(ptr %a104, ptr %a105) + %t107 = icmp ne i32 %t106, 0 + br label %logic.from1090 +logic.from1090: + br i1 %t107, label %logic.end1092, label %logic.rhs1091 +logic.rhs1091: + %t108 = load ptr, ptr %a1 + %t109 = icmp eq ptr %t108, null + br i1 %t109, label %panic1093, label %ok1094 +panic1093: + call void @finch_panic(ptr @.str.642, i64 158, ptr @.str.643) + unreachable +ok1094: + %t110 = getelementptr inbounds %S.parser.Parser, ptr %t108, i32 0, i32 0 + %t111 = load i64, ptr %a25 + %t112 = load { ptr, i64, i64 }, ptr %t110 + %t113 = extractvalue { ptr, i64, i64 } %t112, 1 + %t114 = icmp uge i64 %t111, %t113 + br i1 %t114, label %range1095, label %inrange1096 +range1095: + call void @finch_panic_index(ptr @.str.644, i64 158, i64 %t111, i64 %t113) + unreachable +inrange1096: + %t115 = extractvalue { ptr, i64, i64 } %t112, 0 + %t116 = getelementptr inbounds %S.lexer.Token, ptr %t115, i64 %t111 + %t117 = getelementptr inbounds %S.lexer.Token, ptr %t116, i32 0, i32 4 + %t118 = load i1, ptr %t117 + br label %logic.from1097 +logic.from1097: + br i1 %t118, label %logic.rhs1098, label %logic.end1099 +logic.rhs1098: + %t119 = load i64, ptr %a19 + %t120 = icmp eq i64 %t119, 0 + br label %logic.rend1100 +logic.rend1100: + br label %logic.end1099 +logic.end1099: + %t121 = phi i1 [ false, %logic.from1097 ], [ %t120, %logic.rend1100 ] + br label %logic.rend1101 +logic.rend1101: + br label %logic.end1092 +logic.end1092: + %t122 = phi i1 [ true, %logic.from1090 ], [ %t121, %logic.rend1101 ] + br i1 %t122, label %then1102, label %endif1104 +then1102: + ret i1 false +endif1104: + br label %endif1068 +endif1068: + br label %endif1065 +endif1065: + %t123 = load i64, ptr %a25 + %t124 = add i64 %t123, 1 + store i64 %t124, ptr %a25 + br label %while.cond1054 +while.end1056: + ret i1 false +} + +define internal i1 @finch.parser.genericCallAheadFrom(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a9 = alloca i1, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic1105, label %ok1106 +panic1105: + call void @finch_panic(ptr @.str.645, i64 168, ptr @.str.646) + unreachable +ok1106: + %t4 = getelementptr inbounds %S.parser.Parser, ptr %t2, i32 0, i32 1 + %t5 = load i64, ptr %t4 + %t6 = sub i64 %t5, 1 + store i64 %t6, ptr %t4 + %t7 = load ptr, ptr %a1 + %t8 = call i1 @finch.parser.genericCallAhead(ptr %t7) + store i1 %t8, ptr %a9 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic1107, label %ok1108 +panic1107: + call void @finch_panic(ptr @.str.647, i64 170, ptr @.str.648) + unreachable +ok1108: + %t12 = getelementptr inbounds %S.parser.Parser, ptr %t10, i32 0, i32 1 + %t13 = load i64, ptr %t12 + %t14 = add i64 %t13, 1 + store i64 %t14, ptr %t12 + %t15 = load i1, ptr %a9 + ret i1 %t15 +} + +define internal i1 @finch.parser.genericCallAhead(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca i64, align 16 + %a37 = alloca i64, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t2, i64 1) + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.649, i64 1, i64 0 }, ptr %a5 + %t6 = call i32 @finch_str_eq(ptr %a4, ptr %a5) + %t7 = icmp eq i32 %t6, 0 + br label %logic.from1109 +logic.from1109: + br i1 %t7, label %logic.end1111, label %logic.rhs1110 +logic.rhs1110: + %t8 = load ptr, ptr %a1 + %t9 = icmp eq ptr %t8, null + br i1 %t9, label %panic1112, label %ok1113 +panic1112: + call void @finch_panic(ptr @.str.650, i64 176, ptr @.str.651) + unreachable +ok1113: + %t10 = getelementptr inbounds %S.parser.Parser, ptr %t8, i32 0, i32 0 + %t11 = load ptr, ptr %a1 + %t12 = icmp eq ptr %t11, null + br i1 %t12, label %panic1114, label %ok1115 +panic1114: + call void @finch_panic(ptr @.str.652, i64 176, ptr @.str.653) + unreachable +ok1115: + %t13 = getelementptr inbounds %S.parser.Parser, ptr %t11, i32 0, i32 1 + %t14 = load i64, ptr %t13 + %t15 = add i64 %t14, 1 + %t16 = load { ptr, i64, i64 }, ptr %t10 + %t17 = extractvalue { ptr, i64, i64 } %t16, 1 + %t18 = icmp uge i64 %t15, %t17 + br i1 %t18, label %range1116, label %inrange1117 +range1116: + call void @finch_panic_index(ptr @.str.654, i64 176, i64 %t15, i64 %t17) + unreachable +inrange1117: + %t19 = extractvalue { ptr, i64, i64 } %t16, 0 + %t20 = getelementptr inbounds %S.lexer.Token, ptr %t19, i64 %t15 + %t21 = getelementptr inbounds %S.lexer.Token, ptr %t20, i32 0, i32 4 + %t22 = load i1, ptr %t21 + br label %logic.rend1118 +logic.rend1118: + br label %logic.end1111 +logic.end1111: + %t23 = phi i1 [ true, %logic.from1109 ], [ %t22, %logic.rend1118 ] + br label %logic.from1119 +logic.from1119: + br i1 %t23, label %logic.end1121, label %logic.rhs1120 +logic.rhs1120: + %t24 = load ptr, ptr %a1 + %t25 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t24, i64 2) + store { ptr, i64, i64 } %t25, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.655, i64 1, i64 0 }, ptr %a27 + %t28 = call i32 @finch_str_eq(ptr %a26, ptr %a27) + %t29 = icmp ne i32 %t28, 0 + br label %logic.rend1122 +logic.rend1122: + br label %logic.end1121 +logic.end1121: + %t30 = phi i1 [ true, %logic.from1119 ], [ %t29, %logic.rend1122 ] + br i1 %t30, label %then1123, label %endif1125 +then1123: + ret i1 false +endif1125: + store i64 0, ptr %a31 + %t32 = load ptr, ptr %a1 + %t33 = icmp eq ptr %t32, null + br i1 %t33, label %panic1126, label %ok1127 +panic1126: + call void @finch_panic(ptr @.str.656, i64 180, ptr @.str.657) + unreachable +ok1127: + %t34 = getelementptr inbounds %S.parser.Parser, ptr %t32, i32 0, i32 1 + %t35 = load i64, ptr %t34 + %t36 = add i64 %t35, 1 + store i64 %t36, ptr %a37 + br label %while.cond1128 +while.cond1128: + %t38 = load i64, ptr %a37 + %t39 = load ptr, ptr %a1 + %t40 = icmp eq ptr %t39, null + br i1 %t40, label %panic1131, label %ok1132 +panic1131: + call void @finch_panic(ptr @.str.658, i64 181, ptr @.str.659) + unreachable +ok1132: + %t41 = getelementptr inbounds %S.parser.Parser, ptr %t39, i32 0, i32 0 + %t42 = getelementptr inbounds { ptr, i64, i64 }, ptr %t41, i32 0, i32 1 + %t43 = load i64, ptr %t42 + %t44 = icmp slt i64 %t38, %t43 + br i1 %t44, label %while.body1129, label %while.end1130 +while.body1129: + %t45 = load ptr, ptr %a1 + %t46 = icmp eq ptr %t45, null + br i1 %t46, label %panic1133, label %ok1134 +panic1133: + call void @finch_panic(ptr @.str.660, i64 182, ptr @.str.661) + unreachable +ok1134: + %t47 = getelementptr inbounds %S.parser.Parser, ptr %t45, i32 0, i32 0 + %t48 = load i64, ptr %a37 + %t49 = load { ptr, i64, i64 }, ptr %t47 + %t50 = extractvalue { ptr, i64, i64 } %t49, 1 + %t51 = icmp uge i64 %t48, %t50 + br i1 %t51, label %range1135, label %inrange1136 +range1135: + call void @finch_panic_index(ptr @.str.662, i64 182, i64 %t48, i64 %t50) + unreachable +inrange1136: + %t52 = extractvalue { ptr, i64, i64 } %t49, 0 + %t53 = getelementptr inbounds %S.lexer.Token, ptr %t52, i64 %t48 + %t54 = getelementptr inbounds %S.lexer.Token, ptr %t53, i32 0, i32 0 + %t55 = load { ptr, i64, i64 }, ptr %t54 + store { ptr, i64, i64 } %t55, ptr %a56 + call void @finch_str_copy(ptr %a57, ptr %a56) + %t58 = load { ptr, i64, i64 }, ptr %a57 + store { ptr, i64, i64 } %t58, ptr %a59 + %t60 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } %t60, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.663, i64 1, i64 0 }, ptr %a62 + %t63 = call i32 @finch_str_eq(ptr %a61, ptr %a62) + %t64 = icmp ne i32 %t63, 0 + br i1 %t64, label %then1137, label %else1138 +then1137: + %t65 = load i64, ptr %a31 + %t66 = add i64 %t65, 1 + store i64 %t66, ptr %a31 + br label %endif1139 +else1138: + %t67 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } %t67, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.664, i64 1, i64 0 }, ptr %a69 + %t70 = call i32 @finch_str_eq(ptr %a68, ptr %a69) + %t71 = icmp ne i32 %t70, 0 + br i1 %t71, label %then1140, label %else1141 +then1140: + %t72 = load i64, ptr %a31 + %t73 = sub i64 %t72, 1 + store i64 %t73, ptr %a31 + %t74 = load i64, ptr %a31 + %t75 = icmp eq i64 %t74, 0 + br i1 %t75, label %then1143, label %endif1145 +then1143: + %t76 = load i64, ptr %a37 + %t77 = add i64 %t76, 1 + %t78 = load ptr, ptr %a1 + %t79 = icmp eq ptr %t78, null + br i1 %t79, label %panic1146, label %ok1147 +panic1146: + call void @finch_panic(ptr @.str.665, i64 188, ptr @.str.666) + unreachable +ok1147: + %t80 = getelementptr inbounds %S.parser.Parser, ptr %t78, i32 0, i32 0 + %t81 = getelementptr inbounds { ptr, i64, i64 }, ptr %t80, i32 0, i32 1 + %t82 = load i64, ptr %t81 + %t83 = icmp slt i64 %t77, %t82 + br label %logic.from1148 +logic.from1148: + br i1 %t83, label %logic.rhs1149, label %logic.end1150 +logic.rhs1149: + %t84 = load ptr, ptr %a1 + %t85 = icmp eq ptr %t84, null + br i1 %t85, label %panic1151, label %ok1152 +panic1151: + call void @finch_panic(ptr @.str.667, i64 188, ptr @.str.668) + unreachable +ok1152: + %t86 = getelementptr inbounds %S.parser.Parser, ptr %t84, i32 0, i32 0 + %t87 = load i64, ptr %a37 + %t88 = add i64 %t87, 1 + %t89 = load { ptr, i64, i64 }, ptr %t86 + %t90 = extractvalue { ptr, i64, i64 } %t89, 1 + %t91 = icmp uge i64 %t88, %t90 + br i1 %t91, label %range1153, label %inrange1154 +range1153: + call void @finch_panic_index(ptr @.str.669, i64 188, i64 %t88, i64 %t90) + unreachable +inrange1154: + %t92 = extractvalue { ptr, i64, i64 } %t89, 0 + %t93 = getelementptr inbounds %S.lexer.Token, ptr %t92, i64 %t88 + %t94 = getelementptr inbounds %S.lexer.Token, ptr %t93, i32 0, i32 0 + %t95 = load { ptr, i64, i64 }, ptr %t94 + store { ptr, i64, i64 } %t95, ptr %a96 + store { ptr, i64, i64 } { ptr @.str.670, i64 1, i64 0 }, ptr %a97 + %t98 = call i32 @finch_str_eq(ptr %a96, ptr %a97) + %t99 = icmp ne i32 %t98, 0 + br label %logic.rend1155 +logic.rend1155: + br label %logic.end1150 +logic.end1150: + %t100 = phi i1 [ false, %logic.from1148 ], [ %t99, %logic.rend1155 ] + br label %logic.from1156 +logic.from1156: + br i1 %t100, label %logic.rhs1157, label %logic.end1158 +logic.rhs1157: + %t101 = load ptr, ptr %a1 + %t102 = icmp eq ptr %t101, null + br i1 %t102, label %panic1159, label %ok1160 +panic1159: + call void @finch_panic(ptr @.str.671, i64 188, ptr @.str.672) + unreachable +ok1160: + %t103 = getelementptr inbounds %S.parser.Parser, ptr %t101, i32 0, i32 0 + %t104 = load i64, ptr %a37 + %t105 = add i64 %t104, 1 + %t106 = load { ptr, i64, i64 }, ptr %t103 + %t107 = extractvalue { ptr, i64, i64 } %t106, 1 + %t108 = icmp uge i64 %t105, %t107 + br i1 %t108, label %range1161, label %inrange1162 +range1161: + call void @finch_panic_index(ptr @.str.673, i64 188, i64 %t105, i64 %t107) + unreachable +inrange1162: + %t109 = extractvalue { ptr, i64, i64 } %t106, 0 + %t110 = getelementptr inbounds %S.lexer.Token, ptr %t109, i64 %t105 + %t111 = getelementptr inbounds %S.lexer.Token, ptr %t110, i32 0, i32 4 + %t112 = load i1, ptr %t111 + %t113 = xor i1 %t112, true + br label %logic.rend1163 +logic.rend1163: + br label %logic.end1158 +logic.end1158: + %t114 = phi i1 [ false, %logic.from1156 ], [ %t113, %logic.rend1163 ] + ret i1 %t114 +endif1145: + br label %endif1142 +else1141: + %t115 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } %t115, ptr %a116 + store { ptr, i64, i64 } { ptr @.str.674, i64 3, i64 0 }, ptr %a117 + %t118 = call i32 @finch_str_eq(ptr %a116, ptr %a117) + %t119 = icmp ne i32 %t118, 0 + br label %logic.from1164 +logic.from1164: + br i1 %t119, label %logic.end1166, label %logic.rhs1165 +logic.rhs1165: + %t120 = load ptr, ptr %a1 + %t121 = icmp eq ptr %t120, null + br i1 %t121, label %panic1167, label %ok1168 +panic1167: + call void @finch_panic(ptr @.str.675, i64 190, ptr @.str.676) + unreachable +ok1168: + %t122 = getelementptr inbounds %S.parser.Parser, ptr %t120, i32 0, i32 0 + %t123 = load i64, ptr %a37 + %t124 = load { ptr, i64, i64 }, ptr %t122 + %t125 = extractvalue { ptr, i64, i64 } %t124, 1 + %t126 = icmp uge i64 %t123, %t125 + br i1 %t126, label %range1169, label %inrange1170 +range1169: + call void @finch_panic_index(ptr @.str.677, i64 190, i64 %t123, i64 %t125) + unreachable +inrange1170: + %t127 = extractvalue { ptr, i64, i64 } %t124, 0 + %t128 = getelementptr inbounds %S.lexer.Token, ptr %t127, i64 %t123 + %t129 = getelementptr inbounds %S.lexer.Token, ptr %t128, i32 0, i32 4 + %t130 = load i1, ptr %t129 + br label %logic.rend1171 +logic.rend1171: + br label %logic.end1166 +logic.end1166: + %t131 = phi i1 [ true, %logic.from1164 ], [ %t130, %logic.rend1171 ] + br i1 %t131, label %then1172, label %endif1174 +then1172: + ret i1 false +endif1174: + br label %endif1142 +endif1142: + br label %endif1139 +endif1139: + %t132 = load i64, ptr %a37 + %t133 = add i64 %t132, 1 + store i64 %t133, ptr %a37 + br label %while.cond1128 +while.end1130: + ret i1 false +} + +define internal i1 @finch.parser.atDeclaration(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call i1 @finch.parser.genericDeclAhead(ptr %t2) + br i1 %t3, label %then1175, label %endif1177 +then1175: + ret i1 true +endif1177: + %t4 = load ptr, ptr %a1 + %t5 = call i1 @finch.parser.at(ptr %t4, { ptr, i64, i64 } { ptr @.str.678, i64 1, i64 0 }) + br i1 %t5, label %then1178, label %endif1180 +then1178: + %t6 = load ptr, ptr %a1 + %t7 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t6, i64 1) + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.679, i64 1, i64 0 }, ptr %a9 + %t10 = call i32 @finch_str_eq(ptr %a8, ptr %a9) + %t11 = icmp ne i32 %t10, 0 + ret i1 %t11 +endif1180: + %t12 = load ptr, ptr %a1 + %t13 = call i1 @finch.parser.at(ptr %t12, { ptr, i64, i64 } { ptr @.str.680, i64 5, i64 0 }) + %t14 = xor i1 %t13, true + br i1 %t14, label %then1181, label %endif1183 +then1181: + ret i1 false +endif1183: + %t15 = load ptr, ptr %a1 + %t16 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t15, i64 1) + store { ptr, i64, i64 } %t16, ptr %a17 + %t18 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t18, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.681, i64 5, i64 0 }, ptr %a20 + %t21 = call i32 @finch_str_eq(ptr %a19, ptr %a20) + %t22 = icmp ne i32 %t21, 0 + br i1 %t22, label %then1184, label %endif1186 +then1184: + %t23 = load ptr, ptr %a1 + %t24 = icmp eq ptr %t23, null + br i1 %t24, label %panic1187, label %ok1188 +panic1187: + call void @finch_panic(ptr @.str.682, i64 210, ptr @.str.683) + unreachable +ok1188: + %t25 = getelementptr inbounds %S.parser.Parser, ptr %t23, i32 0, i32 0 + %t26 = load ptr, ptr %a1 + %t27 = icmp eq ptr %t26, null + br i1 %t27, label %panic1189, label %ok1190 +panic1189: + call void @finch_panic(ptr @.str.684, i64 210, ptr @.str.685) + unreachable +ok1190: + %t28 = getelementptr inbounds %S.parser.Parser, ptr %t26, i32 0, i32 1 + %t29 = load i64, ptr %t28 + %t30 = add i64 %t29, 1 + %t31 = load { ptr, i64, i64 }, ptr %t25 + %t32 = extractvalue { ptr, i64, i64 } %t31, 1 + %t33 = icmp uge i64 %t30, %t32 + br i1 %t33, label %range1191, label %inrange1192 +range1191: + call void @finch_panic_index(ptr @.str.686, i64 210, i64 %t30, i64 %t32) + unreachable +inrange1192: + %t34 = extractvalue { ptr, i64, i64 } %t31, 0 + %t35 = getelementptr inbounds %S.lexer.Token, ptr %t34, i64 %t30 + %t36 = getelementptr inbounds %S.lexer.Token, ptr %t35, i32 0, i32 4 + %t37 = load i1, ptr %t36 + %t38 = xor i1 %t37, true + ret i1 %t38 +endif1186: + %t39 = load ptr, ptr %a1 + %t40 = call %S.lexer.Token @finch.parser.cur(ptr %t39) + %t41 = extractvalue %S.lexer.Token %t40, 1 + store { ptr, i64, i64 } %t41, ptr %a42 + call void @finch_str_copy(ptr %a43, ptr %a42) + %t44 = load { ptr, i64, i64 }, ptr %a43 + store { ptr, i64, i64 } %t44, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.687, i64 3, i64 0 }, ptr %a46 + %t47 = call i32 @finch_str_eq(ptr %a45, ptr %a46) + %t48 = icmp ne i32 %t47, 0 + br label %logic.from1193 +logic.from1193: + br i1 %t48, label %logic.end1195, label %logic.rhs1194 +logic.rhs1194: + %t49 = load ptr, ptr %a1 + %t50 = call %S.lexer.Token @finch.parser.cur(ptr %t49) + %t51 = extractvalue %S.lexer.Token %t50, 1 + store { ptr, i64, i64 } %t51, ptr %a52 + call void @finch_str_copy(ptr %a53, ptr %a52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t54, ptr %a55 + store { ptr, i64, i64 } { ptr @.str.688, i64 3, i64 0 }, ptr %a56 + %t57 = call i32 @finch_str_eq(ptr %a55, ptr %a56) + %t58 = icmp ne i32 %t57, 0 + br label %logic.rend1196 +logic.rend1196: + br label %logic.end1195 +logic.end1195: + %t59 = phi i1 [ true, %logic.from1193 ], [ %t58, %logic.rend1196 ] + br label %logic.from1197 +logic.from1197: + br i1 %t59, label %logic.rhs1198, label %logic.end1199 +logic.rhs1198: + %t60 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t60, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.689, i64 1, i64 0 }, ptr %a62 + %t63 = call i32 @finch_str_eq(ptr %a61, ptr %a62) + %t64 = icmp ne i32 %t63, 0 + br label %logic.rend1200 +logic.rend1200: + br label %logic.end1199 +logic.end1199: + %t65 = phi i1 [ false, %logic.from1197 ], [ %t64, %logic.rend1200 ] + br i1 %t65, label %then1201, label %endif1203 +then1201: + ret i1 true +endif1203: + %t66 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t66, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.690, i64 1, i64 0 }, ptr %a68 + %t69 = call i32 @finch_str_eq(ptr %a67, ptr %a68) + %t70 = icmp ne i32 %t69, 0 + br label %logic.from1204 +logic.from1204: + br i1 %t70, label %logic.rhs1205, label %logic.end1206 +logic.rhs1205: + %t71 = load ptr, ptr %a1 + %t72 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t71, i64 2) + store { ptr, i64, i64 } %t72, ptr %a73 + store { ptr, i64, i64 } { ptr @.str.691, i64 5, i64 0 }, ptr %a74 + %t75 = call i32 @finch_str_eq(ptr %a73, ptr %a74) + %t76 = icmp ne i32 %t75, 0 + br label %logic.rend1207 +logic.rend1207: + br label %logic.end1206 +logic.end1206: + %t77 = phi i1 [ false, %logic.from1204 ], [ %t76, %logic.rend1207 ] + br label %logic.from1208 +logic.from1208: + br i1 %t77, label %logic.rhs1209, label %logic.end1210 +logic.rhs1209: + %t78 = load ptr, ptr %a1 + %t79 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t78, i64 3) + store { ptr, i64, i64 } %t79, ptr %a80 + store { ptr, i64, i64 } { ptr @.str.692, i64 5, i64 0 }, ptr %a81 + %t82 = call i32 @finch_str_eq(ptr %a80, ptr %a81) + %t83 = icmp ne i32 %t82, 0 + br label %logic.rend1211 +logic.rend1211: + br label %logic.end1210 +logic.end1210: + %t84 = phi i1 [ false, %logic.from1208 ], [ %t83, %logic.rend1211 ] + br label %logic.from1212 +logic.from1212: + br i1 %t84, label %logic.rhs1213, label %logic.end1214 +logic.rhs1213: + %t85 = load ptr, ptr %a1 + %t86 = icmp eq ptr %t85, null + br i1 %t86, label %panic1215, label %ok1216 +panic1215: + call void @finch_panic(ptr @.str.693, i64 215, ptr @.str.694) + unreachable +ok1216: + %t87 = getelementptr inbounds %S.parser.Parser, ptr %t85, i32 0, i32 0 + %t88 = load ptr, ptr %a1 + %t89 = icmp eq ptr %t88, null + br i1 %t89, label %panic1217, label %ok1218 +panic1217: + call void @finch_panic(ptr @.str.695, i64 215, ptr @.str.696) + unreachable +ok1218: + %t90 = getelementptr inbounds %S.parser.Parser, ptr %t88, i32 0, i32 1 + %t91 = load i64, ptr %t90 + %t92 = add i64 %t91, 3 + %t93 = load { ptr, i64, i64 }, ptr %t87 + %t94 = extractvalue { ptr, i64, i64 } %t93, 1 + %t95 = icmp uge i64 %t92, %t94 + br i1 %t95, label %range1219, label %inrange1220 +range1219: + call void @finch_panic_index(ptr @.str.697, i64 215, i64 %t92, i64 %t94) + unreachable +inrange1220: + %t96 = extractvalue { ptr, i64, i64 } %t93, 0 + %t97 = getelementptr inbounds %S.lexer.Token, ptr %t96, i64 %t92 + %t98 = getelementptr inbounds %S.lexer.Token, ptr %t97, i32 0, i32 4 + %t99 = load i1, ptr %t98 + %t100 = xor i1 %t99, true + br label %logic.rend1221 +logic.rend1221: + br label %logic.end1214 +logic.end1214: + %t101 = phi i1 [ false, %logic.from1212 ], [ %t100, %logic.rend1221 ] + ret i1 %t101 +} + +define internal void @finch.parser.endOfStatement(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call i1 @finch.parser.at(ptr %t2, { ptr, i64, i64 } { ptr @.str.698, i64 1, i64 0 }) + br label %logic.from1222 +logic.from1222: + br i1 %t3, label %logic.end1224, label %logic.rhs1223 +logic.rhs1223: + %t4 = load ptr, ptr %a1 + %t5 = call i1 @finch.parser.at(ptr %t4, { ptr, i64, i64 } { ptr @.str.699, i64 3, i64 0 }) + br label %logic.rend1225 +logic.rend1225: + br label %logic.end1224 +logic.end1224: + %t6 = phi i1 [ true, %logic.from1222 ], [ %t5, %logic.rend1225 ] + br label %logic.from1226 +logic.from1226: + br i1 %t6, label %logic.end1228, label %logic.rhs1227 +logic.rhs1227: + %t7 = load ptr, ptr %a1 + %t8 = call %S.lexer.Token @finch.parser.cur(ptr %t7) + %t9 = extractvalue %S.lexer.Token %t8, 4 + br label %logic.rend1229 +logic.rend1229: + br label %logic.end1228 +logic.end1228: + %t10 = phi i1 [ true, %logic.from1226 ], [ %t9, %logic.rend1229 ] + br i1 %t10, label %then1230, label %endif1232 +then1230: + ret void +endif1232: + %t11 = load ptr, ptr %a1 + %t12 = load ptr, ptr %a1 + %t13 = call %S.lexer.Token @finch.parser.cur(ptr %t12) + %t14 = load ptr, ptr %a1 + %t15 = call %S.lexer.Token @finch.parser.cur(ptr %t14) + %t16 = call { ptr, i64, i64 } @finch.parser.describe(%S.lexer.Token %t15) + store { ptr, i64, i64 } { ptr @.str.700, i64 11, i64 0 }, ptr %a18 + store { ptr, i64, i64 } %t16, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t20, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.701, i64 37, i64 0 }, ptr %a23 + call void @finch_str_concat(ptr %a21, ptr %a22, ptr %a23) + %t24 = load { ptr, i64, i64 }, ptr %a21 + call void @finch.parser.fail(ptr %t11, %S.lexer.Token %t13, { ptr, i64, i64 } %t24) + ret void +} + +define internal %S.ast.Program @finch.parser.parseProgram(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Program, align 16 + %a10 = alloca %S.lexer.Token, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca %S.lexer.Token, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca i1, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca %S.ast.Program, align 16 + %a174 = alloca %S.ast.Program, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Program zeroinitializer, ptr %a2 + br label %while.cond1233 +while.cond1233: + %t3 = load ptr, ptr %a1 + %t4 = call i1 @finch.parser.at(ptr %t3, { ptr, i64, i64 } { ptr @.str.702, i64 3, i64 0 }) + %t5 = xor i1 %t4, true + br i1 %t5, label %while.body1234, label %while.end1235 +while.body1234: + %t6 = load ptr, ptr %a1 + %t7 = call i1 @finch.parser.at(ptr %t6, { ptr, i64, i64 } { ptr @.str.703, i64 6, i64 0 }) + br i1 %t7, label %then1236, label %else1237 +then1236: + %t8 = load ptr, ptr %a1 + %t9 = call %S.lexer.Token @finch.parser.next(ptr %t8) + store %S.lexer.Token %t9, ptr %a10 + %t11 = load ptr, ptr %a1 + %t12 = call i1 @finch.parser.at(ptr %t11, { ptr, i64, i64 } { ptr @.str.704, i64 6, i64 0 }) + br i1 %t12, label %then1239, label %else1240 +then1239: + %t13 = getelementptr inbounds %S.ast.Program, ptr %a2, i32 0, i32 4 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i32 0, i32 1 + %t15 = load ptr, ptr %a1 + %t16 = icmp eq ptr %t15, null + br i1 %t16, label %panic1242, label %ok1243 +panic1242: + call void @finch_panic(ptr @.str.705, i64 233, ptr @.str.706) + unreachable +ok1243: + %t17 = getelementptr inbounds %S.parser.Parser, ptr %t15, i32 0, i32 4 + %t18 = load { ptr, i64, i64 }, ptr %t17 + store { ptr, i64, i64 } %t18, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.707, i64 1, i64 0 }, ptr %a21 + call void @finch_str_concat(ptr %a19, ptr %a20, ptr %a21) + %t22 = load { ptr, i64, i64 }, ptr %a19 + %t23 = getelementptr inbounds %S.lexer.Token, ptr %a10, i32 0, i32 2 + %t24 = load i64, ptr %t23 + call void @finch_str_from_int(ptr %a25, i64 %t24) + %t26 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t22, ptr %a28 + store { ptr, i64, i64 } %t26, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t30, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.708, i64 1, i64 0 }, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = getelementptr inbounds %S.lexer.Token, ptr %a10, i32 0, i32 3 + %t36 = load i64, ptr %t35 + call void @finch_str_from_int(ptr %a37, i64 %t36) + %t38 = load { ptr, i64, i64 }, ptr %a37 + store { ptr, i64, i64 } %t34, ptr %a40 + store { ptr, i64, i64 } %t38, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + %t43 = load i64, ptr %t14 + %t44 = add i64 %t43, 1 + call void @finch_arr_reserve(ptr %t13, i64 %t44, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t45 = load ptr, ptr %t13 + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %t45, i64 %t43 + store { ptr, i64, i64 } %t42, ptr %t46 + store i64 %t44, ptr %t14 + %t47 = getelementptr inbounds %S.ast.Program, ptr %a2, i32 0, i32 3 + %t48 = getelementptr inbounds { ptr, i64, i64 }, ptr %t47, i32 0, i32 1 + %t49 = load ptr, ptr %a1 + %t50 = call %S.lexer.Token @finch.parser.next(ptr %t49) + %t51 = extractvalue %S.lexer.Token %t50, 1 + store { ptr, i64, i64 } %t51, ptr %a52 + call void @finch_str_copy(ptr %a53, ptr %a52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + %t55 = load i64, ptr %t48 + %t56 = add i64 %t55, 1 + call void @finch_arr_reserve(ptr %t47, i64 %t56, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t57 = load ptr, ptr %t47 + %t58 = getelementptr inbounds { ptr, i64, i64 }, ptr %t57, i64 %t55 + store { ptr, i64, i64 } %t54, ptr %t58 + store i64 %t56, ptr %t48 + br label %endif1241 +else1240: + %t59 = load ptr, ptr %a1 + %t60 = call i1 @finch.parser.at(ptr %t59, { ptr, i64, i64 } { ptr @.str.709, i64 5, i64 0 }) + %t61 = xor i1 %t60, true + br i1 %t61, label %then1244, label %endif1246 +then1244: + %t62 = load ptr, ptr %a1 + %t63 = load %S.lexer.Token, ptr %a10 + call void @finch.parser.fail(ptr %t62, %S.lexer.Token %t63, { ptr, i64, i64 } { ptr @.str.710, i64 51, i64 0 }) + br label %endif1246 +endif1246: + %t64 = getelementptr inbounds %S.ast.Program, ptr %a2, i32 0, i32 2 + %t65 = getelementptr inbounds { ptr, i64, i64 }, ptr %t64, i32 0, i32 1 + %t66 = load ptr, ptr %a1 + %t67 = call %S.lexer.Token @finch.parser.next(ptr %t66) + %t68 = extractvalue %S.lexer.Token %t67, 1 + store { ptr, i64, i64 } %t68, ptr %a69 + call void @finch_str_copy(ptr %a70, ptr %a69) + %t71 = load { ptr, i64, i64 }, ptr %a70 + %t72 = load i64, ptr %t65 + %t73 = add i64 %t72, 1 + call void @finch_arr_reserve(ptr %t64, i64 %t73, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t74 = load ptr, ptr %t64 + %t75 = getelementptr inbounds { ptr, i64, i64 }, ptr %t74, i64 %t72 + store { ptr, i64, i64 } %t71, ptr %t75 + store i64 %t73, ptr %t65 + br label %endif1241 +endif1241: + br label %endif1238 +else1237: + %t76 = load ptr, ptr %a1 + %t77 = call i1 @finch.parser.at(ptr %t76, { ptr, i64, i64 } { ptr @.str.711, i64 4, i64 0 }) + br i1 %t77, label %then1247, label %else1248 +then1247: + %t78 = load ptr, ptr %a1 + %t79 = call %S.lexer.Token @finch.parser.next(ptr %t78) + store %S.lexer.Token %t79, ptr %a80 + %t81 = load ptr, ptr %a1 + %t82 = call %S.lexer.Token @finch.parser.expect(ptr %t81, { ptr, i64, i64 } { ptr @.str.712, i64 6, i64 0 }, { ptr, i64, i64 } { ptr @.str.713, i64 42, i64 0 }) + %t83 = extractvalue %S.lexer.Token %t82, 1 + store { ptr, i64, i64 } %t83, ptr %a84 + call void @finch_str_copy(ptr %a85, ptr %a84) + %t86 = load { ptr, i64, i64 }, ptr %a85 + store { ptr, i64, i64 } %t86, ptr %a87 + %t88 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t88, ptr %a89 + store { ptr, i64, i64 } { ptr @.str.715, i64 2, i64 0 }, ptr %a91 + %t92 = call i32 @finch_str_ends(ptr %a89, ptr %a91) + %t93 = icmp ne i32 %t92, 0 + br label %logic.from1250 +logic.from1250: + br i1 %t93, label %logic.end1252, label %logic.rhs1251 +logic.rhs1251: + %t94 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t94, ptr %a95 + store { ptr, i64, i64 } { ptr @.str.717, i64 2, i64 0 }, ptr %a97 + %t98 = call i32 @finch_str_ends(ptr %a95, ptr %a97) + %t99 = icmp ne i32 %t98, 0 + br label %logic.rend1253 +logic.rend1253: + br label %logic.end1252 +logic.end1252: + %t100 = phi i1 [ true, %logic.from1250 ], [ %t99, %logic.rend1253 ] + br label %logic.from1254 +logic.from1254: + br i1 %t100, label %logic.end1256, label %logic.rhs1255 +logic.rhs1255: + %t101 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t101, ptr %a102 + store { ptr, i64, i64 } { ptr @.str.719, i64 2, i64 0 }, ptr %a104 + %t105 = call i32 @finch_str_ends(ptr %a102, ptr %a104) + %t106 = icmp ne i32 %t105, 0 + br label %logic.rend1257 +logic.rend1257: + br label %logic.end1256 +logic.end1256: + %t107 = phi i1 [ true, %logic.from1254 ], [ %t106, %logic.rend1257 ] + store i1 %t107, ptr %a108 + %t109 = load i1, ptr %a108 + %t110 = xor i1 %t109, true + br label %logic.from1258 +logic.from1258: + br i1 %t110, label %logic.rhs1259, label %logic.end1260 +logic.rhs1259: + %t111 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t111, ptr %a112 + store { ptr, i64, i64 } { ptr @.str.721, i64 3, i64 0 }, ptr %a114 + %t115 = call i32 @finch_str_starts(ptr %a112, ptr %a114) + %t116 = icmp ne i32 %t115, 0 + br label %logic.from1261 +logic.from1261: + br i1 %t116, label %logic.end1263, label %logic.rhs1262 +logic.rhs1262: + %t117 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t117, ptr %a118 + store { ptr, i64, i64 } { ptr @.str.723, i64 3, i64 0 }, ptr %a120 + %t121 = call i64 @finch_str_find(ptr %a118, ptr %a120) + %t122 = icmp sge i64 %t121, 0 + br label %logic.rend1264 +logic.rend1264: + br label %logic.end1263 +logic.end1263: + %t123 = phi i1 [ true, %logic.from1261 ], [ %t122, %logic.rend1264 ] + br label %logic.from1265 +logic.from1265: + br i1 %t123, label %logic.end1267, label %logic.rhs1266 +logic.rhs1266: + %t124 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t124, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.725, i64 1, i64 0 }, ptr %a127 + %t128 = call i64 @finch_str_find(ptr %a125, ptr %a127) + %t129 = icmp sge i64 %t128, 0 + br label %logic.rend1268 +logic.rend1268: + br label %logic.end1267 +logic.end1267: + %t130 = phi i1 [ true, %logic.from1265 ], [ %t129, %logic.rend1268 ] + br label %logic.rend1269 +logic.rend1269: + br label %logic.end1260 +logic.end1260: + %t131 = phi i1 [ false, %logic.from1258 ], [ %t130, %logic.rend1269 ] + br i1 %t131, label %then1270, label %endif1272 +then1270: + %t132 = load ptr, ptr %a1 + %t133 = load %S.lexer.Token, ptr %a80 + call void @finch.parser.fail(ptr %t132, %S.lexer.Token %t133, { ptr, i64, i64 } { ptr @.str.726, i64 65, i64 0 }) + br label %endif1272 +endif1272: + %t134 = getelementptr inbounds %S.ast.Program, ptr %a2, i32 0, i32 5 + %t135 = getelementptr inbounds { ptr, i64, i64 }, ptr %t134, i32 0, i32 1 + %t136 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t136, ptr %a137 + call void @finch_str_copy(ptr %a138, ptr %a137) + %t139 = load { ptr, i64, i64 }, ptr %a138 + %t140 = load i64, ptr %t135 + %t141 = add i64 %t140, 1 + call void @finch_arr_reserve(ptr %t134, i64 %t141, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t142 = load ptr, ptr %t134 + %t143 = getelementptr inbounds { ptr, i64, i64 }, ptr %t142, i64 %t140 + store { ptr, i64, i64 } %t139, ptr %t143 + store i64 %t141, ptr %t135 + br label %endif1249 +else1248: + %t144 = load ptr, ptr %a1 + %t145 = call i1 @finch.parser.at(ptr %t144, { ptr, i64, i64 } { ptr @.str.727, i64 6, i64 0 }) + br i1 %t145, label %then1273, label %else1274 +then1273: + %t146 = getelementptr inbounds %S.ast.Program, ptr %a2, i32 0, i32 6 + %t147 = getelementptr inbounds { ptr, i64, i64 }, ptr %t146, i32 0, i32 1 + %t148 = load ptr, ptr %a1 + %t149 = call %S.ast.Node @finch.parser.parseStruct(ptr %t148) + %t150 = load i64, ptr %t147 + %t151 = add i64 %t150, 1 + call void @finch_arr_reserve(ptr %t146, i64 %t151, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t152 = load ptr, ptr %t146 + %t153 = getelementptr inbounds %S.ast.Node, ptr %t152, i64 %t150 + store %S.ast.Node %t149, ptr %t153 + store i64 %t151, ptr %t147 + br label %endif1275 +else1274: + %t154 = load ptr, ptr %a1 + %t155 = call i1 @finch.parser.at(ptr %t154, { ptr, i64, i64 } { ptr @.str.728, i64 4, i64 0 }) + br i1 %t155, label %then1276, label %else1277 +then1276: + %t156 = getelementptr inbounds %S.ast.Program, ptr %a2, i32 0, i32 7 + %t157 = getelementptr inbounds { ptr, i64, i64 }, ptr %t156, i32 0, i32 1 + %t158 = load ptr, ptr %a1 + %t159 = call %S.ast.Node @finch.parser.parseEnum(ptr %t158) + %t160 = load i64, ptr %t157 + %t161 = add i64 %t160, 1 + call void @finch_arr_reserve(ptr %t156, i64 %t161, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t162 = load ptr, ptr %t156 + %t163 = getelementptr inbounds %S.ast.Node, ptr %t162, i64 %t160 + store %S.ast.Node %t159, ptr %t163 + store i64 %t161, ptr %t157 + br label %endif1278 +else1277: + %t164 = getelementptr inbounds %S.ast.Program, ptr %a2, i32 0, i32 8 + %t165 = getelementptr inbounds { ptr, i64, i64 }, ptr %t164, i32 0, i32 1 + %t166 = load ptr, ptr %a1 + %t167 = call %S.ast.Node @finch.parser.parseFn(ptr %t166) + %t168 = load i64, ptr %t165 + %t169 = add i64 %t168, 1 + call void @finch_arr_reserve(ptr %t164, i64 %t169, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t170 = load ptr, ptr %t164 + %t171 = getelementptr inbounds %S.ast.Node, ptr %t170, i64 %t168 + store %S.ast.Node %t167, ptr %t171 + store i64 %t169, ptr %t165 + br label %endif1278 +endif1278: + br label %endif1275 +endif1275: + br label %endif1249 +endif1249: + br label %endif1238 +endif1238: + br label %while.cond1233 +while.end1235: + %t172 = load %S.ast.Program, ptr %a2 + store %S.ast.Program %t172, ptr %a173 + call void @finch.copy.S_ast_Program(ptr %a174, ptr %a173) + %t175 = load %S.ast.Program, ptr %a174 + ret %S.ast.Program %t175 +} + +define internal %S.ast.Node @finch.parser.parseEnum(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca %S.ast.Node, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca %S.ast.Node, align 16 + %a55 = alloca %S.ast.Node, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca %S.ast.Node, align 16 + %a86 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.ast.Node @finch.parser.node(ptr %t2, { ptr, i64, i64 } { ptr @.str.729, i64 4, i64 0 }) + store %S.ast.Node %t3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call %S.lexer.Token @finch.parser.expect(ptr %t5, { ptr, i64, i64 } { ptr @.str.730, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.731, i64 6, i64 0 }) + %t7 = load ptr, ptr %a1 + %t8 = call %S.lexer.Token @finch.parser.expect(ptr %t7, { ptr, i64, i64 } { ptr @.str.732, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.733, i64 12, i64 0 }) + %t9 = extractvalue %S.lexer.Token %t8, 1 + store { ptr, i64, i64 } %t9, ptr %a10 + call void @finch_str_copy(ptr %a11, ptr %a10) + %t12 = load { ptr, i64, i64 }, ptr %a11 + %t13 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 1 + store { ptr, i64, i64 } %t12, ptr %t13 + %t14 = load ptr, ptr %a1 + %t15 = call %S.lexer.Token @finch.parser.expect(ptr %t14, { ptr, i64, i64 } { ptr @.str.734, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.735, i64 3, i64 0 }) + br label %while.cond1279 +while.cond1279: + %t16 = load ptr, ptr %a1 + %t17 = call i1 @finch.parser.at(ptr %t16, { ptr, i64, i64 } { ptr @.str.736, i64 1, i64 0 }) + %t18 = xor i1 %t17, true + br i1 %t18, label %while.body1280, label %while.end1281 +while.body1280: + %t19 = load ptr, ptr %a1 + %t20 = call i1 @finch.parser.at(ptr %t19, { ptr, i64, i64 } { ptr @.str.737, i64 3, i64 0 }) + br i1 %t20, label %then1282, label %endif1284 +then1282: + %t21 = load ptr, ptr %a1 + %t22 = load ptr, ptr %a1 + %t23 = call %S.lexer.Token @finch.parser.cur(ptr %t22) + call void @finch.parser.fail(ptr %t21, %S.lexer.Token %t23, { ptr, i64, i64 } { ptr @.str.738, i64 37, i64 0 }) + br label %endif1284 +endif1284: + %t24 = load ptr, ptr %a1 + %t25 = call %S.ast.Node @finch.parser.node(ptr %t24, { ptr, i64, i64 } { ptr @.str.739, i64 7, i64 0 }) + store %S.ast.Node %t25, ptr %a26 + %t27 = load ptr, ptr %a1 + %t28 = call %S.lexer.Token @finch.parser.expect(ptr %t27, { ptr, i64, i64 } { ptr @.str.740, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.741, i64 24, i64 0 }) + %t29 = extractvalue %S.lexer.Token %t28, 1 + store { ptr, i64, i64 } %t29, ptr %a30 + call void @finch_str_copy(ptr %a31, ptr %a30) + %t32 = load { ptr, i64, i64 }, ptr %a31 + %t33 = getelementptr inbounds %S.ast.Node, ptr %a26, i32 0, i32 1 + store { ptr, i64, i64 } %t32, ptr %t33 + %t34 = load ptr, ptr %a1 + %t35 = call i1 @finch.parser.accept(ptr %t34, { ptr, i64, i64 } { ptr @.str.742, i64 1, i64 0 }) + br i1 %t35, label %then1285, label %endif1287 +then1285: + store { ptr, i64, i64 } { ptr @.str.743, i64 0, i64 0 }, ptr %a36 + %t37 = load ptr, ptr %a1 + %t38 = call i1 @finch.parser.accept(ptr %t37, { ptr, i64, i64 } { ptr @.str.744, i64 1, i64 0 }) + br i1 %t38, label %then1288, label %endif1290 +then1288: + store { ptr, i64, i64 } { ptr @.str.745, i64 1, i64 0 }, ptr %a36 + br label %endif1290 +endif1290: + %t39 = load { ptr, i64, i64 }, ptr %a36 + %t40 = load ptr, ptr %a1 + %t41 = call %S.lexer.Token @finch.parser.expect(ptr %t40, { ptr, i64, i64 } { ptr @.str.746, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.747, i64 30, i64 0 }) + %t42 = extractvalue %S.lexer.Token %t41, 1 + store { ptr, i64, i64 } %t42, ptr %a43 + call void @finch_str_copy(ptr %a44, ptr %a43) + %t45 = load { ptr, i64, i64 }, ptr %a44 + store { ptr, i64, i64 } %t39, ptr %a47 + store { ptr, i64, i64 } %t45, ptr %a48 + call void @finch_str_concat(ptr %a46, ptr %a47, ptr %a48) + %t49 = load { ptr, i64, i64 }, ptr %a46 + %t50 = getelementptr inbounds %S.ast.Node, ptr %a26, i32 0, i32 4 + store { ptr, i64, i64 } %t49, ptr %t50 + br label %endif1287 +endif1287: + %t51 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %t51, i32 0, i32 1 + %t53 = load %S.ast.Node, ptr %a26 + store %S.ast.Node %t53, ptr %a54 + call void @finch.copy.S_ast_Node(ptr %a55, ptr %a54) + %t56 = load %S.ast.Node, ptr %a55 + %t57 = load i64, ptr %t52 + %t58 = add i64 %t57, 1 + call void @finch_arr_reserve(ptr %t51, i64 %t58, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t59 = load ptr, ptr %t51 + %t60 = getelementptr inbounds %S.ast.Node, ptr %t59, i64 %t57 + store %S.ast.Node %t56, ptr %t60 + store i64 %t58, ptr %t52 + %t61 = load ptr, ptr %a1 + %t62 = call i1 @finch.parser.accept(ptr %t61, { ptr, i64, i64 } { ptr @.str.748, i64 1, i64 0 }) + %t63 = xor i1 %t62, true + br i1 %t63, label %then1291, label %endif1293 +then1291: + %t64 = load ptr, ptr %a1 + call void @finch.parser.endOfStatement(ptr %t64) + br label %endif1293 +endif1293: + br label %while.cond1279 +while.end1281: + %t65 = load ptr, ptr %a1 + %t66 = call %S.lexer.Token @finch.parser.next(ptr %t65) + %t67 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t68 = getelementptr inbounds { ptr, i64, i64 }, ptr %t67, i32 0, i32 1 + %t69 = load i64, ptr %t68 + %t70 = icmp eq i64 %t69, 0 + br i1 %t70, label %then1294, label %endif1296 +then1294: + %t71 = load ptr, ptr %a1 + %t72 = load ptr, ptr %a1 + %t73 = call %S.lexer.Token @finch.parser.cur(ptr %t72) + %t74 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 1 + %t75 = load { ptr, i64, i64 }, ptr %t74 + store { ptr, i64, i64 } { ptr @.str.749, i64 9, i64 0 }, ptr %a77 + store { ptr, i64, i64 } %t75, ptr %a78 + call void @finch_str_concat(ptr %a76, ptr %a77, ptr %a78) + %t79 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t79, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.750, i64 16, i64 0 }, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + call void @finch.parser.fail(ptr %t71, %S.lexer.Token %t73, { ptr, i64, i64 } %t83) + br label %endif1296 +endif1296: + %t84 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t84, ptr %a85 + call void @finch.copy.S_ast_Node(ptr %a86, ptr %a85) + %t87 = load %S.ast.Node, ptr %a86 + ret %S.ast.Node %t87 +} + +define internal %S.ast.Node @finch.parser.parseMatch(ptr %p0, i1 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i1, align 16 + %a5 = alloca %S.ast.Node, align 16 + %a24 = alloca i64, align 16 + %a38 = alloca %S.ast.Node, align 16 + %a41 = alloca %S.ast.Node, align 16 + %a59 = alloca %S.ast.Node, align 16 + %a60 = alloca %S.ast.Node, align 16 + %a101 = alloca %S.ast.Node, align 16 + %a102 = alloca %S.ast.Node, align 16 + %a126 = alloca %S.ast.Node, align 16 + %a127 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + store i1 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = call %S.ast.Node @finch.parser.node(ptr %t3, { ptr, i64, i64 } { ptr @.str.751, i64 5, i64 0 }) + store %S.ast.Node %t4, ptr %a5 + %t6 = load i1, ptr %a2 + %t7 = getelementptr inbounds %S.ast.Node, ptr %a5, i32 0, i32 6 + store i1 %t6, ptr %t7 + %t8 = load ptr, ptr %a1 + %t9 = call %S.lexer.Token @finch.parser.expect(ptr %t8, { ptr, i64, i64 } { ptr @.str.752, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.753, i64 7, i64 0 }) + %t10 = getelementptr inbounds %S.ast.Node, ptr %a5, i32 0, i32 9 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t10, i32 0, i32 1 + %t12 = load ptr, ptr %a1 + %t13 = call %S.ast.Node @finch.parser.parseExpr(ptr %t12) + %t14 = load i64, ptr %t11 + %t15 = add i64 %t14, 1 + call void @finch_arr_reserve(ptr %t10, i64 %t15, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t16 = load ptr, ptr %t10 + %t17 = getelementptr inbounds %S.ast.Node, ptr %t16, i64 %t14 + store %S.ast.Node %t13, ptr %t17 + store i64 %t15, ptr %t11 + %t18 = load ptr, ptr %a1 + %t19 = call %S.lexer.Token @finch.parser.expect(ptr %t18, { ptr, i64, i64 } { ptr @.str.754, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.755, i64 3, i64 0 }) + %t20 = load ptr, ptr %a1 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic1297, label %ok1298 +panic1297: + call void @finch_panic(ptr @.str.756, i64 300, ptr @.str.757) + unreachable +ok1298: + %t22 = getelementptr inbounds %S.parser.Parser, ptr %t20, i32 0, i32 2 + %t23 = load i64, ptr %t22 + store i64 %t23, ptr %a24 + %t25 = load ptr, ptr %a1 + %t26 = icmp eq ptr %t25, null + br i1 %t26, label %panic1299, label %ok1300 +panic1299: + call void @finch_panic(ptr @.str.758, i64 301, ptr @.str.759) + unreachable +ok1300: + %t27 = getelementptr inbounds %S.parser.Parser, ptr %t25, i32 0, i32 2 + store i64 0, ptr %t27 + br label %while.cond1301 +while.cond1301: + %t28 = load ptr, ptr %a1 + %t29 = call i1 @finch.parser.at(ptr %t28, { ptr, i64, i64 } { ptr @.str.760, i64 1, i64 0 }) + %t30 = xor i1 %t29, true + br i1 %t30, label %while.body1302, label %while.end1303 +while.body1302: + %t31 = load ptr, ptr %a1 + %t32 = call i1 @finch.parser.at(ptr %t31, { ptr, i64, i64 } { ptr @.str.761, i64 3, i64 0 }) + br i1 %t32, label %then1304, label %endif1306 +then1304: + %t33 = load ptr, ptr %a1 + %t34 = load ptr, ptr %a1 + %t35 = call %S.lexer.Token @finch.parser.cur(ptr %t34) + call void @finch.parser.fail(ptr %t33, %S.lexer.Token %t35, { ptr, i64, i64 } { ptr @.str.762, i64 37, i64 0 }) + br label %endif1306 +endif1306: + %t36 = load ptr, ptr %a1 + %t37 = call %S.ast.Node @finch.parser.node(ptr %t36, { ptr, i64, i64 } { ptr @.str.763, i64 3, i64 0 }) + store %S.ast.Node %t37, ptr %a38 + %t39 = load ptr, ptr %a1 + %t40 = call %S.ast.Node @finch.parser.node(ptr %t39, { ptr, i64, i64 } { ptr @.str.764, i64 8, i64 0 }) + store %S.ast.Node %t40, ptr %a41 + %t42 = load ptr, ptr %a1 + %t43 = call i1 @finch.parser.accept(ptr %t42, { ptr, i64, i64 } { ptr @.str.765, i64 4, i64 0 }) + br i1 %t43, label %then1307, label %else1308 +then1307: + %t44 = getelementptr inbounds %S.ast.Node, ptr %a38, i32 0, i32 6 + store i1 true, ptr %t44 + br label %endif1309 +else1308: + br label %while.cond1310 +while.cond1310: + br label %while.body1311 +while.body1311: + %t45 = getelementptr inbounds %S.ast.Node, ptr %a41, i32 0, i32 9 + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %t45, i32 0, i32 1 + %t47 = load ptr, ptr %a1 + %t48 = call %S.ast.Node @finch.parser.parseExpr(ptr %t47) + %t49 = load i64, ptr %t46 + %t50 = add i64 %t49, 1 + call void @finch_arr_reserve(ptr %t45, i64 %t50, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t51 = load ptr, ptr %t45 + %t52 = getelementptr inbounds %S.ast.Node, ptr %t51, i64 %t49 + store %S.ast.Node %t48, ptr %t52 + store i64 %t50, ptr %t46 + %t53 = load ptr, ptr %a1 + %t54 = call i1 @finch.parser.accept(ptr %t53, { ptr, i64, i64 } { ptr @.str.766, i64 1, i64 0 }) + %t55 = xor i1 %t54, true + br i1 %t55, label %then1313, label %endif1315 +then1313: + br label %while.end1312 +endif1315: + br label %while.cond1310 +while.end1312: + br label %endif1309 +endif1309: + %t56 = getelementptr inbounds %S.ast.Node, ptr %a38, i32 0, i32 9 + %t57 = getelementptr inbounds { ptr, i64, i64 }, ptr %t56, i32 0, i32 1 + %t58 = load %S.ast.Node, ptr %a41 + store %S.ast.Node %t58, ptr %a59 + call void @finch.copy.S_ast_Node(ptr %a60, ptr %a59) + %t61 = load %S.ast.Node, ptr %a60 + %t62 = load i64, ptr %t57 + %t63 = add i64 %t62, 1 + call void @finch_arr_reserve(ptr %t56, i64 %t63, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t64 = load ptr, ptr %t56 + %t65 = getelementptr inbounds %S.ast.Node, ptr %t64, i64 %t62 + store %S.ast.Node %t61, ptr %t65 + store i64 %t63, ptr %t57 + %t66 = load ptr, ptr %a1 + %t67 = call %S.lexer.Token @finch.parser.expect(ptr %t66, { ptr, i64, i64 } { ptr @.str.767, i64 2, i64 0 }, { ptr, i64, i64 } { ptr @.str.768, i64 57, i64 0 }) + %t68 = load ptr, ptr %a1 + %t69 = call i1 @finch.parser.at(ptr %t68, { ptr, i64, i64 } { ptr @.str.769, i64 1, i64 0 }) + br label %logic.from1316 +logic.from1316: + br i1 %t69, label %logic.rhs1317, label %logic.end1318 +logic.rhs1317: + %t70 = load i1, ptr %a2 + %t71 = xor i1 %t70, true + br label %logic.rend1319 +logic.rend1319: + br label %logic.end1318 +logic.end1318: + %t72 = phi i1 [ false, %logic.from1316 ], [ %t71, %logic.rend1319 ] + br i1 %t72, label %then1320, label %else1321 +then1320: + %t73 = getelementptr inbounds %S.ast.Node, ptr %a38, i32 0, i32 9 + %t74 = getelementptr inbounds { ptr, i64, i64 }, ptr %t73, i32 0, i32 1 + %t75 = load ptr, ptr %a1 + %t76 = call %S.ast.Node @finch.parser.parseBlock(ptr %t75) + %t77 = load i64, ptr %t74 + %t78 = add i64 %t77, 1 + call void @finch_arr_reserve(ptr %t73, i64 %t78, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t79 = load ptr, ptr %t73 + %t80 = getelementptr inbounds %S.ast.Node, ptr %t79, i64 %t77 + store %S.ast.Node %t76, ptr %t80 + store i64 %t78, ptr %t74 + br label %endif1322 +else1321: + %t81 = load i1, ptr %a2 + br i1 %t81, label %then1323, label %else1324 +then1323: + %t82 = getelementptr inbounds %S.ast.Node, ptr %a38, i32 0, i32 9 + %t83 = getelementptr inbounds { ptr, i64, i64 }, ptr %t82, i32 0, i32 1 + %t84 = load ptr, ptr %a1 + %t85 = call %S.ast.Node @finch.parser.parseExpr(ptr %t84) + %t86 = load i64, ptr %t83 + %t87 = add i64 %t86, 1 + call void @finch_arr_reserve(ptr %t82, i64 %t87, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t88 = load ptr, ptr %t82 + %t89 = getelementptr inbounds %S.ast.Node, ptr %t88, i64 %t86 + store %S.ast.Node %t85, ptr %t89 + store i64 %t87, ptr %t83 + br label %endif1325 +else1324: + %t90 = getelementptr inbounds %S.ast.Node, ptr %a38, i32 0, i32 9 + %t91 = getelementptr inbounds { ptr, i64, i64 }, ptr %t90, i32 0, i32 1 + %t92 = load ptr, ptr %a1 + %t93 = call %S.ast.Node @finch.parser.parseStatement(ptr %t92) + %t94 = load i64, ptr %t91 + %t95 = add i64 %t94, 1 + call void @finch_arr_reserve(ptr %t90, i64 %t95, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t96 = load ptr, ptr %t90 + %t97 = getelementptr inbounds %S.ast.Node, ptr %t96, i64 %t94 + store %S.ast.Node %t93, ptr %t97 + store i64 %t95, ptr %t91 + br label %endif1325 +endif1325: + br label %endif1322 +endif1322: + %t98 = getelementptr inbounds %S.ast.Node, ptr %a5, i32 0, i32 9 + %t99 = getelementptr inbounds { ptr, i64, i64 }, ptr %t98, i32 0, i32 1 + %t100 = load %S.ast.Node, ptr %a38 + store %S.ast.Node %t100, ptr %a101 + call void @finch.copy.S_ast_Node(ptr %a102, ptr %a101) + %t103 = load %S.ast.Node, ptr %a102 + %t104 = load i64, ptr %t99 + %t105 = add i64 %t104, 1 + call void @finch_arr_reserve(ptr %t98, i64 %t105, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t106 = load ptr, ptr %t98 + %t107 = getelementptr inbounds %S.ast.Node, ptr %t106, i64 %t104 + store %S.ast.Node %t103, ptr %t107 + store i64 %t105, ptr %t99 + %t108 = load ptr, ptr %a1 + %t109 = call i1 @finch.parser.accept(ptr %t108, { ptr, i64, i64 } { ptr @.str.770, i64 1, i64 0 }) + %t110 = xor i1 %t109, true + br i1 %t110, label %then1326, label %endif1328 +then1326: + %t111 = load ptr, ptr %a1 + call void @finch.parser.endOfStatement(ptr %t111) + br label %endif1328 +endif1328: + br label %while.cond1301 +while.end1303: + %t112 = load i64, ptr %a24 + %t113 = load ptr, ptr %a1 + %t114 = icmp eq ptr %t113, null + br i1 %t114, label %panic1329, label %ok1330 +panic1329: + call void @finch_panic(ptr @.str.771, i64 332, ptr @.str.772) + unreachable +ok1330: + %t115 = getelementptr inbounds %S.parser.Parser, ptr %t113, i32 0, i32 2 + store i64 %t112, ptr %t115 + %t116 = load ptr, ptr %a1 + %t117 = call %S.lexer.Token @finch.parser.next(ptr %t116) + %t118 = getelementptr inbounds %S.ast.Node, ptr %a5, i32 0, i32 9 + %t119 = getelementptr inbounds { ptr, i64, i64 }, ptr %t118, i32 0, i32 1 + %t120 = load i64, ptr %t119 + %t121 = icmp eq i64 %t120, 1 + br i1 %t121, label %then1331, label %endif1333 +then1331: + %t122 = load ptr, ptr %a1 + %t123 = load ptr, ptr %a1 + %t124 = call %S.lexer.Token @finch.parser.cur(ptr %t123) + call void @finch.parser.fail(ptr %t122, %S.lexer.Token %t124, { ptr, i64, i64 } { ptr @.str.773, i64 30, i64 0 }) + br label %endif1333 +endif1333: + %t125 = load %S.ast.Node, ptr %a5 + store %S.ast.Node %t125, ptr %a126 + call void @finch.copy.S_ast_Node(ptr %a127, ptr %a126) + %t128 = load %S.ast.Node, ptr %a127 + ret %S.ast.Node %t128 +} + +define internal { ptr, i64, i64 } @finch.parser.parseTParams(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } zeroinitializer, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = call %S.lexer.Token @finch.parser.expect(ptr %t3, { ptr, i64, i64 } { ptr @.str.774, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.775, i64 3, i64 0 }) + br label %while.cond1334 +while.cond1334: + br label %while.body1335 +while.body1335: + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t6 = load ptr, ptr %a1 + %t7 = call %S.lexer.Token @finch.parser.expect(ptr %t6, { ptr, i64, i64 } { ptr @.str.776, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.777, i64 29, i64 0 }) + %t8 = extractvalue %S.lexer.Token %t7, 1 + store { ptr, i64, i64 } %t8, ptr %a9 + call void @finch_str_copy(ptr %a10, ptr %a9) + %t11 = load { ptr, i64, i64 }, ptr %a10 + %t12 = load i64, ptr %t5 + %t13 = add i64 %t12, 1 + call void @finch_arr_reserve(ptr %a2, i64 %t13, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t14 = load ptr, ptr %a2 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t14, i64 %t12 + store { ptr, i64, i64 } %t11, ptr %t15 + store i64 %t13, ptr %t5 + %t16 = load ptr, ptr %a1 + %t17 = call i1 @finch.parser.accept(ptr %t16, { ptr, i64, i64 } { ptr @.str.778, i64 1, i64 0 }) + %t18 = xor i1 %t17, true + br i1 %t18, label %then1337, label %endif1339 +then1337: + br label %while.end1336 +endif1339: + br label %while.cond1334 +while.end1336: + %t19 = load ptr, ptr %a1 + %t20 = call %S.lexer.Token @finch.parser.expect(ptr %t19, { ptr, i64, i64 } { ptr @.str.779, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.780, i64 29, i64 0 }) + %t21 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t21, ptr %a22 + call void @finch.copy.arr_str(ptr %a23, ptr %a22) + %t24 = load { ptr, i64, i64 }, ptr %a23 + ret { ptr, i64, i64 } %t24 +} + +define internal %S.ast.Node @finch.parser.parseStruct(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca %S.ast.Node, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca %S.ast.Node, align 16 + %a73 = alloca %S.ast.Node, align 16 + %a83 = alloca %S.ast.Node, align 16 + %a84 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.ast.Node @finch.parser.node(ptr %t2, { ptr, i64, i64 } { ptr @.str.781, i64 6, i64 0 }) + store %S.ast.Node %t3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call %S.lexer.Token @finch.parser.expect(ptr %t5, { ptr, i64, i64 } { ptr @.str.782, i64 6, i64 0 }, { ptr, i64, i64 } { ptr @.str.783, i64 8, i64 0 }) + %t7 = load ptr, ptr %a1 + %t8 = call %S.lexer.Token @finch.parser.expect(ptr %t7, { ptr, i64, i64 } { ptr @.str.784, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.785, i64 13, i64 0 }) + %t9 = extractvalue %S.lexer.Token %t8, 1 + store { ptr, i64, i64 } %t9, ptr %a10 + call void @finch_str_copy(ptr %a11, ptr %a10) + %t12 = load { ptr, i64, i64 }, ptr %a11 + %t13 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 1 + store { ptr, i64, i64 } %t12, ptr %t13 + %t14 = load ptr, ptr %a1 + %t15 = call i1 @finch.parser.at(ptr %t14, { ptr, i64, i64 } { ptr @.str.786, i64 1, i64 0 }) + br i1 %t15, label %then1340, label %endif1342 +then1340: + %t16 = load ptr, ptr %a1 + %t17 = call { ptr, i64, i64 } @finch.parser.parseTParams(ptr %t16) + %t18 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 3 + store { ptr, i64, i64 } %t17, ptr %t18 + br label %endif1342 +endif1342: + %t19 = load ptr, ptr %a1 + %t20 = call %S.lexer.Token @finch.parser.expect(ptr %t19, { ptr, i64, i64 } { ptr @.str.787, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.788, i64 3, i64 0 }) + br label %while.cond1343 +while.cond1343: + %t21 = load ptr, ptr %a1 + %t22 = call i1 @finch.parser.at(ptr %t21, { ptr, i64, i64 } { ptr @.str.789, i64 1, i64 0 }) + %t23 = xor i1 %t22, true + br i1 %t23, label %while.body1344, label %while.end1345 +while.body1344: + %t24 = load ptr, ptr %a1 + %t25 = call i1 @finch.parser.at(ptr %t24, { ptr, i64, i64 } { ptr @.str.790, i64 3, i64 0 }) + br i1 %t25, label %then1346, label %endif1348 +then1346: + %t26 = load ptr, ptr %a1 + %t27 = load ptr, ptr %a1 + %t28 = call %S.lexer.Token @finch.parser.cur(ptr %t27) + call void @finch.parser.fail(ptr %t26, %S.lexer.Token %t28, { ptr, i64, i64 } { ptr @.str.791, i64 38, i64 0 }) + br label %endif1348 +endif1348: + %t29 = load ptr, ptr %a1 + %t30 = call %S.ast.Node @finch.parser.node(ptr %t29, { ptr, i64, i64 } { ptr @.str.792, i64 5, i64 0 }) + store %S.ast.Node %t30, ptr %a31 + %t32 = load ptr, ptr %a1 + %t33 = call i1 @finch.parser.atDeclaration(ptr %t32) + %t34 = xor i1 %t33, true + br i1 %t34, label %then1349, label %endif1351 +then1349: + %t35 = load ptr, ptr %a1 + %t36 = load ptr, ptr %a1 + %t37 = call %S.lexer.Token @finch.parser.cur(ptr %t36) + %t38 = load ptr, ptr %a1 + %t39 = call %S.lexer.Token @finch.parser.cur(ptr %t38) + %t40 = call { ptr, i64, i64 } @finch.parser.describe(%S.lexer.Token %t39) + store { ptr, i64, i64 } { ptr @.str.793, i64 11, i64 0 }, ptr %a42 + store { ptr, i64, i64 } %t40, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + store { ptr, i64, i64 } %t44, ptr %a46 + store { ptr, i64, i64 } { ptr @.str.794, i64 28, i64 0 }, ptr %a47 + call void @finch_str_concat(ptr %a45, ptr %a46, ptr %a47) + %t48 = load { ptr, i64, i64 }, ptr %a45 + call void @finch.parser.fail(ptr %t35, %S.lexer.Token %t37, { ptr, i64, i64 } %t48) + br label %endif1351 +endif1351: + %t49 = load ptr, ptr %a1 + %t50 = call %S.ast.Type @finch.parser.parseType(ptr %t49) + %t51 = getelementptr inbounds %S.ast.Node, ptr %a31, i32 0, i32 5 + store %S.ast.Type %t50, ptr %t51 + %t52 = load ptr, ptr %a1 + %t53 = call %S.lexer.Token @finch.parser.expect(ptr %t52, { ptr, i64, i64 } { ptr @.str.795, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.796, i64 12, i64 0 }) + %t54 = extractvalue %S.lexer.Token %t53, 1 + store { ptr, i64, i64 } %t54, ptr %a55 + call void @finch_str_copy(ptr %a56, ptr %a55) + %t57 = load { ptr, i64, i64 }, ptr %a56 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a31, i32 0, i32 1 + store { ptr, i64, i64 } %t57, ptr %t58 + %t59 = load ptr, ptr %a1 + %t60 = call i1 @finch.parser.accept(ptr %t59, { ptr, i64, i64 } { ptr @.str.797, i64 1, i64 0 }) + br i1 %t60, label %then1352, label %endif1354 +then1352: + %t61 = getelementptr inbounds %S.ast.Node, ptr %a31, i32 0, i32 9 + %t62 = getelementptr inbounds { ptr, i64, i64 }, ptr %t61, i32 0, i32 1 + %t63 = load ptr, ptr %a1 + %t64 = call %S.ast.Node @finch.parser.parseExpr(ptr %t63) + %t65 = load i64, ptr %t62 + %t66 = add i64 %t65, 1 + call void @finch_arr_reserve(ptr %t61, i64 %t66, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t67 = load ptr, ptr %t61 + %t68 = getelementptr inbounds %S.ast.Node, ptr %t67, i64 %t65 + store %S.ast.Node %t64, ptr %t68 + store i64 %t66, ptr %t62 + br label %endif1354 +endif1354: + %t69 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t70 = getelementptr inbounds { ptr, i64, i64 }, ptr %t69, i32 0, i32 1 + %t71 = load %S.ast.Node, ptr %a31 + store %S.ast.Node %t71, ptr %a72 + call void @finch.copy.S_ast_Node(ptr %a73, ptr %a72) + %t74 = load %S.ast.Node, ptr %a73 + %t75 = load i64, ptr %t70 + %t76 = add i64 %t75, 1 + call void @finch_arr_reserve(ptr %t69, i64 %t76, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t77 = load ptr, ptr %t69 + %t78 = getelementptr inbounds %S.ast.Node, ptr %t77, i64 %t75 + store %S.ast.Node %t74, ptr %t78 + store i64 %t76, ptr %t70 + %t79 = load ptr, ptr %a1 + call void @finch.parser.endOfStatement(ptr %t79) + br label %while.cond1343 +while.end1345: + %t80 = load ptr, ptr %a1 + %t81 = call %S.lexer.Token @finch.parser.next(ptr %t80) + %t82 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t82, ptr %a83 + call void @finch.copy.S_ast_Node(ptr %a84, ptr %a83) + %t85 = load %S.ast.Node, ptr %a84 + ret %S.ast.Node %t85 +} + +define internal %S.ast.Node @finch.parser.parseFn(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca %S.ast.Node, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca %S.ast.Node, align 16 + %a77 = alloca %S.ast.Node, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca %S.ast.Node, align 16 + %a141 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.ast.Node @finch.parser.node(ptr %t2, { ptr, i64, i64 } { ptr @.str.798, i64 2, i64 0 }) + store %S.ast.Node %t3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call i1 @finch.parser.accept(ptr %t5, { ptr, i64, i64 } { ptr @.str.799, i64 6, i64 0 }) + %t7 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 8 + store i1 %t6, ptr %t7 + %t8 = load ptr, ptr %a1 + %t9 = call i1 @finch.parser.at(ptr %t8, { ptr, i64, i64 } { ptr @.str.800, i64 5, i64 0 }) + br label %logic.from1355 +logic.from1355: + br i1 %t9, label %logic.rhs1356, label %logic.end1357 +logic.rhs1356: + %t10 = load ptr, ptr %a1 + %t11 = call %S.lexer.Token @finch.parser.cur(ptr %t10) + %t12 = extractvalue %S.lexer.Token %t11, 1 + store { ptr, i64, i64 } %t12, ptr %a13 + call void @finch_str_copy(ptr %a14, ptr %a13) + %t15 = load { ptr, i64, i64 }, ptr %a14 + %t16 = call i1 @finch.parser.isTypeName({ ptr, i64, i64 } %t15) + br label %logic.rend1358 +logic.rend1358: + br label %logic.end1357 +logic.end1357: + %t17 = phi i1 [ false, %logic.from1355 ], [ %t16, %logic.rend1358 ] + br i1 %t17, label %then1359, label %endif1361 +then1359: + %t18 = load ptr, ptr %a1 + %t19 = load ptr, ptr %a1 + %t20 = call %S.lexer.Token @finch.parser.cur(ptr %t19) + call void @finch.parser.fail(ptr %t18, %S.lexer.Token %t20, { ptr, i64, i64 } { ptr @.str.801, i64 68, i64 0 }) + br label %endif1361 +endif1361: + %t21 = load ptr, ptr %a1 + %t22 = call %S.lexer.Token @finch.parser.expect(ptr %t21, { ptr, i64, i64 } { ptr @.str.802, i64 2, i64 0 }, { ptr, i64, i64 } { ptr @.str.803, i64 26, i64 0 }) + %t23 = load ptr, ptr %a1 + %t24 = call %S.lexer.Token @finch.parser.expect(ptr %t23, { ptr, i64, i64 } { ptr @.str.804, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.805, i64 15, i64 0 }) + %t25 = extractvalue %S.lexer.Token %t24, 1 + store { ptr, i64, i64 } %t25, ptr %a26 + call void @finch_str_copy(ptr %a27, ptr %a26) + %t28 = load { ptr, i64, i64 }, ptr %a27 + %t29 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 1 + store { ptr, i64, i64 } %t28, ptr %t29 + %t30 = load ptr, ptr %a1 + %t31 = call i1 @finch.parser.at(ptr %t30, { ptr, i64, i64 } { ptr @.str.806, i64 1, i64 0 }) + br i1 %t31, label %then1362, label %endif1364 +then1362: + %t32 = load ptr, ptr %a1 + %t33 = call { ptr, i64, i64 } @finch.parser.parseTParams(ptr %t32) + %t34 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 3 + store { ptr, i64, i64 } %t33, ptr %t34 + br label %endif1364 +endif1364: + %t35 = load ptr, ptr %a1 + %t36 = call i1 @finch.parser.accept(ptr %t35, { ptr, i64, i64 } { ptr @.str.807, i64 1, i64 0 }) + br i1 %t36, label %then1365, label %endif1367 +then1365: + %t37 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 1 + %t38 = load { ptr, i64, i64 }, ptr %t37 + %t39 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } %t38, ptr %a40 + call void @finch_str_copy(ptr %a41, ptr %a40) + %t42 = load { ptr, i64, i64 }, ptr %a41 + store { ptr, i64, i64 } %t42, ptr %t39 + %t43 = load ptr, ptr %a1 + %t44 = call %S.lexer.Token @finch.parser.expect(ptr %t43, { ptr, i64, i64 } { ptr @.str.808, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.809, i64 13, i64 0 }) + %t45 = extractvalue %S.lexer.Token %t44, 1 + store { ptr, i64, i64 } %t45, ptr %a46 + call void @finch_str_copy(ptr %a47, ptr %a46) + %t48 = load { ptr, i64, i64 }, ptr %a47 + %t49 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 1 + store { ptr, i64, i64 } %t48, ptr %t49 + br label %endif1367 +endif1367: + %t50 = load ptr, ptr %a1 + %t51 = call %S.lexer.Token @finch.parser.expect(ptr %t50, { ptr, i64, i64 } { ptr @.str.810, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.811, i64 3, i64 0 }) + %t52 = load ptr, ptr %a1 + %t53 = icmp eq ptr %t52, null + br i1 %t53, label %panic1368, label %ok1369 +panic1368: + call void @finch_panic(ptr @.str.812, i64 398, ptr @.str.813) + unreachable +ok1369: + %t54 = getelementptr inbounds %S.parser.Parser, ptr %t52, i32 0, i32 2 + %t55 = load i64, ptr %t54 + %t56 = add i64 %t55, 1 + store i64 %t56, ptr %t54 + %t57 = load ptr, ptr %a1 + %t58 = call i1 @finch.parser.at(ptr %t57, { ptr, i64, i64 } { ptr @.str.814, i64 1, i64 0 }) + %t59 = xor i1 %t58, true + br i1 %t59, label %then1370, label %endif1372 +then1370: + br label %while.cond1373 +while.cond1373: + br label %while.body1374 +while.body1374: + %t60 = load ptr, ptr %a1 + %t61 = call %S.ast.Node @finch.parser.node(ptr %t60, { ptr, i64, i64 } { ptr @.str.815, i64 5, i64 0 }) + store %S.ast.Node %t61, ptr %a62 + %t63 = load ptr, ptr %a1 + %t64 = call %S.ast.Type @finch.parser.parseType(ptr %t63) + %t65 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 5 + store %S.ast.Type %t64, ptr %t65 + %t66 = load ptr, ptr %a1 + %t67 = call %S.lexer.Token @finch.parser.expect(ptr %t66, { ptr, i64, i64 } { ptr @.str.816, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.817, i64 16, i64 0 }) + %t68 = extractvalue %S.lexer.Token %t67, 1 + store { ptr, i64, i64 } %t68, ptr %a69 + call void @finch_str_copy(ptr %a70, ptr %a69) + %t71 = load { ptr, i64, i64 }, ptr %a70 + %t72 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 1 + store { ptr, i64, i64 } %t71, ptr %t72 + %t73 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t74 = getelementptr inbounds { ptr, i64, i64 }, ptr %t73, i32 0, i32 1 + %t75 = load %S.ast.Node, ptr %a62 + store %S.ast.Node %t75, ptr %a76 + call void @finch.copy.S_ast_Node(ptr %a77, ptr %a76) + %t78 = load %S.ast.Node, ptr %a77 + %t79 = load i64, ptr %t74 + %t80 = add i64 %t79, 1 + call void @finch_arr_reserve(ptr %t73, i64 %t80, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t81 = load ptr, ptr %t73 + %t82 = getelementptr inbounds %S.ast.Node, ptr %t81, i64 %t79 + store %S.ast.Node %t78, ptr %t82 + store i64 %t80, ptr %t74 + %t83 = load ptr, ptr %a1 + %t84 = call i1 @finch.parser.accept(ptr %t83, { ptr, i64, i64 } { ptr @.str.818, i64 1, i64 0 }) + %t85 = xor i1 %t84, true + br i1 %t85, label %then1376, label %endif1378 +then1376: + br label %while.end1375 +endif1378: + br label %while.cond1373 +while.end1375: + br label %endif1372 +endif1372: + %t86 = load ptr, ptr %a1 + %t87 = icmp eq ptr %t86, null + br i1 %t87, label %panic1379, label %ok1380 +panic1379: + call void @finch_panic(ptr @.str.819, i64 410, ptr @.str.820) + unreachable +ok1380: + %t88 = getelementptr inbounds %S.parser.Parser, ptr %t86, i32 0, i32 2 + %t89 = load i64, ptr %t88 + %t90 = sub i64 %t89, 1 + store i64 %t90, ptr %t88 + %t91 = load ptr, ptr %a1 + %t92 = call %S.lexer.Token @finch.parser.expect(ptr %t91, { ptr, i64, i64 } { ptr @.str.821, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.822, i64 3, i64 0 }) + %t93 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.823, i64 4, i64 0 }) + %t94 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 5 + store %S.ast.Type %t93, ptr %t94 + %t95 = load ptr, ptr %a1 + %t96 = call i1 @finch.parser.accept(ptr %t95, { ptr, i64, i64 } { ptr @.str.824, i64 2, i64 0 }) + br i1 %t96, label %then1381, label %endif1383 +then1381: + %t97 = load ptr, ptr %a1 + %t98 = call i1 @finch.parser.at(ptr %t97, { ptr, i64, i64 } { ptr @.str.825, i64 1, i64 0 }) + %t99 = xor i1 %t98, true + br i1 %t99, label %then1384, label %endif1386 +then1384: + %t100 = load ptr, ptr %a1 + %t101 = call %S.ast.Type @finch.parser.parseType(ptr %t100) + %t102 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 5 + store %S.ast.Type %t101, ptr %t102 + br label %endif1386 +endif1386: + %t103 = load ptr, ptr %a1 + %t104 = call i1 @finch.parser.accept(ptr %t103, { ptr, i64, i64 } { ptr @.str.826, i64 1, i64 0 }) + %t105 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 7 + store i1 %t104, ptr %t105 + %t106 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 7 + %t107 = load i1, ptr %t106 + %t108 = xor i1 %t107, true + br label %logic.from1387 +logic.from1387: + br i1 %t108, label %logic.rhs1388, label %logic.end1389 +logic.rhs1388: + %t109 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 5 + %t110 = getelementptr inbounds %S.ast.Type, ptr %t109, i32 0, i32 0 + %t111 = load { ptr, i64, i64 }, ptr %t110 + store { ptr, i64, i64 } %t111, ptr %a112 + store { ptr, i64, i64 } { ptr @.str.827, i64 4, i64 0 }, ptr %a113 + %t114 = call i32 @finch_str_eq(ptr %a112, ptr %a113) + %t115 = icmp ne i32 %t114, 0 + br label %logic.rend1390 +logic.rend1390: + br label %logic.end1389 +logic.end1389: + %t116 = phi i1 [ false, %logic.from1387 ], [ %t115, %logic.rend1390 ] + br i1 %t116, label %then1391, label %endif1393 +then1391: + %t117 = load ptr, ptr %a1 + %t118 = load ptr, ptr %a1 + %t119 = call %S.lexer.Token @finch.parser.cur(ptr %t118) + %t120 = load ptr, ptr %a1 + %t121 = call %S.lexer.Token @finch.parser.cur(ptr %t120) + %t122 = call { ptr, i64, i64 } @finch.parser.describe(%S.lexer.Token %t121) + store { ptr, i64, i64 } { ptr @.str.828, i64 11, i64 0 }, ptr %a124 + store { ptr, i64, i64 } %t122, ptr %a125 + call void @finch_str_concat(ptr %a123, ptr %a124, ptr %a125) + %t126 = load { ptr, i64, i64 }, ptr %a123 + store { ptr, i64, i64 } %t126, ptr %a128 + store { ptr, i64, i64 } { ptr @.str.829, i64 61, i64 0 }, ptr %a129 + call void @finch_str_concat(ptr %a127, ptr %a128, ptr %a129) + %t130 = load { ptr, i64, i64 }, ptr %a127 + call void @finch.parser.fail(ptr %t117, %S.lexer.Token %t119, { ptr, i64, i64 } %t130) + br label %endif1393 +endif1393: + br label %endif1383 +endif1383: + %t131 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t132 = getelementptr inbounds { ptr, i64, i64 }, ptr %t131, i32 0, i32 1 + %t133 = load ptr, ptr %a1 + %t134 = call %S.ast.Node @finch.parser.parseBlock(ptr %t133) + %t135 = load i64, ptr %t132 + %t136 = add i64 %t135, 1 + call void @finch_arr_reserve(ptr %t131, i64 %t136, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t137 = load ptr, ptr %t131 + %t138 = getelementptr inbounds %S.ast.Node, ptr %t137, i64 %t135 + store %S.ast.Node %t134, ptr %t138 + store i64 %t136, ptr %t132 + %t139 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t139, ptr %a140 + call void @finch.copy.S_ast_Node(ptr %a141, ptr %a140) + %t142 = load %S.ast.Node, ptr %a141 + ret %S.ast.Node %t142 +} + +define internal %S.ast.Node @finch.parser.parseBlock(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a11 = alloca i64, align 16 + %a39 = alloca %S.ast.Node, align 16 + %a40 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.ast.Node @finch.parser.node(ptr %t2, { ptr, i64, i64 } { ptr @.str.830, i64 5, i64 0 }) + store %S.ast.Node %t3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call %S.lexer.Token @finch.parser.expect(ptr %t5, { ptr, i64, i64 } { ptr @.str.831, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.832, i64 3, i64 0 }) + %t7 = load ptr, ptr %a1 + %t8 = icmp eq ptr %t7, null + br i1 %t8, label %panic1394, label %ok1395 +panic1394: + call void @finch_panic(ptr @.str.833, i64 431, ptr @.str.834) + unreachable +ok1395: + %t9 = getelementptr inbounds %S.parser.Parser, ptr %t7, i32 0, i32 2 + %t10 = load i64, ptr %t9 + store i64 %t10, ptr %a11 + %t12 = load ptr, ptr %a1 + %t13 = icmp eq ptr %t12, null + br i1 %t13, label %panic1396, label %ok1397 +panic1396: + call void @finch_panic(ptr @.str.835, i64 432, ptr @.str.836) + unreachable +ok1397: + %t14 = getelementptr inbounds %S.parser.Parser, ptr %t12, i32 0, i32 2 + store i64 0, ptr %t14 + br label %while.cond1398 +while.cond1398: + %t15 = load ptr, ptr %a1 + %t16 = call i1 @finch.parser.at(ptr %t15, { ptr, i64, i64 } { ptr @.str.837, i64 1, i64 0 }) + %t17 = xor i1 %t16, true + br i1 %t17, label %while.body1399, label %while.end1400 +while.body1399: + %t18 = load ptr, ptr %a1 + %t19 = call i1 @finch.parser.at(ptr %t18, { ptr, i64, i64 } { ptr @.str.838, i64 3, i64 0 }) + br i1 %t19, label %then1401, label %endif1403 +then1401: + %t20 = load ptr, ptr %a1 + %t21 = load ptr, ptr %a1 + %t22 = call %S.lexer.Token @finch.parser.cur(ptr %t21) + call void @finch.parser.fail(ptr %t20, %S.lexer.Token %t22, { ptr, i64, i64 } { ptr @.str.839, i64 35, i64 0 }) + br label %endif1403 +endif1403: + %t23 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %t23, i32 0, i32 1 + %t25 = load ptr, ptr %a1 + %t26 = call %S.ast.Node @finch.parser.parseStatement(ptr %t25) + %t27 = load i64, ptr %t24 + %t28 = add i64 %t27, 1 + call void @finch_arr_reserve(ptr %t23, i64 %t28, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t29 = load ptr, ptr %t23 + %t30 = getelementptr inbounds %S.ast.Node, ptr %t29, i64 %t27 + store %S.ast.Node %t26, ptr %t30 + store i64 %t28, ptr %t24 + %t31 = load ptr, ptr %a1 + call void @finch.parser.endOfStatement(ptr %t31) + br label %while.cond1398 +while.end1400: + %t32 = load i64, ptr %a11 + %t33 = load ptr, ptr %a1 + %t34 = icmp eq ptr %t33, null + br i1 %t34, label %panic1404, label %ok1405 +panic1404: + call void @finch_panic(ptr @.str.840, i64 440, ptr @.str.841) + unreachable +ok1405: + %t35 = getelementptr inbounds %S.parser.Parser, ptr %t33, i32 0, i32 2 + store i64 %t32, ptr %t35 + %t36 = load ptr, ptr %a1 + %t37 = call %S.lexer.Token @finch.parser.next(ptr %t36) + %t38 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t38, ptr %a39 + call void @finch.copy.S_ast_Node(ptr %a40, ptr %a39) + %t41 = load %S.ast.Node, ptr %a40 + ret %S.ast.Node %t41 +} + +define internal %S.ast.Node @finch.parser.parseStatement(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca %S.ast.Node, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca %S.ast.Node, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca %S.ast.Node, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca %S.ast.Node, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca %S.ast.Node, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca %S.ast.Node, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca %S.ast.Node, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca %S.lexer.Token, align 16 + %a282 = alloca %S.ast.Node, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca i64, align 16 + %a301 = alloca i64, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca %S.ast.Node, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a355 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca %S.ast.Node, align 16 + %a362 = alloca %S.ast.Node, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a385 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a399 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a418 = alloca %S.ast.Node, align 16 + %a422 = alloca %S.ast.Node, align 16 + %a423 = alloca %S.ast.Node, align 16 + %a430 = alloca %S.ast.Node, align 16 + %a431 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call { ptr, i64, i64 } @finch.parser.curKind(ptr %t2) + store { ptr, i64, i64 } %t3, ptr %a4 + %t5 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.842, i64 2, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br i1 %t9, label %then1406, label %endif1408 +then1406: + %t10 = load ptr, ptr %a1 + %t11 = call %S.ast.Node @finch.parser.parseIf(ptr %t10) + ret %S.ast.Node %t11 +endif1408: + %t12 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.843, i64 5, i64 0 }, ptr %a14 + %t15 = call i32 @finch_str_eq(ptr %a13, ptr %a14) + %t16 = icmp ne i32 %t15, 0 + br i1 %t16, label %then1409, label %endif1411 +then1409: + %t17 = load ptr, ptr %a1 + %t18 = call %S.ast.Node @finch.parser.node(ptr %t17, { ptr, i64, i64 } { ptr @.str.844, i64 5, i64 0 }) + store %S.ast.Node %t18, ptr %a19 + %t20 = load ptr, ptr %a1 + %t21 = call %S.lexer.Token @finch.parser.next(ptr %t20) + %t22 = getelementptr inbounds %S.ast.Node, ptr %a19, i32 0, i32 9 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load ptr, ptr %a1 + %t25 = call %S.ast.Node @finch.parser.parseExpr(ptr %t24) + %t26 = load i64, ptr %t23 + %t27 = add i64 %t26, 1 + call void @finch_arr_reserve(ptr %t22, i64 %t27, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t28 = load ptr, ptr %t22 + %t29 = getelementptr inbounds %S.ast.Node, ptr %t28, i64 %t26 + store %S.ast.Node %t25, ptr %t29 + store i64 %t27, ptr %t23 + %t30 = getelementptr inbounds %S.ast.Node, ptr %a19, i32 0, i32 9 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t30, i32 0, i32 1 + %t32 = load ptr, ptr %a1 + %t33 = call %S.ast.Node @finch.parser.parseBlock(ptr %t32) + %t34 = load i64, ptr %t31 + %t35 = add i64 %t34, 1 + call void @finch_arr_reserve(ptr %t30, i64 %t35, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t36 = load ptr, ptr %t30 + %t37 = getelementptr inbounds %S.ast.Node, ptr %t36, i64 %t34 + store %S.ast.Node %t33, ptr %t37 + store i64 %t35, ptr %t31 + %t38 = load %S.ast.Node, ptr %a19 + ret %S.ast.Node %t38 +endif1411: + %t39 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t39, ptr %a40 + store { ptr, i64, i64 } { ptr @.str.845, i64 3, i64 0 }, ptr %a41 + %t42 = call i32 @finch_str_eq(ptr %a40, ptr %a41) + %t43 = icmp ne i32 %t42, 0 + br i1 %t43, label %then1412, label %endif1414 +then1412: + %t44 = load ptr, ptr %a1 + %t45 = call %S.ast.Node @finch.parser.node(ptr %t44, { ptr, i64, i64 } { ptr @.str.846, i64 3, i64 0 }) + store %S.ast.Node %t45, ptr %a46 + %t47 = load ptr, ptr %a1 + %t48 = call %S.lexer.Token @finch.parser.next(ptr %t47) + %t49 = load ptr, ptr %a1 + %t50 = call %S.lexer.Token @finch.parser.expect(ptr %t49, { ptr, i64, i64 } { ptr @.str.847, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.848, i64 20, i64 0 }) + %t51 = extractvalue %S.lexer.Token %t50, 1 + store { ptr, i64, i64 } %t51, ptr %a52 + call void @finch_str_copy(ptr %a53, ptr %a52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + %t55 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 1 + store { ptr, i64, i64 } %t54, ptr %t55 + %t56 = load ptr, ptr %a1 + %t57 = call i1 @finch.parser.accept(ptr %t56, { ptr, i64, i64 } { ptr @.str.849, i64 1, i64 0 }) + br i1 %t57, label %then1415, label %endif1417 +then1415: + %t58 = load ptr, ptr %a1 + %t59 = call %S.lexer.Token @finch.parser.expect(ptr %t58, { ptr, i64, i64 } { ptr @.str.850, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.851, i64 27, i64 0 }) + %t60 = extractvalue %S.lexer.Token %t59, 1 + store { ptr, i64, i64 } %t60, ptr %a61 + call void @finch_str_copy(ptr %a62, ptr %a61) + %t63 = load { ptr, i64, i64 }, ptr %a62 + %t64 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 4 + store { ptr, i64, i64 } %t63, ptr %t64 + br label %endif1417 +endif1417: + %t65 = load ptr, ptr %a1 + %t66 = call %S.lexer.Token @finch.parser.expect(ptr %t65, { ptr, i64, i64 } { ptr @.str.852, i64 2, i64 0 }, { ptr, i64, i64 } { ptr @.str.853, i64 4, i64 0 }) + %t67 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 9 + %t68 = getelementptr inbounds { ptr, i64, i64 }, ptr %t67, i32 0, i32 1 + %t69 = load ptr, ptr %a1 + %t70 = call %S.ast.Node @finch.parser.parseExpr(ptr %t69) + %t71 = load i64, ptr %t68 + %t72 = add i64 %t71, 1 + call void @finch_arr_reserve(ptr %t67, i64 %t72, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t73 = load ptr, ptr %t67 + %t74 = getelementptr inbounds %S.ast.Node, ptr %t73, i64 %t71 + store %S.ast.Node %t70, ptr %t74 + store i64 %t72, ptr %t68 + %t75 = load ptr, ptr %a1 + %t76 = call i1 @finch.parser.accept(ptr %t75, { ptr, i64, i64 } { ptr @.str.854, i64 2, i64 0 }) + br i1 %t76, label %then1418, label %else1419 +then1418: + %t77 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 4 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %t77, i32 0, i32 1 + %t79 = load i64, ptr %t78 + %t80 = icmp sgt i64 %t79, 0 + br i1 %t80, label %then1421, label %endif1423 +then1421: + %t81 = load ptr, ptr %a1 + %t82 = load ptr, ptr %a1 + %t83 = call %S.lexer.Token @finch.parser.cur(ptr %t82) + call void @finch.parser.fail(ptr %t81, %S.lexer.Token %t83, { ptr, i64, i64 } { ptr @.str.855, i64 55, i64 0 }) + br label %endif1423 +endif1423: + %t84 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 9 + %t85 = getelementptr inbounds { ptr, i64, i64 }, ptr %t84, i32 0, i32 1 + %t86 = load ptr, ptr %a1 + %t87 = call %S.ast.Node @finch.parser.parseExpr(ptr %t86) + %t88 = load i64, ptr %t85 + %t89 = add i64 %t88, 1 + call void @finch_arr_reserve(ptr %t84, i64 %t89, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t90 = load ptr, ptr %t84 + %t91 = getelementptr inbounds %S.ast.Node, ptr %t90, i64 %t88 + store %S.ast.Node %t87, ptr %t91 + store i64 %t89, ptr %t85 + br label %endif1420 +else1419: + %t92 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.856, i64 4, i64 0 }, ptr %t92 + br label %endif1420 +endif1420: + %t93 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 9 + %t94 = getelementptr inbounds { ptr, i64, i64 }, ptr %t93, i32 0, i32 1 + %t95 = load ptr, ptr %a1 + %t96 = call %S.ast.Node @finch.parser.parseBlock(ptr %t95) + %t97 = load i64, ptr %t94 + %t98 = add i64 %t97, 1 + call void @finch_arr_reserve(ptr %t93, i64 %t98, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t99 = load ptr, ptr %t93 + %t100 = getelementptr inbounds %S.ast.Node, ptr %t99, i64 %t97 + store %S.ast.Node %t96, ptr %t100 + store i64 %t98, ptr %t94 + %t101 = load %S.ast.Node, ptr %a46 + ret %S.ast.Node %t101 +endif1414: + %t102 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t102, ptr %a103 + store { ptr, i64, i64 } { ptr @.str.857, i64 5, i64 0 }, ptr %a104 + %t105 = call i32 @finch_str_eq(ptr %a103, ptr %a104) + %t106 = icmp ne i32 %t105, 0 + br i1 %t106, label %then1424, label %endif1426 +then1424: + %t107 = load ptr, ptr %a1 + %t108 = call %S.ast.Node @finch.parser.parseMatch(ptr %t107, i1 false) + ret %S.ast.Node %t108 +endif1426: + %t109 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t109, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.858, i64 6, i64 0 }, ptr %a111 + %t112 = call i32 @finch_str_eq(ptr %a110, ptr %a111) + %t113 = icmp ne i32 %t112, 0 + br i1 %t113, label %then1427, label %endif1429 +then1427: + %t114 = load ptr, ptr %a1 + %t115 = call %S.ast.Node @finch.parser.node(ptr %t114, { ptr, i64, i64 } { ptr @.str.859, i64 6, i64 0 }) + store %S.ast.Node %t115, ptr %a116 + %t117 = load ptr, ptr %a1 + %t118 = call %S.lexer.Token @finch.parser.next(ptr %t117) + %t119 = load ptr, ptr %a1 + %t120 = call i1 @finch.parser.at(ptr %t119, { ptr, i64, i64 } { ptr @.str.860, i64 1, i64 0 }) + %t121 = xor i1 %t120, true + br label %logic.from1430 +logic.from1430: + br i1 %t121, label %logic.rhs1431, label %logic.end1432 +logic.rhs1431: + %t122 = load ptr, ptr %a1 + %t123 = call %S.lexer.Token @finch.parser.cur(ptr %t122) + %t124 = extractvalue %S.lexer.Token %t123, 4 + %t125 = xor i1 %t124, true + br label %logic.rend1433 +logic.rend1433: + br label %logic.end1432 +logic.end1432: + %t126 = phi i1 [ false, %logic.from1430 ], [ %t125, %logic.rend1433 ] + br i1 %t126, label %then1434, label %endif1436 +then1434: + %t127 = getelementptr inbounds %S.ast.Node, ptr %a116, i32 0, i32 9 + %t128 = getelementptr inbounds { ptr, i64, i64 }, ptr %t127, i32 0, i32 1 + %t129 = load ptr, ptr %a1 + %t130 = call %S.ast.Node @finch.parser.parseExpr(ptr %t129) + %t131 = load i64, ptr %t128 + %t132 = add i64 %t131, 1 + call void @finch_arr_reserve(ptr %t127, i64 %t132, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t133 = load ptr, ptr %t127 + %t134 = getelementptr inbounds %S.ast.Node, ptr %t133, i64 %t131 + store %S.ast.Node %t130, ptr %t134 + store i64 %t132, ptr %t128 + br label %endif1436 +endif1436: + %t135 = load %S.ast.Node, ptr %a116 + ret %S.ast.Node %t135 +endif1429: + %t136 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t136, ptr %a137 + store { ptr, i64, i64 } { ptr @.str.861, i64 5, i64 0 }, ptr %a138 + %t139 = call i32 @finch_str_eq(ptr %a137, ptr %a138) + %t140 = icmp ne i32 %t139, 0 + br label %logic.from1437 +logic.from1437: + br i1 %t140, label %logic.end1439, label %logic.rhs1438 +logic.rhs1438: + %t141 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t141, ptr %a142 + store { ptr, i64, i64 } { ptr @.str.862, i64 8, i64 0 }, ptr %a143 + %t144 = call i32 @finch_str_eq(ptr %a142, ptr %a143) + %t145 = icmp ne i32 %t144, 0 + br label %logic.rend1440 +logic.rend1440: + br label %logic.end1439 +logic.end1439: + %t146 = phi i1 [ true, %logic.from1437 ], [ %t145, %logic.rend1440 ] + br i1 %t146, label %then1441, label %endif1443 +then1441: + %t147 = load ptr, ptr %a1 + %t148 = load { ptr, i64, i64 }, ptr %a4 + %t149 = call %S.ast.Node @finch.parser.node(ptr %t147, { ptr, i64, i64 } %t148) + store %S.ast.Node %t149, ptr %a150 + %t151 = load ptr, ptr %a1 + %t152 = call %S.lexer.Token @finch.parser.next(ptr %t151) + %t153 = load %S.ast.Node, ptr %a150 + ret %S.ast.Node %t153 +endif1443: + %t154 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t154, ptr %a155 + store { ptr, i64, i64 } { ptr @.str.863, i64 1, i64 0 }, ptr %a156 + %t157 = call i32 @finch_str_eq(ptr %a155, ptr %a156) + %t158 = icmp ne i32 %t157, 0 + br i1 %t158, label %then1444, label %endif1446 +then1444: + %t159 = load ptr, ptr %a1 + %t160 = call %S.ast.Node @finch.parser.parseBlock(ptr %t159) + ret %S.ast.Node %t160 +endif1446: + %t161 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t161, ptr %a162 + store { ptr, i64, i64 } { ptr @.str.864, i64 5, i64 0 }, ptr %a163 + %t164 = call i32 @finch_str_eq(ptr %a162, ptr %a163) + %t165 = icmp ne i32 %t164, 0 + br i1 %t165, label %then1447, label %endif1449 +then1447: + %t166 = load ptr, ptr %a1 + %t167 = call %S.ast.Node @finch.parser.node(ptr %t166, { ptr, i64, i64 } { ptr @.str.865, i64 5, i64 0 }) + store %S.ast.Node %t167, ptr %a168 + %t169 = load ptr, ptr %a1 + %t170 = call %S.lexer.Token @finch.parser.next(ptr %t169) + %t171 = load ptr, ptr %a1 + %t172 = call i1 @finch.parser.at(ptr %t171, { ptr, i64, i64 } { ptr @.str.866, i64 5, i64 0 }) + br i1 %t172, label %then1450, label %endif1452 +then1450: + %t173 = load ptr, ptr %a1 + %t174 = load ptr, ptr %a1 + %t175 = call %S.lexer.Token @finch.parser.cur(ptr %t174) + call void @finch.parser.fail(ptr %t173, %S.lexer.Token %t175, { ptr, i64, i64 } { ptr @.str.867, i64 33, i64 0 }) + br label %endif1452 +endif1452: + %t176 = getelementptr inbounds %S.ast.Node, ptr %a168, i32 0, i32 9 + %t177 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i32 0, i32 1 + %t178 = load ptr, ptr %a1 + %t179 = call %S.ast.Node @finch.parser.parseStatement(ptr %t178) + %t180 = load i64, ptr %t177 + %t181 = add i64 %t180, 1 + call void @finch_arr_reserve(ptr %t176, i64 %t181, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t182 = load ptr, ptr %t176 + %t183 = getelementptr inbounds %S.ast.Node, ptr %t182, i64 %t180 + store %S.ast.Node %t179, ptr %t183 + store i64 %t181, ptr %t177 + %t184 = load %S.ast.Node, ptr %a168 + ret %S.ast.Node %t184 +endif1449: + %t185 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t185, ptr %a186 + store { ptr, i64, i64 } { ptr @.str.868, i64 2, i64 0 }, ptr %a187 + %t188 = call i32 @finch_str_eq(ptr %a186, ptr %a187) + %t189 = icmp ne i32 %t188, 0 + br label %logic.from1453 +logic.from1453: + br i1 %t189, label %logic.end1455, label %logic.rhs1454 +logic.rhs1454: + %t190 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t190, ptr %a191 + store { ptr, i64, i64 } { ptr @.str.869, i64 6, i64 0 }, ptr %a192 + %t193 = call i32 @finch_str_eq(ptr %a191, ptr %a192) + %t194 = icmp ne i32 %t193, 0 + br label %logic.rend1456 +logic.rend1456: + br label %logic.end1455 +logic.end1455: + %t195 = phi i1 [ true, %logic.from1453 ], [ %t194, %logic.rend1456 ] + br label %logic.from1457 +logic.from1457: + br i1 %t195, label %logic.end1459, label %logic.rhs1458 +logic.rhs1458: + %t196 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t196, ptr %a197 + store { ptr, i64, i64 } { ptr @.str.870, i64 6, i64 0 }, ptr %a198 + %t199 = call i32 @finch_str_eq(ptr %a197, ptr %a198) + %t200 = icmp ne i32 %t199, 0 + br label %logic.rend1460 +logic.rend1460: + br label %logic.end1459 +logic.end1459: + %t201 = phi i1 [ true, %logic.from1457 ], [ %t200, %logic.rend1460 ] + br label %logic.from1461 +logic.from1461: + br i1 %t201, label %logic.end1463, label %logic.rhs1462 +logic.rhs1462: + %t202 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t202, ptr %a203 + store { ptr, i64, i64 } { ptr @.str.871, i64 4, i64 0 }, ptr %a204 + %t205 = call i32 @finch_str_eq(ptr %a203, ptr %a204) + %t206 = icmp ne i32 %t205, 0 + br label %logic.rend1464 +logic.rend1464: + br label %logic.end1463 +logic.end1463: + %t207 = phi i1 [ true, %logic.from1461 ], [ %t206, %logic.rend1464 ] + br i1 %t207, label %then1465, label %endif1467 +then1465: + %t208 = load ptr, ptr %a1 + %t209 = load ptr, ptr %a1 + %t210 = call %S.lexer.Token @finch.parser.cur(ptr %t209) + %t211 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.872, i64 1, i64 0 }, ptr %a213 + store { ptr, i64, i64 } %t211, ptr %a214 + call void @finch_str_concat(ptr %a212, ptr %a213, ptr %a214) + %t215 = load { ptr, i64, i64 }, ptr %a212 + store { ptr, i64, i64 } %t215, ptr %a217 + store { ptr, i64, i64 } { ptr @.str.873, i64 48, i64 0 }, ptr %a218 + call void @finch_str_concat(ptr %a216, ptr %a217, ptr %a218) + %t219 = load { ptr, i64, i64 }, ptr %a216 + call void @finch.parser.fail(ptr %t208, %S.lexer.Token %t210, { ptr, i64, i64 } %t219) + br label %endif1467 +endif1467: + %t220 = load ptr, ptr %a1 + %t221 = call i1 @finch.parser.atDeclaration(ptr %t220) + br i1 %t221, label %then1468, label %endif1470 +then1468: + %t222 = load ptr, ptr %a1 + %t223 = call %S.ast.Node @finch.parser.node(ptr %t222, { ptr, i64, i64 } { ptr @.str.874, i64 4, i64 0 }) + store %S.ast.Node %t223, ptr %a224 + %t225 = getelementptr inbounds %S.ast.Node, ptr %a224, i32 0, i32 6 + store i1 true, ptr %t225 + %t226 = load ptr, ptr %a1 + %t227 = call %S.ast.Type @finch.parser.parseType(ptr %t226) + %t228 = getelementptr inbounds %S.ast.Node, ptr %a224, i32 0, i32 5 + store %S.ast.Type %t227, ptr %t228 + %t229 = load ptr, ptr %a1 + %t230 = call %S.lexer.Token @finch.parser.expect(ptr %t229, { ptr, i64, i64 } { ptr @.str.875, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.876, i64 15, i64 0 }) + %t231 = extractvalue %S.lexer.Token %t230, 1 + store { ptr, i64, i64 } %t231, ptr %a232 + call void @finch_str_copy(ptr %a233, ptr %a232) + %t234 = load { ptr, i64, i64 }, ptr %a233 + %t235 = getelementptr inbounds %S.ast.Node, ptr %a224, i32 0, i32 1 + store { ptr, i64, i64 } %t234, ptr %t235 + %t236 = load ptr, ptr %a1 + %t237 = call i1 @finch.parser.accept(ptr %t236, { ptr, i64, i64 } { ptr @.str.877, i64 1, i64 0 }) + br i1 %t237, label %then1471, label %endif1473 +then1471: + %t238 = getelementptr inbounds %S.ast.Node, ptr %a224, i32 0, i32 9 + %t239 = getelementptr inbounds { ptr, i64, i64 }, ptr %t238, i32 0, i32 1 + %t240 = load ptr, ptr %a1 + %t241 = call %S.ast.Node @finch.parser.parseExpr(ptr %t240) + %t242 = load i64, ptr %t239 + %t243 = add i64 %t242, 1 + call void @finch_arr_reserve(ptr %t238, i64 %t243, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t244 = load ptr, ptr %t238 + %t245 = getelementptr inbounds %S.ast.Node, ptr %t244, i64 %t242 + store %S.ast.Node %t241, ptr %t245 + store i64 %t243, ptr %t239 + br label %endif1473 +endif1473: + %t246 = load %S.ast.Node, ptr %a224 + ret %S.ast.Node %t246 +endif1470: + %t247 = load ptr, ptr %a1 + %t248 = call i1 @finch.parser.at(ptr %t247, { ptr, i64, i64 } { ptr @.str.878, i64 5, i64 0 }) + br label %logic.from1474 +logic.from1474: + br i1 %t248, label %logic.rhs1475, label %logic.end1476 +logic.rhs1475: + %t249 = load ptr, ptr %a1 + %t250 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t249, i64 1) + store { ptr, i64, i64 } %t250, ptr %a251 + store { ptr, i64, i64 } { ptr @.str.879, i64 2, i64 0 }, ptr %a252 + %t253 = call i32 @finch_str_eq(ptr %a251, ptr %a252) + %t254 = icmp ne i32 %t253, 0 + br label %logic.rend1477 +logic.rend1477: + br label %logic.end1476 +logic.end1476: + %t255 = phi i1 [ false, %logic.from1474 ], [ %t254, %logic.rend1477 ] + br i1 %t255, label %then1478, label %endif1480 +then1478: + %t256 = load ptr, ptr %a1 + %t257 = call %S.ast.Node @finch.parser.node(ptr %t256, { ptr, i64, i64 } { ptr @.str.880, i64 4, i64 0 }) + store %S.ast.Node %t257, ptr %a258 + %t259 = load ptr, ptr %a1 + %t260 = call %S.lexer.Token @finch.parser.next(ptr %t259) + %t261 = extractvalue %S.lexer.Token %t260, 1 + store { ptr, i64, i64 } %t261, ptr %a262 + call void @finch_str_copy(ptr %a263, ptr %a262) + %t264 = load { ptr, i64, i64 }, ptr %a263 + %t265 = getelementptr inbounds %S.ast.Node, ptr %a258, i32 0, i32 1 + store { ptr, i64, i64 } %t264, ptr %t265 + %t266 = load ptr, ptr %a1 + %t267 = call %S.lexer.Token @finch.parser.next(ptr %t266) + %t268 = getelementptr inbounds %S.ast.Node, ptr %a258, i32 0, i32 9 + %t269 = getelementptr inbounds { ptr, i64, i64 }, ptr %t268, i32 0, i32 1 + %t270 = load ptr, ptr %a1 + %t271 = call %S.ast.Node @finch.parser.parseExpr(ptr %t270) + %t272 = load i64, ptr %t269 + %t273 = add i64 %t272, 1 + call void @finch_arr_reserve(ptr %t268, i64 %t273, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t274 = load ptr, ptr %t268 + %t275 = getelementptr inbounds %S.ast.Node, ptr %t274, i64 %t272 + store %S.ast.Node %t271, ptr %t275 + store i64 %t273, ptr %t269 + %t276 = load %S.ast.Node, ptr %a258 + ret %S.ast.Node %t276 +endif1480: + %t277 = load ptr, ptr %a1 + %t278 = call %S.lexer.Token @finch.parser.cur(ptr %t277) + store %S.lexer.Token %t278, ptr %a279 + %t280 = load ptr, ptr %a1 + %t281 = call %S.ast.Node @finch.parser.parseExpr(ptr %t280) + store %S.ast.Node %t281, ptr %a282 + %t283 = mul i64 6, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t284 = call ptr @finch_alloc(i64 %t283) + %t285 = getelementptr inbounds { ptr, i64, i64 }, ptr %t284, i64 0 + store { ptr, i64, i64 } { ptr @.str.881, i64 1, i64 0 }, ptr %t285 + %t286 = getelementptr inbounds { ptr, i64, i64 }, ptr %t284, i64 1 + store { ptr, i64, i64 } { ptr @.str.882, i64 2, i64 0 }, ptr %t286 + %t287 = getelementptr inbounds { ptr, i64, i64 }, ptr %t284, i64 2 + store { ptr, i64, i64 } { ptr @.str.883, i64 2, i64 0 }, ptr %t287 + %t288 = getelementptr inbounds { ptr, i64, i64 }, ptr %t284, i64 3 + store { ptr, i64, i64 } { ptr @.str.884, i64 2, i64 0 }, ptr %t288 + %t289 = getelementptr inbounds { ptr, i64, i64 }, ptr %t284, i64 4 + store { ptr, i64, i64 } { ptr @.str.885, i64 2, i64 0 }, ptr %t289 + %t290 = getelementptr inbounds { ptr, i64, i64 }, ptr %t284, i64 5 + store { ptr, i64, i64 } { ptr @.str.886, i64 2, i64 0 }, ptr %t290 + %t291 = insertvalue { ptr, i64, i64 } undef, ptr %t284, 0 + %t292 = insertvalue { ptr, i64, i64 } %t291, i64 6, 1 + %t293 = insertvalue { ptr, i64, i64 } %t292, i64 6, 2 + store { ptr, i64, i64 } %t293, ptr %a294 + %t295 = getelementptr inbounds { ptr, i64, i64 }, ptr %a294, i32 0, i32 1 + %t296 = load ptr, ptr %a1 + %t297 = call { ptr, i64, i64 } @finch.parser.curKind(ptr %t296) + store i64 -1, ptr %a298 + %t299 = load i64, ptr %t295 + %t300 = load ptr, ptr %a294 + store i64 0, ptr %a301 + br label %find.cond1481 +find.cond1481: + %t302 = load i64, ptr %a301 + %t303 = icmp slt i64 %t302, %t299 + br i1 %t303, label %find.body1482, label %find.end1485 +find.body1482: + %t304 = getelementptr inbounds { ptr, i64, i64 }, ptr %t300, i64 %t302 + %t305 = load { ptr, i64, i64 }, ptr %t304 + store { ptr, i64, i64 } %t305, ptr %a306 + store { ptr, i64, i64 } %t297, ptr %a307 + %t308 = call i32 @finch_str_eq(ptr %a306, ptr %a307) + %t309 = icmp ne i32 %t308, 0 + br i1 %t309, label %find.hit1483, label %find.next1484 +find.hit1483: + store i64 %t302, ptr %a298 + br label %find.end1485 +find.next1484: + %t310 = add i64 %t302, 1 + store i64 %t310, ptr %a301 + br label %find.cond1481 +find.end1485: + %t311 = load i64, ptr %a298 + %t312 = icmp sge i64 %t311, 0 + br label %logic.from1486 +logic.from1486: + br i1 %t312, label %logic.rhs1487, label %logic.end1488 +logic.rhs1487: + %t313 = load ptr, ptr %a1 + %t314 = call i1 @finch.parser.sameLine(ptr %t313) + br label %logic.rend1489 +logic.rend1489: + br label %logic.end1488 +logic.end1488: + %t315 = phi i1 [ false, %logic.from1486 ], [ %t314, %logic.rend1489 ] + br i1 %t315, label %then1490, label %endif1492 +then1490: + %t316 = getelementptr inbounds %S.ast.Node, ptr %a282, i32 0, i32 0 + %t317 = load { ptr, i64, i64 }, ptr %t316 + store { ptr, i64, i64 } %t317, ptr %a318 + store { ptr, i64, i64 } { ptr @.str.887, i64 3, i64 0 }, ptr %a319 + %t320 = call i32 @finch_str_eq(ptr %a318, ptr %a319) + %t321 = icmp eq i32 %t320, 0 + br label %logic.from1493 +logic.from1493: + br i1 %t321, label %logic.rhs1494, label %logic.end1495 +logic.rhs1494: + %t322 = getelementptr inbounds %S.ast.Node, ptr %a282, i32 0, i32 0 + %t323 = load { ptr, i64, i64 }, ptr %t322 + store { ptr, i64, i64 } %t323, ptr %a324 + store { ptr, i64, i64 } { ptr @.str.888, i64 6, i64 0 }, ptr %a325 + %t326 = call i32 @finch_str_eq(ptr %a324, ptr %a325) + %t327 = icmp eq i32 %t326, 0 + br label %logic.rend1496 +logic.rend1496: + br label %logic.end1495 +logic.end1495: + %t328 = phi i1 [ false, %logic.from1493 ], [ %t327, %logic.rend1496 ] + br label %logic.from1497 +logic.from1497: + br i1 %t328, label %logic.rhs1498, label %logic.end1499 +logic.rhs1498: + %t329 = getelementptr inbounds %S.ast.Node, ptr %a282, i32 0, i32 0 + %t330 = load { ptr, i64, i64 }, ptr %t329 + store { ptr, i64, i64 } %t330, ptr %a331 + store { ptr, i64, i64 } { ptr @.str.889, i64 5, i64 0 }, ptr %a332 + %t333 = call i32 @finch_str_eq(ptr %a331, ptr %a332) + %t334 = icmp eq i32 %t333, 0 + br label %logic.rend1500 +logic.rend1500: + br label %logic.end1499 +logic.end1499: + %t335 = phi i1 [ false, %logic.from1497 ], [ %t334, %logic.rend1500 ] + br i1 %t335, label %then1501, label %endif1503 +then1501: + %t336 = load ptr, ptr %a1 + %t337 = load %S.lexer.Token, ptr %a279 + call void @finch.parser.fail(ptr %t336, %S.lexer.Token %t337, { ptr, i64, i64 } { ptr @.str.890, i64 66, i64 0 }) + br label %endif1503 +endif1503: + %t338 = insertvalue %S.ast.Node zeroinitializer, { ptr, i64, i64 } { ptr @.str.891, i64 6, i64 0 }, 0 + %t339 = getelementptr inbounds %S.lexer.Token, ptr %a279, i32 0, i32 2 + %t340 = load i64, ptr %t339 + %t341 = insertvalue %S.ast.Node %t338, i64 %t340, 11 + %t342 = getelementptr inbounds %S.lexer.Token, ptr %a279, i32 0, i32 3 + %t343 = load i64, ptr %t342 + %t344 = insertvalue %S.ast.Node %t341, i64 %t343, 12 + %t345 = load ptr, ptr %a1 + %t346 = icmp eq ptr %t345, null + br i1 %t346, label %panic1504, label %ok1505 +panic1504: + call void @finch_panic(ptr @.str.892, i64 534, ptr @.str.893) + unreachable +ok1505: + %t347 = getelementptr inbounds %S.parser.Parser, ptr %t345, i32 0, i32 3 + %t348 = load i64, ptr %t347 + %t349 = insertvalue %S.ast.Node %t344, i64 %t348, 13 + store %S.ast.Node %t349, ptr %a350 + %t351 = load ptr, ptr %a1 + %t352 = call %S.lexer.Token @finch.parser.next(ptr %t351) + %t353 = extractvalue %S.lexer.Token %t352, 0 + store { ptr, i64, i64 } %t353, ptr %a354 + call void @finch_str_copy(ptr %a355, ptr %a354) + %t356 = load { ptr, i64, i64 }, ptr %a355 + %t357 = getelementptr inbounds %S.ast.Node, ptr %a350, i32 0, i32 1 + store { ptr, i64, i64 } %t356, ptr %t357 + %t358 = getelementptr inbounds %S.ast.Node, ptr %a350, i32 0, i32 9 + %t359 = getelementptr inbounds { ptr, i64, i64 }, ptr %t358, i32 0, i32 1 + %t360 = load %S.ast.Node, ptr %a282 + store %S.ast.Node %t360, ptr %a361 + call void @finch.copy.S_ast_Node(ptr %a362, ptr %a361) + %t363 = load %S.ast.Node, ptr %a362 + %t364 = load i64, ptr %t359 + %t365 = add i64 %t364, 1 + call void @finch_arr_reserve(ptr %t358, i64 %t365, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t366 = load ptr, ptr %t358 + %t367 = getelementptr inbounds %S.ast.Node, ptr %t366, i64 %t364 + store %S.ast.Node %t363, ptr %t367 + store i64 %t365, ptr %t359 + %t368 = getelementptr inbounds %S.ast.Node, ptr %a350, i32 0, i32 9 + %t369 = getelementptr inbounds { ptr, i64, i64 }, ptr %t368, i32 0, i32 1 + %t370 = load ptr, ptr %a1 + %t371 = call %S.ast.Node @finch.parser.parseExpr(ptr %t370) + %t372 = load i64, ptr %t369 + %t373 = add i64 %t372, 1 + call void @finch_arr_reserve(ptr %t368, i64 %t373, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t374 = load ptr, ptr %t368 + %t375 = getelementptr inbounds %S.ast.Node, ptr %t374, i64 %t372 + store %S.ast.Node %t371, ptr %t375 + store i64 %t373, ptr %t369 + %t376 = load %S.ast.Node, ptr %a350 + ret %S.ast.Node %t376 +endif1492: + %t377 = getelementptr inbounds %S.ast.Node, ptr %a282, i32 0, i32 0 + %t378 = load { ptr, i64, i64 }, ptr %t377 + store { ptr, i64, i64 } %t378, ptr %a379 + store { ptr, i64, i64 } { ptr @.str.894, i64 4, i64 0 }, ptr %a380 + %t381 = call i32 @finch_str_eq(ptr %a379, ptr %a380) + %t382 = icmp eq i32 %t381, 0 + br label %logic.from1506 +logic.from1506: + br i1 %t382, label %logic.rhs1507, label %logic.end1508 +logic.rhs1507: + %t383 = getelementptr inbounds %S.ast.Node, ptr %a282, i32 0, i32 0 + %t384 = load { ptr, i64, i64 }, ptr %t383 + store { ptr, i64, i64 } %t384, ptr %a385 + store { ptr, i64, i64 } { ptr @.str.895, i64 6, i64 0 }, ptr %a386 + %t387 = call i32 @finch_str_eq(ptr %a385, ptr %a386) + %t388 = icmp eq i32 %t387, 0 + br label %logic.rend1509 +logic.rend1509: + br label %logic.end1508 +logic.end1508: + %t389 = phi i1 [ false, %logic.from1506 ], [ %t388, %logic.rend1509 ] + br label %logic.from1510 +logic.from1510: + br i1 %t389, label %logic.rhs1511, label %logic.end1512 +logic.rhs1511: + %t390 = getelementptr inbounds %S.ast.Node, ptr %a282, i32 0, i32 0 + %t391 = load { ptr, i64, i64 }, ptr %t390 + store { ptr, i64, i64 } %t391, ptr %a392 + store { ptr, i64, i64 } { ptr @.str.896, i64 3, i64 0 }, ptr %a393 + %t394 = call i32 @finch_str_eq(ptr %a392, ptr %a393) + %t395 = icmp eq i32 %t394, 0 + br label %logic.rend1513 +logic.rend1513: + br label %logic.end1512 +logic.end1512: + %t396 = phi i1 [ false, %logic.from1510 ], [ %t395, %logic.rend1513 ] + br label %logic.from1514 +logic.from1514: + br i1 %t396, label %logic.rhs1515, label %logic.end1516 +logic.rhs1515: + %t397 = getelementptr inbounds %S.ast.Node, ptr %a282, i32 0, i32 0 + %t398 = load { ptr, i64, i64 }, ptr %t397 + store { ptr, i64, i64 } %t398, ptr %a399 + store { ptr, i64, i64 } { ptr @.str.897, i64 2, i64 0 }, ptr %a400 + %t401 = call i32 @finch_str_eq(ptr %a399, ptr %a400) + %t402 = icmp eq i32 %t401, 0 + br label %logic.rend1517 +logic.rend1517: + br label %logic.end1516 +logic.end1516: + %t403 = phi i1 [ false, %logic.from1514 ], [ %t402, %logic.rend1517 ] + br i1 %t403, label %then1518, label %endif1520 +then1518: + %t404 = load ptr, ptr %a1 + %t405 = load %S.lexer.Token, ptr %a279 + call void @finch.parser.fail(ptr %t404, %S.lexer.Token %t405, { ptr, i64, i64 } { ptr @.str.898, i64 37, i64 0 }) + br label %endif1520 +endif1520: + %t406 = insertvalue %S.ast.Node zeroinitializer, { ptr, i64, i64 } { ptr @.str.899, i64 4, i64 0 }, 0 + %t407 = getelementptr inbounds %S.lexer.Token, ptr %a279, i32 0, i32 2 + %t408 = load i64, ptr %t407 + %t409 = insertvalue %S.ast.Node %t406, i64 %t408, 11 + %t410 = getelementptr inbounds %S.lexer.Token, ptr %a279, i32 0, i32 3 + %t411 = load i64, ptr %t410 + %t412 = insertvalue %S.ast.Node %t409, i64 %t411, 12 + %t413 = load ptr, ptr %a1 + %t414 = icmp eq ptr %t413, null + br i1 %t414, label %panic1521, label %ok1522 +panic1521: + call void @finch_panic(ptr @.str.900, i64 543, ptr @.str.901) + unreachable +ok1522: + %t415 = getelementptr inbounds %S.parser.Parser, ptr %t413, i32 0, i32 3 + %t416 = load i64, ptr %t415 + %t417 = insertvalue %S.ast.Node %t412, i64 %t416, 13 + store %S.ast.Node %t417, ptr %a418 + %t419 = getelementptr inbounds %S.ast.Node, ptr %a418, i32 0, i32 9 + %t420 = getelementptr inbounds { ptr, i64, i64 }, ptr %t419, i32 0, i32 1 + %t421 = load %S.ast.Node, ptr %a282 + store %S.ast.Node %t421, ptr %a422 + call void @finch.copy.S_ast_Node(ptr %a423, ptr %a422) + %t424 = load %S.ast.Node, ptr %a423 + %t425 = load i64, ptr %t420 + %t426 = add i64 %t425, 1 + call void @finch_arr_reserve(ptr %t419, i64 %t426, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t427 = load ptr, ptr %t419 + %t428 = getelementptr inbounds %S.ast.Node, ptr %t427, i64 %t425 + store %S.ast.Node %t424, ptr %t428 + store i64 %t426, ptr %t420 + %t429 = load %S.ast.Node, ptr %a418 + store %S.ast.Node %t429, ptr %a430 + call void @finch.copy.S_ast_Node(ptr %a431, ptr %a430) + %t432 = load %S.ast.Node, ptr %a431 + ret %S.ast.Node %t432 +} + +define internal %S.ast.Node @finch.parser.parseIf(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a44 = alloca %S.ast.Node, align 16 + %a45 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.ast.Node @finch.parser.node(ptr %t2, { ptr, i64, i64 } { ptr @.str.902, i64 2, i64 0 }) + store %S.ast.Node %t3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call %S.lexer.Token @finch.parser.expect(ptr %t5, { ptr, i64, i64 } { ptr @.str.903, i64 2, i64 0 }, { ptr, i64, i64 } { ptr @.str.904, i64 4, i64 0 }) + %t7 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t7, i32 0, i32 1 + %t9 = load ptr, ptr %a1 + %t10 = call %S.ast.Node @finch.parser.parseExpr(ptr %t9) + %t11 = load i64, ptr %t8 + %t12 = add i64 %t11, 1 + call void @finch_arr_reserve(ptr %t7, i64 %t12, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t13 = load ptr, ptr %t7 + %t14 = getelementptr inbounds %S.ast.Node, ptr %t13, i64 %t11 + store %S.ast.Node %t10, ptr %t14 + store i64 %t12, ptr %t8 + %t15 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t15, i32 0, i32 1 + %t17 = load ptr, ptr %a1 + %t18 = call %S.ast.Node @finch.parser.parseBlock(ptr %t17) + %t19 = load i64, ptr %t16 + %t20 = add i64 %t19, 1 + call void @finch_arr_reserve(ptr %t15, i64 %t20, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t21 = load ptr, ptr %t15 + %t22 = getelementptr inbounds %S.ast.Node, ptr %t21, i64 %t19 + store %S.ast.Node %t18, ptr %t22 + store i64 %t20, ptr %t16 + %t23 = load ptr, ptr %a1 + %t24 = call i1 @finch.parser.accept(ptr %t23, { ptr, i64, i64 } { ptr @.str.905, i64 4, i64 0 }) + br i1 %t24, label %then1523, label %endif1525 +then1523: + %t25 = load ptr, ptr %a1 + %t26 = call i1 @finch.parser.at(ptr %t25, { ptr, i64, i64 } { ptr @.str.906, i64 2, i64 0 }) + br i1 %t26, label %then1526, label %else1527 +then1526: + %t27 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t28 = getelementptr inbounds { ptr, i64, i64 }, ptr %t27, i32 0, i32 1 + %t29 = load ptr, ptr %a1 + %t30 = call %S.ast.Node @finch.parser.parseIf(ptr %t29) + %t31 = load i64, ptr %t28 + %t32 = add i64 %t31, 1 + call void @finch_arr_reserve(ptr %t27, i64 %t32, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t33 = load ptr, ptr %t27 + %t34 = getelementptr inbounds %S.ast.Node, ptr %t33, i64 %t31 + store %S.ast.Node %t30, ptr %t34 + store i64 %t32, ptr %t28 + br label %endif1528 +else1527: + %t35 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 9 + %t36 = getelementptr inbounds { ptr, i64, i64 }, ptr %t35, i32 0, i32 1 + %t37 = load ptr, ptr %a1 + %t38 = call %S.ast.Node @finch.parser.parseBlock(ptr %t37) + %t39 = load i64, ptr %t36 + %t40 = add i64 %t39, 1 + call void @finch_arr_reserve(ptr %t35, i64 %t40, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t41 = load ptr, ptr %t35 + %t42 = getelementptr inbounds %S.ast.Node, ptr %t41, i64 %t39 + store %S.ast.Node %t38, ptr %t42 + store i64 %t40, ptr %t36 + br label %endif1528 +endif1528: + br label %endif1525 +endif1525: + %t43 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t43, ptr %a44 + call void @finch.copy.S_ast_Node(ptr %a45, ptr %a44) + %t46 = load %S.ast.Node, ptr %a45 + ret %S.ast.Node %t46 +} + +define internal i64 @finch.parser.binaryLevel({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.907, i64 2, i64 0 }, ptr %a4 + %t5 = call i32 @finch_str_eq(ptr %a3, ptr %a4) + %t6 = icmp ne i32 %t5, 0 + br i1 %t6, label %then1529, label %endif1531 +then1529: + ret i64 1 +endif1531: + %t7 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.908, i64 2, i64 0 }, ptr %a9 + %t10 = call i32 @finch_str_eq(ptr %a8, ptr %a9) + %t11 = icmp ne i32 %t10, 0 + br i1 %t11, label %then1532, label %endif1534 +then1532: + ret i64 2 +endif1534: + %t12 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.909, i64 2, i64 0 }, ptr %a14 + %t15 = call i32 @finch_str_eq(ptr %a13, ptr %a14) + %t16 = icmp ne i32 %t15, 0 + br label %logic.from1535 +logic.from1535: + br i1 %t16, label %logic.end1537, label %logic.rhs1536 +logic.rhs1536: + %t17 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t17, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.910, i64 2, i64 0 }, ptr %a19 + %t20 = call i32 @finch_str_eq(ptr %a18, ptr %a19) + %t21 = icmp ne i32 %t20, 0 + br label %logic.rend1538 +logic.rend1538: + br label %logic.end1537 +logic.end1537: + %t22 = phi i1 [ true, %logic.from1535 ], [ %t21, %logic.rend1538 ] + br label %logic.from1539 +logic.from1539: + br i1 %t22, label %logic.end1541, label %logic.rhs1540 +logic.rhs1540: + %t23 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t23, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.911, i64 1, i64 0 }, ptr %a25 + %t26 = call i32 @finch_str_eq(ptr %a24, ptr %a25) + %t27 = icmp ne i32 %t26, 0 + br label %logic.rend1542 +logic.rend1542: + br label %logic.end1541 +logic.end1541: + %t28 = phi i1 [ true, %logic.from1539 ], [ %t27, %logic.rend1542 ] + br label %logic.from1543 +logic.from1543: + br i1 %t28, label %logic.end1545, label %logic.rhs1544 +logic.rhs1544: + %t29 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t29, ptr %a30 + store { ptr, i64, i64 } { ptr @.str.912, i64 2, i64 0 }, ptr %a31 + %t32 = call i32 @finch_str_eq(ptr %a30, ptr %a31) + %t33 = icmp ne i32 %t32, 0 + br label %logic.rend1546 +logic.rend1546: + br label %logic.end1545 +logic.end1545: + %t34 = phi i1 [ true, %logic.from1543 ], [ %t33, %logic.rend1546 ] + br label %logic.from1547 +logic.from1547: + br i1 %t34, label %logic.end1549, label %logic.rhs1548 +logic.rhs1548: + %t35 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t35, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.913, i64 1, i64 0 }, ptr %a37 + %t38 = call i32 @finch_str_eq(ptr %a36, ptr %a37) + %t39 = icmp ne i32 %t38, 0 + br label %logic.rend1550 +logic.rend1550: + br label %logic.end1549 +logic.end1549: + %t40 = phi i1 [ true, %logic.from1547 ], [ %t39, %logic.rend1550 ] + br label %logic.from1551 +logic.from1551: + br i1 %t40, label %logic.end1553, label %logic.rhs1552 +logic.rhs1552: + %t41 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t41, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.914, i64 2, i64 0 }, ptr %a43 + %t44 = call i32 @finch_str_eq(ptr %a42, ptr %a43) + %t45 = icmp ne i32 %t44, 0 + br label %logic.rend1554 +logic.rend1554: + br label %logic.end1553 +logic.end1553: + %t46 = phi i1 [ true, %logic.from1551 ], [ %t45, %logic.rend1554 ] + br i1 %t46, label %then1555, label %endif1557 +then1555: + ret i64 3 +endif1557: + %t47 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t47, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.915, i64 1, i64 0 }, ptr %a49 + %t50 = call i32 @finch_str_eq(ptr %a48, ptr %a49) + %t51 = icmp ne i32 %t50, 0 + br label %logic.from1558 +logic.from1558: + br i1 %t51, label %logic.end1560, label %logic.rhs1559 +logic.rhs1559: + %t52 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t52, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.916, i64 1, i64 0 }, ptr %a54 + %t55 = call i32 @finch_str_eq(ptr %a53, ptr %a54) + %t56 = icmp ne i32 %t55, 0 + br label %logic.rend1561 +logic.rend1561: + br label %logic.end1560 +logic.end1560: + %t57 = phi i1 [ true, %logic.from1558 ], [ %t56, %logic.rend1561 ] + br label %logic.from1562 +logic.from1562: + br i1 %t57, label %logic.end1564, label %logic.rhs1563 +logic.rhs1563: + %t58 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t58, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.917, i64 1, i64 0 }, ptr %a60 + %t61 = call i32 @finch_str_eq(ptr %a59, ptr %a60) + %t62 = icmp ne i32 %t61, 0 + br label %logic.rend1565 +logic.rend1565: + br label %logic.end1564 +logic.end1564: + %t63 = phi i1 [ true, %logic.from1562 ], [ %t62, %logic.rend1565 ] + br label %logic.from1566 +logic.from1566: + br i1 %t63, label %logic.end1568, label %logic.rhs1567 +logic.rhs1567: + %t64 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t64, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.918, i64 1, i64 0 }, ptr %a66 + %t67 = call i32 @finch_str_eq(ptr %a65, ptr %a66) + %t68 = icmp ne i32 %t67, 0 + br label %logic.rend1569 +logic.rend1569: + br label %logic.end1568 +logic.end1568: + %t69 = phi i1 [ true, %logic.from1566 ], [ %t68, %logic.rend1569 ] + br i1 %t69, label %then1570, label %endif1572 +then1570: + ret i64 4 +endif1572: + %t70 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t70, ptr %a71 + store { ptr, i64, i64 } { ptr @.str.919, i64 1, i64 0 }, ptr %a72 + %t73 = call i32 @finch_str_eq(ptr %a71, ptr %a72) + %t74 = icmp ne i32 %t73, 0 + br label %logic.from1573 +logic.from1573: + br i1 %t74, label %logic.end1575, label %logic.rhs1574 +logic.rhs1574: + %t75 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t75, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.920, i64 1, i64 0 }, ptr %a77 + %t78 = call i32 @finch_str_eq(ptr %a76, ptr %a77) + %t79 = icmp ne i32 %t78, 0 + br label %logic.rend1576 +logic.rend1576: + br label %logic.end1575 +logic.end1575: + %t80 = phi i1 [ true, %logic.from1573 ], [ %t79, %logic.rend1576 ] + br label %logic.from1577 +logic.from1577: + br i1 %t80, label %logic.end1579, label %logic.rhs1578 +logic.rhs1578: + %t81 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t81, ptr %a82 + store { ptr, i64, i64 } { ptr @.str.921, i64 1, i64 0 }, ptr %a83 + %t84 = call i32 @finch_str_eq(ptr %a82, ptr %a83) + %t85 = icmp ne i32 %t84, 0 + br label %logic.rend1580 +logic.rend1580: + br label %logic.end1579 +logic.end1579: + %t86 = phi i1 [ true, %logic.from1577 ], [ %t85, %logic.rend1580 ] + br label %logic.from1581 +logic.from1581: + br i1 %t86, label %logic.end1583, label %logic.rhs1582 +logic.rhs1582: + %t87 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t87, ptr %a88 + store { ptr, i64, i64 } { ptr @.str.922, i64 2, i64 0 }, ptr %a89 + %t90 = call i32 @finch_str_eq(ptr %a88, ptr %a89) + %t91 = icmp ne i32 %t90, 0 + br label %logic.rend1584 +logic.rend1584: + br label %logic.end1583 +logic.end1583: + %t92 = phi i1 [ true, %logic.from1581 ], [ %t91, %logic.rend1584 ] + br label %logic.from1585 +logic.from1585: + br i1 %t92, label %logic.end1587, label %logic.rhs1586 +logic.rhs1586: + %t93 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t93, ptr %a94 + store { ptr, i64, i64 } { ptr @.str.923, i64 2, i64 0 }, ptr %a95 + %t96 = call i32 @finch_str_eq(ptr %a94, ptr %a95) + %t97 = icmp ne i32 %t96, 0 + br label %logic.rend1588 +logic.rend1588: + br label %logic.end1587 +logic.end1587: + %t98 = phi i1 [ true, %logic.from1585 ], [ %t97, %logic.rend1588 ] + br label %logic.from1589 +logic.from1589: + br i1 %t98, label %logic.end1591, label %logic.rhs1590 +logic.rhs1590: + %t99 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t99, ptr %a100 + store { ptr, i64, i64 } { ptr @.str.924, i64 1, i64 0 }, ptr %a101 + %t102 = call i32 @finch_str_eq(ptr %a100, ptr %a101) + %t103 = icmp ne i32 %t102, 0 + br label %logic.rend1592 +logic.rend1592: + br label %logic.end1591 +logic.end1591: + %t104 = phi i1 [ true, %logic.from1589 ], [ %t103, %logic.rend1592 ] + br i1 %t104, label %then1593, label %endif1595 +then1593: + ret i64 5 +endif1595: + ret i64 0 +} + +define internal %S.ast.Node @finch.parser.parseExpr(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a13 = alloca %S.ast.Node, align 16 + %a14 = alloca %S.ast.Node, align 16 + %a18 = alloca %S.ast.Node, align 16 + %a24 = alloca %S.ast.Node, align 16 + %a25 = alloca %S.ast.Node, align 16 + %a51 = alloca %S.ast.Node, align 16 + %a52 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.ast.Node @finch.parser.parseBinary(ptr %t2, i64 1) + store %S.ast.Node %t3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call i1 @finch.parser.sameLine(ptr %t5) + %t7 = xor i1 %t6, true + br label %logic.from1596 +logic.from1596: + br i1 %t7, label %logic.end1598, label %logic.rhs1597 +logic.rhs1597: + %t8 = load ptr, ptr %a1 + %t9 = call i1 @finch.parser.at(ptr %t8, { ptr, i64, i64 } { ptr @.str.925, i64 2, i64 0 }) + %t10 = xor i1 %t9, true + br label %logic.rend1599 +logic.rend1599: + br label %logic.end1598 +logic.end1598: + %t11 = phi i1 [ true, %logic.from1596 ], [ %t10, %logic.rend1599 ] + br i1 %t11, label %then1600, label %endif1602 +then1600: + %t12 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t12, ptr %a13 + call void @finch.copy.S_ast_Node(ptr %a14, ptr %a13) + %t15 = load %S.ast.Node, ptr %a14 + ret %S.ast.Node %t15 +endif1602: + %t16 = load ptr, ptr %a1 + %t17 = call %S.ast.Node @finch.parser.node(ptr %t16, { ptr, i64, i64 } { ptr @.str.926, i64 2, i64 0 }) + store %S.ast.Node %t17, ptr %a18 + %t19 = load ptr, ptr %a1 + %t20 = call %S.lexer.Token @finch.parser.next(ptr %t19) + %t21 = getelementptr inbounds %S.ast.Node, ptr %a18, i32 0, i32 9 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t21, i32 0, i32 1 + %t23 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t23, ptr %a24 + call void @finch.copy.S_ast_Node(ptr %a25, ptr %a24) + %t26 = load %S.ast.Node, ptr %a25 + %t27 = load i64, ptr %t22 + %t28 = add i64 %t27, 1 + call void @finch_arr_reserve(ptr %t21, i64 %t28, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t29 = load ptr, ptr %t21 + %t30 = getelementptr inbounds %S.ast.Node, ptr %t29, i64 %t27 + store %S.ast.Node %t26, ptr %t30 + store i64 %t28, ptr %t22 + %t31 = load ptr, ptr %a1 + %t32 = call i1 @finch.parser.at(ptr %t31, { ptr, i64, i64 } { ptr @.str.927, i64 1, i64 0 }) + br i1 %t32, label %then1603, label %else1604 +then1603: + %t33 = getelementptr inbounds %S.ast.Node, ptr %a18, i32 0, i32 6 + store i1 true, ptr %t33 + %t34 = getelementptr inbounds %S.ast.Node, ptr %a18, i32 0, i32 9 + %t35 = getelementptr inbounds { ptr, i64, i64 }, ptr %t34, i32 0, i32 1 + %t36 = load ptr, ptr %a1 + %t37 = call %S.ast.Node @finch.parser.parseBlock(ptr %t36) + %t38 = load i64, ptr %t35 + %t39 = add i64 %t38, 1 + call void @finch_arr_reserve(ptr %t34, i64 %t39, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t40 = load ptr, ptr %t34 + %t41 = getelementptr inbounds %S.ast.Node, ptr %t40, i64 %t38 + store %S.ast.Node %t37, ptr %t41 + store i64 %t39, ptr %t35 + br label %endif1605 +else1604: + %t42 = getelementptr inbounds %S.ast.Node, ptr %a18, i32 0, i32 9 + %t43 = getelementptr inbounds { ptr, i64, i64 }, ptr %t42, i32 0, i32 1 + %t44 = load ptr, ptr %a1 + %t45 = call %S.ast.Node @finch.parser.parseExpr(ptr %t44) + %t46 = load i64, ptr %t43 + %t47 = add i64 %t46, 1 + call void @finch_arr_reserve(ptr %t42, i64 %t47, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t48 = load ptr, ptr %t42 + %t49 = getelementptr inbounds %S.ast.Node, ptr %t48, i64 %t46 + store %S.ast.Node %t45, ptr %t49 + store i64 %t47, ptr %t43 + br label %endif1605 +endif1605: + %t50 = load %S.ast.Node, ptr %a18 + store %S.ast.Node %t50, ptr %a51 + call void @finch.copy.S_ast_Node(ptr %a52, ptr %a51) + %t53 = load %S.ast.Node, ptr %a52 + ret %S.ast.Node %t53 +} + +define internal %S.ast.Node @finch.parser.parseBinary(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a11 = alloca %S.ast.Node, align 16 + %a22 = alloca %S.ast.Node, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca %S.ast.Node, align 16 + %a34 = alloca %S.ast.Node, align 16 + %a51 = alloca %S.ast.Node, align 16 + %a52 = alloca %S.ast.Node, align 16 + %a55 = alloca %S.ast.Node, align 16 + %a56 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load i64, ptr %a2 + %t4 = icmp sgt i64 %t3, 5 + br i1 %t4, label %then1606, label %endif1608 +then1606: + %t5 = load ptr, ptr %a1 + %t6 = call %S.ast.Node @finch.parser.parseUnary(ptr %t5) + ret %S.ast.Node %t6 +endif1608: + %t7 = load ptr, ptr %a1 + %t8 = load i64, ptr %a2 + %t9 = add i64 %t8, 1 + %t10 = call %S.ast.Node @finch.parser.parseBinary(ptr %t7, i64 %t9) + store %S.ast.Node %t10, ptr %a11 + br label %while.cond1609 +while.cond1609: + %t12 = load ptr, ptr %a1 + %t13 = call i1 @finch.parser.sameLine(ptr %t12) + br label %logic.from1612 +logic.from1612: + br i1 %t13, label %logic.rhs1613, label %logic.end1614 +logic.rhs1613: + %t14 = load ptr, ptr %a1 + %t15 = call { ptr, i64, i64 } @finch.parser.curKind(ptr %t14) + %t16 = call i64 @finch.parser.binaryLevel({ ptr, i64, i64 } %t15) + %t17 = load i64, ptr %a2 + %t18 = icmp eq i64 %t16, %t17 + br label %logic.rend1615 +logic.rend1615: + br label %logic.end1614 +logic.end1614: + %t19 = phi i1 [ false, %logic.from1612 ], [ %t18, %logic.rend1615 ] + br i1 %t19, label %while.body1610, label %while.end1611 +while.body1610: + %t20 = load ptr, ptr %a1 + %t21 = call %S.ast.Node @finch.parser.node(ptr %t20, { ptr, i64, i64 } { ptr @.str.928, i64 6, i64 0 }) + store %S.ast.Node %t21, ptr %a22 + %t23 = load ptr, ptr %a1 + %t24 = call %S.lexer.Token @finch.parser.next(ptr %t23) + %t25 = extractvalue %S.lexer.Token %t24, 0 + store { ptr, i64, i64 } %t25, ptr %a26 + call void @finch_str_copy(ptr %a27, ptr %a26) + %t28 = load { ptr, i64, i64 }, ptr %a27 + %t29 = getelementptr inbounds %S.ast.Node, ptr %a22, i32 0, i32 1 + store { ptr, i64, i64 } %t28, ptr %t29 + %t30 = getelementptr inbounds %S.ast.Node, ptr %a22, i32 0, i32 9 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t30, i32 0, i32 1 + %t32 = load %S.ast.Node, ptr %a11 + store %S.ast.Node %t32, ptr %a33 + call void @finch.copy.S_ast_Node(ptr %a34, ptr %a33) + %t35 = load %S.ast.Node, ptr %a34 + %t36 = load i64, ptr %t31 + %t37 = add i64 %t36, 1 + call void @finch_arr_reserve(ptr %t30, i64 %t37, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t38 = load ptr, ptr %t30 + %t39 = getelementptr inbounds %S.ast.Node, ptr %t38, i64 %t36 + store %S.ast.Node %t35, ptr %t39 + store i64 %t37, ptr %t31 + %t40 = getelementptr inbounds %S.ast.Node, ptr %a22, i32 0, i32 9 + %t41 = getelementptr inbounds { ptr, i64, i64 }, ptr %t40, i32 0, i32 1 + %t42 = load ptr, ptr %a1 + %t43 = load i64, ptr %a2 + %t44 = add i64 %t43, 1 + %t45 = call %S.ast.Node @finch.parser.parseBinary(ptr %t42, i64 %t44) + %t46 = load i64, ptr %t41 + %t47 = add i64 %t46, 1 + call void @finch_arr_reserve(ptr %t40, i64 %t47, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t48 = load ptr, ptr %t40 + %t49 = getelementptr inbounds %S.ast.Node, ptr %t48, i64 %t46 + store %S.ast.Node %t45, ptr %t49 + store i64 %t47, ptr %t41 + %t50 = load %S.ast.Node, ptr %a22 + store %S.ast.Node %t50, ptr %a51 + call void @finch.copy.S_ast_Node(ptr %a52, ptr %a51) + %t53 = load %S.ast.Node, ptr %a52 + store %S.ast.Node %t53, ptr %a11 + br label %while.cond1609 +while.end1611: + %t54 = load %S.ast.Node, ptr %a11 + store %S.ast.Node %t54, ptr %a55 + call void @finch.copy.S_ast_Node(ptr %a56, ptr %a55) + %t57 = load %S.ast.Node, ptr %a56 + ret %S.ast.Node %t57 +} + +define internal %S.ast.Node @finch.parser.parseUnary(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a6 = alloca %S.ast.Node, align 16 + %a28 = alloca %S.ast.Node, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call i1 @finch.parser.at(ptr %t2, { ptr, i64, i64 } { ptr @.str.929, i64 3, i64 0 }) + br i1 %t3, label %then1616, label %endif1618 +then1616: + %t4 = load ptr, ptr %a1 + %t5 = call %S.ast.Node @finch.parser.node(ptr %t4, { ptr, i64, i64 } { ptr @.str.930, i64 3, i64 0 }) + store %S.ast.Node %t5, ptr %a6 + %t7 = load ptr, ptr %a1 + %t8 = call %S.lexer.Token @finch.parser.next(ptr %t7) + %t9 = getelementptr inbounds %S.ast.Node, ptr %a6, i32 0, i32 9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t9, i32 0, i32 1 + %t11 = load ptr, ptr %a1 + %t12 = call %S.ast.Node @finch.parser.parsePostfix(ptr %t11) + %t13 = load i64, ptr %t10 + %t14 = add i64 %t13, 1 + call void @finch_arr_reserve(ptr %t9, i64 %t14, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t15 = load ptr, ptr %t9 + %t16 = getelementptr inbounds %S.ast.Node, ptr %t15, i64 %t13 + store %S.ast.Node %t12, ptr %t16 + store i64 %t14, ptr %t10 + %t17 = load %S.ast.Node, ptr %a6 + ret %S.ast.Node %t17 +endif1618: + %t18 = load ptr, ptr %a1 + %t19 = call i1 @finch.parser.at(ptr %t18, { ptr, i64, i64 } { ptr @.str.931, i64 1, i64 0 }) + br label %logic.from1619 +logic.from1619: + br i1 %t19, label %logic.end1621, label %logic.rhs1620 +logic.rhs1620: + %t20 = load ptr, ptr %a1 + %t21 = call i1 @finch.parser.at(ptr %t20, { ptr, i64, i64 } { ptr @.str.932, i64 1, i64 0 }) + br label %logic.rend1622 +logic.rend1622: + br label %logic.end1621 +logic.end1621: + %t22 = phi i1 [ true, %logic.from1619 ], [ %t21, %logic.rend1622 ] + br label %logic.from1623 +logic.from1623: + br i1 %t22, label %logic.end1625, label %logic.rhs1624 +logic.rhs1624: + %t23 = load ptr, ptr %a1 + %t24 = call i1 @finch.parser.at(ptr %t23, { ptr, i64, i64 } { ptr @.str.933, i64 1, i64 0 }) + br label %logic.rend1626 +logic.rend1626: + br label %logic.end1625 +logic.end1625: + %t25 = phi i1 [ true, %logic.from1623 ], [ %t24, %logic.rend1626 ] + br i1 %t25, label %then1627, label %endif1629 +then1627: + %t26 = load ptr, ptr %a1 + %t27 = call %S.ast.Node @finch.parser.node(ptr %t26, { ptr, i64, i64 } { ptr @.str.934, i64 5, i64 0 }) + store %S.ast.Node %t27, ptr %a28 + %t29 = load ptr, ptr %a1 + %t30 = call %S.lexer.Token @finch.parser.next(ptr %t29) + %t31 = extractvalue %S.lexer.Token %t30, 0 + store { ptr, i64, i64 } %t31, ptr %a32 + call void @finch_str_copy(ptr %a33, ptr %a32) + %t34 = load { ptr, i64, i64 }, ptr %a33 + %t35 = getelementptr inbounds %S.ast.Node, ptr %a28, i32 0, i32 1 + store { ptr, i64, i64 } %t34, ptr %t35 + %t36 = getelementptr inbounds %S.ast.Node, ptr %a28, i32 0, i32 9 + %t37 = getelementptr inbounds { ptr, i64, i64 }, ptr %t36, i32 0, i32 1 + %t38 = load ptr, ptr %a1 + %t39 = call %S.ast.Node @finch.parser.parseUnary(ptr %t38) + %t40 = load i64, ptr %t37 + %t41 = add i64 %t40, 1 + call void @finch_arr_reserve(ptr %t36, i64 %t41, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t42 = load ptr, ptr %t36 + %t43 = getelementptr inbounds %S.ast.Node, ptr %t42, i64 %t40 + store %S.ast.Node %t39, ptr %t43 + store i64 %t41, ptr %t37 + %t44 = load %S.ast.Node, ptr %a28 + ret %S.ast.Node %t44 +endif1629: + %t45 = load ptr, ptr %a1 + %t46 = call %S.ast.Node @finch.parser.parsePostfix(ptr %t45) + ret %S.ast.Node %t46 +} + +define internal void @finch.parser.parseArgs(ptr %p0, ptr %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca ptr, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store ptr %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = call %S.lexer.Token @finch.parser.expect(ptr %t3, { ptr, i64, i64 } { ptr @.str.935, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.936, i64 3, i64 0 }) + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic1630, label %ok1631 +panic1630: + call void @finch_panic(ptr @.str.937, i64 636, ptr @.str.938) + unreachable +ok1631: + %t7 = getelementptr inbounds %S.parser.Parser, ptr %t5, i32 0, i32 2 + %t8 = load i64, ptr %t7 + %t9 = add i64 %t8, 1 + store i64 %t9, ptr %t7 + %t10 = load ptr, ptr %a1 + %t11 = call i1 @finch.parser.at(ptr %t10, { ptr, i64, i64 } { ptr @.str.939, i64 1, i64 0 }) + %t12 = xor i1 %t11, true + br i1 %t12, label %then1632, label %endif1634 +then1632: + br label %while.cond1635 +while.cond1635: + %t13 = load ptr, ptr %a1 + %t14 = call i1 @finch.parser.at(ptr %t13, { ptr, i64, i64 } { ptr @.str.940, i64 1, i64 0 }) + %t15 = xor i1 %t14, true + br i1 %t15, label %while.body1636, label %while.end1637 +while.body1636: + store { ptr, i64, i64 } { ptr @.str.941, i64 0, i64 0 }, ptr %a16 + %t17 = load ptr, ptr %a1 + %t18 = call i1 @finch.parser.at(ptr %t17, { ptr, i64, i64 } { ptr @.str.942, i64 5, i64 0 }) + br label %logic.from1638 +logic.from1638: + br i1 %t18, label %logic.rhs1639, label %logic.end1640 +logic.rhs1639: + %t19 = load ptr, ptr %a1 + %t20 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t19, i64 1) + store { ptr, i64, i64 } %t20, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.943, i64 1, i64 0 }, ptr %a22 + %t23 = call i32 @finch_str_eq(ptr %a21, ptr %a22) + %t24 = icmp ne i32 %t23, 0 + br label %logic.rend1641 +logic.rend1641: + br label %logic.end1640 +logic.end1640: + %t25 = phi i1 [ false, %logic.from1638 ], [ %t24, %logic.rend1641 ] + br i1 %t25, label %then1642, label %endif1644 +then1642: + %t26 = load ptr, ptr %a1 + %t27 = call %S.lexer.Token @finch.parser.next(ptr %t26) + %t28 = extractvalue %S.lexer.Token %t27, 1 + store { ptr, i64, i64 } %t28, ptr %a29 + call void @finch_str_copy(ptr %a30, ptr %a29) + %t31 = load { ptr, i64, i64 }, ptr %a30 + store { ptr, i64, i64 } %t31, ptr %a16 + %t32 = load ptr, ptr %a1 + %t33 = call %S.lexer.Token @finch.parser.next(ptr %t32) + br label %endif1644 +endif1644: + %t34 = load ptr, ptr %a2 + %t35 = icmp eq ptr %t34, null + br i1 %t35, label %panic1645, label %ok1646 +panic1645: + call void @finch_panic(ptr @.str.944, i64 644, ptr @.str.945) + unreachable +ok1646: + %t36 = getelementptr inbounds %S.ast.Node, ptr %t34, i32 0, i32 10 + %t37 = getelementptr inbounds { ptr, i64, i64 }, ptr %t36, i32 0, i32 1 + %t38 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t38, ptr %a39 + call void @finch_str_copy(ptr %a40, ptr %a39) + %t41 = load { ptr, i64, i64 }, ptr %a40 + %t42 = load i64, ptr %t37 + %t43 = add i64 %t42, 1 + call void @finch_arr_reserve(ptr %t36, i64 %t43, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t44 = load ptr, ptr %t36 + %t45 = getelementptr inbounds { ptr, i64, i64 }, ptr %t44, i64 %t42 + store { ptr, i64, i64 } %t41, ptr %t45 + store i64 %t43, ptr %t37 + %t46 = load ptr, ptr %a2 + %t47 = icmp eq ptr %t46, null + br i1 %t47, label %panic1647, label %ok1648 +panic1647: + call void @finch_panic(ptr @.str.946, i64 645, ptr @.str.947) + unreachable +ok1648: + %t48 = getelementptr inbounds %S.ast.Node, ptr %t46, i32 0, i32 9 + %t49 = getelementptr inbounds { ptr, i64, i64 }, ptr %t48, i32 0, i32 1 + %t50 = load ptr, ptr %a1 + %t51 = call %S.ast.Node @finch.parser.parseExpr(ptr %t50) + %t52 = load i64, ptr %t49 + %t53 = add i64 %t52, 1 + call void @finch_arr_reserve(ptr %t48, i64 %t53, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t54 = load ptr, ptr %t48 + %t55 = getelementptr inbounds %S.ast.Node, ptr %t54, i64 %t52 + store %S.ast.Node %t51, ptr %t55 + store i64 %t53, ptr %t49 + %t56 = load ptr, ptr %a1 + %t57 = call i1 @finch.parser.accept(ptr %t56, { ptr, i64, i64 } { ptr @.str.948, i64 1, i64 0 }) + %t58 = xor i1 %t57, true + br i1 %t58, label %then1649, label %endif1651 +then1649: + br label %while.end1637 +endif1651: + br label %while.cond1635 +while.end1637: + br label %endif1634 +endif1634: + %t59 = load ptr, ptr %a1 + %t60 = icmp eq ptr %t59, null + br i1 %t60, label %panic1652, label %ok1653 +panic1652: + call void @finch_panic(ptr @.str.949, i64 651, ptr @.str.950) + unreachable +ok1653: + %t61 = getelementptr inbounds %S.parser.Parser, ptr %t59, i32 0, i32 2 + %t62 = load i64, ptr %t61 + %t63 = sub i64 %t62, 1 + store i64 %t63, ptr %t61 + %t64 = load ptr, ptr %a1 + %t65 = call %S.lexer.Token @finch.parser.expect(ptr %t64, { ptr, i64, i64 } { ptr @.str.951, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.952, i64 3, i64 0 }) + ret void +} + +define internal %S.ast.Node @finch.parser.parsePostfix(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a11 = alloca %S.ast.Node, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca %S.ast.Node, align 16 + %a25 = alloca %S.ast.Node, align 16 + %a41 = alloca %S.ast.Node, align 16 + %a42 = alloca %S.ast.Node, align 16 + %a48 = alloca %S.ast.Node, align 16 + %a59 = alloca %S.ast.Node, align 16 + %a60 = alloca %S.ast.Node, align 16 + %a82 = alloca %S.ast.Node, align 16 + %a83 = alloca %S.ast.Node, align 16 + %a86 = alloca %S.ast.Node, align 16 + %a87 = alloca %S.ast.Node, align 16 + %a90 = alloca %S.ast.Node, align 16 + %a91 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.ast.Node @finch.parser.parsePrimary(ptr %t2) + store %S.ast.Node %t3, ptr %a4 + br label %while.cond1654 +while.cond1654: + %t5 = load ptr, ptr %a1 + %t6 = call i1 @finch.parser.sameLine(ptr %t5) + br i1 %t6, label %while.body1655, label %while.end1656 +while.body1655: + %t7 = load ptr, ptr %a1 + %t8 = call i1 @finch.parser.at(ptr %t7, { ptr, i64, i64 } { ptr @.str.953, i64 1, i64 0 }) + br i1 %t8, label %then1657, label %else1658 +then1657: + %t9 = load ptr, ptr %a1 + %t10 = call %S.ast.Node @finch.parser.node(ptr %t9, { ptr, i64, i64 } { ptr @.str.954, i64 6, i64 0 }) + store %S.ast.Node %t10, ptr %a11 + %t12 = load ptr, ptr %a1 + %t13 = call %S.lexer.Token @finch.parser.next(ptr %t12) + %t14 = load ptr, ptr %a1 + %t15 = call %S.lexer.Token @finch.parser.expect(ptr %t14, { ptr, i64, i64 } { ptr @.str.955, i64 5, i64 0 }, { ptr, i64, i64 } { ptr @.str.956, i64 16, i64 0 }) + %t16 = extractvalue %S.lexer.Token %t15, 1 + store { ptr, i64, i64 } %t16, ptr %a17 + call void @finch_str_copy(ptr %a18, ptr %a17) + %t19 = load { ptr, i64, i64 }, ptr %a18 + %t20 = getelementptr inbounds %S.ast.Node, ptr %a11, i32 0, i32 1 + store { ptr, i64, i64 } %t19, ptr %t20 + %t21 = getelementptr inbounds %S.ast.Node, ptr %a11, i32 0, i32 9 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t21, i32 0, i32 1 + %t23 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t23, ptr %a24 + call void @finch.copy.S_ast_Node(ptr %a25, ptr %a24) + %t26 = load %S.ast.Node, ptr %a25 + %t27 = load i64, ptr %t22 + %t28 = add i64 %t27, 1 + call void @finch_arr_reserve(ptr %t21, i64 %t28, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t29 = load ptr, ptr %t21 + %t30 = getelementptr inbounds %S.ast.Node, ptr %t29, i64 %t27 + store %S.ast.Node %t26, ptr %t30 + store i64 %t28, ptr %t22 + %t31 = load ptr, ptr %a1 + %t32 = call i1 @finch.parser.at(ptr %t31, { ptr, i64, i64 } { ptr @.str.957, i64 1, i64 0 }) + br label %logic.from1660 +logic.from1660: + br i1 %t32, label %logic.rhs1661, label %logic.end1662 +logic.rhs1661: + %t33 = load ptr, ptr %a1 + %t34 = call %S.lexer.Token @finch.parser.cur(ptr %t33) + %t35 = extractvalue %S.lexer.Token %t34, 4 + %t36 = xor i1 %t35, true + br label %logic.rend1663 +logic.rend1663: + br label %logic.end1662 +logic.end1662: + %t37 = phi i1 [ false, %logic.from1660 ], [ %t36, %logic.rend1663 ] + br i1 %t37, label %then1664, label %endif1666 +then1664: + %t38 = getelementptr inbounds %S.ast.Node, ptr %a11, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.958, i64 6, i64 0 }, ptr %t38 + %t39 = load ptr, ptr %a1 + call void @finch.parser.parseArgs(ptr %t39, ptr %a11) + br label %endif1666 +endif1666: + %t40 = load %S.ast.Node, ptr %a11 + store %S.ast.Node %t40, ptr %a41 + call void @finch.copy.S_ast_Node(ptr %a42, ptr %a41) + %t43 = load %S.ast.Node, ptr %a42 + store %S.ast.Node %t43, ptr %a4 + br label %endif1659 +else1658: + %t44 = load ptr, ptr %a1 + %t45 = call i1 @finch.parser.at(ptr %t44, { ptr, i64, i64 } { ptr @.str.959, i64 1, i64 0 }) + br i1 %t45, label %then1667, label %else1668 +then1667: + %t46 = load ptr, ptr %a1 + %t47 = call %S.ast.Node @finch.parser.node(ptr %t46, { ptr, i64, i64 } { ptr @.str.960, i64 5, i64 0 }) + store %S.ast.Node %t47, ptr %a48 + %t49 = load ptr, ptr %a1 + %t50 = call %S.lexer.Token @finch.parser.next(ptr %t49) + %t51 = load ptr, ptr %a1 + %t52 = icmp eq ptr %t51, null + br i1 %t52, label %panic1670, label %ok1671 +panic1670: + call void @finch_panic(ptr @.str.961, i64 671, ptr @.str.962) + unreachable +ok1671: + %t53 = getelementptr inbounds %S.parser.Parser, ptr %t51, i32 0, i32 2 + %t54 = load i64, ptr %t53 + %t55 = add i64 %t54, 1 + store i64 %t55, ptr %t53 + %t56 = getelementptr inbounds %S.ast.Node, ptr %a48, i32 0, i32 9 + %t57 = getelementptr inbounds { ptr, i64, i64 }, ptr %t56, i32 0, i32 1 + %t58 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t58, ptr %a59 + call void @finch.copy.S_ast_Node(ptr %a60, ptr %a59) + %t61 = load %S.ast.Node, ptr %a60 + %t62 = load i64, ptr %t57 + %t63 = add i64 %t62, 1 + call void @finch_arr_reserve(ptr %t56, i64 %t63, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t64 = load ptr, ptr %t56 + %t65 = getelementptr inbounds %S.ast.Node, ptr %t64, i64 %t62 + store %S.ast.Node %t61, ptr %t65 + store i64 %t63, ptr %t57 + %t66 = getelementptr inbounds %S.ast.Node, ptr %a48, i32 0, i32 9 + %t67 = getelementptr inbounds { ptr, i64, i64 }, ptr %t66, i32 0, i32 1 + %t68 = load ptr, ptr %a1 + %t69 = call %S.ast.Node @finch.parser.parseExpr(ptr %t68) + %t70 = load i64, ptr %t67 + %t71 = add i64 %t70, 1 + call void @finch_arr_reserve(ptr %t66, i64 %t71, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t72 = load ptr, ptr %t66 + %t73 = getelementptr inbounds %S.ast.Node, ptr %t72, i64 %t70 + store %S.ast.Node %t69, ptr %t73 + store i64 %t71, ptr %t67 + %t74 = load ptr, ptr %a1 + %t75 = icmp eq ptr %t74, null + br i1 %t75, label %panic1672, label %ok1673 +panic1672: + call void @finch_panic(ptr @.str.963, i64 674, ptr @.str.964) + unreachable +ok1673: + %t76 = getelementptr inbounds %S.parser.Parser, ptr %t74, i32 0, i32 2 + %t77 = load i64, ptr %t76 + %t78 = sub i64 %t77, 1 + store i64 %t78, ptr %t76 + %t79 = load ptr, ptr %a1 + %t80 = call %S.lexer.Token @finch.parser.expect(ptr %t79, { ptr, i64, i64 } { ptr @.str.965, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.966, i64 3, i64 0 }) + %t81 = load %S.ast.Node, ptr %a48 + store %S.ast.Node %t81, ptr %a82 + call void @finch.copy.S_ast_Node(ptr %a83, ptr %a82) + %t84 = load %S.ast.Node, ptr %a83 + store %S.ast.Node %t84, ptr %a4 + br label %endif1669 +else1668: + %t85 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t85, ptr %a86 + call void @finch.copy.S_ast_Node(ptr %a87, ptr %a86) + %t88 = load %S.ast.Node, ptr %a87 + ret %S.ast.Node %t88 +endif1669: + br label %endif1659 +endif1659: + br label %while.cond1654 +while.end1656: + %t89 = load %S.ast.Node, ptr %a4 + store %S.ast.Node %t89, ptr %a90 + call void @finch.copy.S_ast_Node(ptr %a91, ptr %a90) + %t92 = load %S.ast.Node, ptr %a91 + ret %S.ast.Node %t92 +} + +define internal %S.ast.Node @finch.parser.parsePrimary(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a4 = alloca %S.lexer.Token, align 16 + %a7 = alloca %S.ast.Node, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca %S.ast.Node, align 16 + %a46 = alloca %S.ast.Node, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca %S.ast.Node, align 16 + %a64 = alloca %S.ast.Node, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca %S.ast.Node, align 16 + %a87 = alloca %S.ast.Node, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca %S.ast.Node, align 16 + %a99 = alloca %S.ast.Node, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca %S.ast.Node, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca %S.ast.Node, align 16 + %a203 = alloca %S.ast.Node, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca %S.ast.Node, align 16 + %a265 = alloca %S.ast.Node, align 16 + %a277 = alloca %S.ast.Node, align 16 + %a278 = alloca %S.ast.Node, align 16 + %a282 = alloca %S.ast.Node, align 16 + %a283 = alloca %S.ast.Node, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca %S.ast.Node, align 16 + %a299 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call %S.lexer.Token @finch.parser.cur(ptr %t2) + store %S.lexer.Token %t3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call %S.ast.Node @finch.parser.node(ptr %t5, { ptr, i64, i64 } { ptr @.str.967, i64 0, i64 0 }) + store %S.ast.Node %t6, ptr %a7 + %t8 = getelementptr inbounds %S.lexer.Token, ptr %a4, i32 0, i32 0 + %t9 = load { ptr, i64, i64 }, ptr %t8 + store { ptr, i64, i64 } %t9, ptr %a10 + call void @finch_str_copy(ptr %a11, ptr %a10) + %t12 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t12, ptr %a13 + %t14 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.968, i64 3, i64 0 }, ptr %a16 + %t17 = call i32 @finch_str_eq(ptr %a15, ptr %a16) + %t18 = icmp ne i32 %t17, 0 + br label %logic.from1674 +logic.from1674: + br i1 %t18, label %logic.end1676, label %logic.rhs1675 +logic.rhs1675: + %t19 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.969, i64 5, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br label %logic.rend1677 +logic.rend1677: + br label %logic.end1676 +logic.end1676: + %t24 = phi i1 [ true, %logic.from1674 ], [ %t23, %logic.rend1677 ] + br label %logic.from1678 +logic.from1678: + br i1 %t24, label %logic.end1680, label %logic.rhs1679 +logic.rhs1679: + %t25 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t25, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.970, i64 4, i64 0 }, ptr %a27 + %t28 = call i32 @finch_str_eq(ptr %a26, ptr %a27) + %t29 = icmp ne i32 %t28, 0 + br label %logic.rend1681 +logic.rend1681: + br label %logic.end1680 +logic.end1680: + %t30 = phi i1 [ true, %logic.from1678 ], [ %t29, %logic.rend1681 ] + br i1 %t30, label %then1682, label %endif1684 +then1682: + %t31 = load ptr, ptr %a1 + %t32 = call %S.lexer.Token @finch.parser.next(ptr %t31) + %t33 = load { ptr, i64, i64 }, ptr %a13 + %t34 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } %t33, ptr %a35 + call void @finch_str_copy(ptr %a36, ptr %a35) + %t37 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t37, ptr %t34 + %t38 = getelementptr inbounds %S.lexer.Token, ptr %a4, i32 0, i32 1 + %t39 = load { ptr, i64, i64 }, ptr %t38 + %t40 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 4 + store { ptr, i64, i64 } %t39, ptr %a41 + call void @finch_str_copy(ptr %a42, ptr %a41) + %t43 = load { ptr, i64, i64 }, ptr %a42 + store { ptr, i64, i64 } %t43, ptr %t40 + %t44 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t44, ptr %a45 + call void @finch.copy.S_ast_Node(ptr %a46, ptr %a45) + %t47 = load %S.ast.Node, ptr %a46 + ret %S.ast.Node %t47 +endif1684: + %t48 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t48, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.971, i64 6, i64 0 }, ptr %a50 + %t51 = call i32 @finch_str_eq(ptr %a49, ptr %a50) + %t52 = icmp ne i32 %t51, 0 + br i1 %t52, label %then1685, label %endif1687 +then1685: + %t53 = load ptr, ptr %a1 + %t54 = call %S.lexer.Token @finch.parser.next(ptr %t53) + %t55 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.972, i64 3, i64 0 }, ptr %t55 + %t56 = getelementptr inbounds %S.lexer.Token, ptr %a4, i32 0, i32 1 + %t57 = load { ptr, i64, i64 }, ptr %t56 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 4 + store { ptr, i64, i64 } %t57, ptr %a59 + call void @finch_str_copy(ptr %a60, ptr %a59) + %t61 = load { ptr, i64, i64 }, ptr %a60 + store { ptr, i64, i64 } %t61, ptr %t58 + %t62 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t62, ptr %a63 + call void @finch.copy.S_ast_Node(ptr %a64, ptr %a63) + %t65 = load %S.ast.Node, ptr %a64 + ret %S.ast.Node %t65 +endif1687: + %t66 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t66, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.973, i64 4, i64 0 }, ptr %a68 + %t69 = call i32 @finch_str_eq(ptr %a67, ptr %a68) + %t70 = icmp ne i32 %t69, 0 + br label %logic.from1688 +logic.from1688: + br i1 %t70, label %logic.end1690, label %logic.rhs1689 +logic.rhs1689: + %t71 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t71, ptr %a72 + store { ptr, i64, i64 } { ptr @.str.974, i64 5, i64 0 }, ptr %a73 + %t74 = call i32 @finch_str_eq(ptr %a72, ptr %a73) + %t75 = icmp ne i32 %t74, 0 + br label %logic.rend1691 +logic.rend1691: + br label %logic.end1690 +logic.end1690: + %t76 = phi i1 [ true, %logic.from1688 ], [ %t75, %logic.rend1691 ] + br i1 %t76, label %then1692, label %endif1694 +then1692: + %t77 = load ptr, ptr %a1 + %t78 = call %S.lexer.Token @finch.parser.next(ptr %t77) + %t79 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.975, i64 4, i64 0 }, ptr %t79 + %t80 = load { ptr, i64, i64 }, ptr %a13 + %t81 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 4 + store { ptr, i64, i64 } %t80, ptr %a82 + call void @finch_str_copy(ptr %a83, ptr %a82) + %t84 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t84, ptr %t81 + %t85 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t85, ptr %a86 + call void @finch.copy.S_ast_Node(ptr %a87, ptr %a86) + %t88 = load %S.ast.Node, ptr %a87 + ret %S.ast.Node %t88 +endif1694: + %t89 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t89, ptr %a90 + store { ptr, i64, i64 } { ptr @.str.976, i64 4, i64 0 }, ptr %a91 + %t92 = call i32 @finch_str_eq(ptr %a90, ptr %a91) + %t93 = icmp ne i32 %t92, 0 + br i1 %t93, label %then1695, label %endif1697 +then1695: + %t94 = load ptr, ptr %a1 + %t95 = call %S.lexer.Token @finch.parser.next(ptr %t94) + %t96 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.977, i64 4, i64 0 }, ptr %t96 + %t97 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t97, ptr %a98 + call void @finch.copy.S_ast_Node(ptr %a99, ptr %a98) + %t100 = load %S.ast.Node, ptr %a99 + ret %S.ast.Node %t100 +endif1697: + %t101 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t101, ptr %a102 + store { ptr, i64, i64 } { ptr @.str.978, i64 1, i64 0 }, ptr %a103 + %t104 = call i32 @finch_str_eq(ptr %a102, ptr %a103) + %t105 = icmp ne i32 %t104, 0 + br i1 %t105, label %then1698, label %endif1700 +then1698: + %t106 = load ptr, ptr %a1 + %t107 = call %S.lexer.Token @finch.parser.next(ptr %t106) + %t108 = load ptr, ptr %a1 + %t109 = icmp eq ptr %t108, null + br i1 %t109, label %panic1701, label %ok1702 +panic1701: + call void @finch_panic(ptr @.str.979, i64 713, ptr @.str.980) + unreachable +ok1702: + %t110 = getelementptr inbounds %S.parser.Parser, ptr %t108, i32 0, i32 2 + %t111 = load i64, ptr %t110 + %t112 = add i64 %t111, 1 + store i64 %t112, ptr %t110 + %t113 = load ptr, ptr %a1 + %t114 = call %S.ast.Node @finch.parser.parseExpr(ptr %t113) + store %S.ast.Node %t114, ptr %a115 + %t116 = load ptr, ptr %a1 + %t117 = icmp eq ptr %t116, null + br i1 %t117, label %panic1703, label %ok1704 +panic1703: + call void @finch_panic(ptr @.str.981, i64 715, ptr @.str.982) + unreachable +ok1704: + %t118 = getelementptr inbounds %S.parser.Parser, ptr %t116, i32 0, i32 2 + %t119 = load i64, ptr %t118 + %t120 = sub i64 %t119, 1 + store i64 %t120, ptr %t118 + %t121 = load ptr, ptr %a1 + %t122 = call %S.lexer.Token @finch.parser.expect(ptr %t121, { ptr, i64, i64 } { ptr @.str.983, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.984, i64 3, i64 0 }) + %t123 = load %S.ast.Node, ptr %a115 + ret %S.ast.Node %t123 +endif1700: + %t124 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t124, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.985, i64 5, i64 0 }, ptr %a126 + %t127 = call i32 @finch_str_eq(ptr %a125, ptr %a126) + %t128 = icmp ne i32 %t127, 0 + br i1 %t128, label %then1705, label %endif1707 +then1705: + %t129 = load ptr, ptr %a1 + %t130 = call %S.ast.Node @finch.parser.parseMatch(ptr %t129, i1 true) + ret %S.ast.Node %t130 +endif1707: + %t131 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t131, ptr %a132 + store { ptr, i64, i64 } { ptr @.str.986, i64 1, i64 0 }, ptr %a133 + %t134 = call i32 @finch_str_eq(ptr %a132, ptr %a133) + %t135 = icmp ne i32 %t134, 0 + br i1 %t135, label %then1708, label %endif1710 +then1708: + %t136 = load ptr, ptr %a1 + %t137 = call %S.lexer.Token @finch.parser.next(ptr %t136) + %t138 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.987, i64 5, i64 0 }, ptr %t138 + %t139 = load ptr, ptr %a1 + %t140 = icmp eq ptr %t139, null + br i1 %t140, label %panic1711, label %ok1712 +panic1711: + call void @finch_panic(ptr @.str.988, i64 725, ptr @.str.989) + unreachable +ok1712: + %t141 = getelementptr inbounds %S.parser.Parser, ptr %t139, i32 0, i32 2 + %t142 = load i64, ptr %t141 + %t143 = add i64 %t142, 1 + store i64 %t143, ptr %t141 + %t144 = load ptr, ptr %a1 + %t145 = call i1 @finch.parser.at(ptr %t144, { ptr, i64, i64 } { ptr @.str.990, i64 1, i64 0 }) + br label %logic.from1713 +logic.from1713: + br i1 %t145, label %logic.rhs1714, label %logic.end1715 +logic.rhs1714: + %t146 = load ptr, ptr %a1 + %t147 = call { ptr, i64, i64 } @finch.parser.peekKind(ptr %t146, i64 1) + store { ptr, i64, i64 } %t147, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.991, i64 1, i64 0 }, ptr %a149 + %t150 = call i32 @finch_str_eq(ptr %a148, ptr %a149) + %t151 = icmp ne i32 %t150, 0 + br label %logic.rend1716 +logic.rend1716: + br label %logic.end1715 +logic.end1715: + %t152 = phi i1 [ false, %logic.from1713 ], [ %t151, %logic.rend1716 ] + br i1 %t152, label %then1717, label %endif1719 +then1717: + %t153 = load ptr, ptr %a1 + %t154 = call %S.lexer.Token @finch.parser.next(ptr %t153) + %t155 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.992, i64 3, i64 0 }, ptr %t155 + br label %endif1719 +endif1719: + br label %while.cond1720 +while.cond1720: + %t156 = load ptr, ptr %a1 + %t157 = call i1 @finch.parser.at(ptr %t156, { ptr, i64, i64 } { ptr @.str.993, i64 1, i64 0 }) + %t158 = xor i1 %t157, true + br i1 %t158, label %while.body1721, label %while.end1722 +while.body1721: + %t159 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 9 + %t160 = getelementptr inbounds { ptr, i64, i64 }, ptr %t159, i32 0, i32 1 + %t161 = load ptr, ptr %a1 + %t162 = call %S.ast.Node @finch.parser.parseExpr(ptr %t161) + %t163 = load i64, ptr %t160 + %t164 = add i64 %t163, 1 + call void @finch_arr_reserve(ptr %t159, i64 %t164, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t165 = load ptr, ptr %t159 + %t166 = getelementptr inbounds %S.ast.Node, ptr %t165, i64 %t163 + store %S.ast.Node %t162, ptr %t166 + store i64 %t164, ptr %t160 + %t167 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 9 + %t168 = getelementptr inbounds { ptr, i64, i64 }, ptr %t167, i32 0, i32 1 + %t169 = load i64, ptr %t168 + %t170 = icmp eq i64 %t169, 1 + br label %logic.from1723 +logic.from1723: + br i1 %t170, label %logic.rhs1724, label %logic.end1725 +logic.rhs1724: + %t171 = load ptr, ptr %a1 + %t172 = call i1 @finch.parser.at(ptr %t171, { ptr, i64, i64 } { ptr @.str.994, i64 1, i64 0 }) + br label %logic.rend1726 +logic.rend1726: + br label %logic.end1725 +logic.end1725: + %t173 = phi i1 [ false, %logic.from1723 ], [ %t172, %logic.rend1726 ] + br i1 %t173, label %then1727, label %endif1729 +then1727: + %t174 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.995, i64 3, i64 0 }, ptr %t174 + br label %endif1729 +endif1729: + %t175 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + %t176 = load { ptr, i64, i64 }, ptr %t175 + store { ptr, i64, i64 } %t176, ptr %a177 + store { ptr, i64, i64 } { ptr @.str.996, i64 3, i64 0 }, ptr %a178 + %t179 = call i32 @finch_str_eq(ptr %a177, ptr %a178) + %t180 = icmp ne i32 %t179, 0 + br i1 %t180, label %then1730, label %endif1732 +then1730: + %t181 = load ptr, ptr %a1 + %t182 = call %S.lexer.Token @finch.parser.expect(ptr %t181, { ptr, i64, i64 } { ptr @.str.997, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.998, i64 41, i64 0 }) + %t183 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 9 + %t184 = getelementptr inbounds { ptr, i64, i64 }, ptr %t183, i32 0, i32 1 + %t185 = load ptr, ptr %a1 + %t186 = call %S.ast.Node @finch.parser.parseExpr(ptr %t185) + %t187 = load i64, ptr %t184 + %t188 = add i64 %t187, 1 + call void @finch_arr_reserve(ptr %t183, i64 %t188, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t189 = load ptr, ptr %t183 + %t190 = getelementptr inbounds %S.ast.Node, ptr %t189, i64 %t187 + store %S.ast.Node %t186, ptr %t190 + store i64 %t188, ptr %t184 + br label %endif1732 +endif1732: + %t191 = load ptr, ptr %a1 + %t192 = call i1 @finch.parser.accept(ptr %t191, { ptr, i64, i64 } { ptr @.str.999, i64 1, i64 0 }) + %t193 = xor i1 %t192, true + br i1 %t193, label %then1733, label %endif1735 +then1733: + br label %while.end1722 +endif1735: + br label %while.cond1720 +while.end1722: + %t194 = load ptr, ptr %a1 + %t195 = icmp eq ptr %t194, null + br i1 %t195, label %panic1736, label %ok1737 +panic1736: + call void @finch_panic(ptr @.str.1000, i64 743, ptr @.str.1001) + unreachable +ok1737: + %t196 = getelementptr inbounds %S.parser.Parser, ptr %t194, i32 0, i32 2 + %t197 = load i64, ptr %t196 + %t198 = sub i64 %t197, 1 + store i64 %t198, ptr %t196 + %t199 = load ptr, ptr %a1 + %t200 = call %S.lexer.Token @finch.parser.expect(ptr %t199, { ptr, i64, i64 } { ptr @.str.1002, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.1003, i64 3, i64 0 }) + %t201 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t201, ptr %a202 + call void @finch.copy.S_ast_Node(ptr %a203, ptr %a202) + %t204 = load %S.ast.Node, ptr %a203 + ret %S.ast.Node %t204 +endif1710: + %t205 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t205, ptr %a206 + store { ptr, i64, i64 } { ptr @.str.1004, i64 5, i64 0 }, ptr %a207 + %t208 = call i32 @finch_str_eq(ptr %a206, ptr %a207) + %t209 = icmp ne i32 %t208, 0 + br i1 %t209, label %then1738, label %endif1740 +then1738: + %t210 = load ptr, ptr %a1 + %t211 = call %S.lexer.Token @finch.parser.next(ptr %t210) + %t212 = getelementptr inbounds %S.lexer.Token, ptr %a4, i32 0, i32 1 + %t213 = load { ptr, i64, i64 }, ptr %t212 + %t214 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 1 + store { ptr, i64, i64 } %t213, ptr %a215 + call void @finch_str_copy(ptr %a216, ptr %a215) + %t217 = load { ptr, i64, i64 }, ptr %a216 + store { ptr, i64, i64 } %t217, ptr %t214 + %t218 = load ptr, ptr %a1 + %t219 = call i1 @finch.parser.at(ptr %t218, { ptr, i64, i64 } { ptr @.str.1005, i64 1, i64 0 }) + br label %logic.from1741 +logic.from1741: + br i1 %t219, label %logic.rhs1742, label %logic.end1743 +logic.rhs1742: + %t220 = load ptr, ptr %a1 + %t221 = icmp eq ptr %t220, null + br i1 %t221, label %panic1744, label %ok1745 +panic1744: + call void @finch_panic(ptr @.str.1006, i64 750, ptr @.str.1007) + unreachable +ok1745: + %t222 = getelementptr inbounds %S.parser.Parser, ptr %t220, i32 0, i32 0 + %t223 = load ptr, ptr %a1 + %t224 = icmp eq ptr %t223, null + br i1 %t224, label %panic1746, label %ok1747 +panic1746: + call void @finch_panic(ptr @.str.1008, i64 750, ptr @.str.1009) + unreachable +ok1747: + %t225 = getelementptr inbounds %S.parser.Parser, ptr %t223, i32 0, i32 1 + %t226 = load i64, ptr %t225 + %t227 = sub i64 %t226, 1 + %t228 = load { ptr, i64, i64 }, ptr %t222 + %t229 = extractvalue { ptr, i64, i64 } %t228, 1 + %t230 = icmp uge i64 %t227, %t229 + br i1 %t230, label %range1748, label %inrange1749 +range1748: + call void @finch_panic_index(ptr @.str.1010, i64 750, i64 %t227, i64 %t229) + unreachable +inrange1749: + %t231 = extractvalue { ptr, i64, i64 } %t228, 0 + %t232 = getelementptr inbounds %S.lexer.Token, ptr %t231, i64 %t227 + %t233 = getelementptr inbounds %S.lexer.Token, ptr %t232, i32 0, i32 0 + %t234 = load { ptr, i64, i64 }, ptr %t233 + store { ptr, i64, i64 } %t234, ptr %a235 + store { ptr, i64, i64 } { ptr @.str.1011, i64 5, i64 0 }, ptr %a236 + %t237 = call i32 @finch_str_eq(ptr %a235, ptr %a236) + %t238 = icmp ne i32 %t237, 0 + br label %logic.rend1750 +logic.rend1750: + br label %logic.end1743 +logic.end1743: + %t239 = phi i1 [ false, %logic.from1741 ], [ %t238, %logic.rend1750 ] + br label %logic.from1751 +logic.from1751: + br i1 %t239, label %logic.rhs1752, label %logic.end1753 +logic.rhs1752: + %t240 = load ptr, ptr %a1 + %t241 = call i1 @finch.parser.genericCallAheadFrom(ptr %t240) + br label %logic.rend1754 +logic.rend1754: + br label %logic.end1753 +logic.end1753: + %t242 = phi i1 [ false, %logic.from1751 ], [ %t241, %logic.rend1754 ] + br i1 %t242, label %then1755, label %endif1757 +then1755: + %t243 = load ptr, ptr %a1 + %t244 = call %S.lexer.Token @finch.parser.next(ptr %t243) + %t245 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.1012, i64 5, i64 0 }, 0 + %t246 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 5 + store %S.ast.Type %t245, ptr %t246 + br label %while.cond1758 +while.cond1758: + br label %while.body1759 +while.body1759: + %t247 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 5 + %t248 = getelementptr inbounds %S.ast.Type, ptr %t247, i32 0, i32 1 + %t249 = getelementptr inbounds { ptr, i64, i64 }, ptr %t248, i32 0, i32 1 + %t250 = load ptr, ptr %a1 + %t251 = call %S.ast.Type @finch.parser.parseType(ptr %t250) + %t252 = load i64, ptr %t249 + %t253 = add i64 %t252, 1 + call void @finch_arr_reserve(ptr %t248, i64 %t253, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t254 = load ptr, ptr %t248 + %t255 = getelementptr inbounds %S.ast.Type, ptr %t254, i64 %t252 + store %S.ast.Type %t251, ptr %t255 + store i64 %t253, ptr %t249 + %t256 = load ptr, ptr %a1 + %t257 = call i1 @finch.parser.accept(ptr %t256, { ptr, i64, i64 } { ptr @.str.1013, i64 1, i64 0 }) + %t258 = xor i1 %t257, true + br i1 %t258, label %then1761, label %endif1763 +then1761: + br label %while.end1760 +endif1763: + br label %while.cond1758 +while.end1760: + %t259 = load ptr, ptr %a1 + %t260 = call %S.lexer.Token @finch.parser.expect(ptr %t259, { ptr, i64, i64 } { ptr @.str.1014, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.1015, i64 28, i64 0 }) + %t261 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.1016, i64 4, i64 0 }, ptr %t261 + %t262 = load ptr, ptr %a1 + call void @finch.parser.parseArgs(ptr %t262, ptr %a7) + %t263 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t263, ptr %a264 + call void @finch.copy.S_ast_Node(ptr %a265, ptr %a264) + %t266 = load %S.ast.Node, ptr %a265 + ret %S.ast.Node %t266 +endif1757: + %t267 = load ptr, ptr %a1 + %t268 = call i1 @finch.parser.at(ptr %t267, { ptr, i64, i64 } { ptr @.str.1017, i64 1, i64 0 }) + br label %logic.from1764 +logic.from1764: + br i1 %t268, label %logic.rhs1765, label %logic.end1766 +logic.rhs1765: + %t269 = load ptr, ptr %a1 + %t270 = call %S.lexer.Token @finch.parser.cur(ptr %t269) + %t271 = extractvalue %S.lexer.Token %t270, 4 + %t272 = xor i1 %t271, true + br label %logic.rend1767 +logic.rend1767: + br label %logic.end1766 +logic.end1766: + %t273 = phi i1 [ false, %logic.from1764 ], [ %t272, %logic.rend1767 ] + br i1 %t273, label %then1768, label %endif1770 +then1768: + %t274 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.1018, i64 4, i64 0 }, ptr %t274 + %t275 = load ptr, ptr %a1 + call void @finch.parser.parseArgs(ptr %t275, ptr %a7) + %t276 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t276, ptr %a277 + call void @finch.copy.S_ast_Node(ptr %a278, ptr %a277) + %t279 = load %S.ast.Node, ptr %a278 + ret %S.ast.Node %t279 +endif1770: + %t280 = getelementptr inbounds %S.ast.Node, ptr %a7, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.1019, i64 3, i64 0 }, ptr %t280 + %t281 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t281, ptr %a282 + call void @finch.copy.S_ast_Node(ptr %a283, ptr %a282) + %t284 = load %S.ast.Node, ptr %a283 + ret %S.ast.Node %t284 +endif1740: + %t285 = load ptr, ptr %a1 + %t286 = load %S.lexer.Token, ptr %a4 + %t287 = load %S.lexer.Token, ptr %a4 + %t288 = call { ptr, i64, i64 } @finch.parser.describe(%S.lexer.Token %t287) + store { ptr, i64, i64 } { ptr @.str.1020, i64 11, i64 0 }, ptr %a290 + store { ptr, i64, i64 } %t288, ptr %a291 + call void @finch_str_concat(ptr %a289, ptr %a290, ptr %a291) + %t292 = load { ptr, i64, i64 }, ptr %a289 + store { ptr, i64, i64 } %t292, ptr %a294 + store { ptr, i64, i64 } { ptr @.str.1021, i64 19, i64 0 }, ptr %a295 + call void @finch_str_concat(ptr %a293, ptr %a294, ptr %a295) + %t296 = load { ptr, i64, i64 }, ptr %a293 + call void @finch.parser.fail(ptr %t285, %S.lexer.Token %t286, { ptr, i64, i64 } %t296) + %t297 = load %S.ast.Node, ptr %a7 + store %S.ast.Node %t297, ptr %a298 + call void @finch.copy.S_ast_Node(ptr %a299, ptr %a298) + %t300 = load %S.ast.Node, ptr %a299 + ret %S.ast.Node %t300 +} + +define internal %S.ast.Program @finch.parser.parse({ ptr, i64, i64 } %p0, i64 %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca i64, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca %S.parser.Parser, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store i64 %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch.copy.arr_S_lexer_Token(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + %t8 = insertvalue %S.parser.Parser zeroinitializer, { ptr, i64, i64 } %t7, 0 + %t9 = insertvalue %S.parser.Parser %t8, i64 0, 1 + %t10 = insertvalue %S.parser.Parser %t9, i64 0, 2 + %t11 = load i64, ptr %a2 + %t12 = insertvalue %S.parser.Parser %t10, i64 %t11, 3 + %t13 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t13, ptr %a14 + call void @finch_str_copy(ptr %a15, ptr %a14) + %t16 = load { ptr, i64, i64 }, ptr %a15 + %t17 = insertvalue %S.parser.Parser %t12, { ptr, i64, i64 } %t16, 4 + store %S.parser.Parser %t17, ptr %a18 + %t19 = call %S.ast.Program @finch.parser.parseProgram(ptr %a18) + ret %S.ast.Program %t19 +} + +define internal void @finch.gen.fail(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic1771, label %ok1772 +panic1771: + call void @finch_panic(ptr @.str.1022, i64 172, ptr @.str.1023) + unreachable +ok1772: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 1 + %t7 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t8 = load i64, ptr %t7 + %t9 = load { ptr, i64, i64 }, ptr %t6 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 %t8, %t10 + br i1 %t11, label %range1773, label %inrange1774 +range1773: + call void @finch_panic_index(ptr @.str.1024, i64 172, i64 %t8, i64 %t10) + unreachable +inrange1774: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t12, i64 %t8 + %t14 = load { ptr, i64, i64 }, ptr %t13 + store { ptr, i64, i64 } %t14, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.1025, i64 1, i64 0 }, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + %t19 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t20 = load i64, ptr %t19 + call void @finch_str_from_int(ptr %a21, i64 %t20) + %t22 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } %t18, ptr %a24 + store { ptr, i64, i64 } %t22, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t26, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.1026, i64 1, i64 0 }, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + %t31 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 12 + %t32 = load i64, ptr %t31 + call void @finch_str_from_int(ptr %a33, i64 %t32) + %t34 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } %t30, ptr %a36 + store { ptr, i64, i64 } %t34, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t38, ptr %a40 + store { ptr, i64, i64 } { ptr @.str.1027, i64 9, i64 0 }, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + %t43 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t42, ptr %a45 + store { ptr, i64, i64 } %t43, ptr %a46 + call void @finch_str_concat(ptr %a44, ptr %a45, ptr %a46) + %t47 = load { ptr, i64, i64 }, ptr %a44 + %t48 = load ptr, ptr %a1 + %t49 = icmp eq ptr %t48, null + br i1 %t49, label %panic1775, label %ok1776 +panic1775: + call void @finch_panic(ptr @.str.1028, i64 172, ptr @.str.1029) + unreachable +ok1776: + %t50 = getelementptr inbounds %S.gen.Gen, ptr %t48, i32 0, i32 19 + %t51 = load { ptr, i64, i64 }, ptr %t50 + store { ptr, i64, i64 } %t47, ptr %a53 + store { ptr, i64, i64 } %t51, ptr %a54 + call void @finch_str_concat(ptr %a52, ptr %a53, ptr %a54) + %t55 = load { ptr, i64, i64 }, ptr %a52 + %t56 = extractvalue { ptr, i64, i64 } %t55, 1 + %t57 = trunc i64 %t56 to i32 + %t58 = extractvalue { ptr, i64, i64 } %t55, 0 + %t59 = icmp eq ptr %t58, null + %t60 = select i1 %t59, ptr @.str.1030, ptr %t58 + %t61 = call i32 (ptr, ...) @printf(ptr @.str.1031, i32 %t57, ptr %t60) + %t62 = call i32 (ptr, ...) @printf(ptr @.str.1032) + %t63 = trunc i64 1 to i32 + %t64 = call i32 @fflush(ptr null) + call void @exit(i32 %t63) + ret void +} + +define internal void @finch.gen.emit(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic1777, label %ok1778 +panic1777: + call void @finch_panic(ptr @.str.1033, i64 178, ptr @.str.1034) + unreachable +ok1778: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 32 + %t6 = load i64, ptr %t5 + %t7 = icmp sge i64 %t6, 0 + br label %logic.from1779 +logic.from1779: + br i1 %t7, label %logic.rhs1780, label %logic.end1781 +logic.rhs1780: + %t8 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t8, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1036, i64 5, i64 0 }, ptr %a11 + %t12 = call i64 @finch_str_find(ptr %a9, ptr %a11) + %t13 = icmp sge i64 %t12, 0 + br label %logic.rend1782 +logic.rend1782: + br label %logic.end1781 +logic.end1781: + %t14 = phi i1 [ false, %logic.from1779 ], [ %t13, %logic.rend1782 ] + br i1 %t14, label %then1783, label %endif1785 +then1783: + %t15 = load ptr, ptr %a1 + %t16 = icmp eq ptr %t15, null + br i1 %t16, label %panic1786, label %ok1787 +panic1786: + call void @finch_panic(ptr @.str.1037, i64 179, ptr @.str.1038) + unreachable +ok1787: + %t17 = getelementptr inbounds %S.gen.Gen, ptr %t15, i32 0, i32 4 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t17, i32 0, i32 1 + %t19 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1039, i64 2, i64 0 }, ptr %a21 + store { ptr, i64, i64 } %t19, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t23, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.1040, i64 8, i64 0 }, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + %t28 = load ptr, ptr %a1 + %t29 = call i64 @finch.gen.dbgLocation(ptr %t28) + call void @finch_str_from_int(ptr %a30, i64 %t29) + %t31 = load { ptr, i64, i64 }, ptr %a30 + store { ptr, i64, i64 } %t27, ptr %a33 + store { ptr, i64, i64 } %t31, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + %t36 = load i64, ptr %t18 + %t37 = add i64 %t36, 1 + call void @finch_arr_reserve(ptr %t17, i64 %t37, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t38 = load ptr, ptr %t17 + %t39 = getelementptr inbounds { ptr, i64, i64 }, ptr %t38, i64 %t36 + store { ptr, i64, i64 } %t35, ptr %t39 + store i64 %t37, ptr %t18 + ret void +endif1785: + %t40 = load ptr, ptr %a1 + %t41 = icmp eq ptr %t40, null + br i1 %t41, label %panic1788, label %ok1789 +panic1788: + call void @finch_panic(ptr @.str.1041, i64 182, ptr @.str.1042) + unreachable +ok1789: + %t42 = getelementptr inbounds %S.gen.Gen, ptr %t40, i32 0, i32 4 + %t43 = getelementptr inbounds { ptr, i64, i64 }, ptr %t42, i32 0, i32 1 + %t44 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1043, i64 2, i64 0 }, ptr %a46 + store { ptr, i64, i64 } %t44, ptr %a47 + call void @finch_str_concat(ptr %a45, ptr %a46, ptr %a47) + %t48 = load { ptr, i64, i64 }, ptr %a45 + %t49 = load i64, ptr %t43 + %t50 = add i64 %t49, 1 + call void @finch_arr_reserve(ptr %t42, i64 %t50, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t51 = load ptr, ptr %t42 + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %t51, i64 %t49 + store { ptr, i64, i64 } %t48, ptr %t52 + store i64 %t50, ptr %t43 + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.tmpName(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic1790, label %ok1791 +panic1790: + call void @finch_panic(ptr @.str.1044, i64 186, ptr @.str.1045) + unreachable +ok1791: + %t4 = getelementptr inbounds %S.gen.Gen, ptr %t2, i32 0, i32 6 + %t5 = load i64, ptr %t4 + %t6 = add i64 %t5, 1 + store i64 %t6, ptr %t4 + %t7 = load ptr, ptr %a1 + %t8 = icmp eq ptr %t7, null + br i1 %t8, label %panic1792, label %ok1793 +panic1792: + call void @finch_panic(ptr @.str.1047, i64 187, ptr @.str.1048) + unreachable +ok1793: + %t9 = getelementptr inbounds %S.gen.Gen, ptr %t7, i32 0, i32 6 + %t10 = load i64, ptr %t9 + call void @finch_str_from_int(ptr %a11, i64 %t10) + %t12 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.1046, i64 2, i64 0 }, ptr %a14 + store { ptr, i64, i64 } %t12, ptr %a15 + call void @finch_str_concat(ptr %a13, ptr %a14, ptr %a15) + %t16 = load { ptr, i64, i64 }, ptr %a13 + ret { ptr, i64, i64 } %t16 +} + +define internal { ptr, i64, i64 } @finch.gen.newLabel(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic1794, label %ok1795 +panic1794: + call void @finch_panic(ptr @.str.1049, i64 191, ptr @.str.1050) + unreachable +ok1795: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 7 + %t6 = load i64, ptr %t5 + %t7 = add i64 %t6, 1 + store i64 %t7, ptr %t5 + %t8 = load { ptr, i64, i64 }, ptr %a2 + %t9 = load ptr, ptr %a1 + %t10 = icmp eq ptr %t9, null + br i1 %t10, label %panic1796, label %ok1797 +panic1796: + call void @finch_panic(ptr @.str.1051, i64 192, ptr @.str.1052) + unreachable +ok1797: + %t11 = getelementptr inbounds %S.gen.Gen, ptr %t9, i32 0, i32 7 + %t12 = load i64, ptr %t11 + call void @finch_str_from_int(ptr %a13, i64 %t12) + %t14 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t8, ptr %a16 + store { ptr, i64, i64 } %t14, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + ret { ptr, i64, i64 } %t18 +} + +define internal void @finch.gen.label(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic1798, label %ok1799 +panic1798: + call void @finch_panic(ptr @.str.1053, i64 196, ptr @.str.1054) + unreachable +ok1799: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 4 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i32 0, i32 1 + %t7 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t7, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1055, i64 1, i64 0 }, ptr %a10 + call void @finch_str_concat(ptr %a8, ptr %a9, ptr %a10) + %t11 = load { ptr, i64, i64 }, ptr %a8 + %t12 = load i64, ptr %t6 + %t13 = add i64 %t12, 1 + call void @finch_arr_reserve(ptr %t5, i64 %t13, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t14 = load ptr, ptr %t5 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t14, i64 %t12 + store { ptr, i64, i64 } %t11, ptr %t15 + store i64 %t13, ptr %t6 + %t16 = load ptr, ptr %a1 + %t17 = icmp eq ptr %t16, null + br i1 %t17, label %panic1800, label %ok1801 +panic1800: + call void @finch_panic(ptr @.str.1056, i64 197, ptr @.str.1057) + unreachable +ok1801: + %t18 = getelementptr inbounds %S.gen.Gen, ptr %t16, i32 0, i32 9 + store i1 false, ptr %t18 + ret void +} + +define internal void @finch.gen.br(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic1802, label %ok1803 +panic1802: + call void @finch_panic(ptr @.str.1058, i64 201, ptr @.str.1059) + unreachable +ok1803: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 9 + %t6 = load i1, ptr %t5 + %t7 = xor i1 %t6, true + br i1 %t7, label %then1804, label %endif1806 +then1804: + %t8 = load ptr, ptr %a1 + %t9 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1060, i64 10, i64 0 }, ptr %a11 + store { ptr, i64, i64 } %t9, ptr %a12 + call void @finch_str_concat(ptr %a10, ptr %a11, ptr %a12) + %t13 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.emit(ptr %t8, { ptr, i64, i64 } %t13) + %t14 = load ptr, ptr %a1 + %t15 = icmp eq ptr %t14, null + br i1 %t15, label %panic1807, label %ok1808 +panic1807: + call void @finch_panic(ptr @.str.1061, i64 203, ptr @.str.1062) + unreachable +ok1808: + %t16 = getelementptr inbounds %S.gen.Gen, ptr %t14, i32 0, i32 9 + store i1 true, ptr %t16 + br label %endif1806 +endif1806: + ret void +} + +define internal void @finch.gen.condBr(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, { ptr, i64, i64 } %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1063, i64 6, i64 0 }, ptr %a8 + store { ptr, i64, i64 } %t6, ptr %a9 + call void @finch_str_concat(ptr %a7, ptr %a8, ptr %a9) + %t10 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t10, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.1064, i64 9, i64 0 }, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + %t15 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t14, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t19, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.1065, i64 9, i64 0 }, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + %t24 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t23, ptr %a26 + store { ptr, i64, i64 } %t24, ptr %a27 + call void @finch_str_concat(ptr %a25, ptr %a26, ptr %a27) + %t28 = load { ptr, i64, i64 }, ptr %a25 + call void @finch.gen.emit(ptr %t5, { ptr, i64, i64 } %t28) + %t29 = load ptr, ptr %a1 + %t30 = icmp eq ptr %t29, null + br i1 %t30, label %panic1809, label %ok1810 +panic1809: + call void @finch_panic(ptr @.str.1066, i64 209, ptr @.str.1067) + unreachable +ok1810: + %t31 = getelementptr inbounds %S.gen.Gen, ptr %t29, i32 0, i32 9 + store i1 true, ptr %t31 + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.alloca(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic1811, label %ok1812 +panic1811: + call void @finch_panic(ptr @.str.1068, i64 213, ptr @.str.1069) + unreachable +ok1812: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 6 + %t6 = load i64, ptr %t5 + %t7 = add i64 %t6, 1 + store i64 %t7, ptr %t5 + %t8 = load ptr, ptr %a1 + %t9 = icmp eq ptr %t8, null + br i1 %t9, label %panic1813, label %ok1814 +panic1813: + call void @finch_panic(ptr @.str.1071, i64 214, ptr @.str.1072) + unreachable +ok1814: + %t10 = getelementptr inbounds %S.gen.Gen, ptr %t8, i32 0, i32 6 + %t11 = load i64, ptr %t10 + call void @finch_str_from_int(ptr %a12, i64 %t11) + %t13 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.1070, i64 2, i64 0 }, ptr %a15 + store { ptr, i64, i64 } %t13, ptr %a16 + call void @finch_str_concat(ptr %a14, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t17, ptr %a18 + %t19 = load ptr, ptr %a1 + %t20 = icmp eq ptr %t19, null + br i1 %t20, label %panic1815, label %ok1816 +panic1815: + call void @finch_panic(ptr @.str.1073, i64 215, ptr @.str.1074) + unreachable +ok1816: + %t21 = getelementptr inbounds %S.gen.Gen, ptr %t19, i32 0, i32 5 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t21, i32 0, i32 1 + %t23 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.1075, i64 2, i64 0 }, ptr %a25 + store { ptr, i64, i64 } %t23, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t27, ptr %a29 + store { ptr, i64, i64 } { ptr @.str.1076, i64 10, i64 0 }, ptr %a30 + call void @finch_str_concat(ptr %a28, ptr %a29, ptr %a30) + %t31 = load { ptr, i64, i64 }, ptr %a28 + %t32 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t31, ptr %a34 + store { ptr, i64, i64 } %t32, ptr %a35 + call void @finch_str_concat(ptr %a33, ptr %a34, ptr %a35) + %t36 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } %t36, ptr %a38 + store { ptr, i64, i64 } { ptr @.str.1077, i64 10, i64 0 }, ptr %a39 + call void @finch_str_concat(ptr %a37, ptr %a38, ptr %a39) + %t40 = load { ptr, i64, i64 }, ptr %a37 + %t41 = load i64, ptr %t22 + %t42 = add i64 %t41, 1 + call void @finch_arr_reserve(ptr %t21, i64 %t42, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t43 = load ptr, ptr %t21 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i64 %t41 + store { ptr, i64, i64 } %t40, ptr %t44 + store i64 %t42, ptr %t22 + %t45 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t45, ptr %a46 + call void @finch_str_copy(ptr %a47, ptr %a46) + %t48 = load { ptr, i64, i64 }, ptr %a47 + ret { ptr, i64, i64 } %t48 +} + +define internal { ptr, i64, i64 } @finch.gen.load(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = call { ptr, i64, i64 } @finch.gen.tmpName(ptr %t4) + store { ptr, i64, i64 } %t5, ptr %a6 + %t7 = load ptr, ptr %a1 + %t8 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t8, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1078, i64 8, i64 0 }, ptr %a11 + call void @finch_str_concat(ptr %a9, ptr %a10, ptr %a11) + %t12 = load { ptr, i64, i64 }, ptr %a9 + %t13 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t12, ptr %a15 + store { ptr, i64, i64 } %t13, ptr %a16 + call void @finch_str_concat(ptr %a14, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t17, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.1079, i64 6, i64 0 }, ptr %a20 + call void @finch_str_concat(ptr %a18, ptr %a19, ptr %a20) + %t21 = load { ptr, i64, i64 }, ptr %a18 + %t22 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t21, ptr %a24 + store { ptr, i64, i64 } %t22, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + call void @finch.gen.emit(ptr %t7, { ptr, i64, i64 } %t26) + %t27 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t27, ptr %a28 + call void @finch_str_copy(ptr %a29, ptr %a28) + %t30 = load { ptr, i64, i64 }, ptr %a29 + ret { ptr, i64, i64 } %t30 +} + +define internal void @finch.gen.store(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, { ptr, i64, i64 } %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1080, i64 6, i64 0 }, ptr %a8 + store { ptr, i64, i64 } %t6, ptr %a9 + call void @finch_str_concat(ptr %a7, ptr %a8, ptr %a9) + %t10 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t10, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.1081, i64 1, i64 0 }, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + %t15 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t14, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t19, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.1082, i64 6, i64 0 }, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + %t24 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t23, ptr %a26 + store { ptr, i64, i64 } %t24, ptr %a27 + call void @finch_str_concat(ptr %a25, ptr %a26, ptr %a27) + %t28 = load { ptr, i64, i64 }, ptr %a25 + call void @finch.gen.emit(ptr %t5, { ptr, i64, i64 } %t28) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.spill(ptr %p0, %S.gen.Val %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.Val, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.gen.Val %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load ptr, ptr %a1 + %t5 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t6 = load %S.ast.Type, ptr %t5 + %t7 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t4, %S.ast.Type %t6) + %t8 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t3, { ptr, i64, i64 } %t7) + store { ptr, i64, i64 } %t8, ptr %a9 + %t10 = load ptr, ptr %a1 + %t11 = load ptr, ptr %a1 + %t12 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t13 = load %S.ast.Type, ptr %t12 + %t14 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t11, %S.ast.Type %t13) + %t15 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t16 = load { ptr, i64, i64 }, ptr %t15 + %t17 = load { ptr, i64, i64 }, ptr %a9 + call void @finch.gen.store(ptr %t10, { ptr, i64, i64 } %t14, { ptr, i64, i64 } %t16, { ptr, i64, i64 } %t17) + %t18 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t18, ptr %a19 + call void @finch_str_copy(ptr %a20, ptr %a19) + %t21 = load { ptr, i64, i64 }, ptr %a20 + ret { ptr, i64, i64 } %t21 +} + +define internal { ptr, i64, i64 } @finch.gen.op(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = call { ptr, i64, i64 } @finch.gen.tmpName(ptr %t3) + store { ptr, i64, i64 } %t4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t7, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1083, i64 3, i64 0 }, ptr %a10 + call void @finch_str_concat(ptr %a8, ptr %a9, ptr %a10) + %t11 = load { ptr, i64, i64 }, ptr %a8 + %t12 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t11, ptr %a14 + store { ptr, i64, i64 } %t12, ptr %a15 + call void @finch_str_concat(ptr %a13, ptr %a14, ptr %a15) + %t16 = load { ptr, i64, i64 }, ptr %a13 + call void @finch.gen.emit(ptr %t6, { ptr, i64, i64 } %t16) + %t17 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t17, ptr %a18 + call void @finch_str_copy(ptr %a19, ptr %a18) + %t20 = load { ptr, i64, i64 }, ptr %a19 + ret { ptr, i64, i64 } %t20 +} + +define internal i1 @finch.gen.has({ ptr, i64, i64 } %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca i64, align 16 + %a8 = alloca i64, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t4 = load { ptr, i64, i64 }, ptr %a2 + store i64 -1, ptr %a5 + %t6 = load i64, ptr %t3 + %t7 = load ptr, ptr %a1 + store i64 0, ptr %a8 + br label %find.cond1817 +find.cond1817: + %t9 = load i64, ptr %a8 + %t10 = icmp slt i64 %t9, %t6 + br i1 %t10, label %find.body1818, label %find.end1821 +find.body1818: + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t7, i64 %t9 + %t12 = load { ptr, i64, i64 }, ptr %t11 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } %t4, ptr %a14 + %t15 = call i32 @finch_str_eq(ptr %a13, ptr %a14) + %t16 = icmp ne i32 %t15, 0 + br i1 %t16, label %find.hit1819, label %find.next1820 +find.hit1819: + store i64 %t9, ptr %a5 + br label %find.end1821 +find.next1820: + %t17 = add i64 %t9, 1 + store i64 %t17, ptr %a8 + br label %find.cond1817 +find.end1821: + %t18 = load i64, ptr %a5 + %t19 = icmp sge i64 %t18, 0 + ret i1 %t19 +} + +define internal %S.ast.Type @finch.gen.T({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + %t3 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } %t2) + ret %S.ast.Type %t3 +} + +define internal i1 @finch.gen.isSigned(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + call void @finch_str_copy(ptr %a5, ptr %a4) + %t6 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t6, ptr %a7 + %t8 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t8, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1084, i64 3, i64 0 }, ptr %a10 + %t11 = call i32 @finch_str_eq(ptr %a9, ptr %a10) + %t12 = icmp ne i32 %t11, 0 + br label %logic.from1822 +logic.from1822: + br i1 %t12, label %logic.end1824, label %logic.rhs1823 +logic.rhs1823: + %t13 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.1085, i64 2, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp ne i32 %t16, 0 + br label %logic.rend1825 +logic.rend1825: + br label %logic.end1824 +logic.end1824: + %t18 = phi i1 [ true, %logic.from1822 ], [ %t17, %logic.rend1825 ] + br label %logic.from1826 +logic.from1826: + br i1 %t18, label %logic.end1828, label %logic.rhs1827 +logic.rhs1827: + %t19 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.1086, i64 3, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br label %logic.rend1829 +logic.rend1829: + br label %logic.end1828 +logic.end1828: + %t24 = phi i1 [ true, %logic.from1826 ], [ %t23, %logic.rend1829 ] + br label %logic.from1830 +logic.from1830: + br i1 %t24, label %logic.end1832, label %logic.rhs1831 +logic.rhs1831: + %t25 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t25, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.1087, i64 3, i64 0 }, ptr %a27 + %t28 = call i32 @finch_str_eq(ptr %a26, ptr %a27) + %t29 = icmp ne i32 %t28, 0 + br label %logic.rend1833 +logic.rend1833: + br label %logic.end1832 +logic.end1832: + %t30 = phi i1 [ true, %logic.from1830 ], [ %t29, %logic.rend1833 ] + ret i1 %t30 +} + +define internal i1 @finch.gen.isUnsigned(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + call void @finch_str_copy(ptr %a5, ptr %a4) + %t6 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t6, ptr %a7 + %t8 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t8, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1088, i64 2, i64 0 }, ptr %a10 + %t11 = call i32 @finch_str_eq(ptr %a9, ptr %a10) + %t12 = icmp ne i32 %t11, 0 + br label %logic.from1834 +logic.from1834: + br i1 %t12, label %logic.end1836, label %logic.rhs1835 +logic.rhs1835: + %t13 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.1089, i64 3, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp ne i32 %t16, 0 + br label %logic.rend1837 +logic.rend1837: + br label %logic.end1836 +logic.end1836: + %t18 = phi i1 [ true, %logic.from1834 ], [ %t17, %logic.rend1837 ] + br label %logic.from1838 +logic.from1838: + br i1 %t18, label %logic.end1840, label %logic.rhs1839 +logic.rhs1839: + %t19 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.1090, i64 3, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br label %logic.rend1841 +logic.rend1841: + br label %logic.end1840 +logic.end1840: + %t24 = phi i1 [ true, %logic.from1838 ], [ %t23, %logic.rend1841 ] + br label %logic.from1842 +logic.from1842: + br i1 %t24, label %logic.end1844, label %logic.rhs1843 +logic.rhs1843: + %t25 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t25, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.1091, i64 3, i64 0 }, ptr %a27 + %t28 = call i32 @finch_str_eq(ptr %a26, ptr %a27) + %t29 = icmp ne i32 %t28, 0 + br label %logic.rend1845 +logic.rend1845: + br label %logic.end1844 +logic.end1844: + %t30 = phi i1 [ true, %logic.from1842 ], [ %t29, %logic.rend1845 ] + ret i1 %t30 +} + +define internal i1 @finch.gen.isInt(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = load %S.ast.Type, ptr %a1 + %t3 = call i1 @finch.gen.isSigned(%S.ast.Type %t2) + br label %logic.from1846 +logic.from1846: + br i1 %t3, label %logic.end1848, label %logic.rhs1847 +logic.rhs1847: + %t4 = load %S.ast.Type, ptr %a1 + %t5 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t4) + br label %logic.rend1849 +logic.rend1849: + br label %logic.end1848 +logic.end1848: + %t6 = phi i1 [ true, %logic.from1846 ], [ %t5, %logic.rend1849 ] + ret i1 %t6 +} + +define internal i1 @finch.gen.isFloat(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.1092, i64 5, i64 0 }, ptr %a5 + %t6 = call i32 @finch_str_eq(ptr %a4, ptr %a5) + %t7 = icmp ne i32 %t6, 0 + br label %logic.from1850 +logic.from1850: + br i1 %t7, label %logic.end1852, label %logic.rhs1851 +logic.rhs1851: + %t8 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t9 = load { ptr, i64, i64 }, ptr %t8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1093, i64 3, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br label %logic.rend1853 +logic.rend1853: + br label %logic.end1852 +logic.end1852: + %t14 = phi i1 [ true, %logic.from1850 ], [ %t13, %logic.rend1853 ] + ret i1 %t14 +} + +define internal i1 @finch.gen.isNumber(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = load %S.ast.Type, ptr %a1 + %t3 = call i1 @finch.gen.isInt(%S.ast.Type %t2) + br label %logic.from1854 +logic.from1854: + br i1 %t3, label %logic.end1856, label %logic.rhs1855 +logic.rhs1855: + %t4 = load %S.ast.Type, ptr %a1 + %t5 = call i1 @finch.gen.isFloat(%S.ast.Type %t4) + br label %logic.rend1857 +logic.rend1857: + br label %logic.end1856 +logic.end1856: + %t6 = phi i1 [ true, %logic.from1854 ], [ %t5, %logic.rend1857 ] + ret i1 %t6 +} + +define internal i64 @finch.gen.bitsOf(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + call void @finch_str_copy(ptr %a5, ptr %a4) + %t6 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t6, ptr %a7 + %t8 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t8, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1094, i64 4, i64 0 }, ptr %a10 + %t11 = call i32 @finch_str_eq(ptr %a9, ptr %a10) + %t12 = icmp ne i32 %t11, 0 + br i1 %t12, label %then1858, label %endif1860 +then1858: + ret i64 1 +endif1860: + %t13 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.1095, i64 4, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp ne i32 %t16, 0 + br label %logic.from1861 +logic.from1861: + br i1 %t17, label %logic.end1863, label %logic.rhs1862 +logic.rhs1862: + %t18 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t18, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.1096, i64 2, i64 0 }, ptr %a20 + %t21 = call i32 @finch_str_eq(ptr %a19, ptr %a20) + %t22 = icmp ne i32 %t21, 0 + br label %logic.rend1864 +logic.rend1864: + br label %logic.end1863 +logic.end1863: + %t23 = phi i1 [ true, %logic.from1861 ], [ %t22, %logic.rend1864 ] + br label %logic.from1865 +logic.from1865: + br i1 %t23, label %logic.end1867, label %logic.rhs1866 +logic.rhs1866: + %t24 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t24, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.1097, i64 2, i64 0 }, ptr %a26 + %t27 = call i32 @finch_str_eq(ptr %a25, ptr %a26) + %t28 = icmp ne i32 %t27, 0 + br label %logic.rend1868 +logic.rend1868: + br label %logic.end1867 +logic.end1867: + %t29 = phi i1 [ true, %logic.from1865 ], [ %t28, %logic.rend1868 ] + br i1 %t29, label %then1869, label %endif1871 +then1869: + ret i64 8 +endif1871: + %t30 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t30, ptr %a31 + store { ptr, i64, i64 } { ptr @.str.1098, i64 3, i64 0 }, ptr %a32 + %t33 = call i32 @finch_str_eq(ptr %a31, ptr %a32) + %t34 = icmp ne i32 %t33, 0 + br label %logic.from1872 +logic.from1872: + br i1 %t34, label %logic.end1874, label %logic.rhs1873 +logic.rhs1873: + %t35 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t35, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.1099, i64 3, i64 0 }, ptr %a37 + %t38 = call i32 @finch_str_eq(ptr %a36, ptr %a37) + %t39 = icmp ne i32 %t38, 0 + br label %logic.rend1875 +logic.rend1875: + br label %logic.end1874 +logic.end1874: + %t40 = phi i1 [ true, %logic.from1872 ], [ %t39, %logic.rend1875 ] + br i1 %t40, label %then1876, label %endif1878 +then1876: + ret i64 16 +endif1878: + %t41 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t41, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.1100, i64 3, i64 0 }, ptr %a43 + %t44 = call i32 @finch_str_eq(ptr %a42, ptr %a43) + %t45 = icmp ne i32 %t44, 0 + br label %logic.from1879 +logic.from1879: + br i1 %t45, label %logic.end1881, label %logic.rhs1880 +logic.rhs1880: + %t46 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t46, ptr %a47 + store { ptr, i64, i64 } { ptr @.str.1101, i64 3, i64 0 }, ptr %a48 + %t49 = call i32 @finch_str_eq(ptr %a47, ptr %a48) + %t50 = icmp ne i32 %t49, 0 + br label %logic.rend1882 +logic.rend1882: + br label %logic.end1881 +logic.end1881: + %t51 = phi i1 [ true, %logic.from1879 ], [ %t50, %logic.rend1882 ] + br label %logic.from1883 +logic.from1883: + br i1 %t51, label %logic.end1885, label %logic.rhs1884 +logic.rhs1884: + %t52 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t52, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.1102, i64 3, i64 0 }, ptr %a54 + %t55 = call i32 @finch_str_eq(ptr %a53, ptr %a54) + %t56 = icmp ne i32 %t55, 0 + br label %logic.rend1886 +logic.rend1886: + br label %logic.end1885 +logic.end1885: + %t57 = phi i1 [ true, %logic.from1883 ], [ %t56, %logic.rend1886 ] + br i1 %t57, label %then1887, label %endif1889 +then1887: + ret i64 32 +endif1889: + ret i64 64 +} + +define internal i1 @finch.gen.widens(%S.ast.Type %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a2 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load %S.ast.Type, ptr %a1 + %t4 = call i1 @finch.gen.isInt(%S.ast.Type %t3) + %t5 = xor i1 %t4, true + br label %logic.from1890 +logic.from1890: + br i1 %t5, label %logic.end1892, label %logic.rhs1891 +logic.rhs1891: + %t6 = load %S.ast.Type, ptr %a2 + %t7 = call i1 @finch.gen.isInt(%S.ast.Type %t6) + %t8 = xor i1 %t7, true + br label %logic.rend1893 +logic.rend1893: + br label %logic.end1892 +logic.end1892: + %t9 = phi i1 [ true, %logic.from1890 ], [ %t8, %logic.rend1893 ] + br i1 %t9, label %then1894, label %endif1896 +then1894: + ret i1 false +endif1896: + %t10 = load %S.ast.Type, ptr %a1 + %t11 = call i1 @finch.gen.isSigned(%S.ast.Type %t10) + br label %logic.from1897 +logic.from1897: + br i1 %t11, label %logic.rhs1898, label %logic.end1899 +logic.rhs1898: + %t12 = load %S.ast.Type, ptr %a2 + %t13 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t12) + br label %logic.rend1900 +logic.rend1900: + br label %logic.end1899 +logic.end1899: + %t14 = phi i1 [ false, %logic.from1897 ], [ %t13, %logic.rend1900 ] + br i1 %t14, label %then1901, label %endif1903 +then1901: + ret i1 false +endif1903: + %t15 = load %S.ast.Type, ptr %a2 + %t16 = call i64 @finch.gen.bitsOf(%S.ast.Type %t15) + %t17 = load %S.ast.Type, ptr %a1 + %t18 = call i64 @finch.gen.bitsOf(%S.ast.Type %t17) + %t19 = icmp sgt i64 %t16, %t18 + ret i1 %t19 +} + +define internal i1 @finch.gen.fits({ ptr, i64, i64 } %p0, %S.ast.Type %p1, %S.ast.Type %p2) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca i64, align 16 + %a13 = alloca i64, align 16 + %a31 = alloca i64, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + %t4 = load %S.ast.Type, ptr %a3 + %t5 = call i1 @finch.gen.isInt(%S.ast.Type %t4) + %t6 = xor i1 %t5, true + br i1 %t6, label %then1904, label %endif1906 +then1904: + ret i1 false +endif1906: + %t7 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = call i64 @finch_str_to_int(ptr %a8, ptr @.str.1103, i64 308) + store i64 %t9, ptr %a10 + %t11 = load %S.ast.Type, ptr %a3 + %t12 = call i64 @finch.gen.bitsOf(%S.ast.Type %t11) + store i64 %t12, ptr %a13 + %t14 = load i64, ptr %a10 + %t15 = icmp slt i64 %t14, 0 + br i1 %t15, label %then1907, label %endif1909 +then1907: + %t16 = load %S.ast.Type, ptr %a3 + %t17 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t16) + br i1 %t17, label %then1910, label %endif1912 +then1910: + ret i1 false +endif1912: + %t18 = load i64, ptr %a13 + %t19 = icmp eq i64 %t18, 64 + br i1 %t19, label %then1913, label %endif1915 +then1913: + ret i1 true +endif1915: + %t20 = load i64, ptr %a10 + %t21 = load i64, ptr %a13 + %t22 = sub i64 %t21, 1 + %t23 = shl i64 1, %t22 + %t24 = sub i64 0, %t23 + %t25 = icmp sge i64 %t20, %t24 + ret i1 %t25 +endif1909: + %t26 = load i64, ptr %a13 + %t27 = icmp eq i64 %t26, 64 + br i1 %t27, label %then1916, label %endif1918 +then1916: + ret i1 true +endif1918: + %t28 = load i64, ptr %a13 + %t29 = shl i64 1, %t28 + %t30 = sub i64 %t29, 1 + store i64 %t30, ptr %a31 + %t32 = load %S.ast.Type, ptr %a3 + %t33 = call i1 @finch.gen.isSigned(%S.ast.Type %t32) + br i1 %t33, label %then1919, label %endif1921 +then1919: + %t34 = load i64, ptr %a13 + %t35 = sub i64 %t34, 1 + %t36 = shl i64 1, %t35 + %t37 = sub i64 %t36, 1 + store i64 %t37, ptr %a31 + br label %endif1921 +endif1921: + %t38 = load i64, ptr %a10 + %t39 = load i64, ptr %a31 + %t40 = icmp sle i64 %t38, %t39 + ret i1 %t40 +} + +define internal i64 @finch.gen.findStruct(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca i64, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic1922, label %ok1923 +panic1922: + call void @finch_panic(ptr @.str.1104, i64 330, ptr @.str.1105) + unreachable +ok1923: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 15 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t6, i32 0, i32 1 + %t8 = load i64, ptr %t7 + store i64 0, ptr %a9 + br label %for.cond1924 +for.cond1924: + %t10 = load i64, ptr %a9 + %t11 = icmp slt i64 %t10, %t8 + br i1 %t11, label %for.body1925, label %for.end1927 +for.body1925: + %t12 = load ptr, ptr %a1 + %t13 = icmp eq ptr %t12, null + br i1 %t13, label %panic1928, label %ok1929 +panic1928: + call void @finch_panic(ptr @.str.1106, i64 331, ptr @.str.1107) + unreachable +ok1929: + %t14 = getelementptr inbounds %S.gen.Gen, ptr %t12, i32 0, i32 15 + %t15 = load i64, ptr %a9 + %t16 = load { ptr, i64, i64 }, ptr %t14 + %t17 = extractvalue { ptr, i64, i64 } %t16, 1 + %t18 = icmp uge i64 %t15, %t17 + br i1 %t18, label %range1930, label %inrange1931 +range1930: + call void @finch_panic_index(ptr @.str.1108, i64 331, i64 %t15, i64 %t17) + unreachable +inrange1931: + %t19 = extractvalue { ptr, i64, i64 } %t16, 0 + %t20 = getelementptr inbounds %S.gen.StructDef, ptr %t19, i64 %t15 + %t21 = getelementptr inbounds %S.gen.StructDef, ptr %t20, i32 0, i32 0 + %t22 = load { ptr, i64, i64 }, ptr %t21 + %t23 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t22, ptr %a24 + store { ptr, i64, i64 } %t23, ptr %a25 + %t26 = call i32 @finch_str_eq(ptr %a24, ptr %a25) + %t27 = icmp ne i32 %t26, 0 + br label %logic.from1932 +logic.from1932: + br i1 %t27, label %logic.rhs1933, label %logic.end1934 +logic.rhs1933: + %t28 = load ptr, ptr %a1 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic1935, label %ok1936 +panic1935: + call void @finch_panic(ptr @.str.1109, i64 331, ptr @.str.1110) + unreachable +ok1936: + %t30 = getelementptr inbounds %S.gen.Gen, ptr %t28, i32 0, i32 15 + %t31 = load i64, ptr %a9 + %t32 = load { ptr, i64, i64 }, ptr %t30 + %t33 = extractvalue { ptr, i64, i64 } %t32, 1 + %t34 = icmp uge i64 %t31, %t33 + br i1 %t34, label %range1937, label %inrange1938 +range1937: + call void @finch_panic_index(ptr @.str.1111, i64 331, i64 %t31, i64 %t33) + unreachable +inrange1938: + %t35 = extractvalue { ptr, i64, i64 } %t32, 0 + %t36 = getelementptr inbounds %S.gen.StructDef, ptr %t35, i64 %t31 + %t37 = getelementptr inbounds %S.gen.StructDef, ptr %t36, i32 0, i32 1 + %t38 = load { ptr, i64, i64 }, ptr %t37 + %t39 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t38, ptr %a40 + store { ptr, i64, i64 } %t39, ptr %a41 + %t42 = call i32 @finch_str_eq(ptr %a40, ptr %a41) + %t43 = icmp ne i32 %t42, 0 + br label %logic.rend1939 +logic.rend1939: + br label %logic.end1934 +logic.end1934: + %t44 = phi i1 [ false, %logic.from1932 ], [ %t43, %logic.rend1939 ] + br i1 %t44, label %then1940, label %endif1942 +then1940: + %t45 = load i64, ptr %a9 + ret i64 %t45 +endif1942: + br label %for.step1926 +for.step1926: + %t46 = load i64, ptr %a9 + %t47 = add i64 %t46, 1 + store i64 %t47, ptr %a9 + br label %for.cond1924 +for.end1927: + ret i64 -1 +} + +define internal i64 @finch.gen.findEnum(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca i64, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic1943, label %ok1944 +panic1943: + call void @finch_panic(ptr @.str.1112, i64 339, ptr @.str.1113) + unreachable +ok1944: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 20 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t6, i32 0, i32 1 + %t8 = load i64, ptr %t7 + store i64 0, ptr %a9 + br label %for.cond1945 +for.cond1945: + %t10 = load i64, ptr %a9 + %t11 = icmp slt i64 %t10, %t8 + br i1 %t11, label %for.body1946, label %for.end1948 +for.body1946: + %t12 = load ptr, ptr %a1 + %t13 = icmp eq ptr %t12, null + br i1 %t13, label %panic1949, label %ok1950 +panic1949: + call void @finch_panic(ptr @.str.1114, i64 340, ptr @.str.1115) + unreachable +ok1950: + %t14 = getelementptr inbounds %S.gen.Gen, ptr %t12, i32 0, i32 20 + %t15 = load i64, ptr %a9 + %t16 = load { ptr, i64, i64 }, ptr %t14 + %t17 = extractvalue { ptr, i64, i64 } %t16, 1 + %t18 = icmp uge i64 %t15, %t17 + br i1 %t18, label %range1951, label %inrange1952 +range1951: + call void @finch_panic_index(ptr @.str.1116, i64 340, i64 %t15, i64 %t17) + unreachable +inrange1952: + %t19 = extractvalue { ptr, i64, i64 } %t16, 0 + %t20 = getelementptr inbounds %S.gen.EnumDef, ptr %t19, i64 %t15 + %t21 = getelementptr inbounds %S.gen.EnumDef, ptr %t20, i32 0, i32 0 + %t22 = load { ptr, i64, i64 }, ptr %t21 + %t23 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t22, ptr %a24 + store { ptr, i64, i64 } %t23, ptr %a25 + %t26 = call i32 @finch_str_eq(ptr %a24, ptr %a25) + %t27 = icmp ne i32 %t26, 0 + br label %logic.from1953 +logic.from1953: + br i1 %t27, label %logic.rhs1954, label %logic.end1955 +logic.rhs1954: + %t28 = load ptr, ptr %a1 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic1956, label %ok1957 +panic1956: + call void @finch_panic(ptr @.str.1117, i64 340, ptr @.str.1118) + unreachable +ok1957: + %t30 = getelementptr inbounds %S.gen.Gen, ptr %t28, i32 0, i32 20 + %t31 = load i64, ptr %a9 + %t32 = load { ptr, i64, i64 }, ptr %t30 + %t33 = extractvalue { ptr, i64, i64 } %t32, 1 + %t34 = icmp uge i64 %t31, %t33 + br i1 %t34, label %range1958, label %inrange1959 +range1958: + call void @finch_panic_index(ptr @.str.1119, i64 340, i64 %t31, i64 %t33) + unreachable +inrange1959: + %t35 = extractvalue { ptr, i64, i64 } %t32, 0 + %t36 = getelementptr inbounds %S.gen.EnumDef, ptr %t35, i64 %t31 + %t37 = getelementptr inbounds %S.gen.EnumDef, ptr %t36, i32 0, i32 1 + %t38 = load { ptr, i64, i64 }, ptr %t37 + %t39 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t38, ptr %a40 + store { ptr, i64, i64 } %t39, ptr %a41 + %t42 = call i32 @finch_str_eq(ptr %a40, ptr %a41) + %t43 = icmp ne i32 %t42, 0 + br label %logic.rend1960 +logic.rend1960: + br label %logic.end1955 +logic.end1955: + %t44 = phi i1 [ false, %logic.from1953 ], [ %t43, %logic.rend1960 ] + br i1 %t44, label %then1961, label %endif1963 +then1961: + %t45 = load i64, ptr %a9 + ret i64 %t45 +endif1963: + br label %for.step1947 +for.step1947: + %t46 = load i64, ptr %a9 + %t47 = add i64 %t46, 1 + store i64 %t47, ptr %a9 + br label %for.cond1945 +for.end1948: + ret i64 -1 +} + +define internal i64 @finch.gen.progOf(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca i64, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic1964, label %ok1965 +panic1964: + call void @finch_panic(ptr @.str.1120, i64 348, ptr @.str.1121) + unreachable +ok1965: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 0 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i32 0, i32 1 + %t7 = load i64, ptr %t6 + store i64 0, ptr %a8 + br label %for.cond1966 +for.cond1966: + %t9 = load i64, ptr %a8 + %t10 = icmp slt i64 %t9, %t7 + br i1 %t10, label %for.body1967, label %for.end1969 +for.body1967: + %t11 = load ptr, ptr %a1 + %t12 = icmp eq ptr %t11, null + br i1 %t12, label %panic1970, label %ok1971 +panic1970: + call void @finch_panic(ptr @.str.1122, i64 349, ptr @.str.1123) + unreachable +ok1971: + %t13 = getelementptr inbounds %S.gen.Gen, ptr %t11, i32 0, i32 0 + %t14 = load i64, ptr %a8 + %t15 = load { ptr, i64, i64 }, ptr %t13 + %t16 = extractvalue { ptr, i64, i64 } %t15, 1 + %t17 = icmp uge i64 %t14, %t16 + br i1 %t17, label %range1972, label %inrange1973 +range1972: + call void @finch_panic_index(ptr @.str.1124, i64 349, i64 %t14, i64 %t16) + unreachable +inrange1973: + %t18 = extractvalue { ptr, i64, i64 } %t15, 0 + %t19 = getelementptr inbounds %S.ast.Program, ptr %t18, i64 %t14 + %t20 = getelementptr inbounds %S.ast.Program, ptr %t19, i32 0, i32 0 + %t21 = load { ptr, i64, i64 }, ptr %t20 + %t22 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } %t22, ptr %a24 + %t25 = call i32 @finch_str_eq(ptr %a23, ptr %a24) + %t26 = icmp ne i32 %t25, 0 + br i1 %t26, label %then1974, label %endif1976 +then1974: + %t27 = load i64, ptr %a8 + ret i64 %t27 +endif1976: + br label %for.step1968 +for.step1968: + %t28 = load i64, ptr %a8 + %t29 = add i64 %t28, 1 + store i64 %t29, ptr %a8 + br label %for.cond1966 +for.end1969: + ret i64 -1 +} + +define internal i1 @finch.gen.imports(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca i64, align 16 + %a23 = alloca i64, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic1977, label %ok1978 +panic1977: + call void @finch_panic(ptr @.str.1125, i64 357, ptr @.str.1126) + unreachable +ok1978: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 0 + %t6 = load ptr, ptr %a1 + %t7 = load ptr, ptr %a1 + %t8 = icmp eq ptr %t7, null + br i1 %t8, label %panic1979, label %ok1980 +panic1979: + call void @finch_panic(ptr @.str.1127, i64 357, ptr @.str.1128) + unreachable +ok1980: + %t9 = getelementptr inbounds %S.gen.Gen, ptr %t7, i32 0, i32 13 + %t10 = load { ptr, i64, i64 }, ptr %t9 + %t11 = call i64 @finch.gen.progOf(ptr %t6, { ptr, i64, i64 } %t10) + %t12 = load { ptr, i64, i64 }, ptr %t5 + %t13 = extractvalue { ptr, i64, i64 } %t12, 1 + %t14 = icmp uge i64 %t11, %t13 + br i1 %t14, label %range1981, label %inrange1982 +range1981: + call void @finch_panic_index(ptr @.str.1129, i64 357, i64 %t11, i64 %t13) + unreachable +inrange1982: + %t15 = extractvalue { ptr, i64, i64 } %t12, 0 + %t16 = getelementptr inbounds %S.ast.Program, ptr %t15, i64 %t11 + %t17 = getelementptr inbounds %S.ast.Program, ptr %t16, i32 0, i32 2 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t17, i32 0, i32 1 + %t19 = load { ptr, i64, i64 }, ptr %a2 + store i64 -1, ptr %a20 + %t21 = load i64, ptr %t18 + %t22 = load ptr, ptr %t17 + store i64 0, ptr %a23 + br label %find.cond1983 +find.cond1983: + %t24 = load i64, ptr %a23 + %t25 = icmp slt i64 %t24, %t21 + br i1 %t25, label %find.body1984, label %find.end1987 +find.body1984: + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i64 %t24 + %t27 = load { ptr, i64, i64 }, ptr %t26 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } %t19, ptr %a29 + %t30 = call i32 @finch_str_eq(ptr %a28, ptr %a29) + %t31 = icmp ne i32 %t30, 0 + br i1 %t31, label %find.hit1985, label %find.next1986 +find.hit1985: + store i64 %t24, ptr %a20 + br label %find.end1987 +find.next1986: + %t32 = add i64 %t24, 1 + store i64 %t32, ptr %a23 + br label %find.cond1983 +find.end1987: + %t33 = load i64, ptr %a20 + %t34 = icmp sge i64 %t33, 0 + ret i1 %t34 +} + +define internal %S.ast.Type @finch.gen.resolve(ptr %p0, %S.ast.Type %p1, %S.ast.Node %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.ast.Node, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca %S.ast.Type, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca %S.ast.Type, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca %S.ast.Type, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca %S.ast.Type, align 16 + %a139 = alloca %S.ast.Type, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca %S.ast.Type, align 16 + %a160 = alloca %S.ast.Type, align 16 + %a177 = alloca i64, align 16 + %a180 = alloca i64, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca i64, align 16 + %a205 = alloca i64, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca %S.ast.Type, align 16 + %a223 = alloca %S.ast.Type, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a231 = alloca i64, align 16 + %a239 = alloca %S.ast.Type, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a355 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a359 = alloca { ptr, i64, i64 }, align 16 + %a360 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a369 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a374 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a414 = alloca { ptr, i64, i64 }, align 16 + %a415 = alloca { ptr, i64, i64 }, align 16 + %a423 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a439 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + store %S.ast.Node %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.1130, i64 5, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br i1 %t9, label %then1988, label %endif1990 +then1988: + %t10 = load ptr, ptr %a1 + %t11 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t12 = load { ptr, i64, i64 }, ptr %t11 + %t13 = extractvalue { ptr, i64, i64 } %t12, 1 + %t14 = icmp uge i64 0, %t13 + br i1 %t14, label %range1991, label %inrange1992 +range1991: + call void @finch_panic_index(ptr @.str.1131, i64 362, i64 0, i64 %t13) + unreachable +inrange1992: + %t15 = extractvalue { ptr, i64, i64 } %t12, 0 + %t16 = getelementptr inbounds %S.ast.Type, ptr %t15, i64 0 + %t17 = load %S.ast.Type, ptr %t16 + %t18 = load %S.ast.Node, ptr %a3 + %t19 = call %S.ast.Type @finch.gen.resolve(ptr %t10, %S.ast.Type %t17, %S.ast.Node %t18) + %t20 = call %S.ast.Type @finch.ast.arrayOf(%S.ast.Type %t19) + ret %S.ast.Type %t20 +endif1990: + %t21 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t22 = load { ptr, i64, i64 }, ptr %t21 + store { ptr, i64, i64 } %t22, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.1132, i64 3, i64 0 }, ptr %a24 + %t25 = call i32 @finch_str_eq(ptr %a23, ptr %a24) + %t26 = icmp ne i32 %t25, 0 + br i1 %t26, label %then1993, label %endif1995 +then1993: + %t27 = load ptr, ptr %a1 + %t28 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t29 = load { ptr, i64, i64 }, ptr %t28 + %t30 = extractvalue { ptr, i64, i64 } %t29, 1 + %t31 = icmp uge i64 0, %t30 + br i1 %t31, label %range1996, label %inrange1997 +range1996: + call void @finch_panic_index(ptr @.str.1133, i64 365, i64 0, i64 %t30) + unreachable +inrange1997: + %t32 = extractvalue { ptr, i64, i64 } %t29, 0 + %t33 = getelementptr inbounds %S.ast.Type, ptr %t32, i64 0 + %t34 = load %S.ast.Type, ptr %t33 + %t35 = load %S.ast.Node, ptr %a3 + %t36 = call %S.ast.Type @finch.gen.resolve(ptr %t27, %S.ast.Type %t34, %S.ast.Node %t35) + store %S.ast.Type %t36, ptr %a37 + %t38 = load %S.ast.Type, ptr %a37 + %t39 = call i1 @finch.gen.isInt(%S.ast.Type %t38) + %t40 = xor i1 %t39, true + br label %logic.from1998 +logic.from1998: + br i1 %t40, label %logic.rhs1999, label %logic.end2000 +logic.rhs1999: + %t41 = getelementptr inbounds %S.ast.Type, ptr %a37, i32 0, i32 0 + %t42 = load { ptr, i64, i64 }, ptr %t41 + store { ptr, i64, i64 } %t42, ptr %a43 + store { ptr, i64, i64 } { ptr @.str.1134, i64 4, i64 0 }, ptr %a44 + %t45 = call i32 @finch_str_eq(ptr %a43, ptr %a44) + %t46 = icmp eq i32 %t45, 0 + br label %logic.rend2001 +logic.rend2001: + br label %logic.end2000 +logic.end2000: + %t47 = phi i1 [ false, %logic.from1998 ], [ %t46, %logic.rend2001 ] + br label %logic.from2002 +logic.from2002: + br i1 %t47, label %logic.rhs2003, label %logic.end2004 +logic.rhs2003: + %t48 = getelementptr inbounds %S.ast.Type, ptr %a37, i32 0, i32 0 + %t49 = load { ptr, i64, i64 }, ptr %t48 + store { ptr, i64, i64 } %t49, ptr %a50 + store { ptr, i64, i64 } { ptr @.str.1135, i64 4, i64 0 }, ptr %a51 + %t52 = call i32 @finch_str_eq(ptr %a50, ptr %a51) + %t53 = icmp eq i32 %t52, 0 + br label %logic.rend2005 +logic.rend2005: + br label %logic.end2004 +logic.end2004: + %t54 = phi i1 [ false, %logic.from2002 ], [ %t53, %logic.rend2005 ] + br label %logic.from2006 +logic.from2006: + br i1 %t54, label %logic.rhs2007, label %logic.end2008 +logic.rhs2007: + %t55 = getelementptr inbounds %S.ast.Type, ptr %a37, i32 0, i32 0 + %t56 = load { ptr, i64, i64 }, ptr %t55 + store { ptr, i64, i64 } %t56, ptr %a57 + store { ptr, i64, i64 } { ptr @.str.1136, i64 3, i64 0 }, ptr %a58 + %t59 = call i32 @finch_str_eq(ptr %a57, ptr %a58) + %t60 = icmp eq i32 %t59, 0 + br label %logic.rend2009 +logic.rend2009: + br label %logic.end2008 +logic.end2008: + %t61 = phi i1 [ false, %logic.from2006 ], [ %t60, %logic.rend2009 ] + br label %logic.from2010 +logic.from2010: + br i1 %t61, label %logic.rhs2011, label %logic.end2012 +logic.rhs2011: + %t62 = getelementptr inbounds %S.ast.Type, ptr %a37, i32 0, i32 0 + %t63 = load { ptr, i64, i64 }, ptr %t62 + store { ptr, i64, i64 } %t63, ptr %a64 + store { ptr, i64, i64 } { ptr @.str.1137, i64 4, i64 0 }, ptr %a65 + %t66 = call i32 @finch_str_eq(ptr %a64, ptr %a65) + %t67 = icmp eq i32 %t66, 0 + br label %logic.rend2013 +logic.rend2013: + br label %logic.end2012 +logic.end2012: + %t68 = phi i1 [ false, %logic.from2010 ], [ %t67, %logic.rend2013 ] + br i1 %t68, label %then2014, label %endif2016 +then2014: + %t69 = load ptr, ptr %a1 + %t70 = load %S.ast.Node, ptr %a3 + %t71 = load %S.ast.Type, ptr %a37 + %t72 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t71) + store { ptr, i64, i64 } { ptr @.str.1138, i64 63, i64 0 }, ptr %a74 + store { ptr, i64, i64 } %t72, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + call void @finch.gen.fail(ptr %t69, %S.ast.Node %t70, { ptr, i64, i64 } %t76) + br label %endif2016 +endif2016: + %t77 = load ptr, ptr %a1 + %t78 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t79 = load { ptr, i64, i64 }, ptr %t78 + %t80 = extractvalue { ptr, i64, i64 } %t79, 1 + %t81 = icmp uge i64 1, %t80 + br i1 %t81, label %range2017, label %inrange2018 +range2017: + call void @finch_panic_index(ptr @.str.1139, i64 369, i64 1, i64 %t80) + unreachable +inrange2018: + %t82 = extractvalue { ptr, i64, i64 } %t79, 0 + %t83 = getelementptr inbounds %S.ast.Type, ptr %t82, i64 1 + %t84 = load %S.ast.Type, ptr %t83 + %t85 = load %S.ast.Node, ptr %a3 + %t86 = call %S.ast.Type @finch.gen.resolve(ptr %t77, %S.ast.Type %t84, %S.ast.Node %t85) + store %S.ast.Type %t86, ptr %a87 + %t88 = getelementptr inbounds %S.ast.Type, ptr %a87, i32 0, i32 0 + %t89 = load { ptr, i64, i64 }, ptr %t88 + store { ptr, i64, i64 } %t89, ptr %a90 + store { ptr, i64, i64 } { ptr @.str.1140, i64 4, i64 0 }, ptr %a91 + %t92 = call i32 @finch_str_eq(ptr %a90, ptr %a91) + %t93 = icmp ne i32 %t92, 0 + br i1 %t93, label %then2019, label %endif2021 +then2019: + %t94 = load ptr, ptr %a1 + %t95 = load %S.ast.Node, ptr %a3 + call void @finch.gen.fail(ptr %t94, %S.ast.Node %t95, { ptr, i64, i64 } { ptr @.str.1141, i64 41, i64 0 }) + br label %endif2021 +endif2021: + %t96 = load %S.ast.Type, ptr %a37 + %t97 = load %S.ast.Type, ptr %a87 + %t98 = call %S.ast.Type @finch.ast.mapOf(%S.ast.Type %t96, %S.ast.Type %t97) + ret %S.ast.Type %t98 +endif1995: + %t99 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t100 = load { ptr, i64, i64 }, ptr %t99 + store { ptr, i64, i64 } %t100, ptr %a101 + store { ptr, i64, i64 } { ptr @.str.1142, i64 5, i64 0 }, ptr %a102 + %t103 = call i32 @finch_str_eq(ptr %a101, ptr %a102) + %t104 = icmp ne i32 %t103, 0 + br i1 %t104, label %then2022, label %endif2024 +then2022: + %t105 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.1143, i64 5, i64 0 }, 0 + %t106 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t107 = load i64, ptr %t106 + %t108 = insertvalue %S.ast.Type %t105, i64 %t107, 4 + store %S.ast.Type %t108, ptr %a109 + %t110 = getelementptr inbounds %S.ast.Type, ptr %a109, i32 0, i32 1 + %t111 = getelementptr inbounds { ptr, i64, i64 }, ptr %t110, i32 0, i32 1 + %t112 = load ptr, ptr %a1 + %t113 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t114 = load { ptr, i64, i64 }, ptr %t113 + %t115 = extractvalue { ptr, i64, i64 } %t114, 1 + %t116 = icmp uge i64 0, %t115 + br i1 %t116, label %range2025, label %inrange2026 +range2025: + call void @finch_panic_index(ptr @.str.1144, i64 377, i64 0, i64 %t115) + unreachable +inrange2026: + %t117 = extractvalue { ptr, i64, i64 } %t114, 0 + %t118 = getelementptr inbounds %S.ast.Type, ptr %t117, i64 0 + %t119 = load %S.ast.Type, ptr %t118 + %t120 = load %S.ast.Node, ptr %a3 + %t121 = call %S.ast.Type @finch.gen.resolve(ptr %t112, %S.ast.Type %t119, %S.ast.Node %t120) + %t122 = load i64, ptr %t111 + %t123 = add i64 %t122, 1 + call void @finch_arr_reserve(ptr %t110, i64 %t123, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t124 = load ptr, ptr %t110 + %t125 = getelementptr inbounds %S.ast.Type, ptr %t124, i64 %t122 + store %S.ast.Type %t121, ptr %t125 + store i64 %t123, ptr %t111 + %t126 = load %S.ast.Type, ptr %a109 + ret %S.ast.Type %t126 +endif2024: + %t127 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t128 = load { ptr, i64, i64 }, ptr %t127 + store { ptr, i64, i64 } %t128, ptr %a129 + store { ptr, i64, i64 } { ptr @.str.1145, i64 3, i64 0 }, ptr %a130 + %t131 = call i32 @finch_str_eq(ptr %a129, ptr %a130) + %t132 = icmp ne i32 %t131, 0 + br i1 %t132, label %then2027, label %endif2029 +then2027: + %t133 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t134 = getelementptr inbounds { ptr, i64, i64 }, ptr %t133, i32 0, i32 1 + %t135 = load i64, ptr %t134 + %t136 = icmp eq i64 %t135, 0 + br i1 %t136, label %then2030, label %endif2032 +then2030: + %t137 = load %S.ast.Type, ptr %a2 + store %S.ast.Type %t137, ptr %a138 + call void @finch.copy.S_ast_Type(ptr %a139, ptr %a138) + %t140 = load %S.ast.Type, ptr %a139 + ret %S.ast.Type %t140 +endif2032: + %t141 = load ptr, ptr %a1 + %t142 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t143 = load { ptr, i64, i64 }, ptr %t142 + %t144 = extractvalue { ptr, i64, i64 } %t143, 1 + %t145 = icmp uge i64 0, %t144 + br i1 %t145, label %range2033, label %inrange2034 +range2033: + call void @finch_panic_index(ptr @.str.1146, i64 384, i64 0, i64 %t144) + unreachable +inrange2034: + %t146 = extractvalue { ptr, i64, i64 } %t143, 0 + %t147 = getelementptr inbounds %S.ast.Type, ptr %t146, i64 0 + %t148 = load %S.ast.Type, ptr %t147 + %t149 = load %S.ast.Node, ptr %a3 + %t150 = call %S.ast.Type @finch.gen.resolve(ptr %t141, %S.ast.Type %t148, %S.ast.Node %t149) + %t151 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t150) + ret %S.ast.Type %t151 +endif2029: + %t152 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t153 = load { ptr, i64, i64 }, ptr %t152 + store { ptr, i64, i64 } %t153, ptr %a154 + store { ptr, i64, i64 } { ptr @.str.1147, i64 5, i64 0 }, ptr %a155 + %t156 = call i32 @finch_str_eq(ptr %a154, ptr %a155) + %t157 = icmp eq i32 %t156, 0 + br i1 %t157, label %then2035, label %endif2037 +then2035: + %t158 = load %S.ast.Type, ptr %a2 + store %S.ast.Type %t158, ptr %a159 + call void @finch.copy.S_ast_Type(ptr %a160, ptr %a159) + %t161 = load %S.ast.Type, ptr %a160 + ret %S.ast.Type %t161 +endif2037: + %t162 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t163 = getelementptr inbounds { ptr, i64, i64 }, ptr %t162, i32 0, i32 1 + %t164 = load i64, ptr %t163 + %t165 = icmp eq i64 %t164, 0 + br label %logic.from2038 +logic.from2038: + br i1 %t165, label %logic.rhs2039, label %logic.end2040 +logic.rhs2039: + %t166 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t167 = getelementptr inbounds { ptr, i64, i64 }, ptr %t166, i32 0, i32 1 + %t168 = load i64, ptr %t167 + %t169 = icmp eq i64 %t168, 0 + br label %logic.rend2041 +logic.rend2041: + br label %logic.end2040 +logic.end2040: + %t170 = phi i1 [ false, %logic.from2038 ], [ %t169, %logic.rend2041 ] + br label %logic.from2042 +logic.from2042: + br i1 %t170, label %logic.rhs2043, label %logic.end2044 +logic.rhs2043: + %t171 = load ptr, ptr %a1 + %t172 = icmp eq ptr %t171, null + br i1 %t172, label %panic2045, label %ok2046 +panic2045: + call void @finch_panic(ptr @.str.1148, i64 390, ptr @.str.1149) + unreachable +ok2046: + %t173 = getelementptr inbounds %S.gen.Gen, ptr %t171, i32 0, i32 17 + %t174 = getelementptr inbounds { ptr, i64, i64 }, ptr %t173, i32 0, i32 1 + %t175 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t176 = load { ptr, i64, i64 }, ptr %t175 + store i64 -1, ptr %a177 + %t178 = load i64, ptr %t174 + %t179 = load ptr, ptr %t173 + store i64 0, ptr %a180 + br label %find.cond2047 +find.cond2047: + %t181 = load i64, ptr %a180 + %t182 = icmp slt i64 %t181, %t178 + br i1 %t182, label %find.body2048, label %find.end2051 +find.body2048: + %t183 = getelementptr inbounds { ptr, i64, i64 }, ptr %t179, i64 %t181 + %t184 = load { ptr, i64, i64 }, ptr %t183 + store { ptr, i64, i64 } %t184, ptr %a185 + store { ptr, i64, i64 } %t176, ptr %a186 + %t187 = call i32 @finch_str_eq(ptr %a185, ptr %a186) + %t188 = icmp ne i32 %t187, 0 + br i1 %t188, label %find.hit2049, label %find.next2050 +find.hit2049: + store i64 %t181, ptr %a177 + br label %find.end2051 +find.next2050: + %t189 = add i64 %t181, 1 + store i64 %t189, ptr %a180 + br label %find.cond2047 +find.end2051: + %t190 = load i64, ptr %a177 + %t191 = icmp sge i64 %t190, 0 + br label %logic.rend2052 +logic.rend2052: + br label %logic.end2044 +logic.end2044: + %t192 = phi i1 [ false, %logic.from2042 ], [ %t191, %logic.rend2052 ] + br i1 %t192, label %then2053, label %endif2055 +then2053: + %t193 = load ptr, ptr %a1 + %t194 = icmp eq ptr %t193, null + br i1 %t194, label %panic2056, label %ok2057 +panic2056: + call void @finch_panic(ptr @.str.1150, i64 391, ptr @.str.1151) + unreachable +ok2057: + %t195 = getelementptr inbounds %S.gen.Gen, ptr %t193, i32 0, i32 18 + %t196 = load ptr, ptr %a1 + %t197 = icmp eq ptr %t196, null + br i1 %t197, label %panic2058, label %ok2059 +panic2058: + call void @finch_panic(ptr @.str.1152, i64 391, ptr @.str.1153) + unreachable +ok2059: + %t198 = getelementptr inbounds %S.gen.Gen, ptr %t196, i32 0, i32 17 + %t199 = getelementptr inbounds { ptr, i64, i64 }, ptr %t198, i32 0, i32 1 + %t200 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t201 = load { ptr, i64, i64 }, ptr %t200 + store i64 -1, ptr %a202 + %t203 = load i64, ptr %t199 + %t204 = load ptr, ptr %t198 + store i64 0, ptr %a205 + br label %find.cond2060 +find.cond2060: + %t206 = load i64, ptr %a205 + %t207 = icmp slt i64 %t206, %t203 + br i1 %t207, label %find.body2061, label %find.end2064 +find.body2061: + %t208 = getelementptr inbounds { ptr, i64, i64 }, ptr %t204, i64 %t206 + %t209 = load { ptr, i64, i64 }, ptr %t208 + store { ptr, i64, i64 } %t209, ptr %a210 + store { ptr, i64, i64 } %t201, ptr %a211 + %t212 = call i32 @finch_str_eq(ptr %a210, ptr %a211) + %t213 = icmp ne i32 %t212, 0 + br i1 %t213, label %find.hit2062, label %find.next2063 +find.hit2062: + store i64 %t206, ptr %a202 + br label %find.end2064 +find.next2063: + %t214 = add i64 %t206, 1 + store i64 %t214, ptr %a205 + br label %find.cond2060 +find.end2064: + %t215 = load i64, ptr %a202 + %t216 = load { ptr, i64, i64 }, ptr %t195 + %t217 = extractvalue { ptr, i64, i64 } %t216, 1 + %t218 = icmp uge i64 %t215, %t217 + br i1 %t218, label %range2065, label %inrange2066 +range2065: + call void @finch_panic_index(ptr @.str.1154, i64 391, i64 %t215, i64 %t217) + unreachable +inrange2066: + %t219 = extractvalue { ptr, i64, i64 } %t216, 0 + %t220 = getelementptr inbounds %S.ast.Type, ptr %t219, i64 %t215 + %t221 = load %S.ast.Type, ptr %t220 + store %S.ast.Type %t221, ptr %a222 + call void @finch.copy.S_ast_Type(ptr %a223, ptr %a222) + %t224 = load %S.ast.Type, ptr %a223 + ret %S.ast.Type %t224 +endif2055: + %t225 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t226 = getelementptr inbounds { ptr, i64, i64 }, ptr %t225, i32 0, i32 1 + %t227 = load i64, ptr %t226 + %t228 = icmp sgt i64 %t227, 0 + br i1 %t228, label %then2067, label %endif2069 +then2067: + store { ptr, i64, i64 } zeroinitializer, ptr %a229 + %t230 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + store i64 0, ptr %a231 + br label %each.cond2070 +each.cond2070: + %t232 = getelementptr inbounds { ptr, i64, i64 }, ptr %t230, i32 0, i32 1 + %t233 = load i64, ptr %t232 + %t234 = load i64, ptr %a231 + %t235 = icmp slt i64 %t234, %t233 + br i1 %t235, label %each.body2071, label %each.end2073 +each.body2071: + %t236 = load ptr, ptr %t230 + %t237 = getelementptr inbounds %S.ast.Type, ptr %t236, i64 %t234 + %t238 = load %S.ast.Type, ptr %t237 + store %S.ast.Type %t238, ptr %a239 + %t240 = getelementptr inbounds { ptr, i64, i64 }, ptr %a229, i32 0, i32 1 + %t241 = load ptr, ptr %a1 + %t242 = load %S.ast.Type, ptr %a239 + %t243 = load %S.ast.Node, ptr %a3 + %t244 = call %S.ast.Type @finch.gen.resolve(ptr %t241, %S.ast.Type %t242, %S.ast.Node %t243) + %t245 = load i64, ptr %t240 + %t246 = add i64 %t245, 1 + call void @finch_arr_reserve(ptr %a229, i64 %t246, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t247 = load ptr, ptr %a229 + %t248 = getelementptr inbounds %S.ast.Type, ptr %t247, i64 %t245 + store %S.ast.Type %t244, ptr %t248 + store i64 %t246, ptr %t240 + br label %each.step2072 +each.step2072: + %t249 = load i64, ptr %a231 + %t250 = add i64 %t249, 1 + store i64 %t250, ptr %a231 + br label %each.cond2070 +each.end2073: + %t251 = load ptr, ptr %a1 + %t252 = icmp eq ptr %t251, null + br i1 %t252, label %panic2074, label %ok2075 +panic2074: + call void @finch_panic(ptr @.str.1155, i64 399, ptr @.str.1156) + unreachable +ok2075: + %t253 = getelementptr inbounds %S.gen.Gen, ptr %t251, i32 0, i32 13 + %t254 = load { ptr, i64, i64 }, ptr %t253 + store { ptr, i64, i64 } %t254, ptr %a255 + call void @finch_str_copy(ptr %a256, ptr %a255) + %t257 = load { ptr, i64, i64 }, ptr %a256 + store { ptr, i64, i64 } %t257, ptr %a258 + %t259 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t260 = getelementptr inbounds { ptr, i64, i64 }, ptr %t259, i32 0, i32 1 + %t261 = load i64, ptr %t260 + %t262 = icmp sgt i64 %t261, 0 + br i1 %t262, label %then2076, label %endif2078 +then2076: + %t263 = load ptr, ptr %a1 + %t264 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t265 = load { ptr, i64, i64 }, ptr %t264 + %t266 = call i1 @finch.gen.imports(ptr %t263, { ptr, i64, i64 } %t265) + %t267 = xor i1 %t266, true + br i1 %t267, label %then2079, label %endif2081 +then2079: + %t268 = load ptr, ptr %a1 + %t269 = load %S.ast.Node, ptr %a3 + %t270 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t271 = load { ptr, i64, i64 }, ptr %t270 + store { ptr, i64, i64 } { ptr @.str.1157, i64 1, i64 0 }, ptr %a273 + store { ptr, i64, i64 } %t271, ptr %a274 + call void @finch_str_concat(ptr %a272, ptr %a273, ptr %a274) + %t275 = load { ptr, i64, i64 }, ptr %a272 + store { ptr, i64, i64 } %t275, ptr %a277 + store { ptr, i64, i64 } { ptr @.str.1158, i64 36, i64 0 }, ptr %a278 + call void @finch_str_concat(ptr %a276, ptr %a277, ptr %a278) + %t279 = load { ptr, i64, i64 }, ptr %a276 + %t280 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t281 = load { ptr, i64, i64 }, ptr %t280 + store { ptr, i64, i64 } %t279, ptr %a283 + store { ptr, i64, i64 } %t281, ptr %a284 + call void @finch_str_concat(ptr %a282, ptr %a283, ptr %a284) + %t285 = load { ptr, i64, i64 }, ptr %a282 + store { ptr, i64, i64 } %t285, ptr %a287 + store { ptr, i64, i64 } { ptr @.str.1159, i64 1, i64 0 }, ptr %a288 + call void @finch_str_concat(ptr %a286, ptr %a287, ptr %a288) + %t289 = load { ptr, i64, i64 }, ptr %a286 + call void @finch.gen.fail(ptr %t268, %S.ast.Node %t269, { ptr, i64, i64 } %t289) + br label %endif2081 +endif2081: + %t290 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t291 = load { ptr, i64, i64 }, ptr %t290 + store { ptr, i64, i64 } %t291, ptr %a292 + call void @finch_str_copy(ptr %a293, ptr %a292) + %t294 = load { ptr, i64, i64 }, ptr %a293 + store { ptr, i64, i64 } %t294, ptr %a258 + br label %endif2078 +endif2078: + %t295 = load ptr, ptr %a1 + %t296 = load { ptr, i64, i64 }, ptr %a258 + %t297 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t298 = load { ptr, i64, i64 }, ptr %t297 + %t299 = load { ptr, i64, i64 }, ptr %a229 + %t300 = load %S.ast.Node, ptr %a3 + %t301 = call %S.ast.Type @finch.gen.instStruct(ptr %t295, { ptr, i64, i64 } %t296, { ptr, i64, i64 } %t298, { ptr, i64, i64 } %t299, %S.ast.Node %t300) + ret %S.ast.Type %t301 +endif2069: + %t302 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t303 = load { ptr, i64, i64 }, ptr %t302 + store { ptr, i64, i64 } %t303, ptr %a304 + store { ptr, i64, i64 } { ptr @.str.1160, i64 1, i64 0 }, ptr %a305 + %t306 = call i32 @finch_str_eq(ptr %a304, ptr %a305) + %t307 = icmp ne i32 %t306, 0 + br i1 %t307, label %then2082, label %endif2084 +then2082: + %t308 = load ptr, ptr %a1 + %t309 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t310 = load { ptr, i64, i64 }, ptr %t309 + %t311 = call i64 @finch.gen.findStruct(ptr %t308, { ptr, i64, i64 } { ptr @.str.1161, i64 1, i64 0 }, { ptr, i64, i64 } %t310) + %t312 = icmp slt i64 %t311, 0 + br i1 %t312, label %then2085, label %endif2087 +then2085: + %t313 = load ptr, ptr %a1 + %t314 = load %S.ast.Node, ptr %a3 + %t315 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t316 = load { ptr, i64, i64 }, ptr %t315 + store { ptr, i64, i64 } { ptr @.str.1162, i64 28, i64 0 }, ptr %a318 + store { ptr, i64, i64 } %t316, ptr %a319 + call void @finch_str_concat(ptr %a317, ptr %a318, ptr %a319) + %t320 = load { ptr, i64, i64 }, ptr %a317 + store { ptr, i64, i64 } %t320, ptr %a322 + store { ptr, i64, i64 } { ptr @.str.1163, i64 1, i64 0 }, ptr %a323 + call void @finch_str_concat(ptr %a321, ptr %a322, ptr %a323) + %t324 = load { ptr, i64, i64 }, ptr %a321 + call void @finch.gen.fail(ptr %t313, %S.ast.Node %t314, { ptr, i64, i64 } %t324) + br label %endif2087 +endif2087: + %t325 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.1164, i64 6, i64 0 }, 0 + %t326 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t327 = load { ptr, i64, i64 }, ptr %t326 + store { ptr, i64, i64 } %t327, ptr %a328 + call void @finch_str_copy(ptr %a329, ptr %a328) + %t330 = load { ptr, i64, i64 }, ptr %a329 + %t331 = insertvalue %S.ast.Type %t325, { ptr, i64, i64 } %t330, 2 + %t332 = insertvalue %S.ast.Type %t331, { ptr, i64, i64 } { ptr @.str.1165, i64 1, i64 0 }, 3 + ret %S.ast.Type %t332 +endif2084: + %t333 = load ptr, ptr %a1 + %t334 = icmp eq ptr %t333, null + br i1 %t334, label %panic2088, label %ok2089 +panic2088: + call void @finch_panic(ptr @.str.1166, i64 414, ptr @.str.1167) + unreachable +ok2089: + %t335 = getelementptr inbounds %S.gen.Gen, ptr %t333, i32 0, i32 13 + %t336 = load { ptr, i64, i64 }, ptr %t335 + store { ptr, i64, i64 } %t336, ptr %a337 + call void @finch_str_copy(ptr %a338, ptr %a337) + %t339 = load { ptr, i64, i64 }, ptr %a338 + store { ptr, i64, i64 } %t339, ptr %a340 + %t341 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t342 = getelementptr inbounds { ptr, i64, i64 }, ptr %t341, i32 0, i32 1 + %t343 = load i64, ptr %t342 + %t344 = icmp sgt i64 %t343, 0 + br i1 %t344, label %then2090, label %endif2092 +then2090: + %t345 = load ptr, ptr %a1 + %t346 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t347 = load { ptr, i64, i64 }, ptr %t346 + %t348 = call i1 @finch.gen.imports(ptr %t345, { ptr, i64, i64 } %t347) + %t349 = xor i1 %t348, true + br i1 %t349, label %then2093, label %endif2095 +then2093: + %t350 = load ptr, ptr %a1 + %t351 = load %S.ast.Node, ptr %a3 + %t352 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t353 = load { ptr, i64, i64 }, ptr %t352 + store { ptr, i64, i64 } { ptr @.str.1168, i64 1, i64 0 }, ptr %a355 + store { ptr, i64, i64 } %t353, ptr %a356 + call void @finch_str_concat(ptr %a354, ptr %a355, ptr %a356) + %t357 = load { ptr, i64, i64 }, ptr %a354 + store { ptr, i64, i64 } %t357, ptr %a359 + store { ptr, i64, i64 } { ptr @.str.1169, i64 36, i64 0 }, ptr %a360 + call void @finch_str_concat(ptr %a358, ptr %a359, ptr %a360) + %t361 = load { ptr, i64, i64 }, ptr %a358 + %t362 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t363 = load { ptr, i64, i64 }, ptr %t362 + store { ptr, i64, i64 } %t361, ptr %a365 + store { ptr, i64, i64 } %t363, ptr %a366 + call void @finch_str_concat(ptr %a364, ptr %a365, ptr %a366) + %t367 = load { ptr, i64, i64 }, ptr %a364 + store { ptr, i64, i64 } %t367, ptr %a369 + store { ptr, i64, i64 } { ptr @.str.1170, i64 1, i64 0 }, ptr %a370 + call void @finch_str_concat(ptr %a368, ptr %a369, ptr %a370) + %t371 = load { ptr, i64, i64 }, ptr %a368 + call void @finch.gen.fail(ptr %t350, %S.ast.Node %t351, { ptr, i64, i64 } %t371) + br label %endif2095 +endif2095: + %t372 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t373 = load { ptr, i64, i64 }, ptr %t372 + store { ptr, i64, i64 } %t373, ptr %a374 + call void @finch_str_copy(ptr %a375, ptr %a374) + %t376 = load { ptr, i64, i64 }, ptr %a375 + store { ptr, i64, i64 } %t376, ptr %a340 + br label %endif2092 +endif2092: + %t377 = load ptr, ptr %a1 + %t378 = load { ptr, i64, i64 }, ptr %a340 + %t379 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t380 = load { ptr, i64, i64 }, ptr %t379 + %t381 = call i64 @finch.gen.findEnum(ptr %t377, { ptr, i64, i64 } %t378, { ptr, i64, i64 } %t380) + %t382 = icmp sge i64 %t381, 0 + br i1 %t382, label %then2096, label %endif2098 +then2096: + %t383 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.1171, i64 4, i64 0 }, 0 + %t384 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t385 = load { ptr, i64, i64 }, ptr %t384 + store { ptr, i64, i64 } %t385, ptr %a386 + call void @finch_str_copy(ptr %a387, ptr %a386) + %t388 = load { ptr, i64, i64 }, ptr %a387 + %t389 = insertvalue %S.ast.Type %t383, { ptr, i64, i64 } %t388, 2 + %t390 = load { ptr, i64, i64 }, ptr %a340 + store { ptr, i64, i64 } %t390, ptr %a391 + call void @finch_str_copy(ptr %a392, ptr %a391) + %t393 = load { ptr, i64, i64 }, ptr %a392 + %t394 = insertvalue %S.ast.Type %t389, { ptr, i64, i64 } %t393, 3 + ret %S.ast.Type %t394 +endif2098: + %t395 = load ptr, ptr %a1 + %t396 = load { ptr, i64, i64 }, ptr %a340 + %t397 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t398 = load { ptr, i64, i64 }, ptr %t397 + %t399 = call i64 @finch.gen.findStruct(ptr %t395, { ptr, i64, i64 } %t396, { ptr, i64, i64 } %t398) + %t400 = icmp slt i64 %t399, 0 + br i1 %t400, label %then2099, label %endif2101 +then2099: + %t401 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t402 = getelementptr inbounds { ptr, i64, i64 }, ptr %t401, i32 0, i32 1 + %t403 = load i64, ptr %t402 + %t404 = icmp eq i64 %t403, 0 + br label %logic.from2102 +logic.from2102: + br i1 %t404, label %logic.rhs2103, label %logic.end2104 +logic.rhs2103: + %t405 = load ptr, ptr %a1 + %t406 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t407 = load { ptr, i64, i64 }, ptr %t406 + %t408 = call i64 @finch.gen.findStruct(ptr %t405, { ptr, i64, i64 } { ptr @.str.1172, i64 1, i64 0 }, { ptr, i64, i64 } %t407) + %t409 = icmp sge i64 %t408, 0 + br label %logic.rend2105 +logic.rend2105: + br label %logic.end2104 +logic.end2104: + %t410 = phi i1 [ false, %logic.from2102 ], [ %t409, %logic.rend2105 ] + br i1 %t410, label %then2106, label %endif2108 +then2106: + %t411 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.1173, i64 6, i64 0 }, 0 + %t412 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t413 = load { ptr, i64, i64 }, ptr %t412 + store { ptr, i64, i64 } %t413, ptr %a414 + call void @finch_str_copy(ptr %a415, ptr %a414) + %t416 = load { ptr, i64, i64 }, ptr %a415 + %t417 = insertvalue %S.ast.Type %t411, { ptr, i64, i64 } %t416, 2 + %t418 = insertvalue %S.ast.Type %t417, { ptr, i64, i64 } { ptr @.str.1174, i64 1, i64 0 }, 3 + ret %S.ast.Type %t418 +endif2108: + %t419 = load ptr, ptr %a1 + %t420 = load %S.ast.Node, ptr %a3 + %t421 = load %S.ast.Type, ptr %a2 + %t422 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t421) + store { ptr, i64, i64 } { ptr @.str.1175, i64 24, i64 0 }, ptr %a424 + store { ptr, i64, i64 } %t422, ptr %a425 + call void @finch_str_concat(ptr %a423, ptr %a424, ptr %a425) + %t426 = load { ptr, i64, i64 }, ptr %a423 + store { ptr, i64, i64 } %t426, ptr %a428 + store { ptr, i64, i64 } { ptr @.str.1176, i64 1, i64 0 }, ptr %a429 + call void @finch_str_concat(ptr %a427, ptr %a428, ptr %a429) + %t430 = load { ptr, i64, i64 }, ptr %a427 + call void @finch.gen.fail(ptr %t419, %S.ast.Node %t420, { ptr, i64, i64 } %t430) + br label %endif2101 +endif2101: + %t431 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.1177, i64 6, i64 0 }, 0 + %t432 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t433 = load { ptr, i64, i64 }, ptr %t432 + store { ptr, i64, i64 } %t433, ptr %a434 + call void @finch_str_copy(ptr %a435, ptr %a434) + %t436 = load { ptr, i64, i64 }, ptr %a435 + %t437 = insertvalue %S.ast.Type %t431, { ptr, i64, i64 } %t436, 2 + %t438 = load { ptr, i64, i64 }, ptr %a340 + store { ptr, i64, i64 } %t438, ptr %a439 + call void @finch_str_copy(ptr %a440, ptr %a439) + %t441 = load { ptr, i64, i64 }, ptr %a440 + %t442 = insertvalue %S.ast.Type %t437, { ptr, i64, i64 } %t441, 3 + ret %S.ast.Type %t442 +} + +define internal { ptr, i64, i64 } @finch.gen.mangle({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.1179, i64 1, i64 0 }, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.1180, i64 1, i64 0 }, ptr %a6 + call void @finch_str_replace(ptr %a4, ptr %a3, ptr %a5, ptr %a6) + %t7 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.1182, i64 1, i64 0 }, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1183, i64 0, i64 0 }, ptr %a11 + call void @finch_str_replace(ptr %a9, ptr %a8, ptr %a10, ptr %a11) + %t12 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.1185, i64 1, i64 0 }, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.1186, i64 1, i64 0 }, ptr %a16 + call void @finch_str_replace(ptr %a14, ptr %a13, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t17, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.1188, i64 1, i64 0 }, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.1189, i64 0, i64 0 }, ptr %a21 + call void @finch_str_replace(ptr %a19, ptr %a18, ptr %a20, ptr %a21) + %t22 = load { ptr, i64, i64 }, ptr %a19 + ret { ptr, i64, i64 } %t22 +} + +define internal { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t3 = load i64, ptr %t2 + %t4 = icmp eq i64 %t3, 0 + br i1 %t4, label %then2109, label %endif2111 +then2109: + ret { ptr, i64, i64 } { ptr @.str.1190, i64 4, i64 0 } +endif2111: + %t5 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t5, ptr %a6 + call void @finch_str_copy(ptr %a7, ptr %a6) + %t8 = load { ptr, i64, i64 }, ptr %a7 + ret { ptr, i64, i64 } %t8 +} + +define internal { ptr, i64, i64 } @finch.gen.llty(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch_str_copy(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1191, i64 4, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br i1 %t13, label %then2112, label %endif2114 +then2112: + ret { ptr, i64, i64 } { ptr @.str.1192, i64 2, i64 0 } +endif2114: + %t14 = load %S.ast.Type, ptr %a2 + %t15 = call i1 @finch.gen.isInt(%S.ast.Type %t14) + br label %logic.from2115 +logic.from2115: + br i1 %t15, label %logic.end2117, label %logic.rhs2116 +logic.rhs2116: + %t16 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t16, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.1193, i64 4, i64 0 }, ptr %a18 + %t19 = call i32 @finch_str_eq(ptr %a17, ptr %a18) + %t20 = icmp ne i32 %t19, 0 + br label %logic.rend2118 +logic.rend2118: + br label %logic.end2117 +logic.end2117: + %t21 = phi i1 [ true, %logic.from2115 ], [ %t20, %logic.rend2118 ] + br i1 %t21, label %then2119, label %endif2121 +then2119: + %t22 = load %S.ast.Type, ptr %a2 + %t23 = call i64 @finch.gen.bitsOf(%S.ast.Type %t22) + call void @finch_str_from_int(ptr %a24, i64 %t23) + %t25 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.1194, i64 1, i64 0 }, ptr %a27 + store { ptr, i64, i64 } %t25, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + ret { ptr, i64, i64 } %t29 +endif2121: + %t30 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t30, ptr %a31 + store { ptr, i64, i64 } { ptr @.str.1195, i64 5, i64 0 }, ptr %a32 + %t33 = call i32 @finch_str_eq(ptr %a31, ptr %a32) + %t34 = icmp ne i32 %t33, 0 + br i1 %t34, label %then2122, label %endif2124 +then2122: + ret { ptr, i64, i64 } { ptr @.str.1196, i64 6, i64 0 } +endif2124: + %t35 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t35, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.1197, i64 3, i64 0 }, ptr %a37 + %t38 = call i32 @finch_str_eq(ptr %a36, ptr %a37) + %t39 = icmp ne i32 %t38, 0 + br i1 %t39, label %then2125, label %endif2127 +then2125: + ret { ptr, i64, i64 } { ptr @.str.1198, i64 5, i64 0 } +endif2127: + %t40 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t40, ptr %a41 + store { ptr, i64, i64 } { ptr @.str.1199, i64 3, i64 0 }, ptr %a42 + %t43 = call i32 @finch_str_eq(ptr %a41, ptr %a42) + %t44 = icmp ne i32 %t43, 0 + br label %logic.from2128 +logic.from2128: + br i1 %t44, label %logic.end2130, label %logic.rhs2129 +logic.rhs2129: + %t45 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t45, ptr %a46 + store { ptr, i64, i64 } { ptr @.str.1200, i64 5, i64 0 }, ptr %a47 + %t48 = call i32 @finch_str_eq(ptr %a46, ptr %a47) + %t49 = icmp ne i32 %t48, 0 + br label %logic.rend2131 +logic.rend2131: + br label %logic.end2130 +logic.end2130: + %t50 = phi i1 [ true, %logic.from2128 ], [ %t49, %logic.rend2131 ] + br i1 %t50, label %then2132, label %endif2134 +then2132: + ret { ptr, i64, i64 } { ptr @.str.1201, i64 17, i64 0 } +endif2134: + %t51 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t51, ptr %a52 + store { ptr, i64, i64 } { ptr @.str.1202, i64 3, i64 0 }, ptr %a53 + %t54 = call i32 @finch_str_eq(ptr %a52, ptr %a53) + %t55 = icmp ne i32 %t54, 0 + br i1 %t55, label %then2135, label %endif2137 +then2135: + ret { ptr, i64, i64 } { ptr @.str.1203, i64 37, i64 0 } +endif2137: + %t56 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t56, ptr %a57 + store { ptr, i64, i64 } { ptr @.str.1204, i64 5, i64 0 }, ptr %a58 + %t59 = call i32 @finch_str_eq(ptr %a57, ptr %a58) + %t60 = icmp ne i32 %t59, 0 + br i1 %t60, label %then2138, label %endif2140 +then2138: + %t61 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t62 = load i64, ptr %t61 + call void @finch_str_from_int(ptr %a63, i64 %t62) + %t64 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.1205, i64 1, i64 0 }, ptr %a66 + store { ptr, i64, i64 } %t64, ptr %a67 + call void @finch_str_concat(ptr %a65, ptr %a66, ptr %a67) + %t68 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t68, ptr %a70 + store { ptr, i64, i64 } { ptr @.str.1206, i64 3, i64 0 }, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + %t73 = load ptr, ptr %a1 + %t74 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t75 = load { ptr, i64, i64 }, ptr %t74 + %t76 = extractvalue { ptr, i64, i64 } %t75, 1 + %t77 = icmp uge i64 0, %t76 + br i1 %t77, label %range2141, label %inrange2142 +range2141: + call void @finch_panic_index(ptr @.str.1207, i64 467, i64 0, i64 %t76) + unreachable +inrange2142: + %t78 = extractvalue { ptr, i64, i64 } %t75, 0 + %t79 = getelementptr inbounds %S.ast.Type, ptr %t78, i64 0 + %t80 = load %S.ast.Type, ptr %t79 + %t81 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t73, %S.ast.Type %t80) + store { ptr, i64, i64 } %t72, ptr %a83 + store { ptr, i64, i64 } %t81, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t85, ptr %a87 + store { ptr, i64, i64 } { ptr @.str.1208, i64 1, i64 0 }, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + ret { ptr, i64, i64 } %t89 +endif2140: + %t90 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t90, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.1209, i64 4, i64 0 }, ptr %a92 + %t93 = call i32 @finch_str_eq(ptr %a91, ptr %a92) + %t94 = icmp ne i32 %t93, 0 + br i1 %t94, label %then2143, label %endif2145 +then2143: + ret { ptr, i64, i64 } { ptr @.str.1210, i64 3, i64 0 } +endif2145: + %t95 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t95, ptr %a96 + store { ptr, i64, i64 } { ptr @.str.1211, i64 3, i64 0 }, ptr %a97 + %t98 = call i32 @finch_str_eq(ptr %a96, ptr %a97) + %t99 = icmp ne i32 %t98, 0 + br label %logic.from2146 +logic.from2146: + br i1 %t99, label %logic.end2148, label %logic.rhs2147 +logic.rhs2147: + %t100 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t100, ptr %a101 + store { ptr, i64, i64 } { ptr @.str.1212, i64 4, i64 0 }, ptr %a102 + %t103 = call i32 @finch_str_eq(ptr %a101, ptr %a102) + %t104 = icmp ne i32 %t103, 0 + br label %logic.rend2149 +logic.rend2149: + br label %logic.end2148 +logic.end2148: + %t105 = phi i1 [ true, %logic.from2146 ], [ %t104, %logic.rend2149 ] + br i1 %t105, label %then2150, label %endif2152 +then2150: + ret { ptr, i64, i64 } { ptr @.str.1213, i64 3, i64 0 } +endif2152: + %t106 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t106, ptr %a107 + store { ptr, i64, i64 } { ptr @.str.1214, i64 4, i64 0 }, ptr %a108 + %t109 = call i32 @finch_str_eq(ptr %a107, ptr %a108) + %t110 = icmp ne i32 %t109, 0 + br i1 %t110, label %then2153, label %endif2155 +then2153: + ret { ptr, i64, i64 } { ptr @.str.1215, i64 4, i64 0 } +endif2155: + %t111 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t112 = load { ptr, i64, i64 }, ptr %t111 + %t113 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t112) + store { ptr, i64, i64 } { ptr @.str.1216, i64 3, i64 0 }, ptr %a115 + store { ptr, i64, i64 } %t113, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + store { ptr, i64, i64 } %t117, ptr %a119 + store { ptr, i64, i64 } { ptr @.str.1217, i64 1, i64 0 }, ptr %a120 + call void @finch_str_concat(ptr %a118, ptr %a119, ptr %a120) + %t121 = load { ptr, i64, i64 }, ptr %a118 + %t122 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t123 = load { ptr, i64, i64 }, ptr %t122 + %t124 = call { ptr, i64, i64 } @finch.gen.mangle({ ptr, i64, i64 } %t123) + store { ptr, i64, i64 } %t121, ptr %a126 + store { ptr, i64, i64 } %t124, ptr %a127 + call void @finch_str_concat(ptr %a125, ptr %a126, ptr %a127) + %t128 = load { ptr, i64, i64 }, ptr %a125 + ret { ptr, i64, i64 } %t128 +} + +define internal { ptr, i64, i64 } @finch.gen.retTy(ptr %p0, %S.gen.FnSig %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.FnSig, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.gen.FnSig %p1, ptr %a2 + %t3 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 9 + %t4 = load i1, ptr %t3 + %t5 = xor i1 %t4, true + br i1 %t5, label %then2156, label %endif2158 +then2156: + %t6 = load ptr, ptr %a1 + %t7 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t8 = load %S.ast.Type, ptr %t7 + %t9 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t6, %S.ast.Type %t8) + ret { ptr, i64, i64 } %t9 +endif2158: + store { ptr, i64, i64 } { ptr @.str.1218, i64 2, i64 0 }, ptr %a10 + %t11 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t12 = getelementptr inbounds %S.ast.Type, ptr %t11, i32 0, i32 0 + %t13 = load { ptr, i64, i64 }, ptr %t12 + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.1219, i64 4, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp eq i32 %t16, 0 + br i1 %t17, label %then2159, label %endif2161 +then2159: + %t18 = load ptr, ptr %a1 + %t19 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t20 = load %S.ast.Type, ptr %t19 + %t21 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t18, %S.ast.Type %t20) + store { ptr, i64, i64 } %t21, ptr %a10 + br label %endif2161 +endif2161: + %t22 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1220, i64 6, i64 0 }, ptr %a24 + store { ptr, i64, i64 } %t22, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t26, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.1221, i64 21, i64 0 }, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + ret { ptr, i64, i64 } %t30 +} + +define internal { ptr, i64, i64 } @finch.gen.nodeKey(%S.ast.Node %p0) { +entry: + %a1 = alloca %S.ast.Node, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Node %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.1222, i64 1, i64 0 }, ptr %a6 + call void @finch_str_concat(ptr %a4, ptr %a5, ptr %a6) + %t7 = load { ptr, i64, i64 }, ptr %a4 + %t8 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 11 + %t9 = load i64, ptr %t8 + call void @finch_str_from_int(ptr %a10, i64 %t9) + %t11 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t7, ptr %a13 + store { ptr, i64, i64 } %t11, ptr %a14 + call void @finch_str_concat(ptr %a12, ptr %a13, ptr %a14) + %t15 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t15, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.1223, i64 1, i64 0 }, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + %t20 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 12 + %t21 = load i64, ptr %t20 + call void @finch_str_from_int(ptr %a22, i64 %t21) + %t23 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t19, ptr %a25 + store { ptr, i64, i64 } %t23, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t27, ptr %a29 + store { ptr, i64, i64 } { ptr @.str.1224, i64 1, i64 0 }, ptr %a30 + call void @finch_str_concat(ptr %a28, ptr %a29, ptr %a30) + %t31 = load { ptr, i64, i64 }, ptr %a28 + %t32 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 13 + %t33 = load i64, ptr %t32 + call void @finch_str_from_int(ptr %a34, i64 %t33) + %t35 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t31, ptr %a37 + store { ptr, i64, i64 } %t35, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + ret { ptr, i64, i64 } %t39 +} + +define internal { ptr, i64, i64 } @finch.gen.zeroOf(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + call void @finch_str_copy(ptr %a5, ptr %a4) + %t6 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t6, ptr %a7 + %t8 = load %S.ast.Type, ptr %a1 + %t9 = call i1 @finch.gen.isInt(%S.ast.Type %t8) + br label %logic.from2162 +logic.from2162: + br i1 %t9, label %logic.end2164, label %logic.rhs2163 +logic.rhs2163: + %t10 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t10, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.1225, i64 4, i64 0 }, ptr %a12 + %t13 = call i32 @finch_str_eq(ptr %a11, ptr %a12) + %t14 = icmp ne i32 %t13, 0 + br label %logic.rend2165 +logic.rend2165: + br label %logic.end2164 +logic.end2164: + %t15 = phi i1 [ true, %logic.from2162 ], [ %t14, %logic.rend2165 ] + br label %logic.from2166 +logic.from2166: + br i1 %t15, label %logic.end2168, label %logic.rhs2167 +logic.rhs2167: + %t16 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t16, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.1226, i64 4, i64 0 }, ptr %a18 + %t19 = call i32 @finch_str_eq(ptr %a17, ptr %a18) + %t20 = icmp ne i32 %t19, 0 + br label %logic.rend2169 +logic.rend2169: + br label %logic.end2168 +logic.end2168: + %t21 = phi i1 [ true, %logic.from2166 ], [ %t20, %logic.rend2169 ] + br i1 %t21, label %then2170, label %endif2172 +then2170: + ret { ptr, i64, i64 } { ptr @.str.1227, i64 1, i64 0 } +endif2172: + %t22 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t22, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.1228, i64 4, i64 0 }, ptr %a24 + %t25 = call i32 @finch_str_eq(ptr %a23, ptr %a24) + %t26 = icmp ne i32 %t25, 0 + br i1 %t26, label %then2173, label %endif2175 +then2173: + ret { ptr, i64, i64 } { ptr @.str.1229, i64 5, i64 0 } +endif2175: + %t27 = load %S.ast.Type, ptr %a1 + %t28 = call i1 @finch.gen.isFloat(%S.ast.Type %t27) + br i1 %t28, label %then2176, label %endif2178 +then2176: + ret { ptr, i64, i64 } { ptr @.str.1230, i64 3, i64 0 } +endif2178: + %t29 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t29, ptr %a30 + store { ptr, i64, i64 } { ptr @.str.1231, i64 3, i64 0 }, ptr %a31 + %t32 = call i32 @finch_str_eq(ptr %a30, ptr %a31) + %t33 = icmp ne i32 %t32, 0 + br label %logic.from2179 +logic.from2179: + br i1 %t33, label %logic.end2181, label %logic.rhs2180 +logic.rhs2180: + %t34 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t34, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.1232, i64 4, i64 0 }, ptr %a36 + %t37 = call i32 @finch_str_eq(ptr %a35, ptr %a36) + %t38 = icmp ne i32 %t37, 0 + br label %logic.rend2182 +logic.rend2182: + br label %logic.end2181 +logic.end2181: + %t39 = phi i1 [ true, %logic.from2179 ], [ %t38, %logic.rend2182 ] + br i1 %t39, label %then2183, label %endif2185 +then2183: + ret { ptr, i64, i64 } { ptr @.str.1233, i64 4, i64 0 } +endif2185: + ret { ptr, i64, i64 } { ptr @.str.1234, i64 15, i64 0 } +} + +define internal { ptr, i64, i64 } @finch.gen.sizeOf(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load %S.ast.Type, ptr %a2 + %t5 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t3, %S.ast.Type %t4) + store { ptr, i64, i64 } { ptr @.str.1235, i64 29, i64 0 }, ptr %a7 + store { ptr, i64, i64 } %t5, ptr %a8 + call void @finch_str_concat(ptr %a6, ptr %a7, ptr %a8) + %t9 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t9, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.1236, i64 26, i64 0 }, ptr %a12 + call void @finch_str_concat(ptr %a10, ptr %a11, ptr %a12) + %t13 = load { ptr, i64, i64 }, ptr %a10 + ret { ptr, i64, i64 } %t13 +} + +define internal i1 @finch.gen.owning(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.1237, i64 3, i64 0 }, ptr %a6 + %t7 = call i32 @finch_str_eq(ptr %a5, ptr %a6) + %t8 = icmp ne i32 %t7, 0 + br label %logic.from2186 +logic.from2186: + br i1 %t8, label %logic.end2188, label %logic.rhs2187 +logic.rhs2187: + %t9 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t10 = load { ptr, i64, i64 }, ptr %t9 + store { ptr, i64, i64 } %t10, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.1238, i64 5, i64 0 }, ptr %a12 + %t13 = call i32 @finch_str_eq(ptr %a11, ptr %a12) + %t14 = icmp ne i32 %t13, 0 + br label %logic.rend2189 +logic.rend2189: + br label %logic.end2188 +logic.end2188: + %t15 = phi i1 [ true, %logic.from2186 ], [ %t14, %logic.rend2189 ] + br label %logic.from2190 +logic.from2190: + br i1 %t15, label %logic.end2192, label %logic.rhs2191 +logic.rhs2191: + %t16 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t17 = load { ptr, i64, i64 }, ptr %t16 + store { ptr, i64, i64 } %t17, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.1239, i64 3, i64 0 }, ptr %a19 + %t20 = call i32 @finch_str_eq(ptr %a18, ptr %a19) + %t21 = icmp ne i32 %t20, 0 + br label %logic.rend2193 +logic.rend2193: + br label %logic.end2192 +logic.end2192: + %t22 = phi i1 [ true, %logic.from2190 ], [ %t21, %logic.rend2193 ] + br i1 %t22, label %then2194, label %endif2196 +then2194: + ret i1 true +endif2196: + %t23 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t24 = load { ptr, i64, i64 }, ptr %t23 + store { ptr, i64, i64 } %t24, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.1240, i64 6, i64 0 }, ptr %a26 + %t27 = call i32 @finch_str_eq(ptr %a25, ptr %a26) + %t28 = icmp ne i32 %t27, 0 + br i1 %t28, label %then2197, label %endif2199 +then2197: + %t29 = load ptr, ptr %a1 + %t30 = icmp eq ptr %t29, null + br i1 %t30, label %panic2200, label %ok2201 +panic2200: + call void @finch_panic(ptr @.str.1241, i64 525, ptr @.str.1242) + unreachable +ok2201: + %t31 = getelementptr inbounds %S.gen.Gen, ptr %t29, i32 0, i32 15 + %t32 = load ptr, ptr %a1 + %t33 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t34 = load { ptr, i64, i64 }, ptr %t33 + %t35 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t36 = load { ptr, i64, i64 }, ptr %t35 + %t37 = call i64 @finch.gen.findStruct(ptr %t32, { ptr, i64, i64 } %t34, { ptr, i64, i64 } %t36) + %t38 = load { ptr, i64, i64 }, ptr %t31 + %t39 = extractvalue { ptr, i64, i64 } %t38, 1 + %t40 = icmp uge i64 %t37, %t39 + br i1 %t40, label %range2202, label %inrange2203 +range2202: + call void @finch_panic_index(ptr @.str.1243, i64 525, i64 %t37, i64 %t39) + unreachable +inrange2203: + %t41 = extractvalue { ptr, i64, i64 } %t38, 0 + %t42 = getelementptr inbounds %S.gen.StructDef, ptr %t41, i64 %t37 + %t43 = getelementptr inbounds %S.gen.StructDef, ptr %t42, i32 0, i32 16 + %t44 = load i1, ptr %t43 + ret i1 %t44 +endif2199: + ret i1 false +} + +define internal { ptr, i64, i64 } @finch.gen.typeKey(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.1244, i64 5, i64 0 }, ptr %a5 + %t6 = call i32 @finch_str_eq(ptr %a4, ptr %a5) + %t7 = icmp ne i32 %t6, 0 + br i1 %t7, label %then2204, label %endif2206 +then2204: + %t8 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t9 = load { ptr, i64, i64 }, ptr %t8 + %t10 = extractvalue { ptr, i64, i64 } %t9, 1 + %t11 = icmp uge i64 0, %t10 + br i1 %t11, label %range2207, label %inrange2208 +range2207: + call void @finch_panic_index(ptr @.str.1246, i64 532, i64 0, i64 %t10) + unreachable +inrange2208: + %t12 = extractvalue { ptr, i64, i64 } %t9, 0 + %t13 = getelementptr inbounds %S.ast.Type, ptr %t12, i64 0 + %t14 = load %S.ast.Type, ptr %t13 + %t15 = call { ptr, i64, i64 } @finch.gen.typeKey(%S.ast.Type %t14) + store { ptr, i64, i64 } { ptr @.str.1245, i64 4, i64 0 }, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + ret { ptr, i64, i64 } %t19 +endif2206: + %t20 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.1247, i64 3, i64 0 }, ptr %a23 + %t24 = call i32 @finch_str_eq(ptr %a22, ptr %a23) + %t25 = icmp ne i32 %t24, 0 + br i1 %t25, label %then2209, label %endif2211 +then2209: + %t26 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t27 = load { ptr, i64, i64 }, ptr %t26 + %t28 = extractvalue { ptr, i64, i64 } %t27, 1 + %t29 = icmp uge i64 0, %t28 + br i1 %t29, label %range2212, label %inrange2213 +range2212: + call void @finch_panic_index(ptr @.str.1249, i64 535, i64 0, i64 %t28) + unreachable +inrange2213: + %t30 = extractvalue { ptr, i64, i64 } %t27, 0 + %t31 = getelementptr inbounds %S.ast.Type, ptr %t30, i64 0 + %t32 = load %S.ast.Type, ptr %t31 + %t33 = call { ptr, i64, i64 } @finch.gen.typeKey(%S.ast.Type %t32) + store { ptr, i64, i64 } { ptr @.str.1248, i64 4, i64 0 }, ptr %a35 + store { ptr, i64, i64 } %t33, ptr %a36 + call void @finch_str_concat(ptr %a34, ptr %a35, ptr %a36) + %t37 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t37, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.1250, i64 1, i64 0 }, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + %t42 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 1 + %t43 = load { ptr, i64, i64 }, ptr %t42 + %t44 = extractvalue { ptr, i64, i64 } %t43, 1 + %t45 = icmp uge i64 1, %t44 + br i1 %t45, label %range2214, label %inrange2215 +range2214: + call void @finch_panic_index(ptr @.str.1251, i64 535, i64 1, i64 %t44) + unreachable +inrange2215: + %t46 = extractvalue { ptr, i64, i64 } %t43, 0 + %t47 = getelementptr inbounds %S.ast.Type, ptr %t46, i64 1 + %t48 = load %S.ast.Type, ptr %t47 + %t49 = call { ptr, i64, i64 } @finch.gen.typeKey(%S.ast.Type %t48) + store { ptr, i64, i64 } %t41, ptr %a51 + store { ptr, i64, i64 } %t49, ptr %a52 + call void @finch_str_concat(ptr %a50, ptr %a51, ptr %a52) + %t53 = load { ptr, i64, i64 }, ptr %a50 + ret { ptr, i64, i64 } %t53 +endif2211: + %t54 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t55 = load { ptr, i64, i64 }, ptr %t54 + store { ptr, i64, i64 } %t55, ptr %a56 + store { ptr, i64, i64 } { ptr @.str.1252, i64 4, i64 0 }, ptr %a57 + %t58 = call i32 @finch_str_eq(ptr %a56, ptr %a57) + %t59 = icmp ne i32 %t58, 0 + br i1 %t59, label %then2216, label %endif2218 +then2216: + %t60 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 3 + %t61 = load { ptr, i64, i64 }, ptr %t60 + %t62 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t61) + store { ptr, i64, i64 } { ptr @.str.1253, i64 2, i64 0 }, ptr %a64 + store { ptr, i64, i64 } %t62, ptr %a65 + call void @finch_str_concat(ptr %a63, ptr %a64, ptr %a65) + %t66 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t66, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.1254, i64 1, i64 0 }, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + %t71 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 2 + %t72 = load { ptr, i64, i64 }, ptr %t71 + store { ptr, i64, i64 } %t70, ptr %a74 + store { ptr, i64, i64 } %t72, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + ret { ptr, i64, i64 } %t76 +endif2218: + %t77 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t78 = load { ptr, i64, i64 }, ptr %t77 + store { ptr, i64, i64 } %t78, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.1255, i64 6, i64 0 }, ptr %a80 + %t81 = call i32 @finch_str_eq(ptr %a79, ptr %a80) + %t82 = icmp ne i32 %t81, 0 + br i1 %t82, label %then2219, label %endif2221 +then2219: + %t83 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 3 + %t84 = load { ptr, i64, i64 }, ptr %t83 + %t85 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t84) + store { ptr, i64, i64 } { ptr @.str.1256, i64 2, i64 0 }, ptr %a87 + store { ptr, i64, i64 } %t85, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t89, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.1257, i64 1, i64 0 }, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + %t94 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 2 + %t95 = load { ptr, i64, i64 }, ptr %t94 + %t96 = call { ptr, i64, i64 } @finch.gen.mangle({ ptr, i64, i64 } %t95) + store { ptr, i64, i64 } %t93, ptr %a98 + store { ptr, i64, i64 } %t96, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + ret { ptr, i64, i64 } %t100 +endif2221: + %t101 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t102 = load { ptr, i64, i64 }, ptr %t101 + store { ptr, i64, i64 } %t102, ptr %a103 + call void @finch_str_copy(ptr %a104, ptr %a103) + %t105 = load { ptr, i64, i64 }, ptr %a104 + ret { ptr, i64, i64 } %t105 +} + +define internal { ptr, i64, i64 } @finch.gen.hex(i64 %p0) { +entry: + %a1 = alloca i64, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + store i64 %p0, ptr %a1 + store { ptr, i64, i64 } { ptr @.str.1258, i64 16, i64 0 }, ptr %a2 + %t3 = load i64, ptr %a1 + %t4 = sdiv i64 %t3, 16 + %t5 = load { ptr, i64, i64 }, ptr %a2 + %t6 = extractvalue { ptr, i64, i64 } %t5, 1 + %t7 = icmp uge i64 %t4, %t6 + br i1 %t7, label %range2222, label %inrange2223 +range2222: + call void @finch_panic_index(ptr @.str.1259, i64 550, i64 %t4, i64 %t6) + unreachable +inrange2223: + %t8 = extractvalue { ptr, i64, i64 } %t5, 0 + %t9 = getelementptr inbounds i8, ptr %t8, i64 %t4 + %t10 = load i8, ptr %t9 + call void @finch_str_from_char(ptr %a11, i8 signext %t10) + %t12 = load { ptr, i64, i64 }, ptr %a11 + %t13 = load i64, ptr %a1 + %t14 = srem i64 %t13, 16 + %t15 = load { ptr, i64, i64 }, ptr %a2 + %t16 = extractvalue { ptr, i64, i64 } %t15, 1 + %t17 = icmp uge i64 %t14, %t16 + br i1 %t17, label %range2224, label %inrange2225 +range2224: + call void @finch_panic_index(ptr @.str.1260, i64 550, i64 %t14, i64 %t16) + unreachable +inrange2225: + %t18 = extractvalue { ptr, i64, i64 } %t15, 0 + %t19 = getelementptr inbounds i8, ptr %t18, i64 %t14 + %t20 = load i8, ptr %t19 + call void @finch_str_from_char(ptr %a21, i8 signext %t20) + %t22 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } %t12, ptr %a24 + store { ptr, i64, i64 } %t22, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + ret { ptr, i64, i64 } %t26 +} + +define internal { ptr, i64, i64 } @finch.gen.strGlobal(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca i64, align 16 + %a28 = alloca i8, align 16 + %a31 = alloca i64, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic2226, label %ok2227 +panic2226: + call void @finch_panic(ptr @.str.1261, i64 554, ptr @.str.1262) + unreachable +ok2227: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 8 + %t6 = load i64, ptr %t5 + %t7 = add i64 %t6, 1 + store i64 %t7, ptr %t5 + %t8 = load ptr, ptr %a1 + %t9 = icmp eq ptr %t8, null + br i1 %t9, label %panic2228, label %ok2229 +panic2228: + call void @finch_panic(ptr @.str.1264, i64 555, ptr @.str.1265) + unreachable +ok2229: + %t10 = getelementptr inbounds %S.gen.Gen, ptr %t8, i32 0, i32 8 + %t11 = load i64, ptr %t10 + call void @finch_str_from_int(ptr %a12, i64 %t11) + %t13 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.1263, i64 6, i64 0 }, ptr %a15 + store { ptr, i64, i64 } %t13, ptr %a16 + call void @finch_str_concat(ptr %a14, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t17, ptr %a18 + store { ptr, i64, i64 } zeroinitializer, ptr %a19 + store i64 0, ptr %a20 + br label %each.cond2230 +each.cond2230: + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t22 = load i64, ptr %t21 + %t23 = load i64, ptr %a20 + %t24 = icmp slt i64 %t23, %t22 + br i1 %t24, label %each.body2231, label %each.end2233 +each.body2231: + %t25 = load ptr, ptr %a2 + %t26 = getelementptr inbounds i8, ptr %t25, i64 %t23 + %t27 = load i8, ptr %t26 + store i8 %t27, ptr %a28 + %t29 = load i8, ptr %a28 + %t30 = zext i8 %t29 to i64 + store i64 %t30, ptr %a31 + %t32 = load i64, ptr %a31 + %t33 = icmp slt i64 %t32, 0 + br i1 %t33, label %then2234, label %endif2236 +then2234: + %t34 = load i64, ptr %a31 + %t35 = add i64 %t34, 256 + store i64 %t35, ptr %a31 + br label %endif2236 +endif2236: + %t36 = load i64, ptr %a31 + %t37 = icmp sge i64 %t36, 32 + br label %logic.from2237 +logic.from2237: + br i1 %t37, label %logic.rhs2238, label %logic.end2239 +logic.rhs2238: + %t38 = load i64, ptr %a31 + %t39 = icmp slt i64 %t38, 127 + br label %logic.rend2240 +logic.rend2240: + br label %logic.end2239 +logic.end2239: + %t40 = phi i1 [ false, %logic.from2237 ], [ %t39, %logic.rend2240 ] + br label %logic.from2241 +logic.from2241: + br i1 %t40, label %logic.rhs2242, label %logic.end2243 +logic.rhs2242: + %t41 = load i8, ptr %a28 + %t42 = icmp ne i8 %t41, 34 + br label %logic.rend2244 +logic.rend2244: + br label %logic.end2243 +logic.end2243: + %t43 = phi i1 [ false, %logic.from2241 ], [ %t42, %logic.rend2244 ] + br label %logic.from2245 +logic.from2245: + br i1 %t43, label %logic.rhs2246, label %logic.end2247 +logic.rhs2246: + %t44 = load i8, ptr %a28 + %t45 = icmp ne i8 %t44, 92 + br label %logic.rend2248 +logic.rend2248: + br label %logic.end2247 +logic.end2247: + %t46 = phi i1 [ false, %logic.from2245 ], [ %t45, %logic.rend2248 ] + br i1 %t46, label %then2249, label %else2250 +then2249: + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %a19, i32 0, i32 1 + %t48 = load i8, ptr %a28 + call void @finch_str_from_char(ptr %a49, i8 signext %t48) + %t50 = load { ptr, i64, i64 }, ptr %a49 + %t51 = load i64, ptr %t47 + %t52 = add i64 %t51, 1 + call void @finch_arr_reserve(ptr %a19, i64 %t52, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t53 = load ptr, ptr %a19 + %t54 = getelementptr inbounds { ptr, i64, i64 }, ptr %t53, i64 %t51 + store { ptr, i64, i64 } %t50, ptr %t54 + store i64 %t52, ptr %t47 + br label %endif2251 +else2250: + %t55 = getelementptr inbounds { ptr, i64, i64 }, ptr %a19, i32 0, i32 1 + %t56 = load i64, ptr %a31 + %t57 = call { ptr, i64, i64 } @finch.gen.hex(i64 %t56) + store { ptr, i64, i64 } { ptr @.str.1266, i64 1, i64 0 }, ptr %a59 + store { ptr, i64, i64 } %t57, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + %t62 = load i64, ptr %t55 + %t63 = add i64 %t62, 1 + call void @finch_arr_reserve(ptr %a19, i64 %t63, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t64 = load ptr, ptr %a19 + %t65 = getelementptr inbounds { ptr, i64, i64 }, ptr %t64, i64 %t62 + store { ptr, i64, i64 } %t61, ptr %t65 + store i64 %t63, ptr %t55 + br label %endif2251 +endif2251: + br label %each.step2232 +each.step2232: + %t66 = load i64, ptr %a20 + %t67 = add i64 %t66, 1 + store i64 %t67, ptr %a20 + br label %each.cond2230 +each.end2233: + %t68 = load ptr, ptr %a1 + %t69 = icmp eq ptr %t68, null + br i1 %t69, label %panic2252, label %ok2253 +panic2252: + call void @finch_panic(ptr @.str.1267, i64 568, ptr @.str.1268) + unreachable +ok2253: + %t70 = getelementptr inbounds %S.gen.Gen, ptr %t68, i32 0, i32 2 + %t71 = getelementptr inbounds { ptr, i64, i64 }, ptr %t70, i32 0, i32 1 + %t72 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t72, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.1269, i64 34, i64 0 }, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + %t77 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t78 = load i64, ptr %t77 + %t79 = add i64 %t78, 1 + call void @finch_str_from_int(ptr %a80, i64 %t79) + %t81 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t76, ptr %a83 + store { ptr, i64, i64 } %t81, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t85, ptr %a87 + store { ptr, i64, i64 } { ptr @.str.1270, i64 9, i64 0 }, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + %t90 = getelementptr inbounds { ptr, i64, i64 }, ptr %a19, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.1271, i64 0, i64 0 }, ptr %a91 + call void @finch_str_join(ptr %a92, ptr %a19, ptr %a91) + %t93 = load { ptr, i64, i64 }, ptr %a92 + store { ptr, i64, i64 } %t89, ptr %a95 + store { ptr, i64, i64 } %t93, ptr %a96 + call void @finch_str_concat(ptr %a94, ptr %a95, ptr %a96) + %t97 = load { ptr, i64, i64 }, ptr %a94 + store { ptr, i64, i64 } %t97, ptr %a99 + store { ptr, i64, i64 } { ptr @.str.1272, i64 4, i64 0 }, ptr %a100 + call void @finch_str_concat(ptr %a98, ptr %a99, ptr %a100) + %t101 = load { ptr, i64, i64 }, ptr %a98 + %t102 = load i64, ptr %t71 + %t103 = add i64 %t102, 1 + call void @finch_arr_reserve(ptr %t70, i64 %t103, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t104 = load ptr, ptr %t70 + %t105 = getelementptr inbounds { ptr, i64, i64 }, ptr %t104, i64 %t102 + store { ptr, i64, i64 } %t101, ptr %t105 + store i64 %t103, ptr %t71 + %t106 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t106, ptr %a107 + call void @finch_str_copy(ptr %a108, ptr %a107) + %t109 = load { ptr, i64, i64 }, ptr %a108 + ret { ptr, i64, i64 } %t109 +} + +define internal %S.gen.Val @finch.gen.strConst(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load { ptr, i64, i64 }, ptr %a2 + %t5 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t3, { ptr, i64, i64 } %t4) + store { ptr, i64, i64 } %t5, ptr %a6 + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.1273, i64 6, i64 0 }, ptr %a9 + store { ptr, i64, i64 } %t7, ptr %a10 + call void @finch_str_concat(ptr %a8, ptr %a9, ptr %a10) + %t11 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t11, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.1274, i64 6, i64 0 }, ptr %a14 + call void @finch_str_concat(ptr %a12, ptr %a13, ptr %a14) + %t15 = load { ptr, i64, i64 }, ptr %a12 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t17 = load i64, ptr %t16 + call void @finch_str_from_int(ptr %a18, i64 %t17) + %t19 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t15, ptr %a21 + store { ptr, i64, i64 } %t19, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t23, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.1275, i64 9, i64 0 }, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + %t28 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t27, 0 + %t29 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.1276, i64 3, i64 0 }) + %t30 = insertvalue %S.gen.Val %t28, %S.ast.Type %t29, 1 + %t31 = insertvalue %S.gen.Val %t30, i1 true, 2 + ret %S.gen.Val %t31 +} + +define internal void @finch.gen.panicIf(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, %S.ast.Node %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Node %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t5, { ptr, i64, i64 } { ptr @.str.1277, i64 5, i64 0 }) + store { ptr, i64, i64 } %t6, ptr %a7 + %t8 = load ptr, ptr %a1 + %t9 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t8, { ptr, i64, i64 } { ptr @.str.1278, i64 2, i64 0 }) + store { ptr, i64, i64 } %t9, ptr %a10 + %t11 = load ptr, ptr %a1 + %t12 = load { ptr, i64, i64 }, ptr %a2 + %t13 = load { ptr, i64, i64 }, ptr %a7 + %t14 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.condBr(ptr %t11, { ptr, i64, i64 } %t12, { ptr, i64, i64 } %t13, { ptr, i64, i64 } %t14) + %t15 = load ptr, ptr %a1 + %t16 = load { ptr, i64, i64 }, ptr %a7 + call void @finch.gen.label(ptr %t15, { ptr, i64, i64 } %t16) + %t17 = load ptr, ptr %a1 + %t18 = load ptr, ptr %a1 + %t19 = icmp eq ptr %t18, null + br i1 %t19, label %panic2254, label %ok2255 +panic2254: + call void @finch_panic(ptr @.str.1279, i64 584, ptr @.str.1280) + unreachable +ok2255: + %t20 = getelementptr inbounds %S.gen.Gen, ptr %t18, i32 0, i32 1 + %t21 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 13 + %t22 = load i64, ptr %t21 + %t23 = load { ptr, i64, i64 }, ptr %t20 + %t24 = extractvalue { ptr, i64, i64 } %t23, 1 + %t25 = icmp uge i64 %t22, %t24 + br i1 %t25, label %range2256, label %inrange2257 +range2256: + call void @finch_panic_index(ptr @.str.1281, i64 584, i64 %t22, i64 %t24) + unreachable +inrange2257: + %t26 = extractvalue { ptr, i64, i64 } %t23, 0 + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %t26, i64 %t22 + %t28 = load { ptr, i64, i64 }, ptr %t27 + %t29 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t17, { ptr, i64, i64 } %t28) + store { ptr, i64, i64 } %t29, ptr %a30 + %t31 = load ptr, ptr %a1 + %t32 = load { ptr, i64, i64 }, ptr %a3 + %t33 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t31, { ptr, i64, i64 } %t32) + store { ptr, i64, i64 } %t33, ptr %a34 + %t35 = load ptr, ptr %a1 + %t36 = load { ptr, i64, i64 }, ptr %a30 + store { ptr, i64, i64 } { ptr @.str.1282, i64 27, i64 0 }, ptr %a38 + store { ptr, i64, i64 } %t36, ptr %a39 + call void @finch_str_concat(ptr %a37, ptr %a38, ptr %a39) + %t40 = load { ptr, i64, i64 }, ptr %a37 + store { ptr, i64, i64 } %t40, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.1283, i64 6, i64 0 }, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + %t45 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 11 + %t46 = load i64, ptr %t45 + call void @finch_str_from_int(ptr %a47, i64 %t46) + %t48 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } %t44, ptr %a50 + store { ptr, i64, i64 } %t48, ptr %a51 + call void @finch_str_concat(ptr %a49, ptr %a50, ptr %a51) + %t52 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t52, ptr %a54 + store { ptr, i64, i64 } { ptr @.str.1284, i64 6, i64 0 }, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + %t57 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t56, ptr %a59 + store { ptr, i64, i64 } %t57, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + store { ptr, i64, i64 } %t61, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.1285, i64 1, i64 0 }, ptr %a64 + call void @finch_str_concat(ptr %a62, ptr %a63, ptr %a64) + %t65 = load { ptr, i64, i64 }, ptr %a62 + call void @finch.gen.emit(ptr %t35, { ptr, i64, i64 } %t65) + %t66 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t66, { ptr, i64, i64 } { ptr @.str.1286, i64 11, i64 0 }) + %t67 = load ptr, ptr %a1 + %t68 = icmp eq ptr %t67, null + br i1 %t68, label %panic2258, label %ok2259 +panic2258: + call void @finch_panic(ptr @.str.1287, i64 588, ptr @.str.1288) + unreachable +ok2259: + %t69 = getelementptr inbounds %S.gen.Gen, ptr %t67, i32 0, i32 9 + store i1 true, ptr %t69 + %t70 = load ptr, ptr %a1 + %t71 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.label(ptr %t70, { ptr, i64, i64 } %t71) + ret void +} + +define internal void @finch.gen.boundsCheck(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, %S.ast.Node %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Node %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t5, { ptr, i64, i64 } { ptr @.str.1289, i64 5, i64 0 }) + store { ptr, i64, i64 } %t6, ptr %a7 + %t8 = load ptr, ptr %a1 + %t9 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t8, { ptr, i64, i64 } { ptr @.str.1290, i64 7, i64 0 }) + store { ptr, i64, i64 } %t9, ptr %a10 + %t11 = load ptr, ptr %a1 + %t12 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1291, i64 13, i64 0 }, ptr %a14 + store { ptr, i64, i64 } %t12, ptr %a15 + call void @finch_str_concat(ptr %a13, ptr %a14, ptr %a15) + %t16 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t16, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.1292, i64 2, i64 0 }, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + %t21 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t20, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + %t26 = call { ptr, i64, i64 } @finch.gen.op(ptr %t11, { ptr, i64, i64 } %t25) + store { ptr, i64, i64 } %t26, ptr %a27 + %t28 = load ptr, ptr %a1 + %t29 = load { ptr, i64, i64 }, ptr %a27 + %t30 = load { ptr, i64, i64 }, ptr %a7 + %t31 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.condBr(ptr %t28, { ptr, i64, i64 } %t29, { ptr, i64, i64 } %t30, { ptr, i64, i64 } %t31) + %t32 = load ptr, ptr %a1 + %t33 = load { ptr, i64, i64 }, ptr %a7 + call void @finch.gen.label(ptr %t32, { ptr, i64, i64 } %t33) + %t34 = load ptr, ptr %a1 + %t35 = load ptr, ptr %a1 + %t36 = icmp eq ptr %t35, null + br i1 %t36, label %panic2260, label %ok2261 +panic2260: + call void @finch_panic(ptr @.str.1293, i64 598, ptr @.str.1294) + unreachable +ok2261: + %t37 = getelementptr inbounds %S.gen.Gen, ptr %t35, i32 0, i32 1 + %t38 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 13 + %t39 = load i64, ptr %t38 + %t40 = load { ptr, i64, i64 }, ptr %t37 + %t41 = extractvalue { ptr, i64, i64 } %t40, 1 + %t42 = icmp uge i64 %t39, %t41 + br i1 %t42, label %range2262, label %inrange2263 +range2262: + call void @finch_panic_index(ptr @.str.1295, i64 598, i64 %t39, i64 %t41) + unreachable +inrange2263: + %t43 = extractvalue { ptr, i64, i64 } %t40, 0 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i64 %t39 + %t45 = load { ptr, i64, i64 }, ptr %t44 + %t46 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t34, { ptr, i64, i64 } %t45) + store { ptr, i64, i64 } %t46, ptr %a47 + %t48 = load ptr, ptr %a1 + %t49 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } { ptr @.str.1296, i64 33, i64 0 }, ptr %a51 + store { ptr, i64, i64 } %t49, ptr %a52 + call void @finch_str_concat(ptr %a50, ptr %a51, ptr %a52) + %t53 = load { ptr, i64, i64 }, ptr %a50 + store { ptr, i64, i64 } %t53, ptr %a55 + store { ptr, i64, i64 } { ptr @.str.1297, i64 6, i64 0 }, ptr %a56 + call void @finch_str_concat(ptr %a54, ptr %a55, ptr %a56) + %t57 = load { ptr, i64, i64 }, ptr %a54 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a4, i32 0, i32 11 + %t59 = load i64, ptr %t58 + call void @finch_str_from_int(ptr %a60, i64 %t59) + %t61 = load { ptr, i64, i64 }, ptr %a60 + store { ptr, i64, i64 } %t57, ptr %a63 + store { ptr, i64, i64 } %t61, ptr %a64 + call void @finch_str_concat(ptr %a62, ptr %a63, ptr %a64) + %t65 = load { ptr, i64, i64 }, ptr %a62 + store { ptr, i64, i64 } %t65, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.1298, i64 6, i64 0 }, ptr %a68 + call void @finch_str_concat(ptr %a66, ptr %a67, ptr %a68) + %t69 = load { ptr, i64, i64 }, ptr %a66 + %t70 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t69, ptr %a72 + store { ptr, i64, i64 } %t70, ptr %a73 + call void @finch_str_concat(ptr %a71, ptr %a72, ptr %a73) + %t74 = load { ptr, i64, i64 }, ptr %a71 + store { ptr, i64, i64 } %t74, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.1299, i64 6, i64 0 }, ptr %a77 + call void @finch_str_concat(ptr %a75, ptr %a76, ptr %a77) + %t78 = load { ptr, i64, i64 }, ptr %a75 + %t79 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t78, ptr %a81 + store { ptr, i64, i64 } %t79, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t83, ptr %a85 + store { ptr, i64, i64 } { ptr @.str.1300, i64 1, i64 0 }, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + call void @finch.gen.emit(ptr %t48, { ptr, i64, i64 } %t87) + %t88 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t88, { ptr, i64, i64 } { ptr @.str.1301, i64 11, i64 0 }) + %t89 = load ptr, ptr %a1 + %t90 = icmp eq ptr %t89, null + br i1 %t90, label %panic2264, label %ok2265 +panic2264: + call void @finch_panic(ptr @.str.1302, i64 601, ptr @.str.1303) + unreachable +ok2265: + %t91 = getelementptr inbounds %S.gen.Gen, ptr %t89, i32 0, i32 9 + store i1 true, ptr %t91 + %t92 = load ptr, ptr %a1 + %t93 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.label(ptr %t92, { ptr, i64, i64 } %t93) + ret void +} + +define internal void @finch.copy.S_gen_Saved(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Saved, ptr %src + store %S.gen.Saved %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Saved, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Saved, ptr %src, i32 0, i32 0 + call void @finch.copy.arr_str(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Saved, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Saved, ptr %src, i32 0, i32 1 + call void @finch.copy.arr_str(ptr %t4, ptr %t5) + ret void +} + +define internal %S.gen.Saved @finch.gen.beginHelper(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca %S.gen.Saved, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca %S.gen.Saved, align 16 + %a60 = alloca %S.gen.Saved, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic2266, label %ok2267 +panic2266: + call void @finch_panic(ptr @.str.1304, i64 616, ptr @.str.1305) + unreachable +ok2267: + %t4 = getelementptr inbounds %S.gen.Gen, ptr %t2, i32 0, i32 4 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + call void @finch.copy.arr_str(ptr %a7, ptr %a6) + %t8 = load { ptr, i64, i64 }, ptr %a7 + %t9 = insertvalue %S.gen.Saved zeroinitializer, { ptr, i64, i64 } %t8, 0 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic2268, label %ok2269 +panic2268: + call void @finch_panic(ptr @.str.1306, i64 616, ptr @.str.1307) + unreachable +ok2269: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 5 + %t13 = load { ptr, i64, i64 }, ptr %t12 + store { ptr, i64, i64 } %t13, ptr %a14 + call void @finch.copy.arr_str(ptr %a15, ptr %a14) + %t16 = load { ptr, i64, i64 }, ptr %a15 + %t17 = insertvalue %S.gen.Saved %t9, { ptr, i64, i64 } %t16, 1 + %t18 = load ptr, ptr %a1 + %t19 = icmp eq ptr %t18, null + br i1 %t19, label %panic2270, label %ok2271 +panic2270: + call void @finch_panic(ptr @.str.1308, i64 616, ptr @.str.1309) + unreachable +ok2271: + %t20 = getelementptr inbounds %S.gen.Gen, ptr %t18, i32 0, i32 6 + %t21 = load i64, ptr %t20 + %t22 = insertvalue %S.gen.Saved %t17, i64 %t21, 2 + %t23 = load ptr, ptr %a1 + %t24 = icmp eq ptr %t23, null + br i1 %t24, label %panic2272, label %ok2273 +panic2272: + call void @finch_panic(ptr @.str.1310, i64 616, ptr @.str.1311) + unreachable +ok2273: + %t25 = getelementptr inbounds %S.gen.Gen, ptr %t23, i32 0, i32 9 + %t26 = load i1, ptr %t25 + %t27 = insertvalue %S.gen.Saved %t22, i1 %t26, 3 + %t28 = load ptr, ptr %a1 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic2274, label %ok2275 +panic2274: + call void @finch_panic(ptr @.str.1312, i64 616, ptr @.str.1313) + unreachable +ok2275: + %t30 = getelementptr inbounds %S.gen.Gen, ptr %t28, i32 0, i32 32 + %t31 = load i64, ptr %t30 + %t32 = insertvalue %S.gen.Saved %t27, i64 %t31, 4 + store %S.gen.Saved %t32, ptr %a33 + %t34 = load ptr, ptr %a1 + %t35 = icmp eq ptr %t34, null + br i1 %t35, label %panic2276, label %ok2277 +panic2276: + call void @finch_panic(ptr @.str.1314, i64 617, ptr @.str.1315) + unreachable +ok2277: + %t36 = getelementptr inbounds %S.gen.Gen, ptr %t34, i32 0, i32 32 + store i64 -1, ptr %t36 + store { ptr, i64, i64 } zeroinitializer, ptr %a37 + %t38 = load { ptr, i64, i64 }, ptr %a37 + %t39 = load ptr, ptr %a1 + %t40 = icmp eq ptr %t39, null + br i1 %t40, label %panic2278, label %ok2279 +panic2278: + call void @finch_panic(ptr @.str.1316, i64 619, ptr @.str.1317) + unreachable +ok2279: + %t41 = getelementptr inbounds %S.gen.Gen, ptr %t39, i32 0, i32 4 + store { ptr, i64, i64 } %t38, ptr %a42 + call void @finch.copy.arr_str(ptr %a43, ptr %a42) + %t44 = load { ptr, i64, i64 }, ptr %a43 + store { ptr, i64, i64 } %t44, ptr %t41 + %t45 = load { ptr, i64, i64 }, ptr %a37 + %t46 = load ptr, ptr %a1 + %t47 = icmp eq ptr %t46, null + br i1 %t47, label %panic2280, label %ok2281 +panic2280: + call void @finch_panic(ptr @.str.1318, i64 620, ptr @.str.1319) + unreachable +ok2281: + %t48 = getelementptr inbounds %S.gen.Gen, ptr %t46, i32 0, i32 5 + store { ptr, i64, i64 } %t45, ptr %a49 + call void @finch.copy.arr_str(ptr %a50, ptr %a49) + %t51 = load { ptr, i64, i64 }, ptr %a50 + store { ptr, i64, i64 } %t51, ptr %t48 + %t52 = load ptr, ptr %a1 + %t53 = icmp eq ptr %t52, null + br i1 %t53, label %panic2282, label %ok2283 +panic2282: + call void @finch_panic(ptr @.str.1320, i64 621, ptr @.str.1321) + unreachable +ok2283: + %t54 = getelementptr inbounds %S.gen.Gen, ptr %t52, i32 0, i32 6 + store i64 0, ptr %t54 + %t55 = load ptr, ptr %a1 + %t56 = icmp eq ptr %t55, null + br i1 %t56, label %panic2284, label %ok2285 +panic2284: + call void @finch_panic(ptr @.str.1322, i64 622, ptr @.str.1323) + unreachable +ok2285: + %t57 = getelementptr inbounds %S.gen.Gen, ptr %t55, i32 0, i32 9 + store i1 false, ptr %t57 + %t58 = load %S.gen.Saved, ptr %a33 + store %S.gen.Saved %t58, ptr %a59 + call void @finch.copy.S_gen_Saved(ptr %a60, ptr %a59) + %t61 = load %S.gen.Saved, ptr %a60 + ret %S.gen.Saved %t61 +} + +define internal void @finch.gen.endHelper(ptr %p0, %S.gen.Saved %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.Saved, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.gen.Saved %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic2286, label %ok2287 +panic2286: + call void @finch_panic(ptr @.str.1324, i64 627, ptr @.str.1325) + unreachable +ok2287: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 3 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t6, i32 0, i32 1 + %t8 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t8, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1326, i64 10, i64 0 }, ptr %a11 + call void @finch_str_concat(ptr %a9, ptr %a10, ptr %a11) + %t12 = load { ptr, i64, i64 }, ptr %a9 + %t13 = load ptr, ptr %a1 + %t14 = icmp eq ptr %t13, null + br i1 %t14, label %panic2288, label %ok2289 +panic2288: + call void @finch_panic(ptr @.str.1327, i64 627, ptr @.str.1328) + unreachable +ok2289: + %t15 = getelementptr inbounds %S.gen.Gen, ptr %t13, i32 0, i32 5 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t15, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.1329, i64 1, i64 0 }, ptr %a17 + call void @finch_str_join(ptr %a18, ptr %t15, ptr %a17) + %t19 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t12, ptr %a21 + store { ptr, i64, i64 } %t19, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t23, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.1330, i64 1, i64 0 }, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + %t28 = load ptr, ptr %a1 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic2290, label %ok2291 +panic2290: + call void @finch_panic(ptr @.str.1331, i64 627, ptr @.str.1332) + unreachable +ok2291: + %t30 = getelementptr inbounds %S.gen.Gen, ptr %t28, i32 0, i32 4 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t30, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.1333, i64 1, i64 0 }, ptr %a32 + call void @finch_str_join(ptr %a33, ptr %t30, ptr %a32) + %t34 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } %t27, ptr %a36 + store { ptr, i64, i64 } %t34, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t38, ptr %a40 + store { ptr, i64, i64 } { ptr @.str.1334, i64 3, i64 0 }, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + %t43 = load i64, ptr %t7 + %t44 = add i64 %t43, 1 + call void @finch_arr_reserve(ptr %t6, i64 %t44, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t45 = load ptr, ptr %t6 + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %t45, i64 %t43 + store { ptr, i64, i64 } %t42, ptr %t46 + store i64 %t44, ptr %t7 + %t47 = getelementptr inbounds %S.gen.Saved, ptr %a2, i32 0, i32 0 + %t48 = load { ptr, i64, i64 }, ptr %t47 + %t49 = load ptr, ptr %a1 + %t50 = icmp eq ptr %t49, null + br i1 %t50, label %panic2292, label %ok2293 +panic2292: + call void @finch_panic(ptr @.str.1335, i64 628, ptr @.str.1336) + unreachable +ok2293: + %t51 = getelementptr inbounds %S.gen.Gen, ptr %t49, i32 0, i32 4 + store { ptr, i64, i64 } %t48, ptr %a52 + call void @finch.copy.arr_str(ptr %a53, ptr %a52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t54, ptr %t51 + %t55 = getelementptr inbounds %S.gen.Saved, ptr %a2, i32 0, i32 1 + %t56 = load { ptr, i64, i64 }, ptr %t55 + %t57 = load ptr, ptr %a1 + %t58 = icmp eq ptr %t57, null + br i1 %t58, label %panic2294, label %ok2295 +panic2294: + call void @finch_panic(ptr @.str.1337, i64 629, ptr @.str.1338) + unreachable +ok2295: + %t59 = getelementptr inbounds %S.gen.Gen, ptr %t57, i32 0, i32 5 + store { ptr, i64, i64 } %t56, ptr %a60 + call void @finch.copy.arr_str(ptr %a61, ptr %a60) + %t62 = load { ptr, i64, i64 }, ptr %a61 + store { ptr, i64, i64 } %t62, ptr %t59 + %t63 = getelementptr inbounds %S.gen.Saved, ptr %a2, i32 0, i32 2 + %t64 = load i64, ptr %t63 + %t65 = load ptr, ptr %a1 + %t66 = icmp eq ptr %t65, null + br i1 %t66, label %panic2296, label %ok2297 +panic2296: + call void @finch_panic(ptr @.str.1339, i64 630, ptr @.str.1340) + unreachable +ok2297: + %t67 = getelementptr inbounds %S.gen.Gen, ptr %t65, i32 0, i32 6 + store i64 %t64, ptr %t67 + %t68 = getelementptr inbounds %S.gen.Saved, ptr %a2, i32 0, i32 3 + %t69 = load i1, ptr %t68 + %t70 = load ptr, ptr %a1 + %t71 = icmp eq ptr %t70, null + br i1 %t71, label %panic2298, label %ok2299 +panic2298: + call void @finch_panic(ptr @.str.1341, i64 631, ptr @.str.1342) + unreachable +ok2299: + %t72 = getelementptr inbounds %S.gen.Gen, ptr %t70, i32 0, i32 9 + store i1 %t69, ptr %t72 + %t73 = getelementptr inbounds %S.gen.Saved, ptr %a2, i32 0, i32 4 + %t74 = load i64, ptr %t73 + %t75 = load ptr, ptr %a1 + %t76 = icmp eq ptr %t75, null + br i1 %t76, label %panic2300, label %ok2301 +panic2300: + call void @finch_panic(ptr @.str.1343, i64 632, ptr @.str.1344) + unreachable +ok2301: + %t77 = getelementptr inbounds %S.gen.Gen, ptr %t75, i32 0, i32 32 + store i64 %t74, ptr %t77 + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.loopStart(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t3, { ptr, i64, i64 } { ptr @.str.1345, i64 3, i64 0 }) + store { ptr, i64, i64 } %t4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = load { ptr, i64, i64 }, ptr %a5 + call void @finch.gen.store(ptr %t6, { ptr, i64, i64 } { ptr @.str.1346, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.1347, i64 1, i64 0 }, { ptr, i64, i64 } %t7) + %t8 = load ptr, ptr %a1 + %t9 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t8, { ptr, i64, i64 } { ptr @.str.1348, i64 6, i64 0 }) + store { ptr, i64, i64 } %t9, ptr %a10 + %t11 = load ptr, ptr %a1 + %t12 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t11, { ptr, i64, i64 } { ptr @.str.1349, i64 6, i64 0 }) + store { ptr, i64, i64 } %t12, ptr %a13 + %t14 = load ptr, ptr %a1 + %t15 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t14, { ptr, i64, i64 } { ptr @.str.1350, i64 5, i64 0 }) + store { ptr, i64, i64 } %t15, ptr %a16 + %t17 = load ptr, ptr %a1 + %t18 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.br(ptr %t17, { ptr, i64, i64 } %t18) + %t19 = load ptr, ptr %a1 + %t20 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.label(ptr %t19, { ptr, i64, i64 } %t20) + %t21 = load ptr, ptr %a1 + %t22 = load { ptr, i64, i64 }, ptr %a5 + %t23 = call { ptr, i64, i64 } @finch.gen.load(ptr %t21, { ptr, i64, i64 } { ptr @.str.1351, i64 3, i64 0 }, { ptr, i64, i64 } %t22) + store { ptr, i64, i64 } %t23, ptr %a24 + %t25 = load ptr, ptr %a1 + %t26 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.1352, i64 13, i64 0 }, ptr %a28 + store { ptr, i64, i64 } %t26, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t30, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.1353, i64 2, i64 0 }, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t34, ptr %a37 + store { ptr, i64, i64 } %t35, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + %t40 = call { ptr, i64, i64 } @finch.gen.op(ptr %t25, { ptr, i64, i64 } %t39) + store { ptr, i64, i64 } %t40, ptr %a41 + %t42 = load ptr, ptr %a1 + %t43 = load { ptr, i64, i64 }, ptr %a41 + %t44 = load { ptr, i64, i64 }, ptr %a13 + %t45 = load { ptr, i64, i64 }, ptr %a16 + call void @finch.gen.condBr(ptr %t42, { ptr, i64, i64 } %t43, { ptr, i64, i64 } %t44, { ptr, i64, i64 } %t45) + %t46 = load ptr, ptr %a1 + %t47 = load { ptr, i64, i64 }, ptr %a13 + call void @finch.gen.label(ptr %t46, { ptr, i64, i64 } %t47) + %t48 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t48, ptr %a49 + call void @finch_str_copy(ptr %a50, ptr %a49) + %t51 = load { ptr, i64, i64 }, ptr %a50 + %t52 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t52, ptr %a53 + call void @finch_str_copy(ptr %a54, ptr %a53) + %t55 = load { ptr, i64, i64 }, ptr %a54 + %t56 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t56, ptr %a57 + call void @finch_str_copy(ptr %a58, ptr %a57) + %t59 = load { ptr, i64, i64 }, ptr %a58 + %t60 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t60, ptr %a61 + call void @finch_str_copy(ptr %a62, ptr %a61) + %t63 = load { ptr, i64, i64 }, ptr %a62 + %t64 = mul i64 4, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t65 = call ptr @finch_alloc(i64 %t64) + %t66 = getelementptr inbounds { ptr, i64, i64 }, ptr %t65, i64 0 + store { ptr, i64, i64 } %t51, ptr %t66 + %t67 = getelementptr inbounds { ptr, i64, i64 }, ptr %t65, i64 1 + store { ptr, i64, i64 } %t55, ptr %t67 + %t68 = getelementptr inbounds { ptr, i64, i64 }, ptr %t65, i64 2 + store { ptr, i64, i64 } %t59, ptr %t68 + %t69 = getelementptr inbounds { ptr, i64, i64 }, ptr %t65, i64 3 + store { ptr, i64, i64 } %t63, ptr %t69 + %t70 = insertvalue { ptr, i64, i64 } undef, ptr %t65, 0 + %t71 = insertvalue { ptr, i64, i64 } %t70, i64 4, 1 + %t72 = insertvalue { ptr, i64, i64 } %t71, i64 4, 2 + ret { ptr, i64, i64 } %t72 +} + +define internal void @finch.gen.loopEnd(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load { ptr, i64, i64 }, ptr %a2 + %t5 = extractvalue { ptr, i64, i64 } %t4, 1 + %t6 = icmp uge i64 0, %t5 + br i1 %t6, label %range2302, label %inrange2303 +range2302: + call void @finch_panic_index(ptr @.str.1355, i64 652, i64 0, i64 %t5) + unreachable +inrange2303: + %t7 = extractvalue { ptr, i64, i64 } %t4, 0 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t7, i64 0 + %t9 = load { ptr, i64, i64 }, ptr %t8 + %t10 = call { ptr, i64, i64 } @finch.gen.load(ptr %t3, { ptr, i64, i64 } { ptr @.str.1354, i64 3, i64 0 }, { ptr, i64, i64 } %t9) + store { ptr, i64, i64 } %t10, ptr %a11 + %t12 = load ptr, ptr %a1 + %t13 = load ptr, ptr %a1 + %t14 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.1357, i64 8, i64 0 }, ptr %a16 + store { ptr, i64, i64 } %t14, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + store { ptr, i64, i64 } %t18, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.1358, i64 3, i64 0 }, ptr %a21 + call void @finch_str_concat(ptr %a19, ptr %a20, ptr %a21) + %t22 = load { ptr, i64, i64 }, ptr %a19 + %t23 = call { ptr, i64, i64 } @finch.gen.op(ptr %t13, { ptr, i64, i64 } %t22) + %t24 = load { ptr, i64, i64 }, ptr %a2 + %t25 = extractvalue { ptr, i64, i64 } %t24, 1 + %t26 = icmp uge i64 0, %t25 + br i1 %t26, label %range2304, label %inrange2305 +range2304: + call void @finch_panic_index(ptr @.str.1359, i64 653, i64 0, i64 %t25) + unreachable +inrange2305: + %t27 = extractvalue { ptr, i64, i64 } %t24, 0 + %t28 = getelementptr inbounds { ptr, i64, i64 }, ptr %t27, i64 0 + %t29 = load { ptr, i64, i64 }, ptr %t28 + call void @finch.gen.store(ptr %t12, { ptr, i64, i64 } { ptr @.str.1356, i64 3, i64 0 }, { ptr, i64, i64 } %t23, { ptr, i64, i64 } %t29) + %t30 = load ptr, ptr %a1 + %t31 = load { ptr, i64, i64 }, ptr %a2 + %t32 = extractvalue { ptr, i64, i64 } %t31, 1 + %t33 = icmp uge i64 1, %t32 + br i1 %t33, label %range2306, label %inrange2307 +range2306: + call void @finch_panic_index(ptr @.str.1360, i64 654, i64 1, i64 %t32) + unreachable +inrange2307: + %t34 = extractvalue { ptr, i64, i64 } %t31, 0 + %t35 = getelementptr inbounds { ptr, i64, i64 }, ptr %t34, i64 1 + %t36 = load { ptr, i64, i64 }, ptr %t35 + call void @finch.gen.br(ptr %t30, { ptr, i64, i64 } %t36) + %t37 = load ptr, ptr %a1 + %t38 = load { ptr, i64, i64 }, ptr %a2 + %t39 = extractvalue { ptr, i64, i64 } %t38, 1 + %t40 = icmp uge i64 2, %t39 + br i1 %t40, label %range2308, label %inrange2309 +range2308: + call void @finch_panic_index(ptr @.str.1361, i64 655, i64 2, i64 %t39) + unreachable +inrange2309: + %t41 = extractvalue { ptr, i64, i64 } %t38, 0 + %t42 = getelementptr inbounds { ptr, i64, i64 }, ptr %t41, i64 2 + %t43 = load { ptr, i64, i64 }, ptr %t42 + call void @finch.gen.label(ptr %t37, { ptr, i64, i64 } %t43) + ret void +} + +define internal void @finch.gen.copyAt(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 0 + %t6 = load { ptr, i64, i64 }, ptr %t5 + store { ptr, i64, i64 } %t6, ptr %a7 + store { ptr, i64, i64 } { ptr @.str.1362, i64 3, i64 0 }, ptr %a8 + %t9 = call i32 @finch_str_eq(ptr %a7, ptr %a8) + %t10 = icmp ne i32 %t9, 0 + br i1 %t10, label %then2310, label %else2311 +then2310: + %t11 = load ptr, ptr %a1 + %t12 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1363, i64 30, i64 0 }, ptr %a14 + store { ptr, i64, i64 } %t12, ptr %a15 + call void @finch_str_concat(ptr %a13, ptr %a14, ptr %a15) + %t16 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t16, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.1364, i64 6, i64 0 }, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + %t21 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t20, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.1365, i64 1, i64 0 }, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + call void @finch.gen.emit(ptr %t11, { ptr, i64, i64 } %t29) + br label %endif2312 +else2311: + %t30 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 0 + %t31 = load { ptr, i64, i64 }, ptr %t30 + store { ptr, i64, i64 } %t31, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.1366, i64 5, i64 0 }, ptr %a33 + %t34 = call i32 @finch_str_eq(ptr %a32, ptr %a33) + %t35 = icmp ne i32 %t34, 0 + br label %logic.from2313 +logic.from2313: + br i1 %t35, label %logic.end2315, label %logic.rhs2314 +logic.rhs2314: + %t36 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 0 + %t37 = load { ptr, i64, i64 }, ptr %t36 + store { ptr, i64, i64 } %t37, ptr %a38 + store { ptr, i64, i64 } { ptr @.str.1367, i64 3, i64 0 }, ptr %a39 + %t40 = call i32 @finch_str_eq(ptr %a38, ptr %a39) + %t41 = icmp ne i32 %t40, 0 + br label %logic.rend2316 +logic.rend2316: + br label %logic.end2315 +logic.end2315: + %t42 = phi i1 [ true, %logic.from2313 ], [ %t41, %logic.rend2316 ] + br label %logic.from2317 +logic.from2317: + br i1 %t42, label %logic.end2319, label %logic.rhs2318 +logic.rhs2318: + %t43 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 0 + %t44 = load { ptr, i64, i64 }, ptr %t43 + store { ptr, i64, i64 } %t44, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.1368, i64 6, i64 0 }, ptr %a46 + %t47 = call i32 @finch_str_eq(ptr %a45, ptr %a46) + %t48 = icmp ne i32 %t47, 0 + br label %logic.from2320 +logic.from2320: + br i1 %t48, label %logic.rhs2321, label %logic.end2322 +logic.rhs2321: + %t49 = load ptr, ptr %a1 + %t50 = load %S.ast.Type, ptr %a4 + %t51 = call i1 @finch.gen.owning(ptr %t49, %S.ast.Type %t50) + br label %logic.rend2323 +logic.rend2323: + br label %logic.end2322 +logic.end2322: + %t52 = phi i1 [ false, %logic.from2320 ], [ %t51, %logic.rend2323 ] + br label %logic.rend2324 +logic.rend2324: + br label %logic.end2319 +logic.end2319: + %t53 = phi i1 [ true, %logic.from2317 ], [ %t52, %logic.rend2324 ] + br i1 %t53, label %then2325, label %else2326 +then2325: + %t54 = load ptr, ptr %a1 + %t55 = load ptr, ptr %a1 + %t56 = load %S.ast.Type, ptr %a4 + %t57 = call { ptr, i64, i64 } @finch.gen.copyFn(ptr %t55, %S.ast.Type %t56) + store { ptr, i64, i64 } { ptr @.str.1369, i64 10, i64 0 }, ptr %a59 + store { ptr, i64, i64 } %t57, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + store { ptr, i64, i64 } %t61, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.1370, i64 5, i64 0 }, ptr %a64 + call void @finch_str_concat(ptr %a62, ptr %a63, ptr %a64) + %t65 = load { ptr, i64, i64 }, ptr %a62 + %t66 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t65, ptr %a68 + store { ptr, i64, i64 } %t66, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t70, ptr %a72 + store { ptr, i64, i64 } { ptr @.str.1371, i64 6, i64 0 }, ptr %a73 + call void @finch_str_concat(ptr %a71, ptr %a72, ptr %a73) + %t74 = load { ptr, i64, i64 }, ptr %a71 + %t75 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t74, ptr %a77 + store { ptr, i64, i64 } %t75, ptr %a78 + call void @finch_str_concat(ptr %a76, ptr %a77, ptr %a78) + %t79 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t79, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.1372, i64 1, i64 0 }, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + call void @finch.gen.emit(ptr %t54, { ptr, i64, i64 } %t83) + br label %endif2327 +else2326: + %t84 = load ptr, ptr %a1 + %t85 = load ptr, ptr %a1 + %t86 = load %S.ast.Type, ptr %a4 + %t87 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t85, %S.ast.Type %t86) + %t88 = load ptr, ptr %a1 + %t89 = load ptr, ptr %a1 + %t90 = load %S.ast.Type, ptr %a4 + %t91 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t89, %S.ast.Type %t90) + %t92 = load { ptr, i64, i64 }, ptr %a3 + %t93 = call { ptr, i64, i64 } @finch.gen.load(ptr %t88, { ptr, i64, i64 } %t91, { ptr, i64, i64 } %t92) + %t94 = load { ptr, i64, i64 }, ptr %a2 + call void @finch.gen.store(ptr %t84, { ptr, i64, i64 } %t87, { ptr, i64, i64 } %t93, { ptr, i64, i64 } %t94) + br label %endif2327 +endif2327: + br label %endif2312 +endif2312: + ret void +} + +define internal void @finch.copy.arr_int(ptr %dst, ptr %src) { +entry: + + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + ret void +} + +define internal void @finch.copy.S_gen_StructDef(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.StructDef, ptr %src + store %S.gen.StructDef %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 3 + %t7 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 3 + call void @finch.copy.arr_int(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 4 + %t9 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 4 + call void @finch.copy.arr_int(ptr %t8, ptr %t9) + %t10 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 5 + %t11 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 5 + call void @finch_str_copy(ptr %t10, ptr %t11) + %t12 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 6 + %t13 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 6 + call void @finch.copy.arr_str(ptr %t12, ptr %t13) + %t14 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 7 + %t15 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 7 + call void @finch.copy.arr_S_ast_Type(ptr %t14, ptr %t15) + %t16 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 8 + %t17 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 8 + call void @finch_str_copy(ptr %t16, ptr %t17) + %t18 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 11 + %t19 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 11 + call void @finch.copy.arr_str(ptr %t18, ptr %t19) + %t20 = getelementptr inbounds %S.gen.StructDef, ptr %dst, i32 0, i32 12 + %t21 = getelementptr inbounds %S.gen.StructDef, ptr %src, i32 0, i32 12 + call void @finch.copy.arr_S_ast_Type(ptr %t20, ptr %t21) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.copyFn(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca %S.gen.Saved, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca %S.ast.Type, align 16 + %a49 = alloca %S.ast.Type, align 16 + %a51 = alloca %S.ast.Type, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca %S.gen.StructDef, align 16 + %a330 = alloca %S.gen.StructDef, align 16 + %a332 = alloca %S.gen.StructDef, align 16 + %a336 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca i64, align 16 + %a360 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a378 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a405 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca { ptr, i64, i64 }, align 16 + %a432 = alloca { ptr, i64, i64 }, align 16 + %a433 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load %S.ast.Type, ptr %a2 + %t4 = call { ptr, i64, i64 } @finch.gen.typeKey(%S.ast.Type %t3) + store { ptr, i64, i64 } { ptr @.str.1373, i64 12, i64 0 }, ptr %a6 + store { ptr, i64, i64 } %t4, ptr %a7 + call void @finch_str_concat(ptr %a5, ptr %a6, ptr %a7) + %t8 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t8, ptr %a9 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic2328, label %ok2329 +panic2328: + call void @finch_panic(ptr @.str.1374, i64 670, ptr @.str.1375) + unreachable +ok2329: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 21 + %t13 = load { ptr, i64, i64 }, ptr %t12 + %t14 = load { ptr, i64, i64 }, ptr %a9 + %t15 = call i1 @finch.gen.has({ ptr, i64, i64 } %t13, { ptr, i64, i64 } %t14) + br i1 %t15, label %then2330, label %endif2332 +then2330: + %t16 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t16, ptr %a17 + call void @finch_str_copy(ptr %a18, ptr %a17) + %t19 = load { ptr, i64, i64 }, ptr %a18 + ret { ptr, i64, i64 } %t19 +endif2332: + %t20 = load ptr, ptr %a1 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic2333, label %ok2334 +panic2333: + call void @finch_panic(ptr @.str.1376, i64 673, ptr @.str.1377) + unreachable +ok2334: + %t22 = getelementptr inbounds %S.gen.Gen, ptr %t20, i32 0, i32 21 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t24, ptr %a25 + call void @finch_str_copy(ptr %a26, ptr %a25) + %t27 = load { ptr, i64, i64 }, ptr %a26 + %t28 = load i64, ptr %t23 + %t29 = add i64 %t28, 1 + call void @finch_arr_reserve(ptr %t22, i64 %t29, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t30 = load ptr, ptr %t22 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t30, i64 %t28 + store { ptr, i64, i64 } %t27, ptr %t31 + store i64 %t29, ptr %t23 + %t32 = load ptr, ptr %a1 + %t33 = call %S.gen.Saved @finch.gen.beginHelper(ptr %t32) + store %S.gen.Saved %t33, ptr %a34 + %t35 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t36 = load { ptr, i64, i64 }, ptr %t35 + store { ptr, i64, i64 } %t36, ptr %a37 + store { ptr, i64, i64 } { ptr @.str.1378, i64 5, i64 0 }, ptr %a38 + %t39 = call i32 @finch_str_eq(ptr %a37, ptr %a38) + %t40 = icmp ne i32 %t39, 0 + br i1 %t40, label %then2335, label %else2336 +then2335: + %t41 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t42 = load { ptr, i64, i64 }, ptr %t41 + %t43 = extractvalue { ptr, i64, i64 } %t42, 1 + %t44 = icmp uge i64 0, %t43 + br i1 %t44, label %range2338, label %inrange2339 +range2338: + call void @finch_panic_index(ptr @.str.1379, i64 676, i64 0, i64 %t43) + unreachable +inrange2339: + %t45 = extractvalue { ptr, i64, i64 } %t42, 0 + %t46 = getelementptr inbounds %S.ast.Type, ptr %t45, i64 0 + %t47 = load %S.ast.Type, ptr %t46 + store %S.ast.Type %t47, ptr %a48 + call void @finch.copy.S_ast_Type(ptr %a49, ptr %a48) + %t50 = load %S.ast.Type, ptr %a49 + store %S.ast.Type %t50, ptr %a51 + %t52 = load ptr, ptr %a1 + %t53 = load ptr, ptr %a1 + %t54 = load %S.ast.Type, ptr %a51 + %t55 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t53, %S.ast.Type %t54) + store { ptr, i64, i64 } { ptr @.str.1380, i64 55, i64 0 }, ptr %a57 + store { ptr, i64, i64 } %t55, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t59, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.1381, i64 1, i64 0 }, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + call void @finch.gen.emit(ptr %t52, { ptr, i64, i64 } %t63) + %t64 = load ptr, ptr %a1 + %t65 = load %S.ast.Type, ptr %a51 + %t66 = call i1 @finch.gen.owning(ptr %t64, %S.ast.Type %t65) + br i1 %t66, label %then2340, label %endif2342 +then2340: + %t67 = load ptr, ptr %a1 + %t68 = call { ptr, i64, i64 } @finch.gen.load(ptr %t67, { ptr, i64, i64 } { ptr @.str.1382, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.1383, i64 4, i64 0 }) + store { ptr, i64, i64 } %t68, ptr %a69 + %t70 = load ptr, ptr %a1 + %t71 = call { ptr, i64, i64 } @finch.gen.load(ptr %t70, { ptr, i64, i64 } { ptr @.str.1384, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.1385, i64 4, i64 0 }) + store { ptr, i64, i64 } %t71, ptr %a72 + %t73 = load ptr, ptr %a1 + %t74 = load ptr, ptr %a1 + %t75 = call { ptr, i64, i64 } @finch.gen.op(ptr %t74, { ptr, i64, i64 } { ptr @.str.1387, i64 64, i64 0 }) + %t76 = call { ptr, i64, i64 } @finch.gen.load(ptr %t73, { ptr, i64, i64 } { ptr @.str.1386, i64 3, i64 0 }, { ptr, i64, i64 } %t75) + store { ptr, i64, i64 } %t76, ptr %a77 + %t78 = load ptr, ptr %a1 + %t79 = load { ptr, i64, i64 }, ptr %a77 + %t80 = call { ptr, i64, i64 } @finch.gen.loopStart(ptr %t78, { ptr, i64, i64 } %t79) + store { ptr, i64, i64 } %t80, ptr %a81 + %t82 = load ptr, ptr %a1 + %t83 = load ptr, ptr %a1 + %t84 = load %S.ast.Type, ptr %a51 + %t85 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t83, %S.ast.Type %t84) + store { ptr, i64, i64 } { ptr @.str.1388, i64 23, i64 0 }, ptr %a87 + store { ptr, i64, i64 } %t85, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t89, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.1389, i64 6, i64 0 }, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + %t94 = load { ptr, i64, i64 }, ptr %a69 + store { ptr, i64, i64 } %t93, ptr %a96 + store { ptr, i64, i64 } %t94, ptr %a97 + call void @finch_str_concat(ptr %a95, ptr %a96, ptr %a97) + %t98 = load { ptr, i64, i64 }, ptr %a95 + store { ptr, i64, i64 } %t98, ptr %a100 + store { ptr, i64, i64 } { ptr @.str.1390, i64 6, i64 0 }, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + %t103 = load { ptr, i64, i64 }, ptr %a81 + %t104 = extractvalue { ptr, i64, i64 } %t103, 1 + %t105 = icmp uge i64 3, %t104 + br i1 %t105, label %range2343, label %inrange2344 +range2343: + call void @finch_panic_index(ptr @.str.1391, i64 683, i64 3, i64 %t104) + unreachable +inrange2344: + %t106 = extractvalue { ptr, i64, i64 } %t103, 0 + %t107 = getelementptr inbounds { ptr, i64, i64 }, ptr %t106, i64 3 + %t108 = load { ptr, i64, i64 }, ptr %t107 + store { ptr, i64, i64 } %t102, ptr %a110 + store { ptr, i64, i64 } %t108, ptr %a111 + call void @finch_str_concat(ptr %a109, ptr %a110, ptr %a111) + %t112 = load { ptr, i64, i64 }, ptr %a109 + %t113 = call { ptr, i64, i64 } @finch.gen.op(ptr %t82, { ptr, i64, i64 } %t112) + store { ptr, i64, i64 } %t113, ptr %a114 + %t115 = load ptr, ptr %a1 + %t116 = load ptr, ptr %a1 + %t117 = load %S.ast.Type, ptr %a51 + %t118 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t116, %S.ast.Type %t117) + store { ptr, i64, i64 } { ptr @.str.1392, i64 23, i64 0 }, ptr %a120 + store { ptr, i64, i64 } %t118, ptr %a121 + call void @finch_str_concat(ptr %a119, ptr %a120, ptr %a121) + %t122 = load { ptr, i64, i64 }, ptr %a119 + store { ptr, i64, i64 } %t122, ptr %a124 + store { ptr, i64, i64 } { ptr @.str.1393, i64 6, i64 0 }, ptr %a125 + call void @finch_str_concat(ptr %a123, ptr %a124, ptr %a125) + %t126 = load { ptr, i64, i64 }, ptr %a123 + %t127 = load { ptr, i64, i64 }, ptr %a72 + store { ptr, i64, i64 } %t126, ptr %a129 + store { ptr, i64, i64 } %t127, ptr %a130 + call void @finch_str_concat(ptr %a128, ptr %a129, ptr %a130) + %t131 = load { ptr, i64, i64 }, ptr %a128 + store { ptr, i64, i64 } %t131, ptr %a133 + store { ptr, i64, i64 } { ptr @.str.1394, i64 6, i64 0 }, ptr %a134 + call void @finch_str_concat(ptr %a132, ptr %a133, ptr %a134) + %t135 = load { ptr, i64, i64 }, ptr %a132 + %t136 = load { ptr, i64, i64 }, ptr %a81 + %t137 = extractvalue { ptr, i64, i64 } %t136, 1 + %t138 = icmp uge i64 3, %t137 + br i1 %t138, label %range2345, label %inrange2346 +range2345: + call void @finch_panic_index(ptr @.str.1395, i64 684, i64 3, i64 %t137) + unreachable +inrange2346: + %t139 = extractvalue { ptr, i64, i64 } %t136, 0 + %t140 = getelementptr inbounds { ptr, i64, i64 }, ptr %t139, i64 3 + %t141 = load { ptr, i64, i64 }, ptr %t140 + store { ptr, i64, i64 } %t135, ptr %a143 + store { ptr, i64, i64 } %t141, ptr %a144 + call void @finch_str_concat(ptr %a142, ptr %a143, ptr %a144) + %t145 = load { ptr, i64, i64 }, ptr %a142 + %t146 = call { ptr, i64, i64 } @finch.gen.op(ptr %t115, { ptr, i64, i64 } %t145) + store { ptr, i64, i64 } %t146, ptr %a147 + %t148 = load ptr, ptr %a1 + %t149 = load { ptr, i64, i64 }, ptr %a114 + %t150 = load { ptr, i64, i64 }, ptr %a147 + %t151 = load %S.ast.Type, ptr %a51 + call void @finch.gen.copyAt(ptr %t148, { ptr, i64, i64 } %t149, { ptr, i64, i64 } %t150, %S.ast.Type %t151) + %t152 = load ptr, ptr %a1 + %t153 = load { ptr, i64, i64 }, ptr %a81 + call void @finch.gen.loopEnd(ptr %t152, { ptr, i64, i64 } %t153) + br label %endif2342 +endif2342: + br label %endif2337 +else2336: + %t154 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t155 = load { ptr, i64, i64 }, ptr %t154 + store { ptr, i64, i64 } %t155, ptr %a156 + store { ptr, i64, i64 } { ptr @.str.1396, i64 3, i64 0 }, ptr %a157 + %t158 = call i32 @finch_str_eq(ptr %a156, ptr %a157) + %t159 = icmp ne i32 %t158, 0 + br i1 %t159, label %then2347, label %else2348 +then2347: + %t160 = load ptr, ptr %a1 + %t161 = load ptr, ptr %a1 + %t162 = load %S.ast.Type, ptr %a2 + %t163 = call { ptr, i64, i64 } @finch.gen.entrySize(ptr %t161, %S.ast.Type %t162) + store { ptr, i64, i64 } { ptr @.str.1397, i64 55, i64 0 }, ptr %a165 + store { ptr, i64, i64 } %t163, ptr %a166 + call void @finch_str_concat(ptr %a164, ptr %a165, ptr %a166) + %t167 = load { ptr, i64, i64 }, ptr %a164 + store { ptr, i64, i64 } %t167, ptr %a169 + store { ptr, i64, i64 } { ptr @.str.1398, i64 1, i64 0 }, ptr %a170 + call void @finch_str_concat(ptr %a168, ptr %a169, ptr %a170) + %t171 = load { ptr, i64, i64 }, ptr %a168 + call void @finch.gen.emit(ptr %t160, { ptr, i64, i64 } %t171) + %t172 = load ptr, ptr %a1 + %t173 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t174 = load { ptr, i64, i64 }, ptr %t173 + %t175 = extractvalue { ptr, i64, i64 } %t174, 1 + %t176 = icmp uge i64 0, %t175 + br i1 %t176, label %range2350, label %inrange2351 +range2350: + call void @finch_panic_index(ptr @.str.1399, i64 690, i64 0, i64 %t175) + unreachable +inrange2351: + %t177 = extractvalue { ptr, i64, i64 } %t174, 0 + %t178 = getelementptr inbounds %S.ast.Type, ptr %t177, i64 0 + %t179 = load %S.ast.Type, ptr %t178 + %t180 = call i1 @finch.gen.owning(ptr %t172, %S.ast.Type %t179) + br label %logic.from2352 +logic.from2352: + br i1 %t180, label %logic.end2354, label %logic.rhs2353 +logic.rhs2353: + %t181 = load ptr, ptr %a1 + %t182 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t183 = load { ptr, i64, i64 }, ptr %t182 + %t184 = extractvalue { ptr, i64, i64 } %t183, 1 + %t185 = icmp uge i64 1, %t184 + br i1 %t185, label %range2355, label %inrange2356 +range2355: + call void @finch_panic_index(ptr @.str.1400, i64 690, i64 1, i64 %t184) + unreachable +inrange2356: + %t186 = extractvalue { ptr, i64, i64 } %t183, 0 + %t187 = getelementptr inbounds %S.ast.Type, ptr %t186, i64 1 + %t188 = load %S.ast.Type, ptr %t187 + %t189 = call i1 @finch.gen.owning(ptr %t181, %S.ast.Type %t188) + br label %logic.rend2357 +logic.rend2357: + br label %logic.end2354 +logic.end2354: + %t190 = phi i1 [ true, %logic.from2352 ], [ %t189, %logic.rend2357 ] + br i1 %t190, label %then2358, label %endif2360 +then2358: + %t191 = load ptr, ptr %a1 + %t192 = load ptr, ptr %a1 + %t193 = load ptr, ptr %a1 + %t194 = load %S.ast.Type, ptr %a2 + %t195 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t193, %S.ast.Type %t194) + store { ptr, i64, i64 } { ptr @.str.1402, i64 23, i64 0 }, ptr %a197 + store { ptr, i64, i64 } %t195, ptr %a198 + call void @finch_str_concat(ptr %a196, ptr %a197, ptr %a198) + %t199 = load { ptr, i64, i64 }, ptr %a196 + store { ptr, i64, i64 } %t199, ptr %a201 + store { ptr, i64, i64 } { ptr @.str.1403, i64 24, i64 0 }, ptr %a202 + call void @finch_str_concat(ptr %a200, ptr %a201, ptr %a202) + %t203 = load { ptr, i64, i64 }, ptr %a200 + %t204 = call { ptr, i64, i64 } @finch.gen.op(ptr %t192, { ptr, i64, i64 } %t203) + %t205 = call { ptr, i64, i64 } @finch.gen.load(ptr %t191, { ptr, i64, i64 } { ptr @.str.1401, i64 3, i64 0 }, { ptr, i64, i64 } %t204) + store { ptr, i64, i64 } %t205, ptr %a206 + %t207 = load ptr, ptr %a1 + %t208 = load { ptr, i64, i64 }, ptr %a206 + %t209 = call { ptr, i64, i64 } @finch.gen.loopStart(ptr %t207, { ptr, i64, i64 } %t208) + store { ptr, i64, i64 } %t209, ptr %a210 + %t211 = load ptr, ptr %a1 + %t212 = load %S.ast.Type, ptr %a2 + %t213 = load { ptr, i64, i64 }, ptr %a210 + %t214 = extractvalue { ptr, i64, i64 } %t213, 1 + %t215 = icmp uge i64 3, %t214 + br i1 %t215, label %range2361, label %inrange2362 +range2361: + call void @finch_panic_index(ptr @.str.1405, i64 694, i64 3, i64 %t214) + unreachable +inrange2362: + %t216 = extractvalue { ptr, i64, i64 } %t213, 0 + %t217 = getelementptr inbounds { ptr, i64, i64 }, ptr %t216, i64 3 + %t218 = load { ptr, i64, i64 }, ptr %t217 + %t219 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t211, { ptr, i64, i64 } { ptr @.str.1404, i64 4, i64 0 }, %S.ast.Type %t212, { ptr, i64, i64 } %t218) + store { ptr, i64, i64 } %t219, ptr %a220 + %t221 = load ptr, ptr %a1 + %t222 = load %S.ast.Type, ptr %a2 + %t223 = load { ptr, i64, i64 }, ptr %a210 + %t224 = extractvalue { ptr, i64, i64 } %t223, 1 + %t225 = icmp uge i64 3, %t224 + br i1 %t225, label %range2363, label %inrange2364 +range2363: + call void @finch_panic_index(ptr @.str.1407, i64 695, i64 3, i64 %t224) + unreachable +inrange2364: + %t226 = extractvalue { ptr, i64, i64 } %t223, 0 + %t227 = getelementptr inbounds { ptr, i64, i64 }, ptr %t226, i64 3 + %t228 = load { ptr, i64, i64 }, ptr %t227 + %t229 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t221, { ptr, i64, i64 } { ptr @.str.1406, i64 4, i64 0 }, %S.ast.Type %t222, { ptr, i64, i64 } %t228) + store { ptr, i64, i64 } %t229, ptr %a230 + %t231 = load ptr, ptr %a1 + %t232 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t231, { ptr, i64, i64 } { ptr @.str.1408, i64 10, i64 0 }) + store { ptr, i64, i64 } %t232, ptr %a233 + %t234 = load ptr, ptr %a1 + %t235 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t234, { ptr, i64, i64 } { ptr @.str.1409, i64 10, i64 0 }) + store { ptr, i64, i64 } %t235, ptr %a236 + %t237 = load ptr, ptr %a1 + %t238 = load ptr, ptr %a1 + %t239 = load ptr, ptr %a1 + %t240 = load ptr, ptr %a1 + %t241 = load ptr, ptr %a1 + %t242 = load %S.ast.Type, ptr %a2 + %t243 = call { ptr, i64, i64 } @finch.gen.entryTy(ptr %t241, %S.ast.Type %t242) + store { ptr, i64, i64 } { ptr @.str.1412, i64 23, i64 0 }, ptr %a245 + store { ptr, i64, i64 } %t243, ptr %a246 + call void @finch_str_concat(ptr %a244, ptr %a245, ptr %a246) + %t247 = load { ptr, i64, i64 }, ptr %a244 + store { ptr, i64, i64 } %t247, ptr %a249 + store { ptr, i64, i64 } { ptr @.str.1413, i64 6, i64 0 }, ptr %a250 + call void @finch_str_concat(ptr %a248, ptr %a249, ptr %a250) + %t251 = load { ptr, i64, i64 }, ptr %a248 + %t252 = load { ptr, i64, i64 }, ptr %a220 + store { ptr, i64, i64 } %t251, ptr %a254 + store { ptr, i64, i64 } %t252, ptr %a255 + call void @finch_str_concat(ptr %a253, ptr %a254, ptr %a255) + %t256 = load { ptr, i64, i64 }, ptr %a253 + store { ptr, i64, i64 } %t256, ptr %a258 + store { ptr, i64, i64 } { ptr @.str.1414, i64 14, i64 0 }, ptr %a259 + call void @finch_str_concat(ptr %a257, ptr %a258, ptr %a259) + %t260 = load { ptr, i64, i64 }, ptr %a257 + %t261 = call { ptr, i64, i64 } @finch.gen.op(ptr %t240, { ptr, i64, i64 } %t260) + %t262 = call { ptr, i64, i64 } @finch.gen.load(ptr %t239, { ptr, i64, i64 } { ptr @.str.1411, i64 3, i64 0 }, { ptr, i64, i64 } %t261) + store { ptr, i64, i64 } { ptr @.str.1410, i64 12, i64 0 }, ptr %a264 + store { ptr, i64, i64 } %t262, ptr %a265 + call void @finch_str_concat(ptr %a263, ptr %a264, ptr %a265) + %t266 = load { ptr, i64, i64 }, ptr %a263 + store { ptr, i64, i64 } %t266, ptr %a268 + store { ptr, i64, i64 } { ptr @.str.1415, i64 3, i64 0 }, ptr %a269 + call void @finch_str_concat(ptr %a267, ptr %a268, ptr %a269) + %t270 = load { ptr, i64, i64 }, ptr %a267 + %t271 = call { ptr, i64, i64 } @finch.gen.op(ptr %t238, { ptr, i64, i64 } %t270) + %t272 = load { ptr, i64, i64 }, ptr %a233 + %t273 = load { ptr, i64, i64 }, ptr %a236 + call void @finch.gen.condBr(ptr %t237, { ptr, i64, i64 } %t271, { ptr, i64, i64 } %t272, { ptr, i64, i64 } %t273) + %t274 = load ptr, ptr %a1 + %t275 = load { ptr, i64, i64 }, ptr %a233 + call void @finch.gen.label(ptr %t274, { ptr, i64, i64 } %t275) + %t276 = load ptr, ptr %a1 + %t277 = load ptr, ptr %a1 + %t278 = load { ptr, i64, i64 }, ptr %a230 + %t279 = load %S.ast.Type, ptr %a2 + %t280 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t277, { ptr, i64, i64 } %t278, %S.ast.Type %t279, i64 1) + %t281 = load ptr, ptr %a1 + %t282 = load { ptr, i64, i64 }, ptr %a220 + %t283 = load %S.ast.Type, ptr %a2 + %t284 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t281, { ptr, i64, i64 } %t282, %S.ast.Type %t283, i64 1) + %t285 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t286 = load { ptr, i64, i64 }, ptr %t285 + %t287 = extractvalue { ptr, i64, i64 } %t286, 1 + %t288 = icmp uge i64 0, %t287 + br i1 %t288, label %range2365, label %inrange2366 +range2365: + call void @finch_panic_index(ptr @.str.1416, i64 700, i64 0, i64 %t287) + unreachable +inrange2366: + %t289 = extractvalue { ptr, i64, i64 } %t286, 0 + %t290 = getelementptr inbounds %S.ast.Type, ptr %t289, i64 0 + %t291 = load %S.ast.Type, ptr %t290 + call void @finch.gen.copyAt(ptr %t276, { ptr, i64, i64 } %t280, { ptr, i64, i64 } %t284, %S.ast.Type %t291) + %t292 = load ptr, ptr %a1 + %t293 = load ptr, ptr %a1 + %t294 = load { ptr, i64, i64 }, ptr %a230 + %t295 = load %S.ast.Type, ptr %a2 + %t296 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t293, { ptr, i64, i64 } %t294, %S.ast.Type %t295, i64 2) + %t297 = load ptr, ptr %a1 + %t298 = load { ptr, i64, i64 }, ptr %a220 + %t299 = load %S.ast.Type, ptr %a2 + %t300 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t297, { ptr, i64, i64 } %t298, %S.ast.Type %t299, i64 2) + %t301 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t302 = load { ptr, i64, i64 }, ptr %t301 + %t303 = extractvalue { ptr, i64, i64 } %t302, 1 + %t304 = icmp uge i64 1, %t303 + br i1 %t304, label %range2367, label %inrange2368 +range2367: + call void @finch_panic_index(ptr @.str.1417, i64 701, i64 1, i64 %t303) + unreachable +inrange2368: + %t305 = extractvalue { ptr, i64, i64 } %t302, 0 + %t306 = getelementptr inbounds %S.ast.Type, ptr %t305, i64 1 + %t307 = load %S.ast.Type, ptr %t306 + call void @finch.gen.copyAt(ptr %t292, { ptr, i64, i64 } %t296, { ptr, i64, i64 } %t300, %S.ast.Type %t307) + %t308 = load ptr, ptr %a1 + %t309 = load { ptr, i64, i64 }, ptr %a236 + call void @finch.gen.br(ptr %t308, { ptr, i64, i64 } %t309) + %t310 = load ptr, ptr %a1 + %t311 = load { ptr, i64, i64 }, ptr %a236 + call void @finch.gen.label(ptr %t310, { ptr, i64, i64 } %t311) + %t312 = load ptr, ptr %a1 + %t313 = load { ptr, i64, i64 }, ptr %a210 + call void @finch.gen.loopEnd(ptr %t312, { ptr, i64, i64 } %t313) + br label %endif2360 +endif2360: + br label %endif2349 +else2348: + %t314 = load ptr, ptr %a1 + %t315 = icmp eq ptr %t314, null + br i1 %t315, label %panic2369, label %ok2370 +panic2369: + call void @finch_panic(ptr @.str.1418, i64 707, ptr @.str.1419) + unreachable +ok2370: + %t316 = getelementptr inbounds %S.gen.Gen, ptr %t314, i32 0, i32 15 + %t317 = load ptr, ptr %a1 + %t318 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t319 = load { ptr, i64, i64 }, ptr %t318 + %t320 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t321 = load { ptr, i64, i64 }, ptr %t320 + %t322 = call i64 @finch.gen.findStruct(ptr %t317, { ptr, i64, i64 } %t319, { ptr, i64, i64 } %t321) + %t323 = load { ptr, i64, i64 }, ptr %t316 + %t324 = extractvalue { ptr, i64, i64 } %t323, 1 + %t325 = icmp uge i64 %t322, %t324 + br i1 %t325, label %range2371, label %inrange2372 +range2371: + call void @finch_panic_index(ptr @.str.1420, i64 707, i64 %t322, i64 %t324) + unreachable +inrange2372: + %t326 = extractvalue { ptr, i64, i64 } %t323, 0 + %t327 = getelementptr inbounds %S.gen.StructDef, ptr %t326, i64 %t322 + %t328 = load %S.gen.StructDef, ptr %t327 + store %S.gen.StructDef %t328, ptr %a329 + call void @finch.copy.S_gen_StructDef(ptr %a330, ptr %a329) + %t331 = load %S.gen.StructDef, ptr %a330 + store %S.gen.StructDef %t331, ptr %a332 + %t333 = load ptr, ptr %a1 + %t334 = load %S.ast.Type, ptr %a2 + %t335 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t333, %S.ast.Type %t334) + store { ptr, i64, i64 } %t335, ptr %a336 + %t337 = load ptr, ptr %a1 + %t338 = load { ptr, i64, i64 }, ptr %a336 + %t339 = load ptr, ptr %a1 + %t340 = load { ptr, i64, i64 }, ptr %a336 + %t341 = call { ptr, i64, i64 } @finch.gen.load(ptr %t339, { ptr, i64, i64 } %t340, { ptr, i64, i64 } { ptr @.str.1421, i64 4, i64 0 }) + call void @finch.gen.store(ptr %t337, { ptr, i64, i64 } %t338, { ptr, i64, i64 } %t341, { ptr, i64, i64 } { ptr @.str.1422, i64 4, i64 0 }) + %t342 = getelementptr inbounds %S.gen.StructDef, ptr %a332, i32 0, i32 12 + %t343 = getelementptr inbounds { ptr, i64, i64 }, ptr %t342, i32 0, i32 1 + %t344 = load i64, ptr %t343 + store i64 0, ptr %a345 + br label %for.cond2373 +for.cond2373: + %t346 = load i64, ptr %a345 + %t347 = icmp slt i64 %t346, %t344 + br i1 %t347, label %for.body2374, label %for.end2376 +for.body2374: + %t348 = load ptr, ptr %a1 + %t349 = getelementptr inbounds %S.gen.StructDef, ptr %a332, i32 0, i32 12 + %t350 = load i64, ptr %a345 + %t351 = load { ptr, i64, i64 }, ptr %t349 + %t352 = extractvalue { ptr, i64, i64 } %t351, 1 + %t353 = icmp uge i64 %t350, %t352 + br i1 %t353, label %range2377, label %inrange2378 +range2377: + call void @finch_panic_index(ptr @.str.1423, i64 711, i64 %t350, i64 %t352) + unreachable +inrange2378: + %t354 = extractvalue { ptr, i64, i64 } %t351, 0 + %t355 = getelementptr inbounds %S.ast.Type, ptr %t354, i64 %t350 + %t356 = load %S.ast.Type, ptr %t355 + %t357 = call i1 @finch.gen.owning(ptr %t348, %S.ast.Type %t356) + br i1 %t357, label %then2379, label %endif2381 +then2379: + %t358 = load ptr, ptr %a1 + %t359 = load { ptr, i64, i64 }, ptr %a336 + store { ptr, i64, i64 } { ptr @.str.1424, i64 23, i64 0 }, ptr %a361 + store { ptr, i64, i64 } %t359, ptr %a362 + call void @finch_str_concat(ptr %a360, ptr %a361, ptr %a362) + %t363 = load { ptr, i64, i64 }, ptr %a360 + store { ptr, i64, i64 } %t363, ptr %a365 + store { ptr, i64, i64 } { ptr @.str.1425, i64 23, i64 0 }, ptr %a366 + call void @finch_str_concat(ptr %a364, ptr %a365, ptr %a366) + %t367 = load { ptr, i64, i64 }, ptr %a364 + %t368 = getelementptr inbounds %S.gen.StructDef, ptr %a332, i32 0, i32 3 + %t369 = load i64, ptr %a345 + %t370 = load { ptr, i64, i64 }, ptr %t368 + %t371 = extractvalue { ptr, i64, i64 } %t370, 1 + %t372 = icmp uge i64 %t369, %t371 + br i1 %t372, label %range2382, label %inrange2383 +range2382: + call void @finch_panic_index(ptr @.str.1426, i64 712, i64 %t369, i64 %t371) + unreachable +inrange2383: + %t373 = extractvalue { ptr, i64, i64 } %t370, 0 + %t374 = getelementptr inbounds i64, ptr %t373, i64 %t369 + %t375 = load i64, ptr %t374 + call void @finch_str_from_int(ptr %a376, i64 %t375) + %t377 = load { ptr, i64, i64 }, ptr %a376 + store { ptr, i64, i64 } %t367, ptr %a379 + store { ptr, i64, i64 } %t377, ptr %a380 + call void @finch_str_concat(ptr %a378, ptr %a379, ptr %a380) + %t381 = load { ptr, i64, i64 }, ptr %a378 + %t382 = call { ptr, i64, i64 } @finch.gen.op(ptr %t358, { ptr, i64, i64 } %t381) + store { ptr, i64, i64 } %t382, ptr %a383 + %t384 = load ptr, ptr %a1 + %t385 = load { ptr, i64, i64 }, ptr %a336 + store { ptr, i64, i64 } { ptr @.str.1427, i64 23, i64 0 }, ptr %a387 + store { ptr, i64, i64 } %t385, ptr %a388 + call void @finch_str_concat(ptr %a386, ptr %a387, ptr %a388) + %t389 = load { ptr, i64, i64 }, ptr %a386 + store { ptr, i64, i64 } %t389, ptr %a391 + store { ptr, i64, i64 } { ptr @.str.1428, i64 23, i64 0 }, ptr %a392 + call void @finch_str_concat(ptr %a390, ptr %a391, ptr %a392) + %t393 = load { ptr, i64, i64 }, ptr %a390 + %t394 = getelementptr inbounds %S.gen.StructDef, ptr %a332, i32 0, i32 3 + %t395 = load i64, ptr %a345 + %t396 = load { ptr, i64, i64 }, ptr %t394 + %t397 = extractvalue { ptr, i64, i64 } %t396, 1 + %t398 = icmp uge i64 %t395, %t397 + br i1 %t398, label %range2384, label %inrange2385 +range2384: + call void @finch_panic_index(ptr @.str.1429, i64 713, i64 %t395, i64 %t397) + unreachable +inrange2385: + %t399 = extractvalue { ptr, i64, i64 } %t396, 0 + %t400 = getelementptr inbounds i64, ptr %t399, i64 %t395 + %t401 = load i64, ptr %t400 + call void @finch_str_from_int(ptr %a402, i64 %t401) + %t403 = load { ptr, i64, i64 }, ptr %a402 + store { ptr, i64, i64 } %t393, ptr %a405 + store { ptr, i64, i64 } %t403, ptr %a406 + call void @finch_str_concat(ptr %a404, ptr %a405, ptr %a406) + %t407 = load { ptr, i64, i64 }, ptr %a404 + %t408 = call { ptr, i64, i64 } @finch.gen.op(ptr %t384, { ptr, i64, i64 } %t407) + store { ptr, i64, i64 } %t408, ptr %a409 + %t410 = load ptr, ptr %a1 + %t411 = load { ptr, i64, i64 }, ptr %a383 + %t412 = load { ptr, i64, i64 }, ptr %a409 + %t413 = getelementptr inbounds %S.gen.StructDef, ptr %a332, i32 0, i32 12 + %t414 = load i64, ptr %a345 + %t415 = load { ptr, i64, i64 }, ptr %t413 + %t416 = extractvalue { ptr, i64, i64 } %t415, 1 + %t417 = icmp uge i64 %t414, %t416 + br i1 %t417, label %range2386, label %inrange2387 +range2386: + call void @finch_panic_index(ptr @.str.1430, i64 714, i64 %t414, i64 %t416) + unreachable +inrange2387: + %t418 = extractvalue { ptr, i64, i64 } %t415, 0 + %t419 = getelementptr inbounds %S.ast.Type, ptr %t418, i64 %t414 + %t420 = load %S.ast.Type, ptr %t419 + call void @finch.gen.copyAt(ptr %t410, { ptr, i64, i64 } %t411, { ptr, i64, i64 } %t412, %S.ast.Type %t420) + br label %endif2381 +endif2381: + br label %for.step2375 +for.step2375: + %t421 = load i64, ptr %a345 + %t422 = add i64 %t421, 1 + store i64 %t422, ptr %a345 + br label %for.cond2373 +for.end2376: + br label %endif2349 +endif2349: + br label %endif2337 +endif2337: + %t423 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t423, { ptr, i64, i64 } { ptr @.str.1431, i64 8, i64 0 }) + %t424 = load ptr, ptr %a1 + %t425 = load %S.gen.Saved, ptr %a34 + %t426 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1432, i64 21, i64 0 }, ptr %a428 + store { ptr, i64, i64 } %t426, ptr %a429 + call void @finch_str_concat(ptr %a427, ptr %a428, ptr %a429) + %t430 = load { ptr, i64, i64 }, ptr %a427 + store { ptr, i64, i64 } %t430, ptr %a432 + store { ptr, i64, i64 } { ptr @.str.1433, i64 20, i64 0 }, ptr %a433 + call void @finch_str_concat(ptr %a431, ptr %a432, ptr %a433) + %t434 = load { ptr, i64, i64 }, ptr %a431 + call void @finch.gen.endHelper(ptr %t424, %S.gen.Saved %t425, { ptr, i64, i64 } %t434) + %t435 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t435, ptr %a436 + call void @finch_str_copy(ptr %a437, ptr %a436) + %t438 = load { ptr, i64, i64 }, ptr %a437 + ret { ptr, i64, i64 } %t438 +} + +define internal { ptr, i64, i64 } @finch.gen.copyValue(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca %S.ast.Type, align 16 + %a20 = alloca %S.ast.Type, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = load %S.ast.Type, ptr %a3 + %t6 = call i1 @finch.gen.owning(ptr %t4, %S.ast.Type %t5) + %t7 = xor i1 %t6, true + br i1 %t7, label %then2388, label %endif2390 +then2388: + %t8 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t8, ptr %a9 + call void @finch_str_copy(ptr %a10, ptr %a9) + %t11 = load { ptr, i64, i64 }, ptr %a10 + ret { ptr, i64, i64 } %t11 +endif2390: + %t12 = load ptr, ptr %a1 + %t13 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t13, ptr %a14 + call void @finch_str_copy(ptr %a15, ptr %a14) + %t16 = load { ptr, i64, i64 }, ptr %a15 + %t17 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t16, 0 + %t18 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t18, ptr %a19 + call void @finch.copy.S_ast_Type(ptr %a20, ptr %a19) + %t21 = load %S.ast.Type, ptr %a20 + %t22 = insertvalue %S.gen.Val %t17, %S.ast.Type %t21, 1 + %t23 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t12, %S.gen.Val %t22) + store { ptr, i64, i64 } %t23, ptr %a24 + %t25 = load ptr, ptr %a1 + %t26 = load ptr, ptr %a1 + %t27 = load %S.ast.Type, ptr %a3 + %t28 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t26, %S.ast.Type %t27) + %t29 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t25, { ptr, i64, i64 } %t28) + store { ptr, i64, i64 } %t29, ptr %a30 + %t31 = load ptr, ptr %a1 + %t32 = load { ptr, i64, i64 }, ptr %a30 + %t33 = load { ptr, i64, i64 }, ptr %a24 + %t34 = load %S.ast.Type, ptr %a3 + call void @finch.gen.copyAt(ptr %t31, { ptr, i64, i64 } %t32, { ptr, i64, i64 } %t33, %S.ast.Type %t34) + %t35 = load ptr, ptr %a1 + %t36 = load ptr, ptr %a1 + %t37 = load %S.ast.Type, ptr %a3 + %t38 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t36, %S.ast.Type %t37) + %t39 = load { ptr, i64, i64 }, ptr %a30 + %t40 = call { ptr, i64, i64 } @finch.gen.load(ptr %t35, { ptr, i64, i64 } %t38, { ptr, i64, i64 } %t39) + ret { ptr, i64, i64 } %t40 +} + +define internal { ptr, i64, i64 } @finch.gen.own(ptr %p0, %S.gen.Val %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.Val, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.gen.Val %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t5 = load %S.ast.Type, ptr %t4 + %t6 = call i1 @finch.gen.owning(ptr %t3, %S.ast.Type %t5) + %t7 = xor i1 %t6, true + br label %logic.from2391 +logic.from2391: + br i1 %t7, label %logic.end2393, label %logic.rhs2392 +logic.rhs2392: + %t8 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 2 + %t9 = load i1, ptr %t8 + br label %logic.rend2394 +logic.rend2394: + br label %logic.end2393 +logic.end2393: + %t10 = phi i1 [ true, %logic.from2391 ], [ %t9, %logic.rend2394 ] + br i1 %t10, label %then2395, label %endif2397 +then2395: + %t11 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t12 = load { ptr, i64, i64 }, ptr %t11 + store { ptr, i64, i64 } %t12, ptr %a13 + call void @finch_str_copy(ptr %a14, ptr %a13) + %t15 = load { ptr, i64, i64 }, ptr %a14 + ret { ptr, i64, i64 } %t15 +endif2397: + %t16 = load ptr, ptr %a1 + %t17 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t18 = load { ptr, i64, i64 }, ptr %t17 + %t19 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t20 = load %S.ast.Type, ptr %t19 + %t21 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t16, { ptr, i64, i64 } %t18, %S.ast.Type %t20) + ret { ptr, i64, i64 } %t21 +} + +define internal void @finch.gen.printf(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = load { ptr, i64, i64 }, ptr %a2 + %t6 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t4, { ptr, i64, i64 } %t5) + store { ptr, i64, i64 } %t6, ptr %a7 + %t8 = load ptr, ptr %a1 + %t9 = call { ptr, i64, i64 } @finch.gen.tmpName(ptr %t8) + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1434, i64 0, i64 0 }, ptr %a11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t13 = load i64, ptr %t12 + %t14 = icmp sgt i64 %t13, 0 + br i1 %t14, label %then2398, label %endif2400 +then2398: + %t15 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.1435, i64 2, i64 0 }, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t19, ptr %a11 + br label %endif2400 +endif2400: + %t20 = load ptr, ptr %a1 + %t21 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.1436, i64 35, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + %t26 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t25, ptr %a28 + store { ptr, i64, i64 } %t26, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + %t31 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t30, ptr %a33 + store { ptr, i64, i64 } %t31, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t35, ptr %a37 + store { ptr, i64, i64 } { ptr @.str.1437, i64 1, i64 0 }, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + call void @finch.gen.emit(ptr %t20, { ptr, i64, i64 } %t39) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.cstr(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1438, i64 31, i64 0 }, ptr %a6 + store { ptr, i64, i64 } %t4, ptr %a7 + call void @finch_str_concat(ptr %a5, ptr %a6, ptr %a7) + %t8 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t8, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.1439, i64 3, i64 0 }, ptr %a11 + call void @finch_str_concat(ptr %a9, ptr %a10, ptr %a11) + %t12 = load { ptr, i64, i64 }, ptr %a9 + %t13 = call { ptr, i64, i64 } @finch.gen.op(ptr %t3, { ptr, i64, i64 } %t12) + store { ptr, i64, i64 } %t13, ptr %a14 + %t15 = load ptr, ptr %a1 + %t16 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.1440, i64 12, i64 0 }, ptr %a18 + store { ptr, i64, i64 } %t16, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t20, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.1441, i64 6, i64 0 }, ptr %a23 + call void @finch_str_concat(ptr %a21, ptr %a22, ptr %a23) + %t24 = load { ptr, i64, i64 }, ptr %a21 + %t25 = call { ptr, i64, i64 } @finch.gen.op(ptr %t15, { ptr, i64, i64 } %t24) + store { ptr, i64, i64 } %t25, ptr %a26 + %t27 = load ptr, ptr %a1 + %t28 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t27, { ptr, i64, i64 } { ptr @.str.1442, i64 0, i64 0 }) + store { ptr, i64, i64 } %t28, ptr %a29 + %t30 = load ptr, ptr %a1 + %t31 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.1443, i64 10, i64 0 }, ptr %a33 + store { ptr, i64, i64 } %t31, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t35, ptr %a37 + store { ptr, i64, i64 } { ptr @.str.1444, i64 6, i64 0 }, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + %t40 = load { ptr, i64, i64 }, ptr %a29 + store { ptr, i64, i64 } %t39, ptr %a42 + store { ptr, i64, i64 } %t40, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + store { ptr, i64, i64 } %t44, ptr %a46 + store { ptr, i64, i64 } { ptr @.str.1445, i64 6, i64 0 }, ptr %a47 + call void @finch_str_concat(ptr %a45, ptr %a46, ptr %a47) + %t48 = load { ptr, i64, i64 }, ptr %a45 + %t49 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t48, ptr %a51 + store { ptr, i64, i64 } %t49, ptr %a52 + call void @finch_str_concat(ptr %a50, ptr %a51, ptr %a52) + %t53 = load { ptr, i64, i64 }, ptr %a50 + %t54 = call { ptr, i64, i64 } @finch.gen.op(ptr %t30, { ptr, i64, i64 } %t53) + ret { ptr, i64, i64 } %t54 +} + +define internal void @finch.gen.emitPrint(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2, i1 %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca i1, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store i1 %p3, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t6 = load { ptr, i64, i64 }, ptr %t5 + store { ptr, i64, i64 } %t6, ptr %a7 + call void @finch_str_copy(ptr %a8, ptr %a7) + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + %t11 = load %S.ast.Type, ptr %a3 + %t12 = call i1 @finch.gen.isSigned(%S.ast.Type %t11) + br i1 %t12, label %then2401, label %else2402 +then2401: + %t13 = load ptr, ptr %a1 + %t14 = load ptr, ptr %a1 + %t15 = load { ptr, i64, i64 }, ptr %a2 + %t16 = load %S.ast.Type, ptr %a3 + %t17 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.1448, i64 3, i64 0 }) + %t18 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t14, { ptr, i64, i64 } %t15, %S.ast.Type %t16, %S.ast.Type %t17) + store { ptr, i64, i64 } { ptr @.str.1447, i64 4, i64 0 }, ptr %a20 + store { ptr, i64, i64 } %t18, ptr %a21 + call void @finch_str_concat(ptr %a19, ptr %a20, ptr %a21) + %t22 = load { ptr, i64, i64 }, ptr %a19 + call void @finch.gen.printf(ptr %t13, { ptr, i64, i64 } { ptr @.str.1446, i64 4, i64 0 }, { ptr, i64, i64 } %t22) + br label %endif2403 +else2402: + %t23 = load %S.ast.Type, ptr %a3 + %t24 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t23) + br i1 %t24, label %then2404, label %else2405 +then2404: + %t25 = load ptr, ptr %a1 + %t26 = load ptr, ptr %a1 + %t27 = load { ptr, i64, i64 }, ptr %a2 + %t28 = load %S.ast.Type, ptr %a3 + %t29 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.1451, i64 3, i64 0 }) + %t30 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t26, { ptr, i64, i64 } %t27, %S.ast.Type %t28, %S.ast.Type %t29) + store { ptr, i64, i64 } { ptr @.str.1450, i64 4, i64 0 }, ptr %a32 + store { ptr, i64, i64 } %t30, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + call void @finch.gen.printf(ptr %t25, { ptr, i64, i64 } { ptr @.str.1449, i64 4, i64 0 }, { ptr, i64, i64 } %t34) + br label %endif2406 +else2405: + %t35 = load %S.ast.Type, ptr %a3 + %t36 = call i1 @finch.gen.isFloat(%S.ast.Type %t35) + br i1 %t36, label %then2407, label %else2408 +then2407: + %t37 = load ptr, ptr %a1 + %t38 = load ptr, ptr %a1 + %t39 = load { ptr, i64, i64 }, ptr %a2 + %t40 = load %S.ast.Type, ptr %a3 + %t41 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.1454, i64 5, i64 0 }) + %t42 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t38, { ptr, i64, i64 } %t39, %S.ast.Type %t40, %S.ast.Type %t41) + store { ptr, i64, i64 } { ptr @.str.1453, i64 7, i64 0 }, ptr %a44 + store { ptr, i64, i64 } %t42, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + call void @finch.gen.printf(ptr %t37, { ptr, i64, i64 } { ptr @.str.1452, i64 2, i64 0 }, { ptr, i64, i64 } %t46) + br label %endif2409 +else2408: + %t47 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t47, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.1455, i64 4, i64 0 }, ptr %a49 + %t50 = call i32 @finch_str_eq(ptr %a48, ptr %a49) + %t51 = icmp ne i32 %t50, 0 + br i1 %t51, label %then2410, label %else2411 +then2410: + %t52 = load ptr, ptr %a1 + %t53 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1456, i64 8, i64 0 }, ptr %a55 + store { ptr, i64, i64 } %t53, ptr %a56 + call void @finch_str_concat(ptr %a54, ptr %a55, ptr %a56) + %t57 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t57, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.1457, i64 7, i64 0 }, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + %t62 = call { ptr, i64, i64 } @finch.gen.op(ptr %t52, { ptr, i64, i64 } %t61) + store { ptr, i64, i64 } %t62, ptr %a63 + %t64 = load i1, ptr %a4 + br i1 %t64, label %then2413, label %else2414 +then2413: + %t65 = load ptr, ptr %a1 + %t66 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.1459, i64 4, i64 0 }, ptr %a68 + store { ptr, i64, i64 } %t66, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + call void @finch.gen.printf(ptr %t65, { ptr, i64, i64 } { ptr @.str.1458, i64 4, i64 0 }, { ptr, i64, i64 } %t70) + br label %endif2415 +else2414: + %t71 = load ptr, ptr %a1 + %t72 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.1461, i64 4, i64 0 }, ptr %a74 + store { ptr, i64, i64 } %t72, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + call void @finch.gen.printf(ptr %t71, { ptr, i64, i64 } { ptr @.str.1460, i64 2, i64 0 }, { ptr, i64, i64 } %t76) + br label %endif2415 +endif2415: + br label %endif2412 +else2411: + %t77 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t77, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.1462, i64 4, i64 0 }, ptr %a79 + %t80 = call i32 @finch_str_eq(ptr %a78, ptr %a79) + %t81 = icmp ne i32 %t80, 0 + br i1 %t81, label %then2416, label %else2417 +then2416: + %t82 = load ptr, ptr %a1 + %t83 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t82, { ptr, i64, i64 } { ptr @.str.1463, i64 4, i64 0 }) + store { ptr, i64, i64 } %t83, ptr %a84 + %t85 = load ptr, ptr %a1 + %t86 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t85, { ptr, i64, i64 } { ptr @.str.1464, i64 5, i64 0 }) + store { ptr, i64, i64 } %t86, ptr %a87 + %t88 = load ptr, ptr %a1 + %t89 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1465, i64 10, i64 0 }, ptr %a91 + store { ptr, i64, i64 } %t89, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + store { ptr, i64, i64 } %t93, ptr %a95 + store { ptr, i64, i64 } { ptr @.str.1466, i64 6, i64 0 }, ptr %a96 + call void @finch_str_concat(ptr %a94, ptr %a95, ptr %a96) + %t97 = load { ptr, i64, i64 }, ptr %a94 + %t98 = load { ptr, i64, i64 }, ptr %a84 + store { ptr, i64, i64 } %t97, ptr %a100 + store { ptr, i64, i64 } %t98, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + store { ptr, i64, i64 } %t102, ptr %a104 + store { ptr, i64, i64 } { ptr @.str.1467, i64 6, i64 0 }, ptr %a105 + call void @finch_str_concat(ptr %a103, ptr %a104, ptr %a105) + %t106 = load { ptr, i64, i64 }, ptr %a103 + %t107 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t106, ptr %a109 + store { ptr, i64, i64 } %t107, ptr %a110 + call void @finch_str_concat(ptr %a108, ptr %a109, ptr %a110) + %t111 = load { ptr, i64, i64 }, ptr %a108 + %t112 = call { ptr, i64, i64 } @finch.gen.op(ptr %t88, { ptr, i64, i64 } %t111) + store { ptr, i64, i64 } %t112, ptr %a113 + %t114 = load ptr, ptr %a1 + %t115 = load { ptr, i64, i64 }, ptr %a113 + store { ptr, i64, i64 } { ptr @.str.1469, i64 4, i64 0 }, ptr %a117 + store { ptr, i64, i64 } %t115, ptr %a118 + call void @finch_str_concat(ptr %a116, ptr %a117, ptr %a118) + %t119 = load { ptr, i64, i64 }, ptr %a116 + call void @finch.gen.printf(ptr %t114, { ptr, i64, i64 } { ptr @.str.1468, i64 2, i64 0 }, { ptr, i64, i64 } %t119) + br label %endif2418 +else2417: + %t120 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t120, ptr %a121 + store { ptr, i64, i64 } { ptr @.str.1470, i64 3, i64 0 }, ptr %a122 + %t123 = call i32 @finch_str_eq(ptr %a121, ptr %a122) + %t124 = icmp ne i32 %t123, 0 + br i1 %t124, label %then2419, label %else2420 +then2419: + %t125 = load ptr, ptr %a1 + %t126 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1471, i64 31, i64 0 }, ptr %a128 + store { ptr, i64, i64 } %t126, ptr %a129 + call void @finch_str_concat(ptr %a127, ptr %a128, ptr %a129) + %t130 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t130, ptr %a132 + store { ptr, i64, i64 } { ptr @.str.1472, i64 3, i64 0 }, ptr %a133 + call void @finch_str_concat(ptr %a131, ptr %a132, ptr %a133) + %t134 = load { ptr, i64, i64 }, ptr %a131 + %t135 = call { ptr, i64, i64 } @finch.gen.op(ptr %t125, { ptr, i64, i64 } %t134) + store { ptr, i64, i64 } %t135, ptr %a136 + %t137 = load ptr, ptr %a1 + %t138 = load { ptr, i64, i64 }, ptr %a136 + store { ptr, i64, i64 } { ptr @.str.1473, i64 10, i64 0 }, ptr %a140 + store { ptr, i64, i64 } %t138, ptr %a141 + call void @finch_str_concat(ptr %a139, ptr %a140, ptr %a141) + %t142 = load { ptr, i64, i64 }, ptr %a139 + store { ptr, i64, i64 } %t142, ptr %a144 + store { ptr, i64, i64 } { ptr @.str.1474, i64 7, i64 0 }, ptr %a145 + call void @finch_str_concat(ptr %a143, ptr %a144, ptr %a145) + %t146 = load { ptr, i64, i64 }, ptr %a143 + %t147 = call { ptr, i64, i64 } @finch.gen.op(ptr %t137, { ptr, i64, i64 } %t146) + store { ptr, i64, i64 } %t147, ptr %a148 + %t149 = load ptr, ptr %a1 + %t150 = load { ptr, i64, i64 }, ptr %a2 + %t151 = call { ptr, i64, i64 } @finch.gen.cstr(ptr %t149, { ptr, i64, i64 } %t150) + store { ptr, i64, i64 } %t151, ptr %a152 + %t153 = load i1, ptr %a4 + br i1 %t153, label %then2422, label %else2423 +then2422: + %t154 = load ptr, ptr %a1 + %t155 = load { ptr, i64, i64 }, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.1476, i64 4, i64 0 }, ptr %a157 + store { ptr, i64, i64 } %t155, ptr %a158 + call void @finch_str_concat(ptr %a156, ptr %a157, ptr %a158) + %t159 = load { ptr, i64, i64 }, ptr %a156 + store { ptr, i64, i64 } %t159, ptr %a161 + store { ptr, i64, i64 } { ptr @.str.1477, i64 6, i64 0 }, ptr %a162 + call void @finch_str_concat(ptr %a160, ptr %a161, ptr %a162) + %t163 = load { ptr, i64, i64 }, ptr %a160 + %t164 = load { ptr, i64, i64 }, ptr %a152 + store { ptr, i64, i64 } %t163, ptr %a166 + store { ptr, i64, i64 } %t164, ptr %a167 + call void @finch_str_concat(ptr %a165, ptr %a166, ptr %a167) + %t168 = load { ptr, i64, i64 }, ptr %a165 + call void @finch.gen.printf(ptr %t154, { ptr, i64, i64 } { ptr @.str.1475, i64 6, i64 0 }, { ptr, i64, i64 } %t168) + br label %endif2424 +else2423: + %t169 = load ptr, ptr %a1 + %t170 = load { ptr, i64, i64 }, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.1479, i64 4, i64 0 }, ptr %a172 + store { ptr, i64, i64 } %t170, ptr %a173 + call void @finch_str_concat(ptr %a171, ptr %a172, ptr %a173) + %t174 = load { ptr, i64, i64 }, ptr %a171 + store { ptr, i64, i64 } %t174, ptr %a176 + store { ptr, i64, i64 } { ptr @.str.1480, i64 6, i64 0 }, ptr %a177 + call void @finch_str_concat(ptr %a175, ptr %a176, ptr %a177) + %t178 = load { ptr, i64, i64 }, ptr %a175 + %t179 = load { ptr, i64, i64 }, ptr %a152 + store { ptr, i64, i64 } %t178, ptr %a181 + store { ptr, i64, i64 } %t179, ptr %a182 + call void @finch_str_concat(ptr %a180, ptr %a181, ptr %a182) + %t183 = load { ptr, i64, i64 }, ptr %a180 + call void @finch.gen.printf(ptr %t169, { ptr, i64, i64 } { ptr @.str.1478, i64 4, i64 0 }, { ptr, i64, i64 } %t183) + br label %endif2424 +endif2424: + br label %endif2421 +else2420: + %t184 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t184, ptr %a185 + store { ptr, i64, i64 } { ptr @.str.1481, i64 3, i64 0 }, ptr %a186 + %t187 = call i32 @finch_str_eq(ptr %a185, ptr %a186) + %t188 = icmp ne i32 %t187, 0 + br i1 %t188, label %then2425, label %else2426 +then2425: + %t189 = load ptr, ptr %a1 + %t190 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1482, i64 12, i64 0 }, ptr %a192 + store { ptr, i64, i64 } %t190, ptr %a193 + call void @finch_str_concat(ptr %a191, ptr %a192, ptr %a193) + %t194 = load { ptr, i64, i64 }, ptr %a191 + store { ptr, i64, i64 } %t194, ptr %a196 + store { ptr, i64, i64 } { ptr @.str.1483, i64 6, i64 0 }, ptr %a197 + call void @finch_str_concat(ptr %a195, ptr %a196, ptr %a197) + %t198 = load { ptr, i64, i64 }, ptr %a195 + %t199 = call { ptr, i64, i64 } @finch.gen.op(ptr %t189, { ptr, i64, i64 } %t198) + store { ptr, i64, i64 } %t199, ptr %a200 + %t201 = load ptr, ptr %a1 + %t202 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t201, { ptr, i64, i64 } { ptr @.str.1484, i64 8, i64 0 }) + store { ptr, i64, i64 } %t202, ptr %a203 + %t204 = load ptr, ptr %a1 + %t205 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t204, { ptr, i64, i64 } { ptr @.str.1485, i64 8, i64 0 }) + store { ptr, i64, i64 } %t205, ptr %a206 + %t207 = load ptr, ptr %a1 + %t208 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t207, { ptr, i64, i64 } { ptr @.str.1486, i64 8, i64 0 }) + store { ptr, i64, i64 } %t208, ptr %a209 + %t210 = load ptr, ptr %a1 + %t211 = load { ptr, i64, i64 }, ptr %a200 + %t212 = load { ptr, i64, i64 }, ptr %a203 + %t213 = load { ptr, i64, i64 }, ptr %a206 + call void @finch.gen.condBr(ptr %t210, { ptr, i64, i64 } %t211, { ptr, i64, i64 } %t212, { ptr, i64, i64 } %t213) + %t214 = load ptr, ptr %a1 + %t215 = load { ptr, i64, i64 }, ptr %a203 + call void @finch.gen.label(ptr %t214, { ptr, i64, i64 } %t215) + %t216 = load ptr, ptr %a1 + call void @finch.gen.printf(ptr %t216, { ptr, i64, i64 } { ptr @.str.1487, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1488, i64 0, i64 0 }) + %t217 = load ptr, ptr %a1 + %t218 = load { ptr, i64, i64 }, ptr %a209 + call void @finch.gen.br(ptr %t217, { ptr, i64, i64 } %t218) + %t219 = load ptr, ptr %a1 + %t220 = load { ptr, i64, i64 }, ptr %a206 + call void @finch.gen.label(ptr %t219, { ptr, i64, i64 } %t220) + %t221 = load ptr, ptr %a1 + %t222 = load ptr, ptr %a1 + %t223 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1491, i64 13, i64 0 }, ptr %a225 + store { ptr, i64, i64 } %t223, ptr %a226 + call void @finch_str_concat(ptr %a224, ptr %a225, ptr %a226) + %t227 = load { ptr, i64, i64 }, ptr %a224 + store { ptr, i64, i64 } %t227, ptr %a229 + store { ptr, i64, i64 } { ptr @.str.1492, i64 7, i64 0 }, ptr %a230 + call void @finch_str_concat(ptr %a228, ptr %a229, ptr %a230) + %t231 = load { ptr, i64, i64 }, ptr %a228 + %t232 = call { ptr, i64, i64 } @finch.gen.op(ptr %t222, { ptr, i64, i64 } %t231) + store { ptr, i64, i64 } { ptr @.str.1490, i64 4, i64 0 }, ptr %a234 + store { ptr, i64, i64 } %t232, ptr %a235 + call void @finch_str_concat(ptr %a233, ptr %a234, ptr %a235) + %t236 = load { ptr, i64, i64 }, ptr %a233 + call void @finch.gen.printf(ptr %t221, { ptr, i64, i64 } { ptr @.str.1489, i64 6, i64 0 }, { ptr, i64, i64 } %t236) + %t237 = load ptr, ptr %a1 + %t238 = load { ptr, i64, i64 }, ptr %a209 + call void @finch.gen.br(ptr %t237, { ptr, i64, i64 } %t238) + %t239 = load ptr, ptr %a1 + %t240 = load { ptr, i64, i64 }, ptr %a209 + call void @finch.gen.label(ptr %t239, { ptr, i64, i64 } %t240) + br label %endif2427 +else2426: + %t241 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t241, ptr %a242 + store { ptr, i64, i64 } { ptr @.str.1493, i64 4, i64 0 }, ptr %a243 + %t244 = call i32 @finch_str_eq(ptr %a242, ptr %a243) + %t245 = icmp ne i32 %t244, 0 + br i1 %t245, label %then2428, label %else2429 +then2428: + %t246 = load ptr, ptr %a1 + call void @finch.gen.printf(ptr %t246, { ptr, i64, i64 } { ptr @.str.1494, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1495, i64 0, i64 0 }) + br label %endif2430 +else2429: + %t247 = load ptr, ptr %a1 + %t248 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t247, { ptr, i64, i64 } { ptr @.str.1496, i64 17, i64 0 }) + store { ptr, i64, i64 } %t248, ptr %a249 + %t250 = load ptr, ptr %a1 + %t251 = load { ptr, i64, i64 }, ptr %a249 + call void @finch.gen.store(ptr %t250, { ptr, i64, i64 } { ptr @.str.1497, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.1498, i64 15, i64 0 }, { ptr, i64, i64 } %t251) + %t252 = load ptr, ptr %a1 + %t253 = load { ptr, i64, i64 }, ptr %a249 + %t254 = load { ptr, i64, i64 }, ptr %a2 + %t255 = load %S.ast.Type, ptr %a3 + %t256 = load i1, ptr %a4 + call void @finch.gen.emitFormat(ptr %t252, { ptr, i64, i64 } %t253, { ptr, i64, i64 } %t254, %S.ast.Type %t255, i1 %t256) + %t257 = load ptr, ptr %a1 + %t258 = load { ptr, i64, i64 }, ptr %a249 + store { ptr, i64, i64 } { ptr @.str.1499, i64 31, i64 0 }, ptr %a260 + store { ptr, i64, i64 } %t258, ptr %a261 + call void @finch_str_concat(ptr %a259, ptr %a260, ptr %a261) + %t262 = load { ptr, i64, i64 }, ptr %a259 + store { ptr, i64, i64 } %t262, ptr %a264 + store { ptr, i64, i64 } { ptr @.str.1500, i64 1, i64 0 }, ptr %a265 + call void @finch_str_concat(ptr %a263, ptr %a264, ptr %a265) + %t266 = load { ptr, i64, i64 }, ptr %a263 + call void @finch.gen.emit(ptr %t257, { ptr, i64, i64 } %t266) + br label %endif2430 +endif2430: + br label %endif2427 +endif2427: + br label %endif2421 +endif2421: + br label %endif2418 +endif2418: + br label %endif2412 +endif2412: + br label %endif2409 +endif2409: + br label %endif2406 +endif2406: + br label %endif2403 +endif2403: + ret void +} + +define internal void @finch.gen.bufText(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1501, i64 29, i64 0 }, ptr %a7 + store { ptr, i64, i64 } %t5, ptr %a8 + call void @finch_str_concat(ptr %a6, ptr %a7, ptr %a8) + %t9 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t9, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.1502, i64 6, i64 0 }, ptr %a12 + call void @finch_str_concat(ptr %a10, ptr %a11, ptr %a12) + %t13 = load { ptr, i64, i64 }, ptr %a10 + %t14 = load ptr, ptr %a1 + %t15 = load { ptr, i64, i64 }, ptr %a3 + %t16 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t14, { ptr, i64, i64 } %t15) + store { ptr, i64, i64 } %t13, ptr %a18 + store { ptr, i64, i64 } %t16, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t20, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.1503, i64 6, i64 0 }, ptr %a23 + call void @finch_str_concat(ptr %a21, ptr %a22, ptr %a23) + %t24 = load { ptr, i64, i64 }, ptr %a21 + %t25 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t26 = load i64, ptr %t25 + call void @finch_str_from_int(ptr %a27, i64 %t26) + %t28 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t24, ptr %a30 + store { ptr, i64, i64 } %t28, ptr %a31 + call void @finch_str_concat(ptr %a29, ptr %a30, ptr %a31) + %t32 = load { ptr, i64, i64 }, ptr %a29 + store { ptr, i64, i64 } %t32, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.1504, i64 1, i64 0 }, ptr %a35 + call void @finch_str_concat(ptr %a33, ptr %a34, ptr %a35) + %t36 = load { ptr, i64, i64 }, ptr %a33 + call void @finch.gen.emit(ptr %t4, { ptr, i64, i64 } %t36) + ret void +} + +define internal void @finch.gen.emitFormat(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3, i1 %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca i1, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca %S.ast.Type, align 16 + %a179 = alloca %S.ast.Type, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca %S.ast.Type, align 16 + %a259 = alloca %S.ast.Type, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store i1 %p4, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 0 + %t7 = load { ptr, i64, i64 }, ptr %t6 + store { ptr, i64, i64 } %t7, ptr %a8 + call void @finch_str_copy(ptr %a9, ptr %a8) + %t10 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t10, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.1505, i64 1, i64 0 }, ptr %a12 + %t13 = load i1, ptr %a5 + br i1 %t13, label %then2431, label %endif2433 +then2431: + store { ptr, i64, i64 } { ptr @.str.1506, i64 1, i64 0 }, ptr %a12 + br label %endif2433 +endif2433: + %t14 = load %S.ast.Type, ptr %a4 + %t15 = call i1 @finch.gen.isSigned(%S.ast.Type %t14) + br i1 %t15, label %then2434, label %else2435 +then2434: + %t16 = load ptr, ptr %a1 + %t17 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1507, i64 29, i64 0 }, ptr %a19 + store { ptr, i64, i64 } %t17, ptr %a20 + call void @finch_str_concat(ptr %a18, ptr %a19, ptr %a20) + %t21 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.1508, i64 6, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + %t26 = load ptr, ptr %a1 + %t27 = load { ptr, i64, i64 }, ptr %a3 + %t28 = load %S.ast.Type, ptr %a4 + %t29 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.1509, i64 3, i64 0 }) + %t30 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t26, { ptr, i64, i64 } %t27, %S.ast.Type %t28, %S.ast.Type %t29) + store { ptr, i64, i64 } %t25, ptr %a32 + store { ptr, i64, i64 } %t30, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t34, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.1510, i64 1, i64 0 }, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + call void @finch.gen.emit(ptr %t16, { ptr, i64, i64 } %t38) + br label %endif2436 +else2435: + %t39 = load %S.ast.Type, ptr %a4 + %t40 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t39) + br i1 %t40, label %then2437, label %else2438 +then2437: + %t41 = load ptr, ptr %a1 + %t42 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1511, i64 30, i64 0 }, ptr %a44 + store { ptr, i64, i64 } %t42, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + store { ptr, i64, i64 } %t46, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.1512, i64 6, i64 0 }, ptr %a49 + call void @finch_str_concat(ptr %a47, ptr %a48, ptr %a49) + %t50 = load { ptr, i64, i64 }, ptr %a47 + %t51 = load ptr, ptr %a1 + %t52 = load { ptr, i64, i64 }, ptr %a3 + %t53 = load %S.ast.Type, ptr %a4 + %t54 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.1513, i64 3, i64 0 }) + %t55 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t51, { ptr, i64, i64 } %t52, %S.ast.Type %t53, %S.ast.Type %t54) + store { ptr, i64, i64 } %t50, ptr %a57 + store { ptr, i64, i64 } %t55, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t59, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.1514, i64 1, i64 0 }, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + call void @finch.gen.emit(ptr %t41, { ptr, i64, i64 } %t63) + br label %endif2439 +else2438: + %t64 = load %S.ast.Type, ptr %a4 + %t65 = call i1 @finch.gen.isFloat(%S.ast.Type %t64) + br i1 %t65, label %then2440, label %else2441 +then2440: + %t66 = load ptr, ptr %a1 + %t67 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1515, i64 31, i64 0 }, ptr %a69 + store { ptr, i64, i64 } %t67, ptr %a70 + call void @finch_str_concat(ptr %a68, ptr %a69, ptr %a70) + %t71 = load { ptr, i64, i64 }, ptr %a68 + store { ptr, i64, i64 } %t71, ptr %a73 + store { ptr, i64, i64 } { ptr @.str.1516, i64 9, i64 0 }, ptr %a74 + call void @finch_str_concat(ptr %a72, ptr %a73, ptr %a74) + %t75 = load { ptr, i64, i64 }, ptr %a72 + %t76 = load ptr, ptr %a1 + %t77 = load { ptr, i64, i64 }, ptr %a3 + %t78 = load %S.ast.Type, ptr %a4 + %t79 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.1517, i64 5, i64 0 }) + %t80 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t76, { ptr, i64, i64 } %t77, %S.ast.Type %t78, %S.ast.Type %t79) + store { ptr, i64, i64 } %t75, ptr %a82 + store { ptr, i64, i64 } %t80, ptr %a83 + call void @finch_str_concat(ptr %a81, ptr %a82, ptr %a83) + %t84 = load { ptr, i64, i64 }, ptr %a81 + store { ptr, i64, i64 } %t84, ptr %a86 + store { ptr, i64, i64 } { ptr @.str.1518, i64 1, i64 0 }, ptr %a87 + call void @finch_str_concat(ptr %a85, ptr %a86, ptr %a87) + %t88 = load { ptr, i64, i64 }, ptr %a85 + call void @finch.gen.emit(ptr %t66, { ptr, i64, i64 } %t88) + br label %endif2442 +else2441: + %t89 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t89, ptr %a90 + store { ptr, i64, i64 } { ptr @.str.1519, i64 4, i64 0 }, ptr %a91 + %t92 = call i32 @finch_str_eq(ptr %a90, ptr %a91) + %t93 = icmp ne i32 %t92, 0 + br i1 %t93, label %then2443, label %else2444 +then2443: + %t94 = load ptr, ptr %a1 + %t95 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1520, i64 30, i64 0 }, ptr %a97 + store { ptr, i64, i64 } %t95, ptr %a98 + call void @finch_str_concat(ptr %a96, ptr %a97, ptr %a98) + %t99 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t99, ptr %a101 + store { ptr, i64, i64 } { ptr @.str.1521, i64 5, i64 0 }, ptr %a102 + call void @finch_str_concat(ptr %a100, ptr %a101, ptr %a102) + %t103 = load { ptr, i64, i64 }, ptr %a100 + %t104 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t103, ptr %a106 + store { ptr, i64, i64 } %t104, ptr %a107 + call void @finch_str_concat(ptr %a105, ptr %a106, ptr %a107) + %t108 = load { ptr, i64, i64 }, ptr %a105 + store { ptr, i64, i64 } %t108, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.1522, i64 6, i64 0 }, ptr %a111 + call void @finch_str_concat(ptr %a109, ptr %a110, ptr %a111) + %t112 = load { ptr, i64, i64 }, ptr %a109 + %t113 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t112, ptr %a115 + store { ptr, i64, i64 } %t113, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + store { ptr, i64, i64 } %t117, ptr %a119 + store { ptr, i64, i64 } { ptr @.str.1523, i64 1, i64 0 }, ptr %a120 + call void @finch_str_concat(ptr %a118, ptr %a119, ptr %a120) + %t121 = load { ptr, i64, i64 }, ptr %a118 + call void @finch.gen.emit(ptr %t94, { ptr, i64, i64 } %t121) + br label %endif2445 +else2444: + %t122 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t122, ptr %a123 + store { ptr, i64, i64 } { ptr @.str.1524, i64 4, i64 0 }, ptr %a124 + %t125 = call i32 @finch_str_eq(ptr %a123, ptr %a124) + %t126 = icmp ne i32 %t125, 0 + br i1 %t126, label %then2446, label %else2447 +then2446: + %t127 = load ptr, ptr %a1 + %t128 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1525, i64 30, i64 0 }, ptr %a130 + store { ptr, i64, i64 } %t128, ptr %a131 + call void @finch_str_concat(ptr %a129, ptr %a130, ptr %a131) + %t132 = load { ptr, i64, i64 }, ptr %a129 + store { ptr, i64, i64 } %t132, ptr %a134 + store { ptr, i64, i64 } { ptr @.str.1526, i64 6, i64 0 }, ptr %a135 + call void @finch_str_concat(ptr %a133, ptr %a134, ptr %a135) + %t136 = load { ptr, i64, i64 }, ptr %a133 + %t137 = load ptr, ptr %a1 + %t138 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.1527, i64 8, i64 0 }, ptr %a140 + store { ptr, i64, i64 } %t138, ptr %a141 + call void @finch_str_concat(ptr %a139, ptr %a140, ptr %a141) + %t142 = load { ptr, i64, i64 }, ptr %a139 + store { ptr, i64, i64 } %t142, ptr %a144 + store { ptr, i64, i64 } { ptr @.str.1528, i64 7, i64 0 }, ptr %a145 + call void @finch_str_concat(ptr %a143, ptr %a144, ptr %a145) + %t146 = load { ptr, i64, i64 }, ptr %a143 + %t147 = call { ptr, i64, i64 } @finch.gen.op(ptr %t137, { ptr, i64, i64 } %t146) + store { ptr, i64, i64 } %t136, ptr %a149 + store { ptr, i64, i64 } %t147, ptr %a150 + call void @finch_str_concat(ptr %a148, ptr %a149, ptr %a150) + %t151 = load { ptr, i64, i64 }, ptr %a148 + store { ptr, i64, i64 } %t151, ptr %a153 + store { ptr, i64, i64 } { ptr @.str.1529, i64 1, i64 0 }, ptr %a154 + call void @finch_str_concat(ptr %a152, ptr %a153, ptr %a154) + %t155 = load { ptr, i64, i64 }, ptr %a152 + call void @finch.gen.emit(ptr %t127, { ptr, i64, i64 } %t155) + br label %endif2448 +else2447: + %t156 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t156, ptr %a157 + store { ptr, i64, i64 } { ptr @.str.1530, i64 3, i64 0 }, ptr %a158 + %t159 = call i32 @finch_str_eq(ptr %a157, ptr %a158) + %t160 = icmp ne i32 %t159, 0 + br i1 %t160, label %then2449, label %else2450 +then2449: + %t161 = load ptr, ptr %a1 + %t162 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1531, i64 29, i64 0 }, ptr %a164 + store { ptr, i64, i64 } %t162, ptr %a165 + call void @finch_str_concat(ptr %a163, ptr %a164, ptr %a165) + %t166 = load { ptr, i64, i64 }, ptr %a163 + store { ptr, i64, i64 } %t166, ptr %a168 + store { ptr, i64, i64 } { ptr @.str.1532, i64 6, i64 0 }, ptr %a169 + call void @finch_str_concat(ptr %a167, ptr %a168, ptr %a169) + %t170 = load { ptr, i64, i64 }, ptr %a167 + %t171 = load ptr, ptr %a1 + %t172 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t172, ptr %a173 + call void @finch_str_copy(ptr %a174, ptr %a173) + %t175 = load { ptr, i64, i64 }, ptr %a174 + %t176 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t175, 0 + %t177 = load %S.ast.Type, ptr %a4 + store %S.ast.Type %t177, ptr %a178 + call void @finch.copy.S_ast_Type(ptr %a179, ptr %a178) + %t180 = load %S.ast.Type, ptr %a179 + %t181 = insertvalue %S.gen.Val %t176, %S.ast.Type %t180, 1 + %t182 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t171, %S.gen.Val %t181) + store { ptr, i64, i64 } %t170, ptr %a184 + store { ptr, i64, i64 } %t182, ptr %a185 + call void @finch_str_concat(ptr %a183, ptr %a184, ptr %a185) + %t186 = load { ptr, i64, i64 }, ptr %a183 + store { ptr, i64, i64 } %t186, ptr %a188 + store { ptr, i64, i64 } { ptr @.str.1533, i64 6, i64 0 }, ptr %a189 + call void @finch_str_concat(ptr %a187, ptr %a188, ptr %a189) + %t190 = load { ptr, i64, i64 }, ptr %a187 + %t191 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t190, ptr %a193 + store { ptr, i64, i64 } %t191, ptr %a194 + call void @finch_str_concat(ptr %a192, ptr %a193, ptr %a194) + %t195 = load { ptr, i64, i64 }, ptr %a192 + store { ptr, i64, i64 } %t195, ptr %a197 + store { ptr, i64, i64 } { ptr @.str.1534, i64 1, i64 0 }, ptr %a198 + call void @finch_str_concat(ptr %a196, ptr %a197, ptr %a198) + %t199 = load { ptr, i64, i64 }, ptr %a196 + call void @finch.gen.emit(ptr %t161, { ptr, i64, i64 } %t199) + br label %endif2451 +else2450: + %t200 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t200, ptr %a201 + store { ptr, i64, i64 } { ptr @.str.1535, i64 3, i64 0 }, ptr %a202 + %t203 = call i32 @finch_str_eq(ptr %a201, ptr %a202) + %t204 = icmp ne i32 %t203, 0 + br label %logic.from2452 +logic.from2452: + br i1 %t204, label %logic.end2454, label %logic.rhs2453 +logic.rhs2453: + %t205 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t205, ptr %a206 + store { ptr, i64, i64 } { ptr @.str.1536, i64 4, i64 0 }, ptr %a207 + %t208 = call i32 @finch_str_eq(ptr %a206, ptr %a207) + %t209 = icmp ne i32 %t208, 0 + br label %logic.rend2455 +logic.rend2455: + br label %logic.end2454 +logic.end2454: + %t210 = phi i1 [ true, %logic.from2452 ], [ %t209, %logic.rend2455 ] + br i1 %t210, label %then2456, label %else2457 +then2456: + %t211 = load ptr, ptr %a1 + %t212 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.1537, i64 29, i64 0 }, ptr %a214 + store { ptr, i64, i64 } %t212, ptr %a215 + call void @finch_str_concat(ptr %a213, ptr %a214, ptr %a215) + %t216 = load { ptr, i64, i64 }, ptr %a213 + store { ptr, i64, i64 } %t216, ptr %a218 + store { ptr, i64, i64 } { ptr @.str.1538, i64 6, i64 0 }, ptr %a219 + call void @finch_str_concat(ptr %a217, ptr %a218, ptr %a219) + %t220 = load { ptr, i64, i64 }, ptr %a217 + %t221 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t220, ptr %a223 + store { ptr, i64, i64 } %t221, ptr %a224 + call void @finch_str_concat(ptr %a222, ptr %a223, ptr %a224) + %t225 = load { ptr, i64, i64 }, ptr %a222 + store { ptr, i64, i64 } %t225, ptr %a227 + store { ptr, i64, i64 } { ptr @.str.1539, i64 1, i64 0 }, ptr %a228 + call void @finch_str_concat(ptr %a226, ptr %a227, ptr %a228) + %t229 = load { ptr, i64, i64 }, ptr %a226 + call void @finch.gen.emit(ptr %t211, { ptr, i64, i64 } %t229) + br label %endif2458 +else2457: + %t230 = load ptr, ptr %a1 + %t231 = load ptr, ptr %a1 + %t232 = load %S.ast.Type, ptr %a4 + %t233 = call { ptr, i64, i64 } @finch.gen.formatFn(ptr %t231, %S.ast.Type %t232) + store { ptr, i64, i64 } { ptr @.str.1540, i64 10, i64 0 }, ptr %a235 + store { ptr, i64, i64 } %t233, ptr %a236 + call void @finch_str_concat(ptr %a234, ptr %a235, ptr %a236) + %t237 = load { ptr, i64, i64 }, ptr %a234 + store { ptr, i64, i64 } %t237, ptr %a239 + store { ptr, i64, i64 } { ptr @.str.1541, i64 5, i64 0 }, ptr %a240 + call void @finch_str_concat(ptr %a238, ptr %a239, ptr %a240) + %t241 = load { ptr, i64, i64 }, ptr %a238 + %t242 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t241, ptr %a244 + store { ptr, i64, i64 } %t242, ptr %a245 + call void @finch_str_concat(ptr %a243, ptr %a244, ptr %a245) + %t246 = load { ptr, i64, i64 }, ptr %a243 + store { ptr, i64, i64 } %t246, ptr %a248 + store { ptr, i64, i64 } { ptr @.str.1542, i64 6, i64 0 }, ptr %a249 + call void @finch_str_concat(ptr %a247, ptr %a248, ptr %a249) + %t250 = load { ptr, i64, i64 }, ptr %a247 + %t251 = load ptr, ptr %a1 + %t252 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t252, ptr %a253 + call void @finch_str_copy(ptr %a254, ptr %a253) + %t255 = load { ptr, i64, i64 }, ptr %a254 + %t256 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t255, 0 + %t257 = load %S.ast.Type, ptr %a4 + store %S.ast.Type %t257, ptr %a258 + call void @finch.copy.S_ast_Type(ptr %a259, ptr %a258) + %t260 = load %S.ast.Type, ptr %a259 + %t261 = insertvalue %S.gen.Val %t256, %S.ast.Type %t260, 1 + %t262 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t251, %S.gen.Val %t261) + store { ptr, i64, i64 } %t250, ptr %a264 + store { ptr, i64, i64 } %t262, ptr %a265 + call void @finch_str_concat(ptr %a263, ptr %a264, ptr %a265) + %t266 = load { ptr, i64, i64 }, ptr %a263 + store { ptr, i64, i64 } %t266, ptr %a268 + store { ptr, i64, i64 } { ptr @.str.1543, i64 1, i64 0 }, ptr %a269 + call void @finch_str_concat(ptr %a267, ptr %a268, ptr %a269) + %t270 = load { ptr, i64, i64 }, ptr %a267 + call void @finch.gen.emit(ptr %t230, { ptr, i64, i64 } %t270) + br label %endif2458 +endif2458: + br label %endif2451 +endif2451: + br label %endif2448 +endif2448: + br label %endif2445 +endif2445: + br label %endif2442 +endif2442: + br label %endif2439 +endif2439: + br label %endif2436 +endif2436: + ret void +} + +define internal void @finch.copy.S_gen_EnumDef(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.EnumDef, ptr %src + store %S.gen.EnumDef %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.EnumDef, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.EnumDef, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.EnumDef, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.EnumDef, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.EnumDef, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.EnumDef, ptr %src, i32 0, i32 2 + call void @finch.copy.arr_str(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.gen.EnumDef, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.gen.EnumDef, ptr %src, i32 0, i32 3 + call void @finch.copy.arr_int(ptr %t8, ptr %t9) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.formatFn(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca %S.gen.Saved, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca %S.ast.Type, align 16 + %a49 = alloca %S.ast.Type, align 16 + %a51 = alloca %S.ast.Type, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca %S.gen.EnumDef, align 16 + %a165 = alloca %S.gen.EnumDef, align 16 + %a167 = alloca %S.gen.EnumDef, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca i64, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a231 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca i64, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a301 = alloca { ptr, i64, i64 }, align 16 + %a302 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a344 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca { ptr, i64, i64 }, align 16 + %a384 = alloca { ptr, i64, i64 }, align 16 + %a385 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a397 = alloca { ptr, i64, i64 }, align 16 + %a482 = alloca %S.gen.StructDef, align 16 + %a483 = alloca %S.gen.StructDef, align 16 + %a485 = alloca %S.gen.StructDef, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a494 = alloca { ptr, i64, i64 }, align 16 + %a495 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca i64, align 16 + %a503 = alloca { ptr, i64, i64 }, align 16 + %a516 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a518 = alloca { ptr, i64, i64 }, align 16 + %a520 = alloca { ptr, i64, i64 }, align 16 + %a521 = alloca { ptr, i64, i64 }, align 16 + %a522 = alloca { ptr, i64, i64 }, align 16 + %a526 = alloca { ptr, i64, i64 }, align 16 + %a527 = alloca { ptr, i64, i64 }, align 16 + %a528 = alloca { ptr, i64, i64 }, align 16 + %a530 = alloca { ptr, i64, i64 }, align 16 + %a531 = alloca { ptr, i64, i64 }, align 16 + %a532 = alloca { ptr, i64, i64 }, align 16 + %a542 = alloca { ptr, i64, i64 }, align 16 + %a544 = alloca { ptr, i64, i64 }, align 16 + %a545 = alloca { ptr, i64, i64 }, align 16 + %a546 = alloca { ptr, i64, i64 }, align 16 + %a549 = alloca { ptr, i64, i64 }, align 16 + %a579 = alloca { ptr, i64, i64 }, align 16 + %a580 = alloca { ptr, i64, i64 }, align 16 + %a581 = alloca { ptr, i64, i64 }, align 16 + %a583 = alloca { ptr, i64, i64 }, align 16 + %a584 = alloca { ptr, i64, i64 }, align 16 + %a585 = alloca { ptr, i64, i64 }, align 16 + %a588 = alloca { ptr, i64, i64 }, align 16 + %a589 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load %S.ast.Type, ptr %a2 + %t4 = call { ptr, i64, i64 } @finch.gen.typeKey(%S.ast.Type %t3) + store { ptr, i64, i64 } { ptr @.str.1544, i64 14, i64 0 }, ptr %a6 + store { ptr, i64, i64 } %t4, ptr %a7 + call void @finch_str_concat(ptr %a5, ptr %a6, ptr %a7) + %t8 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t8, ptr %a9 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic2459, label %ok2460 +panic2459: + call void @finch_panic(ptr @.str.1545, i64 846, ptr @.str.1546) + unreachable +ok2460: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 21 + %t13 = load { ptr, i64, i64 }, ptr %t12 + %t14 = load { ptr, i64, i64 }, ptr %a9 + %t15 = call i1 @finch.gen.has({ ptr, i64, i64 } %t13, { ptr, i64, i64 } %t14) + br i1 %t15, label %then2461, label %endif2463 +then2461: + %t16 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t16, ptr %a17 + call void @finch_str_copy(ptr %a18, ptr %a17) + %t19 = load { ptr, i64, i64 }, ptr %a18 + ret { ptr, i64, i64 } %t19 +endif2463: + %t20 = load ptr, ptr %a1 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic2464, label %ok2465 +panic2464: + call void @finch_panic(ptr @.str.1547, i64 849, ptr @.str.1548) + unreachable +ok2465: + %t22 = getelementptr inbounds %S.gen.Gen, ptr %t20, i32 0, i32 21 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t24, ptr %a25 + call void @finch_str_copy(ptr %a26, ptr %a25) + %t27 = load { ptr, i64, i64 }, ptr %a26 + %t28 = load i64, ptr %t23 + %t29 = add i64 %t28, 1 + call void @finch_arr_reserve(ptr %t22, i64 %t29, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t30 = load ptr, ptr %t22 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t30, i64 %t28 + store { ptr, i64, i64 } %t27, ptr %t31 + store i64 %t29, ptr %t23 + %t32 = load ptr, ptr %a1 + %t33 = call %S.gen.Saved @finch.gen.beginHelper(ptr %t32) + store %S.gen.Saved %t33, ptr %a34 + %t35 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t36 = load { ptr, i64, i64 }, ptr %t35 + store { ptr, i64, i64 } %t36, ptr %a37 + store { ptr, i64, i64 } { ptr @.str.1549, i64 5, i64 0 }, ptr %a38 + %t39 = call i32 @finch_str_eq(ptr %a37, ptr %a38) + %t40 = icmp ne i32 %t39, 0 + br i1 %t40, label %then2466, label %else2467 +then2466: + %t41 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t42 = load { ptr, i64, i64 }, ptr %t41 + %t43 = extractvalue { ptr, i64, i64 } %t42, 1 + %t44 = icmp uge i64 0, %t43 + br i1 %t44, label %range2469, label %inrange2470 +range2469: + call void @finch_panic_index(ptr @.str.1550, i64 852, i64 0, i64 %t43) + unreachable +inrange2470: + %t45 = extractvalue { ptr, i64, i64 } %t42, 0 + %t46 = getelementptr inbounds %S.ast.Type, ptr %t45, i64 0 + %t47 = load %S.ast.Type, ptr %t46 + store %S.ast.Type %t47, ptr %a48 + call void @finch.copy.S_ast_Type(ptr %a49, ptr %a48) + %t50 = load %S.ast.Type, ptr %a49 + store %S.ast.Type %t50, ptr %a51 + %t52 = load ptr, ptr %a1 + %t53 = call { ptr, i64, i64 } @finch.gen.load(ptr %t52, { ptr, i64, i64 } { ptr @.str.1551, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.1552, i64 2, i64 0 }) + store { ptr, i64, i64 } %t53, ptr %a54 + %t55 = load ptr, ptr %a1 + %t56 = load ptr, ptr %a1 + %t57 = call { ptr, i64, i64 } @finch.gen.op(ptr %t56, { ptr, i64, i64 } { ptr @.str.1554, i64 62, i64 0 }) + %t58 = call { ptr, i64, i64 } @finch.gen.load(ptr %t55, { ptr, i64, i64 } { ptr @.str.1553, i64 3, i64 0 }, { ptr, i64, i64 } %t57) + store { ptr, i64, i64 } %t58, ptr %a59 + %t60 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t60, { ptr, i64, i64 } { ptr @.str.1555, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1556, i64 1, i64 0 }) + %t61 = load ptr, ptr %a1 + %t62 = load { ptr, i64, i64 }, ptr %a59 + %t63 = call { ptr, i64, i64 } @finch.gen.loopStart(ptr %t61, { ptr, i64, i64 } %t62) + store { ptr, i64, i64 } %t63, ptr %a64 + %t65 = load ptr, ptr %a1 + %t66 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t65, { ptr, i64, i64 } { ptr @.str.1557, i64 3, i64 0 }) + store { ptr, i64, i64 } %t66, ptr %a67 + %t68 = load ptr, ptr %a1 + %t69 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t68, { ptr, i64, i64 } { ptr @.str.1558, i64 4, i64 0 }) + store { ptr, i64, i64 } %t69, ptr %a70 + %t71 = load ptr, ptr %a1 + %t72 = load { ptr, i64, i64 }, ptr %a64 + %t73 = extractvalue { ptr, i64, i64 } %t72, 1 + %t74 = icmp uge i64 3, %t73 + br i1 %t74, label %range2471, label %inrange2472 +range2471: + call void @finch_panic_index(ptr @.str.1560, i64 859, i64 3, i64 %t73) + unreachable +inrange2472: + %t75 = extractvalue { ptr, i64, i64 } %t72, 0 + %t76 = getelementptr inbounds { ptr, i64, i64 }, ptr %t75, i64 3 + %t77 = load { ptr, i64, i64 }, ptr %t76 + store { ptr, i64, i64 } { ptr @.str.1559, i64 13, i64 0 }, ptr %a79 + store { ptr, i64, i64 } %t77, ptr %a80 + call void @finch_str_concat(ptr %a78, ptr %a79, ptr %a80) + %t81 = load { ptr, i64, i64 }, ptr %a78 + store { ptr, i64, i64 } %t81, ptr %a83 + store { ptr, i64, i64 } { ptr @.str.1561, i64 3, i64 0 }, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + %t86 = call { ptr, i64, i64 } @finch.gen.op(ptr %t71, { ptr, i64, i64 } %t85) + store { ptr, i64, i64 } %t86, ptr %a87 + %t88 = load ptr, ptr %a1 + %t89 = load { ptr, i64, i64 }, ptr %a87 + %t90 = load { ptr, i64, i64 }, ptr %a67 + %t91 = load { ptr, i64, i64 }, ptr %a70 + call void @finch.gen.condBr(ptr %t88, { ptr, i64, i64 } %t89, { ptr, i64, i64 } %t90, { ptr, i64, i64 } %t91) + %t92 = load ptr, ptr %a1 + %t93 = load { ptr, i64, i64 }, ptr %a67 + call void @finch.gen.label(ptr %t92, { ptr, i64, i64 } %t93) + %t94 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t94, { ptr, i64, i64 } { ptr @.str.1562, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1563, i64 2, i64 0 }) + %t95 = load ptr, ptr %a1 + %t96 = load { ptr, i64, i64 }, ptr %a70 + call void @finch.gen.br(ptr %t95, { ptr, i64, i64 } %t96) + %t97 = load ptr, ptr %a1 + %t98 = load { ptr, i64, i64 }, ptr %a70 + call void @finch.gen.label(ptr %t97, { ptr, i64, i64 } %t98) + %t99 = load ptr, ptr %a1 + %t100 = load ptr, ptr %a1 + %t101 = load %S.ast.Type, ptr %a51 + %t102 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t100, %S.ast.Type %t101) + store { ptr, i64, i64 } { ptr @.str.1564, i64 23, i64 0 }, ptr %a104 + store { ptr, i64, i64 } %t102, ptr %a105 + call void @finch_str_concat(ptr %a103, ptr %a104, ptr %a105) + %t106 = load { ptr, i64, i64 }, ptr %a103 + store { ptr, i64, i64 } %t106, ptr %a108 + store { ptr, i64, i64 } { ptr @.str.1565, i64 6, i64 0 }, ptr %a109 + call void @finch_str_concat(ptr %a107, ptr %a108, ptr %a109) + %t110 = load { ptr, i64, i64 }, ptr %a107 + %t111 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t110, ptr %a113 + store { ptr, i64, i64 } %t111, ptr %a114 + call void @finch_str_concat(ptr %a112, ptr %a113, ptr %a114) + %t115 = load { ptr, i64, i64 }, ptr %a112 + store { ptr, i64, i64 } %t115, ptr %a117 + store { ptr, i64, i64 } { ptr @.str.1566, i64 6, i64 0 }, ptr %a118 + call void @finch_str_concat(ptr %a116, ptr %a117, ptr %a118) + %t119 = load { ptr, i64, i64 }, ptr %a116 + %t120 = load { ptr, i64, i64 }, ptr %a64 + %t121 = extractvalue { ptr, i64, i64 } %t120, 1 + %t122 = icmp uge i64 3, %t121 + br i1 %t122, label %range2473, label %inrange2474 +range2473: + call void @finch_panic_index(ptr @.str.1567, i64 865, i64 3, i64 %t121) + unreachable +inrange2474: + %t123 = extractvalue { ptr, i64, i64 } %t120, 0 + %t124 = getelementptr inbounds { ptr, i64, i64 }, ptr %t123, i64 3 + %t125 = load { ptr, i64, i64 }, ptr %t124 + store { ptr, i64, i64 } %t119, ptr %a127 + store { ptr, i64, i64 } %t125, ptr %a128 + call void @finch_str_concat(ptr %a126, ptr %a127, ptr %a128) + %t129 = load { ptr, i64, i64 }, ptr %a126 + %t130 = call { ptr, i64, i64 } @finch.gen.op(ptr %t99, { ptr, i64, i64 } %t129) + store { ptr, i64, i64 } %t130, ptr %a131 + %t132 = load ptr, ptr %a1 + %t133 = load ptr, ptr %a1 + %t134 = load ptr, ptr %a1 + %t135 = load %S.ast.Type, ptr %a51 + %t136 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t134, %S.ast.Type %t135) + %t137 = load { ptr, i64, i64 }, ptr %a131 + %t138 = call { ptr, i64, i64 } @finch.gen.load(ptr %t133, { ptr, i64, i64 } %t136, { ptr, i64, i64 } %t137) + %t139 = load %S.ast.Type, ptr %a51 + call void @finch.gen.emitFormat(ptr %t132, { ptr, i64, i64 } { ptr @.str.1568, i64 4, i64 0 }, { ptr, i64, i64 } %t138, %S.ast.Type %t139, i1 true) + %t140 = load ptr, ptr %a1 + %t141 = load { ptr, i64, i64 }, ptr %a64 + call void @finch.gen.loopEnd(ptr %t140, { ptr, i64, i64 } %t141) + %t142 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t142, { ptr, i64, i64 } { ptr @.str.1569, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1570, i64 1, i64 0 }) + br label %endif2468 +else2467: + %t143 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t144 = load { ptr, i64, i64 }, ptr %t143 + store { ptr, i64, i64 } %t144, ptr %a145 + store { ptr, i64, i64 } { ptr @.str.1571, i64 4, i64 0 }, ptr %a146 + %t147 = call i32 @finch_str_eq(ptr %a145, ptr %a146) + %t148 = icmp ne i32 %t147, 0 + br i1 %t148, label %then2475, label %else2476 +then2475: + %t149 = load ptr, ptr %a1 + %t150 = icmp eq ptr %t149, null + br i1 %t150, label %panic2478, label %ok2479 +panic2478: + call void @finch_panic(ptr @.str.1572, i64 871, ptr @.str.1573) + unreachable +ok2479: + %t151 = getelementptr inbounds %S.gen.Gen, ptr %t149, i32 0, i32 20 + %t152 = load ptr, ptr %a1 + %t153 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t154 = load { ptr, i64, i64 }, ptr %t153 + %t155 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t156 = load { ptr, i64, i64 }, ptr %t155 + %t157 = call i64 @finch.gen.findEnum(ptr %t152, { ptr, i64, i64 } %t154, { ptr, i64, i64 } %t156) + %t158 = load { ptr, i64, i64 }, ptr %t151 + %t159 = extractvalue { ptr, i64, i64 } %t158, 1 + %t160 = icmp uge i64 %t157, %t159 + br i1 %t160, label %range2480, label %inrange2481 +range2480: + call void @finch_panic_index(ptr @.str.1574, i64 871, i64 %t157, i64 %t159) + unreachable +inrange2481: + %t161 = extractvalue { ptr, i64, i64 } %t158, 0 + %t162 = getelementptr inbounds %S.gen.EnumDef, ptr %t161, i64 %t157 + %t163 = load %S.gen.EnumDef, ptr %t162 + store %S.gen.EnumDef %t163, ptr %a164 + call void @finch.copy.S_gen_EnumDef(ptr %a165, ptr %a164) + %t166 = load %S.gen.EnumDef, ptr %a165 + store %S.gen.EnumDef %t166, ptr %a167 + %t168 = load ptr, ptr %a1 + %t169 = call { ptr, i64, i64 } @finch.gen.load(ptr %t168, { ptr, i64, i64 } { ptr @.str.1575, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.1576, i64 2, i64 0 }) + store { ptr, i64, i64 } %t169, ptr %a170 + %t171 = load ptr, ptr %a1 + %t172 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t171, { ptr, i64, i64 } { ptr @.str.1577, i64 10, i64 0 }) + store { ptr, i64, i64 } %t172, ptr %a173 + %t174 = load ptr, ptr %a1 + %t175 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t174, { ptr, i64, i64 } { ptr @.str.1578, i64 9, i64 0 }) + store { ptr, i64, i64 } %t175, ptr %a176 + store { ptr, i64, i64 } zeroinitializer, ptr %a177 + store { ptr, i64, i64 } zeroinitializer, ptr %a178 + %t179 = getelementptr inbounds %S.gen.EnumDef, ptr %a167, i32 0, i32 2 + %t180 = getelementptr inbounds { ptr, i64, i64 }, ptr %t179, i32 0, i32 1 + %t181 = load i64, ptr %t180 + store i64 0, ptr %a182 + br label %for.cond2482 +for.cond2482: + %t183 = load i64, ptr %a182 + %t184 = icmp slt i64 %t183, %t181 + br i1 %t184, label %for.body2483, label %for.end2485 +for.body2483: + %t185 = getelementptr inbounds { ptr, i64, i64 }, ptr %a178, i32 0, i32 1 + %t186 = load ptr, ptr %a1 + %t187 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t186, { ptr, i64, i64 } { ptr @.str.1579, i64 6, i64 0 }) + %t188 = load i64, ptr %t185 + %t189 = add i64 %t188, 1 + call void @finch_arr_reserve(ptr %a178, i64 %t189, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t190 = load ptr, ptr %a178 + %t191 = getelementptr inbounds { ptr, i64, i64 }, ptr %t190, i64 %t188 + store { ptr, i64, i64 } %t187, ptr %t191 + store i64 %t189, ptr %t185 + %t192 = getelementptr inbounds { ptr, i64, i64 }, ptr %a177, i32 0, i32 1 + %t193 = getelementptr inbounds %S.gen.EnumDef, ptr %a167, i32 0, i32 3 + %t194 = load i64, ptr %a182 + %t195 = load { ptr, i64, i64 }, ptr %t193 + %t196 = extractvalue { ptr, i64, i64 } %t195, 1 + %t197 = icmp uge i64 %t194, %t196 + br i1 %t197, label %range2486, label %inrange2487 +range2486: + call void @finch_panic_index(ptr @.str.1581, i64 879, i64 %t194, i64 %t196) + unreachable +inrange2487: + %t198 = extractvalue { ptr, i64, i64 } %t195, 0 + %t199 = getelementptr inbounds i64, ptr %t198, i64 %t194 + %t200 = load i64, ptr %t199 + call void @finch_str_from_int(ptr %a201, i64 %t200) + %t202 = load { ptr, i64, i64 }, ptr %a201 + store { ptr, i64, i64 } { ptr @.str.1580, i64 4, i64 0 }, ptr %a204 + store { ptr, i64, i64 } %t202, ptr %a205 + call void @finch_str_concat(ptr %a203, ptr %a204, ptr %a205) + %t206 = load { ptr, i64, i64 }, ptr %a203 + store { ptr, i64, i64 } %t206, ptr %a208 + store { ptr, i64, i64 } { ptr @.str.1582, i64 9, i64 0 }, ptr %a209 + call void @finch_str_concat(ptr %a207, ptr %a208, ptr %a209) + %t210 = load { ptr, i64, i64 }, ptr %a207 + %t211 = load i64, ptr %a182 + %t212 = load { ptr, i64, i64 }, ptr %a178 + %t213 = extractvalue { ptr, i64, i64 } %t212, 1 + %t214 = icmp uge i64 %t211, %t213 + br i1 %t214, label %range2488, label %inrange2489 +range2488: + call void @finch_panic_index(ptr @.str.1583, i64 879, i64 %t211, i64 %t213) + unreachable +inrange2489: + %t215 = extractvalue { ptr, i64, i64 } %t212, 0 + %t216 = getelementptr inbounds { ptr, i64, i64 }, ptr %t215, i64 %t211 + %t217 = load { ptr, i64, i64 }, ptr %t216 + store { ptr, i64, i64 } %t210, ptr %a219 + store { ptr, i64, i64 } %t217, ptr %a220 + call void @finch_str_concat(ptr %a218, ptr %a219, ptr %a220) + %t221 = load { ptr, i64, i64 }, ptr %a218 + %t222 = load i64, ptr %t192 + %t223 = add i64 %t222, 1 + call void @finch_arr_reserve(ptr %a177, i64 %t223, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t224 = load ptr, ptr %a177 + %t225 = getelementptr inbounds { ptr, i64, i64 }, ptr %t224, i64 %t222 + store { ptr, i64, i64 } %t221, ptr %t225 + store i64 %t223, ptr %t192 + br label %for.step2484 +for.step2484: + %t226 = load i64, ptr %a182 + %t227 = add i64 %t226, 1 + store i64 %t227, ptr %a182 + br label %for.cond2482 +for.end2485: + %t228 = load ptr, ptr %a1 + %t229 = load { ptr, i64, i64 }, ptr %a170 + store { ptr, i64, i64 } { ptr @.str.1584, i64 11, i64 0 }, ptr %a231 + store { ptr, i64, i64 } %t229, ptr %a232 + call void @finch_str_concat(ptr %a230, ptr %a231, ptr %a232) + %t233 = load { ptr, i64, i64 }, ptr %a230 + store { ptr, i64, i64 } %t233, ptr %a235 + store { ptr, i64, i64 } { ptr @.str.1585, i64 9, i64 0 }, ptr %a236 + call void @finch_str_concat(ptr %a234, ptr %a235, ptr %a236) + %t237 = load { ptr, i64, i64 }, ptr %a234 + %t238 = load { ptr, i64, i64 }, ptr %a173 + store { ptr, i64, i64 } %t237, ptr %a240 + store { ptr, i64, i64 } %t238, ptr %a241 + call void @finch_str_concat(ptr %a239, ptr %a240, ptr %a241) + %t242 = load { ptr, i64, i64 }, ptr %a239 + store { ptr, i64, i64 } %t242, ptr %a244 + store { ptr, i64, i64 } { ptr @.str.1586, i64 3, i64 0 }, ptr %a245 + call void @finch_str_concat(ptr %a243, ptr %a244, ptr %a245) + %t246 = load { ptr, i64, i64 }, ptr %a243 + %t247 = getelementptr inbounds { ptr, i64, i64 }, ptr %a177, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.1587, i64 1, i64 0 }, ptr %a248 + call void @finch_str_join(ptr %a249, ptr %a177, ptr %a248) + %t250 = load { ptr, i64, i64 }, ptr %a249 + store { ptr, i64, i64 } %t246, ptr %a252 + store { ptr, i64, i64 } %t250, ptr %a253 + call void @finch_str_concat(ptr %a251, ptr %a252, ptr %a253) + %t254 = load { ptr, i64, i64 }, ptr %a251 + store { ptr, i64, i64 } %t254, ptr %a256 + store { ptr, i64, i64 } { ptr @.str.1588, i64 2, i64 0 }, ptr %a257 + call void @finch_str_concat(ptr %a255, ptr %a256, ptr %a257) + %t258 = load { ptr, i64, i64 }, ptr %a255 + call void @finch.gen.emit(ptr %t228, { ptr, i64, i64 } %t258) + %t259 = load ptr, ptr %a1 + %t260 = icmp eq ptr %t259, null + br i1 %t260, label %panic2490, label %ok2491 +panic2490: + call void @finch_panic(ptr @.str.1589, i64 882, ptr @.str.1590) + unreachable +ok2491: + %t261 = getelementptr inbounds %S.gen.Gen, ptr %t259, i32 0, i32 9 + store i1 true, ptr %t261 + %t262 = getelementptr inbounds %S.gen.EnumDef, ptr %a167, i32 0, i32 2 + %t263 = getelementptr inbounds { ptr, i64, i64 }, ptr %t262, i32 0, i32 1 + %t264 = load i64, ptr %t263 + store i64 0, ptr %a265 + br label %for.cond2492 +for.cond2492: + %t266 = load i64, ptr %a265 + %t267 = icmp slt i64 %t266, %t264 + br i1 %t267, label %for.body2493, label %for.end2495 +for.body2493: + %t268 = load ptr, ptr %a1 + %t269 = load i64, ptr %a265 + %t270 = load { ptr, i64, i64 }, ptr %a178 + %t271 = extractvalue { ptr, i64, i64 } %t270, 1 + %t272 = icmp uge i64 %t269, %t271 + br i1 %t272, label %range2496, label %inrange2497 +range2496: + call void @finch_panic_index(ptr @.str.1591, i64 884, i64 %t269, i64 %t271) + unreachable +inrange2497: + %t273 = extractvalue { ptr, i64, i64 } %t270, 0 + %t274 = getelementptr inbounds { ptr, i64, i64 }, ptr %t273, i64 %t269 + %t275 = load { ptr, i64, i64 }, ptr %t274 + call void @finch.gen.label(ptr %t268, { ptr, i64, i64 } %t275) + %t276 = load ptr, ptr %a1 + %t277 = getelementptr inbounds %S.gen.EnumDef, ptr %a167, i32 0, i32 2 + %t278 = load i64, ptr %a265 + %t279 = load { ptr, i64, i64 }, ptr %t277 + %t280 = extractvalue { ptr, i64, i64 } %t279, 1 + %t281 = icmp uge i64 %t278, %t280 + br i1 %t281, label %range2498, label %inrange2499 +range2498: + call void @finch_panic_index(ptr @.str.1593, i64 885, i64 %t278, i64 %t280) + unreachable +inrange2499: + %t282 = extractvalue { ptr, i64, i64 } %t279, 0 + %t283 = getelementptr inbounds { ptr, i64, i64 }, ptr %t282, i64 %t278 + %t284 = load { ptr, i64, i64 }, ptr %t283 + call void @finch.gen.bufText(ptr %t276, { ptr, i64, i64 } { ptr @.str.1592, i64 4, i64 0 }, { ptr, i64, i64 } %t284) + %t285 = load ptr, ptr %a1 + %t286 = load { ptr, i64, i64 }, ptr %a176 + call void @finch.gen.br(ptr %t285, { ptr, i64, i64 } %t286) + br label %for.step2494 +for.step2494: + %t287 = load i64, ptr %a265 + %t288 = add i64 %t287, 1 + store i64 %t288, ptr %a265 + br label %for.cond2492 +for.end2495: + %t289 = load ptr, ptr %a1 + %t290 = load { ptr, i64, i64 }, ptr %a173 + call void @finch.gen.label(ptr %t289, { ptr, i64, i64 } %t290) + %t291 = load ptr, ptr %a1 + %t292 = getelementptr inbounds %S.gen.EnumDef, ptr %a167, i32 0, i32 1 + %t293 = load { ptr, i64, i64 }, ptr %t292 + store { ptr, i64, i64 } %t293, ptr %a295 + store { ptr, i64, i64 } { ptr @.str.1595, i64 1, i64 0 }, ptr %a296 + call void @finch_str_concat(ptr %a294, ptr %a295, ptr %a296) + %t297 = load { ptr, i64, i64 }, ptr %a294 + call void @finch.gen.bufText(ptr %t291, { ptr, i64, i64 } { ptr @.str.1594, i64 4, i64 0 }, { ptr, i64, i64 } %t297) + %t298 = load ptr, ptr %a1 + %t299 = load ptr, ptr %a1 + %t300 = load { ptr, i64, i64 }, ptr %a170 + store { ptr, i64, i64 } { ptr @.str.1597, i64 9, i64 0 }, ptr %a302 + store { ptr, i64, i64 } %t300, ptr %a303 + call void @finch_str_concat(ptr %a301, ptr %a302, ptr %a303) + %t304 = load { ptr, i64, i64 }, ptr %a301 + store { ptr, i64, i64 } %t304, ptr %a306 + store { ptr, i64, i64 } { ptr @.str.1598, i64 7, i64 0 }, ptr %a307 + call void @finch_str_concat(ptr %a305, ptr %a306, ptr %a307) + %t308 = load { ptr, i64, i64 }, ptr %a305 + %t309 = call { ptr, i64, i64 } @finch.gen.op(ptr %t299, { ptr, i64, i64 } %t308) + store { ptr, i64, i64 } { ptr @.str.1596, i64 39, i64 0 }, ptr %a311 + store { ptr, i64, i64 } %t309, ptr %a312 + call void @finch_str_concat(ptr %a310, ptr %a311, ptr %a312) + %t313 = load { ptr, i64, i64 }, ptr %a310 + store { ptr, i64, i64 } %t313, ptr %a315 + store { ptr, i64, i64 } { ptr @.str.1599, i64 1, i64 0 }, ptr %a316 + call void @finch_str_concat(ptr %a314, ptr %a315, ptr %a316) + %t317 = load { ptr, i64, i64 }, ptr %a314 + call void @finch.gen.emit(ptr %t298, { ptr, i64, i64 } %t317) + %t318 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t318, { ptr, i64, i64 } { ptr @.str.1600, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1601, i64 1, i64 0 }) + %t319 = load ptr, ptr %a1 + %t320 = load { ptr, i64, i64 }, ptr %a176 + call void @finch.gen.br(ptr %t319, { ptr, i64, i64 } %t320) + %t321 = load ptr, ptr %a1 + %t322 = load { ptr, i64, i64 }, ptr %a176 + call void @finch.gen.label(ptr %t321, { ptr, i64, i64 } %t322) + br label %endif2477 +else2476: + %t323 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t324 = load { ptr, i64, i64 }, ptr %t323 + store { ptr, i64, i64 } %t324, ptr %a325 + store { ptr, i64, i64 } { ptr @.str.1602, i64 3, i64 0 }, ptr %a326 + %t327 = call i32 @finch_str_eq(ptr %a325, ptr %a326) + %t328 = icmp ne i32 %t327, 0 + br i1 %t328, label %then2500, label %else2501 +then2500: + %t329 = load ptr, ptr %a1 + %t330 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t329, { ptr, i64, i64 } { ptr @.str.1603, i64 2, i64 0 }) + store { ptr, i64, i64 } %t330, ptr %a331 + %t332 = load ptr, ptr %a1 + %t333 = load { ptr, i64, i64 }, ptr %a331 + call void @finch.gen.store(ptr %t332, { ptr, i64, i64 } { ptr @.str.1604, i64 2, i64 0 }, { ptr, i64, i64 } { ptr @.str.1605, i64 4, i64 0 }, { ptr, i64, i64 } %t333) + %t334 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t334, { ptr, i64, i64 } { ptr @.str.1606, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1607, i64 1, i64 0 }) + %t335 = load ptr, ptr %a1 + %t336 = load ptr, ptr %a1 + %t337 = load ptr, ptr %a1 + %t338 = load %S.ast.Type, ptr %a2 + %t339 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t337, %S.ast.Type %t338) + store { ptr, i64, i64 } { ptr @.str.1609, i64 23, i64 0 }, ptr %a341 + store { ptr, i64, i64 } %t339, ptr %a342 + call void @finch_str_concat(ptr %a340, ptr %a341, ptr %a342) + %t343 = load { ptr, i64, i64 }, ptr %a340 + store { ptr, i64, i64 } %t343, ptr %a345 + store { ptr, i64, i64 } { ptr @.str.1610, i64 22, i64 0 }, ptr %a346 + call void @finch_str_concat(ptr %a344, ptr %a345, ptr %a346) + %t347 = load { ptr, i64, i64 }, ptr %a344 + %t348 = call { ptr, i64, i64 } @finch.gen.op(ptr %t336, { ptr, i64, i64 } %t347) + %t349 = call { ptr, i64, i64 } @finch.gen.load(ptr %t335, { ptr, i64, i64 } { ptr @.str.1608, i64 3, i64 0 }, { ptr, i64, i64 } %t348) + store { ptr, i64, i64 } %t349, ptr %a350 + %t351 = load ptr, ptr %a1 + %t352 = load { ptr, i64, i64 }, ptr %a350 + %t353 = call { ptr, i64, i64 } @finch.gen.loopStart(ptr %t351, { ptr, i64, i64 } %t352) + store { ptr, i64, i64 } %t353, ptr %a354 + %t355 = load ptr, ptr %a1 + %t356 = load %S.ast.Type, ptr %a2 + %t357 = load { ptr, i64, i64 }, ptr %a354 + %t358 = extractvalue { ptr, i64, i64 } %t357, 1 + %t359 = icmp uge i64 3, %t358 + br i1 %t359, label %range2503, label %inrange2504 +range2503: + call void @finch_panic_index(ptr @.str.1612, i64 901, i64 3, i64 %t358) + unreachable +inrange2504: + %t360 = extractvalue { ptr, i64, i64 } %t357, 0 + %t361 = getelementptr inbounds { ptr, i64, i64 }, ptr %t360, i64 3 + %t362 = load { ptr, i64, i64 }, ptr %t361 + %t363 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t355, { ptr, i64, i64 } { ptr @.str.1611, i64 2, i64 0 }, %S.ast.Type %t356, { ptr, i64, i64 } %t362) + store { ptr, i64, i64 } %t363, ptr %a364 + %t365 = load ptr, ptr %a1 + %t366 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t365, { ptr, i64, i64 } { ptr @.str.1613, i64 10, i64 0 }) + store { ptr, i64, i64 } %t366, ptr %a367 + %t368 = load ptr, ptr %a1 + %t369 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t368, { ptr, i64, i64 } { ptr @.str.1614, i64 10, i64 0 }) + store { ptr, i64, i64 } %t369, ptr %a370 + %t371 = load ptr, ptr %a1 + %t372 = load ptr, ptr %a1 + %t373 = load ptr, ptr %a1 + %t374 = load ptr, ptr %a1 + %t375 = load { ptr, i64, i64 }, ptr %a364 + %t376 = load %S.ast.Type, ptr %a2 + %t377 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t374, { ptr, i64, i64 } %t375, %S.ast.Type %t376, i64 0) + %t378 = call { ptr, i64, i64 } @finch.gen.load(ptr %t373, { ptr, i64, i64 } { ptr @.str.1616, i64 3, i64 0 }, { ptr, i64, i64 } %t377) + store { ptr, i64, i64 } { ptr @.str.1615, i64 12, i64 0 }, ptr %a380 + store { ptr, i64, i64 } %t378, ptr %a381 + call void @finch_str_concat(ptr %a379, ptr %a380, ptr %a381) + %t382 = load { ptr, i64, i64 }, ptr %a379 + store { ptr, i64, i64 } %t382, ptr %a384 + store { ptr, i64, i64 } { ptr @.str.1617, i64 3, i64 0 }, ptr %a385 + call void @finch_str_concat(ptr %a383, ptr %a384, ptr %a385) + %t386 = load { ptr, i64, i64 }, ptr %a383 + %t387 = call { ptr, i64, i64 } @finch.gen.op(ptr %t372, { ptr, i64, i64 } %t386) + %t388 = load { ptr, i64, i64 }, ptr %a367 + %t389 = load { ptr, i64, i64 }, ptr %a370 + call void @finch.gen.condBr(ptr %t371, { ptr, i64, i64 } %t387, { ptr, i64, i64 } %t388, { ptr, i64, i64 } %t389) + %t390 = load ptr, ptr %a1 + %t391 = load { ptr, i64, i64 }, ptr %a367 + call void @finch.gen.label(ptr %t390, { ptr, i64, i64 } %t391) + %t392 = load ptr, ptr %a1 + %t393 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t392, { ptr, i64, i64 } { ptr @.str.1618, i64 3, i64 0 }) + store { ptr, i64, i64 } %t393, ptr %a394 + %t395 = load ptr, ptr %a1 + %t396 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t395, { ptr, i64, i64 } { ptr @.str.1619, i64 4, i64 0 }) + store { ptr, i64, i64 } %t396, ptr %a397 + %t398 = load ptr, ptr %a1 + %t399 = load ptr, ptr %a1 + %t400 = load { ptr, i64, i64 }, ptr %a331 + %t401 = call { ptr, i64, i64 } @finch.gen.load(ptr %t399, { ptr, i64, i64 } { ptr @.str.1620, i64 2, i64 0 }, { ptr, i64, i64 } %t400) + %t402 = load { ptr, i64, i64 }, ptr %a397 + %t403 = load { ptr, i64, i64 }, ptr %a394 + call void @finch.gen.condBr(ptr %t398, { ptr, i64, i64 } %t401, { ptr, i64, i64 } %t402, { ptr, i64, i64 } %t403) + %t404 = load ptr, ptr %a1 + %t405 = load { ptr, i64, i64 }, ptr %a394 + call void @finch.gen.label(ptr %t404, { ptr, i64, i64 } %t405) + %t406 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t406, { ptr, i64, i64 } { ptr @.str.1621, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1622, i64 2, i64 0 }) + %t407 = load ptr, ptr %a1 + %t408 = load { ptr, i64, i64 }, ptr %a397 + call void @finch.gen.br(ptr %t407, { ptr, i64, i64 } %t408) + %t409 = load ptr, ptr %a1 + %t410 = load { ptr, i64, i64 }, ptr %a397 + call void @finch.gen.label(ptr %t409, { ptr, i64, i64 } %t410) + %t411 = load ptr, ptr %a1 + %t412 = load { ptr, i64, i64 }, ptr %a331 + call void @finch.gen.store(ptr %t411, { ptr, i64, i64 } { ptr @.str.1623, i64 2, i64 0 }, { ptr, i64, i64 } { ptr @.str.1624, i64 5, i64 0 }, { ptr, i64, i64 } %t412) + %t413 = load ptr, ptr %a1 + %t414 = load ptr, ptr %a1 + %t415 = load ptr, ptr %a1 + %t416 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t417 = load { ptr, i64, i64 }, ptr %t416 + %t418 = extractvalue { ptr, i64, i64 } %t417, 1 + %t419 = icmp uge i64 0, %t418 + br i1 %t419, label %range2505, label %inrange2506 +range2505: + call void @finch_panic_index(ptr @.str.1626, i64 914, i64 0, i64 %t418) + unreachable +inrange2506: + %t420 = extractvalue { ptr, i64, i64 } %t417, 0 + %t421 = getelementptr inbounds %S.ast.Type, ptr %t420, i64 0 + %t422 = load %S.ast.Type, ptr %t421 + %t423 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t415, %S.ast.Type %t422) + %t424 = load ptr, ptr %a1 + %t425 = load { ptr, i64, i64 }, ptr %a364 + %t426 = load %S.ast.Type, ptr %a2 + %t427 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t424, { ptr, i64, i64 } %t425, %S.ast.Type %t426, i64 1) + %t428 = call { ptr, i64, i64 } @finch.gen.load(ptr %t414, { ptr, i64, i64 } %t423, { ptr, i64, i64 } %t427) + %t429 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t430 = load { ptr, i64, i64 }, ptr %t429 + %t431 = extractvalue { ptr, i64, i64 } %t430, 1 + %t432 = icmp uge i64 0, %t431 + br i1 %t432, label %range2507, label %inrange2508 +range2507: + call void @finch_panic_index(ptr @.str.1627, i64 914, i64 0, i64 %t431) + unreachable +inrange2508: + %t433 = extractvalue { ptr, i64, i64 } %t430, 0 + %t434 = getelementptr inbounds %S.ast.Type, ptr %t433, i64 0 + %t435 = load %S.ast.Type, ptr %t434 + call void @finch.gen.emitFormat(ptr %t413, { ptr, i64, i64 } { ptr @.str.1625, i64 4, i64 0 }, { ptr, i64, i64 } %t428, %S.ast.Type %t435, i1 true) + %t436 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t436, { ptr, i64, i64 } { ptr @.str.1628, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1629, i64 2, i64 0 }) + %t437 = load ptr, ptr %a1 + %t438 = load ptr, ptr %a1 + %t439 = load ptr, ptr %a1 + %t440 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t441 = load { ptr, i64, i64 }, ptr %t440 + %t442 = extractvalue { ptr, i64, i64 } %t441, 1 + %t443 = icmp uge i64 1, %t442 + br i1 %t443, label %range2509, label %inrange2510 +range2509: + call void @finch_panic_index(ptr @.str.1631, i64 916, i64 1, i64 %t442) + unreachable +inrange2510: + %t444 = extractvalue { ptr, i64, i64 } %t441, 0 + %t445 = getelementptr inbounds %S.ast.Type, ptr %t444, i64 1 + %t446 = load %S.ast.Type, ptr %t445 + %t447 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t439, %S.ast.Type %t446) + %t448 = load ptr, ptr %a1 + %t449 = load { ptr, i64, i64 }, ptr %a364 + %t450 = load %S.ast.Type, ptr %a2 + %t451 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t448, { ptr, i64, i64 } %t449, %S.ast.Type %t450, i64 2) + %t452 = call { ptr, i64, i64 } @finch.gen.load(ptr %t438, { ptr, i64, i64 } %t447, { ptr, i64, i64 } %t451) + %t453 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t454 = load { ptr, i64, i64 }, ptr %t453 + %t455 = extractvalue { ptr, i64, i64 } %t454, 1 + %t456 = icmp uge i64 1, %t455 + br i1 %t456, label %range2511, label %inrange2512 +range2511: + call void @finch_panic_index(ptr @.str.1632, i64 916, i64 1, i64 %t455) + unreachable +inrange2512: + %t457 = extractvalue { ptr, i64, i64 } %t454, 0 + %t458 = getelementptr inbounds %S.ast.Type, ptr %t457, i64 1 + %t459 = load %S.ast.Type, ptr %t458 + call void @finch.gen.emitFormat(ptr %t437, { ptr, i64, i64 } { ptr @.str.1630, i64 4, i64 0 }, { ptr, i64, i64 } %t452, %S.ast.Type %t459, i1 true) + %t460 = load ptr, ptr %a1 + %t461 = load { ptr, i64, i64 }, ptr %a370 + call void @finch.gen.br(ptr %t460, { ptr, i64, i64 } %t461) + %t462 = load ptr, ptr %a1 + %t463 = load { ptr, i64, i64 }, ptr %a370 + call void @finch.gen.label(ptr %t462, { ptr, i64, i64 } %t463) + %t464 = load ptr, ptr %a1 + %t465 = load { ptr, i64, i64 }, ptr %a354 + call void @finch.gen.loopEnd(ptr %t464, { ptr, i64, i64 } %t465) + %t466 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t466, { ptr, i64, i64 } { ptr @.str.1633, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1634, i64 1, i64 0 }) + br label %endif2502 +else2501: + %t467 = load ptr, ptr %a1 + %t468 = icmp eq ptr %t467, null + br i1 %t468, label %panic2513, label %ok2514 +panic2513: + call void @finch_panic(ptr @.str.1635, i64 922, ptr @.str.1636) + unreachable +ok2514: + %t469 = getelementptr inbounds %S.gen.Gen, ptr %t467, i32 0, i32 15 + %t470 = load ptr, ptr %a1 + %t471 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t472 = load { ptr, i64, i64 }, ptr %t471 + %t473 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t474 = load { ptr, i64, i64 }, ptr %t473 + %t475 = call i64 @finch.gen.findStruct(ptr %t470, { ptr, i64, i64 } %t472, { ptr, i64, i64 } %t474) + %t476 = load { ptr, i64, i64 }, ptr %t469 + %t477 = extractvalue { ptr, i64, i64 } %t476, 1 + %t478 = icmp uge i64 %t475, %t477 + br i1 %t478, label %range2515, label %inrange2516 +range2515: + call void @finch_panic_index(ptr @.str.1637, i64 922, i64 %t475, i64 %t477) + unreachable +inrange2516: + %t479 = extractvalue { ptr, i64, i64 } %t476, 0 + %t480 = getelementptr inbounds %S.gen.StructDef, ptr %t479, i64 %t475 + %t481 = load %S.gen.StructDef, ptr %t480 + store %S.gen.StructDef %t481, ptr %a482 + call void @finch.copy.S_gen_StructDef(ptr %a483, ptr %a482) + %t484 = load %S.gen.StructDef, ptr %a483 + store %S.gen.StructDef %t484, ptr %a485 + %t486 = load ptr, ptr %a1 + %t487 = load %S.ast.Type, ptr %a2 + %t488 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t486, %S.ast.Type %t487) + store { ptr, i64, i64 } %t488, ptr %a489 + %t490 = load ptr, ptr %a1 + %t491 = getelementptr inbounds %S.gen.StructDef, ptr %a485, i32 0, i32 1 + %t492 = load { ptr, i64, i64 }, ptr %t491 + store { ptr, i64, i64 } %t492, ptr %a494 + store { ptr, i64, i64 } { ptr @.str.1639, i64 1, i64 0 }, ptr %a495 + call void @finch_str_concat(ptr %a493, ptr %a494, ptr %a495) + %t496 = load { ptr, i64, i64 }, ptr %a493 + call void @finch.gen.bufText(ptr %t490, { ptr, i64, i64 } { ptr @.str.1638, i64 4, i64 0 }, { ptr, i64, i64 } %t496) + %t497 = getelementptr inbounds %S.gen.StructDef, ptr %a485, i32 0, i32 12 + %t498 = getelementptr inbounds { ptr, i64, i64 }, ptr %t497, i32 0, i32 1 + %t499 = load i64, ptr %t498 + store i64 0, ptr %a500 + br label %for.cond2517 +for.cond2517: + %t501 = load i64, ptr %a500 + %t502 = icmp slt i64 %t501, %t499 + br i1 %t502, label %for.body2518, label %for.end2520 +for.body2518: + store { ptr, i64, i64 } { ptr @.str.1640, i64 2, i64 0 }, ptr %a503 + %t504 = load i64, ptr %a500 + %t505 = icmp eq i64 %t504, 0 + br i1 %t505, label %then2521, label %endif2523 +then2521: + store { ptr, i64, i64 } { ptr @.str.1641, i64 0, i64 0 }, ptr %a503 + br label %endif2523 +endif2523: + %t506 = load ptr, ptr %a1 + %t507 = load { ptr, i64, i64 }, ptr %a503 + %t508 = getelementptr inbounds %S.gen.StructDef, ptr %a485, i32 0, i32 11 + %t509 = load i64, ptr %a500 + %t510 = load { ptr, i64, i64 }, ptr %t508 + %t511 = extractvalue { ptr, i64, i64 } %t510, 1 + %t512 = icmp uge i64 %t509, %t511 + br i1 %t512, label %range2524, label %inrange2525 +range2524: + call void @finch_panic_index(ptr @.str.1643, i64 930, i64 %t509, i64 %t511) + unreachable +inrange2525: + %t513 = extractvalue { ptr, i64, i64 } %t510, 0 + %t514 = getelementptr inbounds { ptr, i64, i64 }, ptr %t513, i64 %t509 + %t515 = load { ptr, i64, i64 }, ptr %t514 + store { ptr, i64, i64 } %t507, ptr %a517 + store { ptr, i64, i64 } %t515, ptr %a518 + call void @finch_str_concat(ptr %a516, ptr %a517, ptr %a518) + %t519 = load { ptr, i64, i64 }, ptr %a516 + store { ptr, i64, i64 } %t519, ptr %a521 + store { ptr, i64, i64 } { ptr @.str.1644, i64 2, i64 0 }, ptr %a522 + call void @finch_str_concat(ptr %a520, ptr %a521, ptr %a522) + %t523 = load { ptr, i64, i64 }, ptr %a520 + call void @finch.gen.bufText(ptr %t506, { ptr, i64, i64 } { ptr @.str.1642, i64 4, i64 0 }, { ptr, i64, i64 } %t523) + %t524 = load ptr, ptr %a1 + %t525 = load { ptr, i64, i64 }, ptr %a489 + store { ptr, i64, i64 } { ptr @.str.1645, i64 23, i64 0 }, ptr %a527 + store { ptr, i64, i64 } %t525, ptr %a528 + call void @finch_str_concat(ptr %a526, ptr %a527, ptr %a528) + %t529 = load { ptr, i64, i64 }, ptr %a526 + store { ptr, i64, i64 } %t529, ptr %a531 + store { ptr, i64, i64 } { ptr @.str.1646, i64 21, i64 0 }, ptr %a532 + call void @finch_str_concat(ptr %a530, ptr %a531, ptr %a532) + %t533 = load { ptr, i64, i64 }, ptr %a530 + %t534 = getelementptr inbounds %S.gen.StructDef, ptr %a485, i32 0, i32 3 + %t535 = load i64, ptr %a500 + %t536 = load { ptr, i64, i64 }, ptr %t534 + %t537 = extractvalue { ptr, i64, i64 } %t536, 1 + %t538 = icmp uge i64 %t535, %t537 + br i1 %t538, label %range2526, label %inrange2527 +range2526: + call void @finch_panic_index(ptr @.str.1647, i64 931, i64 %t535, i64 %t537) + unreachable +inrange2527: + %t539 = extractvalue { ptr, i64, i64 } %t536, 0 + %t540 = getelementptr inbounds i64, ptr %t539, i64 %t535 + %t541 = load i64, ptr %t540 + call void @finch_str_from_int(ptr %a542, i64 %t541) + %t543 = load { ptr, i64, i64 }, ptr %a542 + store { ptr, i64, i64 } %t533, ptr %a545 + store { ptr, i64, i64 } %t543, ptr %a546 + call void @finch_str_concat(ptr %a544, ptr %a545, ptr %a546) + %t547 = load { ptr, i64, i64 }, ptr %a544 + %t548 = call { ptr, i64, i64 } @finch.gen.op(ptr %t524, { ptr, i64, i64 } %t547) + store { ptr, i64, i64 } %t548, ptr %a549 + %t550 = load ptr, ptr %a1 + %t551 = load ptr, ptr %a1 + %t552 = load ptr, ptr %a1 + %t553 = getelementptr inbounds %S.gen.StructDef, ptr %a485, i32 0, i32 12 + %t554 = load i64, ptr %a500 + %t555 = load { ptr, i64, i64 }, ptr %t553 + %t556 = extractvalue { ptr, i64, i64 } %t555, 1 + %t557 = icmp uge i64 %t554, %t556 + br i1 %t557, label %range2528, label %inrange2529 +range2528: + call void @finch_panic_index(ptr @.str.1649, i64 932, i64 %t554, i64 %t556) + unreachable +inrange2529: + %t558 = extractvalue { ptr, i64, i64 } %t555, 0 + %t559 = getelementptr inbounds %S.ast.Type, ptr %t558, i64 %t554 + %t560 = load %S.ast.Type, ptr %t559 + %t561 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t552, %S.ast.Type %t560) + %t562 = load { ptr, i64, i64 }, ptr %a549 + %t563 = call { ptr, i64, i64 } @finch.gen.load(ptr %t551, { ptr, i64, i64 } %t561, { ptr, i64, i64 } %t562) + %t564 = getelementptr inbounds %S.gen.StructDef, ptr %a485, i32 0, i32 12 + %t565 = load i64, ptr %a500 + %t566 = load { ptr, i64, i64 }, ptr %t564 + %t567 = extractvalue { ptr, i64, i64 } %t566, 1 + %t568 = icmp uge i64 %t565, %t567 + br i1 %t568, label %range2530, label %inrange2531 +range2530: + call void @finch_panic_index(ptr @.str.1650, i64 932, i64 %t565, i64 %t567) + unreachable +inrange2531: + %t569 = extractvalue { ptr, i64, i64 } %t566, 0 + %t570 = getelementptr inbounds %S.ast.Type, ptr %t569, i64 %t565 + %t571 = load %S.ast.Type, ptr %t570 + call void @finch.gen.emitFormat(ptr %t550, { ptr, i64, i64 } { ptr @.str.1648, i64 4, i64 0 }, { ptr, i64, i64 } %t563, %S.ast.Type %t571, i1 true) + br label %for.step2519 +for.step2519: + %t572 = load i64, ptr %a500 + %t573 = add i64 %t572, 1 + store i64 %t573, ptr %a500 + br label %for.cond2517 +for.end2520: + %t574 = load ptr, ptr %a1 + call void @finch.gen.bufText(ptr %t574, { ptr, i64, i64 } { ptr @.str.1651, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.1652, i64 1, i64 0 }) + br label %endif2502 +endif2502: + br label %endif2477 +endif2477: + br label %endif2468 +endif2468: + %t575 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t575, { ptr, i64, i64 } { ptr @.str.1653, i64 8, i64 0 }) + %t576 = load ptr, ptr %a1 + %t577 = load %S.gen.Saved, ptr %a34 + %t578 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.1654, i64 21, i64 0 }, ptr %a580 + store { ptr, i64, i64 } %t578, ptr %a581 + call void @finch_str_concat(ptr %a579, ptr %a580, ptr %a581) + %t582 = load { ptr, i64, i64 }, ptr %a579 + store { ptr, i64, i64 } %t582, ptr %a584 + store { ptr, i64, i64 } { ptr @.str.1655, i64 18, i64 0 }, ptr %a585 + call void @finch_str_concat(ptr %a583, ptr %a584, ptr %a585) + %t586 = load { ptr, i64, i64 }, ptr %a583 + call void @finch.gen.endHelper(ptr %t576, %S.gen.Saved %t577, { ptr, i64, i64 } %t586) + %t587 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t587, ptr %a588 + call void @finch_str_copy(ptr %a589, ptr %a588) + %t590 = load { ptr, i64, i64 }, ptr %a589 + ret { ptr, i64, i64 } %t590 +} + +define internal { ptr, i64, i64 } @finch.gen.intCast(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a7 = alloca i64, align 16 + %a10 = alloca i64, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + %t5 = load %S.ast.Type, ptr %a3 + %t6 = call i64 @finch.gen.bitsOf(%S.ast.Type %t5) + store i64 %t6, ptr %a7 + %t8 = load %S.ast.Type, ptr %a4 + %t9 = call i64 @finch.gen.bitsOf(%S.ast.Type %t8) + store i64 %t9, ptr %a10 + %t11 = load i64, ptr %a7 + %t12 = load i64, ptr %a10 + %t13 = icmp eq i64 %t11, %t12 + br i1 %t13, label %then2532, label %endif2534 +then2532: + %t14 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t14, ptr %a15 + call void @finch_str_copy(ptr %a16, ptr %a15) + %t17 = load { ptr, i64, i64 }, ptr %a16 + ret { ptr, i64, i64 } %t17 +endif2534: + %t18 = load i64, ptr %a10 + %t19 = load i64, ptr %a7 + %t20 = icmp slt i64 %t18, %t19 + br i1 %t20, label %then2535, label %endif2537 +then2535: + %t21 = load ptr, ptr %a1 + %t22 = load ptr, ptr %a1 + %t23 = load %S.ast.Type, ptr %a3 + %t24 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t22, %S.ast.Type %t23) + store { ptr, i64, i64 } { ptr @.str.1656, i64 6, i64 0 }, ptr %a26 + store { ptr, i64, i64 } %t24, ptr %a27 + call void @finch_str_concat(ptr %a25, ptr %a26, ptr %a27) + %t28 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t28, ptr %a30 + store { ptr, i64, i64 } { ptr @.str.1657, i64 1, i64 0 }, ptr %a31 + call void @finch_str_concat(ptr %a29, ptr %a30, ptr %a31) + %t32 = load { ptr, i64, i64 }, ptr %a29 + %t33 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t32, ptr %a35 + store { ptr, i64, i64 } %t33, ptr %a36 + call void @finch_str_concat(ptr %a34, ptr %a35, ptr %a36) + %t37 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t37, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.1658, i64 4, i64 0 }, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + %t42 = load ptr, ptr %a1 + %t43 = load %S.ast.Type, ptr %a4 + %t44 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t42, %S.ast.Type %t43) + store { ptr, i64, i64 } %t41, ptr %a46 + store { ptr, i64, i64 } %t44, ptr %a47 + call void @finch_str_concat(ptr %a45, ptr %a46, ptr %a47) + %t48 = load { ptr, i64, i64 }, ptr %a45 + %t49 = call { ptr, i64, i64 } @finch.gen.op(ptr %t21, { ptr, i64, i64 } %t48) + ret { ptr, i64, i64 } %t49 +endif2537: + %t50 = load %S.ast.Type, ptr %a3 + %t51 = call i1 @finch.gen.isSigned(%S.ast.Type %t50) + br i1 %t51, label %then2538, label %endif2540 +then2538: + %t52 = load ptr, ptr %a1 + %t53 = load ptr, ptr %a1 + %t54 = load %S.ast.Type, ptr %a3 + %t55 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t53, %S.ast.Type %t54) + store { ptr, i64, i64 } { ptr @.str.1659, i64 5, i64 0 }, ptr %a57 + store { ptr, i64, i64 } %t55, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t59, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.1660, i64 1, i64 0 }, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + %t64 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t63, ptr %a66 + store { ptr, i64, i64 } %t64, ptr %a67 + call void @finch_str_concat(ptr %a65, ptr %a66, ptr %a67) + %t68 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t68, ptr %a70 + store { ptr, i64, i64 } { ptr @.str.1661, i64 4, i64 0 }, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + %t73 = load ptr, ptr %a1 + %t74 = load %S.ast.Type, ptr %a4 + %t75 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t73, %S.ast.Type %t74) + store { ptr, i64, i64 } %t72, ptr %a77 + store { ptr, i64, i64 } %t75, ptr %a78 + call void @finch_str_concat(ptr %a76, ptr %a77, ptr %a78) + %t79 = load { ptr, i64, i64 }, ptr %a76 + %t80 = call { ptr, i64, i64 } @finch.gen.op(ptr %t52, { ptr, i64, i64 } %t79) + ret { ptr, i64, i64 } %t80 +endif2540: + %t81 = load ptr, ptr %a1 + %t82 = load ptr, ptr %a1 + %t83 = load %S.ast.Type, ptr %a3 + %t84 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t82, %S.ast.Type %t83) + store { ptr, i64, i64 } { ptr @.str.1662, i64 5, i64 0 }, ptr %a86 + store { ptr, i64, i64 } %t84, ptr %a87 + call void @finch_str_concat(ptr %a85, ptr %a86, ptr %a87) + %t88 = load { ptr, i64, i64 }, ptr %a85 + store { ptr, i64, i64 } %t88, ptr %a90 + store { ptr, i64, i64 } { ptr @.str.1663, i64 1, i64 0 }, ptr %a91 + call void @finch_str_concat(ptr %a89, ptr %a90, ptr %a91) + %t92 = load { ptr, i64, i64 }, ptr %a89 + %t93 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t92, ptr %a95 + store { ptr, i64, i64 } %t93, ptr %a96 + call void @finch_str_concat(ptr %a94, ptr %a95, ptr %a96) + %t97 = load { ptr, i64, i64 }, ptr %a94 + store { ptr, i64, i64 } %t97, ptr %a99 + store { ptr, i64, i64 } { ptr @.str.1664, i64 4, i64 0 }, ptr %a100 + call void @finch_str_concat(ptr %a98, ptr %a99, ptr %a100) + %t101 = load { ptr, i64, i64 }, ptr %a98 + %t102 = load ptr, ptr %a1 + %t103 = load %S.ast.Type, ptr %a4 + %t104 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t102, %S.ast.Type %t103) + store { ptr, i64, i64 } %t101, ptr %a106 + store { ptr, i64, i64 } %t104, ptr %a107 + call void @finch_str_concat(ptr %a105, ptr %a106, ptr %a107) + %t108 = load { ptr, i64, i64 }, ptr %a105 + %t109 = call { ptr, i64, i64 } @finch.gen.op(ptr %t81, { ptr, i64, i64 } %t108) + ret { ptr, i64, i64 } %t109 +} + +define internal { ptr, i64, i64 } @finch.gen.floatCast(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 0 + %t8 = load { ptr, i64, i64 }, ptr %t7 + store { ptr, i64, i64 } %t6, ptr %a9 + store { ptr, i64, i64 } %t8, ptr %a10 + %t11 = call i32 @finch_str_eq(ptr %a9, ptr %a10) + %t12 = icmp ne i32 %t11, 0 + br i1 %t12, label %then2541, label %endif2543 +then2541: + %t13 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t13, ptr %a14 + call void @finch_str_copy(ptr %a15, ptr %a14) + %t16 = load { ptr, i64, i64 }, ptr %a15 + ret { ptr, i64, i64 } %t16 +endif2543: + %t17 = load %S.ast.Type, ptr %a4 + %t18 = call i64 @finch.gen.bitsOf(%S.ast.Type %t17) + %t19 = load %S.ast.Type, ptr %a3 + %t20 = call i64 @finch.gen.bitsOf(%S.ast.Type %t19) + %t21 = icmp sgt i64 %t18, %t20 + br i1 %t21, label %then2544, label %endif2546 +then2544: + %t22 = load ptr, ptr %a1 + %t23 = load ptr, ptr %a1 + %t24 = load %S.ast.Type, ptr %a3 + %t25 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t23, %S.ast.Type %t24) + store { ptr, i64, i64 } { ptr @.str.1665, i64 6, i64 0 }, ptr %a27 + store { ptr, i64, i64 } %t25, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t29, ptr %a31 + store { ptr, i64, i64 } { ptr @.str.1666, i64 1, i64 0 }, ptr %a32 + call void @finch_str_concat(ptr %a30, ptr %a31, ptr %a32) + %t33 = load { ptr, i64, i64 }, ptr %a30 + %t34 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t33, ptr %a36 + store { ptr, i64, i64 } %t34, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t38, ptr %a40 + store { ptr, i64, i64 } { ptr @.str.1667, i64 4, i64 0 }, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + %t43 = load ptr, ptr %a1 + %t44 = load %S.ast.Type, ptr %a4 + %t45 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t43, %S.ast.Type %t44) + store { ptr, i64, i64 } %t42, ptr %a47 + store { ptr, i64, i64 } %t45, ptr %a48 + call void @finch_str_concat(ptr %a46, ptr %a47, ptr %a48) + %t49 = load { ptr, i64, i64 }, ptr %a46 + %t50 = call { ptr, i64, i64 } @finch.gen.op(ptr %t22, { ptr, i64, i64 } %t49) + ret { ptr, i64, i64 } %t50 +endif2546: + %t51 = load ptr, ptr %a1 + %t52 = load ptr, ptr %a1 + %t53 = load %S.ast.Type, ptr %a3 + %t54 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t52, %S.ast.Type %t53) + store { ptr, i64, i64 } { ptr @.str.1668, i64 8, i64 0 }, ptr %a56 + store { ptr, i64, i64 } %t54, ptr %a57 + call void @finch_str_concat(ptr %a55, ptr %a56, ptr %a57) + %t58 = load { ptr, i64, i64 }, ptr %a55 + store { ptr, i64, i64 } %t58, ptr %a60 + store { ptr, i64, i64 } { ptr @.str.1669, i64 1, i64 0 }, ptr %a61 + call void @finch_str_concat(ptr %a59, ptr %a60, ptr %a61) + %t62 = load { ptr, i64, i64 }, ptr %a59 + %t63 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t62, ptr %a65 + store { ptr, i64, i64 } %t63, ptr %a66 + call void @finch_str_concat(ptr %a64, ptr %a65, ptr %a66) + %t67 = load { ptr, i64, i64 }, ptr %a64 + store { ptr, i64, i64 } %t67, ptr %a69 + store { ptr, i64, i64 } { ptr @.str.1670, i64 4, i64 0 }, ptr %a70 + call void @finch_str_concat(ptr %a68, ptr %a69, ptr %a70) + %t71 = load { ptr, i64, i64 }, ptr %a68 + %t72 = load ptr, ptr %a1 + %t73 = load %S.ast.Type, ptr %a4 + %t74 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t72, %S.ast.Type %t73) + store { ptr, i64, i64 } %t71, ptr %a76 + store { ptr, i64, i64 } %t74, ptr %a77 + call void @finch_str_concat(ptr %a75, ptr %a76, ptr %a77) + %t78 = load { ptr, i64, i64 }, ptr %a75 + %t79 = call { ptr, i64, i64 } @finch.gen.op(ptr %t51, { ptr, i64, i64 } %t78) + ret { ptr, i64, i64 } %t79 +} + +define internal { ptr, i64, i64 } @finch.gen.intToFloat(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + %t5 = load %S.ast.Type, ptr %a3 + %t6 = call i1 @finch.gen.isSigned(%S.ast.Type %t5) + br i1 %t6, label %then2547, label %endif2549 +then2547: + %t7 = load ptr, ptr %a1 + %t8 = load ptr, ptr %a1 + %t9 = load %S.ast.Type, ptr %a3 + %t10 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t8, %S.ast.Type %t9) + store { ptr, i64, i64 } { ptr @.str.1671, i64 7, i64 0 }, ptr %a12 + store { ptr, i64, i64 } %t10, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t14, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.1672, i64 1, i64 0 }, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + %t19 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t18, ptr %a21 + store { ptr, i64, i64 } %t19, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t23, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.1673, i64 4, i64 0 }, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + %t28 = load ptr, ptr %a1 + %t29 = load %S.ast.Type, ptr %a4 + %t30 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t28, %S.ast.Type %t29) + store { ptr, i64, i64 } %t27, ptr %a32 + store { ptr, i64, i64 } %t30, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = call { ptr, i64, i64 } @finch.gen.op(ptr %t7, { ptr, i64, i64 } %t34) + ret { ptr, i64, i64 } %t35 +endif2549: + %t36 = load ptr, ptr %a1 + %t37 = load ptr, ptr %a1 + %t38 = load %S.ast.Type, ptr %a3 + %t39 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t37, %S.ast.Type %t38) + store { ptr, i64, i64 } { ptr @.str.1674, i64 7, i64 0 }, ptr %a41 + store { ptr, i64, i64 } %t39, ptr %a42 + call void @finch_str_concat(ptr %a40, ptr %a41, ptr %a42) + %t43 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t43, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.1675, i64 1, i64 0 }, ptr %a46 + call void @finch_str_concat(ptr %a44, ptr %a45, ptr %a46) + %t47 = load { ptr, i64, i64 }, ptr %a44 + %t48 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t47, ptr %a50 + store { ptr, i64, i64 } %t48, ptr %a51 + call void @finch_str_concat(ptr %a49, ptr %a50, ptr %a51) + %t52 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t52, ptr %a54 + store { ptr, i64, i64 } { ptr @.str.1676, i64 4, i64 0 }, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + %t57 = load ptr, ptr %a1 + %t58 = load %S.ast.Type, ptr %a4 + %t59 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t57, %S.ast.Type %t58) + store { ptr, i64, i64 } %t56, ptr %a61 + store { ptr, i64, i64 } %t59, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + %t64 = call { ptr, i64, i64 } @finch.gen.op(ptr %t36, { ptr, i64, i64 } %t63) + ret { ptr, i64, i64 } %t64 +} + +define internal void @finch.copy.S_gen_Val(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Val, ptr %src + store %S.gen.Val %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Val, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Val, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Val, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Val, ptr %src, i32 0, i32 1 + call void @finch.copy.S_ast_Type(ptr %t4, ptr %t5) + ret void +} + +define internal %S.gen.Val @finch.gen.coerce(ptr %p0, %S.gen.Val %p1, %S.ast.Type %p2, %S.ast.Node %p3, { ptr, i64, i64 } %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.Val, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.ast.Node, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca %S.gen.Val, align 16 + %a12 = alloca %S.gen.Val, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca %S.ast.Type, align 16 + %a31 = alloca %S.ast.Type, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca %S.ast.Type, align 16 + %a67 = alloca %S.ast.Type, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca %S.ast.Type, align 16 + %a93 = alloca %S.ast.Type, align 16 + %a110 = alloca %S.ast.Type, align 16 + %a111 = alloca %S.ast.Type, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca %S.ast.Type, align 16 + %a158 = alloca %S.ast.Type, align 16 + %a171 = alloca %S.ast.Type, align 16 + %a172 = alloca %S.ast.Type, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca %S.ast.Type, align 16 + %a199 = alloca %S.ast.Type, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca %S.ast.Type, align 16 + %a229 = alloca %S.ast.Type, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a270 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca %S.gen.Val, align 16 + %a328 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.gen.Val %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store %S.ast.Node %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + %t6 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t7 = load %S.ast.Type, ptr %t6 + %t8 = load %S.ast.Type, ptr %a3 + %t9 = call i1 @finch.ast.same(%S.ast.Type %t7, %S.ast.Type %t8) + br i1 %t9, label %then2550, label %endif2552 +then2550: + %t10 = load %S.gen.Val, ptr %a2 + store %S.gen.Val %t10, ptr %a11 + call void @finch.copy.S_gen_Val(ptr %a12, ptr %a11) + %t13 = load %S.gen.Val, ptr %a12 + ret %S.gen.Val %t13 +endif2552: + %t14 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t15 = getelementptr inbounds %S.ast.Type, ptr %t14, i32 0, i32 0 + %t16 = load { ptr, i64, i64 }, ptr %t15 + store { ptr, i64, i64 } %t16, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.1677, i64 4, i64 0 }, ptr %a18 + %t19 = call i32 @finch_str_eq(ptr %a17, ptr %a18) + %t20 = icmp ne i32 %t19, 0 + br label %logic.from2553 +logic.from2553: + br i1 %t20, label %logic.rhs2554, label %logic.end2555 +logic.rhs2554: + %t21 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t22 = load { ptr, i64, i64 }, ptr %t21 + store { ptr, i64, i64 } %t22, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.1678, i64 3, i64 0 }, ptr %a24 + %t25 = call i32 @finch_str_eq(ptr %a23, ptr %a24) + %t26 = icmp ne i32 %t25, 0 + br label %logic.rend2556 +logic.rend2556: + br label %logic.end2555 +logic.end2555: + %t27 = phi i1 [ false, %logic.from2553 ], [ %t26, %logic.rend2556 ] + br i1 %t27, label %then2557, label %endif2559 +then2557: + %t28 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } { ptr @.str.1679, i64 4, i64 0 }, 0 + %t29 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t29, ptr %a30 + call void @finch.copy.S_ast_Type(ptr %a31, ptr %a30) + %t32 = load %S.ast.Type, ptr %a31 + %t33 = insertvalue %S.gen.Val %t28, %S.ast.Type %t32, 1 + ret %S.gen.Val %t33 +endif2559: + %t34 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t35 = getelementptr inbounds %S.ast.Type, ptr %t34, i32 0, i32 0 + %t36 = load { ptr, i64, i64 }, ptr %t35 + store { ptr, i64, i64 } %t36, ptr %a37 + store { ptr, i64, i64 } { ptr @.str.1680, i64 3, i64 0 }, ptr %a38 + %t39 = call i32 @finch_str_eq(ptr %a37, ptr %a38) + %t40 = icmp ne i32 %t39, 0 + br label %logic.from2560 +logic.from2560: + br i1 %t40, label %logic.rhs2561, label %logic.end2562 +logic.rhs2561: + %t41 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t42 = load { ptr, i64, i64 }, ptr %t41 + store { ptr, i64, i64 } %t42, ptr %a43 + store { ptr, i64, i64 } { ptr @.str.1681, i64 3, i64 0 }, ptr %a44 + %t45 = call i32 @finch_str_eq(ptr %a43, ptr %a44) + %t46 = icmp ne i32 %t45, 0 + br label %logic.rend2563 +logic.rend2563: + br label %logic.end2562 +logic.end2562: + %t47 = phi i1 [ false, %logic.from2560 ], [ %t46, %logic.rend2563 ] + br label %logic.from2564 +logic.from2564: + br i1 %t47, label %logic.rhs2565, label %logic.end2566 +logic.rhs2565: + %t48 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t49 = getelementptr inbounds %S.ast.Type, ptr %t48, i32 0, i32 1 + %t50 = getelementptr inbounds { ptr, i64, i64 }, ptr %t49, i32 0, i32 1 + %t51 = load i64, ptr %t50 + %t52 = icmp eq i64 %t51, 0 + br label %logic.from2567 +logic.from2567: + br i1 %t52, label %logic.end2569, label %logic.rhs2568 +logic.rhs2568: + %t53 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t54 = getelementptr inbounds { ptr, i64, i64 }, ptr %t53, i32 0, i32 1 + %t55 = load i64, ptr %t54 + %t56 = icmp eq i64 %t55, 0 + br label %logic.rend2570 +logic.rend2570: + br label %logic.end2569 +logic.end2569: + %t57 = phi i1 [ true, %logic.from2567 ], [ %t56, %logic.rend2570 ] + br label %logic.rend2571 +logic.rend2571: + br label %logic.end2566 +logic.end2566: + %t58 = phi i1 [ false, %logic.from2564 ], [ %t57, %logic.rend2571 ] + br i1 %t58, label %then2572, label %endif2574 +then2572: + %t59 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t60 = load { ptr, i64, i64 }, ptr %t59 + store { ptr, i64, i64 } %t60, ptr %a61 + call void @finch_str_copy(ptr %a62, ptr %a61) + %t63 = load { ptr, i64, i64 }, ptr %a62 + %t64 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t63, 0 + %t65 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t65, ptr %a66 + call void @finch.copy.S_ast_Type(ptr %a67, ptr %a66) + %t68 = load %S.ast.Type, ptr %a67 + %t69 = insertvalue %S.gen.Val %t64, %S.ast.Type %t68, 1 + ret %S.gen.Val %t69 +endif2574: + %t70 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t71 = load %S.ast.Type, ptr %t70 + %t72 = call i1 @finch.gen.isInt(%S.ast.Type %t71) + br label %logic.from2575 +logic.from2575: + br i1 %t72, label %logic.rhs2576, label %logic.end2577 +logic.rhs2576: + %t73 = load %S.ast.Type, ptr %a3 + %t74 = call i1 @finch.gen.isInt(%S.ast.Type %t73) + br label %logic.rend2578 +logic.rend2578: + br label %logic.end2577 +logic.end2577: + %t75 = phi i1 [ false, %logic.from2575 ], [ %t74, %logic.rend2578 ] + br i1 %t75, label %then2579, label %endif2581 +then2579: + %t76 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 3 + %t77 = load i1, ptr %t76 + br label %logic.from2582 +logic.from2582: + br i1 %t77, label %logic.rhs2583, label %logic.end2584 +logic.rhs2583: + %t78 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t79 = load { ptr, i64, i64 }, ptr %t78 + %t80 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t81 = load %S.ast.Type, ptr %t80 + %t82 = load %S.ast.Type, ptr %a3 + %t83 = call i1 @finch.gen.fits({ ptr, i64, i64 } %t79, %S.ast.Type %t81, %S.ast.Type %t82) + br label %logic.rend2585 +logic.rend2585: + br label %logic.end2584 +logic.end2584: + %t84 = phi i1 [ false, %logic.from2582 ], [ %t83, %logic.rend2585 ] + br i1 %t84, label %then2586, label %endif2588 +then2586: + %t85 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t86 = load { ptr, i64, i64 }, ptr %t85 + store { ptr, i64, i64 } %t86, ptr %a87 + call void @finch_str_copy(ptr %a88, ptr %a87) + %t89 = load { ptr, i64, i64 }, ptr %a88 + %t90 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t89, 0 + %t91 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t91, ptr %a92 + call void @finch.copy.S_ast_Type(ptr %a93, ptr %a92) + %t94 = load %S.ast.Type, ptr %a93 + %t95 = insertvalue %S.gen.Val %t90, %S.ast.Type %t94, 1 + %t96 = insertvalue %S.gen.Val %t95, i1 true, 3 + ret %S.gen.Val %t96 +endif2588: + %t97 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t98 = load %S.ast.Type, ptr %t97 + %t99 = load %S.ast.Type, ptr %a3 + %t100 = call i1 @finch.gen.widens(%S.ast.Type %t98, %S.ast.Type %t99) + br i1 %t100, label %then2589, label %endif2591 +then2589: + %t101 = load ptr, ptr %a1 + %t102 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t103 = load { ptr, i64, i64 }, ptr %t102 + %t104 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t105 = load %S.ast.Type, ptr %t104 + %t106 = load %S.ast.Type, ptr %a3 + %t107 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t101, { ptr, i64, i64 } %t103, %S.ast.Type %t105, %S.ast.Type %t106) + %t108 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t107, 0 + %t109 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t109, ptr %a110 + call void @finch.copy.S_ast_Type(ptr %a111, ptr %a110) + %t112 = load %S.ast.Type, ptr %a111 + %t113 = insertvalue %S.gen.Val %t108, %S.ast.Type %t112, 1 + ret %S.gen.Val %t113 +endif2591: + %t114 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 3 + %t115 = load i1, ptr %t114 + br i1 %t115, label %then2592, label %endif2594 +then2592: + %t116 = load ptr, ptr %a1 + %t117 = load %S.ast.Node, ptr %a4 + %t118 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t119 = load { ptr, i64, i64 }, ptr %t118 + store { ptr, i64, i64 } { ptr @.str.1682, i64 11, i64 0 }, ptr %a121 + store { ptr, i64, i64 } %t119, ptr %a122 + call void @finch_str_concat(ptr %a120, ptr %a121, ptr %a122) + %t123 = load { ptr, i64, i64 }, ptr %a120 + store { ptr, i64, i64 } %t123, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.1683, i64 16, i64 0 }, ptr %a126 + call void @finch_str_concat(ptr %a124, ptr %a125, ptr %a126) + %t127 = load { ptr, i64, i64 }, ptr %a124 + %t128 = load %S.ast.Type, ptr %a3 + %t129 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t128) + store { ptr, i64, i64 } %t127, ptr %a131 + store { ptr, i64, i64 } %t129, ptr %a132 + call void @finch_str_concat(ptr %a130, ptr %a131, ptr %a132) + %t133 = load { ptr, i64, i64 }, ptr %a130 + call void @finch.gen.fail(ptr %t116, %S.ast.Node %t117, { ptr, i64, i64 } %t133) + br label %endif2594 +endif2594: + br label %endif2581 +endif2581: + %t134 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t135 = load %S.ast.Type, ptr %t134 + %t136 = call i1 @finch.gen.isInt(%S.ast.Type %t135) + br label %logic.from2595 +logic.from2595: + br i1 %t136, label %logic.rhs2596, label %logic.end2597 +logic.rhs2596: + %t137 = load %S.ast.Type, ptr %a3 + %t138 = call i1 @finch.gen.isFloat(%S.ast.Type %t137) + br label %logic.rend2598 +logic.rend2598: + br label %logic.end2597 +logic.end2597: + %t139 = phi i1 [ false, %logic.from2595 ], [ %t138, %logic.rend2598 ] + br i1 %t139, label %then2599, label %endif2601 +then2599: + %t140 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 3 + %t141 = load i1, ptr %t140 + br label %logic.from2602 +logic.from2602: + br i1 %t141, label %logic.rhs2603, label %logic.end2604 +logic.rhs2603: + %t142 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t143 = load { ptr, i64, i64 }, ptr %t142 + store { ptr, i64, i64 } %t143, ptr %a144 + store { ptr, i64, i64 } { ptr @.str.1684, i64 5, i64 0 }, ptr %a145 + %t146 = call i32 @finch_str_eq(ptr %a144, ptr %a145) + %t147 = icmp ne i32 %t146, 0 + br label %logic.rend2605 +logic.rend2605: + br label %logic.end2604 +logic.end2604: + %t148 = phi i1 [ false, %logic.from2602 ], [ %t147, %logic.rend2605 ] + br i1 %t148, label %then2606, label %endif2608 +then2606: + %t149 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t150 = load { ptr, i64, i64 }, ptr %t149 + store { ptr, i64, i64 } %t150, ptr %a152 + store { ptr, i64, i64 } { ptr @.str.1685, i64 2, i64 0 }, ptr %a153 + call void @finch_str_concat(ptr %a151, ptr %a152, ptr %a153) + %t154 = load { ptr, i64, i64 }, ptr %a151 + %t155 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t154, 0 + %t156 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t156, ptr %a157 + call void @finch.copy.S_ast_Type(ptr %a158, ptr %a157) + %t159 = load %S.ast.Type, ptr %a158 + %t160 = insertvalue %S.gen.Val %t155, %S.ast.Type %t159, 1 + %t161 = insertvalue %S.gen.Val %t160, i1 true, 3 + ret %S.gen.Val %t161 +endif2608: + %t162 = load ptr, ptr %a1 + %t163 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t164 = load { ptr, i64, i64 }, ptr %t163 + %t165 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t166 = load %S.ast.Type, ptr %t165 + %t167 = load %S.ast.Type, ptr %a3 + %t168 = call { ptr, i64, i64 } @finch.gen.intToFloat(ptr %t162, { ptr, i64, i64 } %t164, %S.ast.Type %t166, %S.ast.Type %t167) + %t169 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t168, 0 + %t170 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t170, ptr %a171 + call void @finch.copy.S_ast_Type(ptr %a172, ptr %a171) + %t173 = load %S.ast.Type, ptr %a172 + %t174 = insertvalue %S.gen.Val %t169, %S.ast.Type %t173, 1 + ret %S.gen.Val %t174 +endif2601: + %t175 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t176 = getelementptr inbounds %S.ast.Type, ptr %t175, i32 0, i32 0 + %t177 = load { ptr, i64, i64 }, ptr %t176 + store { ptr, i64, i64 } %t177, ptr %a178 + store { ptr, i64, i64 } { ptr @.str.1686, i64 3, i64 0 }, ptr %a179 + %t180 = call i32 @finch_str_eq(ptr %a178, ptr %a179) + %t181 = icmp ne i32 %t180, 0 + br label %logic.from2609 +logic.from2609: + br i1 %t181, label %logic.rhs2610, label %logic.end2611 +logic.rhs2610: + %t182 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t183 = load { ptr, i64, i64 }, ptr %t182 + store { ptr, i64, i64 } %t183, ptr %a184 + store { ptr, i64, i64 } { ptr @.str.1687, i64 5, i64 0 }, ptr %a185 + %t186 = call i32 @finch_str_eq(ptr %a184, ptr %a185) + %t187 = icmp ne i32 %t186, 0 + br label %logic.rend2612 +logic.rend2612: + br label %logic.end2611 +logic.end2611: + %t188 = phi i1 [ false, %logic.from2609 ], [ %t187, %logic.rend2612 ] + br i1 %t188, label %then2613, label %endif2615 +then2613: + %t189 = load ptr, ptr %a1 + %t190 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t191 = load { ptr, i64, i64 }, ptr %t190 + %t192 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t193 = load %S.ast.Type, ptr %t192 + %t194 = load %S.ast.Type, ptr %a3 + %t195 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t189, { ptr, i64, i64 } %t191, %S.ast.Type %t193, %S.ast.Type %t194) + %t196 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t195, 0 + %t197 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t197, ptr %a198 + call void @finch.copy.S_ast_Type(ptr %a199, ptr %a198) + %t200 = load %S.ast.Type, ptr %a199 + %t201 = insertvalue %S.gen.Val %t196, %S.ast.Type %t200, 1 + ret %S.gen.Val %t201 +endif2615: + %t202 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t203 = getelementptr inbounds %S.ast.Type, ptr %t202, i32 0, i32 0 + %t204 = load { ptr, i64, i64 }, ptr %t203 + store { ptr, i64, i64 } %t204, ptr %a205 + store { ptr, i64, i64 } { ptr @.str.1688, i64 5, i64 0 }, ptr %a206 + %t207 = call i32 @finch_str_eq(ptr %a205, ptr %a206) + %t208 = icmp ne i32 %t207, 0 + br label %logic.from2616 +logic.from2616: + br i1 %t208, label %logic.rhs2617, label %logic.end2618 +logic.rhs2617: + %t209 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t210 = load { ptr, i64, i64 }, ptr %t209 + store { ptr, i64, i64 } %t210, ptr %a211 + store { ptr, i64, i64 } { ptr @.str.1689, i64 3, i64 0 }, ptr %a212 + %t213 = call i32 @finch_str_eq(ptr %a211, ptr %a212) + %t214 = icmp ne i32 %t213, 0 + br label %logic.rend2619 +logic.rend2619: + br label %logic.end2618 +logic.end2618: + %t215 = phi i1 [ false, %logic.from2616 ], [ %t214, %logic.rend2619 ] + br label %logic.from2620 +logic.from2620: + br i1 %t215, label %logic.rhs2621, label %logic.end2622 +logic.rhs2621: + %t216 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 3 + %t217 = load i1, ptr %t216 + br label %logic.rend2623 +logic.rend2623: + br label %logic.end2622 +logic.end2622: + %t218 = phi i1 [ false, %logic.from2620 ], [ %t217, %logic.rend2623 ] + br i1 %t218, label %then2624, label %endif2626 +then2624: + %t219 = load ptr, ptr %a1 + %t220 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 0 + %t221 = load { ptr, i64, i64 }, ptr %t220 + %t222 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t223 = load %S.ast.Type, ptr %t222 + %t224 = load %S.ast.Type, ptr %a3 + %t225 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t219, { ptr, i64, i64 } %t221, %S.ast.Type %t223, %S.ast.Type %t224) + %t226 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t225, 0 + %t227 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t227, ptr %a228 + call void @finch.copy.S_ast_Type(ptr %a229, ptr %a228) + %t230 = load %S.ast.Type, ptr %a229 + %t231 = insertvalue %S.gen.Val %t226, %S.ast.Type %t230, 1 + ret %S.gen.Val %t231 +endif2626: + %t232 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t232, ptr %a234 + store { ptr, i64, i64 } { ptr @.str.1690, i64 9, i64 0 }, ptr %a235 + call void @finch_str_concat(ptr %a233, ptr %a234, ptr %a235) + %t236 = load { ptr, i64, i64 }, ptr %a233 + %t237 = load %S.ast.Type, ptr %a3 + %t238 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t237) + store { ptr, i64, i64 } %t236, ptr %a240 + store { ptr, i64, i64 } %t238, ptr %a241 + call void @finch_str_concat(ptr %a239, ptr %a240, ptr %a241) + %t242 = load { ptr, i64, i64 }, ptr %a239 + store { ptr, i64, i64 } %t242, ptr %a244 + store { ptr, i64, i64 } { ptr @.str.1691, i64 14, i64 0 }, ptr %a245 + call void @finch_str_concat(ptr %a243, ptr %a244, ptr %a245) + %t246 = load { ptr, i64, i64 }, ptr %a243 + %t247 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t248 = load %S.ast.Type, ptr %t247 + %t249 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t248) + store { ptr, i64, i64 } %t246, ptr %a251 + store { ptr, i64, i64 } %t249, ptr %a252 + call void @finch_str_concat(ptr %a250, ptr %a251, ptr %a252) + %t253 = load { ptr, i64, i64 }, ptr %a250 + store { ptr, i64, i64 } %t253, ptr %a254 + %t255 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t256 = load %S.ast.Type, ptr %t255 + %t257 = call i1 @finch.gen.isNumber(%S.ast.Type %t256) + br label %logic.from2627 +logic.from2627: + br i1 %t257, label %logic.rhs2628, label %logic.end2629 +logic.rhs2628: + %t258 = load %S.ast.Type, ptr %a3 + %t259 = call i1 @finch.gen.isNumber(%S.ast.Type %t258) + br label %logic.rend2630 +logic.rend2630: + br label %logic.end2629 +logic.end2629: + %t260 = phi i1 [ false, %logic.from2627 ], [ %t259, %logic.rend2630 ] + br i1 %t260, label %then2631, label %endif2633 +then2631: + %t261 = load { ptr, i64, i64 }, ptr %a254 + store { ptr, i64, i64 } %t261, ptr %a263 + store { ptr, i64, i64 } { ptr @.str.1692, i64 6, i64 0 }, ptr %a264 + call void @finch_str_concat(ptr %a262, ptr %a263, ptr %a264) + %t265 = load { ptr, i64, i64 }, ptr %a262 + %t266 = load %S.ast.Type, ptr %a3 + %t267 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t266) + store { ptr, i64, i64 } %t265, ptr %a269 + store { ptr, i64, i64 } %t267, ptr %a270 + call void @finch_str_concat(ptr %a268, ptr %a269, ptr %a270) + %t271 = load { ptr, i64, i64 }, ptr %a268 + store { ptr, i64, i64 } %t271, ptr %a273 + store { ptr, i64, i64 } { ptr @.str.1693, i64 16, i64 0 }, ptr %a274 + call void @finch_str_concat(ptr %a272, ptr %a273, ptr %a274) + %t275 = load { ptr, i64, i64 }, ptr %a272 + store { ptr, i64, i64 } %t275, ptr %a254 + %t276 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t277 = load %S.ast.Type, ptr %t276 + %t278 = call i1 @finch.gen.isFloat(%S.ast.Type %t277) + br label %logic.from2634 +logic.from2634: + br i1 %t278, label %logic.rhs2635, label %logic.end2636 +logic.rhs2635: + %t279 = load %S.ast.Type, ptr %a3 + %t280 = call i1 @finch.gen.isInt(%S.ast.Type %t279) + br label %logic.rend2637 +logic.rend2637: + br label %logic.end2636 +logic.end2636: + %t281 = phi i1 [ false, %logic.from2634 ], [ %t280, %logic.rend2637 ] + br i1 %t281, label %then2638, label %endif2640 +then2638: + %t282 = load { ptr, i64, i64 }, ptr %a254 + store { ptr, i64, i64 } %t282, ptr %a284 + store { ptr, i64, i64 } { ptr @.str.1694, i64 26, i64 0 }, ptr %a285 + call void @finch_str_concat(ptr %a283, ptr %a284, ptr %a285) + %t286 = load { ptr, i64, i64 }, ptr %a283 + store { ptr, i64, i64 } %t286, ptr %a254 + br label %endif2640 +endif2640: + %t287 = load { ptr, i64, i64 }, ptr %a254 + store { ptr, i64, i64 } %t287, ptr %a289 + store { ptr, i64, i64 } { ptr @.str.1695, i64 1, i64 0 }, ptr %a290 + call void @finch_str_concat(ptr %a288, ptr %a289, ptr %a290) + %t291 = load { ptr, i64, i64 }, ptr %a288 + store { ptr, i64, i64 } %t291, ptr %a254 + br label %endif2633 +endif2633: + %t292 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t293 = load { ptr, i64, i64 }, ptr %t292 + store { ptr, i64, i64 } %t293, ptr %a294 + store { ptr, i64, i64 } { ptr @.str.1696, i64 3, i64 0 }, ptr %a295 + %t296 = call i32 @finch_str_eq(ptr %a294, ptr %a295) + %t297 = icmp ne i32 %t296, 0 + br label %logic.from2641 +logic.from2641: + br i1 %t297, label %logic.rhs2642, label %logic.end2643 +logic.rhs2642: + %t298 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t299 = load %S.ast.Type, ptr %t298 + %t300 = call i1 @finch.gen.isNumber(%S.ast.Type %t299) + br label %logic.from2644 +logic.from2644: + br i1 %t300, label %logic.end2646, label %logic.rhs2645 +logic.rhs2645: + %t301 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t302 = getelementptr inbounds %S.ast.Type, ptr %t301, i32 0, i32 0 + %t303 = load { ptr, i64, i64 }, ptr %t302 + store { ptr, i64, i64 } %t303, ptr %a304 + store { ptr, i64, i64 } { ptr @.str.1697, i64 4, i64 0 }, ptr %a305 + %t306 = call i32 @finch_str_eq(ptr %a304, ptr %a305) + %t307 = icmp ne i32 %t306, 0 + br label %logic.rend2647 +logic.rend2647: + br label %logic.end2646 +logic.end2646: + %t308 = phi i1 [ true, %logic.from2644 ], [ %t307, %logic.rend2647 ] + br label %logic.from2648 +logic.from2648: + br i1 %t308, label %logic.end2650, label %logic.rhs2649 +logic.rhs2649: + %t309 = getelementptr inbounds %S.gen.Val, ptr %a2, i32 0, i32 1 + %t310 = getelementptr inbounds %S.ast.Type, ptr %t309, i32 0, i32 0 + %t311 = load { ptr, i64, i64 }, ptr %t310 + store { ptr, i64, i64 } %t311, ptr %a312 + store { ptr, i64, i64 } { ptr @.str.1698, i64 4, i64 0 }, ptr %a313 + %t314 = call i32 @finch_str_eq(ptr %a312, ptr %a313) + %t315 = icmp ne i32 %t314, 0 + br label %logic.rend2651 +logic.rend2651: + br label %logic.end2650 +logic.end2650: + %t316 = phi i1 [ true, %logic.from2648 ], [ %t315, %logic.rend2651 ] + br label %logic.rend2652 +logic.rend2652: + br label %logic.end2643 +logic.end2643: + %t317 = phi i1 [ false, %logic.from2641 ], [ %t316, %logic.rend2652 ] + br i1 %t317, label %then2653, label %endif2655 +then2653: + %t318 = load { ptr, i64, i64 }, ptr %a254 + store { ptr, i64, i64 } %t318, ptr %a320 + store { ptr, i64, i64 } { ptr @.str.1699, i64 34, i64 0 }, ptr %a321 + call void @finch_str_concat(ptr %a319, ptr %a320, ptr %a321) + %t322 = load { ptr, i64, i64 }, ptr %a319 + store { ptr, i64, i64 } %t322, ptr %a254 + br label %endif2655 +endif2655: + %t323 = load ptr, ptr %a1 + %t324 = load %S.ast.Node, ptr %a4 + %t325 = load { ptr, i64, i64 }, ptr %a254 + call void @finch.gen.fail(ptr %t323, %S.ast.Node %t324, { ptr, i64, i64 } %t325) + %t326 = load %S.gen.Val, ptr %a2 + store %S.gen.Val %t326, ptr %a327 + call void @finch.copy.S_gen_Val(ptr %a328, ptr %a327) + %t329 = load %S.gen.Val, ptr %a328 + ret %S.gen.Val %t329 +} + +define internal i64 @finch.gen.lookup(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca i64, align 16 + %a19 = alloca i64, align 16 + %a32 = alloca i64, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic2656, label %ok2657 +panic2656: + call void @finch_panic(ptr @.str.1700, i64 1029, ptr @.str.1701) + unreachable +ok2657: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 10 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i32 0, i32 1 + %t7 = load i64, ptr %t6 + store i64 0, ptr %a8 + br label %for.cond2658 +for.cond2658: + %t9 = load i64, ptr %a8 + %t10 = icmp slt i64 %t9, %t7 + br i1 %t10, label %for.body2659, label %for.end2661 +for.body2659: + %t11 = load ptr, ptr %a1 + %t12 = icmp eq ptr %t11, null + br i1 %t12, label %panic2662, label %ok2663 +panic2662: + call void @finch_panic(ptr @.str.1702, i64 1030, ptr @.str.1703) + unreachable +ok2663: + %t13 = getelementptr inbounds %S.gen.Gen, ptr %t11, i32 0, i32 10 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i32 0, i32 1 + %t15 = load i64, ptr %t14 + %t16 = sub i64 %t15, 1 + %t17 = load i64, ptr %a8 + %t18 = sub i64 %t16, %t17 + store i64 %t18, ptr %a19 + %t20 = load ptr, ptr %a1 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic2664, label %ok2665 +panic2664: + call void @finch_panic(ptr @.str.1704, i64 1031, ptr @.str.1705) + unreachable +ok2665: + %t22 = getelementptr inbounds %S.gen.Gen, ptr %t20, i32 0, i32 10 + %t23 = load i64, ptr %a19 + %t24 = load { ptr, i64, i64 }, ptr %t22 + %t25 = extractvalue { ptr, i64, i64 } %t24, 1 + %t26 = icmp uge i64 %t23, %t25 + br i1 %t26, label %range2666, label %inrange2667 +range2666: + call void @finch_panic_index(ptr @.str.1706, i64 1031, i64 %t23, i64 %t25) + unreachable +inrange2667: + %t27 = extractvalue { ptr, i64, i64 } %t24, 0 + %t28 = getelementptr inbounds %S.gen.Scope, ptr %t27, i64 %t23 + %t29 = getelementptr inbounds %S.gen.Scope, ptr %t28, i32 0, i32 0 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i32 0, i32 1 + %t31 = load i64, ptr %t30 + store i64 0, ptr %a32 + br label %for.cond2668 +for.cond2668: + %t33 = load i64, ptr %a32 + %t34 = icmp slt i64 %t33, %t31 + br i1 %t34, label %for.body2669, label %for.end2671 +for.body2669: + %t35 = load ptr, ptr %a1 + %t36 = icmp eq ptr %t35, null + br i1 %t36, label %panic2672, label %ok2673 +panic2672: + call void @finch_panic(ptr @.str.1707, i64 1032, ptr @.str.1708) + unreachable +ok2673: + %t37 = getelementptr inbounds %S.gen.Gen, ptr %t35, i32 0, i32 10 + %t38 = load i64, ptr %a19 + %t39 = load { ptr, i64, i64 }, ptr %t37 + %t40 = extractvalue { ptr, i64, i64 } %t39, 1 + %t41 = icmp uge i64 %t38, %t40 + br i1 %t41, label %range2674, label %inrange2675 +range2674: + call void @finch_panic_index(ptr @.str.1709, i64 1032, i64 %t38, i64 %t40) + unreachable +inrange2675: + %t42 = extractvalue { ptr, i64, i64 } %t39, 0 + %t43 = getelementptr inbounds %S.gen.Scope, ptr %t42, i64 %t38 + %t44 = getelementptr inbounds %S.gen.Scope, ptr %t43, i32 0, i32 0 + %t45 = load i64, ptr %a32 + %t46 = load { ptr, i64, i64 }, ptr %t44 + %t47 = extractvalue { ptr, i64, i64 } %t46, 1 + %t48 = icmp uge i64 %t45, %t47 + br i1 %t48, label %range2676, label %inrange2677 +range2676: + call void @finch_panic_index(ptr @.str.1710, i64 1032, i64 %t45, i64 %t47) + unreachable +inrange2677: + %t49 = extractvalue { ptr, i64, i64 } %t46, 0 + %t50 = getelementptr inbounds %S.gen.Var, ptr %t49, i64 %t45 + %t51 = getelementptr inbounds %S.gen.Var, ptr %t50, i32 0, i32 0 + %t52 = load { ptr, i64, i64 }, ptr %t51 + %t53 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t52, ptr %a54 + store { ptr, i64, i64 } %t53, ptr %a55 + %t56 = call i32 @finch_str_eq(ptr %a54, ptr %a55) + %t57 = icmp ne i32 %t56, 0 + br i1 %t57, label %then2678, label %endif2680 +then2678: + %t58 = load ptr, ptr %a1 + %t59 = icmp eq ptr %t58, null + br i1 %t59, label %panic2681, label %ok2682 +panic2681: + call void @finch_panic(ptr @.str.1711, i64 1033, ptr @.str.1712) + unreachable +ok2682: + %t60 = getelementptr inbounds %S.gen.Gen, ptr %t58, i32 0, i32 40 + %t61 = load i1, ptr %t60 + br label %logic.from2683 +logic.from2683: + br i1 %t61, label %logic.rhs2684, label %logic.end2685 +logic.rhs2684: + %t62 = load ptr, ptr %a1 + %t63 = icmp eq ptr %t62, null + br i1 %t63, label %panic2686, label %ok2687 +panic2686: + call void @finch_panic(ptr @.str.1713, i64 1033, ptr @.str.1714) + unreachable +ok2687: + %t64 = getelementptr inbounds %S.gen.Gen, ptr %t62, i32 0, i32 10 + %t65 = load i64, ptr %a19 + %t66 = load { ptr, i64, i64 }, ptr %t64 + %t67 = extractvalue { ptr, i64, i64 } %t66, 1 + %t68 = icmp uge i64 %t65, %t67 + br i1 %t68, label %range2688, label %inrange2689 +range2688: + call void @finch_panic_index(ptr @.str.1715, i64 1033, i64 %t65, i64 %t67) + unreachable +inrange2689: + %t69 = extractvalue { ptr, i64, i64 } %t66, 0 + %t70 = getelementptr inbounds %S.gen.Scope, ptr %t69, i64 %t65 + %t71 = getelementptr inbounds %S.gen.Scope, ptr %t70, i32 0, i32 0 + %t72 = load i64, ptr %a32 + %t73 = load { ptr, i64, i64 }, ptr %t71 + %t74 = extractvalue { ptr, i64, i64 } %t73, 1 + %t75 = icmp uge i64 %t72, %t74 + br i1 %t75, label %range2690, label %inrange2691 +range2690: + call void @finch_panic_index(ptr @.str.1716, i64 1033, i64 %t72, i64 %t74) + unreachable +inrange2691: + %t76 = extractvalue { ptr, i64, i64 } %t73, 0 + %t77 = getelementptr inbounds %S.gen.Var, ptr %t76, i64 %t72 + %t78 = getelementptr inbounds %S.gen.Var, ptr %t77, i32 0, i32 4 + %t79 = load i64, ptr %t78 + %t80 = load ptr, ptr %a1 + %t81 = icmp eq ptr %t80, null + br i1 %t81, label %panic2692, label %ok2693 +panic2692: + call void @finch_panic(ptr @.str.1717, i64 1033, ptr @.str.1718) + unreachable +ok2693: + %t82 = getelementptr inbounds %S.gen.Gen, ptr %t80, i32 0, i32 41 + %t83 = load i64, ptr %t82 + %t84 = icmp sge i64 %t79, %t83 + br label %logic.rend2694 +logic.rend2694: + br label %logic.end2685 +logic.end2685: + %t85 = phi i1 [ false, %logic.from2683 ], [ %t84, %logic.rend2694 ] + br i1 %t85, label %then2695, label %endif2697 +then2695: + br label %for.step2670 +endif2697: + %t86 = load i64, ptr %a19 + %t87 = mul i64 %t86, 100000 + %t88 = load i64, ptr %a32 + %t89 = add i64 %t87, %t88 + ret i64 %t89 +endif2680: + br label %for.step2670 +for.step2670: + %t90 = load i64, ptr %a32 + %t91 = add i64 %t90, 1 + store i64 %t91, ptr %a32 + br label %for.cond2668 +for.end2671: + br label %for.step2660 +for.step2660: + %t92 = load i64, ptr %a8 + %t93 = add i64 %t92, 1 + store i64 %t93, ptr %a8 + br label %for.cond2658 +for.end2661: + ret i64 -1 +} + +define internal void @finch.copy.S_gen_Var(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Var, ptr %src + store %S.gen.Var %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Var, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Var, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Var, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Var, ptr %src, i32 0, i32 1 + call void @finch.copy.S_ast_Type(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.Var, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.Var, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + ret void +} + +define internal %S.gen.Var @finch.gen.varAt(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a22 = alloca %S.gen.Var, align 16 + %a23 = alloca %S.gen.Var, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic2698, label %ok2699 +panic2698: + call void @finch_panic(ptr @.str.1719, i64 1044, ptr @.str.1720) + unreachable +ok2699: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 10 + %t6 = load i64, ptr %a2 + %t7 = sdiv i64 %t6, 100000 + %t8 = load { ptr, i64, i64 }, ptr %t5 + %t9 = extractvalue { ptr, i64, i64 } %t8, 1 + %t10 = icmp uge i64 %t7, %t9 + br i1 %t10, label %range2700, label %inrange2701 +range2700: + call void @finch_panic_index(ptr @.str.1721, i64 1044, i64 %t7, i64 %t9) + unreachable +inrange2701: + %t11 = extractvalue { ptr, i64, i64 } %t8, 0 + %t12 = getelementptr inbounds %S.gen.Scope, ptr %t11, i64 %t7 + %t13 = getelementptr inbounds %S.gen.Scope, ptr %t12, i32 0, i32 0 + %t14 = load i64, ptr %a2 + %t15 = srem i64 %t14, 100000 + %t16 = load { ptr, i64, i64 }, ptr %t13 + %t17 = extractvalue { ptr, i64, i64 } %t16, 1 + %t18 = icmp uge i64 %t15, %t17 + br i1 %t18, label %range2702, label %inrange2703 +range2702: + call void @finch_panic_index(ptr @.str.1722, i64 1044, i64 %t15, i64 %t17) + unreachable +inrange2703: + %t19 = extractvalue { ptr, i64, i64 } %t16, 0 + %t20 = getelementptr inbounds %S.gen.Var, ptr %t19, i64 %t15 + %t21 = load %S.gen.Var, ptr %t20 + store %S.gen.Var %t21, ptr %a22 + call void @finch.copy.S_gen_Var(ptr %a23, ptr %a22) + %t24 = load %S.gen.Var, ptr %a23 + ret %S.gen.Var %t24 +} + +define internal i64 @finch.gen.findFn(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca i64, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic2704, label %ok2705 +panic2704: + call void @finch_panic(ptr @.str.1723, i64 1048, ptr @.str.1724) + unreachable +ok2705: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 14 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t6, i32 0, i32 1 + %t8 = load i64, ptr %t7 + store i64 0, ptr %a9 + br label %for.cond2706 +for.cond2706: + %t10 = load i64, ptr %a9 + %t11 = icmp slt i64 %t10, %t8 + br i1 %t11, label %for.body2707, label %for.end2709 +for.body2707: + %t12 = load ptr, ptr %a1 + %t13 = icmp eq ptr %t12, null + br i1 %t13, label %panic2710, label %ok2711 +panic2710: + call void @finch_panic(ptr @.str.1725, i64 1049, ptr @.str.1726) + unreachable +ok2711: + %t14 = getelementptr inbounds %S.gen.Gen, ptr %t12, i32 0, i32 14 + %t15 = load i64, ptr %a9 + %t16 = load { ptr, i64, i64 }, ptr %t14 + %t17 = extractvalue { ptr, i64, i64 } %t16, 1 + %t18 = icmp uge i64 %t15, %t17 + br i1 %t18, label %range2712, label %inrange2713 +range2712: + call void @finch_panic_index(ptr @.str.1727, i64 1049, i64 %t15, i64 %t17) + unreachable +inrange2713: + %t19 = extractvalue { ptr, i64, i64 } %t16, 0 + %t20 = getelementptr inbounds %S.gen.FnSig, ptr %t19, i64 %t15 + %t21 = getelementptr inbounds %S.gen.FnSig, ptr %t20, i32 0, i32 0 + %t22 = load { ptr, i64, i64 }, ptr %t21 + %t23 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t22, ptr %a24 + store { ptr, i64, i64 } %t23, ptr %a25 + %t26 = call i32 @finch_str_eq(ptr %a24, ptr %a25) + %t27 = icmp ne i32 %t26, 0 + br label %logic.from2714 +logic.from2714: + br i1 %t27, label %logic.rhs2715, label %logic.end2716 +logic.rhs2715: + %t28 = load ptr, ptr %a1 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic2717, label %ok2718 +panic2717: + call void @finch_panic(ptr @.str.1728, i64 1049, ptr @.str.1729) + unreachable +ok2718: + %t30 = getelementptr inbounds %S.gen.Gen, ptr %t28, i32 0, i32 14 + %t31 = load i64, ptr %a9 + %t32 = load { ptr, i64, i64 }, ptr %t30 + %t33 = extractvalue { ptr, i64, i64 } %t32, 1 + %t34 = icmp uge i64 %t31, %t33 + br i1 %t34, label %range2719, label %inrange2720 +range2719: + call void @finch_panic_index(ptr @.str.1730, i64 1049, i64 %t31, i64 %t33) + unreachable +inrange2720: + %t35 = extractvalue { ptr, i64, i64 } %t32, 0 + %t36 = getelementptr inbounds %S.gen.FnSig, ptr %t35, i64 %t31 + %t37 = getelementptr inbounds %S.gen.FnSig, ptr %t36, i32 0, i32 1 + %t38 = load { ptr, i64, i64 }, ptr %t37 + %t39 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t38, ptr %a40 + store { ptr, i64, i64 } %t39, ptr %a41 + %t42 = call i32 @finch_str_eq(ptr %a40, ptr %a41) + %t43 = icmp ne i32 %t42, 0 + br label %logic.rend2721 +logic.rend2721: + br label %logic.end2716 +logic.end2716: + %t44 = phi i1 [ false, %logic.from2714 ], [ %t43, %logic.rend2721 ] + br label %logic.from2722 +logic.from2722: + br i1 %t44, label %logic.rhs2723, label %logic.end2724 +logic.rhs2723: + %t45 = load ptr, ptr %a1 + %t46 = icmp eq ptr %t45, null + br i1 %t46, label %panic2725, label %ok2726 +panic2725: + call void @finch_panic(ptr @.str.1731, i64 1049, ptr @.str.1732) + unreachable +ok2726: + %t47 = getelementptr inbounds %S.gen.Gen, ptr %t45, i32 0, i32 14 + %t48 = load i64, ptr %a9 + %t49 = load { ptr, i64, i64 }, ptr %t47 + %t50 = extractvalue { ptr, i64, i64 } %t49, 1 + %t51 = icmp uge i64 %t48, %t50 + br i1 %t51, label %range2727, label %inrange2728 +range2727: + call void @finch_panic_index(ptr @.str.1733, i64 1049, i64 %t48, i64 %t50) + unreachable +inrange2728: + %t52 = extractvalue { ptr, i64, i64 } %t49, 0 + %t53 = getelementptr inbounds %S.gen.FnSig, ptr %t52, i64 %t48 + %t54 = getelementptr inbounds %S.gen.FnSig, ptr %t53, i32 0, i32 2 + %t55 = getelementptr inbounds { ptr, i64, i64 }, ptr %t54, i32 0, i32 1 + %t56 = load i64, ptr %t55 + %t57 = icmp eq i64 %t56, 0 + br label %logic.rend2729 +logic.rend2729: + br label %logic.end2724 +logic.end2724: + %t58 = phi i1 [ false, %logic.from2722 ], [ %t57, %logic.rend2729 ] + br i1 %t58, label %then2730, label %endif2732 +then2730: + %t59 = load i64, ptr %a9 + ret i64 %t59 +endif2732: + br label %for.step2708 +for.step2708: + %t60 = load i64, ptr %a9 + %t61 = add i64 %t60, 1 + store i64 %t61, ptr %a9 + br label %for.cond2706 +for.end2709: + ret i64 -1 +} + +define internal i64 @finch.gen.findMethod(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, { ptr, i64, i64 } %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca i64, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic2733, label %ok2734 +panic2733: + call void @finch_panic(ptr @.str.1734, i64 1057, ptr @.str.1735) + unreachable +ok2734: + %t7 = getelementptr inbounds %S.gen.Gen, ptr %t5, i32 0, i32 14 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t7, i32 0, i32 1 + %t9 = load i64, ptr %t8 + store i64 0, ptr %a10 + br label %for.cond2735 +for.cond2735: + %t11 = load i64, ptr %a10 + %t12 = icmp slt i64 %t11, %t9 + br i1 %t12, label %for.body2736, label %for.end2738 +for.body2736: + %t13 = load ptr, ptr %a1 + %t14 = icmp eq ptr %t13, null + br i1 %t14, label %panic2739, label %ok2740 +panic2739: + call void @finch_panic(ptr @.str.1736, i64 1058, ptr @.str.1737) + unreachable +ok2740: + %t15 = getelementptr inbounds %S.gen.Gen, ptr %t13, i32 0, i32 14 + %t16 = load i64, ptr %a10 + %t17 = load { ptr, i64, i64 }, ptr %t15 + %t18 = extractvalue { ptr, i64, i64 } %t17, 1 + %t19 = icmp uge i64 %t16, %t18 + br i1 %t19, label %range2741, label %inrange2742 +range2741: + call void @finch_panic_index(ptr @.str.1738, i64 1058, i64 %t16, i64 %t18) + unreachable +inrange2742: + %t20 = extractvalue { ptr, i64, i64 } %t17, 0 + %t21 = getelementptr inbounds %S.gen.FnSig, ptr %t20, i64 %t16 + %t22 = getelementptr inbounds %S.gen.FnSig, ptr %t21, i32 0, i32 3 + %t23 = load { ptr, i64, i64 }, ptr %t22 + %t24 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t23, ptr %a25 + store { ptr, i64, i64 } %t24, ptr %a26 + %t27 = call i32 @finch_str_eq(ptr %a25, ptr %a26) + %t28 = icmp ne i32 %t27, 0 + br label %logic.from2743 +logic.from2743: + br i1 %t28, label %logic.rhs2744, label %logic.end2745 +logic.rhs2744: + %t29 = load ptr, ptr %a1 + %t30 = icmp eq ptr %t29, null + br i1 %t30, label %panic2746, label %ok2747 +panic2746: + call void @finch_panic(ptr @.str.1739, i64 1058, ptr @.str.1740) + unreachable +ok2747: + %t31 = getelementptr inbounds %S.gen.Gen, ptr %t29, i32 0, i32 14 + %t32 = load i64, ptr %a10 + %t33 = load { ptr, i64, i64 }, ptr %t31 + %t34 = extractvalue { ptr, i64, i64 } %t33, 1 + %t35 = icmp uge i64 %t32, %t34 + br i1 %t35, label %range2748, label %inrange2749 +range2748: + call void @finch_panic_index(ptr @.str.1741, i64 1058, i64 %t32, i64 %t34) + unreachable +inrange2749: + %t36 = extractvalue { ptr, i64, i64 } %t33, 0 + %t37 = getelementptr inbounds %S.gen.FnSig, ptr %t36, i64 %t32 + %t38 = getelementptr inbounds %S.gen.FnSig, ptr %t37, i32 0, i32 2 + %t39 = load { ptr, i64, i64 }, ptr %t38 + %t40 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t39, ptr %a41 + store { ptr, i64, i64 } %t40, ptr %a42 + %t43 = call i32 @finch_str_eq(ptr %a41, ptr %a42) + %t44 = icmp ne i32 %t43, 0 + br label %logic.rend2750 +logic.rend2750: + br label %logic.end2745 +logic.end2745: + %t45 = phi i1 [ false, %logic.from2743 ], [ %t44, %logic.rend2750 ] + br label %logic.from2751 +logic.from2751: + br i1 %t45, label %logic.rhs2752, label %logic.end2753 +logic.rhs2752: + %t46 = load ptr, ptr %a1 + %t47 = icmp eq ptr %t46, null + br i1 %t47, label %panic2754, label %ok2755 +panic2754: + call void @finch_panic(ptr @.str.1742, i64 1058, ptr @.str.1743) + unreachable +ok2755: + %t48 = getelementptr inbounds %S.gen.Gen, ptr %t46, i32 0, i32 14 + %t49 = load i64, ptr %a10 + %t50 = load { ptr, i64, i64 }, ptr %t48 + %t51 = extractvalue { ptr, i64, i64 } %t50, 1 + %t52 = icmp uge i64 %t49, %t51 + br i1 %t52, label %range2756, label %inrange2757 +range2756: + call void @finch_panic_index(ptr @.str.1744, i64 1058, i64 %t49, i64 %t51) + unreachable +inrange2757: + %t53 = extractvalue { ptr, i64, i64 } %t50, 0 + %t54 = getelementptr inbounds %S.gen.FnSig, ptr %t53, i64 %t49 + %t55 = getelementptr inbounds %S.gen.FnSig, ptr %t54, i32 0, i32 1 + %t56 = load { ptr, i64, i64 }, ptr %t55 + %t57 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t56, ptr %a58 + store { ptr, i64, i64 } %t57, ptr %a59 + %t60 = call i32 @finch_str_eq(ptr %a58, ptr %a59) + %t61 = icmp ne i32 %t60, 0 + br label %logic.rend2758 +logic.rend2758: + br label %logic.end2753 +logic.end2753: + %t62 = phi i1 [ false, %logic.from2751 ], [ %t61, %logic.rend2758 ] + br i1 %t62, label %then2759, label %endif2761 +then2759: + %t63 = load i64, ptr %a10 + ret i64 %t63 +endif2761: + br label %for.step2737 +for.step2737: + %t64 = load i64, ptr %a10 + %t65 = add i64 %t64, 1 + store i64 %t65, ptr %a10 + br label %for.cond2735 +for.end2738: + ret i64 -1 +} + +define internal i1 @finch.gen.isBuiltin({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca i64, align 16 + %a41 = alloca i64, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = mul i64 28, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t3 = call ptr @finch_alloc(i64 %t2) + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 0 + store { ptr, i64, i64 } { ptr @.str.1745, i64 5, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 1 + store { ptr, i64, i64 } { ptr @.str.1746, i64 4, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 2 + store { ptr, i64, i64 } { ptr @.str.1747, i64 3, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 3 + store { ptr, i64, i64 } { ptr @.str.1748, i64 3, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 4 + store { ptr, i64, i64 } { ptr @.str.1749, i64 4, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 5 + store { ptr, i64, i64 } { ptr @.str.1750, i64 5, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 6 + store { ptr, i64, i64 } { ptr @.str.1751, i64 4, i64 0 }, ptr %t10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 7 + store { ptr, i64, i64 } { ptr @.str.1752, i64 9, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 8 + store { ptr, i64, i64 } { ptr @.str.1753, i64 10, i64 0 }, ptr %t12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 9 + store { ptr, i64, i64 } { ptr @.str.1754, i64 11, i64 0 }, ptr %t13 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 10 + store { ptr, i64, i64 } { ptr @.str.1755, i64 5, i64 0 }, ptr %t14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 11 + store { ptr, i64, i64 } { ptr @.str.1756, i64 4, i64 0 }, ptr %t15 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 12 + store { ptr, i64, i64 } { ptr @.str.1757, i64 5, i64 0 }, ptr %t16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 13 + store { ptr, i64, i64 } { ptr @.str.1758, i64 3, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 14 + store { ptr, i64, i64 } { ptr @.str.1759, i64 4, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 15 + store { ptr, i64, i64 } { ptr @.str.1760, i64 3, i64 0 }, ptr %t19 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 16 + store { ptr, i64, i64 } { ptr @.str.1761, i64 11, i64 0 }, ptr %t20 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 17 + store { ptr, i64, i64 } { ptr @.str.1762, i64 2, i64 0 }, ptr %t21 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 18 + store { ptr, i64, i64 } { ptr @.str.1763, i64 3, i64 0 }, ptr %t22 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 19 + store { ptr, i64, i64 } { ptr @.str.1764, i64 3, i64 0 }, ptr %t23 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 20 + store { ptr, i64, i64 } { ptr @.str.1765, i64 3, i64 0 }, ptr %t24 + %t25 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 21 + store { ptr, i64, i64 } { ptr @.str.1766, i64 2, i64 0 }, ptr %t25 + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 22 + store { ptr, i64, i64 } { ptr @.str.1767, i64 3, i64 0 }, ptr %t26 + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 23 + store { ptr, i64, i64 } { ptr @.str.1768, i64 3, i64 0 }, ptr %t27 + %t28 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 24 + store { ptr, i64, i64 } { ptr @.str.1769, i64 3, i64 0 }, ptr %t28 + %t29 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 25 + store { ptr, i64, i64 } { ptr @.str.1770, i64 3, i64 0 }, ptr %t29 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 26 + store { ptr, i64, i64 } { ptr @.str.1771, i64 3, i64 0 }, ptr %t30 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 27 + store { ptr, i64, i64 } { ptr @.str.1772, i64 5, i64 0 }, ptr %t31 + %t32 = insertvalue { ptr, i64, i64 } undef, ptr %t3, 0 + %t33 = insertvalue { ptr, i64, i64 } %t32, i64 28, 1 + %t34 = insertvalue { ptr, i64, i64 } %t33, i64 28, 2 + store { ptr, i64, i64 } %t34, ptr %a35 + %t36 = getelementptr inbounds { ptr, i64, i64 }, ptr %a35, i32 0, i32 1 + %t37 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a38 + %t39 = load i64, ptr %t36 + %t40 = load ptr, ptr %a35 + store i64 0, ptr %a41 + br label %find.cond2762 +find.cond2762: + %t42 = load i64, ptr %a41 + %t43 = icmp slt i64 %t42, %t39 + br i1 %t43, label %find.body2763, label %find.end2766 +find.body2763: + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t40, i64 %t42 + %t45 = load { ptr, i64, i64 }, ptr %t44 + store { ptr, i64, i64 } %t45, ptr %a46 + store { ptr, i64, i64 } %t37, ptr %a47 + %t48 = call i32 @finch_str_eq(ptr %a46, ptr %a47) + %t49 = icmp ne i32 %t48, 0 + br i1 %t49, label %find.hit2764, label %find.next2765 +find.hit2764: + store i64 %t42, ptr %a38 + br label %find.end2766 +find.next2765: + %t50 = add i64 %t42, 1 + store i64 %t50, ptr %a41 + br label %find.cond2762 +find.end2766: + %t51 = load i64, ptr %a38 + %t52 = icmp sge i64 %t51, 0 + ret i1 %t52 +} + +define internal { ptr, i64, i64 } @finch.gen.addVar(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3, { ptr, i64, i64 } %p4, i1 %p5) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca i1, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca %S.ast.Type, align 16 + %a95 = alloca %S.ast.Type, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + store i1 %p5, ptr %a6 + %t7 = load ptr, ptr %a1 + %t8 = load { ptr, i64, i64 }, ptr %a3 + %t9 = call i64 @finch.gen.lookup(ptr %t7, { ptr, i64, i64 } %t8) + %t10 = icmp sge i64 %t9, 0 + br label %logic.from2767 +logic.from2767: + br i1 %t10, label %logic.rhs2768, label %logic.end2769 +logic.rhs2768: + %t11 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t11, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.1773, i64 3, i64 0 }, ptr %a13 + %t14 = call i32 @finch_str_eq(ptr %a12, ptr %a13) + %t15 = icmp eq i32 %t14, 0 + br label %logic.rend2770 +logic.rend2770: + br label %logic.end2769 +logic.end2769: + %t16 = phi i1 [ false, %logic.from2767 ], [ %t15, %logic.rend2770 ] + br i1 %t16, label %then2771, label %endif2773 +then2771: + %t17 = load ptr, ptr %a1 + %t18 = load %S.ast.Node, ptr %a2 + %t19 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.1774, i64 18, i64 0 }, ptr %a21 + store { ptr, i64, i64 } %t19, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t23, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.1775, i64 21, i64 0 }, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + call void @finch.gen.fail(ptr %t17, %S.ast.Node %t18, { ptr, i64, i64 } %t27) + br label %endif2773 +endif2773: + %t28 = load ptr, ptr %a1 + %t29 = load ptr, ptr %a1 + %t30 = icmp eq ptr %t29, null + br i1 %t30, label %panic2774, label %ok2775 +panic2774: + call void @finch_panic(ptr @.str.1776, i64 1076, ptr @.str.1777) + unreachable +ok2775: + %t31 = getelementptr inbounds %S.gen.Gen, ptr %t29, i32 0, i32 13 + %t32 = load { ptr, i64, i64 }, ptr %t31 + %t33 = load { ptr, i64, i64 }, ptr %a3 + %t34 = call i64 @finch.gen.findFn(ptr %t28, { ptr, i64, i64 } %t32, { ptr, i64, i64 } %t33) + %t35 = icmp sge i64 %t34, 0 + br i1 %t35, label %then2776, label %endif2778 +then2776: + %t36 = load ptr, ptr %a1 + %t37 = load %S.ast.Node, ptr %a2 + %t38 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.1778, i64 1, i64 0 }, ptr %a40 + store { ptr, i64, i64 } %t38, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + store { ptr, i64, i64 } %t42, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.1779, i64 35, i64 0 }, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + call void @finch.gen.fail(ptr %t36, %S.ast.Node %t37, { ptr, i64, i64 } %t46) + br label %endif2778 +endif2778: + %t47 = load { ptr, i64, i64 }, ptr %a3 + %t48 = call i1 @finch.gen.isBuiltin({ ptr, i64, i64 } %t47) + br i1 %t48, label %then2779, label %endif2781 +then2779: + %t49 = load ptr, ptr %a1 + %t50 = load %S.ast.Node, ptr %a2 + %t51 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.1780, i64 1, i64 0 }, ptr %a53 + store { ptr, i64, i64 } %t51, ptr %a54 + call void @finch_str_concat(ptr %a52, ptr %a53, ptr %a54) + %t55 = load { ptr, i64, i64 }, ptr %a52 + store { ptr, i64, i64 } %t55, ptr %a57 + store { ptr, i64, i64 } { ptr @.str.1781, i64 38, i64 0 }, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + call void @finch.gen.fail(ptr %t49, %S.ast.Node %t50, { ptr, i64, i64 } %t59) + br label %endif2781 +endif2781: + %t60 = load ptr, ptr %a1 + %t61 = load ptr, ptr %a1 + %t62 = load %S.ast.Type, ptr %a4 + %t63 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t61, %S.ast.Type %t62) + %t64 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t60, { ptr, i64, i64 } %t63) + store { ptr, i64, i64 } %t64, ptr %a65 + %t66 = load ptr, ptr %a1 + %t67 = load ptr, ptr %a1 + %t68 = load %S.ast.Type, ptr %a4 + %t69 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t67, %S.ast.Type %t68) + %t70 = load { ptr, i64, i64 }, ptr %a5 + %t71 = load { ptr, i64, i64 }, ptr %a65 + call void @finch.gen.store(ptr %t66, { ptr, i64, i64 } %t69, { ptr, i64, i64 } %t70, { ptr, i64, i64 } %t71) + %t72 = load ptr, ptr %a1 + %t73 = icmp eq ptr %t72, null + br i1 %t73, label %panic2782, label %ok2783 +panic2782: + call void @finch_panic(ptr @.str.1782, i64 1084, ptr @.str.1783) + unreachable +ok2783: + %t74 = getelementptr inbounds %S.gen.Gen, ptr %t72, i32 0, i32 10 + %t75 = load ptr, ptr %a1 + %t76 = icmp eq ptr %t75, null + br i1 %t76, label %panic2784, label %ok2785 +panic2784: + call void @finch_panic(ptr @.str.1784, i64 1084, ptr @.str.1785) + unreachable +ok2785: + %t77 = getelementptr inbounds %S.gen.Gen, ptr %t75, i32 0, i32 10 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %t77, i32 0, i32 1 + %t79 = load i64, ptr %t78 + %t80 = sub i64 %t79, 1 + %t81 = load { ptr, i64, i64 }, ptr %t74 + %t82 = extractvalue { ptr, i64, i64 } %t81, 1 + %t83 = icmp uge i64 %t80, %t82 + br i1 %t83, label %range2786, label %inrange2787 +range2786: + call void @finch_panic_index(ptr @.str.1786, i64 1084, i64 %t80, i64 %t82) + unreachable +inrange2787: + %t84 = extractvalue { ptr, i64, i64 } %t81, 0 + %t85 = getelementptr inbounds %S.gen.Scope, ptr %t84, i64 %t80 + %t86 = getelementptr inbounds %S.gen.Scope, ptr %t85, i32 0, i32 0 + %t87 = getelementptr inbounds { ptr, i64, i64 }, ptr %t86, i32 0, i32 1 + %t88 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t88, ptr %a89 + call void @finch_str_copy(ptr %a90, ptr %a89) + %t91 = load { ptr, i64, i64 }, ptr %a90 + %t92 = insertvalue %S.gen.Var zeroinitializer, { ptr, i64, i64 } %t91, 0 + %t93 = load %S.ast.Type, ptr %a4 + store %S.ast.Type %t93, ptr %a94 + call void @finch.copy.S_ast_Type(ptr %a95, ptr %a94) + %t96 = load %S.ast.Type, ptr %a95 + %t97 = insertvalue %S.gen.Var %t92, %S.ast.Type %t96, 1 + %t98 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t98, ptr %a99 + call void @finch_str_copy(ptr %a100, ptr %a99) + %t101 = load { ptr, i64, i64 }, ptr %a100 + %t102 = insertvalue %S.gen.Var %t97, { ptr, i64, i64 } %t101, 2 + %t103 = load i1, ptr %a6 + %t104 = insertvalue %S.gen.Var %t102, i1 %t103, 3 + %t105 = load ptr, ptr %a1 + %t106 = icmp eq ptr %t105, null + br i1 %t106, label %panic2788, label %ok2789 +panic2788: + call void @finch_panic(ptr @.str.1787, i64 1084, ptr @.str.1788) + unreachable +ok2789: + %t107 = getelementptr inbounds %S.gen.Gen, ptr %t105, i32 0, i32 23 + %t108 = load i64, ptr %t107 + %t109 = insertvalue %S.gen.Var %t104, i64 %t108, 4 + %t110 = load i64, ptr %t87 + %t111 = add i64 %t110, 1 + call void @finch_arr_reserve(ptr %t86, i64 %t111, i64 ptrtoint (ptr getelementptr (%S.gen.Var, ptr null, i32 1) to i64)) + %t112 = load ptr, ptr %t86 + %t113 = getelementptr inbounds %S.gen.Var, ptr %t112, i64 %t110 + store %S.gen.Var %t109, ptr %t113 + store i64 %t111, ptr %t87 + %t114 = load ptr, ptr %a1 + %t115 = icmp eq ptr %t114, null + br i1 %t115, label %panic2790, label %ok2791 +panic2790: + call void @finch_panic(ptr @.str.1789, i64 1085, ptr @.str.1790) + unreachable +ok2791: + %t116 = getelementptr inbounds %S.gen.Gen, ptr %t114, i32 0, i32 23 + %t117 = load i64, ptr %t116 + %t118 = add i64 %t117, 1 + store i64 %t118, ptr %t116 + %t119 = load ptr, ptr %a1 + %t120 = load %S.ast.Node, ptr %a2 + %t121 = load { ptr, i64, i64 }, ptr %a3 + %t122 = load %S.ast.Type, ptr %a4 + %t123 = load { ptr, i64, i64 }, ptr %a65 + call void @finch.gen.dbgVariable(ptr %t119, %S.ast.Node %t120, { ptr, i64, i64 } %t121, %S.ast.Type %t122, { ptr, i64, i64 } %t123) + %t124 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t124, ptr %a125 + call void @finch_str_copy(ptr %a126, ptr %a125) + %t127 = load { ptr, i64, i64 }, ptr %a126 + ret { ptr, i64, i64 } %t127 +} + +define internal void @finch.gen.pushScope(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic2792, label %ok2793 +panic2792: + call void @finch_panic(ptr @.str.1791, i64 1091, ptr @.str.1792) + unreachable +ok2793: + %t4 = getelementptr inbounds %S.gen.Gen, ptr %t2, i32 0, i32 10 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i32 0, i32 1 + %t6 = load i64, ptr %t5 + %t7 = add i64 %t6, 1 + call void @finch_arr_reserve(ptr %t4, i64 %t7, i64 ptrtoint (ptr getelementptr (%S.gen.Scope, ptr null, i32 1) to i64)) + %t8 = load ptr, ptr %t4 + %t9 = getelementptr inbounds %S.gen.Scope, ptr %t8, i64 %t6 + store %S.gen.Scope zeroinitializer, ptr %t9 + store i64 %t7, ptr %t5 + ret void +} + +define internal void @finch.gen.popScope(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic2794, label %ok2795 +panic2794: + call void @finch_panic(ptr @.str.1793, i64 1095, ptr @.str.1794) + unreachable +ok2795: + %t4 = getelementptr inbounds %S.gen.Gen, ptr %t2, i32 0, i32 10 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i32 0, i32 1 + %t6 = load i64, ptr %t5 + %t7 = icmp eq i64 %t6, 0 + br i1 %t7, label %panic2796, label %ok2797 +panic2796: + call void @finch_panic(ptr @.str.1795, i64 1095, ptr @.str.1796) + unreachable +ok2797: + %t8 = sub i64 %t6, 1 + %t9 = load ptr, ptr %t4 + %t10 = getelementptr inbounds %S.gen.Scope, ptr %t9, i64 %t8 + %t11 = load %S.gen.Scope, ptr %t10 + store i64 %t8, ptr %t5 + ret void +} + +define internal void @finch.copy.arr_S_gen_Var(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.gen.Var, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond2802 +n.cond2802: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body2803, label %n.end2804 +n.body2803: + %t8 = getelementptr inbounds %S.gen.Var, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.gen.Var, ptr %t2, i64 %t6 + call void @finch.copy.S_gen_Var(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond2802 +n.end2804: + ret void +} + +define internal void @finch.copy.S_gen_Scope(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Scope, ptr %src + store %S.gen.Scope %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Scope, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Scope, ptr %src, i32 0, i32 0 + call void @finch.copy.arr_S_gen_Var(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Scope, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Scope, ptr %src, i32 0, i32 1 + call void @finch.copy.arr_S_ast_Node(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.Scope, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.Scope, ptr %src, i32 0, i32 2 + call void @finch.copy.arr_int(ptr %t6, ptr %t7) + ret void +} + +define internal void @finch.gen.runDefers(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a13 = alloca %S.gen.Scope, align 16 + %a14 = alloca %S.gen.Scope, align 16 + %a16 = alloca %S.gen.Scope, align 16 + %a20 = alloca i64, align 16 + %a29 = alloca i1, align 16 + %a34 = alloca i64, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic2798, label %ok2799 +panic2798: + call void @finch_panic(ptr @.str.1797, i64 1100, ptr @.str.1798) + unreachable +ok2799: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 10 + %t6 = load i64, ptr %a2 + %t7 = load { ptr, i64, i64 }, ptr %t5 + %t8 = extractvalue { ptr, i64, i64 } %t7, 1 + %t9 = icmp uge i64 %t6, %t8 + br i1 %t9, label %range2800, label %inrange2801 +range2800: + call void @finch_panic_index(ptr @.str.1799, i64 1100, i64 %t6, i64 %t8) + unreachable +inrange2801: + %t10 = extractvalue { ptr, i64, i64 } %t7, 0 + %t11 = getelementptr inbounds %S.gen.Scope, ptr %t10, i64 %t6 + %t12 = load %S.gen.Scope, ptr %t11 + store %S.gen.Scope %t12, ptr %a13 + call void @finch.copy.S_gen_Scope(ptr %a14, ptr %a13) + %t15 = load %S.gen.Scope, ptr %a14 + store %S.gen.Scope %t15, ptr %a16 + %t17 = getelementptr inbounds %S.gen.Scope, ptr %a16, i32 0, i32 1 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t17, i32 0, i32 1 + %t19 = load i64, ptr %t18 + store i64 %t19, ptr %a20 + br label %while.cond2805 +while.cond2805: + %t21 = load i64, ptr %a20 + %t22 = icmp sgt i64 %t21, 0 + br i1 %t22, label %while.body2806, label %while.end2807 +while.body2806: + %t23 = load i64, ptr %a20 + %t24 = sub i64 %t23, 1 + store i64 %t24, ptr %a20 + %t25 = load ptr, ptr %a1 + %t26 = icmp eq ptr %t25, null + br i1 %t26, label %panic2808, label %ok2809 +panic2808: + call void @finch_panic(ptr @.str.1800, i64 1104, ptr @.str.1801) + unreachable +ok2809: + %t27 = getelementptr inbounds %S.gen.Gen, ptr %t25, i32 0, i32 40 + %t28 = load i1, ptr %t27 + store i1 %t28, ptr %a29 + %t30 = load ptr, ptr %a1 + %t31 = icmp eq ptr %t30, null + br i1 %t31, label %panic2810, label %ok2811 +panic2810: + call void @finch_panic(ptr @.str.1802, i64 1105, ptr @.str.1803) + unreachable +ok2811: + %t32 = getelementptr inbounds %S.gen.Gen, ptr %t30, i32 0, i32 41 + %t33 = load i64, ptr %t32 + store i64 %t33, ptr %a34 + %t35 = load ptr, ptr %a1 + %t36 = icmp eq ptr %t35, null + br i1 %t36, label %panic2812, label %ok2813 +panic2812: + call void @finch_panic(ptr @.str.1804, i64 1106, ptr @.str.1805) + unreachable +ok2813: + %t37 = getelementptr inbounds %S.gen.Gen, ptr %t35, i32 0, i32 40 + store i1 true, ptr %t37 + %t38 = getelementptr inbounds %S.gen.Scope, ptr %a16, i32 0, i32 2 + %t39 = load i64, ptr %a20 + %t40 = load { ptr, i64, i64 }, ptr %t38 + %t41 = extractvalue { ptr, i64, i64 } %t40, 1 + %t42 = icmp uge i64 %t39, %t41 + br i1 %t42, label %range2814, label %inrange2815 +range2814: + call void @finch_panic_index(ptr @.str.1806, i64 1107, i64 %t39, i64 %t41) + unreachable +inrange2815: + %t43 = extractvalue { ptr, i64, i64 } %t40, 0 + %t44 = getelementptr inbounds i64, ptr %t43, i64 %t39 + %t45 = load i64, ptr %t44 + %t46 = load ptr, ptr %a1 + %t47 = icmp eq ptr %t46, null + br i1 %t47, label %panic2816, label %ok2817 +panic2816: + call void @finch_panic(ptr @.str.1807, i64 1107, ptr @.str.1808) + unreachable +ok2817: + %t48 = getelementptr inbounds %S.gen.Gen, ptr %t46, i32 0, i32 41 + store i64 %t45, ptr %t48 + %t49 = load ptr, ptr %a1 + %t50 = icmp eq ptr %t49, null + br i1 %t50, label %panic2818, label %ok2819 +panic2818: + call void @finch_panic(ptr @.str.1809, i64 1108, ptr @.str.1810) + unreachable +ok2819: + %t51 = getelementptr inbounds %S.gen.Gen, ptr %t49, i32 0, i32 42 + %t52 = load i64, ptr %t51 + %t53 = add i64 %t52, 1 + store i64 %t53, ptr %t51 + %t54 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t54) + %t55 = load ptr, ptr %a1 + %t56 = getelementptr inbounds %S.gen.Scope, ptr %a16, i32 0, i32 1 + %t57 = load i64, ptr %a20 + %t58 = load { ptr, i64, i64 }, ptr %t56 + %t59 = extractvalue { ptr, i64, i64 } %t58, 1 + %t60 = icmp uge i64 %t57, %t59 + br i1 %t60, label %range2820, label %inrange2821 +range2820: + call void @finch_panic_index(ptr @.str.1811, i64 1110, i64 %t57, i64 %t59) + unreachable +inrange2821: + %t61 = extractvalue { ptr, i64, i64 } %t58, 0 + %t62 = getelementptr inbounds %S.ast.Node, ptr %t61, i64 %t57 + %t63 = load %S.ast.Node, ptr %t62 + call void @finch.gen.stmt(ptr %t55, %S.ast.Node %t63) + %t64 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t64) + %t65 = load ptr, ptr %a1 + %t66 = icmp eq ptr %t65, null + br i1 %t66, label %panic2822, label %ok2823 +panic2822: + call void @finch_panic(ptr @.str.1812, i64 1112, ptr @.str.1813) + unreachable +ok2823: + %t67 = getelementptr inbounds %S.gen.Gen, ptr %t65, i32 0, i32 42 + %t68 = load i64, ptr %t67 + %t69 = sub i64 %t68, 1 + store i64 %t69, ptr %t67 + %t70 = load i1, ptr %a29 + %t71 = load ptr, ptr %a1 + %t72 = icmp eq ptr %t71, null + br i1 %t72, label %panic2824, label %ok2825 +panic2824: + call void @finch_panic(ptr @.str.1814, i64 1113, ptr @.str.1815) + unreachable +ok2825: + %t73 = getelementptr inbounds %S.gen.Gen, ptr %t71, i32 0, i32 40 + store i1 %t70, ptr %t73 + %t74 = load i64, ptr %a34 + %t75 = load ptr, ptr %a1 + %t76 = icmp eq ptr %t75, null + br i1 %t76, label %panic2826, label %ok2827 +panic2826: + call void @finch_panic(ptr @.str.1816, i64 1114, ptr @.str.1817) + unreachable +ok2827: + %t77 = getelementptr inbounds %S.gen.Gen, ptr %t75, i32 0, i32 41 + store i64 %t74, ptr %t77 + br label %while.cond2805 +while.end2807: + ret void +} + +define internal void @finch.gen.unwind(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a8 = alloca i64, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic2828, label %ok2829 +panic2828: + call void @finch_panic(ptr @.str.1818, i64 1120, ptr @.str.1819) + unreachable +ok2829: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 10 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i32 0, i32 1 + %t7 = load i64, ptr %t6 + store i64 %t7, ptr %a8 + br label %while.cond2830 +while.cond2830: + %t9 = load i64, ptr %a8 + %t10 = load i64, ptr %a2 + %t11 = icmp sgt i64 %t9, %t10 + br i1 %t11, label %while.body2831, label %while.end2832 +while.body2831: + %t12 = load i64, ptr %a8 + %t13 = sub i64 %t12, 1 + store i64 %t13, ptr %a8 + %t14 = load ptr, ptr %a1 + %t15 = load i64, ptr %a8 + call void @finch.gen.runDefers(ptr %t14, i64 %t15) + br label %while.cond2830 +while.end2832: + ret void +} + +define internal void @finch.gen.endScope(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic2833, label %ok2834 +panic2833: + call void @finch_panic(ptr @.str.1820, i64 1129, ptr @.str.1821) + unreachable +ok2834: + %t4 = getelementptr inbounds %S.gen.Gen, ptr %t2, i32 0, i32 9 + %t5 = load i1, ptr %t4 + %t6 = xor i1 %t5, true + br i1 %t6, label %then2835, label %endif2837 +then2835: + %t7 = load ptr, ptr %a1 + %t8 = load ptr, ptr %a1 + %t9 = icmp eq ptr %t8, null + br i1 %t9, label %panic2838, label %ok2839 +panic2838: + call void @finch_panic(ptr @.str.1822, i64 1130, ptr @.str.1823) + unreachable +ok2839: + %t10 = getelementptr inbounds %S.gen.Gen, ptr %t8, i32 0, i32 10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t10, i32 0, i32 1 + %t12 = load i64, ptr %t11 + %t13 = sub i64 %t12, 1 + call void @finch.gen.runDefers(ptr %t7, i64 %t13) + br label %endif2837 +endif2837: + %t14 = load ptr, ptr %a1 + %t15 = icmp eq ptr %t14, null + br i1 %t15, label %panic2840, label %ok2841 +panic2840: + call void @finch_panic(ptr @.str.1824, i64 1132, ptr @.str.1825) + unreachable +ok2841: + %t16 = getelementptr inbounds %S.gen.Gen, ptr %t14, i32 0, i32 10 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t16, i32 0, i32 1 + %t18 = load i64, ptr %t17 + %t19 = icmp eq i64 %t18, 0 + br i1 %t19, label %panic2842, label %ok2843 +panic2842: + call void @finch_panic(ptr @.str.1826, i64 1132, ptr @.str.1827) + unreachable +ok2843: + %t20 = sub i64 %t18, 1 + %t21 = load ptr, ptr %t16 + %t22 = getelementptr inbounds %S.gen.Scope, ptr %t21, i64 %t20 + %t23 = load %S.gen.Scope, ptr %t22 + store i64 %t20, ptr %t17 + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %p0) { +entry: + %a1 = alloca %S.ast.Node, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Node %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.1828, i64 3, i64 0 }, ptr %a5 + %t6 = call i32 @finch_str_eq(ptr %a4, ptr %a5) + %t7 = icmp ne i32 %t6, 0 + br i1 %t7, label %then2844, label %endif2846 +then2844: + %t8 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 1 + %t9 = load { ptr, i64, i64 }, ptr %t8 + store { ptr, i64, i64 } %t9, ptr %a10 + call void @finch_str_copy(ptr %a11, ptr %a10) + %t12 = load { ptr, i64, i64 }, ptr %a11 + ret { ptr, i64, i64 } %t12 +endif2846: + %t13 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t14 = load { ptr, i64, i64 }, ptr %t13 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.1829, i64 6, i64 0 }, ptr %a16 + %t17 = call i32 @finch_str_eq(ptr %a15, ptr %a16) + %t18 = icmp ne i32 %t17, 0 + br label %logic.from2847 +logic.from2847: + br i1 %t18, label %logic.end2849, label %logic.rhs2848 +logic.rhs2848: + %t19 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t20 = load { ptr, i64, i64 }, ptr %t19 + store { ptr, i64, i64 } %t20, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.1830, i64 5, i64 0 }, ptr %a22 + %t23 = call i32 @finch_str_eq(ptr %a21, ptr %a22) + %t24 = icmp ne i32 %t23, 0 + br label %logic.rend2850 +logic.rend2850: + br label %logic.end2849 +logic.end2849: + %t25 = phi i1 [ true, %logic.from2847 ], [ %t24, %logic.rend2850 ] + br i1 %t25, label %then2851, label %endif2853 +then2851: + %t26 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 9 + %t27 = load { ptr, i64, i64 }, ptr %t26 + %t28 = extractvalue { ptr, i64, i64 } %t27, 1 + %t29 = icmp uge i64 0, %t28 + br i1 %t29, label %range2854, label %inrange2855 +range2854: + call void @finch_panic_index(ptr @.str.1831, i64 1142, i64 0, i64 %t28) + unreachable +inrange2855: + %t30 = extractvalue { ptr, i64, i64 } %t27, 0 + %t31 = getelementptr inbounds %S.ast.Node, ptr %t30, i64 0 + %t32 = load %S.ast.Node, ptr %t31 + %t33 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t32) + ret { ptr, i64, i64 } %t33 +endif2853: + ret { ptr, i64, i64 } { ptr @.str.1832, i64 0, i64 0 } +} + +define internal i1 @finch.gen.mutates(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Node %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Node, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca i64, align 16 + %a50 = alloca i64, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca i64, align 16 + %a71 = alloca i64, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca i64, align 16 + %a140 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Node %p2, ptr %a3 + %t4 = mul i64 8, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t5 = call ptr @finch_alloc(i64 %t4) + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 0 + store { ptr, i64, i64 } { ptr @.str.1833, i64 4, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 1 + store { ptr, i64, i64 } { ptr @.str.1834, i64 3, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 2 + store { ptr, i64, i64 } { ptr @.str.1835, i64 6, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 3 + store { ptr, i64, i64 } { ptr @.str.1836, i64 6, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 4 + store { ptr, i64, i64 } { ptr @.str.1837, i64 5, i64 0 }, ptr %t10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 5 + store { ptr, i64, i64 } { ptr @.str.1838, i64 6, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 6 + store { ptr, i64, i64 } { ptr @.str.1839, i64 4, i64 0 }, ptr %t12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i64 7 + store { ptr, i64, i64 } { ptr @.str.1840, i64 7, i64 0 }, ptr %t13 + %t14 = insertvalue { ptr, i64, i64 } undef, ptr %t5, 0 + %t15 = insertvalue { ptr, i64, i64 } %t14, i64 8, 1 + %t16 = insertvalue { ptr, i64, i64 } %t15, i64 8, 2 + store { ptr, i64, i64 } %t16, ptr %a17 + %t18 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 0 + %t19 = load { ptr, i64, i64 }, ptr %t18 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.1841, i64 6, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br label %logic.from2856 +logic.from2856: + br i1 %t23, label %logic.rhs2857, label %logic.end2858 +logic.rhs2857: + %t24 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 9 + %t25 = load { ptr, i64, i64 }, ptr %t24 + %t26 = extractvalue { ptr, i64, i64 } %t25, 1 + %t27 = icmp uge i64 0, %t26 + br i1 %t27, label %range2859, label %inrange2860 +range2859: + call void @finch_panic_index(ptr @.str.1842, i64 1149, i64 0, i64 %t26) + unreachable +inrange2860: + %t28 = extractvalue { ptr, i64, i64 } %t25, 0 + %t29 = getelementptr inbounds %S.ast.Node, ptr %t28, i64 0 + %t30 = load %S.ast.Node, ptr %t29 + %t31 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t30) + %t32 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t31, ptr %a33 + store { ptr, i64, i64 } %t32, ptr %a34 + %t35 = call i32 @finch_str_eq(ptr %a33, ptr %a34) + %t36 = icmp ne i32 %t35, 0 + br label %logic.rend2861 +logic.rend2861: + br label %logic.end2858 +logic.end2858: + %t37 = phi i1 [ false, %logic.from2856 ], [ %t36, %logic.rend2861 ] + br i1 %t37, label %then2862, label %endif2864 +then2862: + ret i1 true +endif2864: + %t38 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 0 + %t39 = load { ptr, i64, i64 }, ptr %t38 + store { ptr, i64, i64 } %t39, ptr %a40 + store { ptr, i64, i64 } { ptr @.str.1843, i64 6, i64 0 }, ptr %a41 + %t42 = call i32 @finch_str_eq(ptr %a40, ptr %a41) + %t43 = icmp ne i32 %t42, 0 + br label %logic.from2865 +logic.from2865: + br i1 %t43, label %logic.rhs2866, label %logic.end2867 +logic.rhs2866: + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %a17, i32 0, i32 1 + %t45 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 1 + %t46 = load { ptr, i64, i64 }, ptr %t45 + store i64 -1, ptr %a47 + %t48 = load i64, ptr %t44 + %t49 = load ptr, ptr %a17 + store i64 0, ptr %a50 + br label %find.cond2868 +find.cond2868: + %t51 = load i64, ptr %a50 + %t52 = icmp slt i64 %t51, %t48 + br i1 %t52, label %find.body2869, label %find.end2872 +find.body2869: + %t53 = getelementptr inbounds { ptr, i64, i64 }, ptr %t49, i64 %t51 + %t54 = load { ptr, i64, i64 }, ptr %t53 + store { ptr, i64, i64 } %t54, ptr %a55 + store { ptr, i64, i64 } %t46, ptr %a56 + %t57 = call i32 @finch_str_eq(ptr %a55, ptr %a56) + %t58 = icmp ne i32 %t57, 0 + br i1 %t58, label %find.hit2870, label %find.next2871 +find.hit2870: + store i64 %t51, ptr %a47 + br label %find.end2872 +find.next2871: + %t59 = add i64 %t51, 1 + store i64 %t59, ptr %a50 + br label %find.cond2868 +find.end2872: + %t60 = load i64, ptr %a47 + %t61 = icmp sge i64 %t60, 0 + br label %logic.from2873 +logic.from2873: + br i1 %t61, label %logic.end2875, label %logic.rhs2874 +logic.rhs2874: + %t62 = load ptr, ptr %a1 + %t63 = icmp eq ptr %t62, null + br i1 %t63, label %panic2876, label %ok2877 +panic2876: + call void @finch_panic(ptr @.str.1844, i64 1155, ptr @.str.1845) + unreachable +ok2877: + %t64 = getelementptr inbounds %S.gen.Gen, ptr %t62, i32 0, i32 22 + %t65 = getelementptr inbounds { ptr, i64, i64 }, ptr %t64, i32 0, i32 1 + %t66 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 1 + %t67 = load { ptr, i64, i64 }, ptr %t66 + store i64 -1, ptr %a68 + %t69 = load i64, ptr %t65 + %t70 = load ptr, ptr %t64 + store i64 0, ptr %a71 + br label %find.cond2878 +find.cond2878: + %t72 = load i64, ptr %a71 + %t73 = icmp slt i64 %t72, %t69 + br i1 %t73, label %find.body2879, label %find.end2882 +find.body2879: + %t74 = getelementptr inbounds { ptr, i64, i64 }, ptr %t70, i64 %t72 + %t75 = load { ptr, i64, i64 }, ptr %t74 + store { ptr, i64, i64 } %t75, ptr %a76 + store { ptr, i64, i64 } %t67, ptr %a77 + %t78 = call i32 @finch_str_eq(ptr %a76, ptr %a77) + %t79 = icmp ne i32 %t78, 0 + br i1 %t79, label %find.hit2880, label %find.next2881 +find.hit2880: + store i64 %t72, ptr %a68 + br label %find.end2882 +find.next2881: + %t80 = add i64 %t72, 1 + store i64 %t80, ptr %a71 + br label %find.cond2878 +find.end2882: + %t81 = load i64, ptr %a68 + %t82 = icmp sge i64 %t81, 0 + br label %logic.rend2883 +logic.rend2883: + br label %logic.end2875 +logic.end2875: + %t83 = phi i1 [ true, %logic.from2873 ], [ %t82, %logic.rend2883 ] + br label %logic.rend2884 +logic.rend2884: + br label %logic.end2867 +logic.end2867: + %t84 = phi i1 [ false, %logic.from2865 ], [ %t83, %logic.rend2884 ] + br label %logic.from2885 +logic.from2885: + br i1 %t84, label %logic.rhs2886, label %logic.end2887 +logic.rhs2886: + %t85 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 9 + %t86 = load { ptr, i64, i64 }, ptr %t85 + %t87 = extractvalue { ptr, i64, i64 } %t86, 1 + %t88 = icmp uge i64 0, %t87 + br i1 %t88, label %range2888, label %inrange2889 +range2888: + call void @finch_panic_index(ptr @.str.1846, i64 1155, i64 0, i64 %t87) + unreachable +inrange2889: + %t89 = extractvalue { ptr, i64, i64 } %t86, 0 + %t90 = getelementptr inbounds %S.ast.Node, ptr %t89, i64 0 + %t91 = load %S.ast.Node, ptr %t90 + %t92 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t91) + %t93 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t92, ptr %a94 + store { ptr, i64, i64 } %t93, ptr %a95 + %t96 = call i32 @finch_str_eq(ptr %a94, ptr %a95) + %t97 = icmp ne i32 %t96, 0 + br label %logic.rend2890 +logic.rend2890: + br label %logic.end2887 +logic.end2887: + %t98 = phi i1 [ false, %logic.from2885 ], [ %t97, %logic.rend2890 ] + br i1 %t98, label %then2891, label %endif2893 +then2891: + ret i1 true +endif2893: + %t99 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 0 + %t100 = load { ptr, i64, i64 }, ptr %t99 + store { ptr, i64, i64 } %t100, ptr %a101 + store { ptr, i64, i64 } { ptr @.str.1847, i64 4, i64 0 }, ptr %a102 + %t103 = call i32 @finch_str_eq(ptr %a101, ptr %a102) + %t104 = icmp ne i32 %t103, 0 + br label %logic.from2894 +logic.from2894: + br i1 %t104, label %logic.rhs2895, label %logic.end2896 +logic.rhs2895: + %t105 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 1 + %t106 = load { ptr, i64, i64 }, ptr %t105 + store { ptr, i64, i64 } %t106, ptr %a107 + store { ptr, i64, i64 } { ptr @.str.1848, i64 4, i64 0 }, ptr %a108 + %t109 = call i32 @finch_str_eq(ptr %a107, ptr %a108) + %t110 = icmp ne i32 %t109, 0 + br label %logic.rend2897 +logic.rend2897: + br label %logic.end2896 +logic.end2896: + %t111 = phi i1 [ false, %logic.from2894 ], [ %t110, %logic.rend2897 ] + br label %logic.from2898 +logic.from2898: + br i1 %t111, label %logic.rhs2899, label %logic.end2900 +logic.rhs2899: + %t112 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 9 + %t113 = getelementptr inbounds { ptr, i64, i64 }, ptr %t112, i32 0, i32 1 + %t114 = load i64, ptr %t113 + %t115 = icmp eq i64 %t114, 1 + br label %logic.rend2901 +logic.rend2901: + br label %logic.end2900 +logic.end2900: + %t116 = phi i1 [ false, %logic.from2898 ], [ %t115, %logic.rend2901 ] + br label %logic.from2902 +logic.from2902: + br i1 %t116, label %logic.rhs2903, label %logic.end2904 +logic.rhs2903: + %t117 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 9 + %t118 = load { ptr, i64, i64 }, ptr %t117 + %t119 = extractvalue { ptr, i64, i64 } %t118, 1 + %t120 = icmp uge i64 0, %t119 + br i1 %t120, label %range2905, label %inrange2906 +range2905: + call void @finch_panic_index(ptr @.str.1849, i64 1158, i64 0, i64 %t119) + unreachable +inrange2906: + %t121 = extractvalue { ptr, i64, i64 } %t118, 0 + %t122 = getelementptr inbounds %S.ast.Node, ptr %t121, i64 0 + %t123 = load %S.ast.Node, ptr %t122 + %t124 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t123) + %t125 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t124, ptr %a126 + store { ptr, i64, i64 } %t125, ptr %a127 + %t128 = call i32 @finch_str_eq(ptr %a126, ptr %a127) + %t129 = icmp ne i32 %t128, 0 + br label %logic.rend2907 +logic.rend2907: + br label %logic.end2904 +logic.end2904: + %t130 = phi i1 [ false, %logic.from2902 ], [ %t129, %logic.rend2907 ] + br i1 %t130, label %then2908, label %endif2910 +then2908: + ret i1 true +endif2910: + %t131 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 9 + store i64 0, ptr %a132 + br label %each.cond2911 +each.cond2911: + %t133 = getelementptr inbounds { ptr, i64, i64 }, ptr %t131, i32 0, i32 1 + %t134 = load i64, ptr %t133 + %t135 = load i64, ptr %a132 + %t136 = icmp slt i64 %t135, %t134 + br i1 %t136, label %each.body2912, label %each.end2914 +each.body2912: + %t137 = load ptr, ptr %t131 + %t138 = getelementptr inbounds %S.ast.Node, ptr %t137, i64 %t135 + %t139 = load %S.ast.Node, ptr %t138 + store %S.ast.Node %t139, ptr %a140 + %t141 = load ptr, ptr %a1 + %t142 = load { ptr, i64, i64 }, ptr %a2 + %t143 = load %S.ast.Node, ptr %a140 + %t144 = call i1 @finch.gen.mutates(ptr %t141, { ptr, i64, i64 } %t142, %S.ast.Node %t143) + br i1 %t144, label %then2915, label %endif2917 +then2915: + ret i1 true +endif2917: + br label %each.step2913 +each.step2913: + %t145 = load i64, ptr %a132 + %t146 = add i64 %t145, 1 + store i64 %t146, ptr %a132 + br label %each.cond2911 +each.end2914: + ret i1 false +} + +define internal void @finch.copy.arr_bool(ptr %dst, ptr %src) { +entry: + + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (i1, ptr null, i32 1) to i64)) + ret void +} + +define internal void @finch.copy.S_gen_FnSig(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.FnSig, ptr %src + store %S.gen.FnSig %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 3 + call void @finch_str_copy(ptr %t8, ptr %t9) + %t10 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 6 + %t11 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 6 + call void @finch.copy.arr_str(ptr %t10, ptr %t11) + %t12 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 7 + %t13 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 7 + call void @finch.copy.arr_S_ast_Type(ptr %t12, ptr %t13) + %t14 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 8 + %t15 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 8 + call void @finch_str_copy(ptr %t14, ptr %t15) + %t16 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 11 + %t17 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 11 + call void @finch_str_copy(ptr %t16, ptr %t17) + %t18 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 12 + %t19 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 12 + call void @finch.copy.S_ast_Type(ptr %t18, ptr %t19) + %t20 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 13 + %t21 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 13 + call void @finch.copy.arr_S_ast_Type(ptr %t20, ptr %t21) + %t22 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 14 + %t23 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 14 + call void @finch.copy.arr_str(ptr %t22, ptr %t23) + %t24 = getelementptr inbounds %S.gen.FnSig, ptr %dst, i32 0, i32 15 + %t25 = getelementptr inbounds %S.gen.FnSig, ptr %src, i32 0, i32 15 + call void @finch.copy.arr_bool(ptr %t24, ptr %t25) + ret void +} + +define internal void @finch.copy.S_gen_Template(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Template, ptr %src + store %S.gen.Template %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Template, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Template, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Template, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Template, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.Template, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.Template, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.gen.Template, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.gen.Template, ptr %src, i32 0, i32 3 + call void @finch.copy.arr_str(ptr %t8, ptr %t9) + ret void +} + +define internal void @finch.gen.declare(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a7 = alloca i64, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca i64, align 16 + %a59 = alloca %S.ast.Node, align 16 + %a60 = alloca %S.ast.Node, align 16 + %a62 = alloca %S.ast.Node, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca i64, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca i64, align 16 + %a218 = alloca %S.ast.Node, align 16 + %a219 = alloca %S.ast.Node, align 16 + %a221 = alloca %S.ast.Node, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca %S.gen.EnumDef, align 16 + %a268 = alloca i64, align 16 + %a270 = alloca i64, align 16 + %a278 = alloca %S.ast.Node, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca i64, align 16 + %a294 = alloca i64, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca i64, align 16 + %a334 = alloca i64, align 16 + %a347 = alloca { ptr, i64, i64 }, align 16 + %a348 = alloca { ptr, i64, i64 }, align 16 + %a349 = alloca { ptr, i64, i64 }, align 16 + %a351 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca { ptr, i64, i64 }, align 16 + %a353 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a359 = alloca { ptr, i64, i64 }, align 16 + %a360 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca %S.gen.EnumDef, align 16 + %a394 = alloca %S.gen.EnumDef, align 16 + %a410 = alloca i64, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a448 = alloca i64, align 16 + %a460 = alloca i64, align 16 + %a477 = alloca { ptr, i64, i64 }, align 16 + %a478 = alloca { ptr, i64, i64 }, align 16 + %a492 = alloca i64, align 16 + %a512 = alloca %S.ast.Node, align 16 + %a513 = alloca %S.ast.Node, align 16 + %a515 = alloca %S.ast.Node, align 16 + %a535 = alloca { ptr, i64, i64 }, align 16 + %a536 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a539 = alloca { ptr, i64, i64 }, align 16 + %a540 = alloca { ptr, i64, i64 }, align 16 + %a541 = alloca { ptr, i64, i64 }, align 16 + %a561 = alloca { ptr, i64, i64 }, align 16 + %a562 = alloca { ptr, i64, i64 }, align 16 + %a563 = alloca { ptr, i64, i64 }, align 16 + %a565 = alloca { ptr, i64, i64 }, align 16 + %a566 = alloca { ptr, i64, i64 }, align 16 + %a567 = alloca { ptr, i64, i64 }, align 16 + %a577 = alloca { ptr, i64, i64 }, align 16 + %a578 = alloca { ptr, i64, i64 }, align 16 + %a583 = alloca { ptr, i64, i64 }, align 16 + %a584 = alloca { ptr, i64, i64 }, align 16 + %a589 = alloca { ptr, i64, i64 }, align 16 + %a590 = alloca { ptr, i64, i64 }, align 16 + %a595 = alloca { ptr, i64, i64 }, align 16 + %a596 = alloca { ptr, i64, i64 }, align 16 + %a611 = alloca { ptr, i64, i64 }, align 16 + %a612 = alloca { ptr, i64, i64 }, align 16 + %a614 = alloca { ptr, i64, i64 }, align 16 + %a615 = alloca i1, align 16 + %a642 = alloca { ptr, i64, i64 }, align 16 + %a643 = alloca { ptr, i64, i64 }, align 16 + %a644 = alloca { ptr, i64, i64 }, align 16 + %a646 = alloca { ptr, i64, i64 }, align 16 + %a647 = alloca { ptr, i64, i64 }, align 16 + %a648 = alloca { ptr, i64, i64 }, align 16 + %a652 = alloca { ptr, i64, i64 }, align 16 + %a653 = alloca { ptr, i64, i64 }, align 16 + %a654 = alloca { ptr, i64, i64 }, align 16 + %a656 = alloca { ptr, i64, i64 }, align 16 + %a657 = alloca { ptr, i64, i64 }, align 16 + %a658 = alloca { ptr, i64, i64 }, align 16 + %a672 = alloca i64, align 16 + %a691 = alloca { ptr, i64, i64 }, align 16 + %a692 = alloca { ptr, i64, i64 }, align 16 + %a693 = alloca { ptr, i64, i64 }, align 16 + %a695 = alloca { ptr, i64, i64 }, align 16 + %a696 = alloca { ptr, i64, i64 }, align 16 + %a697 = alloca { ptr, i64, i64 }, align 16 + %a711 = alloca { ptr, i64, i64 }, align 16 + %a712 = alloca { ptr, i64, i64 }, align 16 + %a713 = alloca { ptr, i64, i64 }, align 16 + %a715 = alloca { ptr, i64, i64 }, align 16 + %a716 = alloca { ptr, i64, i64 }, align 16 + %a717 = alloca { ptr, i64, i64 }, align 16 + %a721 = alloca { ptr, i64, i64 }, align 16 + %a722 = alloca { ptr, i64, i64 }, align 16 + %a723 = alloca { ptr, i64, i64 }, align 16 + %a725 = alloca { ptr, i64, i64 }, align 16 + %a726 = alloca { ptr, i64, i64 }, align 16 + %a727 = alloca { ptr, i64, i64 }, align 16 + %a742 = alloca i64, align 16 + %a745 = alloca i64, align 16 + %a750 = alloca { ptr, i64, i64 }, align 16 + %a751 = alloca { ptr, i64, i64 }, align 16 + %a761 = alloca { ptr, i64, i64 }, align 16 + %a762 = alloca { ptr, i64, i64 }, align 16 + %a763 = alloca { ptr, i64, i64 }, align 16 + %a765 = alloca { ptr, i64, i64 }, align 16 + %a766 = alloca { ptr, i64, i64 }, align 16 + %a767 = alloca { ptr, i64, i64 }, align 16 + %a771 = alloca { ptr, i64, i64 }, align 16 + %a772 = alloca { ptr, i64, i64 }, align 16 + %a773 = alloca { ptr, i64, i64 }, align 16 + %a775 = alloca { ptr, i64, i64 }, align 16 + %a776 = alloca { ptr, i64, i64 }, align 16 + %a777 = alloca { ptr, i64, i64 }, align 16 + %a792 = alloca { ptr, i64, i64 }, align 16 + %a793 = alloca { ptr, i64, i64 }, align 16 + %a794 = alloca { ptr, i64, i64 }, align 16 + %a796 = alloca { ptr, i64, i64 }, align 16 + %a797 = alloca { ptr, i64, i64 }, align 16 + %a798 = alloca { ptr, i64, i64 }, align 16 + %a807 = alloca { ptr, i64, i64 }, align 16 + %a808 = alloca { ptr, i64, i64 }, align 16 + %a809 = alloca { ptr, i64, i64 }, align 16 + %a811 = alloca { ptr, i64, i64 }, align 16 + %a812 = alloca { ptr, i64, i64 }, align 16 + %a813 = alloca { ptr, i64, i64 }, align 16 + %a819 = alloca { ptr, i64, i64 }, align 16 + %a820 = alloca { ptr, i64, i64 }, align 16 + %a825 = alloca { ptr, i64, i64 }, align 16 + %a826 = alloca { ptr, i64, i64 }, align 16 + %a831 = alloca { ptr, i64, i64 }, align 16 + %a832 = alloca { ptr, i64, i64 }, align 16 + %a836 = alloca { ptr, i64, i64 }, align 16 + %a837 = alloca { ptr, i64, i64 }, align 16 + %a852 = alloca %S.gen.FnSig, align 16 + %a858 = alloca { ptr, i64, i64 }, align 16 + %a859 = alloca { ptr, i64, i64 }, align 16 + %a860 = alloca { ptr, i64, i64 }, align 16 + %a862 = alloca { ptr, i64, i64 }, align 16 + %a863 = alloca { ptr, i64, i64 }, align 16 + %a864 = alloca { ptr, i64, i64 }, align 16 + %a868 = alloca { ptr, i64, i64 }, align 16 + %a869 = alloca { ptr, i64, i64 }, align 16 + %a870 = alloca { ptr, i64, i64 }, align 16 + %a882 = alloca { ptr, i64, i64 }, align 16 + %a883 = alloca { ptr, i64, i64 }, align 16 + %a884 = alloca { ptr, i64, i64 }, align 16 + %a886 = alloca { ptr, i64, i64 }, align 16 + %a887 = alloca { ptr, i64, i64 }, align 16 + %a888 = alloca { ptr, i64, i64 }, align 16 + %a892 = alloca { ptr, i64, i64 }, align 16 + %a893 = alloca { ptr, i64, i64 }, align 16 + %a894 = alloca { ptr, i64, i64 }, align 16 + %a896 = alloca { ptr, i64, i64 }, align 16 + %a897 = alloca { ptr, i64, i64 }, align 16 + %a898 = alloca { ptr, i64, i64 }, align 16 + %a902 = alloca { ptr, i64, i64 }, align 16 + %a903 = alloca { ptr, i64, i64 }, align 16 + %a904 = alloca { ptr, i64, i64 }, align 16 + %a917 = alloca i64, align 16 + %a929 = alloca { ptr, i64, i64 }, align 16 + %a930 = alloca { ptr, i64, i64 }, align 16 + %a949 = alloca { ptr, i64, i64 }, align 16 + %a950 = alloca { ptr, i64, i64 }, align 16 + %a951 = alloca { ptr, i64, i64 }, align 16 + %a953 = alloca { ptr, i64, i64 }, align 16 + %a954 = alloca { ptr, i64, i64 }, align 16 + %a955 = alloca { ptr, i64, i64 }, align 16 + %a993 = alloca { ptr, i64, i64 }, align 16 + %a994 = alloca { ptr, i64, i64 }, align 16 + %a1012 = alloca %S.gen.FnSig, align 16 + %a1013 = alloca %S.gen.FnSig, align 16 + %a1023 = alloca i1, align 16 + %a1030 = alloca i64, align 16 + %a1096 = alloca %S.ast.Node, align 16 + %a1097 = alloca %S.ast.Node, align 16 + %a1099 = alloca %S.ast.Node, align 16 + %a1138 = alloca { ptr, i64, i64 }, align 16 + %a1139 = alloca { ptr, i64, i64 }, align 16 + %a1152 = alloca i64, align 16 + %a1165 = alloca %S.gen.Template, align 16 + %a1166 = alloca %S.gen.Template, align 16 + %a1168 = alloca %S.gen.Template, align 16 + %a1196 = alloca %S.ast.Node, align 16 + %a1197 = alloca %S.ast.Node, align 16 + %a1199 = alloca %S.ast.Node, align 16 + %a1229 = alloca { ptr, i64, i64 }, align 16 + %a1230 = alloca { ptr, i64, i64 }, align 16 + %a1243 = alloca i64, align 16 + %a1283 = alloca %S.ast.Node, align 16 + %a1284 = alloca %S.ast.Node, align 16 + %a1286 = alloca %S.ast.Node, align 16 + %a1298 = alloca %S.ast.Node, align 16 + %a1299 = alloca %S.ast.Node, align 16 + %a1301 = alloca %S.ast.Node, align 16 + %a1314 = alloca i64, align 16 + %a1334 = alloca %S.ast.Type, align 16 + %a1335 = alloca %S.ast.Type, align 16 + %a1337 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic2918, label %ok2919 +panic2918: + call void @finch_panic(ptr @.str.1850, i64 1172, ptr @.str.1851) + unreachable +ok2919: + %t4 = getelementptr inbounds %S.gen.Gen, ptr %t2, i32 0, i32 0 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i32 0, i32 1 + %t6 = load i64, ptr %t5 + store i64 0, ptr %a7 + br label %for.cond2920 +for.cond2920: + %t8 = load i64, ptr %a7 + %t9 = icmp slt i64 %t8, %t6 + br i1 %t9, label %for.body2921, label %for.end2923 +for.body2921: + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic2924, label %ok2925 +panic2924: + call void @finch_panic(ptr @.str.1852, i64 1173, ptr @.str.1853) + unreachable +ok2925: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 0 + %t13 = load i64, ptr %a7 + %t14 = load { ptr, i64, i64 }, ptr %t12 + %t15 = extractvalue { ptr, i64, i64 } %t14, 1 + %t16 = icmp uge i64 %t13, %t15 + br i1 %t16, label %range2926, label %inrange2927 +range2926: + call void @finch_panic_index(ptr @.str.1854, i64 1173, i64 %t13, i64 %t15) + unreachable +inrange2927: + %t17 = extractvalue { ptr, i64, i64 } %t14, 0 + %t18 = getelementptr inbounds %S.ast.Program, ptr %t17, i64 %t13 + %t19 = getelementptr inbounds %S.ast.Program, ptr %t18, i32 0, i32 0 + %t20 = load { ptr, i64, i64 }, ptr %t19 + %t21 = load ptr, ptr %a1 + %t22 = icmp eq ptr %t21, null + br i1 %t22, label %panic2928, label %ok2929 +panic2928: + call void @finch_panic(ptr @.str.1855, i64 1173, ptr @.str.1856) + unreachable +ok2929: + %t23 = getelementptr inbounds %S.gen.Gen, ptr %t21, i32 0, i32 13 + store { ptr, i64, i64 } %t20, ptr %a24 + call void @finch_str_copy(ptr %a25, ptr %a24) + %t26 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t26, ptr %t23 + %t27 = load ptr, ptr %a1 + %t28 = icmp eq ptr %t27, null + br i1 %t28, label %panic2930, label %ok2931 +panic2930: + call void @finch_panic(ptr @.str.1857, i64 1174, ptr @.str.1858) + unreachable +ok2931: + %t29 = getelementptr inbounds %S.gen.Gen, ptr %t27, i32 0, i32 0 + %t30 = load i64, ptr %a7 + %t31 = load { ptr, i64, i64 }, ptr %t29 + %t32 = extractvalue { ptr, i64, i64 } %t31, 1 + %t33 = icmp uge i64 %t30, %t32 + br i1 %t33, label %range2932, label %inrange2933 +range2932: + call void @finch_panic_index(ptr @.str.1859, i64 1174, i64 %t30, i64 %t32) + unreachable +inrange2933: + %t34 = extractvalue { ptr, i64, i64 } %t31, 0 + %t35 = getelementptr inbounds %S.ast.Program, ptr %t34, i64 %t30 + %t36 = getelementptr inbounds %S.ast.Program, ptr %t35, i32 0, i32 6 + %t37 = getelementptr inbounds { ptr, i64, i64 }, ptr %t36, i32 0, i32 1 + %t38 = load i64, ptr %t37 + store i64 0, ptr %a39 + br label %for.cond2934 +for.cond2934: + %t40 = load i64, ptr %a39 + %t41 = icmp slt i64 %t40, %t38 + br i1 %t41, label %for.body2935, label %for.end2937 +for.body2935: + %t42 = load ptr, ptr %a1 + %t43 = icmp eq ptr %t42, null + br i1 %t43, label %panic2938, label %ok2939 +panic2938: + call void @finch_panic(ptr @.str.1860, i64 1175, ptr @.str.1861) + unreachable +ok2939: + %t44 = getelementptr inbounds %S.gen.Gen, ptr %t42, i32 0, i32 0 + %t45 = load i64, ptr %a7 + %t46 = load { ptr, i64, i64 }, ptr %t44 + %t47 = extractvalue { ptr, i64, i64 } %t46, 1 + %t48 = icmp uge i64 %t45, %t47 + br i1 %t48, label %range2940, label %inrange2941 +range2940: + call void @finch_panic_index(ptr @.str.1862, i64 1175, i64 %t45, i64 %t47) + unreachable +inrange2941: + %t49 = extractvalue { ptr, i64, i64 } %t46, 0 + %t50 = getelementptr inbounds %S.ast.Program, ptr %t49, i64 %t45 + %t51 = getelementptr inbounds %S.ast.Program, ptr %t50, i32 0, i32 6 + %t52 = load i64, ptr %a39 + %t53 = load { ptr, i64, i64 }, ptr %t51 + %t54 = extractvalue { ptr, i64, i64 } %t53, 1 + %t55 = icmp uge i64 %t52, %t54 + br i1 %t55, label %range2942, label %inrange2943 +range2942: + call void @finch_panic_index(ptr @.str.1863, i64 1175, i64 %t52, i64 %t54) + unreachable +inrange2943: + %t56 = extractvalue { ptr, i64, i64 } %t53, 0 + %t57 = getelementptr inbounds %S.ast.Node, ptr %t56, i64 %t52 + %t58 = load %S.ast.Node, ptr %t57 + store %S.ast.Node %t58, ptr %a59 + call void @finch.copy.S_ast_Node(ptr %a60, ptr %a59) + %t61 = load %S.ast.Node, ptr %a60 + store %S.ast.Node %t61, ptr %a62 + %t63 = load ptr, ptr %a1 + %t64 = load ptr, ptr %a1 + %t65 = icmp eq ptr %t64, null + br i1 %t65, label %panic2944, label %ok2945 +panic2944: + call void @finch_panic(ptr @.str.1864, i64 1176, ptr @.str.1865) + unreachable +ok2945: + %t66 = getelementptr inbounds %S.gen.Gen, ptr %t64, i32 0, i32 13 + %t67 = load { ptr, i64, i64 }, ptr %t66 + %t68 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 1 + %t69 = load { ptr, i64, i64 }, ptr %t68 + %t70 = call i64 @finch.gen.findStruct(ptr %t63, { ptr, i64, i64 } %t67, { ptr, i64, i64 } %t69) + %t71 = icmp sge i64 %t70, 0 + br label %logic.from2946 +logic.from2946: + br i1 %t71, label %logic.end2948, label %logic.rhs2947 +logic.rhs2947: + %t72 = load ptr, ptr %a1 + %t73 = load ptr, ptr %a1 + %t74 = icmp eq ptr %t73, null + br i1 %t74, label %panic2949, label %ok2950 +panic2949: + call void @finch_panic(ptr @.str.1866, i64 1176, ptr @.str.1867) + unreachable +ok2950: + %t75 = getelementptr inbounds %S.gen.Gen, ptr %t73, i32 0, i32 13 + %t76 = load { ptr, i64, i64 }, ptr %t75 + %t77 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 1 + %t78 = load { ptr, i64, i64 }, ptr %t77 + %t79 = call i64 @finch.gen.findTemplate(ptr %t72, { ptr, i64, i64 } %t76, { ptr, i64, i64 } %t78, { ptr, i64, i64 } { ptr @.str.1868, i64 0, i64 0 }, i1 true) + %t80 = icmp sge i64 %t79, 0 + br label %logic.rend2951 +logic.rend2951: + br label %logic.end2948 +logic.end2948: + %t81 = phi i1 [ true, %logic.from2946 ], [ %t80, %logic.rend2951 ] + br i1 %t81, label %then2952, label %endif2954 +then2952: + %t82 = load ptr, ptr %a1 + %t83 = load %S.ast.Node, ptr %a62 + %t84 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 1 + %t85 = load { ptr, i64, i64 }, ptr %t84 + store { ptr, i64, i64 } { ptr @.str.1869, i64 12, i64 0 }, ptr %a87 + store { ptr, i64, i64 } %t85, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t89, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.1870, i64 18, i64 0 }, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + call void @finch.gen.fail(ptr %t82, %S.ast.Node %t83, { ptr, i64, i64 } %t93) + br label %endif2954 +endif2954: + %t94 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 3 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %t94, i32 0, i32 1 + %t96 = load i64, ptr %t95 + %t97 = icmp sgt i64 %t96, 0 + br i1 %t97, label %then2955, label %endif2957 +then2955: + %t98 = load ptr, ptr %a1 + %t99 = icmp eq ptr %t98, null + br i1 %t99, label %panic2958, label %ok2959 +panic2958: + call void @finch_panic(ptr @.str.1871, i64 1181, ptr @.str.1872) + unreachable +ok2959: + %t100 = getelementptr inbounds %S.gen.Gen, ptr %t98, i32 0, i32 16 + %t101 = getelementptr inbounds { ptr, i64, i64 }, ptr %t100, i32 0, i32 1 + %t102 = load ptr, ptr %a1 + %t103 = icmp eq ptr %t102, null + br i1 %t103, label %panic2960, label %ok2961 +panic2960: + call void @finch_panic(ptr @.str.1873, i64 1181, ptr @.str.1874) + unreachable +ok2961: + %t104 = getelementptr inbounds %S.gen.Gen, ptr %t102, i32 0, i32 13 + %t105 = load { ptr, i64, i64 }, ptr %t104 + store { ptr, i64, i64 } %t105, ptr %a106 + call void @finch_str_copy(ptr %a107, ptr %a106) + %t108 = load { ptr, i64, i64 }, ptr %a107 + %t109 = insertvalue %S.gen.Template zeroinitializer, { ptr, i64, i64 } %t108, 0 + %t110 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 1 + %t111 = load { ptr, i64, i64 }, ptr %t110 + store { ptr, i64, i64 } %t111, ptr %a112 + call void @finch_str_copy(ptr %a113, ptr %a112) + %t114 = load { ptr, i64, i64 }, ptr %a113 + %t115 = insertvalue %S.gen.Template %t109, { ptr, i64, i64 } %t114, 1 + %t116 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 3 + %t117 = load { ptr, i64, i64 }, ptr %t116 + store { ptr, i64, i64 } %t117, ptr %a118 + call void @finch.copy.arr_str(ptr %a119, ptr %a118) + %t120 = load { ptr, i64, i64 }, ptr %a119 + %t121 = insertvalue %S.gen.Template %t115, { ptr, i64, i64 } %t120, 3 + %t122 = load i64, ptr %a7 + %t123 = insertvalue %S.gen.Template %t121, i64 %t122, 4 + %t124 = load i64, ptr %a39 + %t125 = insertvalue %S.gen.Template %t123, i64 %t124, 5 + %t126 = insertvalue %S.gen.Template %t125, i1 true, 6 + %t127 = load i64, ptr %t101 + %t128 = add i64 %t127, 1 + call void @finch_arr_reserve(ptr %t100, i64 %t128, i64 ptrtoint (ptr getelementptr (%S.gen.Template, ptr null, i32 1) to i64)) + %t129 = load ptr, ptr %t100 + %t130 = getelementptr inbounds %S.gen.Template, ptr %t129, i64 %t127 + store %S.gen.Template %t126, ptr %t130 + store i64 %t128, ptr %t101 + br label %for.step2936 +endif2957: + %t131 = load ptr, ptr %a1 + %t132 = icmp eq ptr %t131, null + br i1 %t132, label %panic2962, label %ok2963 +panic2962: + call void @finch_panic(ptr @.str.1875, i64 1184, ptr @.str.1876) + unreachable +ok2963: + %t133 = getelementptr inbounds %S.gen.Gen, ptr %t131, i32 0, i32 15 + %t134 = getelementptr inbounds { ptr, i64, i64 }, ptr %t133, i32 0, i32 1 + %t135 = load ptr, ptr %a1 + %t136 = icmp eq ptr %t135, null + br i1 %t136, label %panic2964, label %ok2965 +panic2964: + call void @finch_panic(ptr @.str.1877, i64 1184, ptr @.str.1878) + unreachable +ok2965: + %t137 = getelementptr inbounds %S.gen.Gen, ptr %t135, i32 0, i32 13 + %t138 = load { ptr, i64, i64 }, ptr %t137 + store { ptr, i64, i64 } %t138, ptr %a139 + call void @finch_str_copy(ptr %a140, ptr %a139) + %t141 = load { ptr, i64, i64 }, ptr %a140 + %t142 = insertvalue %S.gen.StructDef zeroinitializer, { ptr, i64, i64 } %t141, 0 + %t143 = getelementptr inbounds %S.ast.Node, ptr %a62, i32 0, i32 1 + %t144 = load { ptr, i64, i64 }, ptr %t143 + store { ptr, i64, i64 } %t144, ptr %a145 + call void @finch_str_copy(ptr %a146, ptr %a145) + %t147 = load { ptr, i64, i64 }, ptr %a146 + %t148 = insertvalue %S.gen.StructDef %t142, { ptr, i64, i64 } %t147, 1 + %t149 = load i64, ptr %a7 + %t150 = insertvalue %S.gen.StructDef %t148, i64 %t149, 13 + %t151 = load i64, ptr %a39 + %t152 = insertvalue %S.gen.StructDef %t150, i64 %t151, 14 + %t153 = load i64, ptr %t134 + %t154 = add i64 %t153, 1 + call void @finch_arr_reserve(ptr %t133, i64 %t154, i64 ptrtoint (ptr getelementptr (%S.gen.StructDef, ptr null, i32 1) to i64)) + %t155 = load ptr, ptr %t133 + %t156 = getelementptr inbounds %S.gen.StructDef, ptr %t155, i64 %t153 + store %S.gen.StructDef %t152, ptr %t156 + store i64 %t154, ptr %t134 + br label %for.step2936 +for.step2936: + %t157 = load i64, ptr %a39 + %t158 = add i64 %t157, 1 + store i64 %t158, ptr %a39 + br label %for.cond2934 +for.end2937: + br label %for.step2922 +for.step2922: + %t159 = load i64, ptr %a7 + %t160 = add i64 %t159, 1 + store i64 %t160, ptr %a7 + br label %for.cond2920 +for.end2923: + %t161 = load ptr, ptr %a1 + %t162 = icmp eq ptr %t161, null + br i1 %t162, label %panic2966, label %ok2967 +panic2966: + call void @finch_panic(ptr @.str.1879, i64 1187, ptr @.str.1880) + unreachable +ok2967: + %t163 = getelementptr inbounds %S.gen.Gen, ptr %t161, i32 0, i32 0 + %t164 = getelementptr inbounds { ptr, i64, i64 }, ptr %t163, i32 0, i32 1 + %t165 = load i64, ptr %t164 + store i64 0, ptr %a166 + br label %for.cond2968 +for.cond2968: + %t167 = load i64, ptr %a166 + %t168 = icmp slt i64 %t167, %t165 + br i1 %t168, label %for.body2969, label %for.end2971 +for.body2969: + %t169 = load ptr, ptr %a1 + %t170 = icmp eq ptr %t169, null + br i1 %t170, label %panic2972, label %ok2973 +panic2972: + call void @finch_panic(ptr @.str.1881, i64 1188, ptr @.str.1882) + unreachable +ok2973: + %t171 = getelementptr inbounds %S.gen.Gen, ptr %t169, i32 0, i32 0 + %t172 = load i64, ptr %a166 + %t173 = load { ptr, i64, i64 }, ptr %t171 + %t174 = extractvalue { ptr, i64, i64 } %t173, 1 + %t175 = icmp uge i64 %t172, %t174 + br i1 %t175, label %range2974, label %inrange2975 +range2974: + call void @finch_panic_index(ptr @.str.1883, i64 1188, i64 %t172, i64 %t174) + unreachable +inrange2975: + %t176 = extractvalue { ptr, i64, i64 } %t173, 0 + %t177 = getelementptr inbounds %S.ast.Program, ptr %t176, i64 %t172 + %t178 = getelementptr inbounds %S.ast.Program, ptr %t177, i32 0, i32 0 + %t179 = load { ptr, i64, i64 }, ptr %t178 + %t180 = load ptr, ptr %a1 + %t181 = icmp eq ptr %t180, null + br i1 %t181, label %panic2976, label %ok2977 +panic2976: + call void @finch_panic(ptr @.str.1884, i64 1188, ptr @.str.1885) + unreachable +ok2977: + %t182 = getelementptr inbounds %S.gen.Gen, ptr %t180, i32 0, i32 13 + store { ptr, i64, i64 } %t179, ptr %a183 + call void @finch_str_copy(ptr %a184, ptr %a183) + %t185 = load { ptr, i64, i64 }, ptr %a184 + store { ptr, i64, i64 } %t185, ptr %t182 + %t186 = load ptr, ptr %a1 + %t187 = icmp eq ptr %t186, null + br i1 %t187, label %panic2978, label %ok2979 +panic2978: + call void @finch_panic(ptr @.str.1886, i64 1189, ptr @.str.1887) + unreachable +ok2979: + %t188 = getelementptr inbounds %S.gen.Gen, ptr %t186, i32 0, i32 0 + %t189 = load i64, ptr %a166 + %t190 = load { ptr, i64, i64 }, ptr %t188 + %t191 = extractvalue { ptr, i64, i64 } %t190, 1 + %t192 = icmp uge i64 %t189, %t191 + br i1 %t192, label %range2980, label %inrange2981 +range2980: + call void @finch_panic_index(ptr @.str.1888, i64 1189, i64 %t189, i64 %t191) + unreachable +inrange2981: + %t193 = extractvalue { ptr, i64, i64 } %t190, 0 + %t194 = getelementptr inbounds %S.ast.Program, ptr %t193, i64 %t189 + %t195 = getelementptr inbounds %S.ast.Program, ptr %t194, i32 0, i32 7 + %t196 = getelementptr inbounds { ptr, i64, i64 }, ptr %t195, i32 0, i32 1 + %t197 = load i64, ptr %t196 + store i64 0, ptr %a198 + br label %for.cond2982 +for.cond2982: + %t199 = load i64, ptr %a198 + %t200 = icmp slt i64 %t199, %t197 + br i1 %t200, label %for.body2983, label %for.end2985 +for.body2983: + %t201 = load ptr, ptr %a1 + %t202 = icmp eq ptr %t201, null + br i1 %t202, label %panic2986, label %ok2987 +panic2986: + call void @finch_panic(ptr @.str.1889, i64 1190, ptr @.str.1890) + unreachable +ok2987: + %t203 = getelementptr inbounds %S.gen.Gen, ptr %t201, i32 0, i32 0 + %t204 = load i64, ptr %a166 + %t205 = load { ptr, i64, i64 }, ptr %t203 + %t206 = extractvalue { ptr, i64, i64 } %t205, 1 + %t207 = icmp uge i64 %t204, %t206 + br i1 %t207, label %range2988, label %inrange2989 +range2988: + call void @finch_panic_index(ptr @.str.1891, i64 1190, i64 %t204, i64 %t206) + unreachable +inrange2989: + %t208 = extractvalue { ptr, i64, i64 } %t205, 0 + %t209 = getelementptr inbounds %S.ast.Program, ptr %t208, i64 %t204 + %t210 = getelementptr inbounds %S.ast.Program, ptr %t209, i32 0, i32 7 + %t211 = load i64, ptr %a198 + %t212 = load { ptr, i64, i64 }, ptr %t210 + %t213 = extractvalue { ptr, i64, i64 } %t212, 1 + %t214 = icmp uge i64 %t211, %t213 + br i1 %t214, label %range2990, label %inrange2991 +range2990: + call void @finch_panic_index(ptr @.str.1892, i64 1190, i64 %t211, i64 %t213) + unreachable +inrange2991: + %t215 = extractvalue { ptr, i64, i64 } %t212, 0 + %t216 = getelementptr inbounds %S.ast.Node, ptr %t215, i64 %t211 + %t217 = load %S.ast.Node, ptr %t216 + store %S.ast.Node %t217, ptr %a218 + call void @finch.copy.S_ast_Node(ptr %a219, ptr %a218) + %t220 = load %S.ast.Node, ptr %a219 + store %S.ast.Node %t220, ptr %a221 + %t222 = load ptr, ptr %a1 + %t223 = load ptr, ptr %a1 + %t224 = icmp eq ptr %t223, null + br i1 %t224, label %panic2992, label %ok2993 +panic2992: + call void @finch_panic(ptr @.str.1893, i64 1191, ptr @.str.1894) + unreachable +ok2993: + %t225 = getelementptr inbounds %S.gen.Gen, ptr %t223, i32 0, i32 13 + %t226 = load { ptr, i64, i64 }, ptr %t225 + %t227 = getelementptr inbounds %S.ast.Node, ptr %a221, i32 0, i32 1 + %t228 = load { ptr, i64, i64 }, ptr %t227 + %t229 = call i64 @finch.gen.findEnum(ptr %t222, { ptr, i64, i64 } %t226, { ptr, i64, i64 } %t228) + %t230 = icmp sge i64 %t229, 0 + br label %logic.from2994 +logic.from2994: + br i1 %t230, label %logic.end2996, label %logic.rhs2995 +logic.rhs2995: + %t231 = load ptr, ptr %a1 + %t232 = load ptr, ptr %a1 + %t233 = icmp eq ptr %t232, null + br i1 %t233, label %panic2997, label %ok2998 +panic2997: + call void @finch_panic(ptr @.str.1895, i64 1191, ptr @.str.1896) + unreachable +ok2998: + %t234 = getelementptr inbounds %S.gen.Gen, ptr %t232, i32 0, i32 13 + %t235 = load { ptr, i64, i64 }, ptr %t234 + %t236 = getelementptr inbounds %S.ast.Node, ptr %a221, i32 0, i32 1 + %t237 = load { ptr, i64, i64 }, ptr %t236 + %t238 = call i64 @finch.gen.findStruct(ptr %t231, { ptr, i64, i64 } %t235, { ptr, i64, i64 } %t237) + %t239 = icmp sge i64 %t238, 0 + br label %logic.rend2999 +logic.rend2999: + br label %logic.end2996 +logic.end2996: + %t240 = phi i1 [ true, %logic.from2994 ], [ %t239, %logic.rend2999 ] + br i1 %t240, label %then3000, label %endif3002 +then3000: + %t241 = load ptr, ptr %a1 + %t242 = load %S.ast.Node, ptr %a221 + %t243 = getelementptr inbounds %S.ast.Node, ptr %a221, i32 0, i32 1 + %t244 = load { ptr, i64, i64 }, ptr %t243 + store { ptr, i64, i64 } { ptr @.str.1897, i64 1, i64 0 }, ptr %a246 + store { ptr, i64, i64 } %t244, ptr %a247 + call void @finch_str_concat(ptr %a245, ptr %a246, ptr %a247) + %t248 = load { ptr, i64, i64 }, ptr %a245 + store { ptr, i64, i64 } %t248, ptr %a250 + store { ptr, i64, i64 } { ptr @.str.1898, i64 18, i64 0 }, ptr %a251 + call void @finch_str_concat(ptr %a249, ptr %a250, ptr %a251) + %t252 = load { ptr, i64, i64 }, ptr %a249 + call void @finch.gen.fail(ptr %t241, %S.ast.Node %t242, { ptr, i64, i64 } %t252) + br label %endif3002 +endif3002: + %t253 = load ptr, ptr %a1 + %t254 = icmp eq ptr %t253, null + br i1 %t254, label %panic3003, label %ok3004 +panic3003: + call void @finch_panic(ptr @.str.1899, i64 1194, ptr @.str.1900) + unreachable +ok3004: + %t255 = getelementptr inbounds %S.gen.Gen, ptr %t253, i32 0, i32 13 + %t256 = load { ptr, i64, i64 }, ptr %t255 + store { ptr, i64, i64 } %t256, ptr %a257 + call void @finch_str_copy(ptr %a258, ptr %a257) + %t259 = load { ptr, i64, i64 }, ptr %a258 + %t260 = insertvalue %S.gen.EnumDef zeroinitializer, { ptr, i64, i64 } %t259, 0 + %t261 = getelementptr inbounds %S.ast.Node, ptr %a221, i32 0, i32 1 + %t262 = load { ptr, i64, i64 }, ptr %t261 + store { ptr, i64, i64 } %t262, ptr %a263 + call void @finch_str_copy(ptr %a264, ptr %a263) + %t265 = load { ptr, i64, i64 }, ptr %a264 + %t266 = insertvalue %S.gen.EnumDef %t260, { ptr, i64, i64 } %t265, 1 + store %S.gen.EnumDef %t266, ptr %a267 + store i64 0, ptr %a268 + %t269 = getelementptr inbounds %S.ast.Node, ptr %a221, i32 0, i32 9 + store i64 0, ptr %a270 + br label %each.cond3005 +each.cond3005: + %t271 = getelementptr inbounds { ptr, i64, i64 }, ptr %t269, i32 0, i32 1 + %t272 = load i64, ptr %t271 + %t273 = load i64, ptr %a270 + %t274 = icmp slt i64 %t273, %t272 + br i1 %t274, label %each.body3006, label %each.end3008 +each.body3006: + %t275 = load ptr, ptr %t269 + %t276 = getelementptr inbounds %S.ast.Node, ptr %t275, i64 %t273 + %t277 = load %S.ast.Node, ptr %t276 + store %S.ast.Node %t277, ptr %a278 + %t279 = getelementptr inbounds %S.ast.Node, ptr %a278, i32 0, i32 4 + %t280 = getelementptr inbounds { ptr, i64, i64 }, ptr %t279, i32 0, i32 1 + %t281 = load i64, ptr %t280 + %t282 = icmp sgt i64 %t281, 0 + br i1 %t282, label %then3009, label %endif3011 +then3009: + %t283 = getelementptr inbounds %S.ast.Node, ptr %a278, i32 0, i32 4 + %t284 = load { ptr, i64, i64 }, ptr %t283 + store { ptr, i64, i64 } %t284, ptr %a285 + %t286 = call i64 @finch_str_to_int(ptr %a285, ptr @.str.1901, i64 1198) + store i64 %t286, ptr %a268 + br label %endif3011 +endif3011: + %t287 = getelementptr inbounds %S.gen.EnumDef, ptr %a267, i32 0, i32 2 + %t288 = getelementptr inbounds { ptr, i64, i64 }, ptr %t287, i32 0, i32 1 + %t289 = getelementptr inbounds %S.ast.Node, ptr %a278, i32 0, i32 1 + %t290 = load { ptr, i64, i64 }, ptr %t289 + store i64 -1, ptr %a291 + %t292 = load i64, ptr %t288 + %t293 = load ptr, ptr %t287 + store i64 0, ptr %a294 + br label %find.cond3012 +find.cond3012: + %t295 = load i64, ptr %a294 + %t296 = icmp slt i64 %t295, %t292 + br i1 %t296, label %find.body3013, label %find.end3016 +find.body3013: + %t297 = getelementptr inbounds { ptr, i64, i64 }, ptr %t293, i64 %t295 + %t298 = load { ptr, i64, i64 }, ptr %t297 + store { ptr, i64, i64 } %t298, ptr %a299 + store { ptr, i64, i64 } %t290, ptr %a300 + %t301 = call i32 @finch_str_eq(ptr %a299, ptr %a300) + %t302 = icmp ne i32 %t301, 0 + br i1 %t302, label %find.hit3014, label %find.next3015 +find.hit3014: + store i64 %t295, ptr %a291 + br label %find.end3016 +find.next3015: + %t303 = add i64 %t295, 1 + store i64 %t303, ptr %a294 + br label %find.cond3012 +find.end3016: + %t304 = load i64, ptr %a291 + %t305 = icmp sge i64 %t304, 0 + br i1 %t305, label %then3017, label %endif3019 +then3017: + %t306 = load ptr, ptr %a1 + %t307 = load %S.ast.Node, ptr %a278 + %t308 = getelementptr inbounds %S.ast.Node, ptr %a221, i32 0, i32 1 + %t309 = load { ptr, i64, i64 }, ptr %t308 + store { ptr, i64, i64 } { ptr @.str.1902, i64 9, i64 0 }, ptr %a311 + store { ptr, i64, i64 } %t309, ptr %a312 + call void @finch_str_concat(ptr %a310, ptr %a311, ptr %a312) + %t313 = load { ptr, i64, i64 }, ptr %a310 + store { ptr, i64, i64 } %t313, ptr %a315 + store { ptr, i64, i64 } { ptr @.str.1903, i64 17, i64 0 }, ptr %a316 + call void @finch_str_concat(ptr %a314, ptr %a315, ptr %a316) + %t317 = load { ptr, i64, i64 }, ptr %a314 + %t318 = getelementptr inbounds %S.ast.Node, ptr %a278, i32 0, i32 1 + %t319 = load { ptr, i64, i64 }, ptr %t318 + store { ptr, i64, i64 } %t317, ptr %a321 + store { ptr, i64, i64 } %t319, ptr %a322 + call void @finch_str_concat(ptr %a320, ptr %a321, ptr %a322) + %t323 = load { ptr, i64, i64 }, ptr %a320 + store { ptr, i64, i64 } %t323, ptr %a325 + store { ptr, i64, i64 } { ptr @.str.1904, i64 6, i64 0 }, ptr %a326 + call void @finch_str_concat(ptr %a324, ptr %a325, ptr %a326) + %t327 = load { ptr, i64, i64 }, ptr %a324 + call void @finch.gen.fail(ptr %t306, %S.ast.Node %t307, { ptr, i64, i64 } %t327) + br label %endif3019 +endif3019: + %t328 = getelementptr inbounds %S.gen.EnumDef, ptr %a267, i32 0, i32 3 + %t329 = getelementptr inbounds { ptr, i64, i64 }, ptr %t328, i32 0, i32 1 + %t330 = load i64, ptr %a268 + store i64 -1, ptr %a331 + %t332 = load i64, ptr %t329 + %t333 = load ptr, ptr %t328 + store i64 0, ptr %a334 + br label %find.cond3020 +find.cond3020: + %t335 = load i64, ptr %a334 + %t336 = icmp slt i64 %t335, %t332 + br i1 %t336, label %find.body3021, label %find.end3024 +find.body3021: + %t337 = getelementptr inbounds i64, ptr %t333, i64 %t335 + %t338 = load i64, ptr %t337 + %t339 = icmp eq i64 %t338, %t330 + br i1 %t339, label %find.hit3022, label %find.next3023 +find.hit3022: + store i64 %t335, ptr %a331 + br label %find.end3024 +find.next3023: + %t340 = add i64 %t335, 1 + store i64 %t340, ptr %a334 + br label %find.cond3020 +find.end3024: + %t341 = load i64, ptr %a331 + %t342 = icmp sge i64 %t341, 0 + br i1 %t342, label %then3025, label %endif3027 +then3025: + %t343 = load ptr, ptr %a1 + %t344 = load %S.ast.Node, ptr %a278 + %t345 = getelementptr inbounds %S.ast.Node, ptr %a221, i32 0, i32 1 + %t346 = load { ptr, i64, i64 }, ptr %t345 + store { ptr, i64, i64 } { ptr @.str.1905, i64 16, i64 0 }, ptr %a348 + store { ptr, i64, i64 } %t346, ptr %a349 + call void @finch_str_concat(ptr %a347, ptr %a348, ptr %a349) + %t350 = load { ptr, i64, i64 }, ptr %a347 + store { ptr, i64, i64 } %t350, ptr %a352 + store { ptr, i64, i64 } { ptr @.str.1906, i64 17, i64 0 }, ptr %a353 + call void @finch_str_concat(ptr %a351, ptr %a352, ptr %a353) + %t354 = load { ptr, i64, i64 }, ptr %a351 + %t355 = load i64, ptr %a268 + call void @finch_str_from_int(ptr %a356, i64 %t355) + %t357 = load { ptr, i64, i64 }, ptr %a356 + store { ptr, i64, i64 } %t354, ptr %a359 + store { ptr, i64, i64 } %t357, ptr %a360 + call void @finch_str_concat(ptr %a358, ptr %a359, ptr %a360) + %t361 = load { ptr, i64, i64 }, ptr %a358 + store { ptr, i64, i64 } %t361, ptr %a363 + store { ptr, i64, i64 } { ptr @.str.1907, i64 20, i64 0 }, ptr %a364 + call void @finch_str_concat(ptr %a362, ptr %a363, ptr %a364) + %t365 = load { ptr, i64, i64 }, ptr %a362 + call void @finch.gen.fail(ptr %t343, %S.ast.Node %t344, { ptr, i64, i64 } %t365) + br label %endif3027 +endif3027: + %t366 = getelementptr inbounds %S.gen.EnumDef, ptr %a267, i32 0, i32 2 + %t367 = getelementptr inbounds { ptr, i64, i64 }, ptr %t366, i32 0, i32 1 + %t368 = getelementptr inbounds %S.ast.Node, ptr %a278, i32 0, i32 1 + %t369 = load { ptr, i64, i64 }, ptr %t368 + store { ptr, i64, i64 } %t369, ptr %a370 + call void @finch_str_copy(ptr %a371, ptr %a370) + %t372 = load { ptr, i64, i64 }, ptr %a371 + %t373 = load i64, ptr %t367 + %t374 = add i64 %t373, 1 + call void @finch_arr_reserve(ptr %t366, i64 %t374, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t375 = load ptr, ptr %t366 + %t376 = getelementptr inbounds { ptr, i64, i64 }, ptr %t375, i64 %t373 + store { ptr, i64, i64 } %t372, ptr %t376 + store i64 %t374, ptr %t367 + %t377 = getelementptr inbounds %S.gen.EnumDef, ptr %a267, i32 0, i32 3 + %t378 = getelementptr inbounds { ptr, i64, i64 }, ptr %t377, i32 0, i32 1 + %t379 = load i64, ptr %a268 + %t380 = load i64, ptr %t378 + %t381 = add i64 %t380, 1 + call void @finch_arr_reserve(ptr %t377, i64 %t381, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t382 = load ptr, ptr %t377 + %t383 = getelementptr inbounds i64, ptr %t382, i64 %t380 + store i64 %t379, ptr %t383 + store i64 %t381, ptr %t378 + %t384 = load i64, ptr %a268 + %t385 = add i64 %t384, 1 + store i64 %t385, ptr %a268 + br label %each.step3007 +each.step3007: + %t386 = load i64, ptr %a270 + %t387 = add i64 %t386, 1 + store i64 %t387, ptr %a270 + br label %each.cond3005 +each.end3008: + %t388 = load ptr, ptr %a1 + %t389 = icmp eq ptr %t388, null + br i1 %t389, label %panic3028, label %ok3029 +panic3028: + call void @finch_panic(ptr @.str.1908, i64 1210, ptr @.str.1909) + unreachable +ok3029: + %t390 = getelementptr inbounds %S.gen.Gen, ptr %t388, i32 0, i32 20 + %t391 = getelementptr inbounds { ptr, i64, i64 }, ptr %t390, i32 0, i32 1 + %t392 = load %S.gen.EnumDef, ptr %a267 + store %S.gen.EnumDef %t392, ptr %a393 + call void @finch.copy.S_gen_EnumDef(ptr %a394, ptr %a393) + %t395 = load %S.gen.EnumDef, ptr %a394 + %t396 = load i64, ptr %t391 + %t397 = add i64 %t396, 1 + call void @finch_arr_reserve(ptr %t390, i64 %t397, i64 ptrtoint (ptr getelementptr (%S.gen.EnumDef, ptr null, i32 1) to i64)) + %t398 = load ptr, ptr %t390 + %t399 = getelementptr inbounds %S.gen.EnumDef, ptr %t398, i64 %t396 + store %S.gen.EnumDef %t395, ptr %t399 + store i64 %t397, ptr %t391 + br label %for.step2984 +for.step2984: + %t400 = load i64, ptr %a198 + %t401 = add i64 %t400, 1 + store i64 %t401, ptr %a198 + br label %for.cond2982 +for.end2985: + br label %for.step2970 +for.step2970: + %t402 = load i64, ptr %a166 + %t403 = add i64 %t402, 1 + store i64 %t403, ptr %a166 + br label %for.cond2968 +for.end2971: + %t404 = load ptr, ptr %a1 + %t405 = icmp eq ptr %t404, null + br i1 %t405, label %panic3030, label %ok3031 +panic3030: + call void @finch_panic(ptr @.str.1910, i64 1213, ptr @.str.1911) + unreachable +ok3031: + %t406 = getelementptr inbounds %S.gen.Gen, ptr %t404, i32 0, i32 24 + %t407 = getelementptr inbounds %S.cimport.CImports, ptr %t406, i32 0, i32 4 + %t408 = getelementptr inbounds { ptr, i64, i64 }, ptr %t407, i32 0, i32 1 + %t409 = load i64, ptr %t408 + store i64 0, ptr %a410 + br label %for.cond3032 +for.cond3032: + %t411 = load i64, ptr %a410 + %t412 = icmp slt i64 %t411, %t409 + br i1 %t412, label %for.body3033, label %for.end3035 +for.body3033: + %t413 = load ptr, ptr %a1 + %t414 = icmp eq ptr %t413, null + br i1 %t414, label %panic3036, label %ok3037 +panic3036: + call void @finch_panic(ptr @.str.1912, i64 1214, ptr @.str.1913) + unreachable +ok3037: + %t415 = getelementptr inbounds %S.gen.Gen, ptr %t413, i32 0, i32 15 + %t416 = getelementptr inbounds { ptr, i64, i64 }, ptr %t415, i32 0, i32 1 + %t417 = insertvalue %S.gen.StructDef zeroinitializer, { ptr, i64, i64 } { ptr @.str.1914, i64 1, i64 0 }, 0 + %t418 = load ptr, ptr %a1 + %t419 = icmp eq ptr %t418, null + br i1 %t419, label %panic3038, label %ok3039 +panic3038: + call void @finch_panic(ptr @.str.1915, i64 1214, ptr @.str.1916) + unreachable +ok3039: + %t420 = getelementptr inbounds %S.gen.Gen, ptr %t418, i32 0, i32 24 + %t421 = getelementptr inbounds %S.cimport.CImports, ptr %t420, i32 0, i32 4 + %t422 = load i64, ptr %a410 + %t423 = load { ptr, i64, i64 }, ptr %t421 + %t424 = extractvalue { ptr, i64, i64 } %t423, 1 + %t425 = icmp uge i64 %t422, %t424 + br i1 %t425, label %range3040, label %inrange3041 +range3040: + call void @finch_panic_index(ptr @.str.1917, i64 1214, i64 %t422, i64 %t424) + unreachable +inrange3041: + %t426 = extractvalue { ptr, i64, i64 } %t423, 0 + %t427 = getelementptr inbounds { ptr, i64, i64 }, ptr %t426, i64 %t422 + %t428 = load { ptr, i64, i64 }, ptr %t427 + store { ptr, i64, i64 } %t428, ptr %a429 + call void @finch_str_copy(ptr %a430, ptr %a429) + %t431 = load { ptr, i64, i64 }, ptr %a430 + %t432 = insertvalue %S.gen.StructDef %t417, { ptr, i64, i64 } %t431, 1 + %t433 = insertvalue %S.gen.StructDef %t432, i1 true, 2 + %t434 = insertvalue %S.gen.StructDef %t433, i64 -1, 13 + %t435 = load i64, ptr %a410 + %t436 = insertvalue %S.gen.StructDef %t434, i64 %t435, 14 + %t437 = load i64, ptr %t416 + %t438 = add i64 %t437, 1 + call void @finch_arr_reserve(ptr %t415, i64 %t438, i64 ptrtoint (ptr getelementptr (%S.gen.StructDef, ptr null, i32 1) to i64)) + %t439 = load ptr, ptr %t415 + %t440 = getelementptr inbounds %S.gen.StructDef, ptr %t439, i64 %t437 + store %S.gen.StructDef %t436, ptr %t440 + store i64 %t438, ptr %t416 + br label %for.step3034 +for.step3034: + %t441 = load i64, ptr %a410 + %t442 = add i64 %t441, 1 + store i64 %t442, ptr %a410 + br label %for.cond3032 +for.end3035: + %t443 = load ptr, ptr %a1 + %t444 = icmp eq ptr %t443, null + br i1 %t444, label %panic3042, label %ok3043 +panic3042: + call void @finch_panic(ptr @.str.1918, i64 1216, ptr @.str.1919) + unreachable +ok3043: + %t445 = getelementptr inbounds %S.gen.Gen, ptr %t443, i32 0, i32 15 + %t446 = getelementptr inbounds { ptr, i64, i64 }, ptr %t445, i32 0, i32 1 + %t447 = load i64, ptr %t446 + store i64 0, ptr %a448 + br label %for.cond3044 +for.cond3044: + %t449 = load i64, ptr %a448 + %t450 = icmp slt i64 %t449, %t447 + br i1 %t450, label %for.body3045, label %for.end3047 +for.body3045: + %t451 = load ptr, ptr %a1 + %t452 = load i64, ptr %a448 + call void @finch.gen.resolveStruct(ptr %t451, i64 %t452) + br label %for.step3046 +for.step3046: + %t453 = load i64, ptr %a448 + %t454 = add i64 %t453, 1 + store i64 %t454, ptr %a448 + br label %for.cond3044 +for.end3047: + %t455 = load ptr, ptr %a1 + %t456 = icmp eq ptr %t455, null + br i1 %t456, label %panic3048, label %ok3049 +panic3048: + call void @finch_panic(ptr @.str.1920, i64 1219, ptr @.str.1921) + unreachable +ok3049: + %t457 = getelementptr inbounds %S.gen.Gen, ptr %t455, i32 0, i32 0 + %t458 = getelementptr inbounds { ptr, i64, i64 }, ptr %t457, i32 0, i32 1 + %t459 = load i64, ptr %t458 + store i64 0, ptr %a460 + br label %for.cond3050 +for.cond3050: + %t461 = load i64, ptr %a460 + %t462 = icmp slt i64 %t461, %t459 + br i1 %t462, label %for.body3051, label %for.end3053 +for.body3051: + %t463 = load ptr, ptr %a1 + %t464 = icmp eq ptr %t463, null + br i1 %t464, label %panic3054, label %ok3055 +panic3054: + call void @finch_panic(ptr @.str.1922, i64 1220, ptr @.str.1923) + unreachable +ok3055: + %t465 = getelementptr inbounds %S.gen.Gen, ptr %t463, i32 0, i32 0 + %t466 = load i64, ptr %a460 + %t467 = load { ptr, i64, i64 }, ptr %t465 + %t468 = extractvalue { ptr, i64, i64 } %t467, 1 + %t469 = icmp uge i64 %t466, %t468 + br i1 %t469, label %range3056, label %inrange3057 +range3056: + call void @finch_panic_index(ptr @.str.1924, i64 1220, i64 %t466, i64 %t468) + unreachable +inrange3057: + %t470 = extractvalue { ptr, i64, i64 } %t467, 0 + %t471 = getelementptr inbounds %S.ast.Program, ptr %t470, i64 %t466 + %t472 = getelementptr inbounds %S.ast.Program, ptr %t471, i32 0, i32 0 + %t473 = load { ptr, i64, i64 }, ptr %t472 + %t474 = load ptr, ptr %a1 + %t475 = icmp eq ptr %t474, null + br i1 %t475, label %panic3058, label %ok3059 +panic3058: + call void @finch_panic(ptr @.str.1925, i64 1220, ptr @.str.1926) + unreachable +ok3059: + %t476 = getelementptr inbounds %S.gen.Gen, ptr %t474, i32 0, i32 13 + store { ptr, i64, i64 } %t473, ptr %a477 + call void @finch_str_copy(ptr %a478, ptr %a477) + %t479 = load { ptr, i64, i64 }, ptr %a478 + store { ptr, i64, i64 } %t479, ptr %t476 + %t480 = load ptr, ptr %a1 + %t481 = icmp eq ptr %t480, null + br i1 %t481, label %panic3060, label %ok3061 +panic3060: + call void @finch_panic(ptr @.str.1927, i64 1221, ptr @.str.1928) + unreachable +ok3061: + %t482 = getelementptr inbounds %S.gen.Gen, ptr %t480, i32 0, i32 0 + %t483 = load i64, ptr %a460 + %t484 = load { ptr, i64, i64 }, ptr %t482 + %t485 = extractvalue { ptr, i64, i64 } %t484, 1 + %t486 = icmp uge i64 %t483, %t485 + br i1 %t486, label %range3062, label %inrange3063 +range3062: + call void @finch_panic_index(ptr @.str.1929, i64 1221, i64 %t483, i64 %t485) + unreachable +inrange3063: + %t487 = extractvalue { ptr, i64, i64 } %t484, 0 + %t488 = getelementptr inbounds %S.ast.Program, ptr %t487, i64 %t483 + %t489 = getelementptr inbounds %S.ast.Program, ptr %t488, i32 0, i32 8 + %t490 = getelementptr inbounds { ptr, i64, i64 }, ptr %t489, i32 0, i32 1 + %t491 = load i64, ptr %t490 + store i64 0, ptr %a492 + br label %for.cond3064 +for.cond3064: + %t493 = load i64, ptr %a492 + %t494 = icmp slt i64 %t493, %t491 + br i1 %t494, label %for.body3065, label %for.end3067 +for.body3065: + %t495 = load ptr, ptr %a1 + %t496 = icmp eq ptr %t495, null + br i1 %t496, label %panic3068, label %ok3069 +panic3068: + call void @finch_panic(ptr @.str.1930, i64 1222, ptr @.str.1931) + unreachable +ok3069: + %t497 = getelementptr inbounds %S.gen.Gen, ptr %t495, i32 0, i32 0 + %t498 = load i64, ptr %a460 + %t499 = load { ptr, i64, i64 }, ptr %t497 + %t500 = extractvalue { ptr, i64, i64 } %t499, 1 + %t501 = icmp uge i64 %t498, %t500 + br i1 %t501, label %range3070, label %inrange3071 +range3070: + call void @finch_panic_index(ptr @.str.1932, i64 1222, i64 %t498, i64 %t500) + unreachable +inrange3071: + %t502 = extractvalue { ptr, i64, i64 } %t499, 0 + %t503 = getelementptr inbounds %S.ast.Program, ptr %t502, i64 %t498 + %t504 = getelementptr inbounds %S.ast.Program, ptr %t503, i32 0, i32 8 + %t505 = load i64, ptr %a492 + %t506 = load { ptr, i64, i64 }, ptr %t504 + %t507 = extractvalue { ptr, i64, i64 } %t506, 1 + %t508 = icmp uge i64 %t505, %t507 + br i1 %t508, label %range3072, label %inrange3073 +range3072: + call void @finch_panic_index(ptr @.str.1933, i64 1222, i64 %t505, i64 %t507) + unreachable +inrange3073: + %t509 = extractvalue { ptr, i64, i64 } %t506, 0 + %t510 = getelementptr inbounds %S.ast.Node, ptr %t509, i64 %t505 + %t511 = load %S.ast.Node, ptr %t510 + store %S.ast.Node %t511, ptr %a512 + call void @finch.copy.S_ast_Node(ptr %a513, ptr %a512) + %t514 = load %S.ast.Node, ptr %a513 + store %S.ast.Node %t514, ptr %a515 + %t516 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 3 + %t517 = getelementptr inbounds { ptr, i64, i64 }, ptr %t516, i32 0, i32 1 + %t518 = load i64, ptr %t517 + %t519 = icmp sgt i64 %t518, 0 + br i1 %t519, label %then3074, label %endif3076 +then3074: + %t520 = load ptr, ptr %a1 + %t521 = load ptr, ptr %a1 + %t522 = icmp eq ptr %t521, null + br i1 %t522, label %panic3077, label %ok3078 +panic3077: + call void @finch_panic(ptr @.str.1934, i64 1225, ptr @.str.1935) + unreachable +ok3078: + %t523 = getelementptr inbounds %S.gen.Gen, ptr %t521, i32 0, i32 13 + %t524 = load { ptr, i64, i64 }, ptr %t523 + %t525 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t526 = load { ptr, i64, i64 }, ptr %t525 + %t527 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t528 = load { ptr, i64, i64 }, ptr %t527 + %t529 = call i64 @finch.gen.findTemplate(ptr %t520, { ptr, i64, i64 } %t524, { ptr, i64, i64 } %t526, { ptr, i64, i64 } %t528, i1 false) + %t530 = icmp sge i64 %t529, 0 + br i1 %t530, label %then3079, label %endif3081 +then3079: + %t531 = load ptr, ptr %a1 + %t532 = load %S.ast.Node, ptr %a515 + %t533 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t534 = load { ptr, i64, i64 }, ptr %t533 + store { ptr, i64, i64 } { ptr @.str.1936, i64 10, i64 0 }, ptr %a536 + store { ptr, i64, i64 } %t534, ptr %a537 + call void @finch_str_concat(ptr %a535, ptr %a536, ptr %a537) + %t538 = load { ptr, i64, i64 }, ptr %a535 + store { ptr, i64, i64 } %t538, ptr %a540 + store { ptr, i64, i64 } { ptr @.str.1937, i64 18, i64 0 }, ptr %a541 + call void @finch_str_concat(ptr %a539, ptr %a540, ptr %a541) + %t542 = load { ptr, i64, i64 }, ptr %a539 + call void @finch.gen.fail(ptr %t531, %S.ast.Node %t532, { ptr, i64, i64 } %t542) + br label %endif3081 +endif3081: + %t543 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t544 = getelementptr inbounds { ptr, i64, i64 }, ptr %t543, i32 0, i32 1 + %t545 = load i64, ptr %t544 + %t546 = icmp sgt i64 %t545, 0 + br label %logic.from3082 +logic.from3082: + br i1 %t546, label %logic.rhs3083, label %logic.end3084 +logic.rhs3083: + %t547 = load ptr, ptr %a1 + %t548 = load ptr, ptr %a1 + %t549 = icmp eq ptr %t548, null + br i1 %t549, label %panic3085, label %ok3086 +panic3085: + call void @finch_panic(ptr @.str.1938, i64 1228, ptr @.str.1939) + unreachable +ok3086: + %t550 = getelementptr inbounds %S.gen.Gen, ptr %t548, i32 0, i32 13 + %t551 = load { ptr, i64, i64 }, ptr %t550 + %t552 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t553 = load { ptr, i64, i64 }, ptr %t552 + %t554 = call i64 @finch.gen.findTemplate(ptr %t547, { ptr, i64, i64 } %t551, { ptr, i64, i64 } %t553, { ptr, i64, i64 } { ptr @.str.1940, i64 0, i64 0 }, i1 true) + %t555 = icmp slt i64 %t554, 0 + br label %logic.rend3087 +logic.rend3087: + br label %logic.end3084 +logic.end3084: + %t556 = phi i1 [ false, %logic.from3082 ], [ %t555, %logic.rend3087 ] + br i1 %t556, label %then3088, label %endif3090 +then3088: + %t557 = load ptr, ptr %a1 + %t558 = load %S.ast.Node, ptr %a515 + %t559 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t560 = load { ptr, i64, i64 }, ptr %t559 + store { ptr, i64, i64 } { ptr @.str.1941, i64 34, i64 0 }, ptr %a562 + store { ptr, i64, i64 } %t560, ptr %a563 + call void @finch_str_concat(ptr %a561, ptr %a562, ptr %a563) + %t564 = load { ptr, i64, i64 }, ptr %a561 + store { ptr, i64, i64 } %t564, ptr %a566 + store { ptr, i64, i64 } { ptr @.str.1942, i64 53, i64 0 }, ptr %a567 + call void @finch_str_concat(ptr %a565, ptr %a566, ptr %a567) + %t568 = load { ptr, i64, i64 }, ptr %a565 + call void @finch.gen.fail(ptr %t557, %S.ast.Node %t558, { ptr, i64, i64 } %t568) + br label %endif3090 +endif3090: + %t569 = load ptr, ptr %a1 + %t570 = icmp eq ptr %t569, null + br i1 %t570, label %panic3091, label %ok3092 +panic3091: + call void @finch_panic(ptr @.str.1943, i64 1231, ptr @.str.1944) + unreachable +ok3092: + %t571 = getelementptr inbounds %S.gen.Gen, ptr %t569, i32 0, i32 16 + %t572 = getelementptr inbounds { ptr, i64, i64 }, ptr %t571, i32 0, i32 1 + %t573 = load ptr, ptr %a1 + %t574 = icmp eq ptr %t573, null + br i1 %t574, label %panic3093, label %ok3094 +panic3093: + call void @finch_panic(ptr @.str.1945, i64 1231, ptr @.str.1946) + unreachable +ok3094: + %t575 = getelementptr inbounds %S.gen.Gen, ptr %t573, i32 0, i32 13 + %t576 = load { ptr, i64, i64 }, ptr %t575 + store { ptr, i64, i64 } %t576, ptr %a577 + call void @finch_str_copy(ptr %a578, ptr %a577) + %t579 = load { ptr, i64, i64 }, ptr %a578 + %t580 = insertvalue %S.gen.Template zeroinitializer, { ptr, i64, i64 } %t579, 0 + %t581 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t582 = load { ptr, i64, i64 }, ptr %t581 + store { ptr, i64, i64 } %t582, ptr %a583 + call void @finch_str_copy(ptr %a584, ptr %a583) + %t585 = load { ptr, i64, i64 }, ptr %a584 + %t586 = insertvalue %S.gen.Template %t580, { ptr, i64, i64 } %t585, 1 + %t587 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t588 = load { ptr, i64, i64 }, ptr %t587 + store { ptr, i64, i64 } %t588, ptr %a589 + call void @finch_str_copy(ptr %a590, ptr %a589) + %t591 = load { ptr, i64, i64 }, ptr %a590 + %t592 = insertvalue %S.gen.Template %t586, { ptr, i64, i64 } %t591, 2 + %t593 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 3 + %t594 = load { ptr, i64, i64 }, ptr %t593 + store { ptr, i64, i64 } %t594, ptr %a595 + call void @finch.copy.arr_str(ptr %a596, ptr %a595) + %t597 = load { ptr, i64, i64 }, ptr %a596 + %t598 = insertvalue %S.gen.Template %t592, { ptr, i64, i64 } %t597, 3 + %t599 = load i64, ptr %a460 + %t600 = insertvalue %S.gen.Template %t598, i64 %t599, 4 + %t601 = load i64, ptr %a492 + %t602 = insertvalue %S.gen.Template %t600, i64 %t601, 5 + %t603 = load i64, ptr %t572 + %t604 = add i64 %t603, 1 + call void @finch_arr_reserve(ptr %t571, i64 %t604, i64 ptrtoint (ptr getelementptr (%S.gen.Template, ptr null, i32 1) to i64)) + %t605 = load ptr, ptr %t571 + %t606 = getelementptr inbounds %S.gen.Template, ptr %t605, i64 %t603 + store %S.gen.Template %t602, ptr %t606 + store i64 %t604, ptr %t572 + br label %for.step3066 +endif3076: + %t607 = load ptr, ptr %a1 + %t608 = icmp eq ptr %t607, null + br i1 %t608, label %panic3095, label %ok3096 +panic3095: + call void @finch_panic(ptr @.str.1947, i64 1234, ptr @.str.1948) + unreachable +ok3096: + %t609 = getelementptr inbounds %S.gen.Gen, ptr %t607, i32 0, i32 13 + %t610 = load { ptr, i64, i64 }, ptr %t609 + store { ptr, i64, i64 } %t610, ptr %a611 + call void @finch_str_copy(ptr %a612, ptr %a611) + %t613 = load { ptr, i64, i64 }, ptr %a612 + store { ptr, i64, i64 } %t613, ptr %a614 + store i1 false, ptr %a615 + %t616 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t617 = getelementptr inbounds { ptr, i64, i64 }, ptr %t616, i32 0, i32 1 + %t618 = load i64, ptr %t617 + %t619 = icmp sgt i64 %t618, 0 + br label %logic.from3097 +logic.from3097: + br i1 %t619, label %logic.rhs3098, label %logic.end3099 +logic.rhs3098: + %t620 = load ptr, ptr %a1 + %t621 = load ptr, ptr %a1 + %t622 = icmp eq ptr %t621, null + br i1 %t622, label %panic3100, label %ok3101 +panic3100: + call void @finch_panic(ptr @.str.1949, i64 1236, ptr @.str.1950) + unreachable +ok3101: + %t623 = getelementptr inbounds %S.gen.Gen, ptr %t621, i32 0, i32 13 + %t624 = load { ptr, i64, i64 }, ptr %t623 + %t625 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t626 = load { ptr, i64, i64 }, ptr %t625 + %t627 = call i64 @finch.gen.findEnum(ptr %t620, { ptr, i64, i64 } %t624, { ptr, i64, i64 } %t626) + %t628 = icmp sge i64 %t627, 0 + br label %logic.rend3102 +logic.rend3102: + br label %logic.end3099 +logic.end3099: + %t629 = phi i1 [ false, %logic.from3097 ], [ %t628, %logic.rend3102 ] + br i1 %t629, label %then3103, label %else3104 +then3103: + store i1 true, ptr %a615 + %t630 = load ptr, ptr %a1 + %t631 = load { ptr, i64, i64 }, ptr %a614 + %t632 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t633 = load { ptr, i64, i64 }, ptr %t632 + %t634 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t635 = load { ptr, i64, i64 }, ptr %t634 + %t636 = call i64 @finch.gen.findMethod(ptr %t630, { ptr, i64, i64 } %t631, { ptr, i64, i64 } %t633, { ptr, i64, i64 } %t635) + %t637 = icmp sge i64 %t636, 0 + br i1 %t637, label %then3106, label %endif3108 +then3106: + %t638 = load ptr, ptr %a1 + %t639 = load %S.ast.Node, ptr %a515 + %t640 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t641 = load { ptr, i64, i64 }, ptr %t640 + store { ptr, i64, i64 } { ptr @.str.1951, i64 11, i64 0 }, ptr %a643 + store { ptr, i64, i64 } %t641, ptr %a644 + call void @finch_str_concat(ptr %a642, ptr %a643, ptr %a644) + %t645 = load { ptr, i64, i64 }, ptr %a642 + store { ptr, i64, i64 } %t645, ptr %a647 + store { ptr, i64, i64 } { ptr @.str.1952, i64 1, i64 0 }, ptr %a648 + call void @finch_str_concat(ptr %a646, ptr %a647, ptr %a648) + %t649 = load { ptr, i64, i64 }, ptr %a646 + %t650 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t651 = load { ptr, i64, i64 }, ptr %t650 + store { ptr, i64, i64 } %t649, ptr %a653 + store { ptr, i64, i64 } %t651, ptr %a654 + call void @finch_str_concat(ptr %a652, ptr %a653, ptr %a654) + %t655 = load { ptr, i64, i64 }, ptr %a652 + store { ptr, i64, i64 } %t655, ptr %a657 + store { ptr, i64, i64 } { ptr @.str.1953, i64 17, i64 0 }, ptr %a658 + call void @finch_str_concat(ptr %a656, ptr %a657, ptr %a658) + %t659 = load { ptr, i64, i64 }, ptr %a656 + call void @finch.gen.fail(ptr %t638, %S.ast.Node %t639, { ptr, i64, i64 } %t659) + br label %endif3108 +endif3108: + br label %endif3105 +else3104: + %t660 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t661 = getelementptr inbounds { ptr, i64, i64 }, ptr %t660, i32 0, i32 1 + %t662 = load i64, ptr %t661 + %t663 = icmp sgt i64 %t662, 0 + br i1 %t663, label %then3109, label %else3110 +then3109: + %t664 = load ptr, ptr %a1 + %t665 = load ptr, ptr %a1 + %t666 = icmp eq ptr %t665, null + br i1 %t666, label %panic3112, label %ok3113 +panic3112: + call void @finch_panic(ptr @.str.1954, i64 1242, ptr @.str.1955) + unreachable +ok3113: + %t667 = getelementptr inbounds %S.gen.Gen, ptr %t665, i32 0, i32 13 + %t668 = load { ptr, i64, i64 }, ptr %t667 + %t669 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t670 = load { ptr, i64, i64 }, ptr %t669 + %t671 = call i64 @finch.gen.findStruct(ptr %t664, { ptr, i64, i64 } %t668, { ptr, i64, i64 } %t670) + store i64 %t671, ptr %a672 + %t673 = load i64, ptr %a672 + %t674 = icmp slt i64 %t673, 0 + br label %logic.from3114 +logic.from3114: + br i1 %t674, label %logic.rhs3115, label %logic.end3116 +logic.rhs3115: + %t675 = load ptr, ptr %a1 + %t676 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t677 = load { ptr, i64, i64 }, ptr %t676 + %t678 = call i64 @finch.gen.findStruct(ptr %t675, { ptr, i64, i64 } { ptr @.str.1956, i64 1, i64 0 }, { ptr, i64, i64 } %t677) + %t679 = icmp sge i64 %t678, 0 + br label %logic.rend3117 +logic.rend3117: + br label %logic.end3116 +logic.end3116: + %t680 = phi i1 [ false, %logic.from3114 ], [ %t679, %logic.rend3117 ] + br i1 %t680, label %then3118, label %endif3120 +then3118: + %t681 = load ptr, ptr %a1 + %t682 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t683 = load { ptr, i64, i64 }, ptr %t682 + %t684 = call i64 @finch.gen.findStruct(ptr %t681, { ptr, i64, i64 } { ptr @.str.1957, i64 1, i64 0 }, { ptr, i64, i64 } %t683) + store i64 %t684, ptr %a672 + store { ptr, i64, i64 } { ptr @.str.1958, i64 1, i64 0 }, ptr %a614 + br label %endif3120 +endif3120: + %t685 = load i64, ptr %a672 + %t686 = icmp slt i64 %t685, 0 + br i1 %t686, label %then3121, label %endif3123 +then3121: + %t687 = load ptr, ptr %a1 + %t688 = load %S.ast.Node, ptr %a515 + %t689 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t690 = load { ptr, i64, i64 }, ptr %t689 + store { ptr, i64, i64 } { ptr @.str.1959, i64 26, i64 0 }, ptr %a692 + store { ptr, i64, i64 } %t690, ptr %a693 + call void @finch_str_concat(ptr %a691, ptr %a692, ptr %a693) + %t694 = load { ptr, i64, i64 }, ptr %a691 + store { ptr, i64, i64 } %t694, ptr %a696 + store { ptr, i64, i64 } { ptr @.str.1960, i64 76, i64 0 }, ptr %a697 + call void @finch_str_concat(ptr %a695, ptr %a696, ptr %a697) + %t698 = load { ptr, i64, i64 }, ptr %a695 + call void @finch.gen.fail(ptr %t687, %S.ast.Node %t688, { ptr, i64, i64 } %t698) + br label %endif3123 +endif3123: + %t699 = load ptr, ptr %a1 + %t700 = load { ptr, i64, i64 }, ptr %a614 + %t701 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t702 = load { ptr, i64, i64 }, ptr %t701 + %t703 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t704 = load { ptr, i64, i64 }, ptr %t703 + %t705 = call i64 @finch.gen.findMethod(ptr %t699, { ptr, i64, i64 } %t700, { ptr, i64, i64 } %t702, { ptr, i64, i64 } %t704) + %t706 = icmp sge i64 %t705, 0 + br i1 %t706, label %then3124, label %endif3126 +then3124: + %t707 = load ptr, ptr %a1 + %t708 = load %S.ast.Node, ptr %a515 + %t709 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t710 = load { ptr, i64, i64 }, ptr %t709 + store { ptr, i64, i64 } { ptr @.str.1961, i64 11, i64 0 }, ptr %a712 + store { ptr, i64, i64 } %t710, ptr %a713 + call void @finch_str_concat(ptr %a711, ptr %a712, ptr %a713) + %t714 = load { ptr, i64, i64 }, ptr %a711 + store { ptr, i64, i64 } %t714, ptr %a716 + store { ptr, i64, i64 } { ptr @.str.1962, i64 1, i64 0 }, ptr %a717 + call void @finch_str_concat(ptr %a715, ptr %a716, ptr %a717) + %t718 = load { ptr, i64, i64 }, ptr %a715 + %t719 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t720 = load { ptr, i64, i64 }, ptr %t719 + store { ptr, i64, i64 } %t718, ptr %a722 + store { ptr, i64, i64 } %t720, ptr %a723 + call void @finch_str_concat(ptr %a721, ptr %a722, ptr %a723) + %t724 = load { ptr, i64, i64 }, ptr %a721 + store { ptr, i64, i64 } %t724, ptr %a726 + store { ptr, i64, i64 } { ptr @.str.1963, i64 17, i64 0 }, ptr %a727 + call void @finch_str_concat(ptr %a725, ptr %a726, ptr %a727) + %t728 = load { ptr, i64, i64 }, ptr %a725 + call void @finch.gen.fail(ptr %t707, %S.ast.Node %t708, { ptr, i64, i64 } %t728) + br label %endif3126 +endif3126: + %t729 = load ptr, ptr %a1 + %t730 = icmp eq ptr %t729, null + br i1 %t730, label %panic3127, label %ok3128 +panic3127: + call void @finch_panic(ptr @.str.1964, i64 1253, ptr @.str.1965) + unreachable +ok3128: + %t731 = getelementptr inbounds %S.gen.Gen, ptr %t729, i32 0, i32 15 + %t732 = load i64, ptr %a672 + %t733 = load { ptr, i64, i64 }, ptr %t731 + %t734 = extractvalue { ptr, i64, i64 } %t733, 1 + %t735 = icmp uge i64 %t732, %t734 + br i1 %t735, label %range3129, label %inrange3130 +range3129: + call void @finch_panic_index(ptr @.str.1966, i64 1253, i64 %t732, i64 %t734) + unreachable +inrange3130: + %t736 = extractvalue { ptr, i64, i64 } %t733, 0 + %t737 = getelementptr inbounds %S.gen.StructDef, ptr %t736, i64 %t732 + %t738 = getelementptr inbounds %S.gen.StructDef, ptr %t737, i32 0, i32 11 + %t739 = getelementptr inbounds { ptr, i64, i64 }, ptr %t738, i32 0, i32 1 + %t740 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t741 = load { ptr, i64, i64 }, ptr %t740 + store i64 -1, ptr %a742 + %t743 = load i64, ptr %t739 + %t744 = load ptr, ptr %t738 + store i64 0, ptr %a745 + br label %find.cond3131 +find.cond3131: + %t746 = load i64, ptr %a745 + %t747 = icmp slt i64 %t746, %t743 + br i1 %t747, label %find.body3132, label %find.end3135 +find.body3132: + %t748 = getelementptr inbounds { ptr, i64, i64 }, ptr %t744, i64 %t746 + %t749 = load { ptr, i64, i64 }, ptr %t748 + store { ptr, i64, i64 } %t749, ptr %a750 + store { ptr, i64, i64 } %t741, ptr %a751 + %t752 = call i32 @finch_str_eq(ptr %a750, ptr %a751) + %t753 = icmp ne i32 %t752, 0 + br i1 %t753, label %find.hit3133, label %find.next3134 +find.hit3133: + store i64 %t746, ptr %a742 + br label %find.end3135 +find.next3134: + %t754 = add i64 %t746, 1 + store i64 %t754, ptr %a745 + br label %find.cond3131 +find.end3135: + %t755 = load i64, ptr %a742 + %t756 = icmp sge i64 %t755, 0 + br i1 %t756, label %then3136, label %endif3138 +then3136: + %t757 = load ptr, ptr %a1 + %t758 = load %S.ast.Node, ptr %a515 + %t759 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t760 = load { ptr, i64, i64 }, ptr %t759 + store { ptr, i64, i64 } { ptr @.str.1967, i64 11, i64 0 }, ptr %a762 + store { ptr, i64, i64 } %t760, ptr %a763 + call void @finch_str_concat(ptr %a761, ptr %a762, ptr %a763) + %t764 = load { ptr, i64, i64 }, ptr %a761 + store { ptr, i64, i64 } %t764, ptr %a766 + store { ptr, i64, i64 } { ptr @.str.1968, i64 28, i64 0 }, ptr %a767 + call void @finch_str_concat(ptr %a765, ptr %a766, ptr %a767) + %t768 = load { ptr, i64, i64 }, ptr %a765 + %t769 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t770 = load { ptr, i64, i64 }, ptr %t769 + store { ptr, i64, i64 } %t768, ptr %a772 + store { ptr, i64, i64 } %t770, ptr %a773 + call void @finch_str_concat(ptr %a771, ptr %a772, ptr %a773) + %t774 = load { ptr, i64, i64 }, ptr %a771 + store { ptr, i64, i64 } %t774, ptr %a776 + store { ptr, i64, i64 } { ptr @.str.1969, i64 1, i64 0 }, ptr %a777 + call void @finch_str_concat(ptr %a775, ptr %a776, ptr %a777) + %t778 = load { ptr, i64, i64 }, ptr %a775 + call void @finch.gen.fail(ptr %t757, %S.ast.Node %t758, { ptr, i64, i64 } %t778) + br label %endif3138 +endif3138: + br label %endif3111 +else3110: + %t779 = load ptr, ptr %a1 + %t780 = load ptr, ptr %a1 + %t781 = icmp eq ptr %t780, null + br i1 %t781, label %panic3139, label %ok3140 +panic3139: + call void @finch_panic(ptr @.str.1970, i64 1257, ptr @.str.1971) + unreachable +ok3140: + %t782 = getelementptr inbounds %S.gen.Gen, ptr %t780, i32 0, i32 13 + %t783 = load { ptr, i64, i64 }, ptr %t782 + %t784 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t785 = load { ptr, i64, i64 }, ptr %t784 + %t786 = call i64 @finch.gen.findFn(ptr %t779, { ptr, i64, i64 } %t783, { ptr, i64, i64 } %t785) + %t787 = icmp sge i64 %t786, 0 + br i1 %t787, label %then3141, label %endif3143 +then3141: + %t788 = load ptr, ptr %a1 + %t789 = load %S.ast.Node, ptr %a515 + %t790 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t791 = load { ptr, i64, i64 }, ptr %t790 + store { ptr, i64, i64 } { ptr @.str.1972, i64 10, i64 0 }, ptr %a793 + store { ptr, i64, i64 } %t791, ptr %a794 + call void @finch_str_concat(ptr %a792, ptr %a793, ptr %a794) + %t795 = load { ptr, i64, i64 }, ptr %a792 + store { ptr, i64, i64 } %t795, ptr %a797 + store { ptr, i64, i64 } { ptr @.str.1973, i64 18, i64 0 }, ptr %a798 + call void @finch_str_concat(ptr %a796, ptr %a797, ptr %a798) + %t799 = load { ptr, i64, i64 }, ptr %a796 + call void @finch.gen.fail(ptr %t788, %S.ast.Node %t789, { ptr, i64, i64 } %t799) + br label %endif3143 +endif3143: + %t800 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t801 = load { ptr, i64, i64 }, ptr %t800 + %t802 = call i1 @finch.gen.isBuiltin({ ptr, i64, i64 } %t801) + br i1 %t802, label %then3144, label %endif3146 +then3144: + %t803 = load ptr, ptr %a1 + %t804 = load %S.ast.Node, ptr %a515 + %t805 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t806 = load { ptr, i64, i64 }, ptr %t805 + store { ptr, i64, i64 } { ptr @.str.1974, i64 1, i64 0 }, ptr %a808 + store { ptr, i64, i64 } %t806, ptr %a809 + call void @finch_str_concat(ptr %a807, ptr %a808, ptr %a809) + %t810 = load { ptr, i64, i64 }, ptr %a807 + store { ptr, i64, i64 } %t810, ptr %a812 + store { ptr, i64, i64 } { ptr @.str.1975, i64 43, i64 0 }, ptr %a813 + call void @finch_str_concat(ptr %a811, ptr %a812, ptr %a813) + %t814 = load { ptr, i64, i64 }, ptr %a811 + call void @finch.gen.fail(ptr %t803, %S.ast.Node %t804, { ptr, i64, i64 } %t814) + br label %endif3146 +endif3146: + br label %endif3111 +endif3111: + br label %endif3105 +endif3105: + %t815 = load ptr, ptr %a1 + %t816 = icmp eq ptr %t815, null + br i1 %t816, label %panic3147, label %ok3148 +panic3147: + call void @finch_panic(ptr @.str.1976, i64 1264, ptr @.str.1977) + unreachable +ok3148: + %t817 = getelementptr inbounds %S.gen.Gen, ptr %t815, i32 0, i32 13 + %t818 = load { ptr, i64, i64 }, ptr %t817 + store { ptr, i64, i64 } %t818, ptr %a819 + call void @finch_str_copy(ptr %a820, ptr %a819) + %t821 = load { ptr, i64, i64 }, ptr %a820 + %t822 = insertvalue %S.gen.FnSig zeroinitializer, { ptr, i64, i64 } %t821, 0 + %t823 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t824 = load { ptr, i64, i64 }, ptr %t823 + store { ptr, i64, i64 } %t824, ptr %a825 + call void @finch_str_copy(ptr %a826, ptr %a825) + %t827 = load { ptr, i64, i64 }, ptr %a826 + %t828 = insertvalue %S.gen.FnSig %t822, { ptr, i64, i64 } %t827, 1 + %t829 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t830 = load { ptr, i64, i64 }, ptr %t829 + store { ptr, i64, i64 } %t830, ptr %a831 + call void @finch_str_copy(ptr %a832, ptr %a831) + %t833 = load { ptr, i64, i64 }, ptr %a832 + %t834 = insertvalue %S.gen.FnSig %t828, { ptr, i64, i64 } %t833, 2 + %t835 = load { ptr, i64, i64 }, ptr %a614 + store { ptr, i64, i64 } %t835, ptr %a836 + call void @finch_str_copy(ptr %a837, ptr %a836) + %t838 = load { ptr, i64, i64 }, ptr %a837 + %t839 = insertvalue %S.gen.FnSig %t834, { ptr, i64, i64 } %t838, 3 + %t840 = load i1, ptr %a615 + %t841 = insertvalue %S.gen.FnSig %t839, i1 %t840, 4 + %t842 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 8 + %t843 = load i1, ptr %t842 + %t844 = insertvalue %S.gen.FnSig %t841, i1 %t843, 5 + %t845 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 7 + %t846 = load i1, ptr %t845 + %t847 = insertvalue %S.gen.FnSig %t844, i1 %t846, 9 + %t848 = load i64, ptr %a460 + %t849 = insertvalue %S.gen.FnSig %t847, i64 %t848, 16 + %t850 = load i64, ptr %a492 + %t851 = insertvalue %S.gen.FnSig %t849, i64 %t850, 17 + store %S.gen.FnSig %t851, ptr %a852 + %t853 = load ptr, ptr %a1 + %t854 = icmp eq ptr %t853, null + br i1 %t854, label %panic3149, label %ok3150 +panic3149: + call void @finch_panic(ptr @.str.1979, i64 1265, ptr @.str.1980) + unreachable +ok3150: + %t855 = getelementptr inbounds %S.gen.Gen, ptr %t853, i32 0, i32 13 + %t856 = load { ptr, i64, i64 }, ptr %t855 + %t857 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t856) + store { ptr, i64, i64 } { ptr @.str.1978, i64 7, i64 0 }, ptr %a859 + store { ptr, i64, i64 } %t857, ptr %a860 + call void @finch_str_concat(ptr %a858, ptr %a859, ptr %a860) + %t861 = load { ptr, i64, i64 }, ptr %a858 + store { ptr, i64, i64 } %t861, ptr %a863 + store { ptr, i64, i64 } { ptr @.str.1981, i64 1, i64 0 }, ptr %a864 + call void @finch_str_concat(ptr %a862, ptr %a863, ptr %a864) + %t865 = load { ptr, i64, i64 }, ptr %a862 + %t866 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t867 = load { ptr, i64, i64 }, ptr %t866 + store { ptr, i64, i64 } %t865, ptr %a869 + store { ptr, i64, i64 } %t867, ptr %a870 + call void @finch_str_concat(ptr %a868, ptr %a869, ptr %a870) + %t871 = load { ptr, i64, i64 }, ptr %a868 + %t872 = getelementptr inbounds %S.gen.FnSig, ptr %a852, i32 0, i32 11 + store { ptr, i64, i64 } %t871, ptr %t872 + %t873 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t874 = getelementptr inbounds { ptr, i64, i64 }, ptr %t873, i32 0, i32 1 + %t875 = load i64, ptr %t874 + %t876 = icmp sgt i64 %t875, 0 + br i1 %t876, label %then3151, label %endif3153 +then3151: + %t877 = load ptr, ptr %a1 + %t878 = icmp eq ptr %t877, null + br i1 %t878, label %panic3154, label %ok3155 +panic3154: + call void @finch_panic(ptr @.str.1983, i64 1267, ptr @.str.1984) + unreachable +ok3155: + %t879 = getelementptr inbounds %S.gen.Gen, ptr %t877, i32 0, i32 13 + %t880 = load { ptr, i64, i64 }, ptr %t879 + %t881 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t880) + store { ptr, i64, i64 } { ptr @.str.1982, i64 7, i64 0 }, ptr %a883 + store { ptr, i64, i64 } %t881, ptr %a884 + call void @finch_str_concat(ptr %a882, ptr %a883, ptr %a884) + %t885 = load { ptr, i64, i64 }, ptr %a882 + store { ptr, i64, i64 } %t885, ptr %a887 + store { ptr, i64, i64 } { ptr @.str.1985, i64 1, i64 0 }, ptr %a888 + call void @finch_str_concat(ptr %a886, ptr %a887, ptr %a888) + %t889 = load { ptr, i64, i64 }, ptr %a886 + %t890 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t891 = load { ptr, i64, i64 }, ptr %t890 + store { ptr, i64, i64 } %t889, ptr %a893 + store { ptr, i64, i64 } %t891, ptr %a894 + call void @finch_str_concat(ptr %a892, ptr %a893, ptr %a894) + %t895 = load { ptr, i64, i64 }, ptr %a892 + store { ptr, i64, i64 } %t895, ptr %a897 + store { ptr, i64, i64 } { ptr @.str.1986, i64 1, i64 0 }, ptr %a898 + call void @finch_str_concat(ptr %a896, ptr %a897, ptr %a898) + %t899 = load { ptr, i64, i64 }, ptr %a896 + %t900 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 1 + %t901 = load { ptr, i64, i64 }, ptr %t900 + store { ptr, i64, i64 } %t899, ptr %a903 + store { ptr, i64, i64 } %t901, ptr %a904 + call void @finch_str_concat(ptr %a902, ptr %a903, ptr %a904) + %t905 = load { ptr, i64, i64 }, ptr %a902 + %t906 = getelementptr inbounds %S.gen.FnSig, ptr %a852, i32 0, i32 11 + store { ptr, i64, i64 } %t905, ptr %t906 + br label %endif3153 +endif3153: + %t907 = load ptr, ptr %a1 + %t908 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 5 + %t909 = load %S.ast.Type, ptr %t908 + %t910 = load %S.ast.Node, ptr %a515 + %t911 = call %S.ast.Type @finch.gen.resolve(ptr %t907, %S.ast.Type %t909, %S.ast.Node %t910) + %t912 = getelementptr inbounds %S.gen.FnSig, ptr %a852, i32 0, i32 12 + store %S.ast.Type %t911, ptr %t912 + %t913 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 9 + %t914 = getelementptr inbounds { ptr, i64, i64 }, ptr %t913, i32 0, i32 1 + %t915 = load i64, ptr %t914 + %t916 = sub i64 %t915, 1 + store i64 0, ptr %a917 + br label %for.cond3156 +for.cond3156: + %t918 = load i64, ptr %a917 + %t919 = icmp slt i64 %t918, %t916 + br i1 %t919, label %for.body3157, label %for.end3159 +for.body3157: + %t920 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 9 + %t921 = load i64, ptr %a917 + %t922 = load { ptr, i64, i64 }, ptr %t920 + %t923 = extractvalue { ptr, i64, i64 } %t922, 1 + %t924 = icmp uge i64 %t921, %t923 + br i1 %t924, label %range3160, label %inrange3161 +range3160: + call void @finch_panic_index(ptr @.str.1987, i64 1271, i64 %t921, i64 %t923) + unreachable +inrange3161: + %t925 = extractvalue { ptr, i64, i64 } %t922, 0 + %t926 = getelementptr inbounds %S.ast.Node, ptr %t925, i64 %t921 + %t927 = getelementptr inbounds %S.ast.Node, ptr %t926, i32 0, i32 1 + %t928 = load { ptr, i64, i64 }, ptr %t927 + store { ptr, i64, i64 } %t928, ptr %a929 + store { ptr, i64, i64 } { ptr @.str.1988, i64 4, i64 0 }, ptr %a930 + %t931 = call i32 @finch_str_eq(ptr %a929, ptr %a930) + %t932 = icmp ne i32 %t931, 0 + br label %logic.from3162 +logic.from3162: + br i1 %t932, label %logic.rhs3163, label %logic.end3164 +logic.rhs3163: + %t933 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t934 = getelementptr inbounds { ptr, i64, i64 }, ptr %t933, i32 0, i32 1 + %t935 = load i64, ptr %t934 + %t936 = icmp sgt i64 %t935, 0 + br label %logic.rend3165 +logic.rend3165: + br label %logic.end3164 +logic.end3164: + %t937 = phi i1 [ false, %logic.from3162 ], [ %t936, %logic.rend3165 ] + br i1 %t937, label %then3166, label %endif3168 +then3166: + %t938 = load ptr, ptr %a1 + %t939 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 9 + %t940 = load i64, ptr %a917 + %t941 = load { ptr, i64, i64 }, ptr %t939 + %t942 = extractvalue { ptr, i64, i64 } %t941, 1 + %t943 = icmp uge i64 %t940, %t942 + br i1 %t943, label %range3169, label %inrange3170 +range3169: + call void @finch_panic_index(ptr @.str.1989, i64 1272, i64 %t940, i64 %t942) + unreachable +inrange3170: + %t944 = extractvalue { ptr, i64, i64 } %t941, 0 + %t945 = getelementptr inbounds %S.ast.Node, ptr %t944, i64 %t940 + %t946 = load %S.ast.Node, ptr %t945 + %t947 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 2 + %t948 = load { ptr, i64, i64 }, ptr %t947 + store { ptr, i64, i64 } { ptr @.str.1990, i64 22, i64 0 }, ptr %a950 + store { ptr, i64, i64 } %t948, ptr %a951 + call void @finch_str_concat(ptr %a949, ptr %a950, ptr %a951) + %t952 = load { ptr, i64, i64 }, ptr %a949 + store { ptr, i64, i64 } %t952, ptr %a954 + store { ptr, i64, i64 } { ptr @.str.1991, i64 24, i64 0 }, ptr %a955 + call void @finch_str_concat(ptr %a953, ptr %a954, ptr %a955) + %t956 = load { ptr, i64, i64 }, ptr %a953 + call void @finch.gen.fail(ptr %t938, %S.ast.Node %t946, { ptr, i64, i64 } %t956) + br label %endif3168 +endif3168: + %t957 = getelementptr inbounds %S.gen.FnSig, ptr %a852, i32 0, i32 13 + %t958 = getelementptr inbounds { ptr, i64, i64 }, ptr %t957, i32 0, i32 1 + %t959 = load ptr, ptr %a1 + %t960 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 9 + %t961 = load i64, ptr %a917 + %t962 = load { ptr, i64, i64 }, ptr %t960 + %t963 = extractvalue { ptr, i64, i64 } %t962, 1 + %t964 = icmp uge i64 %t961, %t963 + br i1 %t964, label %range3171, label %inrange3172 +range3171: + call void @finch_panic_index(ptr @.str.1992, i64 1274, i64 %t961, i64 %t963) + unreachable +inrange3172: + %t965 = extractvalue { ptr, i64, i64 } %t962, 0 + %t966 = getelementptr inbounds %S.ast.Node, ptr %t965, i64 %t961 + %t967 = getelementptr inbounds %S.ast.Node, ptr %t966, i32 0, i32 5 + %t968 = load %S.ast.Type, ptr %t967 + %t969 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 9 + %t970 = load i64, ptr %a917 + %t971 = load { ptr, i64, i64 }, ptr %t969 + %t972 = extractvalue { ptr, i64, i64 } %t971, 1 + %t973 = icmp uge i64 %t970, %t972 + br i1 %t973, label %range3173, label %inrange3174 +range3173: + call void @finch_panic_index(ptr @.str.1993, i64 1274, i64 %t970, i64 %t972) + unreachable +inrange3174: + %t974 = extractvalue { ptr, i64, i64 } %t971, 0 + %t975 = getelementptr inbounds %S.ast.Node, ptr %t974, i64 %t970 + %t976 = load %S.ast.Node, ptr %t975 + %t977 = call %S.ast.Type @finch.gen.resolve(ptr %t959, %S.ast.Type %t968, %S.ast.Node %t976) + %t978 = load i64, ptr %t958 + %t979 = add i64 %t978, 1 + call void @finch_arr_reserve(ptr %t957, i64 %t979, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t980 = load ptr, ptr %t957 + %t981 = getelementptr inbounds %S.ast.Type, ptr %t980, i64 %t978 + store %S.ast.Type %t977, ptr %t981 + store i64 %t979, ptr %t958 + %t982 = getelementptr inbounds %S.gen.FnSig, ptr %a852, i32 0, i32 14 + %t983 = getelementptr inbounds { ptr, i64, i64 }, ptr %t982, i32 0, i32 1 + %t984 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 9 + %t985 = load i64, ptr %a917 + %t986 = load { ptr, i64, i64 }, ptr %t984 + %t987 = extractvalue { ptr, i64, i64 } %t986, 1 + %t988 = icmp uge i64 %t985, %t987 + br i1 %t988, label %range3175, label %inrange3176 +range3175: + call void @finch_panic_index(ptr @.str.1994, i64 1275, i64 %t985, i64 %t987) + unreachable +inrange3176: + %t989 = extractvalue { ptr, i64, i64 } %t986, 0 + %t990 = getelementptr inbounds %S.ast.Node, ptr %t989, i64 %t985 + %t991 = getelementptr inbounds %S.ast.Node, ptr %t990, i32 0, i32 1 + %t992 = load { ptr, i64, i64 }, ptr %t991 + store { ptr, i64, i64 } %t992, ptr %a993 + call void @finch_str_copy(ptr %a994, ptr %a993) + %t995 = load { ptr, i64, i64 }, ptr %a994 + %t996 = load i64, ptr %t983 + %t997 = add i64 %t996, 1 + call void @finch_arr_reserve(ptr %t982, i64 %t997, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t998 = load ptr, ptr %t982 + %t999 = getelementptr inbounds { ptr, i64, i64 }, ptr %t998, i64 %t996 + store { ptr, i64, i64 } %t995, ptr %t999 + store i64 %t997, ptr %t983 + br label %for.step3158 +for.step3158: + %t1000 = load i64, ptr %a917 + %t1001 = add i64 %t1000, 1 + store i64 %t1001, ptr %a917 + br label %for.cond3156 +for.end3159: + %t1002 = getelementptr inbounds %S.ast.Node, ptr %a515, i32 0, i32 8 + %t1003 = load i1, ptr %t1002 + br i1 %t1003, label %then3177, label %endif3179 +then3177: + %t1004 = load ptr, ptr %a1 + %t1005 = load %S.ast.Node, ptr %a515 + %t1006 = load %S.gen.FnSig, ptr %a852 + call void @finch.gen.checkExport(ptr %t1004, %S.ast.Node %t1005, %S.gen.FnSig %t1006) + br label %endif3179 +endif3179: + %t1007 = load ptr, ptr %a1 + %t1008 = icmp eq ptr %t1007, null + br i1 %t1008, label %panic3180, label %ok3181 +panic3180: + call void @finch_panic(ptr @.str.1995, i64 1280, ptr @.str.1996) + unreachable +ok3181: + %t1009 = getelementptr inbounds %S.gen.Gen, ptr %t1007, i32 0, i32 14 + %t1010 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1009, i32 0, i32 1 + %t1011 = load %S.gen.FnSig, ptr %a852 + store %S.gen.FnSig %t1011, ptr %a1012 + call void @finch.copy.S_gen_FnSig(ptr %a1013, ptr %a1012) + %t1014 = load %S.gen.FnSig, ptr %a1013 + %t1015 = load i64, ptr %t1010 + %t1016 = add i64 %t1015, 1 + call void @finch_arr_reserve(ptr %t1009, i64 %t1016, i64 ptrtoint (ptr getelementptr (%S.gen.FnSig, ptr null, i32 1) to i64)) + %t1017 = load ptr, ptr %t1009 + %t1018 = getelementptr inbounds %S.gen.FnSig, ptr %t1017, i64 %t1015 + store %S.gen.FnSig %t1014, ptr %t1018 + store i64 %t1016, ptr %t1010 + br label %for.step3066 +for.step3066: + %t1019 = load i64, ptr %a492 + %t1020 = add i64 %t1019, 1 + store i64 %t1020, ptr %a492 + br label %for.cond3064 +for.end3067: + br label %for.step3052 +for.step3052: + %t1021 = load i64, ptr %a460 + %t1022 = add i64 %t1021, 1 + store i64 %t1022, ptr %a460 + br label %for.cond3050 +for.end3053: + store i1 true, ptr %a1023 + br label %while.cond3182 +while.cond3182: + %t1024 = load i1, ptr %a1023 + br i1 %t1024, label %while.body3183, label %while.end3184 +while.body3183: + store i1 false, ptr %a1023 + %t1025 = load ptr, ptr %a1 + %t1026 = icmp eq ptr %t1025, null + br i1 %t1026, label %panic3185, label %ok3186 +panic3185: + call void @finch_panic(ptr @.str.1997, i64 1288, ptr @.str.1998) + unreachable +ok3186: + %t1027 = getelementptr inbounds %S.gen.Gen, ptr %t1025, i32 0, i32 14 + %t1028 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1027, i32 0, i32 1 + %t1029 = load i64, ptr %t1028 + store i64 0, ptr %a1030 + br label %for.cond3187 +for.cond3187: + %t1031 = load i64, ptr %a1030 + %t1032 = icmp slt i64 %t1031, %t1029 + br i1 %t1032, label %for.body3188, label %for.end3190 +for.body3188: + %t1033 = load ptr, ptr %a1 + %t1034 = icmp eq ptr %t1033, null + br i1 %t1034, label %panic3191, label %ok3192 +panic3191: + call void @finch_panic(ptr @.str.1999, i64 1289, ptr @.str.2000) + unreachable +ok3192: + %t1035 = getelementptr inbounds %S.gen.Gen, ptr %t1033, i32 0, i32 14 + %t1036 = load i64, ptr %a1030 + %t1037 = load { ptr, i64, i64 }, ptr %t1035 + %t1038 = extractvalue { ptr, i64, i64 } %t1037, 1 + %t1039 = icmp uge i64 %t1036, %t1038 + br i1 %t1039, label %range3193, label %inrange3194 +range3193: + call void @finch_panic_index(ptr @.str.2001, i64 1289, i64 %t1036, i64 %t1038) + unreachable +inrange3194: + %t1040 = extractvalue { ptr, i64, i64 } %t1037, 0 + %t1041 = getelementptr inbounds %S.gen.FnSig, ptr %t1040, i64 %t1036 + %t1042 = getelementptr inbounds %S.gen.FnSig, ptr %t1041, i32 0, i32 2 + %t1043 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1042, i32 0, i32 1 + %t1044 = load i64, ptr %t1043 + %t1045 = icmp sgt i64 %t1044, 0 + br label %logic.from3195 +logic.from3195: + br i1 %t1045, label %logic.rhs3196, label %logic.end3197 +logic.rhs3196: + %t1046 = load ptr, ptr %a1 + %t1047 = icmp eq ptr %t1046, null + br i1 %t1047, label %panic3198, label %ok3199 +panic3198: + call void @finch_panic(ptr @.str.2002, i64 1289, ptr @.str.2003) + unreachable +ok3199: + %t1048 = getelementptr inbounds %S.gen.Gen, ptr %t1046, i32 0, i32 14 + %t1049 = load i64, ptr %a1030 + %t1050 = load { ptr, i64, i64 }, ptr %t1048 + %t1051 = extractvalue { ptr, i64, i64 } %t1050, 1 + %t1052 = icmp uge i64 %t1049, %t1051 + br i1 %t1052, label %range3200, label %inrange3201 +range3200: + call void @finch_panic_index(ptr @.str.2004, i64 1289, i64 %t1049, i64 %t1051) + unreachable +inrange3201: + %t1053 = extractvalue { ptr, i64, i64 } %t1050, 0 + %t1054 = getelementptr inbounds %S.gen.FnSig, ptr %t1053, i64 %t1049 + %t1055 = getelementptr inbounds %S.gen.FnSig, ptr %t1054, i32 0, i32 10 + %t1056 = load i1, ptr %t1055 + %t1057 = xor i1 %t1056, true + br label %logic.rend3202 +logic.rend3202: + br label %logic.end3197 +logic.end3197: + %t1058 = phi i1 [ false, %logic.from3195 ], [ %t1057, %logic.rend3202 ] + br i1 %t1058, label %then3203, label %endif3205 +then3203: + %t1059 = load ptr, ptr %a1 + %t1060 = icmp eq ptr %t1059, null + br i1 %t1060, label %panic3206, label %ok3207 +panic3206: + call void @finch_panic(ptr @.str.2005, i64 1290, ptr @.str.2006) + unreachable +ok3207: + %t1061 = getelementptr inbounds %S.gen.Gen, ptr %t1059, i32 0, i32 0 + %t1062 = load ptr, ptr %a1 + %t1063 = icmp eq ptr %t1062, null + br i1 %t1063, label %panic3208, label %ok3209 +panic3208: + call void @finch_panic(ptr @.str.2007, i64 1290, ptr @.str.2008) + unreachable +ok3209: + %t1064 = getelementptr inbounds %S.gen.Gen, ptr %t1062, i32 0, i32 14 + %t1065 = load i64, ptr %a1030 + %t1066 = load { ptr, i64, i64 }, ptr %t1064 + %t1067 = extractvalue { ptr, i64, i64 } %t1066, 1 + %t1068 = icmp uge i64 %t1065, %t1067 + br i1 %t1068, label %range3210, label %inrange3211 +range3210: + call void @finch_panic_index(ptr @.str.2009, i64 1290, i64 %t1065, i64 %t1067) + unreachable +inrange3211: + %t1069 = extractvalue { ptr, i64, i64 } %t1066, 0 + %t1070 = getelementptr inbounds %S.gen.FnSig, ptr %t1069, i64 %t1065 + %t1071 = getelementptr inbounds %S.gen.FnSig, ptr %t1070, i32 0, i32 16 + %t1072 = load i64, ptr %t1071 + %t1073 = load { ptr, i64, i64 }, ptr %t1061 + %t1074 = extractvalue { ptr, i64, i64 } %t1073, 1 + %t1075 = icmp uge i64 %t1072, %t1074 + br i1 %t1075, label %range3212, label %inrange3213 +range3212: + call void @finch_panic_index(ptr @.str.2010, i64 1290, i64 %t1072, i64 %t1074) + unreachable +inrange3213: + %t1076 = extractvalue { ptr, i64, i64 } %t1073, 0 + %t1077 = getelementptr inbounds %S.ast.Program, ptr %t1076, i64 %t1072 + %t1078 = getelementptr inbounds %S.ast.Program, ptr %t1077, i32 0, i32 8 + %t1079 = load ptr, ptr %a1 + %t1080 = icmp eq ptr %t1079, null + br i1 %t1080, label %panic3214, label %ok3215 +panic3214: + call void @finch_panic(ptr @.str.2011, i64 1290, ptr @.str.2012) + unreachable +ok3215: + %t1081 = getelementptr inbounds %S.gen.Gen, ptr %t1079, i32 0, i32 14 + %t1082 = load i64, ptr %a1030 + %t1083 = load { ptr, i64, i64 }, ptr %t1081 + %t1084 = extractvalue { ptr, i64, i64 } %t1083, 1 + %t1085 = icmp uge i64 %t1082, %t1084 + br i1 %t1085, label %range3216, label %inrange3217 +range3216: + call void @finch_panic_index(ptr @.str.2013, i64 1290, i64 %t1082, i64 %t1084) + unreachable +inrange3217: + %t1086 = extractvalue { ptr, i64, i64 } %t1083, 0 + %t1087 = getelementptr inbounds %S.gen.FnSig, ptr %t1086, i64 %t1082 + %t1088 = getelementptr inbounds %S.gen.FnSig, ptr %t1087, i32 0, i32 17 + %t1089 = load i64, ptr %t1088 + %t1090 = load { ptr, i64, i64 }, ptr %t1078 + %t1091 = extractvalue { ptr, i64, i64 } %t1090, 1 + %t1092 = icmp uge i64 %t1089, %t1091 + br i1 %t1092, label %range3218, label %inrange3219 +range3218: + call void @finch_panic_index(ptr @.str.2014, i64 1290, i64 %t1089, i64 %t1091) + unreachable +inrange3219: + %t1093 = extractvalue { ptr, i64, i64 } %t1090, 0 + %t1094 = getelementptr inbounds %S.ast.Node, ptr %t1093, i64 %t1089 + %t1095 = load %S.ast.Node, ptr %t1094 + store %S.ast.Node %t1095, ptr %a1096 + call void @finch.copy.S_ast_Node(ptr %a1097, ptr %a1096) + %t1098 = load %S.ast.Node, ptr %a1097 + store %S.ast.Node %t1098, ptr %a1099 + %t1100 = load ptr, ptr %a1 + %t1101 = getelementptr inbounds %S.ast.Node, ptr %a1099, i32 0, i32 9 + %t1102 = getelementptr inbounds %S.ast.Node, ptr %a1099, i32 0, i32 9 + %t1103 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1102, i32 0, i32 1 + %t1104 = load i64, ptr %t1103 + %t1105 = sub i64 %t1104, 1 + %t1106 = load { ptr, i64, i64 }, ptr %t1101 + %t1107 = extractvalue { ptr, i64, i64 } %t1106, 1 + %t1108 = icmp uge i64 %t1105, %t1107 + br i1 %t1108, label %range3220, label %inrange3221 +range3220: + call void @finch_panic_index(ptr @.str.2016, i64 1291, i64 %t1105, i64 %t1107) + unreachable +inrange3221: + %t1109 = extractvalue { ptr, i64, i64 } %t1106, 0 + %t1110 = getelementptr inbounds %S.ast.Node, ptr %t1109, i64 %t1105 + %t1111 = load %S.ast.Node, ptr %t1110 + %t1112 = call i1 @finch.gen.mutates(ptr %t1100, { ptr, i64, i64 } { ptr @.str.2015, i64 4, i64 0 }, %S.ast.Node %t1111) + br i1 %t1112, label %then3222, label %endif3224 +then3222: + %t1113 = load ptr, ptr %a1 + %t1114 = icmp eq ptr %t1113, null + br i1 %t1114, label %panic3225, label %ok3226 +panic3225: + call void @finch_panic(ptr @.str.2017, i64 1292, ptr @.str.2018) + unreachable +ok3226: + %t1115 = getelementptr inbounds %S.gen.Gen, ptr %t1113, i32 0, i32 14 + %t1116 = load i64, ptr %a1030 + %t1117 = load { ptr, i64, i64 }, ptr %t1115 + %t1118 = extractvalue { ptr, i64, i64 } %t1117, 1 + %t1119 = icmp uge i64 %t1116, %t1118 + br i1 %t1119, label %range3227, label %inrange3228 +range3227: + call void @finch_panic_index(ptr @.str.2019, i64 1292, i64 %t1116, i64 %t1118) + unreachable +inrange3228: + %t1120 = extractvalue { ptr, i64, i64 } %t1117, 0 + %t1121 = getelementptr inbounds %S.gen.FnSig, ptr %t1120, i64 %t1116 + %t1122 = getelementptr inbounds %S.gen.FnSig, ptr %t1121, i32 0, i32 10 + store i1 true, ptr %t1122 + %t1123 = load ptr, ptr %a1 + %t1124 = icmp eq ptr %t1123, null + br i1 %t1124, label %panic3229, label %ok3230 +panic3229: + call void @finch_panic(ptr @.str.2020, i64 1293, ptr @.str.2021) + unreachable +ok3230: + %t1125 = getelementptr inbounds %S.gen.Gen, ptr %t1123, i32 0, i32 22 + %t1126 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1125, i32 0, i32 1 + %t1127 = load ptr, ptr %a1 + %t1128 = icmp eq ptr %t1127, null + br i1 %t1128, label %panic3231, label %ok3232 +panic3231: + call void @finch_panic(ptr @.str.2022, i64 1293, ptr @.str.2023) + unreachable +ok3232: + %t1129 = getelementptr inbounds %S.gen.Gen, ptr %t1127, i32 0, i32 14 + %t1130 = load i64, ptr %a1030 + %t1131 = load { ptr, i64, i64 }, ptr %t1129 + %t1132 = extractvalue { ptr, i64, i64 } %t1131, 1 + %t1133 = icmp uge i64 %t1130, %t1132 + br i1 %t1133, label %range3233, label %inrange3234 +range3233: + call void @finch_panic_index(ptr @.str.2024, i64 1293, i64 %t1130, i64 %t1132) + unreachable +inrange3234: + %t1134 = extractvalue { ptr, i64, i64 } %t1131, 0 + %t1135 = getelementptr inbounds %S.gen.FnSig, ptr %t1134, i64 %t1130 + %t1136 = getelementptr inbounds %S.gen.FnSig, ptr %t1135, i32 0, i32 1 + %t1137 = load { ptr, i64, i64 }, ptr %t1136 + store { ptr, i64, i64 } %t1137, ptr %a1138 + call void @finch_str_copy(ptr %a1139, ptr %a1138) + %t1140 = load { ptr, i64, i64 }, ptr %a1139 + %t1141 = load i64, ptr %t1126 + %t1142 = add i64 %t1141, 1 + call void @finch_arr_reserve(ptr %t1125, i64 %t1142, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t1143 = load ptr, ptr %t1125 + %t1144 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1143, i64 %t1141 + store { ptr, i64, i64 } %t1140, ptr %t1144 + store i64 %t1142, ptr %t1126 + store i1 true, ptr %a1023 + br label %endif3224 +endif3224: + br label %endif3205 +endif3205: + br label %for.step3189 +for.step3189: + %t1145 = load i64, ptr %a1030 + %t1146 = add i64 %t1145, 1 + store i64 %t1146, ptr %a1030 + br label %for.cond3187 +for.end3190: + %t1147 = load ptr, ptr %a1 + %t1148 = icmp eq ptr %t1147, null + br i1 %t1148, label %panic3235, label %ok3236 +panic3235: + call void @finch_panic(ptr @.str.2025, i64 1298, ptr @.str.2026) + unreachable +ok3236: + %t1149 = getelementptr inbounds %S.gen.Gen, ptr %t1147, i32 0, i32 16 + %t1150 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1149, i32 0, i32 1 + %t1151 = load i64, ptr %t1150 + store i64 0, ptr %a1152 + br label %for.cond3237 +for.cond3237: + %t1153 = load i64, ptr %a1152 + %t1154 = icmp slt i64 %t1153, %t1151 + br i1 %t1154, label %for.body3238, label %for.end3240 +for.body3238: + %t1155 = load ptr, ptr %a1 + %t1156 = icmp eq ptr %t1155, null + br i1 %t1156, label %panic3241, label %ok3242 +panic3241: + call void @finch_panic(ptr @.str.2027, i64 1299, ptr @.str.2028) + unreachable +ok3242: + %t1157 = getelementptr inbounds %S.gen.Gen, ptr %t1155, i32 0, i32 16 + %t1158 = load i64, ptr %a1152 + %t1159 = load { ptr, i64, i64 }, ptr %t1157 + %t1160 = extractvalue { ptr, i64, i64 } %t1159, 1 + %t1161 = icmp uge i64 %t1158, %t1160 + br i1 %t1161, label %range3243, label %inrange3244 +range3243: + call void @finch_panic_index(ptr @.str.2029, i64 1299, i64 %t1158, i64 %t1160) + unreachable +inrange3244: + %t1162 = extractvalue { ptr, i64, i64 } %t1159, 0 + %t1163 = getelementptr inbounds %S.gen.Template, ptr %t1162, i64 %t1158 + %t1164 = load %S.gen.Template, ptr %t1163 + store %S.gen.Template %t1164, ptr %a1165 + call void @finch.copy.S_gen_Template(ptr %a1166, ptr %a1165) + %t1167 = load %S.gen.Template, ptr %a1166 + store %S.gen.Template %t1167, ptr %a1168 + %t1169 = getelementptr inbounds %S.gen.Template, ptr %a1168, i32 0, i32 2 + %t1170 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1169, i32 0, i32 1 + %t1171 = load i64, ptr %t1170 + %t1172 = icmp sgt i64 %t1171, 0 + br label %logic.from3245 +logic.from3245: + br i1 %t1172, label %logic.rhs3246, label %logic.end3247 +logic.rhs3246: + %t1173 = getelementptr inbounds %S.gen.Template, ptr %a1168, i32 0, i32 7 + %t1174 = load i1, ptr %t1173 + %t1175 = xor i1 %t1174, true + br label %logic.rend3248 +logic.rend3248: + br label %logic.end3247 +logic.end3247: + %t1176 = phi i1 [ false, %logic.from3245 ], [ %t1175, %logic.rend3248 ] + br i1 %t1176, label %then3249, label %endif3251 +then3249: + %t1177 = load ptr, ptr %a1 + %t1178 = icmp eq ptr %t1177, null + br i1 %t1178, label %panic3252, label %ok3253 +panic3252: + call void @finch_panic(ptr @.str.2030, i64 1301, ptr @.str.2031) + unreachable +ok3253: + %t1179 = getelementptr inbounds %S.gen.Gen, ptr %t1177, i32 0, i32 0 + %t1180 = getelementptr inbounds %S.gen.Template, ptr %a1168, i32 0, i32 4 + %t1181 = load i64, ptr %t1180 + %t1182 = load { ptr, i64, i64 }, ptr %t1179 + %t1183 = extractvalue { ptr, i64, i64 } %t1182, 1 + %t1184 = icmp uge i64 %t1181, %t1183 + br i1 %t1184, label %range3254, label %inrange3255 +range3254: + call void @finch_panic_index(ptr @.str.2032, i64 1301, i64 %t1181, i64 %t1183) + unreachable +inrange3255: + %t1185 = extractvalue { ptr, i64, i64 } %t1182, 0 + %t1186 = getelementptr inbounds %S.ast.Program, ptr %t1185, i64 %t1181 + %t1187 = getelementptr inbounds %S.ast.Program, ptr %t1186, i32 0, i32 8 + %t1188 = getelementptr inbounds %S.gen.Template, ptr %a1168, i32 0, i32 5 + %t1189 = load i64, ptr %t1188 + %t1190 = load { ptr, i64, i64 }, ptr %t1187 + %t1191 = extractvalue { ptr, i64, i64 } %t1190, 1 + %t1192 = icmp uge i64 %t1189, %t1191 + br i1 %t1192, label %range3256, label %inrange3257 +range3256: + call void @finch_panic_index(ptr @.str.2033, i64 1301, i64 %t1189, i64 %t1191) + unreachable +inrange3257: + %t1193 = extractvalue { ptr, i64, i64 } %t1190, 0 + %t1194 = getelementptr inbounds %S.ast.Node, ptr %t1193, i64 %t1189 + %t1195 = load %S.ast.Node, ptr %t1194 + store %S.ast.Node %t1195, ptr %a1196 + call void @finch.copy.S_ast_Node(ptr %a1197, ptr %a1196) + %t1198 = load %S.ast.Node, ptr %a1197 + store %S.ast.Node %t1198, ptr %a1199 + %t1200 = load ptr, ptr %a1 + %t1201 = getelementptr inbounds %S.ast.Node, ptr %a1199, i32 0, i32 9 + %t1202 = getelementptr inbounds %S.ast.Node, ptr %a1199, i32 0, i32 9 + %t1203 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1202, i32 0, i32 1 + %t1204 = load i64, ptr %t1203 + %t1205 = sub i64 %t1204, 1 + %t1206 = load { ptr, i64, i64 }, ptr %t1201 + %t1207 = extractvalue { ptr, i64, i64 } %t1206, 1 + %t1208 = icmp uge i64 %t1205, %t1207 + br i1 %t1208, label %range3258, label %inrange3259 +range3258: + call void @finch_panic_index(ptr @.str.2035, i64 1302, i64 %t1205, i64 %t1207) + unreachable +inrange3259: + %t1209 = extractvalue { ptr, i64, i64 } %t1206, 0 + %t1210 = getelementptr inbounds %S.ast.Node, ptr %t1209, i64 %t1205 + %t1211 = load %S.ast.Node, ptr %t1210 + %t1212 = call i1 @finch.gen.mutates(ptr %t1200, { ptr, i64, i64 } { ptr @.str.2034, i64 4, i64 0 }, %S.ast.Node %t1211) + br i1 %t1212, label %then3260, label %endif3262 +then3260: + %t1213 = load ptr, ptr %a1 + %t1214 = icmp eq ptr %t1213, null + br i1 %t1214, label %panic3263, label %ok3264 +panic3263: + call void @finch_panic(ptr @.str.2036, i64 1303, ptr @.str.2037) + unreachable +ok3264: + %t1215 = getelementptr inbounds %S.gen.Gen, ptr %t1213, i32 0, i32 16 + %t1216 = load i64, ptr %a1152 + %t1217 = load { ptr, i64, i64 }, ptr %t1215 + %t1218 = extractvalue { ptr, i64, i64 } %t1217, 1 + %t1219 = icmp uge i64 %t1216, %t1218 + br i1 %t1219, label %range3265, label %inrange3266 +range3265: + call void @finch_panic_index(ptr @.str.2038, i64 1303, i64 %t1216, i64 %t1218) + unreachable +inrange3266: + %t1220 = extractvalue { ptr, i64, i64 } %t1217, 0 + %t1221 = getelementptr inbounds %S.gen.Template, ptr %t1220, i64 %t1216 + %t1222 = getelementptr inbounds %S.gen.Template, ptr %t1221, i32 0, i32 7 + store i1 true, ptr %t1222 + %t1223 = load ptr, ptr %a1 + %t1224 = icmp eq ptr %t1223, null + br i1 %t1224, label %panic3267, label %ok3268 +panic3267: + call void @finch_panic(ptr @.str.2039, i64 1304, ptr @.str.2040) + unreachable +ok3268: + %t1225 = getelementptr inbounds %S.gen.Gen, ptr %t1223, i32 0, i32 22 + %t1226 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1225, i32 0, i32 1 + %t1227 = getelementptr inbounds %S.gen.Template, ptr %a1168, i32 0, i32 1 + %t1228 = load { ptr, i64, i64 }, ptr %t1227 + store { ptr, i64, i64 } %t1228, ptr %a1229 + call void @finch_str_copy(ptr %a1230, ptr %a1229) + %t1231 = load { ptr, i64, i64 }, ptr %a1230 + %t1232 = load i64, ptr %t1226 + %t1233 = add i64 %t1232, 1 + call void @finch_arr_reserve(ptr %t1225, i64 %t1233, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t1234 = load ptr, ptr %t1225 + %t1235 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1234, i64 %t1232 + store { ptr, i64, i64 } %t1231, ptr %t1235 + store i64 %t1233, ptr %t1226 + store i1 true, ptr %a1023 + br label %endif3262 +endif3262: + br label %endif3251 +endif3251: + br label %for.step3239 +for.step3239: + %t1236 = load i64, ptr %a1152 + %t1237 = add i64 %t1236, 1 + store i64 %t1237, ptr %a1152 + br label %for.cond3237 +for.end3240: + br label %while.cond3182 +while.end3184: + %t1238 = load ptr, ptr %a1 + %t1239 = icmp eq ptr %t1238, null + br i1 %t1239, label %panic3269, label %ok3270 +panic3269: + call void @finch_panic(ptr @.str.2041, i64 1311, ptr @.str.2042) + unreachable +ok3270: + %t1240 = getelementptr inbounds %S.gen.Gen, ptr %t1238, i32 0, i32 14 + %t1241 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1240, i32 0, i32 1 + %t1242 = load i64, ptr %t1241 + store i64 0, ptr %a1243 + br label %for.cond3271 +for.cond3271: + %t1244 = load i64, ptr %a1243 + %t1245 = icmp slt i64 %t1244, %t1242 + br i1 %t1245, label %for.body3272, label %for.end3274 +for.body3272: + %t1246 = load ptr, ptr %a1 + %t1247 = icmp eq ptr %t1246, null + br i1 %t1247, label %panic3275, label %ok3276 +panic3275: + call void @finch_panic(ptr @.str.2043, i64 1312, ptr @.str.2044) + unreachable +ok3276: + %t1248 = getelementptr inbounds %S.gen.Gen, ptr %t1246, i32 0, i32 0 + %t1249 = load ptr, ptr %a1 + %t1250 = icmp eq ptr %t1249, null + br i1 %t1250, label %panic3277, label %ok3278 +panic3277: + call void @finch_panic(ptr @.str.2045, i64 1312, ptr @.str.2046) + unreachable +ok3278: + %t1251 = getelementptr inbounds %S.gen.Gen, ptr %t1249, i32 0, i32 14 + %t1252 = load i64, ptr %a1243 + %t1253 = load { ptr, i64, i64 }, ptr %t1251 + %t1254 = extractvalue { ptr, i64, i64 } %t1253, 1 + %t1255 = icmp uge i64 %t1252, %t1254 + br i1 %t1255, label %range3279, label %inrange3280 +range3279: + call void @finch_panic_index(ptr @.str.2047, i64 1312, i64 %t1252, i64 %t1254) + unreachable +inrange3280: + %t1256 = extractvalue { ptr, i64, i64 } %t1253, 0 + %t1257 = getelementptr inbounds %S.gen.FnSig, ptr %t1256, i64 %t1252 + %t1258 = getelementptr inbounds %S.gen.FnSig, ptr %t1257, i32 0, i32 16 + %t1259 = load i64, ptr %t1258 + %t1260 = load { ptr, i64, i64 }, ptr %t1248 + %t1261 = extractvalue { ptr, i64, i64 } %t1260, 1 + %t1262 = icmp uge i64 %t1259, %t1261 + br i1 %t1262, label %range3281, label %inrange3282 +range3281: + call void @finch_panic_index(ptr @.str.2048, i64 1312, i64 %t1259, i64 %t1261) + unreachable +inrange3282: + %t1263 = extractvalue { ptr, i64, i64 } %t1260, 0 + %t1264 = getelementptr inbounds %S.ast.Program, ptr %t1263, i64 %t1259 + %t1265 = getelementptr inbounds %S.ast.Program, ptr %t1264, i32 0, i32 8 + %t1266 = load ptr, ptr %a1 + %t1267 = icmp eq ptr %t1266, null + br i1 %t1267, label %panic3283, label %ok3284 +panic3283: + call void @finch_panic(ptr @.str.2049, i64 1312, ptr @.str.2050) + unreachable +ok3284: + %t1268 = getelementptr inbounds %S.gen.Gen, ptr %t1266, i32 0, i32 14 + %t1269 = load i64, ptr %a1243 + %t1270 = load { ptr, i64, i64 }, ptr %t1268 + %t1271 = extractvalue { ptr, i64, i64 } %t1270, 1 + %t1272 = icmp uge i64 %t1269, %t1271 + br i1 %t1272, label %range3285, label %inrange3286 +range3285: + call void @finch_panic_index(ptr @.str.2051, i64 1312, i64 %t1269, i64 %t1271) + unreachable +inrange3286: + %t1273 = extractvalue { ptr, i64, i64 } %t1270, 0 + %t1274 = getelementptr inbounds %S.gen.FnSig, ptr %t1273, i64 %t1269 + %t1275 = getelementptr inbounds %S.gen.FnSig, ptr %t1274, i32 0, i32 17 + %t1276 = load i64, ptr %t1275 + %t1277 = load { ptr, i64, i64 }, ptr %t1265 + %t1278 = extractvalue { ptr, i64, i64 } %t1277, 1 + %t1279 = icmp uge i64 %t1276, %t1278 + br i1 %t1279, label %range3287, label %inrange3288 +range3287: + call void @finch_panic_index(ptr @.str.2052, i64 1312, i64 %t1276, i64 %t1278) + unreachable +inrange3288: + %t1280 = extractvalue { ptr, i64, i64 } %t1277, 0 + %t1281 = getelementptr inbounds %S.ast.Node, ptr %t1280, i64 %t1276 + %t1282 = load %S.ast.Node, ptr %t1281 + store %S.ast.Node %t1282, ptr %a1283 + call void @finch.copy.S_ast_Node(ptr %a1284, ptr %a1283) + %t1285 = load %S.ast.Node, ptr %a1284 + store %S.ast.Node %t1285, ptr %a1286 + %t1287 = getelementptr inbounds %S.ast.Node, ptr %a1286, i32 0, i32 9 + %t1288 = getelementptr inbounds %S.ast.Node, ptr %a1286, i32 0, i32 9 + %t1289 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1288, i32 0, i32 1 + %t1290 = load i64, ptr %t1289 + %t1291 = sub i64 %t1290, 1 + %t1292 = load { ptr, i64, i64 }, ptr %t1287 + %t1293 = extractvalue { ptr, i64, i64 } %t1292, 1 + %t1294 = icmp uge i64 %t1291, %t1293 + br i1 %t1294, label %range3289, label %inrange3290 +range3289: + call void @finch_panic_index(ptr @.str.2053, i64 1313, i64 %t1291, i64 %t1293) + unreachable +inrange3290: + %t1295 = extractvalue { ptr, i64, i64 } %t1292, 0 + %t1296 = getelementptr inbounds %S.ast.Node, ptr %t1295, i64 %t1291 + %t1297 = load %S.ast.Node, ptr %t1296 + store %S.ast.Node %t1297, ptr %a1298 + call void @finch.copy.S_ast_Node(ptr %a1299, ptr %a1298) + %t1300 = load %S.ast.Node, ptr %a1299 + store %S.ast.Node %t1300, ptr %a1301 + %t1302 = load ptr, ptr %a1 + %t1303 = icmp eq ptr %t1302, null + br i1 %t1303, label %panic3291, label %ok3292 +panic3291: + call void @finch_panic(ptr @.str.2054, i64 1314, ptr @.str.2055) + unreachable +ok3292: + %t1304 = getelementptr inbounds %S.gen.Gen, ptr %t1302, i32 0, i32 14 + %t1305 = load i64, ptr %a1243 + %t1306 = load { ptr, i64, i64 }, ptr %t1304 + %t1307 = extractvalue { ptr, i64, i64 } %t1306, 1 + %t1308 = icmp uge i64 %t1305, %t1307 + br i1 %t1308, label %range3293, label %inrange3294 +range3293: + call void @finch_panic_index(ptr @.str.2056, i64 1314, i64 %t1305, i64 %t1307) + unreachable +inrange3294: + %t1309 = extractvalue { ptr, i64, i64 } %t1306, 0 + %t1310 = getelementptr inbounds %S.gen.FnSig, ptr %t1309, i64 %t1305 + %t1311 = getelementptr inbounds %S.gen.FnSig, ptr %t1310, i32 0, i32 13 + %t1312 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1311, i32 0, i32 1 + %t1313 = load i64, ptr %t1312 + store i64 0, ptr %a1314 + br label %for.cond3295 +for.cond3295: + %t1315 = load i64, ptr %a1314 + %t1316 = icmp slt i64 %t1315, %t1313 + br i1 %t1316, label %for.body3296, label %for.end3298 +for.body3296: + %t1317 = load ptr, ptr %a1 + %t1318 = icmp eq ptr %t1317, null + br i1 %t1318, label %panic3299, label %ok3300 +panic3299: + call void @finch_panic(ptr @.str.2057, i64 1315, ptr @.str.2058) + unreachable +ok3300: + %t1319 = getelementptr inbounds %S.gen.Gen, ptr %t1317, i32 0, i32 14 + %t1320 = load i64, ptr %a1243 + %t1321 = load { ptr, i64, i64 }, ptr %t1319 + %t1322 = extractvalue { ptr, i64, i64 } %t1321, 1 + %t1323 = icmp uge i64 %t1320, %t1322 + br i1 %t1323, label %range3301, label %inrange3302 +range3301: + call void @finch_panic_index(ptr @.str.2059, i64 1315, i64 %t1320, i64 %t1322) + unreachable +inrange3302: + %t1324 = extractvalue { ptr, i64, i64 } %t1321, 0 + %t1325 = getelementptr inbounds %S.gen.FnSig, ptr %t1324, i64 %t1320 + %t1326 = getelementptr inbounds %S.gen.FnSig, ptr %t1325, i32 0, i32 13 + %t1327 = load i64, ptr %a1314 + %t1328 = load { ptr, i64, i64 }, ptr %t1326 + %t1329 = extractvalue { ptr, i64, i64 } %t1328, 1 + %t1330 = icmp uge i64 %t1327, %t1329 + br i1 %t1330, label %range3303, label %inrange3304 +range3303: + call void @finch_panic_index(ptr @.str.2060, i64 1315, i64 %t1327, i64 %t1329) + unreachable +inrange3304: + %t1331 = extractvalue { ptr, i64, i64 } %t1328, 0 + %t1332 = getelementptr inbounds %S.ast.Type, ptr %t1331, i64 %t1327 + %t1333 = load %S.ast.Type, ptr %t1332 + store %S.ast.Type %t1333, ptr %a1334 + call void @finch.copy.S_ast_Type(ptr %a1335, ptr %a1334) + %t1336 = load %S.ast.Type, ptr %a1335 + store %S.ast.Type %t1336, ptr %a1337 + %t1338 = load ptr, ptr %a1 + %t1339 = icmp eq ptr %t1338, null + br i1 %t1339, label %panic3305, label %ok3306 +panic3305: + call void @finch_panic(ptr @.str.2061, i64 1316, ptr @.str.2062) + unreachable +ok3306: + %t1340 = getelementptr inbounds %S.gen.Gen, ptr %t1338, i32 0, i32 14 + %t1341 = load i64, ptr %a1243 + %t1342 = load { ptr, i64, i64 }, ptr %t1340 + %t1343 = extractvalue { ptr, i64, i64 } %t1342, 1 + %t1344 = icmp uge i64 %t1341, %t1343 + br i1 %t1344, label %range3307, label %inrange3308 +range3307: + call void @finch_panic_index(ptr @.str.2063, i64 1316, i64 %t1341, i64 %t1343) + unreachable +inrange3308: + %t1345 = extractvalue { ptr, i64, i64 } %t1342, 0 + %t1346 = getelementptr inbounds %S.gen.FnSig, ptr %t1345, i64 %t1341 + %t1347 = getelementptr inbounds %S.gen.FnSig, ptr %t1346, i32 0, i32 15 + %t1348 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1347, i32 0, i32 1 + %t1349 = load ptr, ptr %a1 + %t1350 = load %S.ast.Type, ptr %a1337 + %t1351 = call i1 @finch.gen.owning(ptr %t1349, %S.ast.Type %t1350) + br label %logic.from3309 +logic.from3309: + br i1 %t1351, label %logic.rhs3310, label %logic.end3311 +logic.rhs3310: + %t1352 = load ptr, ptr %a1 + %t1353 = load ptr, ptr %a1 + %t1354 = icmp eq ptr %t1353, null + br i1 %t1354, label %panic3312, label %ok3313 +panic3312: + call void @finch_panic(ptr @.str.2064, i64 1316, ptr @.str.2065) + unreachable +ok3313: + %t1355 = getelementptr inbounds %S.gen.Gen, ptr %t1353, i32 0, i32 14 + %t1356 = load i64, ptr %a1243 + %t1357 = load { ptr, i64, i64 }, ptr %t1355 + %t1358 = extractvalue { ptr, i64, i64 } %t1357, 1 + %t1359 = icmp uge i64 %t1356, %t1358 + br i1 %t1359, label %range3314, label %inrange3315 +range3314: + call void @finch_panic_index(ptr @.str.2066, i64 1316, i64 %t1356, i64 %t1358) + unreachable +inrange3315: + %t1360 = extractvalue { ptr, i64, i64 } %t1357, 0 + %t1361 = getelementptr inbounds %S.gen.FnSig, ptr %t1360, i64 %t1356 + %t1362 = getelementptr inbounds %S.gen.FnSig, ptr %t1361, i32 0, i32 14 + %t1363 = load i64, ptr %a1314 + %t1364 = load { ptr, i64, i64 }, ptr %t1362 + %t1365 = extractvalue { ptr, i64, i64 } %t1364, 1 + %t1366 = icmp uge i64 %t1363, %t1365 + br i1 %t1366, label %range3316, label %inrange3317 +range3316: + call void @finch_panic_index(ptr @.str.2067, i64 1316, i64 %t1363, i64 %t1365) + unreachable +inrange3317: + %t1367 = extractvalue { ptr, i64, i64 } %t1364, 0 + %t1368 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1367, i64 %t1363 + %t1369 = load { ptr, i64, i64 }, ptr %t1368 + %t1370 = load %S.ast.Node, ptr %a1301 + %t1371 = call i1 @finch.gen.mutates(ptr %t1352, { ptr, i64, i64 } %t1369, %S.ast.Node %t1370) + %t1372 = xor i1 %t1371, true + br label %logic.rend3318 +logic.rend3318: + br label %logic.end3311 +logic.end3311: + %t1373 = phi i1 [ false, %logic.from3309 ], [ %t1372, %logic.rend3318 ] + %t1374 = load i64, ptr %t1348 + %t1375 = add i64 %t1374, 1 + call void @finch_arr_reserve(ptr %t1347, i64 %t1375, i64 ptrtoint (ptr getelementptr (i1, ptr null, i32 1) to i64)) + %t1376 = load ptr, ptr %t1347 + %t1377 = getelementptr inbounds i1, ptr %t1376, i64 %t1374 + store i1 %t1373, ptr %t1377 + store i64 %t1375, ptr %t1348 + br label %for.step3297 +for.step3297: + %t1378 = load i64, ptr %a1314 + %t1379 = add i64 %t1378, 1 + store i64 %t1379, ptr %a1314 + br label %for.cond3295 +for.end3298: + br label %for.step3273 +for.step3273: + %t1380 = load i64, ptr %a1243 + %t1381 = add i64 %t1380, 1 + store i64 %t1381, ptr %a1243 + br label %for.cond3271 +for.end3274: + ret void +} + +define internal i64 @finch.gen.findTemplate(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, { ptr, i64, i64 } %p3, i1 %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca i1, align 16 + %a11 = alloca i64, align 16 + %a24 = alloca %S.gen.Template, align 16 + %a25 = alloca %S.gen.Template, align 16 + %a27 = alloca %S.gen.Template, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + store i1 %p4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic3319, label %ok3320 +panic3319: + call void @finch_panic(ptr @.str.2068, i64 1322, ptr @.str.2069) + unreachable +ok3320: + %t8 = getelementptr inbounds %S.gen.Gen, ptr %t6, i32 0, i32 16 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t8, i32 0, i32 1 + %t10 = load i64, ptr %t9 + store i64 0, ptr %a11 + br label %for.cond3321 +for.cond3321: + %t12 = load i64, ptr %a11 + %t13 = icmp slt i64 %t12, %t10 + br i1 %t13, label %for.body3322, label %for.end3324 +for.body3322: + %t14 = load ptr, ptr %a1 + %t15 = icmp eq ptr %t14, null + br i1 %t15, label %panic3325, label %ok3326 +panic3325: + call void @finch_panic(ptr @.str.2070, i64 1323, ptr @.str.2071) + unreachable +ok3326: + %t16 = getelementptr inbounds %S.gen.Gen, ptr %t14, i32 0, i32 16 + %t17 = load i64, ptr %a11 + %t18 = load { ptr, i64, i64 }, ptr %t16 + %t19 = extractvalue { ptr, i64, i64 } %t18, 1 + %t20 = icmp uge i64 %t17, %t19 + br i1 %t20, label %range3327, label %inrange3328 +range3327: + call void @finch_panic_index(ptr @.str.2072, i64 1323, i64 %t17, i64 %t19) + unreachable +inrange3328: + %t21 = extractvalue { ptr, i64, i64 } %t18, 0 + %t22 = getelementptr inbounds %S.gen.Template, ptr %t21, i64 %t17 + %t23 = load %S.gen.Template, ptr %t22 + store %S.gen.Template %t23, ptr %a24 + call void @finch.copy.S_gen_Template(ptr %a25, ptr %a24) + %t26 = load %S.gen.Template, ptr %a25 + store %S.gen.Template %t26, ptr %a27 + %t28 = getelementptr inbounds %S.gen.Template, ptr %a27, i32 0, i32 0 + %t29 = load { ptr, i64, i64 }, ptr %t28 + %t30 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t29, ptr %a31 + store { ptr, i64, i64 } %t30, ptr %a32 + %t33 = call i32 @finch_str_eq(ptr %a31, ptr %a32) + %t34 = icmp ne i32 %t33, 0 + br label %logic.from3329 +logic.from3329: + br i1 %t34, label %logic.rhs3330, label %logic.end3331 +logic.rhs3330: + %t35 = getelementptr inbounds %S.gen.Template, ptr %a27, i32 0, i32 1 + %t36 = load { ptr, i64, i64 }, ptr %t35 + %t37 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t36, ptr %a38 + store { ptr, i64, i64 } %t37, ptr %a39 + %t40 = call i32 @finch_str_eq(ptr %a38, ptr %a39) + %t41 = icmp ne i32 %t40, 0 + br label %logic.rend3332 +logic.rend3332: + br label %logic.end3331 +logic.end3331: + %t42 = phi i1 [ false, %logic.from3329 ], [ %t41, %logic.rend3332 ] + br label %logic.from3333 +logic.from3333: + br i1 %t42, label %logic.rhs3334, label %logic.end3335 +logic.rhs3334: + %t43 = getelementptr inbounds %S.gen.Template, ptr %a27, i32 0, i32 2 + %t44 = load { ptr, i64, i64 }, ptr %t43 + %t45 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t44, ptr %a46 + store { ptr, i64, i64 } %t45, ptr %a47 + %t48 = call i32 @finch_str_eq(ptr %a46, ptr %a47) + %t49 = icmp ne i32 %t48, 0 + br label %logic.rend3336 +logic.rend3336: + br label %logic.end3335 +logic.end3335: + %t50 = phi i1 [ false, %logic.from3333 ], [ %t49, %logic.rend3336 ] + br label %logic.from3337 +logic.from3337: + br i1 %t50, label %logic.rhs3338, label %logic.end3339 +logic.rhs3338: + %t51 = getelementptr inbounds %S.gen.Template, ptr %a27, i32 0, i32 6 + %t52 = load i1, ptr %t51 + %t53 = load i1, ptr %a5 + %t54 = icmp eq i1 %t52, %t53 + br label %logic.rend3340 +logic.rend3340: + br label %logic.end3339 +logic.end3339: + %t55 = phi i1 [ false, %logic.from3337 ], [ %t54, %logic.rend3340 ] + br i1 %t55, label %then3341, label %endif3343 +then3341: + %t56 = load i64, ptr %a11 + ret i64 %t56 +endif3343: + br label %for.step3323 +for.step3323: + %t57 = load i64, ptr %a11 + %t58 = add i64 %t57, 1 + store i64 %t58, ptr %a11 + br label %for.cond3321 +for.end3324: + ret i64 -1 +} + +define internal { ptr, i64, i64 } @finch.gen.shownTypes({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca i64, align 16 + %a11 = alloca %S.ast.Type, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } zeroinitializer, ptr %a2 + store i64 0, ptr %a3 + br label %each.cond3344 +each.cond3344: + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t5 = load i64, ptr %t4 + %t6 = load i64, ptr %a3 + %t7 = icmp slt i64 %t6, %t5 + br i1 %t7, label %each.body3345, label %each.end3347 +each.body3345: + %t8 = load ptr, ptr %a1 + %t9 = getelementptr inbounds %S.ast.Type, ptr %t8, i64 %t6 + %t10 = load %S.ast.Type, ptr %t9 + store %S.ast.Type %t10, ptr %a11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t13 = load %S.ast.Type, ptr %a11 + %t14 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t13) + %t15 = load i64, ptr %t12 + %t16 = add i64 %t15, 1 + call void @finch_arr_reserve(ptr %a2, i64 %t16, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t17 = load ptr, ptr %a2 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t17, i64 %t15 + store { ptr, i64, i64 } %t14, ptr %t18 + store i64 %t16, ptr %t12 + br label %each.step3346 +each.step3346: + %t19 = load i64, ptr %a3 + %t20 = add i64 %t19, 1 + store i64 %t20, ptr %a3 + br label %each.cond3344 +each.end3347: + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2073, i64 2, i64 0 }, ptr %a22 + call void @finch_str_join(ptr %a23, ptr %a2, ptr %a22) + %t24 = load { ptr, i64, i64 }, ptr %a23 + ret { ptr, i64, i64 } %t24 +} + +define internal %S.ast.Type @finch.gen.instStruct(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, { ptr, i64, i64 } %p3, %S.ast.Node %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca %S.ast.Node, align 16 + %a10 = alloca i64, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca %S.gen.Template, align 16 + %a44 = alloca %S.gen.Template, align 16 + %a46 = alloca %S.gen.Template, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + store %S.ast.Node %p4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = load { ptr, i64, i64 }, ptr %a2 + %t8 = load { ptr, i64, i64 }, ptr %a3 + %t9 = call i64 @finch.gen.findTemplate(ptr %t6, { ptr, i64, i64 } %t7, { ptr, i64, i64 } %t8, { ptr, i64, i64 } { ptr @.str.2074, i64 0, i64 0 }, i1 true) + store i64 %t9, ptr %a10 + %t11 = load i64, ptr %a10 + %t12 = icmp slt i64 %t11, 0 + br i1 %t12, label %then3348, label %endif3350 +then3348: + %t13 = load ptr, ptr %a1 + %t14 = load %S.ast.Node, ptr %a5 + %t15 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.2075, i64 34, i64 0 }, ptr %a17 + store { ptr, i64, i64 } %t15, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t19, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.2076, i64 28, i64 0 }, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + %t24 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t23, ptr %a26 + store { ptr, i64, i64 } %t24, ptr %a27 + call void @finch_str_concat(ptr %a25, ptr %a26, ptr %a27) + %t28 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t28, ptr %a30 + store { ptr, i64, i64 } { ptr @.str.2077, i64 34, i64 0 }, ptr %a31 + call void @finch_str_concat(ptr %a29, ptr %a30, ptr %a31) + %t32 = load { ptr, i64, i64 }, ptr %a29 + call void @finch.gen.fail(ptr %t13, %S.ast.Node %t14, { ptr, i64, i64 } %t32) + br label %endif3350 +endif3350: + %t33 = load ptr, ptr %a1 + %t34 = icmp eq ptr %t33, null + br i1 %t34, label %panic3351, label %ok3352 +panic3351: + call void @finch_panic(ptr @.str.2078, i64 1345, ptr @.str.2079) + unreachable +ok3352: + %t35 = getelementptr inbounds %S.gen.Gen, ptr %t33, i32 0, i32 16 + %t36 = load i64, ptr %a10 + %t37 = load { ptr, i64, i64 }, ptr %t35 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 %t36, %t38 + br i1 %t39, label %range3353, label %inrange3354 +range3353: + call void @finch_panic_index(ptr @.str.2080, i64 1345, i64 %t36, i64 %t38) + unreachable +inrange3354: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds %S.gen.Template, ptr %t40, i64 %t36 + %t42 = load %S.gen.Template, ptr %t41 + store %S.gen.Template %t42, ptr %a43 + call void @finch.copy.S_gen_Template(ptr %a44, ptr %a43) + %t45 = load %S.gen.Template, ptr %a44 + store %S.gen.Template %t45, ptr %a46 + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t48 = load i64, ptr %t47 + %t49 = getelementptr inbounds %S.gen.Template, ptr %a46, i32 0, i32 3 + %t50 = getelementptr inbounds { ptr, i64, i64 }, ptr %t49, i32 0, i32 1 + %t51 = load i64, ptr %t50 + %t52 = icmp ne i64 %t48, %t51 + br i1 %t52, label %then3355, label %endif3357 +then3355: + %t53 = load ptr, ptr %a1 + %t54 = load %S.ast.Node, ptr %a5 + %t55 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t55, ptr %a57 + store { ptr, i64, i64 } { ptr @.str.2081, i64 7, i64 0 }, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + %t60 = getelementptr inbounds %S.gen.Template, ptr %a46, i32 0, i32 3 + %t61 = getelementptr inbounds { ptr, i64, i64 }, ptr %t60, i32 0, i32 1 + %t62 = load i64, ptr %t61 + call void @finch_str_from_int(ptr %a63, i64 %t62) + %t64 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t59, ptr %a66 + store { ptr, i64, i64 } %t64, ptr %a67 + call void @finch_str_concat(ptr %a65, ptr %a66, ptr %a67) + %t68 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t68, ptr %a70 + store { ptr, i64, i64 } { ptr @.str.2082, i64 24, i64 0 }, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + %t73 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t72, ptr %a75 + store { ptr, i64, i64 } %t73, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t77, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.2083, i64 1, i64 0 }, ptr %a80 + call void @finch_str_concat(ptr %a78, ptr %a79, ptr %a80) + %t81 = load { ptr, i64, i64 }, ptr %a78 + %t82 = getelementptr inbounds %S.gen.Template, ptr %a46, i32 0, i32 3 + %t83 = getelementptr inbounds { ptr, i64, i64 }, ptr %t82, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2084, i64 2, i64 0 }, ptr %a84 + call void @finch_str_join(ptr %a85, ptr %t82, ptr %a84) + %t86 = load { ptr, i64, i64 }, ptr %a85 + store { ptr, i64, i64 } %t81, ptr %a88 + store { ptr, i64, i64 } %t86, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t90, ptr %a92 + store { ptr, i64, i64 } { ptr @.str.2085, i64 11, i64 0 }, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t96 = load i64, ptr %t95 + call void @finch_str_from_int(ptr %a97, i64 %t96) + %t98 = load { ptr, i64, i64 }, ptr %a97 + store { ptr, i64, i64 } %t94, ptr %a100 + store { ptr, i64, i64 } %t98, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + call void @finch.gen.fail(ptr %t53, %S.ast.Node %t54, { ptr, i64, i64 } %t102) + br label %endif3357 +endif3357: + %t103 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t103, ptr %a105 + store { ptr, i64, i64 } { ptr @.str.2086, i64 1, i64 0 }, ptr %a106 + call void @finch_str_concat(ptr %a104, ptr %a105, ptr %a106) + %t107 = load { ptr, i64, i64 }, ptr %a104 + %t108 = load { ptr, i64, i64 }, ptr %a4 + %t109 = call { ptr, i64, i64 } @finch.gen.shownTypes({ ptr, i64, i64 } %t108) + store { ptr, i64, i64 } %t107, ptr %a111 + store { ptr, i64, i64 } %t109, ptr %a112 + call void @finch_str_concat(ptr %a110, ptr %a111, ptr %a112) + %t113 = load { ptr, i64, i64 }, ptr %a110 + store { ptr, i64, i64 } %t113, ptr %a115 + store { ptr, i64, i64 } { ptr @.str.2087, i64 1, i64 0 }, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + store { ptr, i64, i64 } %t117, ptr %a118 + %t119 = load ptr, ptr %a1 + %t120 = load { ptr, i64, i64 }, ptr %a2 + %t121 = load { ptr, i64, i64 }, ptr %a118 + %t122 = call i64 @finch.gen.findStruct(ptr %t119, { ptr, i64, i64 } %t120, { ptr, i64, i64 } %t121) + %t123 = icmp slt i64 %t122, 0 + br i1 %t123, label %then3358, label %endif3360 +then3358: + %t124 = load ptr, ptr %a1 + %t125 = icmp eq ptr %t124, null + br i1 %t125, label %panic3361, label %ok3362 +panic3361: + call void @finch_panic(ptr @.str.2088, i64 1351, ptr @.str.2089) + unreachable +ok3362: + %t126 = getelementptr inbounds %S.gen.Gen, ptr %t124, i32 0, i32 15 + %t127 = getelementptr inbounds { ptr, i64, i64 }, ptr %t126, i32 0, i32 1 + %t128 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t128, ptr %a129 + call void @finch_str_copy(ptr %a130, ptr %a129) + %t131 = load { ptr, i64, i64 }, ptr %a130 + %t132 = insertvalue %S.gen.StructDef zeroinitializer, { ptr, i64, i64 } %t131, 0 + %t133 = load { ptr, i64, i64 }, ptr %a118 + store { ptr, i64, i64 } %t133, ptr %a134 + call void @finch_str_copy(ptr %a135, ptr %a134) + %t136 = load { ptr, i64, i64 }, ptr %a135 + %t137 = insertvalue %S.gen.StructDef %t132, { ptr, i64, i64 } %t136, 1 + %t138 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t138, ptr %a139 + call void @finch_str_copy(ptr %a140, ptr %a139) + %t141 = load { ptr, i64, i64 }, ptr %a140 + %t142 = insertvalue %S.gen.StructDef %t137, { ptr, i64, i64 } %t141, 5 + %t143 = getelementptr inbounds %S.gen.Template, ptr %a46, i32 0, i32 3 + %t144 = load { ptr, i64, i64 }, ptr %t143 + store { ptr, i64, i64 } %t144, ptr %a145 + call void @finch.copy.arr_str(ptr %a146, ptr %a145) + %t147 = load { ptr, i64, i64 }, ptr %a146 + %t148 = insertvalue %S.gen.StructDef %t142, { ptr, i64, i64 } %t147, 6 + %t149 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t149, ptr %a150 + call void @finch.copy.arr_S_ast_Type(ptr %a151, ptr %a150) + %t152 = load { ptr, i64, i64 }, ptr %a151 + %t153 = insertvalue %S.gen.StructDef %t148, { ptr, i64, i64 } %t152, 7 + %t154 = getelementptr inbounds %S.gen.Template, ptr %a46, i32 0, i32 4 + %t155 = load i64, ptr %t154 + %t156 = insertvalue %S.gen.StructDef %t153, i64 %t155, 13 + %t157 = getelementptr inbounds %S.gen.Template, ptr %a46, i32 0, i32 5 + %t158 = load i64, ptr %t157 + %t159 = insertvalue %S.gen.StructDef %t156, i64 %t158, 14 + %t160 = load i64, ptr %t127 + %t161 = add i64 %t160, 1 + call void @finch_arr_reserve(ptr %t126, i64 %t161, i64 ptrtoint (ptr getelementptr (%S.gen.StructDef, ptr null, i32 1) to i64)) + %t162 = load ptr, ptr %t126 + %t163 = getelementptr inbounds %S.gen.StructDef, ptr %t162, i64 %t160 + store %S.gen.StructDef %t159, ptr %t163 + store i64 %t161, ptr %t127 + %t164 = load ptr, ptr %a1 + %t165 = load ptr, ptr %a1 + %t166 = icmp eq ptr %t165, null + br i1 %t166, label %panic3363, label %ok3364 +panic3363: + call void @finch_panic(ptr @.str.2090, i64 1352, ptr @.str.2091) + unreachable +ok3364: + %t167 = getelementptr inbounds %S.gen.Gen, ptr %t165, i32 0, i32 15 + %t168 = getelementptr inbounds { ptr, i64, i64 }, ptr %t167, i32 0, i32 1 + %t169 = load i64, ptr %t168 + %t170 = sub i64 %t169, 1 + call void @finch.gen.resolveStruct(ptr %t164, i64 %t170) + br label %endif3360 +endif3360: + %t171 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.2092, i64 6, i64 0 }, 0 + %t172 = load { ptr, i64, i64 }, ptr %a118 + store { ptr, i64, i64 } %t172, ptr %a173 + call void @finch_str_copy(ptr %a174, ptr %a173) + %t175 = load { ptr, i64, i64 }, ptr %a174 + %t176 = insertvalue %S.ast.Type %t171, { ptr, i64, i64 } %t175, 2 + %t177 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t177, ptr %a178 + call void @finch_str_copy(ptr %a179, ptr %a178) + %t180 = load { ptr, i64, i64 }, ptr %a179 + %t181 = insertvalue %S.ast.Type %t176, { ptr, i64, i64 } %t180, 3 + ret %S.ast.Type %t181 +} + +define internal i64 @finch.gen.instFn(ptr %p0, i64 %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3, %S.ast.Node %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca %S.ast.Node, align 16 + %a16 = alloca %S.gen.Template, align 16 + %a17 = alloca %S.gen.Template, align 16 + %a19 = alloca %S.gen.Template, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca i64, align 16 + %a58 = alloca i64, align 16 + %a81 = alloca %S.ast.Node, align 16 + %a82 = alloca %S.ast.Node, align 16 + %a84 = alloca %S.ast.Node, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca %S.gen.FnSig, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a270 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca %S.ast.Node, align 16 + %a293 = alloca %S.ast.Node, align 16 + %a295 = alloca %S.ast.Node, align 16 + %a300 = alloca i64, align 16 + %a322 = alloca %S.ast.Type, align 16 + %a326 = alloca %S.ast.Type, align 16 + %a327 = alloca %S.ast.Type, align 16 + %a344 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a395 = alloca { ptr, i64, i64 }, align 16 + %a401 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca %S.gen.FnSig, align 16 + %a410 = alloca %S.gen.FnSig, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store %S.ast.Node %p4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic3365, label %ok3366 +panic3365: + call void @finch_panic(ptr @.str.2093, i64 1359, ptr @.str.2094) + unreachable +ok3366: + %t8 = getelementptr inbounds %S.gen.Gen, ptr %t6, i32 0, i32 16 + %t9 = load i64, ptr %a2 + %t10 = load { ptr, i64, i64 }, ptr %t8 + %t11 = extractvalue { ptr, i64, i64 } %t10, 1 + %t12 = icmp uge i64 %t9, %t11 + br i1 %t12, label %range3367, label %inrange3368 +range3367: + call void @finch_panic_index(ptr @.str.2095, i64 1359, i64 %t9, i64 %t11) + unreachable +inrange3368: + %t13 = extractvalue { ptr, i64, i64 } %t10, 0 + %t14 = getelementptr inbounds %S.gen.Template, ptr %t13, i64 %t9 + %t15 = load %S.gen.Template, ptr %t14 + store %S.gen.Template %t15, ptr %a16 + call void @finch.copy.S_gen_Template(ptr %a17, ptr %a16) + %t18 = load %S.gen.Template, ptr %a17 + store %S.gen.Template %t18, ptr %a19 + %t20 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 1 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.2096, i64 1, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + %t26 = load { ptr, i64, i64 }, ptr %a3 + %t27 = call { ptr, i64, i64 } @finch.gen.shownTypes({ ptr, i64, i64 } %t26) + store { ptr, i64, i64 } %t25, ptr %a29 + store { ptr, i64, i64 } %t27, ptr %a30 + call void @finch_str_concat(ptr %a28, ptr %a29, ptr %a30) + %t31 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } %t31, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.2097, i64 1, i64 0 }, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t35, ptr %a36 + %t37 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 2 + %t38 = getelementptr inbounds { ptr, i64, i64 }, ptr %t37, i32 0, i32 1 + %t39 = load i64, ptr %t38 + %t40 = icmp sgt i64 %t39, 0 + br i1 %t40, label %then3369, label %else3370 +then3369: + %t41 = load ptr, ptr %a1 + %t42 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 0 + %t43 = load { ptr, i64, i64 }, ptr %t42 + %t44 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 2 + %t45 = load { ptr, i64, i64 }, ptr %t44 + %t46 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 1 + %t47 = load { ptr, i64, i64 }, ptr %t46 + %t48 = call i64 @finch.gen.findMethod(ptr %t41, { ptr, i64, i64 } %t43, { ptr, i64, i64 } %t45, { ptr, i64, i64 } %t47) + store i64 %t48, ptr %a49 + %t50 = load i64, ptr %a49 + %t51 = icmp sge i64 %t50, 0 + br i1 %t51, label %then3372, label %endif3374 +then3372: + %t52 = load i64, ptr %a49 + ret i64 %t52 +endif3374: + br label %endif3371 +else3370: + %t53 = load ptr, ptr %a1 + %t54 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 0 + %t55 = load { ptr, i64, i64 }, ptr %t54 + %t56 = load { ptr, i64, i64 }, ptr %a36 + %t57 = call i64 @finch.gen.findFn(ptr %t53, { ptr, i64, i64 } %t55, { ptr, i64, i64 } %t56) + store i64 %t57, ptr %a58 + %t59 = load i64, ptr %a58 + %t60 = icmp sge i64 %t59, 0 + br i1 %t60, label %then3375, label %endif3377 +then3375: + %t61 = load i64, ptr %a58 + ret i64 %t61 +endif3377: + br label %endif3371 +endif3371: + %t62 = load ptr, ptr %a1 + %t63 = icmp eq ptr %t62, null + br i1 %t63, label %panic3378, label %ok3379 +panic3378: + call void @finch_panic(ptr @.str.2098, i64 1372, ptr @.str.2099) + unreachable +ok3379: + %t64 = getelementptr inbounds %S.gen.Gen, ptr %t62, i32 0, i32 0 + %t65 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 4 + %t66 = load i64, ptr %t65 + %t67 = load { ptr, i64, i64 }, ptr %t64 + %t68 = extractvalue { ptr, i64, i64 } %t67, 1 + %t69 = icmp uge i64 %t66, %t68 + br i1 %t69, label %range3380, label %inrange3381 +range3380: + call void @finch_panic_index(ptr @.str.2100, i64 1372, i64 %t66, i64 %t68) + unreachable +inrange3381: + %t70 = extractvalue { ptr, i64, i64 } %t67, 0 + %t71 = getelementptr inbounds %S.ast.Program, ptr %t70, i64 %t66 + %t72 = getelementptr inbounds %S.ast.Program, ptr %t71, i32 0, i32 8 + %t73 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 5 + %t74 = load i64, ptr %t73 + %t75 = load { ptr, i64, i64 }, ptr %t72 + %t76 = extractvalue { ptr, i64, i64 } %t75, 1 + %t77 = icmp uge i64 %t74, %t76 + br i1 %t77, label %range3382, label %inrange3383 +range3382: + call void @finch_panic_index(ptr @.str.2101, i64 1372, i64 %t74, i64 %t76) + unreachable +inrange3383: + %t78 = extractvalue { ptr, i64, i64 } %t75, 0 + %t79 = getelementptr inbounds %S.ast.Node, ptr %t78, i64 %t74 + %t80 = load %S.ast.Node, ptr %t79 + store %S.ast.Node %t80, ptr %a81 + call void @finch.copy.S_ast_Node(ptr %a82, ptr %a81) + %t83 = load %S.ast.Node, ptr %a82 + store %S.ast.Node %t83, ptr %a84 + %t85 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 0 + %t86 = load { ptr, i64, i64 }, ptr %t85 + store { ptr, i64, i64 } %t86, ptr %a87 + call void @finch_str_copy(ptr %a88, ptr %a87) + %t89 = load { ptr, i64, i64 }, ptr %a88 + %t90 = insertvalue %S.gen.FnSig zeroinitializer, { ptr, i64, i64 } %t89, 0 + %t91 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t91, ptr %a92 + call void @finch_str_copy(ptr %a93, ptr %a92) + %t94 = load { ptr, i64, i64 }, ptr %a93 + %t95 = insertvalue %S.gen.FnSig %t90, { ptr, i64, i64 } %t94, 1 + %t96 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 0 + %t97 = load { ptr, i64, i64 }, ptr %t96 + store { ptr, i64, i64 } %t97, ptr %a98 + call void @finch_str_copy(ptr %a99, ptr %a98) + %t100 = load { ptr, i64, i64 }, ptr %a99 + %t101 = insertvalue %S.gen.FnSig %t95, { ptr, i64, i64 } %t100, 3 + %t102 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t103 = load { ptr, i64, i64 }, ptr %t102 + store { ptr, i64, i64 } %t103, ptr %a104 + call void @finch.copy.arr_str(ptr %a105, ptr %a104) + %t106 = load { ptr, i64, i64 }, ptr %a105 + %t107 = insertvalue %S.gen.FnSig %t101, { ptr, i64, i64 } %t106, 6 + %t108 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t108, ptr %a109 + call void @finch.copy.arr_S_ast_Type(ptr %a110, ptr %a109) + %t111 = load { ptr, i64, i64 }, ptr %a110 + %t112 = insertvalue %S.gen.FnSig %t107, { ptr, i64, i64 } %t111, 7 + %t113 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t113, ptr %a114 + call void @finch_str_copy(ptr %a115, ptr %a114) + %t116 = load { ptr, i64, i64 }, ptr %a115 + %t117 = insertvalue %S.gen.FnSig %t112, { ptr, i64, i64 } %t116, 8 + %t118 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 7 + %t119 = load i1, ptr %t118 + %t120 = insertvalue %S.gen.FnSig %t117, i1 %t119, 9 + %t121 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 7 + %t122 = load i1, ptr %t121 + %t123 = insertvalue %S.gen.FnSig %t120, i1 %t122, 10 + %t124 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 4 + %t125 = load i64, ptr %t124 + %t126 = insertvalue %S.gen.FnSig %t123, i64 %t125, 16 + %t127 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 5 + %t128 = load i64, ptr %t127 + %t129 = insertvalue %S.gen.FnSig %t126, i64 %t128, 17 + store %S.gen.FnSig %t129, ptr %a130 + %t131 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 0 + %t132 = load { ptr, i64, i64 }, ptr %t131 + %t133 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t132) + store { ptr, i64, i64 } { ptr @.str.2102, i64 7, i64 0 }, ptr %a135 + store { ptr, i64, i64 } %t133, ptr %a136 + call void @finch_str_concat(ptr %a134, ptr %a135, ptr %a136) + %t137 = load { ptr, i64, i64 }, ptr %a134 + store { ptr, i64, i64 } %t137, ptr %a139 + store { ptr, i64, i64 } { ptr @.str.2103, i64 1, i64 0 }, ptr %a140 + call void @finch_str_concat(ptr %a138, ptr %a139, ptr %a140) + %t141 = load { ptr, i64, i64 }, ptr %a138 + %t142 = load { ptr, i64, i64 }, ptr %a36 + %t143 = call { ptr, i64, i64 } @finch.gen.mangle({ ptr, i64, i64 } %t142) + store { ptr, i64, i64 } %t141, ptr %a145 + store { ptr, i64, i64 } %t143, ptr %a146 + call void @finch_str_concat(ptr %a144, ptr %a145, ptr %a146) + %t147 = load { ptr, i64, i64 }, ptr %a144 + %t148 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 11 + store { ptr, i64, i64 } %t147, ptr %t148 + %t149 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 2 + %t150 = getelementptr inbounds { ptr, i64, i64 }, ptr %t149, i32 0, i32 1 + %t151 = load i64, ptr %t150 + %t152 = icmp sgt i64 %t151, 0 + br i1 %t152, label %then3384, label %endif3386 +then3384: + %t153 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 1 + %t154 = load { ptr, i64, i64 }, ptr %t153 + %t155 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 1 + store { ptr, i64, i64 } %t154, ptr %a156 + call void @finch_str_copy(ptr %a157, ptr %a156) + %t158 = load { ptr, i64, i64 }, ptr %a157 + store { ptr, i64, i64 } %t158, ptr %t155 + %t159 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 2 + %t160 = load { ptr, i64, i64 }, ptr %t159 + %t161 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 2 + store { ptr, i64, i64 } %t160, ptr %a162 + call void @finch_str_copy(ptr %a163, ptr %a162) + %t164 = load { ptr, i64, i64 }, ptr %a163 + store { ptr, i64, i64 } %t164, ptr %t161 + %t165 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 2 + %t166 = load { ptr, i64, i64 }, ptr %t165 + store { ptr, i64, i64 } %t166, ptr %a168 + store { ptr, i64, i64 } { ptr @.str.2104, i64 1, i64 0 }, ptr %a169 + call void @finch_str_concat(ptr %a167, ptr %a168, ptr %a169) + %t170 = load { ptr, i64, i64 }, ptr %a167 + %t171 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 1 + %t172 = load { ptr, i64, i64 }, ptr %t171 + store { ptr, i64, i64 } %t170, ptr %a174 + store { ptr, i64, i64 } %t172, ptr %a175 + call void @finch_str_concat(ptr %a173, ptr %a174, ptr %a175) + %t176 = load { ptr, i64, i64 }, ptr %a173 + %t177 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 8 + store { ptr, i64, i64 } %t176, ptr %t177 + %t178 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 0 + %t179 = load { ptr, i64, i64 }, ptr %t178 + %t180 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t179) + store { ptr, i64, i64 } { ptr @.str.2105, i64 7, i64 0 }, ptr %a182 + store { ptr, i64, i64 } %t180, ptr %a183 + call void @finch_str_concat(ptr %a181, ptr %a182, ptr %a183) + %t184 = load { ptr, i64, i64 }, ptr %a181 + store { ptr, i64, i64 } %t184, ptr %a186 + store { ptr, i64, i64 } { ptr @.str.2106, i64 1, i64 0 }, ptr %a187 + call void @finch_str_concat(ptr %a185, ptr %a186, ptr %a187) + %t188 = load { ptr, i64, i64 }, ptr %a185 + %t189 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 2 + %t190 = load { ptr, i64, i64 }, ptr %t189 + %t191 = call { ptr, i64, i64 } @finch.gen.mangle({ ptr, i64, i64 } %t190) + store { ptr, i64, i64 } %t188, ptr %a193 + store { ptr, i64, i64 } %t191, ptr %a194 + call void @finch_str_concat(ptr %a192, ptr %a193, ptr %a194) + %t195 = load { ptr, i64, i64 }, ptr %a192 + store { ptr, i64, i64 } %t195, ptr %a197 + store { ptr, i64, i64 } { ptr @.str.2107, i64 1, i64 0 }, ptr %a198 + call void @finch_str_concat(ptr %a196, ptr %a197, ptr %a198) + %t199 = load { ptr, i64, i64 }, ptr %a196 + %t200 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 1 + %t201 = load { ptr, i64, i64 }, ptr %t200 + store { ptr, i64, i64 } %t199, ptr %a203 + store { ptr, i64, i64 } %t201, ptr %a204 + call void @finch_str_concat(ptr %a202, ptr %a203, ptr %a204) + %t205 = load { ptr, i64, i64 }, ptr %a202 + %t206 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 11 + store { ptr, i64, i64 } %t205, ptr %t206 + br label %endif3386 +endif3386: + %t207 = load ptr, ptr %a1 + %t208 = icmp eq ptr %t207, null + br i1 %t208, label %panic3387, label %ok3388 +panic3387: + call void @finch_panic(ptr @.str.2108, i64 1381, ptr @.str.2109) + unreachable +ok3388: + %t209 = getelementptr inbounds %S.gen.Gen, ptr %t207, i32 0, i32 17 + %t210 = load { ptr, i64, i64 }, ptr %t209 + store { ptr, i64, i64 } %t210, ptr %a211 + call void @finch.copy.arr_str(ptr %a212, ptr %a211) + %t213 = load { ptr, i64, i64 }, ptr %a212 + store { ptr, i64, i64 } %t213, ptr %a214 + %t215 = load ptr, ptr %a1 + %t216 = icmp eq ptr %t215, null + br i1 %t216, label %panic3389, label %ok3390 +panic3389: + call void @finch_panic(ptr @.str.2110, i64 1382, ptr @.str.2111) + unreachable +ok3390: + %t217 = getelementptr inbounds %S.gen.Gen, ptr %t215, i32 0, i32 18 + %t218 = load { ptr, i64, i64 }, ptr %t217 + store { ptr, i64, i64 } %t218, ptr %a219 + call void @finch.copy.arr_S_ast_Type(ptr %a220, ptr %a219) + %t221 = load { ptr, i64, i64 }, ptr %a220 + store { ptr, i64, i64 } %t221, ptr %a222 + %t223 = load ptr, ptr %a1 + %t224 = icmp eq ptr %t223, null + br i1 %t224, label %panic3391, label %ok3392 +panic3391: + call void @finch_panic(ptr @.str.2112, i64 1383, ptr @.str.2113) + unreachable +ok3392: + %t225 = getelementptr inbounds %S.gen.Gen, ptr %t223, i32 0, i32 13 + %t226 = load { ptr, i64, i64 }, ptr %t225 + store { ptr, i64, i64 } %t226, ptr %a227 + call void @finch_str_copy(ptr %a228, ptr %a227) + %t229 = load { ptr, i64, i64 }, ptr %a228 + store { ptr, i64, i64 } %t229, ptr %a230 + %t231 = load ptr, ptr %a1 + %t232 = icmp eq ptr %t231, null + br i1 %t232, label %panic3393, label %ok3394 +panic3393: + call void @finch_panic(ptr @.str.2114, i64 1384, ptr @.str.2115) + unreachable +ok3394: + %t233 = getelementptr inbounds %S.gen.Gen, ptr %t231, i32 0, i32 19 + %t234 = load { ptr, i64, i64 }, ptr %t233 + store { ptr, i64, i64 } %t234, ptr %a235 + call void @finch_str_copy(ptr %a236, ptr %a235) + %t237 = load { ptr, i64, i64 }, ptr %a236 + store { ptr, i64, i64 } %t237, ptr %a238 + %t239 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t240 = load { ptr, i64, i64 }, ptr %t239 + %t241 = load ptr, ptr %a1 + %t242 = icmp eq ptr %t241, null + br i1 %t242, label %panic3395, label %ok3396 +panic3395: + call void @finch_panic(ptr @.str.2116, i64 1385, ptr @.str.2117) + unreachable +ok3396: + %t243 = getelementptr inbounds %S.gen.Gen, ptr %t241, i32 0, i32 17 + store { ptr, i64, i64 } %t240, ptr %a244 + call void @finch.copy.arr_str(ptr %a245, ptr %a244) + %t246 = load { ptr, i64, i64 }, ptr %a245 + store { ptr, i64, i64 } %t246, ptr %t243 + %t247 = load { ptr, i64, i64 }, ptr %a3 + %t248 = load ptr, ptr %a1 + %t249 = icmp eq ptr %t248, null + br i1 %t249, label %panic3397, label %ok3398 +panic3397: + call void @finch_panic(ptr @.str.2118, i64 1386, ptr @.str.2119) + unreachable +ok3398: + %t250 = getelementptr inbounds %S.gen.Gen, ptr %t248, i32 0, i32 18 + store { ptr, i64, i64 } %t247, ptr %a251 + call void @finch.copy.arr_S_ast_Type(ptr %a252, ptr %a251) + %t253 = load { ptr, i64, i64 }, ptr %a252 + store { ptr, i64, i64 } %t253, ptr %t250 + %t254 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 0 + %t255 = load { ptr, i64, i64 }, ptr %t254 + %t256 = load ptr, ptr %a1 + %t257 = icmp eq ptr %t256, null + br i1 %t257, label %panic3399, label %ok3400 +panic3399: + call void @finch_panic(ptr @.str.2120, i64 1387, ptr @.str.2121) + unreachable +ok3400: + %t258 = getelementptr inbounds %S.gen.Gen, ptr %t256, i32 0, i32 13 + store { ptr, i64, i64 } %t255, ptr %a259 + call void @finch_str_copy(ptr %a260, ptr %a259) + %t261 = load { ptr, i64, i64 }, ptr %a260 + store { ptr, i64, i64 } %t261, ptr %t258 + %t262 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 8 + %t263 = load { ptr, i64, i64 }, ptr %t262 + store { ptr, i64, i64 } { ptr @.str.2122, i64 17, i64 0 }, ptr %a265 + store { ptr, i64, i64 } %t263, ptr %a266 + call void @finch_str_concat(ptr %a264, ptr %a265, ptr %a266) + %t267 = load { ptr, i64, i64 }, ptr %a264 + store { ptr, i64, i64 } %t267, ptr %a269 + store { ptr, i64, i64 } { ptr @.str.2123, i64 1, i64 0 }, ptr %a270 + call void @finch_str_concat(ptr %a268, ptr %a269, ptr %a270) + %t271 = load { ptr, i64, i64 }, ptr %a268 + %t272 = load ptr, ptr %a1 + %t273 = icmp eq ptr %t272, null + br i1 %t273, label %panic3401, label %ok3402 +panic3401: + call void @finch_panic(ptr @.str.2124, i64 1388, ptr @.str.2125) + unreachable +ok3402: + %t274 = getelementptr inbounds %S.gen.Gen, ptr %t272, i32 0, i32 19 + store { ptr, i64, i64 } %t271, ptr %t274 + %t275 = load ptr, ptr %a1 + %t276 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 5 + %t277 = load %S.ast.Type, ptr %t276 + %t278 = load %S.ast.Node, ptr %a84 + %t279 = call %S.ast.Type @finch.gen.resolve(ptr %t275, %S.ast.Type %t277, %S.ast.Node %t278) + %t280 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 12 + store %S.ast.Type %t279, ptr %t280 + %t281 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 9 + %t282 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 9 + %t283 = getelementptr inbounds { ptr, i64, i64 }, ptr %t282, i32 0, i32 1 + %t284 = load i64, ptr %t283 + %t285 = sub i64 %t284, 1 + %t286 = load { ptr, i64, i64 }, ptr %t281 + %t287 = extractvalue { ptr, i64, i64 } %t286, 1 + %t288 = icmp uge i64 %t285, %t287 + br i1 %t288, label %range3403, label %inrange3404 +range3403: + call void @finch_panic_index(ptr @.str.2126, i64 1390, i64 %t285, i64 %t287) + unreachable +inrange3404: + %t289 = extractvalue { ptr, i64, i64 } %t286, 0 + %t290 = getelementptr inbounds %S.ast.Node, ptr %t289, i64 %t285 + %t291 = load %S.ast.Node, ptr %t290 + store %S.ast.Node %t291, ptr %a292 + call void @finch.copy.S_ast_Node(ptr %a293, ptr %a292) + %t294 = load %S.ast.Node, ptr %a293 + store %S.ast.Node %t294, ptr %a295 + %t296 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 9 + %t297 = getelementptr inbounds { ptr, i64, i64 }, ptr %t296, i32 0, i32 1 + %t298 = load i64, ptr %t297 + %t299 = sub i64 %t298, 1 + store i64 0, ptr %a300 + br label %for.cond3405 +for.cond3405: + %t301 = load i64, ptr %a300 + %t302 = icmp slt i64 %t301, %t299 + br i1 %t302, label %for.body3406, label %for.end3408 +for.body3406: + %t303 = load ptr, ptr %a1 + %t304 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 9 + %t305 = load i64, ptr %a300 + %t306 = load { ptr, i64, i64 }, ptr %t304 + %t307 = extractvalue { ptr, i64, i64 } %t306, 1 + %t308 = icmp uge i64 %t305, %t307 + br i1 %t308, label %range3409, label %inrange3410 +range3409: + call void @finch_panic_index(ptr @.str.2127, i64 1392, i64 %t305, i64 %t307) + unreachable +inrange3410: + %t309 = extractvalue { ptr, i64, i64 } %t306, 0 + %t310 = getelementptr inbounds %S.ast.Node, ptr %t309, i64 %t305 + %t311 = getelementptr inbounds %S.ast.Node, ptr %t310, i32 0, i32 5 + %t312 = load %S.ast.Type, ptr %t311 + %t313 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 9 + %t314 = load i64, ptr %a300 + %t315 = load { ptr, i64, i64 }, ptr %t313 + %t316 = extractvalue { ptr, i64, i64 } %t315, 1 + %t317 = icmp uge i64 %t314, %t316 + br i1 %t317, label %range3411, label %inrange3412 +range3411: + call void @finch_panic_index(ptr @.str.2128, i64 1392, i64 %t314, i64 %t316) + unreachable +inrange3412: + %t318 = extractvalue { ptr, i64, i64 } %t315, 0 + %t319 = getelementptr inbounds %S.ast.Node, ptr %t318, i64 %t314 + %t320 = load %S.ast.Node, ptr %t319 + %t321 = call %S.ast.Type @finch.gen.resolve(ptr %t303, %S.ast.Type %t312, %S.ast.Node %t320) + store %S.ast.Type %t321, ptr %a322 + %t323 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 13 + %t324 = getelementptr inbounds { ptr, i64, i64 }, ptr %t323, i32 0, i32 1 + %t325 = load %S.ast.Type, ptr %a322 + store %S.ast.Type %t325, ptr %a326 + call void @finch.copy.S_ast_Type(ptr %a327, ptr %a326) + %t328 = load %S.ast.Type, ptr %a327 + %t329 = load i64, ptr %t324 + %t330 = add i64 %t329, 1 + call void @finch_arr_reserve(ptr %t323, i64 %t330, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t331 = load ptr, ptr %t323 + %t332 = getelementptr inbounds %S.ast.Type, ptr %t331, i64 %t329 + store %S.ast.Type %t328, ptr %t332 + store i64 %t330, ptr %t324 + %t333 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 14 + %t334 = getelementptr inbounds { ptr, i64, i64 }, ptr %t333, i32 0, i32 1 + %t335 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 9 + %t336 = load i64, ptr %a300 + %t337 = load { ptr, i64, i64 }, ptr %t335 + %t338 = extractvalue { ptr, i64, i64 } %t337, 1 + %t339 = icmp uge i64 %t336, %t338 + br i1 %t339, label %range3413, label %inrange3414 +range3413: + call void @finch_panic_index(ptr @.str.2129, i64 1394, i64 %t336, i64 %t338) + unreachable +inrange3414: + %t340 = extractvalue { ptr, i64, i64 } %t337, 0 + %t341 = getelementptr inbounds %S.ast.Node, ptr %t340, i64 %t336 + %t342 = getelementptr inbounds %S.ast.Node, ptr %t341, i32 0, i32 1 + %t343 = load { ptr, i64, i64 }, ptr %t342 + store { ptr, i64, i64 } %t343, ptr %a344 + call void @finch_str_copy(ptr %a345, ptr %a344) + %t346 = load { ptr, i64, i64 }, ptr %a345 + %t347 = load i64, ptr %t334 + %t348 = add i64 %t347, 1 + call void @finch_arr_reserve(ptr %t333, i64 %t348, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t349 = load ptr, ptr %t333 + %t350 = getelementptr inbounds { ptr, i64, i64 }, ptr %t349, i64 %t347 + store { ptr, i64, i64 } %t346, ptr %t350 + store i64 %t348, ptr %t334 + %t351 = getelementptr inbounds %S.gen.FnSig, ptr %a130, i32 0, i32 15 + %t352 = getelementptr inbounds { ptr, i64, i64 }, ptr %t351, i32 0, i32 1 + %t353 = load ptr, ptr %a1 + %t354 = load %S.ast.Type, ptr %a322 + %t355 = call i1 @finch.gen.owning(ptr %t353, %S.ast.Type %t354) + br label %logic.from3415 +logic.from3415: + br i1 %t355, label %logic.rhs3416, label %logic.end3417 +logic.rhs3416: + %t356 = load ptr, ptr %a1 + %t357 = getelementptr inbounds %S.ast.Node, ptr %a84, i32 0, i32 9 + %t358 = load i64, ptr %a300 + %t359 = load { ptr, i64, i64 }, ptr %t357 + %t360 = extractvalue { ptr, i64, i64 } %t359, 1 + %t361 = icmp uge i64 %t358, %t360 + br i1 %t361, label %range3418, label %inrange3419 +range3418: + call void @finch_panic_index(ptr @.str.2130, i64 1395, i64 %t358, i64 %t360) + unreachable +inrange3419: + %t362 = extractvalue { ptr, i64, i64 } %t359, 0 + %t363 = getelementptr inbounds %S.ast.Node, ptr %t362, i64 %t358 + %t364 = getelementptr inbounds %S.ast.Node, ptr %t363, i32 0, i32 1 + %t365 = load { ptr, i64, i64 }, ptr %t364 + %t366 = load %S.ast.Node, ptr %a295 + %t367 = call i1 @finch.gen.mutates(ptr %t356, { ptr, i64, i64 } %t365, %S.ast.Node %t366) + %t368 = xor i1 %t367, true + br label %logic.rend3420 +logic.rend3420: + br label %logic.end3417 +logic.end3417: + %t369 = phi i1 [ false, %logic.from3415 ], [ %t368, %logic.rend3420 ] + %t370 = load i64, ptr %t352 + %t371 = add i64 %t370, 1 + call void @finch_arr_reserve(ptr %t351, i64 %t371, i64 ptrtoint (ptr getelementptr (i1, ptr null, i32 1) to i64)) + %t372 = load ptr, ptr %t351 + %t373 = getelementptr inbounds i1, ptr %t372, i64 %t370 + store i1 %t369, ptr %t373 + store i64 %t371, ptr %t352 + br label %for.step3407 +for.step3407: + %t374 = load i64, ptr %a300 + %t375 = add i64 %t374, 1 + store i64 %t375, ptr %a300 + br label %for.cond3405 +for.end3408: + %t376 = load { ptr, i64, i64 }, ptr %a214 + %t377 = load ptr, ptr %a1 + %t378 = icmp eq ptr %t377, null + br i1 %t378, label %panic3421, label %ok3422 +panic3421: + call void @finch_panic(ptr @.str.2131, i64 1397, ptr @.str.2132) + unreachable +ok3422: + %t379 = getelementptr inbounds %S.gen.Gen, ptr %t377, i32 0, i32 17 + store { ptr, i64, i64 } %t376, ptr %a380 + call void @finch.copy.arr_str(ptr %a381, ptr %a380) + %t382 = load { ptr, i64, i64 }, ptr %a381 + store { ptr, i64, i64 } %t382, ptr %t379 + %t383 = load { ptr, i64, i64 }, ptr %a222 + %t384 = load ptr, ptr %a1 + %t385 = icmp eq ptr %t384, null + br i1 %t385, label %panic3423, label %ok3424 +panic3423: + call void @finch_panic(ptr @.str.2133, i64 1398, ptr @.str.2134) + unreachable +ok3424: + %t386 = getelementptr inbounds %S.gen.Gen, ptr %t384, i32 0, i32 18 + store { ptr, i64, i64 } %t383, ptr %a387 + call void @finch.copy.arr_S_ast_Type(ptr %a388, ptr %a387) + %t389 = load { ptr, i64, i64 }, ptr %a388 + store { ptr, i64, i64 } %t389, ptr %t386 + %t390 = load { ptr, i64, i64 }, ptr %a230 + %t391 = load ptr, ptr %a1 + %t392 = icmp eq ptr %t391, null + br i1 %t392, label %panic3425, label %ok3426 +panic3425: + call void @finch_panic(ptr @.str.2135, i64 1399, ptr @.str.2136) + unreachable +ok3426: + %t393 = getelementptr inbounds %S.gen.Gen, ptr %t391, i32 0, i32 13 + store { ptr, i64, i64 } %t390, ptr %a394 + call void @finch_str_copy(ptr %a395, ptr %a394) + %t396 = load { ptr, i64, i64 }, ptr %a395 + store { ptr, i64, i64 } %t396, ptr %t393 + %t397 = load { ptr, i64, i64 }, ptr %a238 + %t398 = load ptr, ptr %a1 + %t399 = icmp eq ptr %t398, null + br i1 %t399, label %panic3427, label %ok3428 +panic3427: + call void @finch_panic(ptr @.str.2137, i64 1400, ptr @.str.2138) + unreachable +ok3428: + %t400 = getelementptr inbounds %S.gen.Gen, ptr %t398, i32 0, i32 19 + store { ptr, i64, i64 } %t397, ptr %a401 + call void @finch_str_copy(ptr %a402, ptr %a401) + %t403 = load { ptr, i64, i64 }, ptr %a402 + store { ptr, i64, i64 } %t403, ptr %t400 + %t404 = load ptr, ptr %a1 + %t405 = icmp eq ptr %t404, null + br i1 %t405, label %panic3429, label %ok3430 +panic3429: + call void @finch_panic(ptr @.str.2139, i64 1401, ptr @.str.2140) + unreachable +ok3430: + %t406 = getelementptr inbounds %S.gen.Gen, ptr %t404, i32 0, i32 14 + %t407 = getelementptr inbounds { ptr, i64, i64 }, ptr %t406, i32 0, i32 1 + %t408 = load %S.gen.FnSig, ptr %a130 + store %S.gen.FnSig %t408, ptr %a409 + call void @finch.copy.S_gen_FnSig(ptr %a410, ptr %a409) + %t411 = load %S.gen.FnSig, ptr %a410 + %t412 = load i64, ptr %t407 + %t413 = add i64 %t412, 1 + call void @finch_arr_reserve(ptr %t406, i64 %t413, i64 ptrtoint (ptr getelementptr (%S.gen.FnSig, ptr null, i32 1) to i64)) + %t414 = load ptr, ptr %t406 + %t415 = getelementptr inbounds %S.gen.FnSig, ptr %t414, i64 %t412 + store %S.gen.FnSig %t411, ptr %t415 + store i64 %t413, ptr %t407 + %t416 = load ptr, ptr %a1 + %t417 = icmp eq ptr %t416, null + br i1 %t417, label %panic3431, label %ok3432 +panic3431: + call void @finch_panic(ptr @.str.2141, i64 1402, ptr @.str.2142) + unreachable +ok3432: + %t418 = getelementptr inbounds %S.gen.Gen, ptr %t416, i32 0, i32 14 + %t419 = getelementptr inbounds { ptr, i64, i64 }, ptr %t418, i32 0, i32 1 + %t420 = load i64, ptr %t419 + %t421 = sub i64 %t420, 1 + ret i64 %t421 +} + +define internal void @finch.gen.bindType(ptr %p0, %S.ast.Type %p1, %S.ast.Type %p2, { ptr, i64, i64 } %p3, ptr %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca ptr, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca i64, align 16 + %a28 = alloca i64, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca i64, align 16 + %a47 = alloca i64, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca i64, align 16 + %a80 = alloca %S.ast.Type, align 16 + %a81 = alloca %S.ast.Type, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca %S.gen.StructDef, align 16 + %a229 = alloca %S.gen.StructDef, align 16 + %a231 = alloca %S.gen.StructDef, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca i64, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + store ptr %p4, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t7 = load { ptr, i64, i64 }, ptr %t6 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.2143, i64 5, i64 0 }, ptr %a9 + %t10 = call i32 @finch_str_eq(ptr %a8, ptr %a9) + %t11 = icmp ne i32 %t10, 0 + br label %logic.from3433 +logic.from3433: + br i1 %t11, label %logic.rhs3434, label %logic.end3435 +logic.rhs3434: + %t12 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t12, i32 0, i32 1 + %t14 = load i64, ptr %t13 + %t15 = icmp eq i64 %t14, 0 + br label %logic.rend3436 +logic.rend3436: + br label %logic.end3435 +logic.end3435: + %t16 = phi i1 [ false, %logic.from3433 ], [ %t15, %logic.rend3436 ] + br label %logic.from3437 +logic.from3437: + br i1 %t16, label %logic.rhs3438, label %logic.end3439 +logic.rhs3438: + %t17 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t17, i32 0, i32 1 + %t19 = load i64, ptr %t18 + %t20 = icmp eq i64 %t19, 0 + br label %logic.rend3440 +logic.rend3440: + br label %logic.end3439 +logic.end3439: + %t21 = phi i1 [ false, %logic.from3437 ], [ %t20, %logic.rend3440 ] + br label %logic.from3441 +logic.from3441: + br i1 %t21, label %logic.rhs3442, label %logic.end3443 +logic.rhs3442: + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t23 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t24 = load { ptr, i64, i64 }, ptr %t23 + store i64 -1, ptr %a25 + %t26 = load i64, ptr %t22 + %t27 = load ptr, ptr %a4 + store i64 0, ptr %a28 + br label %find.cond3444 +find.cond3444: + %t29 = load i64, ptr %a28 + %t30 = icmp slt i64 %t29, %t26 + br i1 %t30, label %find.body3445, label %find.end3448 +find.body3445: + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t27, i64 %t29 + %t32 = load { ptr, i64, i64 }, ptr %t31 + store { ptr, i64, i64 } %t32, ptr %a33 + store { ptr, i64, i64 } %t24, ptr %a34 + %t35 = call i32 @finch_str_eq(ptr %a33, ptr %a34) + %t36 = icmp ne i32 %t35, 0 + br i1 %t36, label %find.hit3446, label %find.next3447 +find.hit3446: + store i64 %t29, ptr %a25 + br label %find.end3448 +find.next3447: + %t37 = add i64 %t29, 1 + store i64 %t37, ptr %a28 + br label %find.cond3444 +find.end3448: + %t38 = load i64, ptr %a25 + %t39 = icmp sge i64 %t38, 0 + br label %logic.rend3449 +logic.rend3449: + br label %logic.end3443 +logic.end3443: + %t40 = phi i1 [ false, %logic.from3441 ], [ %t39, %logic.rend3449 ] + br i1 %t40, label %then3450, label %endif3452 +then3450: + %t41 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t42 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t43 = load { ptr, i64, i64 }, ptr %t42 + store i64 -1, ptr %a44 + %t45 = load i64, ptr %t41 + %t46 = load ptr, ptr %a4 + store i64 0, ptr %a47 + br label %find.cond3453 +find.cond3453: + %t48 = load i64, ptr %a47 + %t49 = icmp slt i64 %t48, %t45 + br i1 %t49, label %find.body3454, label %find.end3457 +find.body3454: + %t50 = getelementptr inbounds { ptr, i64, i64 }, ptr %t46, i64 %t48 + %t51 = load { ptr, i64, i64 }, ptr %t50 + store { ptr, i64, i64 } %t51, ptr %a52 + store { ptr, i64, i64 } %t43, ptr %a53 + %t54 = call i32 @finch_str_eq(ptr %a52, ptr %a53) + %t55 = icmp ne i32 %t54, 0 + br i1 %t55, label %find.hit3455, label %find.next3456 +find.hit3455: + store i64 %t48, ptr %a44 + br label %find.end3457 +find.next3456: + %t56 = add i64 %t48, 1 + store i64 %t56, ptr %a47 + br label %find.cond3453 +find.end3457: + %t57 = load i64, ptr %a44 + store i64 %t57, ptr %a58 + %t59 = load ptr, ptr %a5 + %t60 = icmp eq ptr %t59, null + br i1 %t60, label %panic3458, label %ok3459 +panic3458: + call void @finch_panic(ptr @.str.2144, i64 1409, ptr @.str.2145) + unreachable +ok3459: + %t61 = getelementptr inbounds %S.gen.Binds, ptr %t59, i32 0, i32 1 + %t62 = load i64, ptr %a58 + %t63 = load { ptr, i64, i64 }, ptr %t61 + %t64 = extractvalue { ptr, i64, i64 } %t63, 1 + %t65 = icmp uge i64 %t62, %t64 + br i1 %t65, label %range3460, label %inrange3461 +range3460: + call void @finch_panic_index(ptr @.str.2146, i64 1409, i64 %t62, i64 %t64) + unreachable +inrange3461: + %t66 = extractvalue { ptr, i64, i64 } %t63, 0 + %t67 = getelementptr inbounds i1, ptr %t66, i64 %t62 + %t68 = load i1, ptr %t67 + %t69 = xor i1 %t68, true + br i1 %t69, label %then3462, label %endif3464 +then3462: + %t70 = load %S.ast.Type, ptr %a3 + %t71 = load ptr, ptr %a5 + %t72 = icmp eq ptr %t71, null + br i1 %t72, label %panic3465, label %ok3466 +panic3465: + call void @finch_panic(ptr @.str.2147, i64 1410, ptr @.str.2148) + unreachable +ok3466: + %t73 = getelementptr inbounds %S.gen.Binds, ptr %t71, i32 0, i32 0 + %t74 = load i64, ptr %a58 + %t75 = load { ptr, i64, i64 }, ptr %t73 + %t76 = extractvalue { ptr, i64, i64 } %t75, 1 + %t77 = icmp uge i64 %t74, %t76 + br i1 %t77, label %range3467, label %inrange3468 +range3467: + call void @finch_panic_index(ptr @.str.2149, i64 1410, i64 %t74, i64 %t76) + unreachable +inrange3468: + %t78 = extractvalue { ptr, i64, i64 } %t75, 0 + %t79 = getelementptr inbounds %S.ast.Type, ptr %t78, i64 %t74 + store %S.ast.Type %t70, ptr %a80 + call void @finch.copy.S_ast_Type(ptr %a81, ptr %a80) + %t82 = load %S.ast.Type, ptr %a81 + store %S.ast.Type %t82, ptr %t79 + %t83 = load ptr, ptr %a5 + %t84 = icmp eq ptr %t83, null + br i1 %t84, label %panic3469, label %ok3470 +panic3469: + call void @finch_panic(ptr @.str.2150, i64 1411, ptr @.str.2151) + unreachable +ok3470: + %t85 = getelementptr inbounds %S.gen.Binds, ptr %t83, i32 0, i32 1 + %t86 = load i64, ptr %a58 + %t87 = load { ptr, i64, i64 }, ptr %t85 + %t88 = extractvalue { ptr, i64, i64 } %t87, 1 + %t89 = icmp uge i64 %t86, %t88 + br i1 %t89, label %range3471, label %inrange3472 +range3471: + call void @finch_panic_index(ptr @.str.2152, i64 1411, i64 %t86, i64 %t88) + unreachable +inrange3472: + %t90 = extractvalue { ptr, i64, i64 } %t87, 0 + %t91 = getelementptr inbounds i1, ptr %t90, i64 %t86 + store i1 true, ptr %t91 + br label %endif3464 +endif3464: + ret void +endif3452: + %t92 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t93 = load { ptr, i64, i64 }, ptr %t92 + store { ptr, i64, i64 } %t93, ptr %a94 + store { ptr, i64, i64 } { ptr @.str.2153, i64 5, i64 0 }, ptr %a95 + %t96 = call i32 @finch_str_eq(ptr %a94, ptr %a95) + %t97 = icmp ne i32 %t96, 0 + br label %logic.from3473 +logic.from3473: + br i1 %t97, label %logic.end3475, label %logic.rhs3474 +logic.rhs3474: + %t98 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t99 = load { ptr, i64, i64 }, ptr %t98 + store { ptr, i64, i64 } %t99, ptr %a100 + store { ptr, i64, i64 } { ptr @.str.2154, i64 3, i64 0 }, ptr %a101 + %t102 = call i32 @finch_str_eq(ptr %a100, ptr %a101) + %t103 = icmp ne i32 %t102, 0 + br label %logic.rend3476 +logic.rend3476: + br label %logic.end3475 +logic.end3475: + %t104 = phi i1 [ true, %logic.from3473 ], [ %t103, %logic.rend3476 ] + br label %logic.from3477 +logic.from3477: + br i1 %t104, label %logic.end3479, label %logic.rhs3478 +logic.rhs3478: + %t105 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t106 = load { ptr, i64, i64 }, ptr %t105 + store { ptr, i64, i64 } %t106, ptr %a107 + store { ptr, i64, i64 } { ptr @.str.2155, i64 5, i64 0 }, ptr %a108 + %t109 = call i32 @finch_str_eq(ptr %a107, ptr %a108) + %t110 = icmp ne i32 %t109, 0 + br label %logic.rend3480 +logic.rend3480: + br label %logic.end3479 +logic.end3479: + %t111 = phi i1 [ true, %logic.from3477 ], [ %t110, %logic.rend3480 ] + br label %logic.from3481 +logic.from3481: + br i1 %t111, label %logic.rhs3482, label %logic.end3483 +logic.rhs3482: + %t112 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t113 = getelementptr inbounds { ptr, i64, i64 }, ptr %t112, i32 0, i32 1 + %t114 = load i64, ptr %t113 + %t115 = icmp sgt i64 %t114, 0 + br label %logic.rend3484 +logic.rend3484: + br label %logic.end3483 +logic.end3483: + %t116 = phi i1 [ false, %logic.from3481 ], [ %t115, %logic.rend3484 ] + br label %logic.from3485 +logic.from3485: + br i1 %t116, label %logic.rhs3486, label %logic.end3487 +logic.rhs3486: + %t117 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t118 = load { ptr, i64, i64 }, ptr %t117 + %t119 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t120 = load { ptr, i64, i64 }, ptr %t119 + store { ptr, i64, i64 } %t118, ptr %a121 + store { ptr, i64, i64 } %t120, ptr %a122 + %t123 = call i32 @finch_str_eq(ptr %a121, ptr %a122) + %t124 = icmp ne i32 %t123, 0 + br label %logic.rend3488 +logic.rend3488: + br label %logic.end3487 +logic.end3487: + %t125 = phi i1 [ false, %logic.from3485 ], [ %t124, %logic.rend3488 ] + br label %logic.from3489 +logic.from3489: + br i1 %t125, label %logic.rhs3490, label %logic.end3491 +logic.rhs3490: + %t126 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t127 = getelementptr inbounds { ptr, i64, i64 }, ptr %t126, i32 0, i32 1 + %t128 = load i64, ptr %t127 + %t129 = icmp sgt i64 %t128, 0 + br label %logic.rend3492 +logic.rend3492: + br label %logic.end3491 +logic.end3491: + %t130 = phi i1 [ false, %logic.from3489 ], [ %t129, %logic.rend3492 ] + br i1 %t130, label %then3493, label %endif3495 +then3493: + %t131 = load ptr, ptr %a1 + %t132 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t133 = load { ptr, i64, i64 }, ptr %t132 + %t134 = extractvalue { ptr, i64, i64 } %t133, 1 + %t135 = icmp uge i64 0, %t134 + br i1 %t135, label %range3496, label %inrange3497 +range3496: + call void @finch_panic_index(ptr @.str.2156, i64 1416, i64 0, i64 %t134) + unreachable +inrange3497: + %t136 = extractvalue { ptr, i64, i64 } %t133, 0 + %t137 = getelementptr inbounds %S.ast.Type, ptr %t136, i64 0 + %t138 = load %S.ast.Type, ptr %t137 + %t139 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t140 = load { ptr, i64, i64 }, ptr %t139 + %t141 = extractvalue { ptr, i64, i64 } %t140, 1 + %t142 = icmp uge i64 0, %t141 + br i1 %t142, label %range3498, label %inrange3499 +range3498: + call void @finch_panic_index(ptr @.str.2157, i64 1416, i64 0, i64 %t141) + unreachable +inrange3499: + %t143 = extractvalue { ptr, i64, i64 } %t140, 0 + %t144 = getelementptr inbounds %S.ast.Type, ptr %t143, i64 0 + %t145 = load %S.ast.Type, ptr %t144 + %t146 = load { ptr, i64, i64 }, ptr %a4 + %t147 = load ptr, ptr %a5 + call void @finch.gen.bindType(ptr %t131, %S.ast.Type %t138, %S.ast.Type %t145, { ptr, i64, i64 } %t146, ptr %t147) + ret void +endif3495: + %t148 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t149 = load { ptr, i64, i64 }, ptr %t148 + store { ptr, i64, i64 } %t149, ptr %a150 + store { ptr, i64, i64 } { ptr @.str.2158, i64 3, i64 0 }, ptr %a151 + %t152 = call i32 @finch_str_eq(ptr %a150, ptr %a151) + %t153 = icmp ne i32 %t152, 0 + br label %logic.from3500 +logic.from3500: + br i1 %t153, label %logic.rhs3501, label %logic.end3502 +logic.rhs3501: + %t154 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t155 = load { ptr, i64, i64 }, ptr %t154 + store { ptr, i64, i64 } %t155, ptr %a156 + store { ptr, i64, i64 } { ptr @.str.2159, i64 3, i64 0 }, ptr %a157 + %t158 = call i32 @finch_str_eq(ptr %a156, ptr %a157) + %t159 = icmp ne i32 %t158, 0 + br label %logic.rend3503 +logic.rend3503: + br label %logic.end3502 +logic.end3502: + %t160 = phi i1 [ false, %logic.from3500 ], [ %t159, %logic.rend3503 ] + br i1 %t160, label %then3504, label %endif3506 +then3504: + %t161 = load ptr, ptr %a1 + %t162 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t163 = load { ptr, i64, i64 }, ptr %t162 + %t164 = extractvalue { ptr, i64, i64 } %t163, 1 + %t165 = icmp uge i64 0, %t164 + br i1 %t165, label %range3507, label %inrange3508 +range3507: + call void @finch_panic_index(ptr @.str.2160, i64 1420, i64 0, i64 %t164) + unreachable +inrange3508: + %t166 = extractvalue { ptr, i64, i64 } %t163, 0 + %t167 = getelementptr inbounds %S.ast.Type, ptr %t166, i64 0 + %t168 = load %S.ast.Type, ptr %t167 + %t169 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t170 = load { ptr, i64, i64 }, ptr %t169 + %t171 = extractvalue { ptr, i64, i64 } %t170, 1 + %t172 = icmp uge i64 0, %t171 + br i1 %t172, label %range3509, label %inrange3510 +range3509: + call void @finch_panic_index(ptr @.str.2161, i64 1420, i64 0, i64 %t171) + unreachable +inrange3510: + %t173 = extractvalue { ptr, i64, i64 } %t170, 0 + %t174 = getelementptr inbounds %S.ast.Type, ptr %t173, i64 0 + %t175 = load %S.ast.Type, ptr %t174 + %t176 = load { ptr, i64, i64 }, ptr %a4 + %t177 = load ptr, ptr %a5 + call void @finch.gen.bindType(ptr %t161, %S.ast.Type %t168, %S.ast.Type %t175, { ptr, i64, i64 } %t176, ptr %t177) + %t178 = load ptr, ptr %a1 + %t179 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t180 = load { ptr, i64, i64 }, ptr %t179 + %t181 = extractvalue { ptr, i64, i64 } %t180, 1 + %t182 = icmp uge i64 1, %t181 + br i1 %t182, label %range3511, label %inrange3512 +range3511: + call void @finch_panic_index(ptr @.str.2162, i64 1421, i64 1, i64 %t181) + unreachable +inrange3512: + %t183 = extractvalue { ptr, i64, i64 } %t180, 0 + %t184 = getelementptr inbounds %S.ast.Type, ptr %t183, i64 1 + %t185 = load %S.ast.Type, ptr %t184 + %t186 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t187 = load { ptr, i64, i64 }, ptr %t186 + %t188 = extractvalue { ptr, i64, i64 } %t187, 1 + %t189 = icmp uge i64 1, %t188 + br i1 %t189, label %range3513, label %inrange3514 +range3513: + call void @finch_panic_index(ptr @.str.2163, i64 1421, i64 1, i64 %t188) + unreachable +inrange3514: + %t190 = extractvalue { ptr, i64, i64 } %t187, 0 + %t191 = getelementptr inbounds %S.ast.Type, ptr %t190, i64 1 + %t192 = load %S.ast.Type, ptr %t191 + %t193 = load { ptr, i64, i64 }, ptr %a4 + %t194 = load ptr, ptr %a5 + call void @finch.gen.bindType(ptr %t178, %S.ast.Type %t185, %S.ast.Type %t192, { ptr, i64, i64 } %t193, ptr %t194) + ret void +endif3506: + %t195 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t196 = load { ptr, i64, i64 }, ptr %t195 + store { ptr, i64, i64 } %t196, ptr %a197 + store { ptr, i64, i64 } { ptr @.str.2164, i64 5, i64 0 }, ptr %a198 + %t199 = call i32 @finch_str_eq(ptr %a197, ptr %a198) + %t200 = icmp ne i32 %t199, 0 + br label %logic.from3515 +logic.from3515: + br i1 %t200, label %logic.rhs3516, label %logic.end3517 +logic.rhs3516: + %t201 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t202 = getelementptr inbounds { ptr, i64, i64 }, ptr %t201, i32 0, i32 1 + %t203 = load i64, ptr %t202 + %t204 = icmp sgt i64 %t203, 0 + br label %logic.rend3518 +logic.rend3518: + br label %logic.end3517 +logic.end3517: + %t205 = phi i1 [ false, %logic.from3515 ], [ %t204, %logic.rend3518 ] + br label %logic.from3519 +logic.from3519: + br i1 %t205, label %logic.rhs3520, label %logic.end3521 +logic.rhs3520: + %t206 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t207 = load { ptr, i64, i64 }, ptr %t206 + store { ptr, i64, i64 } %t207, ptr %a208 + store { ptr, i64, i64 } { ptr @.str.2165, i64 6, i64 0 }, ptr %a209 + %t210 = call i32 @finch_str_eq(ptr %a208, ptr %a209) + %t211 = icmp ne i32 %t210, 0 + br label %logic.rend3522 +logic.rend3522: + br label %logic.end3521 +logic.end3521: + %t212 = phi i1 [ false, %logic.from3519 ], [ %t211, %logic.rend3522 ] + br i1 %t212, label %then3523, label %endif3525 +then3523: + %t213 = load ptr, ptr %a1 + %t214 = icmp eq ptr %t213, null + br i1 %t214, label %panic3526, label %ok3527 +panic3526: + call void @finch_panic(ptr @.str.2166, i64 1425, ptr @.str.2167) + unreachable +ok3527: + %t215 = getelementptr inbounds %S.gen.Gen, ptr %t213, i32 0, i32 15 + %t216 = load ptr, ptr %a1 + %t217 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 3 + %t218 = load { ptr, i64, i64 }, ptr %t217 + %t219 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 2 + %t220 = load { ptr, i64, i64 }, ptr %t219 + %t221 = call i64 @finch.gen.findStruct(ptr %t216, { ptr, i64, i64 } %t218, { ptr, i64, i64 } %t220) + %t222 = load { ptr, i64, i64 }, ptr %t215 + %t223 = extractvalue { ptr, i64, i64 } %t222, 1 + %t224 = icmp uge i64 %t221, %t223 + br i1 %t224, label %range3528, label %inrange3529 +range3528: + call void @finch_panic_index(ptr @.str.2168, i64 1425, i64 %t221, i64 %t223) + unreachable +inrange3529: + %t225 = extractvalue { ptr, i64, i64 } %t222, 0 + %t226 = getelementptr inbounds %S.gen.StructDef, ptr %t225, i64 %t221 + %t227 = load %S.gen.StructDef, ptr %t226 + store %S.gen.StructDef %t227, ptr %a228 + call void @finch.copy.S_gen_StructDef(ptr %a229, ptr %a228) + %t230 = load %S.gen.StructDef, ptr %a229 + store %S.gen.StructDef %t230, ptr %a231 + %t232 = getelementptr inbounds %S.gen.StructDef, ptr %a231, i32 0, i32 5 + %t233 = load { ptr, i64, i64 }, ptr %t232 + %t234 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t235 = load { ptr, i64, i64 }, ptr %t234 + store { ptr, i64, i64 } %t233, ptr %a236 + store { ptr, i64, i64 } %t235, ptr %a237 + %t238 = call i32 @finch_str_eq(ptr %a236, ptr %a237) + %t239 = icmp ne i32 %t238, 0 + br label %logic.from3530 +logic.from3530: + br i1 %t239, label %logic.rhs3531, label %logic.end3532 +logic.rhs3531: + %t240 = getelementptr inbounds %S.gen.StructDef, ptr %a231, i32 0, i32 7 + %t241 = getelementptr inbounds { ptr, i64, i64 }, ptr %t240, i32 0, i32 1 + %t242 = load i64, ptr %t241 + %t243 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t244 = getelementptr inbounds { ptr, i64, i64 }, ptr %t243, i32 0, i32 1 + %t245 = load i64, ptr %t244 + %t246 = icmp eq i64 %t242, %t245 + br label %logic.rend3533 +logic.rend3533: + br label %logic.end3532 +logic.end3532: + %t247 = phi i1 [ false, %logic.from3530 ], [ %t246, %logic.rend3533 ] + br i1 %t247, label %then3534, label %endif3536 +then3534: + %t248 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t249 = getelementptr inbounds { ptr, i64, i64 }, ptr %t248, i32 0, i32 1 + %t250 = load i64, ptr %t249 + store i64 0, ptr %a251 + br label %for.cond3537 +for.cond3537: + %t252 = load i64, ptr %a251 + %t253 = icmp slt i64 %t252, %t250 + br i1 %t253, label %for.body3538, label %for.end3540 +for.body3538: + %t254 = load ptr, ptr %a1 + %t255 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t256 = load i64, ptr %a251 + %t257 = load { ptr, i64, i64 }, ptr %t255 + %t258 = extractvalue { ptr, i64, i64 } %t257, 1 + %t259 = icmp uge i64 %t256, %t258 + br i1 %t259, label %range3541, label %inrange3542 +range3541: + call void @finch_panic_index(ptr @.str.2169, i64 1428, i64 %t256, i64 %t258) + unreachable +inrange3542: + %t260 = extractvalue { ptr, i64, i64 } %t257, 0 + %t261 = getelementptr inbounds %S.ast.Type, ptr %t260, i64 %t256 + %t262 = load %S.ast.Type, ptr %t261 + %t263 = getelementptr inbounds %S.gen.StructDef, ptr %a231, i32 0, i32 7 + %t264 = load i64, ptr %a251 + %t265 = load { ptr, i64, i64 }, ptr %t263 + %t266 = extractvalue { ptr, i64, i64 } %t265, 1 + %t267 = icmp uge i64 %t264, %t266 + br i1 %t267, label %range3543, label %inrange3544 +range3543: + call void @finch_panic_index(ptr @.str.2170, i64 1428, i64 %t264, i64 %t266) + unreachable +inrange3544: + %t268 = extractvalue { ptr, i64, i64 } %t265, 0 + %t269 = getelementptr inbounds %S.ast.Type, ptr %t268, i64 %t264 + %t270 = load %S.ast.Type, ptr %t269 + %t271 = load { ptr, i64, i64 }, ptr %a4 + %t272 = load ptr, ptr %a5 + call void @finch.gen.bindType(ptr %t254, %S.ast.Type %t262, %S.ast.Type %t270, { ptr, i64, i64 } %t271, ptr %t272) + br label %for.step3539 +for.step3539: + %t273 = load i64, ptr %a251 + %t274 = add i64 %t273, 1 + store i64 %t274, ptr %a251 + br label %for.cond3537 +for.end3540: + br label %endif3536 +endif3536: + br label %endif3525 +endif3525: + ret void +} + +define internal %S.gen.Val @finch.gen.genericCall(ptr %p0, %S.ast.Node %p1, i64 %p2, i64 %p3, { ptr, i64, i64 } %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i64, align 16 + %a4 = alloca i64, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca %S.gen.Template, align 16 + %a17 = alloca %S.gen.Template, align 16 + %a19 = alloca %S.gen.Template, align 16 + %a39 = alloca %S.ast.Node, align 16 + %a40 = alloca %S.ast.Node, align 16 + %a42 = alloca %S.ast.Node, align 16 + %a47 = alloca i64, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca i64, align 16 + %a107 = alloca %S.ast.Type, align 16 + %a130 = alloca %S.gen.Binds, align 16 + %a134 = alloca i64, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca i64, align 16 + %a169 = alloca %S.gen.Val, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca %S.gen.Val, align 16 + %a212 = alloca %S.gen.Val, align 16 + %a237 = alloca i64, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a270 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca i64, align 16 + %a297 = alloca %S.gen.FnSig, align 16 + %a298 = alloca %S.gen.FnSig, align 16 + %a300 = alloca %S.gen.FnSig, align 16 + %a301 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca i64, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a344 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a349 = alloca %S.gen.Val, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a369 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i64 %p2, ptr %a3 + store i64 %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic3545, label %ok3546 +panic3545: + call void @finch_panic(ptr @.str.2171, i64 1436, ptr @.str.2172) + unreachable +ok3546: + %t8 = getelementptr inbounds %S.gen.Gen, ptr %t6, i32 0, i32 16 + %t9 = load i64, ptr %a3 + %t10 = load { ptr, i64, i64 }, ptr %t8 + %t11 = extractvalue { ptr, i64, i64 } %t10, 1 + %t12 = icmp uge i64 %t9, %t11 + br i1 %t12, label %range3547, label %inrange3548 +range3547: + call void @finch_panic_index(ptr @.str.2173, i64 1436, i64 %t9, i64 %t11) + unreachable +inrange3548: + %t13 = extractvalue { ptr, i64, i64 } %t10, 0 + %t14 = getelementptr inbounds %S.gen.Template, ptr %t13, i64 %t9 + %t15 = load %S.gen.Template, ptr %t14 + store %S.gen.Template %t15, ptr %a16 + call void @finch.copy.S_gen_Template(ptr %a17, ptr %a16) + %t18 = load %S.gen.Template, ptr %a17 + store %S.gen.Template %t18, ptr %a19 + %t20 = load ptr, ptr %a1 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic3549, label %ok3550 +panic3549: + call void @finch_panic(ptr @.str.2174, i64 1437, ptr @.str.2175) + unreachable +ok3550: + %t22 = getelementptr inbounds %S.gen.Gen, ptr %t20, i32 0, i32 0 + %t23 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 4 + %t24 = load i64, ptr %t23 + %t25 = load { ptr, i64, i64 }, ptr %t22 + %t26 = extractvalue { ptr, i64, i64 } %t25, 1 + %t27 = icmp uge i64 %t24, %t26 + br i1 %t27, label %range3551, label %inrange3552 +range3551: + call void @finch_panic_index(ptr @.str.2176, i64 1437, i64 %t24, i64 %t26) + unreachable +inrange3552: + %t28 = extractvalue { ptr, i64, i64 } %t25, 0 + %t29 = getelementptr inbounds %S.ast.Program, ptr %t28, i64 %t24 + %t30 = getelementptr inbounds %S.ast.Program, ptr %t29, i32 0, i32 8 + %t31 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 5 + %t32 = load i64, ptr %t31 + %t33 = load { ptr, i64, i64 }, ptr %t30 + %t34 = extractvalue { ptr, i64, i64 } %t33, 1 + %t35 = icmp uge i64 %t32, %t34 + br i1 %t35, label %range3553, label %inrange3554 +range3553: + call void @finch_panic_index(ptr @.str.2177, i64 1437, i64 %t32, i64 %t34) + unreachable +inrange3554: + %t36 = extractvalue { ptr, i64, i64 } %t33, 0 + %t37 = getelementptr inbounds %S.ast.Node, ptr %t36, i64 %t32 + %t38 = load %S.ast.Node, ptr %t37 + store %S.ast.Node %t38, ptr %a39 + call void @finch.copy.S_ast_Node(ptr %a40, ptr %a39) + %t41 = load %S.ast.Node, ptr %a40 + store %S.ast.Node %t41, ptr %a42 + %t43 = getelementptr inbounds %S.ast.Node, ptr %a42, i32 0, i32 9 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i32 0, i32 1 + %t45 = load i64, ptr %t44 + %t46 = sub i64 %t45, 1 + store i64 %t46, ptr %a47 + %t48 = load ptr, ptr %a1 + %t49 = load %S.ast.Node, ptr %a2 + %t50 = load i64, ptr %a4 + %t51 = load i64, ptr %a47 + %t52 = load { ptr, i64, i64 }, ptr %a5 + call void @finch.gen.checkArgs(ptr %t48, %S.ast.Node %t49, i64 %t50, i64 %t51, { ptr, i64, i64 } %t52) + store { ptr, i64, i64 } zeroinitializer, ptr %a53 + %t54 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t55 = getelementptr inbounds %S.ast.Type, ptr %t54, i32 0, i32 1 + %t56 = getelementptr inbounds { ptr, i64, i64 }, ptr %t55, i32 0, i32 1 + %t57 = load i64, ptr %t56 + %t58 = icmp sgt i64 %t57, 0 + br i1 %t58, label %then3555, label %endif3557 +then3555: + %t59 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t60 = getelementptr inbounds %S.ast.Type, ptr %t59, i32 0, i32 1 + %t61 = getelementptr inbounds { ptr, i64, i64 }, ptr %t60, i32 0, i32 1 + %t62 = load i64, ptr %t61 + %t63 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t64 = getelementptr inbounds { ptr, i64, i64 }, ptr %t63, i32 0, i32 1 + %t65 = load i64, ptr %t64 + %t66 = icmp ne i64 %t62, %t65 + br i1 %t66, label %then3558, label %endif3560 +then3558: + %t67 = load ptr, ptr %a1 + %t68 = load %S.ast.Node, ptr %a2 + %t69 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t69, ptr %a71 + store { ptr, i64, i64 } { ptr @.str.2178, i64 7, i64 0 }, ptr %a72 + call void @finch_str_concat(ptr %a70, ptr %a71, ptr %a72) + %t73 = load { ptr, i64, i64 }, ptr %a70 + %t74 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t75 = getelementptr inbounds { ptr, i64, i64 }, ptr %t74, i32 0, i32 1 + %t76 = load i64, ptr %t75 + call void @finch_str_from_int(ptr %a77, i64 %t76) + %t78 = load { ptr, i64, i64 }, ptr %a77 + store { ptr, i64, i64 } %t73, ptr %a80 + store { ptr, i64, i64 } %t78, ptr %a81 + call void @finch_str_concat(ptr %a79, ptr %a80, ptr %a81) + %t82 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } %t82, ptr %a84 + store { ptr, i64, i64 } { ptr @.str.2179, i64 27, i64 0 }, ptr %a85 + call void @finch_str_concat(ptr %a83, ptr %a84, ptr %a85) + %t86 = load { ptr, i64, i64 }, ptr %a83 + %t87 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t88 = getelementptr inbounds %S.ast.Type, ptr %t87, i32 0, i32 1 + %t89 = getelementptr inbounds { ptr, i64, i64 }, ptr %t88, i32 0, i32 1 + %t90 = load i64, ptr %t89 + call void @finch_str_from_int(ptr %a91, i64 %t90) + %t92 = load { ptr, i64, i64 }, ptr %a91 + store { ptr, i64, i64 } %t86, ptr %a94 + store { ptr, i64, i64 } %t92, ptr %a95 + call void @finch_str_concat(ptr %a93, ptr %a94, ptr %a95) + %t96 = load { ptr, i64, i64 }, ptr %a93 + call void @finch.gen.fail(ptr %t67, %S.ast.Node %t68, { ptr, i64, i64 } %t96) + br label %endif3560 +endif3560: + %t97 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t98 = getelementptr inbounds %S.ast.Type, ptr %t97, i32 0, i32 1 + store i64 0, ptr %a99 + br label %each.cond3561 +each.cond3561: + %t100 = getelementptr inbounds { ptr, i64, i64 }, ptr %t98, i32 0, i32 1 + %t101 = load i64, ptr %t100 + %t102 = load i64, ptr %a99 + %t103 = icmp slt i64 %t102, %t101 + br i1 %t103, label %each.body3562, label %each.end3564 +each.body3562: + %t104 = load ptr, ptr %t98 + %t105 = getelementptr inbounds %S.ast.Type, ptr %t104, i64 %t102 + %t106 = load %S.ast.Type, ptr %t105 + store %S.ast.Type %t106, ptr %a107 + %t108 = getelementptr inbounds { ptr, i64, i64 }, ptr %a53, i32 0, i32 1 + %t109 = load ptr, ptr %a1 + %t110 = load %S.ast.Type, ptr %a107 + %t111 = load %S.ast.Node, ptr %a2 + %t112 = call %S.ast.Type @finch.gen.resolve(ptr %t109, %S.ast.Type %t110, %S.ast.Node %t111) + %t113 = load i64, ptr %t108 + %t114 = add i64 %t113, 1 + call void @finch_arr_reserve(ptr %a53, i64 %t114, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t115 = load ptr, ptr %a53 + %t116 = getelementptr inbounds %S.ast.Type, ptr %t115, i64 %t113 + store %S.ast.Type %t112, ptr %t116 + store i64 %t114, ptr %t108 + br label %each.step3563 +each.step3563: + %t117 = load i64, ptr %a99 + %t118 = add i64 %t117, 1 + store i64 %t118, ptr %a99 + br label %each.cond3561 +each.end3564: + %t119 = load ptr, ptr %a1 + %t120 = load ptr, ptr %a1 + %t121 = load i64, ptr %a3 + %t122 = load { ptr, i64, i64 }, ptr %a53 + %t123 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2180, i64 4, i64 0 }) + %t124 = load %S.ast.Node, ptr %a2 + %t125 = call i64 @finch.gen.instFn(ptr %t120, i64 %t121, { ptr, i64, i64 } %t122, %S.ast.Type %t123, %S.ast.Node %t124) + %t126 = load %S.ast.Node, ptr %a2 + %t127 = load i64, ptr %a4 + %t128 = load { ptr, i64, i64 }, ptr %a5 + %t129 = call %S.gen.Val @finch.gen.callFn(ptr %t119, i64 %t125, %S.ast.Node %t126, i64 %t127, { ptr, i64, i64 } %t128, { ptr, i64, i64 } { ptr @.str.2181, i64 0, i64 0 }, { ptr, i64, i64 } { ptr @.str.2182, i64 0, i64 0 }) + ret %S.gen.Val %t129 +endif3557: + store %S.gen.Binds zeroinitializer, ptr %a130 + %t131 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t132 = getelementptr inbounds { ptr, i64, i64 }, ptr %t131, i32 0, i32 1 + %t133 = load i64, ptr %t132 + store i64 0, ptr %a134 + br label %for.cond3565 +for.cond3565: + %t135 = load i64, ptr %a134 + %t136 = icmp slt i64 %t135, %t133 + br i1 %t136, label %for.body3566, label %for.end3568 +for.body3566: + %t137 = getelementptr inbounds %S.gen.Binds, ptr %a130, i32 0, i32 0 + %t138 = getelementptr inbounds { ptr, i64, i64 }, ptr %t137, i32 0, i32 1 + %t139 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2183, i64 4, i64 0 }) + %t140 = load i64, ptr %t138 + %t141 = add i64 %t140, 1 + call void @finch_arr_reserve(ptr %t137, i64 %t141, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t142 = load ptr, ptr %t137 + %t143 = getelementptr inbounds %S.ast.Type, ptr %t142, i64 %t140 + store %S.ast.Type %t139, ptr %t143 + store i64 %t141, ptr %t138 + %t144 = getelementptr inbounds %S.gen.Binds, ptr %a130, i32 0, i32 1 + %t145 = getelementptr inbounds { ptr, i64, i64 }, ptr %t144, i32 0, i32 1 + %t146 = load i64, ptr %t145 + %t147 = add i64 %t146, 1 + call void @finch_arr_reserve(ptr %t144, i64 %t147, i64 ptrtoint (ptr getelementptr (i1, ptr null, i32 1) to i64)) + %t148 = load ptr, ptr %t144 + %t149 = getelementptr inbounds i1, ptr %t148, i64 %t146 + store i1 false, ptr %t149 + store i64 %t147, ptr %t145 + br label %for.step3567 +for.step3567: + %t150 = load i64, ptr %a134 + %t151 = add i64 %t150, 1 + store i64 %t151, ptr %a134 + br label %for.cond3565 +for.end3568: + store { ptr, i64, i64 } zeroinitializer, ptr %a152 + %t153 = load i64, ptr %a47 + store i64 0, ptr %a154 + br label %for.cond3569 +for.cond3569: + %t155 = load i64, ptr %a154 + %t156 = icmp slt i64 %t155, %t153 + br i1 %t156, label %for.body3570, label %for.end3572 +for.body3570: + %t157 = load ptr, ptr %a1 + %t158 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t159 = load i64, ptr %a4 + %t160 = load i64, ptr %a154 + %t161 = add i64 %t159, %t160 + %t162 = load { ptr, i64, i64 }, ptr %t158 + %t163 = extractvalue { ptr, i64, i64 } %t162, 1 + %t164 = icmp uge i64 %t161, %t163 + br i1 %t164, label %range3573, label %inrange3574 +range3573: + call void @finch_panic_index(ptr @.str.2184, i64 1457, i64 %t161, i64 %t163) + unreachable +inrange3574: + %t165 = extractvalue { ptr, i64, i64 } %t162, 0 + %t166 = getelementptr inbounds %S.ast.Node, ptr %t165, i64 %t161 + %t167 = load %S.ast.Node, ptr %t166 + %t168 = call %S.gen.Val @finch.gen.expr(ptr %t157, %S.ast.Node %t167) + store %S.gen.Val %t168, ptr %a169 + %t170 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t171 = getelementptr inbounds %S.ast.Type, ptr %t170, i32 0, i32 0 + %t172 = load { ptr, i64, i64 }, ptr %t171 + store { ptr, i64, i64 } %t172, ptr %a173 + store { ptr, i64, i64 } { ptr @.str.2185, i64 4, i64 0 }, ptr %a174 + %t175 = call i32 @finch_str_eq(ptr %a173, ptr %a174) + %t176 = icmp ne i32 %t175, 0 + br label %logic.from3575 +logic.from3575: + br i1 %t176, label %logic.end3577, label %logic.rhs3576 +logic.rhs3576: + %t177 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t178 = getelementptr inbounds %S.ast.Type, ptr %t177, i32 0, i32 0 + %t179 = load { ptr, i64, i64 }, ptr %t178 + store { ptr, i64, i64 } %t179, ptr %a180 + store { ptr, i64, i64 } { ptr @.str.2186, i64 4, i64 0 }, ptr %a181 + %t182 = call i32 @finch_str_eq(ptr %a180, ptr %a181) + %t183 = icmp ne i32 %t182, 0 + br label %logic.rend3578 +logic.rend3578: + br label %logic.end3577 +logic.end3577: + %t184 = phi i1 [ true, %logic.from3575 ], [ %t183, %logic.rend3578 ] + br i1 %t184, label %then3579, label %endif3581 +then3579: + %t185 = load ptr, ptr %a1 + %t186 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t187 = load i64, ptr %a4 + %t188 = load i64, ptr %a154 + %t189 = add i64 %t187, %t188 + %t190 = load { ptr, i64, i64 }, ptr %t186 + %t191 = extractvalue { ptr, i64, i64 } %t190, 1 + %t192 = icmp uge i64 %t189, %t191 + br i1 %t192, label %range3582, label %inrange3583 +range3582: + call void @finch_panic_index(ptr @.str.2187, i64 1459, i64 %t189, i64 %t191) + unreachable +inrange3583: + %t193 = extractvalue { ptr, i64, i64 } %t190, 0 + %t194 = getelementptr inbounds %S.ast.Node, ptr %t193, i64 %t189 + %t195 = load %S.ast.Node, ptr %t194 + %t196 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t197 = getelementptr inbounds { ptr, i64, i64 }, ptr %t196, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2189, i64 2, i64 0 }, ptr %a198 + call void @finch_str_join(ptr %a199, ptr %t196, ptr %a198) + %t200 = load { ptr, i64, i64 }, ptr %a199 + store { ptr, i64, i64 } { ptr @.str.2188, i64 29, i64 0 }, ptr %a202 + store { ptr, i64, i64 } %t200, ptr %a203 + call void @finch_str_concat(ptr %a201, ptr %a202, ptr %a203) + %t204 = load { ptr, i64, i64 }, ptr %a201 + store { ptr, i64, i64 } %t204, ptr %a206 + store { ptr, i64, i64 } { ptr @.str.2190, i64 5, i64 0 }, ptr %a207 + call void @finch_str_concat(ptr %a205, ptr %a206, ptr %a207) + %t208 = load { ptr, i64, i64 }, ptr %a205 + call void @finch.gen.fail(ptr %t185, %S.ast.Node %t195, { ptr, i64, i64 } %t208) + br label %endif3581 +endif3581: + %t209 = getelementptr inbounds { ptr, i64, i64 }, ptr %a152, i32 0, i32 1 + %t210 = load %S.gen.Val, ptr %a169 + store %S.gen.Val %t210, ptr %a211 + call void @finch.copy.S_gen_Val(ptr %a212, ptr %a211) + %t213 = load %S.gen.Val, ptr %a212 + %t214 = load i64, ptr %t209 + %t215 = add i64 %t214, 1 + call void @finch_arr_reserve(ptr %a152, i64 %t215, i64 ptrtoint (ptr getelementptr (%S.gen.Val, ptr null, i32 1) to i64)) + %t216 = load ptr, ptr %a152 + %t217 = getelementptr inbounds %S.gen.Val, ptr %t216, i64 %t214 + store %S.gen.Val %t213, ptr %t217 + store i64 %t215, ptr %t209 + %t218 = load ptr, ptr %a1 + %t219 = getelementptr inbounds %S.ast.Node, ptr %a42, i32 0, i32 9 + %t220 = load i64, ptr %a154 + %t221 = load { ptr, i64, i64 }, ptr %t219 + %t222 = extractvalue { ptr, i64, i64 } %t221, 1 + %t223 = icmp uge i64 %t220, %t222 + br i1 %t223, label %range3584, label %inrange3585 +range3584: + call void @finch_panic_index(ptr @.str.2191, i64 1462, i64 %t220, i64 %t222) + unreachable +inrange3585: + %t224 = extractvalue { ptr, i64, i64 } %t221, 0 + %t225 = getelementptr inbounds %S.ast.Node, ptr %t224, i64 %t220 + %t226 = getelementptr inbounds %S.ast.Node, ptr %t225, i32 0, i32 5 + %t227 = load %S.ast.Type, ptr %t226 + %t228 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t229 = load %S.ast.Type, ptr %t228 + %t230 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t231 = load { ptr, i64, i64 }, ptr %t230 + call void @finch.gen.bindType(ptr %t218, %S.ast.Type %t227, %S.ast.Type %t229, { ptr, i64, i64 } %t231, ptr %a130) + br label %for.step3571 +for.step3571: + %t232 = load i64, ptr %a154 + %t233 = add i64 %t232, 1 + store i64 %t233, ptr %a154 + br label %for.cond3569 +for.end3572: + %t234 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t235 = getelementptr inbounds { ptr, i64, i64 }, ptr %t234, i32 0, i32 1 + %t236 = load i64, ptr %t235 + store i64 0, ptr %a237 + br label %for.cond3586 +for.cond3586: + %t238 = load i64, ptr %a237 + %t239 = icmp slt i64 %t238, %t236 + br i1 %t239, label %for.body3587, label %for.end3589 +for.body3587: + %t240 = getelementptr inbounds %S.gen.Binds, ptr %a130, i32 0, i32 1 + %t241 = load i64, ptr %a237 + %t242 = load { ptr, i64, i64 }, ptr %t240 + %t243 = extractvalue { ptr, i64, i64 } %t242, 1 + %t244 = icmp uge i64 %t241, %t243 + br i1 %t244, label %range3590, label %inrange3591 +range3590: + call void @finch_panic_index(ptr @.str.2192, i64 1465, i64 %t241, i64 %t243) + unreachable +inrange3591: + %t245 = extractvalue { ptr, i64, i64 } %t242, 0 + %t246 = getelementptr inbounds i1, ptr %t245, i64 %t241 + %t247 = load i1, ptr %t246 + %t248 = xor i1 %t247, true + br i1 %t248, label %then3592, label %endif3594 +then3592: + %t249 = load ptr, ptr %a1 + %t250 = load %S.ast.Node, ptr %a2 + %t251 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 3 + %t252 = load i64, ptr %a237 + %t253 = load { ptr, i64, i64 }, ptr %t251 + %t254 = extractvalue { ptr, i64, i64 } %t253, 1 + %t255 = icmp uge i64 %t252, %t254 + br i1 %t255, label %range3595, label %inrange3596 +range3595: + call void @finch_panic_index(ptr @.str.2194, i64 1466, i64 %t252, i64 %t254) + unreachable +inrange3596: + %t256 = extractvalue { ptr, i64, i64 } %t253, 0 + %t257 = getelementptr inbounds { ptr, i64, i64 }, ptr %t256, i64 %t252 + %t258 = load { ptr, i64, i64 }, ptr %t257 + store { ptr, i64, i64 } { ptr @.str.2193, i64 16, i64 0 }, ptr %a260 + store { ptr, i64, i64 } %t258, ptr %a261 + call void @finch_str_concat(ptr %a259, ptr %a260, ptr %a261) + %t262 = load { ptr, i64, i64 }, ptr %a259 + store { ptr, i64, i64 } %t262, ptr %a264 + store { ptr, i64, i64 } { ptr @.str.2195, i64 24, i64 0 }, ptr %a265 + call void @finch_str_concat(ptr %a263, ptr %a264, ptr %a265) + %t266 = load { ptr, i64, i64 }, ptr %a263 + %t267 = getelementptr inbounds %S.gen.Template, ptr %a19, i32 0, i32 1 + %t268 = load { ptr, i64, i64 }, ptr %t267 + store { ptr, i64, i64 } %t266, ptr %a270 + store { ptr, i64, i64 } %t268, ptr %a271 + call void @finch_str_concat(ptr %a269, ptr %a270, ptr %a271) + %t272 = load { ptr, i64, i64 }, ptr %a269 + store { ptr, i64, i64 } %t272, ptr %a274 + store { ptr, i64, i64 } { ptr @.str.2196, i64 10, i64 0 }, ptr %a275 + call void @finch_str_concat(ptr %a273, ptr %a274, ptr %a275) + %t276 = load { ptr, i64, i64 }, ptr %a273 + call void @finch.gen.fail(ptr %t249, %S.ast.Node %t250, { ptr, i64, i64 } %t276) + br label %endif3594 +endif3594: + br label %for.step3588 +for.step3588: + %t277 = load i64, ptr %a237 + %t278 = add i64 %t277, 1 + store i64 %t278, ptr %a237 + br label %for.cond3586 +for.end3589: + %t279 = load ptr, ptr %a1 + %t280 = load i64, ptr %a3 + %t281 = getelementptr inbounds %S.gen.Binds, ptr %a130, i32 0, i32 0 + %t282 = load { ptr, i64, i64 }, ptr %t281 + %t283 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2197, i64 4, i64 0 }) + %t284 = load %S.ast.Node, ptr %a2 + %t285 = call i64 @finch.gen.instFn(ptr %t279, i64 %t280, { ptr, i64, i64 } %t282, %S.ast.Type %t283, %S.ast.Node %t284) + store i64 %t285, ptr %a286 + %t287 = load ptr, ptr %a1 + %t288 = icmp eq ptr %t287, null + br i1 %t288, label %panic3597, label %ok3598 +panic3597: + call void @finch_panic(ptr @.str.2198, i64 1470, ptr @.str.2199) + unreachable +ok3598: + %t289 = getelementptr inbounds %S.gen.Gen, ptr %t287, i32 0, i32 14 + %t290 = load i64, ptr %a286 + %t291 = load { ptr, i64, i64 }, ptr %t289 + %t292 = extractvalue { ptr, i64, i64 } %t291, 1 + %t293 = icmp uge i64 %t290, %t292 + br i1 %t293, label %range3599, label %inrange3600 +range3599: + call void @finch_panic_index(ptr @.str.2200, i64 1470, i64 %t290, i64 %t292) + unreachable +inrange3600: + %t294 = extractvalue { ptr, i64, i64 } %t291, 0 + %t295 = getelementptr inbounds %S.gen.FnSig, ptr %t294, i64 %t290 + %t296 = load %S.gen.FnSig, ptr %t295 + store %S.gen.FnSig %t296, ptr %a297 + call void @finch.copy.S_gen_FnSig(ptr %a298, ptr %a297) + %t299 = load %S.gen.FnSig, ptr %a298 + store %S.gen.FnSig %t299, ptr %a300 + store { ptr, i64, i64 } zeroinitializer, ptr %a301 + %t302 = load i64, ptr %a47 + store i64 0, ptr %a303 + br label %for.cond3601 +for.cond3601: + %t304 = load i64, ptr %a303 + %t305 = icmp slt i64 %t304, %t302 + br i1 %t305, label %for.body3602, label %for.end3604 +for.body3602: + %t306 = load ptr, ptr %a1 + %t307 = load i64, ptr %a303 + %t308 = load { ptr, i64, i64 }, ptr %a152 + %t309 = extractvalue { ptr, i64, i64 } %t308, 1 + %t310 = icmp uge i64 %t307, %t309 + br i1 %t310, label %range3605, label %inrange3606 +range3605: + call void @finch_panic_index(ptr @.str.2201, i64 1473, i64 %t307, i64 %t309) + unreachable +inrange3606: + %t311 = extractvalue { ptr, i64, i64 } %t308, 0 + %t312 = getelementptr inbounds %S.gen.Val, ptr %t311, i64 %t307 + %t313 = load %S.gen.Val, ptr %t312 + %t314 = getelementptr inbounds %S.gen.FnSig, ptr %a300, i32 0, i32 13 + %t315 = load i64, ptr %a303 + %t316 = load { ptr, i64, i64 }, ptr %t314 + %t317 = extractvalue { ptr, i64, i64 } %t316, 1 + %t318 = icmp uge i64 %t315, %t317 + br i1 %t318, label %range3607, label %inrange3608 +range3607: + call void @finch_panic_index(ptr @.str.2202, i64 1473, i64 %t315, i64 %t317) + unreachable +inrange3608: + %t319 = extractvalue { ptr, i64, i64 } %t316, 0 + %t320 = getelementptr inbounds %S.ast.Type, ptr %t319, i64 %t315 + %t321 = load %S.ast.Type, ptr %t320 + %t322 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t323 = load i64, ptr %a4 + %t324 = load i64, ptr %a303 + %t325 = add i64 %t323, %t324 + %t326 = load { ptr, i64, i64 }, ptr %t322 + %t327 = extractvalue { ptr, i64, i64 } %t326, 1 + %t328 = icmp uge i64 %t325, %t327 + br i1 %t328, label %range3609, label %inrange3610 +range3609: + call void @finch_panic_index(ptr @.str.2203, i64 1473, i64 %t325, i64 %t327) + unreachable +inrange3610: + %t329 = extractvalue { ptr, i64, i64 } %t326, 0 + %t330 = getelementptr inbounds %S.ast.Node, ptr %t329, i64 %t325 + %t331 = load %S.ast.Node, ptr %t330 + %t332 = getelementptr inbounds %S.gen.FnSig, ptr %a300, i32 0, i32 14 + %t333 = load i64, ptr %a303 + %t334 = load { ptr, i64, i64 }, ptr %t332 + %t335 = extractvalue { ptr, i64, i64 } %t334, 1 + %t336 = icmp uge i64 %t333, %t335 + br i1 %t336, label %range3611, label %inrange3612 +range3611: + call void @finch_panic_index(ptr @.str.2205, i64 1473, i64 %t333, i64 %t335) + unreachable +inrange3612: + %t337 = extractvalue { ptr, i64, i64 } %t334, 0 + %t338 = getelementptr inbounds { ptr, i64, i64 }, ptr %t337, i64 %t333 + %t339 = load { ptr, i64, i64 }, ptr %t338 + store { ptr, i64, i64 } { ptr @.str.2204, i64 10, i64 0 }, ptr %a341 + store { ptr, i64, i64 } %t339, ptr %a342 + call void @finch_str_concat(ptr %a340, ptr %a341, ptr %a342) + %t343 = load { ptr, i64, i64 }, ptr %a340 + store { ptr, i64, i64 } %t343, ptr %a345 + store { ptr, i64, i64 } { ptr @.str.2206, i64 1, i64 0 }, ptr %a346 + call void @finch_str_concat(ptr %a344, ptr %a345, ptr %a346) + %t347 = load { ptr, i64, i64 }, ptr %a344 + %t348 = call %S.gen.Val @finch.gen.coerce(ptr %t306, %S.gen.Val %t313, %S.ast.Type %t321, %S.ast.Node %t331, { ptr, i64, i64 } %t347) + store %S.gen.Val %t348, ptr %a349 + %t350 = getelementptr inbounds { ptr, i64, i64 }, ptr %a301, i32 0, i32 1 + %t351 = load ptr, ptr %a1 + %t352 = getelementptr inbounds %S.gen.FnSig, ptr %a300, i32 0, i32 13 + %t353 = load i64, ptr %a303 + %t354 = load { ptr, i64, i64 }, ptr %t352 + %t355 = extractvalue { ptr, i64, i64 } %t354, 1 + %t356 = icmp uge i64 %t353, %t355 + br i1 %t356, label %range3613, label %inrange3614 +range3613: + call void @finch_panic_index(ptr @.str.2207, i64 1474, i64 %t353, i64 %t355) + unreachable +inrange3614: + %t357 = extractvalue { ptr, i64, i64 } %t354, 0 + %t358 = getelementptr inbounds %S.ast.Type, ptr %t357, i64 %t353 + %t359 = load %S.ast.Type, ptr %t358 + %t360 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t351, %S.ast.Type %t359) + store { ptr, i64, i64 } %t360, ptr %a362 + store { ptr, i64, i64 } { ptr @.str.2208, i64 1, i64 0 }, ptr %a363 + call void @finch_str_concat(ptr %a361, ptr %a362, ptr %a363) + %t364 = load { ptr, i64, i64 }, ptr %a361 + %t365 = getelementptr inbounds %S.gen.Val, ptr %a349, i32 0, i32 0 + %t366 = load { ptr, i64, i64 }, ptr %t365 + store { ptr, i64, i64 } %t364, ptr %a368 + store { ptr, i64, i64 } %t366, ptr %a369 + call void @finch_str_concat(ptr %a367, ptr %a368, ptr %a369) + %t370 = load { ptr, i64, i64 }, ptr %a367 + %t371 = load i64, ptr %t350 + %t372 = add i64 %t371, 1 + call void @finch_arr_reserve(ptr %a301, i64 %t372, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t373 = load ptr, ptr %a301 + %t374 = getelementptr inbounds { ptr, i64, i64 }, ptr %t373, i64 %t371 + store { ptr, i64, i64 } %t370, ptr %t374 + store i64 %t372, ptr %t350 + br label %for.step3603 +for.step3603: + %t375 = load i64, ptr %a303 + %t376 = add i64 %t375, 1 + store i64 %t376, ptr %a303 + br label %for.cond3601 +for.end3604: + %t377 = load ptr, ptr %a1 + %t378 = load %S.gen.FnSig, ptr %a300 + %t379 = load %S.ast.Node, ptr %a2 + %t380 = load { ptr, i64, i64 }, ptr %a301 + %t381 = load { ptr, i64, i64 }, ptr %a5 + %t382 = call %S.gen.Val @finch.gen.emitCall(ptr %t377, %S.gen.FnSig %t378, %S.ast.Node %t379, { ptr, i64, i64 } %t380, { ptr, i64, i64 } %t381) + ret %S.gen.Val %t382 +} + +define internal void @finch.copy.S_cimport_CField(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.cimport.CField, ptr %src + store %S.cimport.CField %t1, ptr %dst + %t2 = getelementptr inbounds %S.cimport.CField, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.cimport.CField, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.cimport.CField, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.cimport.CField, ptr %src, i32 0, i32 1 + call void @finch.copy.S_ast_Type(ptr %t4, ptr %t5) + ret void +} + +define internal void @finch.copy.arr_S_cimport_CField(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.cimport.CField, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond3623 +n.cond3623: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body3624, label %n.end3625 +n.body3624: + %t8 = getelementptr inbounds %S.cimport.CField, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.cimport.CField, ptr %t2, i64 %t6 + call void @finch.copy.S_cimport_CField(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond3623 +n.end3625: + ret void +} + +define internal void @finch.copy.S_cimport_CStruct(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.cimport.CStruct, ptr %src + store %S.cimport.CStruct %t1, ptr %dst + %t2 = getelementptr inbounds %S.cimport.CStruct, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.cimport.CStruct, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.cimport.CStruct, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.cimport.CStruct, ptr %src, i32 0, i32 1 + call void @finch.copy.arr_S_cimport_CField(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.cimport.CStruct, ptr %dst, i32 0, i32 4 + %t7 = getelementptr inbounds %S.cimport.CStruct, ptr %src, i32 0, i32 4 + call void @finch_str_copy(ptr %t6, ptr %t7) + ret void +} + +define internal void @finch.gen.resolveCStruct(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca %S.cimport.CStruct, align 16 + %a29 = alloca %S.cimport.CStruct, align 16 + %a31 = alloca %S.cimport.CStruct, align 16 + %a42 = alloca i64, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca i64, align 16 + %a53 = alloca %S.cimport.CField, align 16 + %a60 = alloca %S.ast.Type, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca %S.ast.Type, align 16 + %a130 = alloca %S.ast.Type, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic3615, label %ok3616 +panic3615: + call void @finch_panic(ptr @.str.2209, i64 1482, ptr @.str.2210) + unreachable +ok3616: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 24 + %t6 = getelementptr inbounds %S.cimport.CImports, ptr %t5, i32 0, i32 3 + %t7 = load ptr, ptr %a1 + %t8 = icmp eq ptr %t7, null + br i1 %t8, label %panic3617, label %ok3618 +panic3617: + call void @finch_panic(ptr @.str.2211, i64 1482, ptr @.str.2212) + unreachable +ok3618: + %t9 = getelementptr inbounds %S.gen.Gen, ptr %t7, i32 0, i32 15 + %t10 = load i64, ptr %a2 + %t11 = load { ptr, i64, i64 }, ptr %t9 + %t12 = extractvalue { ptr, i64, i64 } %t11, 1 + %t13 = icmp uge i64 %t10, %t12 + br i1 %t13, label %range3619, label %inrange3620 +range3619: + call void @finch_panic_index(ptr @.str.2213, i64 1482, i64 %t10, i64 %t12) + unreachable +inrange3620: + %t14 = extractvalue { ptr, i64, i64 } %t11, 0 + %t15 = getelementptr inbounds %S.gen.StructDef, ptr %t14, i64 %t10 + %t16 = getelementptr inbounds %S.gen.StructDef, ptr %t15, i32 0, i32 1 + %t17 = load { ptr, i64, i64 }, ptr %t16 + store { ptr, i64, i64 } %t17, ptr %a18 + %t19 = call i64 @finch_map_find(ptr %t6, ptr %a18, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t20 = icmp slt i64 %t19, 0 + br i1 %t20, label %map.missing3621, label %map.found3622 +map.missing3621: + store { ptr, i64, i64 } zeroinitializer, ptr %a21 + store { ptr, i64, i64 } %t17, ptr %a22 + call void @finch_buf_str(ptr %a21, ptr %a22, i32 1) + call void @finch_map_missing(ptr @.str.2214, i64 1482, ptr %a21) + unreachable +map.found3622: + %t23 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t6, i32 0, i32 0 + %t24 = load ptr, ptr %t23 + %t25 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t24, i64 %t19 + %t26 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t25, i32 0, i32 2 + %t27 = load %S.cimport.CStruct, ptr %t26 + store %S.cimport.CStruct %t27, ptr %a28 + call void @finch.copy.S_cimport_CStruct(ptr %a29, ptr %a28) + %t30 = load %S.cimport.CStruct, ptr %a29 + store %S.cimport.CStruct %t30, ptr %a31 + %t32 = load ptr, ptr %a1 + %t33 = icmp eq ptr %t32, null + br i1 %t33, label %panic3626, label %ok3627 +panic3626: + call void @finch_panic(ptr @.str.2215, i64 1483, ptr @.str.2216) + unreachable +ok3627: + %t34 = getelementptr inbounds %S.gen.Gen, ptr %t32, i32 0, i32 15 + %t35 = load i64, ptr %a2 + %t36 = load { ptr, i64, i64 }, ptr %t34 + %t37 = extractvalue { ptr, i64, i64 } %t36, 1 + %t38 = icmp uge i64 %t35, %t37 + br i1 %t38, label %range3628, label %inrange3629 +range3628: + call void @finch_panic_index(ptr @.str.2217, i64 1483, i64 %t35, i64 %t37) + unreachable +inrange3629: + %t39 = extractvalue { ptr, i64, i64 } %t36, 0 + %t40 = getelementptr inbounds %S.gen.StructDef, ptr %t39, i64 %t35 + %t41 = getelementptr inbounds %S.gen.StructDef, ptr %t40, i32 0, i32 15 + store i64 1, ptr %t41 + store i64 0, ptr %a42 + store { ptr, i64, i64 } zeroinitializer, ptr %a43 + %t44 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 1 + store i64 0, ptr %a45 + br label %each.cond3630 +each.cond3630: + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %t44, i32 0, i32 1 + %t47 = load i64, ptr %t46 + %t48 = load i64, ptr %a45 + %t49 = icmp slt i64 %t48, %t47 + br i1 %t49, label %each.body3631, label %each.end3633 +each.body3631: + %t50 = load ptr, ptr %t44 + %t51 = getelementptr inbounds %S.cimport.CField, ptr %t50, i64 %t48 + %t52 = load %S.cimport.CField, ptr %t51 + store %S.cimport.CField %t52, ptr %a53 + %t54 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 5 + %t55 = load i1, ptr %t54 + br i1 %t55, label %then3634, label %endif3636 +then3634: + br label %each.step3632 +endif3636: + %t56 = load ptr, ptr %a1 + %t57 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 1 + %t58 = load %S.ast.Type, ptr %t57 + %t59 = call %S.ast.Type @finch.gen.resolve(ptr %t56, %S.ast.Type %t58, %S.ast.Node zeroinitializer) + store %S.ast.Type %t59, ptr %a60 + %t61 = getelementptr inbounds %S.ast.Type, ptr %a60, i32 0, i32 0 + %t62 = load { ptr, i64, i64 }, ptr %t61 + store { ptr, i64, i64 } %t62, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.2218, i64 6, i64 0 }, ptr %a64 + %t65 = call i32 @finch_str_eq(ptr %a63, ptr %a64) + %t66 = icmp ne i32 %t65, 0 + br i1 %t66, label %then3637, label %endif3639 +then3637: + %t67 = load ptr, ptr %a1 + %t68 = load ptr, ptr %a1 + %t69 = getelementptr inbounds %S.ast.Type, ptr %a60, i32 0, i32 3 + %t70 = load { ptr, i64, i64 }, ptr %t69 + %t71 = getelementptr inbounds %S.ast.Type, ptr %a60, i32 0, i32 2 + %t72 = load { ptr, i64, i64 }, ptr %t71 + %t73 = call i64 @finch.gen.findStruct(ptr %t68, { ptr, i64, i64 } %t70, { ptr, i64, i64 } %t72) + call void @finch.gen.resolveStruct(ptr %t67, i64 %t73) + br label %endif3639 +endif3639: + %t74 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 2 + %t75 = load i64, ptr %t74 + %t76 = load i64, ptr %a42 + %t77 = icmp sgt i64 %t75, %t76 + br i1 %t77, label %then3640, label %endif3642 +then3640: + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %a43, i32 0, i32 1 + %t79 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 2 + %t80 = load i64, ptr %t79 + %t81 = load i64, ptr %a42 + %t82 = sub i64 %t80, %t81 + call void @finch_str_from_int(ptr %a83, i64 %t82) + %t84 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } { ptr @.str.2219, i64 1, i64 0 }, ptr %a86 + store { ptr, i64, i64 } %t84, ptr %a87 + call void @finch_str_concat(ptr %a85, ptr %a86, ptr %a87) + %t88 = load { ptr, i64, i64 }, ptr %a85 + store { ptr, i64, i64 } %t88, ptr %a90 + store { ptr, i64, i64 } { ptr @.str.2220, i64 6, i64 0 }, ptr %a91 + call void @finch_str_concat(ptr %a89, ptr %a90, ptr %a91) + %t92 = load { ptr, i64, i64 }, ptr %a89 + %t93 = load i64, ptr %t78 + %t94 = add i64 %t93, 1 + call void @finch_arr_reserve(ptr %a43, i64 %t94, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t95 = load ptr, ptr %a43 + %t96 = getelementptr inbounds { ptr, i64, i64 }, ptr %t95, i64 %t93 + store { ptr, i64, i64 } %t92, ptr %t96 + store i64 %t94, ptr %t78 + br label %endif3642 +endif3642: + %t97 = load ptr, ptr %a1 + %t98 = icmp eq ptr %t97, null + br i1 %t98, label %panic3643, label %ok3644 +panic3643: + call void @finch_panic(ptr @.str.2221, i64 1497, ptr @.str.2222) + unreachable +ok3644: + %t99 = getelementptr inbounds %S.gen.Gen, ptr %t97, i32 0, i32 15 + %t100 = load i64, ptr %a2 + %t101 = load { ptr, i64, i64 }, ptr %t99 + %t102 = extractvalue { ptr, i64, i64 } %t101, 1 + %t103 = icmp uge i64 %t100, %t102 + br i1 %t103, label %range3645, label %inrange3646 +range3645: + call void @finch_panic_index(ptr @.str.2223, i64 1497, i64 %t100, i64 %t102) + unreachable +inrange3646: + %t104 = extractvalue { ptr, i64, i64 } %t101, 0 + %t105 = getelementptr inbounds %S.gen.StructDef, ptr %t104, i64 %t100 + %t106 = getelementptr inbounds %S.gen.StructDef, ptr %t105, i32 0, i32 11 + %t107 = getelementptr inbounds { ptr, i64, i64 }, ptr %t106, i32 0, i32 1 + %t108 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 0 + %t109 = load { ptr, i64, i64 }, ptr %t108 + store { ptr, i64, i64 } %t109, ptr %a110 + call void @finch_str_copy(ptr %a111, ptr %a110) + %t112 = load { ptr, i64, i64 }, ptr %a111 + %t113 = load i64, ptr %t107 + %t114 = add i64 %t113, 1 + call void @finch_arr_reserve(ptr %t106, i64 %t114, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t115 = load ptr, ptr %t106 + %t116 = getelementptr inbounds { ptr, i64, i64 }, ptr %t115, i64 %t113 + store { ptr, i64, i64 } %t112, ptr %t116 + store i64 %t114, ptr %t107 + %t117 = load ptr, ptr %a1 + %t118 = icmp eq ptr %t117, null + br i1 %t118, label %panic3647, label %ok3648 +panic3647: + call void @finch_panic(ptr @.str.2224, i64 1498, ptr @.str.2225) + unreachable +ok3648: + %t119 = getelementptr inbounds %S.gen.Gen, ptr %t117, i32 0, i32 15 + %t120 = load i64, ptr %a2 + %t121 = load { ptr, i64, i64 }, ptr %t119 + %t122 = extractvalue { ptr, i64, i64 } %t121, 1 + %t123 = icmp uge i64 %t120, %t122 + br i1 %t123, label %range3649, label %inrange3650 +range3649: + call void @finch_panic_index(ptr @.str.2226, i64 1498, i64 %t120, i64 %t122) + unreachable +inrange3650: + %t124 = extractvalue { ptr, i64, i64 } %t121, 0 + %t125 = getelementptr inbounds %S.gen.StructDef, ptr %t124, i64 %t120 + %t126 = getelementptr inbounds %S.gen.StructDef, ptr %t125, i32 0, i32 12 + %t127 = getelementptr inbounds { ptr, i64, i64 }, ptr %t126, i32 0, i32 1 + %t128 = load %S.ast.Type, ptr %a60 + store %S.ast.Type %t128, ptr %a129 + call void @finch.copy.S_ast_Type(ptr %a130, ptr %a129) + %t131 = load %S.ast.Type, ptr %a130 + %t132 = load i64, ptr %t127 + %t133 = add i64 %t132, 1 + call void @finch_arr_reserve(ptr %t126, i64 %t133, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t134 = load ptr, ptr %t126 + %t135 = getelementptr inbounds %S.ast.Type, ptr %t134, i64 %t132 + store %S.ast.Type %t131, ptr %t135 + store i64 %t133, ptr %t127 + %t136 = load ptr, ptr %a1 + %t137 = icmp eq ptr %t136, null + br i1 %t137, label %panic3651, label %ok3652 +panic3651: + call void @finch_panic(ptr @.str.2227, i64 1499, ptr @.str.2228) + unreachable +ok3652: + %t138 = getelementptr inbounds %S.gen.Gen, ptr %t136, i32 0, i32 15 + %t139 = load i64, ptr %a2 + %t140 = load { ptr, i64, i64 }, ptr %t138 + %t141 = extractvalue { ptr, i64, i64 } %t140, 1 + %t142 = icmp uge i64 %t139, %t141 + br i1 %t142, label %range3653, label %inrange3654 +range3653: + call void @finch_panic_index(ptr @.str.2229, i64 1499, i64 %t139, i64 %t141) + unreachable +inrange3654: + %t143 = extractvalue { ptr, i64, i64 } %t140, 0 + %t144 = getelementptr inbounds %S.gen.StructDef, ptr %t143, i64 %t139 + %t145 = getelementptr inbounds %S.gen.StructDef, ptr %t144, i32 0, i32 3 + %t146 = getelementptr inbounds { ptr, i64, i64 }, ptr %t145, i32 0, i32 1 + %t147 = getelementptr inbounds { ptr, i64, i64 }, ptr %a43, i32 0, i32 1 + %t148 = load i64, ptr %t147 + %t149 = load i64, ptr %t146 + %t150 = add i64 %t149, 1 + call void @finch_arr_reserve(ptr %t145, i64 %t150, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t151 = load ptr, ptr %t145 + %t152 = getelementptr inbounds i64, ptr %t151, i64 %t149 + store i64 %t148, ptr %t152 + store i64 %t150, ptr %t146 + %t153 = load ptr, ptr %a1 + %t154 = icmp eq ptr %t153, null + br i1 %t154, label %panic3655, label %ok3656 +panic3655: + call void @finch_panic(ptr @.str.2230, i64 1500, ptr @.str.2231) + unreachable +ok3656: + %t155 = getelementptr inbounds %S.gen.Gen, ptr %t153, i32 0, i32 15 + %t156 = load i64, ptr %a2 + %t157 = load { ptr, i64, i64 }, ptr %t155 + %t158 = extractvalue { ptr, i64, i64 } %t157, 1 + %t159 = icmp uge i64 %t156, %t158 + br i1 %t159, label %range3657, label %inrange3658 +range3657: + call void @finch_panic_index(ptr @.str.2232, i64 1500, i64 %t156, i64 %t158) + unreachable +inrange3658: + %t160 = extractvalue { ptr, i64, i64 } %t157, 0 + %t161 = getelementptr inbounds %S.gen.StructDef, ptr %t160, i64 %t156 + %t162 = getelementptr inbounds %S.gen.StructDef, ptr %t161, i32 0, i32 4 + %t163 = getelementptr inbounds { ptr, i64, i64 }, ptr %t162, i32 0, i32 1 + %t164 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 2 + %t165 = load i64, ptr %t164 + %t166 = load i64, ptr %t163 + %t167 = add i64 %t166, 1 + call void @finch_arr_reserve(ptr %t162, i64 %t167, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t168 = load ptr, ptr %t162 + %t169 = getelementptr inbounds i64, ptr %t168, i64 %t166 + store i64 %t165, ptr %t169 + store i64 %t167, ptr %t163 + %t170 = getelementptr inbounds { ptr, i64, i64 }, ptr %a43, i32 0, i32 1 + %t171 = load ptr, ptr %a1 + %t172 = load %S.ast.Type, ptr %a60 + %t173 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t171, %S.ast.Type %t172) + %t174 = load i64, ptr %t170 + %t175 = add i64 %t174, 1 + call void @finch_arr_reserve(ptr %a43, i64 %t175, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t176 = load ptr, ptr %a43 + %t177 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 %t174 + store { ptr, i64, i64 } %t173, ptr %t177 + store i64 %t175, ptr %t170 + %t178 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 2 + %t179 = load i64, ptr %t178 + %t180 = getelementptr inbounds %S.cimport.CField, ptr %a53, i32 0, i32 3 + %t181 = load i64, ptr %t180 + %t182 = add i64 %t179, %t181 + store i64 %t182, ptr %a42 + br label %each.step3632 +each.step3632: + %t183 = load i64, ptr %a45 + %t184 = add i64 %t183, 1 + store i64 %t184, ptr %a45 + br label %each.cond3630 +each.end3633: + %t185 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 2 + %t186 = load i64, ptr %t185 + %t187 = load i64, ptr %a42 + %t188 = icmp sgt i64 %t186, %t187 + br i1 %t188, label %then3659, label %endif3661 +then3659: + %t189 = getelementptr inbounds { ptr, i64, i64 }, ptr %a43, i32 0, i32 1 + %t190 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 2 + %t191 = load i64, ptr %t190 + %t192 = load i64, ptr %a42 + %t193 = sub i64 %t191, %t192 + call void @finch_str_from_int(ptr %a194, i64 %t193) + %t195 = load { ptr, i64, i64 }, ptr %a194 + store { ptr, i64, i64 } { ptr @.str.2233, i64 1, i64 0 }, ptr %a197 + store { ptr, i64, i64 } %t195, ptr %a198 + call void @finch_str_concat(ptr %a196, ptr %a197, ptr %a198) + %t199 = load { ptr, i64, i64 }, ptr %a196 + store { ptr, i64, i64 } %t199, ptr %a201 + store { ptr, i64, i64 } { ptr @.str.2234, i64 6, i64 0 }, ptr %a202 + call void @finch_str_concat(ptr %a200, ptr %a201, ptr %a202) + %t203 = load { ptr, i64, i64 }, ptr %a200 + %t204 = load i64, ptr %t189 + %t205 = add i64 %t204, 1 + call void @finch_arr_reserve(ptr %a43, i64 %t205, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t206 = load ptr, ptr %a43 + %t207 = getelementptr inbounds { ptr, i64, i64 }, ptr %t206, i64 %t204 + store { ptr, i64, i64 } %t203, ptr %t207 + store i64 %t205, ptr %t189 + br label %endif3661 +endif3661: + %t208 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 4 + %t209 = load { ptr, i64, i64 }, ptr %t208 + %t210 = load ptr, ptr %a1 + %t211 = icmp eq ptr %t210, null + br i1 %t211, label %panic3662, label %ok3663 +panic3662: + call void @finch_panic(ptr @.str.2235, i64 1507, ptr @.str.2236) + unreachable +ok3663: + %t212 = getelementptr inbounds %S.gen.Gen, ptr %t210, i32 0, i32 15 + %t213 = load i64, ptr %a2 + %t214 = load { ptr, i64, i64 }, ptr %t212 + %t215 = extractvalue { ptr, i64, i64 } %t214, 1 + %t216 = icmp uge i64 %t213, %t215 + br i1 %t216, label %range3664, label %inrange3665 +range3664: + call void @finch_panic_index(ptr @.str.2237, i64 1507, i64 %t213, i64 %t215) + unreachable +inrange3665: + %t217 = extractvalue { ptr, i64, i64 } %t214, 0 + %t218 = getelementptr inbounds %S.gen.StructDef, ptr %t217, i64 %t213 + %t219 = getelementptr inbounds %S.gen.StructDef, ptr %t218, i32 0, i32 8 + store { ptr, i64, i64 } %t209, ptr %a220 + call void @finch_str_copy(ptr %a221, ptr %a220) + %t222 = load { ptr, i64, i64 }, ptr %a221 + store { ptr, i64, i64 } %t222, ptr %t219 + %t223 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 5 + %t224 = load i1, ptr %t223 + br label %logic.from3666 +logic.from3666: + br i1 %t224, label %logic.rhs3667, label %logic.end3668 +logic.rhs3667: + %t225 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 4 + %t226 = getelementptr inbounds { ptr, i64, i64 }, ptr %t225, i32 0, i32 1 + %t227 = load i64, ptr %t226 + %t228 = icmp eq i64 %t227, 0 + br label %logic.rend3669 +logic.rend3669: + br label %logic.end3668 +logic.end3668: + %t229 = phi i1 [ false, %logic.from3666 ], [ %t228, %logic.rend3669 ] + br i1 %t229, label %then3670, label %endif3672 +then3670: + %t230 = load ptr, ptr %a1 + %t231 = icmp eq ptr %t230, null + br i1 %t231, label %panic3673, label %ok3674 +panic3673: + call void @finch_panic(ptr @.str.2239, i64 1509, ptr @.str.2240) + unreachable +ok3674: + %t232 = getelementptr inbounds %S.gen.Gen, ptr %t230, i32 0, i32 15 + %t233 = load i64, ptr %a2 + %t234 = load { ptr, i64, i64 }, ptr %t232 + %t235 = extractvalue { ptr, i64, i64 } %t234, 1 + %t236 = icmp uge i64 %t233, %t235 + br i1 %t236, label %range3675, label %inrange3676 +range3675: + call void @finch_panic_index(ptr @.str.2241, i64 1509, i64 %t233, i64 %t235) + unreachable +inrange3676: + %t237 = extractvalue { ptr, i64, i64 } %t234, 0 + %t238 = getelementptr inbounds %S.gen.StructDef, ptr %t237, i64 %t233 + %t239 = getelementptr inbounds %S.gen.StructDef, ptr %t238, i32 0, i32 8 + store { ptr, i64, i64 } { ptr @.str.2238, i64 49, i64 0 }, ptr %t239 + br label %endif3672 +endif3672: + %t240 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 2 + %t241 = load i64, ptr %t240 + %t242 = load ptr, ptr %a1 + %t243 = icmp eq ptr %t242, null + br i1 %t243, label %panic3677, label %ok3678 +panic3677: + call void @finch_panic(ptr @.str.2242, i64 1511, ptr @.str.2243) + unreachable +ok3678: + %t244 = getelementptr inbounds %S.gen.Gen, ptr %t242, i32 0, i32 15 + %t245 = load i64, ptr %a2 + %t246 = load { ptr, i64, i64 }, ptr %t244 + %t247 = extractvalue { ptr, i64, i64 } %t246, 1 + %t248 = icmp uge i64 %t245, %t247 + br i1 %t248, label %range3679, label %inrange3680 +range3679: + call void @finch_panic_index(ptr @.str.2244, i64 1511, i64 %t245, i64 %t247) + unreachable +inrange3680: + %t249 = extractvalue { ptr, i64, i64 } %t246, 0 + %t250 = getelementptr inbounds %S.gen.StructDef, ptr %t249, i64 %t245 + %t251 = getelementptr inbounds %S.gen.StructDef, ptr %t250, i32 0, i32 9 + store i64 %t241, ptr %t251 + %t252 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 3 + %t253 = load i64, ptr %t252 + %t254 = load ptr, ptr %a1 + %t255 = icmp eq ptr %t254, null + br i1 %t255, label %panic3681, label %ok3682 +panic3681: + call void @finch_panic(ptr @.str.2245, i64 1512, ptr @.str.2246) + unreachable +ok3682: + %t256 = getelementptr inbounds %S.gen.Gen, ptr %t254, i32 0, i32 15 + %t257 = load i64, ptr %a2 + %t258 = load { ptr, i64, i64 }, ptr %t256 + %t259 = extractvalue { ptr, i64, i64 } %t258, 1 + %t260 = icmp uge i64 %t257, %t259 + br i1 %t260, label %range3683, label %inrange3684 +range3683: + call void @finch_panic_index(ptr @.str.2247, i64 1512, i64 %t257, i64 %t259) + unreachable +inrange3684: + %t261 = extractvalue { ptr, i64, i64 } %t258, 0 + %t262 = getelementptr inbounds %S.gen.StructDef, ptr %t261, i64 %t257 + %t263 = getelementptr inbounds %S.gen.StructDef, ptr %t262, i32 0, i32 10 + store i64 %t253, ptr %t263 + %t264 = load ptr, ptr %a1 + %t265 = icmp eq ptr %t264, null + br i1 %t265, label %panic3685, label %ok3686 +panic3685: + call void @finch_panic(ptr @.str.2248, i64 1513, ptr @.str.2249) + unreachable +ok3686: + %t266 = getelementptr inbounds %S.gen.Gen, ptr %t264, i32 0, i32 15 + %t267 = load i64, ptr %a2 + %t268 = load { ptr, i64, i64 }, ptr %t266 + %t269 = extractvalue { ptr, i64, i64 } %t268, 1 + %t270 = icmp uge i64 %t267, %t269 + br i1 %t270, label %range3687, label %inrange3688 +range3687: + call void @finch_panic_index(ptr @.str.2250, i64 1513, i64 %t267, i64 %t269) + unreachable +inrange3688: + %t271 = extractvalue { ptr, i64, i64 } %t268, 0 + %t272 = getelementptr inbounds %S.gen.StructDef, ptr %t271, i64 %t267 + %t273 = getelementptr inbounds %S.gen.StructDef, ptr %t272, i32 0, i32 15 + store i64 2, ptr %t273 + %t274 = load ptr, ptr %a1 + %t275 = icmp eq ptr %t274, null + br i1 %t275, label %panic3689, label %ok3690 +panic3689: + call void @finch_panic(ptr @.str.2251, i64 1514, ptr @.str.2252) + unreachable +ok3690: + %t276 = getelementptr inbounds %S.gen.Gen, ptr %t274, i32 0, i32 2 + %t277 = getelementptr inbounds { ptr, i64, i64 }, ptr %t276, i32 0, i32 1 + %t278 = getelementptr inbounds %S.cimport.CStruct, ptr %a31, i32 0, i32 0 + %t279 = load { ptr, i64, i64 }, ptr %t278 + store { ptr, i64, i64 } { ptr @.str.2253, i64 5, i64 0 }, ptr %a281 + store { ptr, i64, i64 } %t279, ptr %a282 + call void @finch_str_concat(ptr %a280, ptr %a281, ptr %a282) + %t283 = load { ptr, i64, i64 }, ptr %a280 + store { ptr, i64, i64 } %t283, ptr %a285 + store { ptr, i64, i64 } { ptr @.str.2254, i64 10, i64 0 }, ptr %a286 + call void @finch_str_concat(ptr %a284, ptr %a285, ptr %a286) + %t287 = load { ptr, i64, i64 }, ptr %a284 + %t288 = getelementptr inbounds { ptr, i64, i64 }, ptr %a43, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2255, i64 2, i64 0 }, ptr %a289 + call void @finch_str_join(ptr %a290, ptr %a43, ptr %a289) + %t291 = load { ptr, i64, i64 }, ptr %a290 + store { ptr, i64, i64 } %t287, ptr %a293 + store { ptr, i64, i64 } %t291, ptr %a294 + call void @finch_str_concat(ptr %a292, ptr %a293, ptr %a294) + %t295 = load { ptr, i64, i64 }, ptr %a292 + store { ptr, i64, i64 } %t295, ptr %a297 + store { ptr, i64, i64 } { ptr @.str.2256, i64 2, i64 0 }, ptr %a298 + call void @finch_str_concat(ptr %a296, ptr %a297, ptr %a298) + %t299 = load { ptr, i64, i64 }, ptr %a296 + %t300 = load i64, ptr %t277 + %t301 = add i64 %t300, 1 + call void @finch_arr_reserve(ptr %t276, i64 %t301, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t302 = load ptr, ptr %t276 + %t303 = getelementptr inbounds { ptr, i64, i64 }, ptr %t302, i64 %t300 + store { ptr, i64, i64 } %t299, ptr %t303 + store i64 %t301, ptr %t277 + ret void +} + +define internal void @finch.gen.resolveStruct(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic3691, label %ok3692 +panic3691: + call void @finch_panic(ptr @.str.2257, i64 1518, ptr @.str.2258) + unreachable +ok3692: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 15 + %t6 = load i64, ptr %a2 + %t7 = load { ptr, i64, i64 }, ptr %t5 + %t8 = extractvalue { ptr, i64, i64 } %t7, 1 + %t9 = icmp uge i64 %t6, %t8 + br i1 %t9, label %range3693, label %inrange3694 +range3693: + call void @finch_panic_index(ptr @.str.2259, i64 1518, i64 %t6, i64 %t8) + unreachable +inrange3694: + %t10 = extractvalue { ptr, i64, i64 } %t7, 0 + %t11 = getelementptr inbounds %S.gen.StructDef, ptr %t10, i64 %t6 + %t12 = getelementptr inbounds %S.gen.StructDef, ptr %t11, i32 0, i32 15 + %t13 = load i64, ptr %t12 + %t14 = icmp eq i64 %t13, 2 + br i1 %t14, label %then3695, label %endif3697 +then3695: + ret void +endif3697: + %t15 = load ptr, ptr %a1 + %t16 = icmp eq ptr %t15, null + br i1 %t16, label %panic3698, label %ok3699 +panic3698: + call void @finch_panic(ptr @.str.2260, i64 1521, ptr @.str.2261) + unreachable +ok3699: + %t17 = getelementptr inbounds %S.gen.Gen, ptr %t15, i32 0, i32 15 + %t18 = load i64, ptr %a2 + %t19 = load { ptr, i64, i64 }, ptr %t17 + %t20 = extractvalue { ptr, i64, i64 } %t19, 1 + %t21 = icmp uge i64 %t18, %t20 + br i1 %t21, label %range3700, label %inrange3701 +range3700: + call void @finch_panic_index(ptr @.str.2262, i64 1521, i64 %t18, i64 %t20) + unreachable +inrange3701: + %t22 = extractvalue { ptr, i64, i64 } %t19, 0 + %t23 = getelementptr inbounds %S.gen.StructDef, ptr %t22, i64 %t18 + %t24 = getelementptr inbounds %S.gen.StructDef, ptr %t23, i32 0, i32 2 + %t25 = load i1, ptr %t24 + br i1 %t25, label %then3702, label %endif3704 +then3702: + %t26 = load ptr, ptr %a1 + %t27 = load i64, ptr %a2 + call void @finch.gen.resolveCStruct(ptr %t26, i64 %t27) + ret void +endif3704: + %t28 = load ptr, ptr %a1 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic3705, label %ok3706 +panic3705: + call void @finch_panic(ptr @.str.2263, i64 1525, ptr @.str.2264) + unreachable +ok3706: + %t30 = getelementptr inbounds %S.gen.Gen, ptr %t28, i32 0, i32 15 + %t31 = load i64, ptr %a2 + %t32 = load { ptr, i64, i64 }, ptr %t30 + %t33 = extractvalue { ptr, i64, i64 } %t32, 1 + %t34 = icmp uge i64 %t31, %t33 + br i1 %t34, label %range3707, label %inrange3708 +range3707: + call void @finch_panic_index(ptr @.str.2265, i64 1525, i64 %t31, i64 %t33) + unreachable +inrange3708: + %t35 = extractvalue { ptr, i64, i64 } %t32, 0 + %t36 = getelementptr inbounds %S.gen.StructDef, ptr %t35, i64 %t31 + %t37 = getelementptr inbounds %S.gen.StructDef, ptr %t36, i32 0, i32 5 + %t38 = getelementptr inbounds { ptr, i64, i64 }, ptr %t37, i32 0, i32 1 + %t39 = load i64, ptr %t38 + %t40 = icmp eq i64 %t39, 0 + br i1 %t40, label %then3709, label %endif3711 +then3709: + %t41 = load ptr, ptr %a1 + %t42 = load i64, ptr %a2 + call void @finch.gen.resolveStructBody(ptr %t41, i64 %t42) + ret void +endif3711: + %t43 = load ptr, ptr %a1 + %t44 = icmp eq ptr %t43, null + br i1 %t44, label %panic3712, label %ok3713 +panic3712: + call void @finch_panic(ptr @.str.2266, i64 1530, ptr @.str.2267) + unreachable +ok3713: + %t45 = getelementptr inbounds %S.gen.Gen, ptr %t43, i32 0, i32 17 + %t46 = load { ptr, i64, i64 }, ptr %t45 + store { ptr, i64, i64 } %t46, ptr %a47 + call void @finch.copy.arr_str(ptr %a48, ptr %a47) + %t49 = load { ptr, i64, i64 }, ptr %a48 + store { ptr, i64, i64 } %t49, ptr %a50 + %t51 = load ptr, ptr %a1 + %t52 = icmp eq ptr %t51, null + br i1 %t52, label %panic3714, label %ok3715 +panic3714: + call void @finch_panic(ptr @.str.2268, i64 1531, ptr @.str.2269) + unreachable +ok3715: + %t53 = getelementptr inbounds %S.gen.Gen, ptr %t51, i32 0, i32 18 + %t54 = load { ptr, i64, i64 }, ptr %t53 + store { ptr, i64, i64 } %t54, ptr %a55 + call void @finch.copy.arr_S_ast_Type(ptr %a56, ptr %a55) + %t57 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t57, ptr %a58 + %t59 = load ptr, ptr %a1 + %t60 = icmp eq ptr %t59, null + br i1 %t60, label %panic3716, label %ok3717 +panic3716: + call void @finch_panic(ptr @.str.2270, i64 1532, ptr @.str.2271) + unreachable +ok3717: + %t61 = getelementptr inbounds %S.gen.Gen, ptr %t59, i32 0, i32 19 + %t62 = load { ptr, i64, i64 }, ptr %t61 + store { ptr, i64, i64 } %t62, ptr %a63 + call void @finch_str_copy(ptr %a64, ptr %a63) + %t65 = load { ptr, i64, i64 }, ptr %a64 + store { ptr, i64, i64 } %t65, ptr %a66 + %t67 = load ptr, ptr %a1 + %t68 = icmp eq ptr %t67, null + br i1 %t68, label %panic3718, label %ok3719 +panic3718: + call void @finch_panic(ptr @.str.2272, i64 1533, ptr @.str.2273) + unreachable +ok3719: + %t69 = getelementptr inbounds %S.gen.Gen, ptr %t67, i32 0, i32 15 + %t70 = load i64, ptr %a2 + %t71 = load { ptr, i64, i64 }, ptr %t69 + %t72 = extractvalue { ptr, i64, i64 } %t71, 1 + %t73 = icmp uge i64 %t70, %t72 + br i1 %t73, label %range3720, label %inrange3721 +range3720: + call void @finch_panic_index(ptr @.str.2274, i64 1533, i64 %t70, i64 %t72) + unreachable +inrange3721: + %t74 = extractvalue { ptr, i64, i64 } %t71, 0 + %t75 = getelementptr inbounds %S.gen.StructDef, ptr %t74, i64 %t70 + %t76 = getelementptr inbounds %S.gen.StructDef, ptr %t75, i32 0, i32 6 + %t77 = load { ptr, i64, i64 }, ptr %t76 + %t78 = load ptr, ptr %a1 + %t79 = icmp eq ptr %t78, null + br i1 %t79, label %panic3722, label %ok3723 +panic3722: + call void @finch_panic(ptr @.str.2275, i64 1533, ptr @.str.2276) + unreachable +ok3723: + %t80 = getelementptr inbounds %S.gen.Gen, ptr %t78, i32 0, i32 17 + store { ptr, i64, i64 } %t77, ptr %a81 + call void @finch.copy.arr_str(ptr %a82, ptr %a81) + %t83 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t83, ptr %t80 + %t84 = load ptr, ptr %a1 + %t85 = icmp eq ptr %t84, null + br i1 %t85, label %panic3724, label %ok3725 +panic3724: + call void @finch_panic(ptr @.str.2277, i64 1534, ptr @.str.2278) + unreachable +ok3725: + %t86 = getelementptr inbounds %S.gen.Gen, ptr %t84, i32 0, i32 15 + %t87 = load i64, ptr %a2 + %t88 = load { ptr, i64, i64 }, ptr %t86 + %t89 = extractvalue { ptr, i64, i64 } %t88, 1 + %t90 = icmp uge i64 %t87, %t89 + br i1 %t90, label %range3726, label %inrange3727 +range3726: + call void @finch_panic_index(ptr @.str.2279, i64 1534, i64 %t87, i64 %t89) + unreachable +inrange3727: + %t91 = extractvalue { ptr, i64, i64 } %t88, 0 + %t92 = getelementptr inbounds %S.gen.StructDef, ptr %t91, i64 %t87 + %t93 = getelementptr inbounds %S.gen.StructDef, ptr %t92, i32 0, i32 7 + %t94 = load { ptr, i64, i64 }, ptr %t93 + %t95 = load ptr, ptr %a1 + %t96 = icmp eq ptr %t95, null + br i1 %t96, label %panic3728, label %ok3729 +panic3728: + call void @finch_panic(ptr @.str.2280, i64 1534, ptr @.str.2281) + unreachable +ok3729: + %t97 = getelementptr inbounds %S.gen.Gen, ptr %t95, i32 0, i32 18 + store { ptr, i64, i64 } %t94, ptr %a98 + call void @finch.copy.arr_S_ast_Type(ptr %a99, ptr %a98) + %t100 = load { ptr, i64, i64 }, ptr %a99 + store { ptr, i64, i64 } %t100, ptr %t97 + %t101 = load ptr, ptr %a1 + %t102 = icmp eq ptr %t101, null + br i1 %t102, label %panic3730, label %ok3731 +panic3730: + call void @finch_panic(ptr @.str.2283, i64 1535, ptr @.str.2284) + unreachable +ok3731: + %t103 = getelementptr inbounds %S.gen.Gen, ptr %t101, i32 0, i32 15 + %t104 = load i64, ptr %a2 + %t105 = load { ptr, i64, i64 }, ptr %t103 + %t106 = extractvalue { ptr, i64, i64 } %t105, 1 + %t107 = icmp uge i64 %t104, %t106 + br i1 %t107, label %range3732, label %inrange3733 +range3732: + call void @finch_panic_index(ptr @.str.2285, i64 1535, i64 %t104, i64 %t106) + unreachable +inrange3733: + %t108 = extractvalue { ptr, i64, i64 } %t105, 0 + %t109 = getelementptr inbounds %S.gen.StructDef, ptr %t108, i64 %t104 + %t110 = getelementptr inbounds %S.gen.StructDef, ptr %t109, i32 0, i32 1 + %t111 = load { ptr, i64, i64 }, ptr %t110 + store { ptr, i64, i64 } { ptr @.str.2282, i64 17, i64 0 }, ptr %a113 + store { ptr, i64, i64 } %t111, ptr %a114 + call void @finch_str_concat(ptr %a112, ptr %a113, ptr %a114) + %t115 = load { ptr, i64, i64 }, ptr %a112 + store { ptr, i64, i64 } %t115, ptr %a117 + store { ptr, i64, i64 } { ptr @.str.2286, i64 1, i64 0 }, ptr %a118 + call void @finch_str_concat(ptr %a116, ptr %a117, ptr %a118) + %t119 = load { ptr, i64, i64 }, ptr %a116 + %t120 = load ptr, ptr %a1 + %t121 = icmp eq ptr %t120, null + br i1 %t121, label %panic3734, label %ok3735 +panic3734: + call void @finch_panic(ptr @.str.2287, i64 1535, ptr @.str.2288) + unreachable +ok3735: + %t122 = getelementptr inbounds %S.gen.Gen, ptr %t120, i32 0, i32 19 + store { ptr, i64, i64 } %t119, ptr %t122 + %t123 = load ptr, ptr %a1 + %t124 = load i64, ptr %a2 + call void @finch.gen.resolveStructBody(ptr %t123, i64 %t124) + %t125 = load { ptr, i64, i64 }, ptr %a50 + %t126 = load ptr, ptr %a1 + %t127 = icmp eq ptr %t126, null + br i1 %t127, label %panic3736, label %ok3737 +panic3736: + call void @finch_panic(ptr @.str.2289, i64 1537, ptr @.str.2290) + unreachable +ok3737: + %t128 = getelementptr inbounds %S.gen.Gen, ptr %t126, i32 0, i32 17 + store { ptr, i64, i64 } %t125, ptr %a129 + call void @finch.copy.arr_str(ptr %a130, ptr %a129) + %t131 = load { ptr, i64, i64 }, ptr %a130 + store { ptr, i64, i64 } %t131, ptr %t128 + %t132 = load { ptr, i64, i64 }, ptr %a58 + %t133 = load ptr, ptr %a1 + %t134 = icmp eq ptr %t133, null + br i1 %t134, label %panic3738, label %ok3739 +panic3738: + call void @finch_panic(ptr @.str.2291, i64 1538, ptr @.str.2292) + unreachable +ok3739: + %t135 = getelementptr inbounds %S.gen.Gen, ptr %t133, i32 0, i32 18 + store { ptr, i64, i64 } %t132, ptr %a136 + call void @finch.copy.arr_S_ast_Type(ptr %a137, ptr %a136) + %t138 = load { ptr, i64, i64 }, ptr %a137 + store { ptr, i64, i64 } %t138, ptr %t135 + %t139 = load { ptr, i64, i64 }, ptr %a66 + %t140 = load ptr, ptr %a1 + %t141 = icmp eq ptr %t140, null + br i1 %t141, label %panic3740, label %ok3741 +panic3740: + call void @finch_panic(ptr @.str.2293, i64 1539, ptr @.str.2294) + unreachable +ok3741: + %t142 = getelementptr inbounds %S.gen.Gen, ptr %t140, i32 0, i32 19 + store { ptr, i64, i64 } %t139, ptr %a143 + call void @finch_str_copy(ptr %a144, ptr %a143) + %t145 = load { ptr, i64, i64 }, ptr %a144 + store { ptr, i64, i64 } %t145, ptr %t142 + ret void +} + +define internal void @finch.gen.resolveStructBody(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a40 = alloca %S.ast.Node, align 16 + %a41 = alloca %S.ast.Node, align 16 + %a43 = alloca %S.ast.Node, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca i1, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca i64, align 16 + %a134 = alloca %S.ast.Node, align 16 + %a140 = alloca %S.ast.Type, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca %S.ast.Type, align 16 + %a214 = alloca %S.ast.Type, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a301 = alloca { ptr, i64, i64 }, align 16 + %a302 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a309 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic3742, label %ok3743 +panic3742: + call void @finch_panic(ptr @.str.2295, i64 1543, ptr @.str.2296) + unreachable +ok3743: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 0 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic3744, label %ok3745 +panic3744: + call void @finch_panic(ptr @.str.2297, i64 1543, ptr @.str.2298) + unreachable +ok3745: + %t8 = getelementptr inbounds %S.gen.Gen, ptr %t6, i32 0, i32 15 + %t9 = load i64, ptr %a2 + %t10 = load { ptr, i64, i64 }, ptr %t8 + %t11 = extractvalue { ptr, i64, i64 } %t10, 1 + %t12 = icmp uge i64 %t9, %t11 + br i1 %t12, label %range3746, label %inrange3747 +range3746: + call void @finch_panic_index(ptr @.str.2299, i64 1543, i64 %t9, i64 %t11) + unreachable +inrange3747: + %t13 = extractvalue { ptr, i64, i64 } %t10, 0 + %t14 = getelementptr inbounds %S.gen.StructDef, ptr %t13, i64 %t9 + %t15 = getelementptr inbounds %S.gen.StructDef, ptr %t14, i32 0, i32 13 + %t16 = load i64, ptr %t15 + %t17 = load { ptr, i64, i64 }, ptr %t5 + %t18 = extractvalue { ptr, i64, i64 } %t17, 1 + %t19 = icmp uge i64 %t16, %t18 + br i1 %t19, label %range3748, label %inrange3749 +range3748: + call void @finch_panic_index(ptr @.str.2300, i64 1543, i64 %t16, i64 %t18) + unreachable +inrange3749: + %t20 = extractvalue { ptr, i64, i64 } %t17, 0 + %t21 = getelementptr inbounds %S.ast.Program, ptr %t20, i64 %t16 + %t22 = getelementptr inbounds %S.ast.Program, ptr %t21, i32 0, i32 6 + %t23 = load ptr, ptr %a1 + %t24 = icmp eq ptr %t23, null + br i1 %t24, label %panic3750, label %ok3751 +panic3750: + call void @finch_panic(ptr @.str.2301, i64 1543, ptr @.str.2302) + unreachable +ok3751: + %t25 = getelementptr inbounds %S.gen.Gen, ptr %t23, i32 0, i32 15 + %t26 = load i64, ptr %a2 + %t27 = load { ptr, i64, i64 }, ptr %t25 + %t28 = extractvalue { ptr, i64, i64 } %t27, 1 + %t29 = icmp uge i64 %t26, %t28 + br i1 %t29, label %range3752, label %inrange3753 +range3752: + call void @finch_panic_index(ptr @.str.2303, i64 1543, i64 %t26, i64 %t28) + unreachable +inrange3753: + %t30 = extractvalue { ptr, i64, i64 } %t27, 0 + %t31 = getelementptr inbounds %S.gen.StructDef, ptr %t30, i64 %t26 + %t32 = getelementptr inbounds %S.gen.StructDef, ptr %t31, i32 0, i32 14 + %t33 = load i64, ptr %t32 + %t34 = load { ptr, i64, i64 }, ptr %t22 + %t35 = extractvalue { ptr, i64, i64 } %t34, 1 + %t36 = icmp uge i64 %t33, %t35 + br i1 %t36, label %range3754, label %inrange3755 +range3754: + call void @finch_panic_index(ptr @.str.2304, i64 1543, i64 %t33, i64 %t35) + unreachable +inrange3755: + %t37 = extractvalue { ptr, i64, i64 } %t34, 0 + %t38 = getelementptr inbounds %S.ast.Node, ptr %t37, i64 %t33 + %t39 = load %S.ast.Node, ptr %t38 + store %S.ast.Node %t39, ptr %a40 + call void @finch.copy.S_ast_Node(ptr %a41, ptr %a40) + %t42 = load %S.ast.Node, ptr %a41 + store %S.ast.Node %t42, ptr %a43 + %t44 = load ptr, ptr %a1 + %t45 = icmp eq ptr %t44, null + br i1 %t45, label %panic3756, label %ok3757 +panic3756: + call void @finch_panic(ptr @.str.2305, i64 1544, ptr @.str.2306) + unreachable +ok3757: + %t46 = getelementptr inbounds %S.gen.Gen, ptr %t44, i32 0, i32 15 + %t47 = load i64, ptr %a2 + %t48 = load { ptr, i64, i64 }, ptr %t46 + %t49 = extractvalue { ptr, i64, i64 } %t48, 1 + %t50 = icmp uge i64 %t47, %t49 + br i1 %t50, label %range3758, label %inrange3759 +range3758: + call void @finch_panic_index(ptr @.str.2307, i64 1544, i64 %t47, i64 %t49) + unreachable +inrange3759: + %t51 = extractvalue { ptr, i64, i64 } %t48, 0 + %t52 = getelementptr inbounds %S.gen.StructDef, ptr %t51, i64 %t47 + %t53 = getelementptr inbounds %S.gen.StructDef, ptr %t52, i32 0, i32 15 + %t54 = load i64, ptr %t53 + %t55 = icmp eq i64 %t54, 1 + br i1 %t55, label %then3760, label %endif3762 +then3760: + %t56 = load ptr, ptr %a1 + %t57 = load %S.ast.Node, ptr %a43 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a43, i32 0, i32 1 + %t59 = load { ptr, i64, i64 }, ptr %t58 + store { ptr, i64, i64 } { ptr @.str.2308, i64 11, i64 0 }, ptr %a61 + store { ptr, i64, i64 } %t59, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + store { ptr, i64, i64 } %t63, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.2309, i64 26, i64 0 }, ptr %a66 + call void @finch_str_concat(ptr %a64, ptr %a65, ptr %a66) + %t67 = load { ptr, i64, i64 }, ptr %a64 + %t68 = getelementptr inbounds %S.ast.Node, ptr %a43, i32 0, i32 1 + %t69 = load { ptr, i64, i64 }, ptr %t68 + store { ptr, i64, i64 } %t67, ptr %a71 + store { ptr, i64, i64 } %t69, ptr %a72 + call void @finch_str_concat(ptr %a70, ptr %a71, ptr %a72) + %t73 = load { ptr, i64, i64 }, ptr %a70 + store { ptr, i64, i64 } %t73, ptr %a75 + store { ptr, i64, i64 } { ptr @.str.2310, i64 7, i64 0 }, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + %t78 = getelementptr inbounds %S.ast.Node, ptr %a43, i32 0, i32 1 + %t79 = load { ptr, i64, i64 }, ptr %t78 + store { ptr, i64, i64 } %t77, ptr %a81 + store { ptr, i64, i64 } %t79, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t83, ptr %a85 + store { ptr, i64, i64 } { ptr @.str.2311, i64 15, i64 0 }, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + call void @finch.gen.fail(ptr %t56, %S.ast.Node %t57, { ptr, i64, i64 } %t87) + br label %endif3762 +endif3762: + %t88 = load ptr, ptr %a1 + %t89 = icmp eq ptr %t88, null + br i1 %t89, label %panic3763, label %ok3764 +panic3763: + call void @finch_panic(ptr @.str.2312, i64 1547, ptr @.str.2313) + unreachable +ok3764: + %t90 = getelementptr inbounds %S.gen.Gen, ptr %t88, i32 0, i32 15 + %t91 = load i64, ptr %a2 + %t92 = load { ptr, i64, i64 }, ptr %t90 + %t93 = extractvalue { ptr, i64, i64 } %t92, 1 + %t94 = icmp uge i64 %t91, %t93 + br i1 %t94, label %range3765, label %inrange3766 +range3765: + call void @finch_panic_index(ptr @.str.2314, i64 1547, i64 %t91, i64 %t93) + unreachable +inrange3766: + %t95 = extractvalue { ptr, i64, i64 } %t92, 0 + %t96 = getelementptr inbounds %S.gen.StructDef, ptr %t95, i64 %t91 + %t97 = getelementptr inbounds %S.gen.StructDef, ptr %t96, i32 0, i32 15 + store i64 1, ptr %t97 + %t98 = load ptr, ptr %a1 + %t99 = icmp eq ptr %t98, null + br i1 %t99, label %panic3767, label %ok3768 +panic3767: + call void @finch_panic(ptr @.str.2315, i64 1548, ptr @.str.2316) + unreachable +ok3768: + %t100 = getelementptr inbounds %S.gen.Gen, ptr %t98, i32 0, i32 13 + %t101 = load { ptr, i64, i64 }, ptr %t100 + store { ptr, i64, i64 } %t101, ptr %a102 + call void @finch_str_copy(ptr %a103, ptr %a102) + %t104 = load { ptr, i64, i64 }, ptr %a103 + store { ptr, i64, i64 } %t104, ptr %a105 + %t106 = load ptr, ptr %a1 + %t107 = icmp eq ptr %t106, null + br i1 %t107, label %panic3769, label %ok3770 +panic3769: + call void @finch_panic(ptr @.str.2317, i64 1549, ptr @.str.2318) + unreachable +ok3770: + %t108 = getelementptr inbounds %S.gen.Gen, ptr %t106, i32 0, i32 15 + %t109 = load i64, ptr %a2 + %t110 = load { ptr, i64, i64 }, ptr %t108 + %t111 = extractvalue { ptr, i64, i64 } %t110, 1 + %t112 = icmp uge i64 %t109, %t111 + br i1 %t112, label %range3771, label %inrange3772 +range3771: + call void @finch_panic_index(ptr @.str.2319, i64 1549, i64 %t109, i64 %t111) + unreachable +inrange3772: + %t113 = extractvalue { ptr, i64, i64 } %t110, 0 + %t114 = getelementptr inbounds %S.gen.StructDef, ptr %t113, i64 %t109 + %t115 = getelementptr inbounds %S.gen.StructDef, ptr %t114, i32 0, i32 0 + %t116 = load { ptr, i64, i64 }, ptr %t115 + %t117 = load ptr, ptr %a1 + %t118 = icmp eq ptr %t117, null + br i1 %t118, label %panic3773, label %ok3774 +panic3773: + call void @finch_panic(ptr @.str.2320, i64 1549, ptr @.str.2321) + unreachable +ok3774: + %t119 = getelementptr inbounds %S.gen.Gen, ptr %t117, i32 0, i32 13 + store { ptr, i64, i64 } %t116, ptr %a120 + call void @finch_str_copy(ptr %a121, ptr %a120) + %t122 = load { ptr, i64, i64 }, ptr %a121 + store { ptr, i64, i64 } %t122, ptr %t119 + store i1 false, ptr %a123 + store { ptr, i64, i64 } zeroinitializer, ptr %a124 + %t125 = getelementptr inbounds %S.ast.Node, ptr %a43, i32 0, i32 9 + store i64 0, ptr %a126 + br label %each.cond3775 +each.cond3775: + %t127 = getelementptr inbounds { ptr, i64, i64 }, ptr %t125, i32 0, i32 1 + %t128 = load i64, ptr %t127 + %t129 = load i64, ptr %a126 + %t130 = icmp slt i64 %t129, %t128 + br i1 %t130, label %each.body3776, label %each.end3778 +each.body3776: + %t131 = load ptr, ptr %t125 + %t132 = getelementptr inbounds %S.ast.Node, ptr %t131, i64 %t129 + %t133 = load %S.ast.Node, ptr %t132 + store %S.ast.Node %t133, ptr %a134 + %t135 = load ptr, ptr %a1 + %t136 = getelementptr inbounds %S.ast.Node, ptr %a134, i32 0, i32 5 + %t137 = load %S.ast.Type, ptr %t136 + %t138 = load %S.ast.Node, ptr %a134 + %t139 = call %S.ast.Type @finch.gen.resolve(ptr %t135, %S.ast.Type %t137, %S.ast.Node %t138) + store %S.ast.Type %t139, ptr %a140 + %t141 = getelementptr inbounds %S.ast.Type, ptr %a140, i32 0, i32 0 + %t142 = load { ptr, i64, i64 }, ptr %t141 + store { ptr, i64, i64 } %t142, ptr %a143 + store { ptr, i64, i64 } { ptr @.str.2322, i64 6, i64 0 }, ptr %a144 + %t145 = call i32 @finch_str_eq(ptr %a143, ptr %a144) + %t146 = icmp ne i32 %t145, 0 + br i1 %t146, label %then3779, label %endif3781 +then3779: + %t147 = load ptr, ptr %a1 + %t148 = load ptr, ptr %a1 + %t149 = getelementptr inbounds %S.ast.Type, ptr %a140, i32 0, i32 3 + %t150 = load { ptr, i64, i64 }, ptr %t149 + %t151 = getelementptr inbounds %S.ast.Type, ptr %a140, i32 0, i32 2 + %t152 = load { ptr, i64, i64 }, ptr %t151 + %t153 = call i64 @finch.gen.findStruct(ptr %t148, { ptr, i64, i64 } %t150, { ptr, i64, i64 } %t152) + call void @finch.gen.resolveStruct(ptr %t147, i64 %t153) + br label %endif3781 +endif3781: + %t154 = load ptr, ptr %a1 + %t155 = icmp eq ptr %t154, null + br i1 %t155, label %panic3782, label %ok3783 +panic3782: + call void @finch_panic(ptr @.str.2323, i64 1557, ptr @.str.2324) + unreachable +ok3783: + %t156 = getelementptr inbounds %S.gen.Gen, ptr %t154, i32 0, i32 15 + %t157 = load i64, ptr %a2 + %t158 = load { ptr, i64, i64 }, ptr %t156 + %t159 = extractvalue { ptr, i64, i64 } %t158, 1 + %t160 = icmp uge i64 %t157, %t159 + br i1 %t160, label %range3784, label %inrange3785 +range3784: + call void @finch_panic_index(ptr @.str.2325, i64 1557, i64 %t157, i64 %t159) + unreachable +inrange3785: + %t161 = extractvalue { ptr, i64, i64 } %t158, 0 + %t162 = getelementptr inbounds %S.gen.StructDef, ptr %t161, i64 %t157 + %t163 = getelementptr inbounds %S.gen.StructDef, ptr %t162, i32 0, i32 3 + %t164 = getelementptr inbounds { ptr, i64, i64 }, ptr %t163, i32 0, i32 1 + %t165 = load ptr, ptr %a1 + %t166 = icmp eq ptr %t165, null + br i1 %t166, label %panic3786, label %ok3787 +panic3786: + call void @finch_panic(ptr @.str.2326, i64 1557, ptr @.str.2327) + unreachable +ok3787: + %t167 = getelementptr inbounds %S.gen.Gen, ptr %t165, i32 0, i32 15 + %t168 = load i64, ptr %a2 + %t169 = load { ptr, i64, i64 }, ptr %t167 + %t170 = extractvalue { ptr, i64, i64 } %t169, 1 + %t171 = icmp uge i64 %t168, %t170 + br i1 %t171, label %range3788, label %inrange3789 +range3788: + call void @finch_panic_index(ptr @.str.2328, i64 1557, i64 %t168, i64 %t170) + unreachable +inrange3789: + %t172 = extractvalue { ptr, i64, i64 } %t169, 0 + %t173 = getelementptr inbounds %S.gen.StructDef, ptr %t172, i64 %t168 + %t174 = getelementptr inbounds %S.gen.StructDef, ptr %t173, i32 0, i32 11 + %t175 = getelementptr inbounds { ptr, i64, i64 }, ptr %t174, i32 0, i32 1 + %t176 = load i64, ptr %t175 + %t177 = load i64, ptr %t164 + %t178 = add i64 %t177, 1 + call void @finch_arr_reserve(ptr %t163, i64 %t178, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t179 = load ptr, ptr %t163 + %t180 = getelementptr inbounds i64, ptr %t179, i64 %t177 + store i64 %t176, ptr %t180 + store i64 %t178, ptr %t164 + %t181 = load ptr, ptr %a1 + %t182 = icmp eq ptr %t181, null + br i1 %t182, label %panic3790, label %ok3791 +panic3790: + call void @finch_panic(ptr @.str.2329, i64 1558, ptr @.str.2330) + unreachable +ok3791: + %t183 = getelementptr inbounds %S.gen.Gen, ptr %t181, i32 0, i32 15 + %t184 = load i64, ptr %a2 + %t185 = load { ptr, i64, i64 }, ptr %t183 + %t186 = extractvalue { ptr, i64, i64 } %t185, 1 + %t187 = icmp uge i64 %t184, %t186 + br i1 %t187, label %range3792, label %inrange3793 +range3792: + call void @finch_panic_index(ptr @.str.2331, i64 1558, i64 %t184, i64 %t186) + unreachable +inrange3793: + %t188 = extractvalue { ptr, i64, i64 } %t185, 0 + %t189 = getelementptr inbounds %S.gen.StructDef, ptr %t188, i64 %t184 + %t190 = getelementptr inbounds %S.gen.StructDef, ptr %t189, i32 0, i32 11 + %t191 = getelementptr inbounds { ptr, i64, i64 }, ptr %t190, i32 0, i32 1 + %t192 = getelementptr inbounds %S.ast.Node, ptr %a134, i32 0, i32 1 + %t193 = load { ptr, i64, i64 }, ptr %t192 + store { ptr, i64, i64 } %t193, ptr %a194 + call void @finch_str_copy(ptr %a195, ptr %a194) + %t196 = load { ptr, i64, i64 }, ptr %a195 + %t197 = load i64, ptr %t191 + %t198 = add i64 %t197, 1 + call void @finch_arr_reserve(ptr %t190, i64 %t198, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t199 = load ptr, ptr %t190 + %t200 = getelementptr inbounds { ptr, i64, i64 }, ptr %t199, i64 %t197 + store { ptr, i64, i64 } %t196, ptr %t200 + store i64 %t198, ptr %t191 + %t201 = load ptr, ptr %a1 + %t202 = icmp eq ptr %t201, null + br i1 %t202, label %panic3794, label %ok3795 +panic3794: + call void @finch_panic(ptr @.str.2332, i64 1559, ptr @.str.2333) + unreachable +ok3795: + %t203 = getelementptr inbounds %S.gen.Gen, ptr %t201, i32 0, i32 15 + %t204 = load i64, ptr %a2 + %t205 = load { ptr, i64, i64 }, ptr %t203 + %t206 = extractvalue { ptr, i64, i64 } %t205, 1 + %t207 = icmp uge i64 %t204, %t206 + br i1 %t207, label %range3796, label %inrange3797 +range3796: + call void @finch_panic_index(ptr @.str.2334, i64 1559, i64 %t204, i64 %t206) + unreachable +inrange3797: + %t208 = extractvalue { ptr, i64, i64 } %t205, 0 + %t209 = getelementptr inbounds %S.gen.StructDef, ptr %t208, i64 %t204 + %t210 = getelementptr inbounds %S.gen.StructDef, ptr %t209, i32 0, i32 12 + %t211 = getelementptr inbounds { ptr, i64, i64 }, ptr %t210, i32 0, i32 1 + %t212 = load %S.ast.Type, ptr %a140 + store %S.ast.Type %t212, ptr %a213 + call void @finch.copy.S_ast_Type(ptr %a214, ptr %a213) + %t215 = load %S.ast.Type, ptr %a214 + %t216 = load i64, ptr %t211 + %t217 = add i64 %t216, 1 + call void @finch_arr_reserve(ptr %t210, i64 %t217, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t218 = load ptr, ptr %t210 + %t219 = getelementptr inbounds %S.ast.Type, ptr %t218, i64 %t216 + store %S.ast.Type %t215, ptr %t219 + store i64 %t217, ptr %t211 + %t220 = load ptr, ptr %a1 + %t221 = load %S.ast.Type, ptr %a140 + %t222 = call i1 @finch.gen.owning(ptr %t220, %S.ast.Type %t221) + br i1 %t222, label %then3798, label %endif3800 +then3798: + store i1 true, ptr %a123 + br label %endif3800 +endif3800: + %t223 = getelementptr inbounds { ptr, i64, i64 }, ptr %a124, i32 0, i32 1 + %t224 = load ptr, ptr %a1 + %t225 = load %S.ast.Type, ptr %a140 + %t226 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t224, %S.ast.Type %t225) + %t227 = load i64, ptr %t223 + %t228 = add i64 %t227, 1 + call void @finch_arr_reserve(ptr %a124, i64 %t228, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t229 = load ptr, ptr %a124 + %t230 = getelementptr inbounds { ptr, i64, i64 }, ptr %t229, i64 %t227 + store { ptr, i64, i64 } %t226, ptr %t230 + store i64 %t228, ptr %t223 + br label %each.step3777 +each.step3777: + %t231 = load i64, ptr %a126 + %t232 = add i64 %t231, 1 + store i64 %t232, ptr %a126 + br label %each.cond3775 +each.end3778: + %t233 = load i1, ptr %a123 + %t234 = load ptr, ptr %a1 + %t235 = icmp eq ptr %t234, null + br i1 %t235, label %panic3801, label %ok3802 +panic3801: + call void @finch_panic(ptr @.str.2335, i64 1565, ptr @.str.2336) + unreachable +ok3802: + %t236 = getelementptr inbounds %S.gen.Gen, ptr %t234, i32 0, i32 15 + %t237 = load i64, ptr %a2 + %t238 = load { ptr, i64, i64 }, ptr %t236 + %t239 = extractvalue { ptr, i64, i64 } %t238, 1 + %t240 = icmp uge i64 %t237, %t239 + br i1 %t240, label %range3803, label %inrange3804 +range3803: + call void @finch_panic_index(ptr @.str.2337, i64 1565, i64 %t237, i64 %t239) + unreachable +inrange3804: + %t241 = extractvalue { ptr, i64, i64 } %t238, 0 + %t242 = getelementptr inbounds %S.gen.StructDef, ptr %t241, i64 %t237 + %t243 = getelementptr inbounds %S.gen.StructDef, ptr %t242, i32 0, i32 16 + store i1 %t233, ptr %t243 + %t244 = load { ptr, i64, i64 }, ptr %a105 + %t245 = load ptr, ptr %a1 + %t246 = icmp eq ptr %t245, null + br i1 %t246, label %panic3805, label %ok3806 +panic3805: + call void @finch_panic(ptr @.str.2338, i64 1566, ptr @.str.2339) + unreachable +ok3806: + %t247 = getelementptr inbounds %S.gen.Gen, ptr %t245, i32 0, i32 13 + store { ptr, i64, i64 } %t244, ptr %a248 + call void @finch_str_copy(ptr %a249, ptr %a248) + %t250 = load { ptr, i64, i64 }, ptr %a249 + store { ptr, i64, i64 } %t250, ptr %t247 + %t251 = load ptr, ptr %a1 + %t252 = icmp eq ptr %t251, null + br i1 %t252, label %panic3807, label %ok3808 +panic3807: + call void @finch_panic(ptr @.str.2340, i64 1567, ptr @.str.2341) + unreachable +ok3808: + %t253 = getelementptr inbounds %S.gen.Gen, ptr %t251, i32 0, i32 15 + %t254 = load i64, ptr %a2 + %t255 = load { ptr, i64, i64 }, ptr %t253 + %t256 = extractvalue { ptr, i64, i64 } %t255, 1 + %t257 = icmp uge i64 %t254, %t256 + br i1 %t257, label %range3809, label %inrange3810 +range3809: + call void @finch_panic_index(ptr @.str.2342, i64 1567, i64 %t254, i64 %t256) + unreachable +inrange3810: + %t258 = extractvalue { ptr, i64, i64 } %t255, 0 + %t259 = getelementptr inbounds %S.gen.StructDef, ptr %t258, i64 %t254 + %t260 = getelementptr inbounds %S.gen.StructDef, ptr %t259, i32 0, i32 15 + store i64 2, ptr %t260 + %t261 = load ptr, ptr %a1 + %t262 = icmp eq ptr %t261, null + br i1 %t262, label %panic3811, label %ok3812 +panic3811: + call void @finch_panic(ptr @.str.2343, i64 1568, ptr @.str.2344) + unreachable +ok3812: + %t263 = getelementptr inbounds %S.gen.Gen, ptr %t261, i32 0, i32 2 + %t264 = getelementptr inbounds { ptr, i64, i64 }, ptr %t263, i32 0, i32 1 + %t265 = load ptr, ptr %a1 + %t266 = icmp eq ptr %t265, null + br i1 %t266, label %panic3813, label %ok3814 +panic3813: + call void @finch_panic(ptr @.str.2346, i64 1568, ptr @.str.2347) + unreachable +ok3814: + %t267 = getelementptr inbounds %S.gen.Gen, ptr %t265, i32 0, i32 15 + %t268 = load i64, ptr %a2 + %t269 = load { ptr, i64, i64 }, ptr %t267 + %t270 = extractvalue { ptr, i64, i64 } %t269, 1 + %t271 = icmp uge i64 %t268, %t270 + br i1 %t271, label %range3815, label %inrange3816 +range3815: + call void @finch_panic_index(ptr @.str.2348, i64 1568, i64 %t268, i64 %t270) + unreachable +inrange3816: + %t272 = extractvalue { ptr, i64, i64 } %t269, 0 + %t273 = getelementptr inbounds %S.gen.StructDef, ptr %t272, i64 %t268 + %t274 = getelementptr inbounds %S.gen.StructDef, ptr %t273, i32 0, i32 0 + %t275 = load { ptr, i64, i64 }, ptr %t274 + %t276 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t275) + store { ptr, i64, i64 } { ptr @.str.2345, i64 3, i64 0 }, ptr %a278 + store { ptr, i64, i64 } %t276, ptr %a279 + call void @finch_str_concat(ptr %a277, ptr %a278, ptr %a279) + %t280 = load { ptr, i64, i64 }, ptr %a277 + store { ptr, i64, i64 } %t280, ptr %a282 + store { ptr, i64, i64 } { ptr @.str.2349, i64 1, i64 0 }, ptr %a283 + call void @finch_str_concat(ptr %a281, ptr %a282, ptr %a283) + %t284 = load { ptr, i64, i64 }, ptr %a281 + %t285 = load ptr, ptr %a1 + %t286 = icmp eq ptr %t285, null + br i1 %t286, label %panic3817, label %ok3818 +panic3817: + call void @finch_panic(ptr @.str.2350, i64 1568, ptr @.str.2351) + unreachable +ok3818: + %t287 = getelementptr inbounds %S.gen.Gen, ptr %t285, i32 0, i32 15 + %t288 = load i64, ptr %a2 + %t289 = load { ptr, i64, i64 }, ptr %t287 + %t290 = extractvalue { ptr, i64, i64 } %t289, 1 + %t291 = icmp uge i64 %t288, %t290 + br i1 %t291, label %range3819, label %inrange3820 +range3819: + call void @finch_panic_index(ptr @.str.2352, i64 1568, i64 %t288, i64 %t290) + unreachable +inrange3820: + %t292 = extractvalue { ptr, i64, i64 } %t289, 0 + %t293 = getelementptr inbounds %S.gen.StructDef, ptr %t292, i64 %t288 + %t294 = getelementptr inbounds %S.gen.StructDef, ptr %t293, i32 0, i32 1 + %t295 = load { ptr, i64, i64 }, ptr %t294 + %t296 = call { ptr, i64, i64 } @finch.gen.mangle({ ptr, i64, i64 } %t295) + store { ptr, i64, i64 } %t284, ptr %a298 + store { ptr, i64, i64 } %t296, ptr %a299 + call void @finch_str_concat(ptr %a297, ptr %a298, ptr %a299) + %t300 = load { ptr, i64, i64 }, ptr %a297 + store { ptr, i64, i64 } %t300, ptr %a302 + store { ptr, i64, i64 } { ptr @.str.2353, i64 10, i64 0 }, ptr %a303 + call void @finch_str_concat(ptr %a301, ptr %a302, ptr %a303) + %t304 = load { ptr, i64, i64 }, ptr %a301 + %t305 = getelementptr inbounds { ptr, i64, i64 }, ptr %a124, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2354, i64 2, i64 0 }, ptr %a306 + call void @finch_str_join(ptr %a307, ptr %a124, ptr %a306) + %t308 = load { ptr, i64, i64 }, ptr %a307 + store { ptr, i64, i64 } %t304, ptr %a310 + store { ptr, i64, i64 } %t308, ptr %a311 + call void @finch_str_concat(ptr %a309, ptr %a310, ptr %a311) + %t312 = load { ptr, i64, i64 }, ptr %a309 + store { ptr, i64, i64 } %t312, ptr %a314 + store { ptr, i64, i64 } { ptr @.str.2355, i64 2, i64 0 }, ptr %a315 + call void @finch_str_concat(ptr %a313, ptr %a314, ptr %a315) + %t316 = load { ptr, i64, i64 }, ptr %a313 + %t317 = load i64, ptr %t264 + %t318 = add i64 %t317, 1 + call void @finch_arr_reserve(ptr %t263, i64 %t318, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t319 = load ptr, ptr %t263 + %t320 = getelementptr inbounds { ptr, i64, i64 }, ptr %t319, i64 %t317 + store { ptr, i64, i64 } %t316, ptr %t320 + store i64 %t318, ptr %t264 + ret void +} + +define internal i64 @finch.gen.md(ptr %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic3821, label %ok3822 +panic3821: + call void @finch_panic(ptr @.str.2356, i64 1577, ptr @.str.2357) + unreachable +ok3822: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 29 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i32 0, i32 1 + %t7 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t7, ptr %a8 + call void @finch_str_copy(ptr %a9, ptr %a8) + %t10 = load { ptr, i64, i64 }, ptr %a9 + %t11 = load i64, ptr %t6 + %t12 = add i64 %t11, 1 + call void @finch_arr_reserve(ptr %t5, i64 %t12, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t13 = load ptr, ptr %t5 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 %t11 + store { ptr, i64, i64 } %t10, ptr %t14 + store i64 %t12, ptr %t6 + %t15 = load ptr, ptr %a1 + %t16 = icmp eq ptr %t15, null + br i1 %t16, label %panic3823, label %ok3824 +panic3823: + call void @finch_panic(ptr @.str.2358, i64 1578, ptr @.str.2359) + unreachable +ok3824: + %t17 = getelementptr inbounds %S.gen.Gen, ptr %t15, i32 0, i32 29 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t17, i32 0, i32 1 + %t19 = load i64, ptr %t18 + %t20 = sub i64 %t19, 1 + ret i64 %t20 +} + +define internal { ptr, i64, i64 } @finch.gen.mdRef(i64 %p0) { +entry: + %a1 = alloca i64, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + store i64 %p0, ptr %a1 + %t2 = load i64, ptr %a1 + %t3 = icmp slt i64 %t2, 0 + br i1 %t3, label %then3825, label %endif3827 +then3825: + ret { ptr, i64, i64 } { ptr @.str.2360, i64 4, i64 0 } +endif3827: + %t4 = load i64, ptr %a1 + call void @finch_str_from_int(ptr %a5, i64 %t4) + %t6 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.2361, i64 1, i64 0 }, ptr %a8 + store { ptr, i64, i64 } %t6, ptr %a9 + call void @finch_str_concat(ptr %a7, ptr %a8, ptr %a9) + %t10 = load { ptr, i64, i64 }, ptr %a7 + ret { ptr, i64, i64 } %t10 +} + +define internal i64 @finch.gen.alignUp(i64 %p0, i64 %p1) { +entry: + %a1 = alloca i64, align 16 + %a2 = alloca i64, align 16 + store i64 %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load i64, ptr %a2 + %t4 = icmp sle i64 %t3, 1 + br i1 %t4, label %then3828, label %endif3830 +then3828: + %t5 = load i64, ptr %a1 + ret i64 %t5 +endif3830: + %t6 = load i64, ptr %a1 + %t7 = load i64, ptr %a2 + %t8 = add i64 %t6, %t7 + %t9 = sub i64 %t8, 1 + %t10 = load i64, ptr %a2 + %t11 = icmp eq i64 %t10, 0 + br i1 %t11, label %panic3831, label %ok3832 +panic3831: + call void @finch_panic(ptr @.str.2362, i64 1597, ptr @.str.2363) + unreachable +ok3832: + %t12 = sdiv i64 %t9, %t10 + %t13 = load i64, ptr %a2 + %t14 = mul i64 %t12, %t13 + ret i64 %t14 +} + +define internal %S.gen.SizeAlign @finch.gen.sizeAlign(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca %S.gen.SizeAlign, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca %S.gen.StructDef, align 16 + %a137 = alloca %S.gen.StructDef, align 16 + %a139 = alloca %S.gen.StructDef, align 16 + %a148 = alloca i64, align 16 + %a149 = alloca i64, align 16 + %a151 = alloca i64, align 16 + %a159 = alloca %S.ast.Type, align 16 + %a163 = alloca %S.gen.SizeAlign, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch_str_copy(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.2364, i64 4, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br label %logic.from3833 +logic.from3833: + br i1 %t13, label %logic.end3835, label %logic.rhs3834 +logic.rhs3834: + %t14 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.2365, i64 4, i64 0 }, ptr %a16 + %t17 = call i32 @finch_str_eq(ptr %a15, ptr %a16) + %t18 = icmp ne i32 %t17, 0 + br label %logic.rend3836 +logic.rend3836: + br label %logic.end3835 +logic.end3835: + %t19 = phi i1 [ true, %logic.from3833 ], [ %t18, %logic.rend3836 ] + br label %logic.from3837 +logic.from3837: + br i1 %t19, label %logic.end3839, label %logic.rhs3838 +logic.rhs3838: + %t20 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t20, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.2366, i64 2, i64 0 }, ptr %a22 + %t23 = call i32 @finch_str_eq(ptr %a21, ptr %a22) + %t24 = icmp ne i32 %t23, 0 + br label %logic.rend3840 +logic.rend3840: + br label %logic.end3839 +logic.end3839: + %t25 = phi i1 [ true, %logic.from3837 ], [ %t24, %logic.rend3840 ] + br label %logic.from3841 +logic.from3841: + br i1 %t25, label %logic.end3843, label %logic.rhs3842 +logic.rhs3842: + %t26 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t26, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.2367, i64 2, i64 0 }, ptr %a28 + %t29 = call i32 @finch_str_eq(ptr %a27, ptr %a28) + %t30 = icmp ne i32 %t29, 0 + br label %logic.rend3844 +logic.rend3844: + br label %logic.end3843 +logic.end3843: + %t31 = phi i1 [ true, %logic.from3841 ], [ %t30, %logic.rend3844 ] + br i1 %t31, label %then3845, label %endif3847 +then3845: + %t32 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 1, 0 + %t33 = insertvalue %S.gen.SizeAlign %t32, i64 1, 1 + ret %S.gen.SizeAlign %t33 +endif3847: + %t34 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t34, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.2368, i64 3, i64 0 }, ptr %a36 + %t37 = call i32 @finch_str_eq(ptr %a35, ptr %a36) + %t38 = icmp ne i32 %t37, 0 + br label %logic.from3848 +logic.from3848: + br i1 %t38, label %logic.end3850, label %logic.rhs3849 +logic.rhs3849: + %t39 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t39, ptr %a40 + store { ptr, i64, i64 } { ptr @.str.2369, i64 3, i64 0 }, ptr %a41 + %t42 = call i32 @finch_str_eq(ptr %a40, ptr %a41) + %t43 = icmp ne i32 %t42, 0 + br label %logic.rend3851 +logic.rend3851: + br label %logic.end3850 +logic.end3850: + %t44 = phi i1 [ true, %logic.from3848 ], [ %t43, %logic.rend3851 ] + br i1 %t44, label %then3852, label %endif3854 +then3852: + %t45 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 2, 0 + %t46 = insertvalue %S.gen.SizeAlign %t45, i64 2, 1 + ret %S.gen.SizeAlign %t46 +endif3854: + %t47 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t47, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.2370, i64 3, i64 0 }, ptr %a49 + %t50 = call i32 @finch_str_eq(ptr %a48, ptr %a49) + %t51 = icmp ne i32 %t50, 0 + br label %logic.from3855 +logic.from3855: + br i1 %t51, label %logic.end3857, label %logic.rhs3856 +logic.rhs3856: + %t52 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t52, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.2371, i64 3, i64 0 }, ptr %a54 + %t55 = call i32 @finch_str_eq(ptr %a53, ptr %a54) + %t56 = icmp ne i32 %t55, 0 + br label %logic.rend3858 +logic.rend3858: + br label %logic.end3857 +logic.end3857: + %t57 = phi i1 [ true, %logic.from3855 ], [ %t56, %logic.rend3858 ] + br label %logic.from3859 +logic.from3859: + br i1 %t57, label %logic.end3861, label %logic.rhs3860 +logic.rhs3860: + %t58 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t58, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.2372, i64 3, i64 0 }, ptr %a60 + %t61 = call i32 @finch_str_eq(ptr %a59, ptr %a60) + %t62 = icmp ne i32 %t61, 0 + br label %logic.rend3862 +logic.rend3862: + br label %logic.end3861 +logic.end3861: + %t63 = phi i1 [ true, %logic.from3859 ], [ %t62, %logic.rend3862 ] + br label %logic.from3863 +logic.from3863: + br i1 %t63, label %logic.end3865, label %logic.rhs3864 +logic.rhs3864: + %t64 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t64, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.2373, i64 4, i64 0 }, ptr %a66 + %t67 = call i32 @finch_str_eq(ptr %a65, ptr %a66) + %t68 = icmp ne i32 %t67, 0 + br label %logic.rend3866 +logic.rend3866: + br label %logic.end3865 +logic.end3865: + %t69 = phi i1 [ true, %logic.from3863 ], [ %t68, %logic.rend3866 ] + br i1 %t69, label %then3867, label %endif3869 +then3867: + %t70 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 4, 0 + %t71 = insertvalue %S.gen.SizeAlign %t70, i64 4, 1 + ret %S.gen.SizeAlign %t71 +endif3869: + %t72 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t72, ptr %a73 + store { ptr, i64, i64 } { ptr @.str.2374, i64 3, i64 0 }, ptr %a74 + %t75 = call i32 @finch_str_eq(ptr %a73, ptr %a74) + %t76 = icmp ne i32 %t75, 0 + br label %logic.from3870 +logic.from3870: + br i1 %t76, label %logic.end3872, label %logic.rhs3871 +logic.rhs3871: + %t77 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t77, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.2375, i64 5, i64 0 }, ptr %a79 + %t80 = call i32 @finch_str_eq(ptr %a78, ptr %a79) + %t81 = icmp ne i32 %t80, 0 + br label %logic.rend3873 +logic.rend3873: + br label %logic.end3872 +logic.end3872: + %t82 = phi i1 [ true, %logic.from3870 ], [ %t81, %logic.rend3873 ] + br i1 %t82, label %then3874, label %endif3876 +then3874: + %t83 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 24, 0 + %t84 = insertvalue %S.gen.SizeAlign %t83, i64 8, 1 + ret %S.gen.SizeAlign %t84 +endif3876: + %t85 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t85, ptr %a86 + store { ptr, i64, i64 } { ptr @.str.2376, i64 3, i64 0 }, ptr %a87 + %t88 = call i32 @finch_str_eq(ptr %a86, ptr %a87) + %t89 = icmp ne i32 %t88, 0 + br i1 %t89, label %then3877, label %endif3879 +then3877: + %t90 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 56, 0 + %t91 = insertvalue %S.gen.SizeAlign %t90, i64 8, 1 + ret %S.gen.SizeAlign %t91 +endif3879: + %t92 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t92, ptr %a93 + store { ptr, i64, i64 } { ptr @.str.2377, i64 5, i64 0 }, ptr %a94 + %t95 = call i32 @finch_str_eq(ptr %a93, ptr %a94) + %t96 = icmp ne i32 %t95, 0 + br i1 %t96, label %then3880, label %endif3882 +then3880: + %t97 = load ptr, ptr %a1 + %t98 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t99 = load { ptr, i64, i64 }, ptr %t98 + %t100 = extractvalue { ptr, i64, i64 } %t99, 1 + %t101 = icmp uge i64 0, %t100 + br i1 %t101, label %range3883, label %inrange3884 +range3883: + call void @finch_panic_index(ptr @.str.2378, i64 1619, i64 0, i64 %t100) + unreachable +inrange3884: + %t102 = extractvalue { ptr, i64, i64 } %t99, 0 + %t103 = getelementptr inbounds %S.ast.Type, ptr %t102, i64 0 + %t104 = load %S.ast.Type, ptr %t103 + %t105 = call %S.gen.SizeAlign @finch.gen.sizeAlign(ptr %t97, %S.ast.Type %t104) + store %S.gen.SizeAlign %t105, ptr %a106 + %t107 = getelementptr inbounds %S.gen.SizeAlign, ptr %a106, i32 0, i32 0 + %t108 = load i64, ptr %t107 + %t109 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t110 = load i64, ptr %t109 + %t111 = mul i64 %t108, %t110 + %t112 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 %t111, 0 + %t113 = getelementptr inbounds %S.gen.SizeAlign, ptr %a106, i32 0, i32 1 + %t114 = load i64, ptr %t113 + %t115 = insertvalue %S.gen.SizeAlign %t112, i64 %t114, 1 + ret %S.gen.SizeAlign %t115 +endif3882: + %t116 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t116, ptr %a117 + store { ptr, i64, i64 } { ptr @.str.2379, i64 6, i64 0 }, ptr %a118 + %t119 = call i32 @finch_str_eq(ptr %a117, ptr %a118) + %t120 = icmp ne i32 %t119, 0 + br i1 %t120, label %then3885, label %endif3887 +then3885: + %t121 = load ptr, ptr %a1 + %t122 = icmp eq ptr %t121, null + br i1 %t122, label %panic3888, label %ok3889 +panic3888: + call void @finch_panic(ptr @.str.2380, i64 1623, ptr @.str.2381) + unreachable +ok3889: + %t123 = getelementptr inbounds %S.gen.Gen, ptr %t121, i32 0, i32 15 + %t124 = load ptr, ptr %a1 + %t125 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t126 = load { ptr, i64, i64 }, ptr %t125 + %t127 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t128 = load { ptr, i64, i64 }, ptr %t127 + %t129 = call i64 @finch.gen.findStruct(ptr %t124, { ptr, i64, i64 } %t126, { ptr, i64, i64 } %t128) + %t130 = load { ptr, i64, i64 }, ptr %t123 + %t131 = extractvalue { ptr, i64, i64 } %t130, 1 + %t132 = icmp uge i64 %t129, %t131 + br i1 %t132, label %range3890, label %inrange3891 +range3890: + call void @finch_panic_index(ptr @.str.2382, i64 1623, i64 %t129, i64 %t131) + unreachable +inrange3891: + %t133 = extractvalue { ptr, i64, i64 } %t130, 0 + %t134 = getelementptr inbounds %S.gen.StructDef, ptr %t133, i64 %t129 + %t135 = load %S.gen.StructDef, ptr %t134 + store %S.gen.StructDef %t135, ptr %a136 + call void @finch.copy.S_gen_StructDef(ptr %a137, ptr %a136) + %t138 = load %S.gen.StructDef, ptr %a137 + store %S.gen.StructDef %t138, ptr %a139 + %t140 = getelementptr inbounds %S.gen.StructDef, ptr %a139, i32 0, i32 2 + %t141 = load i1, ptr %t140 + br i1 %t141, label %then3892, label %endif3894 +then3892: + %t142 = getelementptr inbounds %S.gen.StructDef, ptr %a139, i32 0, i32 9 + %t143 = load i64, ptr %t142 + %t144 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 %t143, 0 + %t145 = getelementptr inbounds %S.gen.StructDef, ptr %a139, i32 0, i32 10 + %t146 = load i64, ptr %t145 + %t147 = insertvalue %S.gen.SizeAlign %t144, i64 %t146, 1 + ret %S.gen.SizeAlign %t147 +endif3894: + store i64 0, ptr %a148 + store i64 1, ptr %a149 + %t150 = getelementptr inbounds %S.gen.StructDef, ptr %a139, i32 0, i32 12 + store i64 0, ptr %a151 + br label %each.cond3895 +each.cond3895: + %t152 = getelementptr inbounds { ptr, i64, i64 }, ptr %t150, i32 0, i32 1 + %t153 = load i64, ptr %t152 + %t154 = load i64, ptr %a151 + %t155 = icmp slt i64 %t154, %t153 + br i1 %t155, label %each.body3896, label %each.end3898 +each.body3896: + %t156 = load ptr, ptr %t150 + %t157 = getelementptr inbounds %S.ast.Type, ptr %t156, i64 %t154 + %t158 = load %S.ast.Type, ptr %t157 + store %S.ast.Type %t158, ptr %a159 + %t160 = load ptr, ptr %a1 + %t161 = load %S.ast.Type, ptr %a159 + %t162 = call %S.gen.SizeAlign @finch.gen.sizeAlign(ptr %t160, %S.ast.Type %t161) + store %S.gen.SizeAlign %t162, ptr %a163 + %t164 = load i64, ptr %a148 + %t165 = getelementptr inbounds %S.gen.SizeAlign, ptr %a163, i32 0, i32 1 + %t166 = load i64, ptr %t165 + %t167 = call i64 @finch.gen.alignUp(i64 %t164, i64 %t166) + %t168 = getelementptr inbounds %S.gen.SizeAlign, ptr %a163, i32 0, i32 0 + %t169 = load i64, ptr %t168 + %t170 = add i64 %t167, %t169 + store i64 %t170, ptr %a148 + %t171 = getelementptr inbounds %S.gen.SizeAlign, ptr %a163, i32 0, i32 1 + %t172 = load i64, ptr %t171 + %t173 = load i64, ptr %a149 + %t174 = icmp sgt i64 %t172, %t173 + br i1 %t174, label %then3899, label %endif3901 +then3899: + %t175 = getelementptr inbounds %S.gen.SizeAlign, ptr %a163, i32 0, i32 1 + %t176 = load i64, ptr %t175 + store i64 %t176, ptr %a149 + br label %endif3901 +endif3901: + br label %each.step3897 +each.step3897: + %t177 = load i64, ptr %a151 + %t178 = add i64 %t177, 1 + store i64 %t178, ptr %a151 + br label %each.cond3895 +each.end3898: + %t179 = load i64, ptr %a148 + %t180 = load i64, ptr %a149 + %t181 = call i64 @finch.gen.alignUp(i64 %t179, i64 %t180) + %t182 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 %t181, 0 + %t183 = load i64, ptr %a149 + %t184 = insertvalue %S.gen.SizeAlign %t182, i64 %t183, 1 + ret %S.gen.SizeAlign %t184 +endif3887: + %t185 = insertvalue %S.gen.SizeAlign zeroinitializer, i64 8, 0 + %t186 = insertvalue %S.gen.SizeAlign %t185, i64 8, 1 + ret %S.gen.SizeAlign %t186 +} + +define internal { ptr, i64, i64 } @finch.gen.fieldOffsets(ptr %p0, %S.gen.StructDef %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.StructDef, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca i64, align 16 + %a13 = alloca i64, align 16 + %a21 = alloca %S.ast.Type, align 16 + %a25 = alloca %S.gen.SizeAlign, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.gen.StructDef %p1, ptr %a2 + %t3 = getelementptr inbounds %S.gen.StructDef, ptr %a2, i32 0, i32 2 + %t4 = load i1, ptr %t3 + br i1 %t4, label %then3902, label %endif3904 +then3902: + %t5 = getelementptr inbounds %S.gen.StructDef, ptr %a2, i32 0, i32 4 + %t6 = load { ptr, i64, i64 }, ptr %t5 + store { ptr, i64, i64 } %t6, ptr %a7 + call void @finch.copy.arr_int(ptr %a8, ptr %a7) + %t9 = load { ptr, i64, i64 }, ptr %a8 + ret { ptr, i64, i64 } %t9 +endif3904: + store { ptr, i64, i64 } zeroinitializer, ptr %a10 + store i64 0, ptr %a11 + %t12 = getelementptr inbounds %S.gen.StructDef, ptr %a2, i32 0, i32 12 + store i64 0, ptr %a13 + br label %each.cond3905 +each.cond3905: + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t12, i32 0, i32 1 + %t15 = load i64, ptr %t14 + %t16 = load i64, ptr %a13 + %t17 = icmp slt i64 %t16, %t15 + br i1 %t17, label %each.body3906, label %each.end3908 +each.body3906: + %t18 = load ptr, ptr %t12 + %t19 = getelementptr inbounds %S.ast.Type, ptr %t18, i64 %t16 + %t20 = load %S.ast.Type, ptr %t19 + store %S.ast.Type %t20, ptr %a21 + %t22 = load ptr, ptr %a1 + %t23 = load %S.ast.Type, ptr %a21 + %t24 = call %S.gen.SizeAlign @finch.gen.sizeAlign(ptr %t22, %S.ast.Type %t23) + store %S.gen.SizeAlign %t24, ptr %a25 + %t26 = load i64, ptr %a11 + %t27 = getelementptr inbounds %S.gen.SizeAlign, ptr %a25, i32 0, i32 1 + %t28 = load i64, ptr %t27 + %t29 = call i64 @finch.gen.alignUp(i64 %t26, i64 %t28) + store i64 %t29, ptr %a11 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %a10, i32 0, i32 1 + %t31 = load i64, ptr %a11 + %t32 = load i64, ptr %t30 + %t33 = add i64 %t32, 1 + call void @finch_arr_reserve(ptr %a10, i64 %t33, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t34 = load ptr, ptr %a10 + %t35 = getelementptr inbounds i64, ptr %t34, i64 %t32 + store i64 %t31, ptr %t35 + store i64 %t33, ptr %t30 + %t36 = getelementptr inbounds %S.gen.SizeAlign, ptr %a25, i32 0, i32 0 + %t37 = load i64, ptr %t36 + %t38 = load i64, ptr %a11 + %t39 = add i64 %t38, %t37 + store i64 %t39, ptr %a11 + br label %each.step3907 +each.step3907: + %t40 = load i64, ptr %a13 + %t41 = add i64 %t40, 1 + store i64 %t41, ptr %a13 + br label %each.cond3905 +each.end3908: + %t42 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t42, ptr %a43 + call void @finch.copy.arr_int(ptr %a44, ptr %a43) + %t45 = load { ptr, i64, i64 }, ptr %a44 + ret { ptr, i64, i64 } %t45 +} + +define internal i64 @finch.gen.dbgMember(ptr %p0, { ptr, i64, i64 } %p1, i64 %p2, i64 %p3, i64 %p4, i64 %p5, i64 %p6, i64 %p7) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca i64, align 16 + %a4 = alloca i64, align 16 + %a5 = alloca i64, align 16 + %a6 = alloca i64, align 16 + %a7 = alloca i64, align 16 + %a8 = alloca i64, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store i64 %p2, ptr %a3 + store i64 %p3, ptr %a4 + store i64 %p4, ptr %a5 + store i64 %p5, ptr %a6 + store i64 %p6, ptr %a7 + store i64 %p7, ptr %a8 + %t9 = load ptr, ptr %a1 + %t10 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.2383, i64 42, i64 0 }, ptr %a12 + store { ptr, i64, i64 } %t10, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t14, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.2384, i64 11, i64 0 }, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + %t19 = load i64, ptr %a3 + call void @finch_str_from_int(ptr %a20, i64 %t19) + %t21 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t18, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.2385, i64 9, i64 0 }, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + %t30 = load i64, ptr %a4 + call void @finch_str_from_int(ptr %a31, i64 %t30) + %t32 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t29, ptr %a34 + store { ptr, i64, i64 } %t32, ptr %a35 + call void @finch_str_concat(ptr %a33, ptr %a34, ptr %a35) + %t36 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } %t36, ptr %a38 + store { ptr, i64, i64 } { ptr @.str.2386, i64 8, i64 0 }, ptr %a39 + call void @finch_str_concat(ptr %a37, ptr %a38, ptr %a39) + %t40 = load { ptr, i64, i64 }, ptr %a37 + %t41 = load i64, ptr %a5 + call void @finch_str_from_int(ptr %a42, i64 %t41) + %t43 = load { ptr, i64, i64 }, ptr %a42 + store { ptr, i64, i64 } %t40, ptr %a45 + store { ptr, i64, i64 } %t43, ptr %a46 + call void @finch_str_concat(ptr %a44, ptr %a45, ptr %a46) + %t47 = load { ptr, i64, i64 }, ptr %a44 + store { ptr, i64, i64 } %t47, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.2387, i64 12, i64 0 }, ptr %a50 + call void @finch_str_concat(ptr %a48, ptr %a49, ptr %a50) + %t51 = load { ptr, i64, i64 }, ptr %a48 + %t52 = load i64, ptr %a6 + %t53 = call { ptr, i64, i64 } @finch.gen.mdRef(i64 %t52) + store { ptr, i64, i64 } %t51, ptr %a55 + store { ptr, i64, i64 } %t53, ptr %a56 + call void @finch_str_concat(ptr %a54, ptr %a55, ptr %a56) + %t57 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t57, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.2388, i64 8, i64 0 }, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + %t62 = load i64, ptr %a7 + call void @finch_str_from_int(ptr %a63, i64 %t62) + %t64 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t61, ptr %a66 + store { ptr, i64, i64 } %t64, ptr %a67 + call void @finch_str_concat(ptr %a65, ptr %a66, ptr %a67) + %t68 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t68, ptr %a70 + store { ptr, i64, i64 } { ptr @.str.2389, i64 10, i64 0 }, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + %t73 = load i64, ptr %a8 + call void @finch_str_from_int(ptr %a74, i64 %t73) + %t75 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t72, ptr %a77 + store { ptr, i64, i64 } %t75, ptr %a78 + call void @finch_str_concat(ptr %a76, ptr %a77, ptr %a78) + %t79 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t79, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.2390, i64 1, i64 0 }, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + %t84 = call i64 @finch.gen.md(ptr %t9, { ptr, i64, i64 } %t83) + ret i64 %t84 +} + +define internal i64 @finch.gen.basicType(ptr %p0, { ptr, i64, i64 } %p1, i64 %p2, { ptr, i64, i64 } %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca i64, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store i64 %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.2391, i64 20, i64 0 }, ptr %a8 + store { ptr, i64, i64 } %t6, ptr %a9 + call void @finch_str_concat(ptr %a7, ptr %a8, ptr %a9) + %t10 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t10, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.2392, i64 9, i64 0 }, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + %t15 = load i64, ptr %a3 + call void @finch_str_from_int(ptr %a16, i64 %t15) + %t17 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t14, ptr %a19 + store { ptr, i64, i64 } %t17, ptr %a20 + call void @finch_str_concat(ptr %a18, ptr %a19, ptr %a20) + %t21 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.2393, i64 12, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + %t26 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t25, ptr %a28 + store { ptr, i64, i64 } %t26, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t30, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.2394, i64 1, i64 0 }, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = call i64 @finch.gen.md(ptr %t5, { ptr, i64, i64 } %t34) + ret i64 %t35 +} + +define internal i64 @finch.gen.diType(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca i64, align 16 + %a58 = alloca i64, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca %S.gen.EnumDef, align 16 + %a126 = alloca %S.gen.EnumDef, align 16 + %a128 = alloca %S.gen.EnumDef, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca i64, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca i32, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca i64, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca %S.gen.SizeAlign, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca i64, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a336 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a339 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a344 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca %S.ast.Type, align 16 + %a369 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca %S.ast.Type, align 16 + %a381 = alloca %S.ast.Type, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a389 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a397 = alloca i64, align 16 + %a401 = alloca i64, align 16 + %a407 = alloca i64, align 16 + %a413 = alloca i64, align 16 + %a419 = alloca i64, align 16 + %a422 = alloca { ptr, i64, i64 }, align 16 + %a423 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca { ptr, i64, i64 }, align 16 + %a433 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + %a438 = alloca { ptr, i64, i64 }, align 16 + %a439 = alloca { ptr, i64, i64 }, align 16 + %a442 = alloca { ptr, i64, i64 }, align 16 + %a444 = alloca { ptr, i64, i64 }, align 16 + %a445 = alloca { ptr, i64, i64 }, align 16 + %a446 = alloca { ptr, i64, i64 }, align 16 + %a448 = alloca { ptr, i64, i64 }, align 16 + %a449 = alloca { ptr, i64, i64 }, align 16 + %a450 = alloca { ptr, i64, i64 }, align 16 + %a453 = alloca { ptr, i64, i64 }, align 16 + %a455 = alloca { ptr, i64, i64 }, align 16 + %a456 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a459 = alloca { ptr, i64, i64 }, align 16 + %a460 = alloca { ptr, i64, i64 }, align 16 + %a461 = alloca { ptr, i64, i64 }, align 16 + %a464 = alloca { ptr, i64, i64 }, align 16 + %a466 = alloca { ptr, i64, i64 }, align 16 + %a467 = alloca { ptr, i64, i64 }, align 16 + %a468 = alloca { ptr, i64, i64 }, align 16 + %a470 = alloca { ptr, i64, i64 }, align 16 + %a471 = alloca { ptr, i64, i64 }, align 16 + %a472 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca { ptr, i64, i64 }, align 16 + %a485 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca i64, align 16 + %a494 = alloca i64, align 16 + %a507 = alloca { ptr, i64, i64 }, align 16 + %a508 = alloca { ptr, i64, i64 }, align 16 + %a509 = alloca i64, align 16 + %a513 = alloca i64, align 16 + %a535 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a538 = alloca { ptr, i64, i64 }, align 16 + %a539 = alloca { ptr, i64, i64 }, align 16 + %a549 = alloca { ptr, i64, i64 }, align 16 + %a550 = alloca { ptr, i64, i64 }, align 16 + %a551 = alloca { ptr, i64, i64 }, align 16 + %a553 = alloca { ptr, i64, i64 }, align 16 + %a554 = alloca { ptr, i64, i64 }, align 16 + %a555 = alloca { ptr, i64, i64 }, align 16 + %a558 = alloca { ptr, i64, i64 }, align 16 + %a560 = alloca { ptr, i64, i64 }, align 16 + %a561 = alloca { ptr, i64, i64 }, align 16 + %a562 = alloca { ptr, i64, i64 }, align 16 + %a564 = alloca { ptr, i64, i64 }, align 16 + %a565 = alloca { ptr, i64, i64 }, align 16 + %a566 = alloca { ptr, i64, i64 }, align 16 + %a569 = alloca { ptr, i64, i64 }, align 16 + %a570 = alloca { ptr, i64, i64 }, align 16 + %a572 = alloca { ptr, i64, i64 }, align 16 + %a573 = alloca { ptr, i64, i64 }, align 16 + %a574 = alloca { ptr, i64, i64 }, align 16 + %a576 = alloca { ptr, i64, i64 }, align 16 + %a577 = alloca { ptr, i64, i64 }, align 16 + %a578 = alloca { ptr, i64, i64 }, align 16 + %a590 = alloca { ptr, i64, i64 }, align 16 + %a591 = alloca { ptr, i64, i64 }, align 16 + %a609 = alloca %S.gen.StructDef, align 16 + %a610 = alloca %S.gen.StructDef, align 16 + %a612 = alloca %S.gen.StructDef, align 16 + %a616 = alloca { ptr, i64, i64 }, align 16 + %a620 = alloca %S.gen.SizeAlign, align 16 + %a621 = alloca { ptr, i64, i64 }, align 16 + %a625 = alloca i64, align 16 + %a638 = alloca %S.gen.SizeAlign, align 16 + %a673 = alloca { ptr, i64, i64 }, align 16 + %a675 = alloca { ptr, i64, i64 }, align 16 + %a676 = alloca { ptr, i64, i64 }, align 16 + %a677 = alloca { ptr, i64, i64 }, align 16 + %a687 = alloca { ptr, i64, i64 }, align 16 + %a688 = alloca { ptr, i64, i64 }, align 16 + %a689 = alloca { ptr, i64, i64 }, align 16 + %a691 = alloca { ptr, i64, i64 }, align 16 + %a692 = alloca { ptr, i64, i64 }, align 16 + %a693 = alloca { ptr, i64, i64 }, align 16 + %a696 = alloca { ptr, i64, i64 }, align 16 + %a698 = alloca { ptr, i64, i64 }, align 16 + %a699 = alloca { ptr, i64, i64 }, align 16 + %a700 = alloca { ptr, i64, i64 }, align 16 + %a702 = alloca { ptr, i64, i64 }, align 16 + %a703 = alloca { ptr, i64, i64 }, align 16 + %a704 = alloca { ptr, i64, i64 }, align 16 + %a709 = alloca { ptr, i64, i64 }, align 16 + %a711 = alloca { ptr, i64, i64 }, align 16 + %a712 = alloca { ptr, i64, i64 }, align 16 + %a713 = alloca { ptr, i64, i64 }, align 16 + %a715 = alloca { ptr, i64, i64 }, align 16 + %a716 = alloca { ptr, i64, i64 }, align 16 + %a717 = alloca { ptr, i64, i64 }, align 16 + %a720 = alloca { ptr, i64, i64 }, align 16 + %a721 = alloca { ptr, i64, i64 }, align 16 + %a723 = alloca { ptr, i64, i64 }, align 16 + %a724 = alloca { ptr, i64, i64 }, align 16 + %a725 = alloca { ptr, i64, i64 }, align 16 + %a727 = alloca { ptr, i64, i64 }, align 16 + %a728 = alloca { ptr, i64, i64 }, align 16 + %a729 = alloca { ptr, i64, i64 }, align 16 + %a741 = alloca { ptr, i64, i64 }, align 16 + %a742 = alloca { ptr, i64, i64 }, align 16 + %a743 = alloca { ptr, i64, i64 }, align 16 + %a745 = alloca { ptr, i64, i64 }, align 16 + %a746 = alloca { ptr, i64, i64 }, align 16 + %a747 = alloca { ptr, i64, i64 }, align 16 + %a764 = alloca { ptr, i64, i64 }, align 16 + %a765 = alloca i32, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch_str_copy(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.2395, i64 4, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br label %logic.from3909 +logic.from3909: + br i1 %t13, label %logic.end3911, label %logic.rhs3910 +logic.rhs3910: + %t14 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.2396, i64 4, i64 0 }, ptr %a16 + %t17 = call i32 @finch_str_eq(ptr %a15, ptr %a16) + %t18 = icmp ne i32 %t17, 0 + br label %logic.rend3912 +logic.rend3912: + br label %logic.end3911 +logic.end3911: + %t19 = phi i1 [ true, %logic.from3909 ], [ %t18, %logic.rend3912 ] + br i1 %t19, label %then3913, label %endif3915 +then3913: + ret i64 -1 +endif3915: + %t20 = load %S.ast.Type, ptr %a2 + %t21 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t20) + store { ptr, i64, i64 } { ptr @.str.2397, i64 2, i64 0 }, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a26 + %t27 = load ptr, ptr %a1 + %t28 = icmp eq ptr %t27, null + br i1 %t28, label %panic3916, label %ok3917 +panic3916: + call void @finch_panic(ptr @.str.2398, i64 1672, ptr @.str.2399) + unreachable +ok3917: + %t29 = getelementptr inbounds %S.gen.Gen, ptr %t27, i32 0, i32 30 + %t30 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t30, ptr %a31 + %t32 = call i64 @finch_map_find(ptr %t29, ptr %a31, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i64 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t33 = icmp sge i64 %t32, 0 + br i1 %t33, label %then3918, label %endif3920 +then3918: + %t34 = load ptr, ptr %a1 + %t35 = icmp eq ptr %t34, null + br i1 %t35, label %panic3921, label %ok3922 +panic3921: + call void @finch_panic(ptr @.str.2400, i64 1673, ptr @.str.2401) + unreachable +ok3922: + %t36 = getelementptr inbounds %S.gen.Gen, ptr %t34, i32 0, i32 30 + %t37 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t37, ptr %a38 + %t39 = call i64 @finch_map_find(ptr %t36, ptr %a38, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i64 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t40 = icmp slt i64 %t39, 0 + br i1 %t40, label %map.missing3923, label %map.found3924 +map.missing3923: + store { ptr, i64, i64 } zeroinitializer, ptr %a41 + store { ptr, i64, i64 } %t37, ptr %a42 + call void @finch_buf_str(ptr %a41, ptr %a42, i32 1) + call void @finch_map_missing(ptr @.str.2402, i64 1673, ptr %a41) + unreachable +map.found3924: + %t43 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t36, i32 0, i32 0 + %t44 = load ptr, ptr %t43 + %t45 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t44, i64 %t39 + %t46 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t45, i32 0, i32 2 + %t47 = load i64, ptr %t46 + ret i64 %t47 +endif3920: + store i64 -1, ptr %a48 + %t49 = load ptr, ptr %a1 + %t50 = icmp eq ptr %t49, null + br i1 %t50, label %panic3925, label %ok3926 +panic3925: + call void @finch_panic(ptr @.str.2403, i64 1676, ptr @.str.2404) + unreachable +ok3926: + %t51 = getelementptr inbounds %S.gen.Gen, ptr %t49, i32 0, i32 31 + %t52 = load { ptr, i64, i64 }, ptr %t51 + %t53 = extractvalue { ptr, i64, i64 } %t52, 1 + %t54 = icmp uge i64 0, %t53 + br i1 %t54, label %range3927, label %inrange3928 +range3927: + call void @finch_panic_index(ptr @.str.2405, i64 1676, i64 0, i64 %t53) + unreachable +inrange3928: + %t55 = extractvalue { ptr, i64, i64 } %t52, 0 + %t56 = getelementptr inbounds i64, ptr %t55, i64 0 + %t57 = load i64, ptr %t56 + store i64 %t57, ptr %a58 + %t59 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t59, ptr %a60 + store { ptr, i64, i64 } { ptr @.str.2406, i64 4, i64 0 }, ptr %a61 + %t62 = call i32 @finch_str_eq(ptr %a60, ptr %a61) + %t63 = icmp ne i32 %t62, 0 + br i1 %t63, label %then3929, label %else3930 +then3929: + %t64 = load ptr, ptr %a1 + %t65 = call i64 @finch.gen.basicType(ptr %t64, { ptr, i64, i64 } { ptr @.str.2407, i64 4, i64 0 }, i64 8, { ptr, i64, i64 } { ptr @.str.2408, i64 14, i64 0 }) + store i64 %t65, ptr %a48 + br label %endif3931 +else3930: + %t66 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t66, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.2409, i64 4, i64 0 }, ptr %a68 + %t69 = call i32 @finch_str_eq(ptr %a67, ptr %a68) + %t70 = icmp ne i32 %t69, 0 + br i1 %t70, label %then3932, label %else3933 +then3932: + %t71 = load ptr, ptr %a1 + %t72 = call i64 @finch.gen.basicType(ptr %t71, { ptr, i64, i64 } { ptr @.str.2410, i64 4, i64 0 }, i64 8, { ptr, i64, i64 } { ptr @.str.2411, i64 18, i64 0 }) + store i64 %t72, ptr %a48 + br label %endif3934 +else3933: + %t73 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t73, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.2412, i64 3, i64 0 }, ptr %a75 + %t76 = call i32 @finch_str_eq(ptr %a74, ptr %a75) + %t77 = icmp ne i32 %t76, 0 + br i1 %t77, label %then3935, label %else3936 +then3935: + %t78 = load ptr, ptr %a1 + %t79 = call i64 @finch.gen.basicType(ptr %t78, { ptr, i64, i64 } { ptr @.str.2413, i64 3, i64 0 }, i64 64, { ptr, i64, i64 } { ptr @.str.2414, i64 13, i64 0 }) + store i64 %t79, ptr %a48 + br label %endif3937 +else3936: + %t80 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t80, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.2415, i64 5, i64 0 }, ptr %a82 + %t83 = call i32 @finch_str_eq(ptr %a81, ptr %a82) + %t84 = icmp ne i32 %t83, 0 + br i1 %t84, label %then3938, label %else3939 +then3938: + %t85 = load ptr, ptr %a1 + %t86 = call i64 @finch.gen.basicType(ptr %t85, { ptr, i64, i64 } { ptr @.str.2416, i64 5, i64 0 }, i64 64, { ptr, i64, i64 } { ptr @.str.2417, i64 12, i64 0 }) + store i64 %t86, ptr %a48 + br label %endif3940 +else3939: + %t87 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t87, ptr %a88 + store { ptr, i64, i64 } { ptr @.str.2418, i64 3, i64 0 }, ptr %a89 + %t90 = call i32 @finch_str_eq(ptr %a88, ptr %a89) + %t91 = icmp ne i32 %t90, 0 + br i1 %t91, label %then3941, label %else3942 +then3941: + %t92 = load ptr, ptr %a1 + %t93 = call i64 @finch.gen.basicType(ptr %t92, { ptr, i64, i64 } { ptr @.str.2419, i64 3, i64 0 }, i64 32, { ptr, i64, i64 } { ptr @.str.2420, i64 12, i64 0 }) + store i64 %t93, ptr %a48 + br label %endif3943 +else3942: + %t94 = load %S.ast.Type, ptr %a2 + %t95 = call i1 @finch.gen.isInt(%S.ast.Type %t94) + br i1 %t95, label %then3944, label %else3945 +then3944: + store { ptr, i64, i64 } { ptr @.str.2421, i64 15, i64 0 }, ptr %a96 + %t97 = load %S.ast.Type, ptr %a2 + %t98 = call i1 @finch.gen.isSigned(%S.ast.Type %t97) + br i1 %t98, label %then3947, label %endif3949 +then3947: + store { ptr, i64, i64 } { ptr @.str.2422, i64 13, i64 0 }, ptr %a96 + br label %endif3949 +endif3949: + %t99 = load ptr, ptr %a1 + %t100 = load { ptr, i64, i64 }, ptr %a8 + %t101 = load %S.ast.Type, ptr %a2 + %t102 = call i64 @finch.gen.bitsOf(%S.ast.Type %t101) + %t103 = load { ptr, i64, i64 }, ptr %a96 + %t104 = call i64 @finch.gen.basicType(ptr %t99, { ptr, i64, i64 } %t100, i64 %t102, { ptr, i64, i64 } %t103) + store i64 %t104, ptr %a48 + br label %endif3946 +else3945: + %t105 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t105, ptr %a106 + store { ptr, i64, i64 } { ptr @.str.2423, i64 4, i64 0 }, ptr %a107 + %t108 = call i32 @finch_str_eq(ptr %a106, ptr %a107) + %t109 = icmp ne i32 %t108, 0 + br i1 %t109, label %then3950, label %else3951 +then3950: + %t110 = load ptr, ptr %a1 + %t111 = icmp eq ptr %t110, null + br i1 %t111, label %panic3953, label %ok3954 +panic3953: + call void @finch_panic(ptr @.str.2424, i64 1694, ptr @.str.2425) + unreachable +ok3954: + %t112 = getelementptr inbounds %S.gen.Gen, ptr %t110, i32 0, i32 20 + %t113 = load ptr, ptr %a1 + %t114 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t115 = load { ptr, i64, i64 }, ptr %t114 + %t116 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t117 = load { ptr, i64, i64 }, ptr %t116 + %t118 = call i64 @finch.gen.findEnum(ptr %t113, { ptr, i64, i64 } %t115, { ptr, i64, i64 } %t117) + %t119 = load { ptr, i64, i64 }, ptr %t112 + %t120 = extractvalue { ptr, i64, i64 } %t119, 1 + %t121 = icmp uge i64 %t118, %t120 + br i1 %t121, label %range3955, label %inrange3956 +range3955: + call void @finch_panic_index(ptr @.str.2426, i64 1694, i64 %t118, i64 %t120) + unreachable +inrange3956: + %t122 = extractvalue { ptr, i64, i64 } %t119, 0 + %t123 = getelementptr inbounds %S.gen.EnumDef, ptr %t122, i64 %t118 + %t124 = load %S.gen.EnumDef, ptr %t123 + store %S.gen.EnumDef %t124, ptr %a125 + call void @finch.copy.S_gen_EnumDef(ptr %a126, ptr %a125) + %t127 = load %S.gen.EnumDef, ptr %a126 + store %S.gen.EnumDef %t127, ptr %a128 + store { ptr, i64, i64 } zeroinitializer, ptr %a129 + %t130 = getelementptr inbounds %S.gen.EnumDef, ptr %a128, i32 0, i32 2 + %t131 = getelementptr inbounds { ptr, i64, i64 }, ptr %t130, i32 0, i32 1 + %t132 = load i64, ptr %t131 + store i64 0, ptr %a133 + br label %for.cond3957 +for.cond3957: + %t134 = load i64, ptr %a133 + %t135 = icmp slt i64 %t134, %t132 + br i1 %t135, label %for.body3958, label %for.end3960 +for.body3958: + %t136 = getelementptr inbounds { ptr, i64, i64 }, ptr %a129, i32 0, i32 1 + %t137 = load ptr, ptr %a1 + %t138 = getelementptr inbounds %S.gen.EnumDef, ptr %a128, i32 0, i32 2 + %t139 = load i64, ptr %a133 + %t140 = load { ptr, i64, i64 }, ptr %t138 + %t141 = extractvalue { ptr, i64, i64 } %t140, 1 + %t142 = icmp uge i64 %t139, %t141 + br i1 %t142, label %range3961, label %inrange3962 +range3961: + call void @finch_panic_index(ptr @.str.2428, i64 1697, i64 %t139, i64 %t141) + unreachable +inrange3962: + %t143 = extractvalue { ptr, i64, i64 } %t140, 0 + %t144 = getelementptr inbounds { ptr, i64, i64 }, ptr %t143, i64 %t139 + %t145 = load { ptr, i64, i64 }, ptr %t144 + store { ptr, i64, i64 } { ptr @.str.2427, i64 21, i64 0 }, ptr %a147 + store { ptr, i64, i64 } %t145, ptr %a148 + call void @finch_str_concat(ptr %a146, ptr %a147, ptr %a148) + %t149 = load { ptr, i64, i64 }, ptr %a146 + store { ptr, i64, i64 } %t149, ptr %a151 + store { ptr, i64, i64 } { ptr @.str.2429, i64 10, i64 0 }, ptr %a152 + call void @finch_str_concat(ptr %a150, ptr %a151, ptr %a152) + %t153 = load { ptr, i64, i64 }, ptr %a150 + %t154 = getelementptr inbounds %S.gen.EnumDef, ptr %a128, i32 0, i32 3 + %t155 = load i64, ptr %a133 + %t156 = load { ptr, i64, i64 }, ptr %t154 + %t157 = extractvalue { ptr, i64, i64 } %t156, 1 + %t158 = icmp uge i64 %t155, %t157 + br i1 %t158, label %range3963, label %inrange3964 +range3963: + call void @finch_panic_index(ptr @.str.2430, i64 1697, i64 %t155, i64 %t157) + unreachable +inrange3964: + %t159 = extractvalue { ptr, i64, i64 } %t156, 0 + %t160 = getelementptr inbounds i64, ptr %t159, i64 %t155 + %t161 = load i64, ptr %t160 + call void @finch_str_from_int(ptr %a162, i64 %t161) + %t163 = load { ptr, i64, i64 }, ptr %a162 + store { ptr, i64, i64 } %t153, ptr %a165 + store { ptr, i64, i64 } %t163, ptr %a166 + call void @finch_str_concat(ptr %a164, ptr %a165, ptr %a166) + %t167 = load { ptr, i64, i64 }, ptr %a164 + store { ptr, i64, i64 } %t167, ptr %a169 + store { ptr, i64, i64 } { ptr @.str.2431, i64 1, i64 0 }, ptr %a170 + call void @finch_str_concat(ptr %a168, ptr %a169, ptr %a170) + %t171 = load { ptr, i64, i64 }, ptr %a168 + %t172 = call i64 @finch.gen.md(ptr %t137, { ptr, i64, i64 } %t171) + %t173 = call { ptr, i64, i64 } @finch.gen.mdRef(i64 %t172) + %t174 = load i64, ptr %t136 + %t175 = add i64 %t174, 1 + call void @finch_arr_reserve(ptr %a129, i64 %t175, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t176 = load ptr, ptr %a129 + %t177 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 %t174 + store { ptr, i64, i64 } %t173, ptr %t177 + store i64 %t175, ptr %t136 + br label %for.step3959 +for.step3959: + %t178 = load i64, ptr %a133 + %t179 = add i64 %t178, 1 + store i64 %t179, ptr %a133 + br label %for.cond3957 +for.end3960: + %t180 = load ptr, ptr %a1 + %t181 = getelementptr inbounds %S.gen.EnumDef, ptr %a128, i32 0, i32 1 + %t182 = load { ptr, i64, i64 }, ptr %t181 + store { ptr, i64, i64 } { ptr @.str.2432, i64 54, i64 0 }, ptr %a184 + store { ptr, i64, i64 } %t182, ptr %a185 + call void @finch_str_concat(ptr %a183, ptr %a184, ptr %a185) + %t186 = load { ptr, i64, i64 }, ptr %a183 + store { ptr, i64, i64 } %t186, ptr %a188 + store { ptr, i64, i64 } { ptr @.str.2433, i64 10, i64 0 }, ptr %a189 + call void @finch_str_concat(ptr %a187, ptr %a188, ptr %a189) + %t190 = load { ptr, i64, i64 }, ptr %a187 + %t191 = load i64, ptr %a58 + call void @finch_str_from_int(ptr %a192, i64 %t191) + %t193 = load { ptr, i64, i64 }, ptr %a192 + store { ptr, i64, i64 } %t190, ptr %a195 + store { ptr, i64, i64 } %t193, ptr %a196 + call void @finch_str_concat(ptr %a194, ptr %a195, ptr %a196) + %t197 = load { ptr, i64, i64 }, ptr %a194 + store { ptr, i64, i64 } %t197, ptr %a199 + store { ptr, i64, i64 } { ptr @.str.2434, i64 24, i64 0 }, ptr %a200 + call void @finch_str_concat(ptr %a198, ptr %a199, ptr %a200) + %t201 = load { ptr, i64, i64 }, ptr %a198 + %t202 = getelementptr inbounds { ptr, i64, i64 }, ptr %a129, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2435, i64 2, i64 0 }, ptr %a203 + call void @finch_str_join(ptr %a204, ptr %a129, ptr %a203) + %t205 = load { ptr, i64, i64 }, ptr %a204 + store { ptr, i64, i64 } %t201, ptr %a207 + store { ptr, i64, i64 } %t205, ptr %a208 + call void @finch_str_concat(ptr %a206, ptr %a207, ptr %a208) + %t209 = load { ptr, i64, i64 }, ptr %a206 + store { ptr, i64, i64 } %t209, ptr %a211 + store { ptr, i64, i64 } { ptr @.str.2436, i64 2, i64 0 }, ptr %a212 + call void @finch_str_concat(ptr %a210, ptr %a211, ptr %a212) + %t213 = load { ptr, i64, i64 }, ptr %a210 + %t214 = call i64 @finch.gen.md(ptr %t180, { ptr, i64, i64 } %t213) + store i64 %t214, ptr %a48 + br label %endif3952 +else3951: + %t215 = load ptr, ptr %a1 + %t216 = call i64 @finch.gen.md(ptr %t215, { ptr, i64, i64 } { ptr @.str.2437, i64 0, i64 0 }) + store i64 %t216, ptr %a48 + %t217 = load i64, ptr %a48 + %t218 = load ptr, ptr %a1 + %t219 = icmp eq ptr %t218, null + br i1 %t219, label %panic3965, label %ok3966 +panic3965: + call void @finch_panic(ptr @.str.2438, i64 1703, ptr @.str.2439) + unreachable +ok3966: + %t220 = getelementptr inbounds %S.gen.Gen, ptr %t218, i32 0, i32 30 + %t221 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t221, ptr %a222 + store i32 0, ptr %a223 + %t224 = call i64 @finch_map_slot(ptr %t220, ptr %a222, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i64 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a223) + %t225 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t220, i32 0, i32 0 + %t226 = load ptr, ptr %t225 + %t227 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t226, i64 %t224 + %t228 = load i32, ptr %a223 + %t229 = icmp ne i32 %t228, 0 + br i1 %t229, label %map.new3967, label %map.have3968 +map.new3967: + %t230 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t227, i32 0, i32 1 + call void @finch_str_copy(ptr %t230, ptr %a222) + %t231 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t227, i32 0, i32 2 + store i64 0, ptr %t231 + br label %map.have3968 +map.have3968: + %t232 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t227, i32 0, i32 2 + store i64 %t217, ptr %t232 + %t233 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t233, ptr %a234 + store { ptr, i64, i64 } { ptr @.str.2440, i64 3, i64 0 }, ptr %a235 + %t236 = call i32 @finch_str_eq(ptr %a234, ptr %a235) + %t237 = icmp ne i32 %t236, 0 + br i1 %t237, label %then3969, label %else3970 +then3969: + store i64 -1, ptr %a238 + %t239 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t240 = getelementptr inbounds { ptr, i64, i64 }, ptr %t239, i32 0, i32 1 + %t241 = load i64, ptr %t240 + %t242 = icmp sgt i64 %t241, 0 + br i1 %t242, label %then3972, label %endif3974 +then3972: + %t243 = load ptr, ptr %a1 + %t244 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t245 = load { ptr, i64, i64 }, ptr %t244 + %t246 = extractvalue { ptr, i64, i64 } %t245, 1 + %t247 = icmp uge i64 0, %t246 + br i1 %t247, label %range3975, label %inrange3976 +range3975: + call void @finch_panic_index(ptr @.str.2441, i64 1707, i64 0, i64 %t246) + unreachable +inrange3976: + %t248 = extractvalue { ptr, i64, i64 } %t245, 0 + %t249 = getelementptr inbounds %S.ast.Type, ptr %t248, i64 0 + %t250 = load %S.ast.Type, ptr %t249 + %t251 = call i64 @finch.gen.diType(ptr %t243, %S.ast.Type %t250) + store i64 %t251, ptr %a238 + br label %endif3974 +endif3974: + %t252 = load i64, ptr %a238 + %t253 = call { ptr, i64, i64 } @finch.gen.mdRef(i64 %t252) + store { ptr, i64, i64 } { ptr @.str.2442, i64 51, i64 0 }, ptr %a255 + store { ptr, i64, i64 } %t253, ptr %a256 + call void @finch_str_concat(ptr %a254, ptr %a255, ptr %a256) + %t257 = load { ptr, i64, i64 }, ptr %a254 + store { ptr, i64, i64 } %t257, ptr %a259 + store { ptr, i64, i64 } { ptr @.str.2443, i64 11, i64 0 }, ptr %a260 + call void @finch_str_concat(ptr %a258, ptr %a259, ptr %a260) + %t261 = load { ptr, i64, i64 }, ptr %a258 + %t262 = load ptr, ptr %a1 + %t263 = icmp eq ptr %t262, null + br i1 %t263, label %panic3977, label %ok3978 +panic3977: + call void @finch_panic(ptr @.str.2444, i64 1709, ptr @.str.2445) + unreachable +ok3978: + %t264 = getelementptr inbounds %S.gen.Gen, ptr %t262, i32 0, i32 29 + %t265 = load i64, ptr %a48 + %t266 = load { ptr, i64, i64 }, ptr %t264 + %t267 = extractvalue { ptr, i64, i64 } %t266, 1 + %t268 = icmp uge i64 %t265, %t267 + br i1 %t268, label %range3979, label %inrange3980 +range3979: + call void @finch_panic_index(ptr @.str.2446, i64 1709, i64 %t265, i64 %t267) + unreachable +inrange3980: + %t269 = extractvalue { ptr, i64, i64 } %t266, 0 + %t270 = getelementptr inbounds { ptr, i64, i64 }, ptr %t269, i64 %t265 + store { ptr, i64, i64 } %t261, ptr %t270 + br label %endif3971 +else3970: + %t271 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t271, ptr %a272 + store { ptr, i64, i64 } { ptr @.str.2447, i64 5, i64 0 }, ptr %a273 + %t274 = call i32 @finch_str_eq(ptr %a272, ptr %a273) + %t275 = icmp ne i32 %t274, 0 + br i1 %t275, label %then3981, label %else3982 +then3981: + %t276 = load ptr, ptr %a1 + %t277 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t278 = load { ptr, i64, i64 }, ptr %t277 + %t279 = extractvalue { ptr, i64, i64 } %t278, 1 + %t280 = icmp uge i64 0, %t279 + br i1 %t280, label %range3984, label %inrange3985 +range3984: + call void @finch_panic_index(ptr @.str.2448, i64 1711, i64 0, i64 %t279) + unreachable +inrange3985: + %t281 = extractvalue { ptr, i64, i64 } %t278, 0 + %t282 = getelementptr inbounds %S.ast.Type, ptr %t281, i64 0 + %t283 = load %S.ast.Type, ptr %t282 + %t284 = call %S.gen.SizeAlign @finch.gen.sizeAlign(ptr %t276, %S.ast.Type %t283) + store %S.gen.SizeAlign %t284, ptr %a285 + %t286 = load ptr, ptr %a1 + %t287 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t288 = load i64, ptr %t287 + call void @finch_str_from_int(ptr %a289, i64 %t288) + %t290 = load { ptr, i64, i64 }, ptr %a289 + store { ptr, i64, i64 } { ptr @.str.2449, i64 19, i64 0 }, ptr %a292 + store { ptr, i64, i64 } %t290, ptr %a293 + call void @finch_str_concat(ptr %a291, ptr %a292, ptr %a293) + %t294 = load { ptr, i64, i64 }, ptr %a291 + store { ptr, i64, i64 } %t294, ptr %a296 + store { ptr, i64, i64 } { ptr @.str.2450, i64 1, i64 0 }, ptr %a297 + call void @finch_str_concat(ptr %a295, ptr %a296, ptr %a297) + %t298 = load { ptr, i64, i64 }, ptr %a295 + %t299 = call i64 @finch.gen.md(ptr %t286, { ptr, i64, i64 } %t298) + store i64 %t299, ptr %a300 + %t301 = load ptr, ptr %a1 + %t302 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t303 = load { ptr, i64, i64 }, ptr %t302 + %t304 = extractvalue { ptr, i64, i64 } %t303, 1 + %t305 = icmp uge i64 0, %t304 + br i1 %t305, label %range3986, label %inrange3987 +range3986: + call void @finch_panic_index(ptr @.str.2452, i64 1713, i64 0, i64 %t304) + unreachable +inrange3987: + %t306 = extractvalue { ptr, i64, i64 } %t303, 0 + %t307 = getelementptr inbounds %S.ast.Type, ptr %t306, i64 0 + %t308 = load %S.ast.Type, ptr %t307 + %t309 = call i64 @finch.gen.diType(ptr %t301, %S.ast.Type %t308) + %t310 = call { ptr, i64, i64 } @finch.gen.mdRef(i64 %t309) + store { ptr, i64, i64 } { ptr @.str.2451, i64 51, i64 0 }, ptr %a312 + store { ptr, i64, i64 } %t310, ptr %a313 + call void @finch_str_concat(ptr %a311, ptr %a312, ptr %a313) + %t314 = load { ptr, i64, i64 }, ptr %a311 + store { ptr, i64, i64 } %t314, ptr %a316 + store { ptr, i64, i64 } { ptr @.str.2453, i64 8, i64 0 }, ptr %a317 + call void @finch_str_concat(ptr %a315, ptr %a316, ptr %a317) + %t318 = load { ptr, i64, i64 }, ptr %a315 + %t319 = getelementptr inbounds %S.gen.SizeAlign, ptr %a285, i32 0, i32 0 + %t320 = load i64, ptr %t319 + %t321 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t322 = load i64, ptr %t321 + %t323 = mul i64 %t320, %t322 + %t324 = mul i64 %t323, 8 + call void @finch_str_from_int(ptr %a325, i64 %t324) + %t326 = load { ptr, i64, i64 }, ptr %a325 + store { ptr, i64, i64 } %t318, ptr %a328 + store { ptr, i64, i64 } %t326, ptr %a329 + call void @finch_str_concat(ptr %a327, ptr %a328, ptr %a329) + %t330 = load { ptr, i64, i64 }, ptr %a327 + store { ptr, i64, i64 } %t330, ptr %a332 + store { ptr, i64, i64 } { ptr @.str.2454, i64 15, i64 0 }, ptr %a333 + call void @finch_str_concat(ptr %a331, ptr %a332, ptr %a333) + %t334 = load { ptr, i64, i64 }, ptr %a331 + %t335 = load i64, ptr %a300 + call void @finch_str_from_int(ptr %a336, i64 %t335) + %t337 = load { ptr, i64, i64 }, ptr %a336 + store { ptr, i64, i64 } %t334, ptr %a339 + store { ptr, i64, i64 } %t337, ptr %a340 + call void @finch_str_concat(ptr %a338, ptr %a339, ptr %a340) + %t341 = load { ptr, i64, i64 }, ptr %a338 + store { ptr, i64, i64 } %t341, ptr %a343 + store { ptr, i64, i64 } { ptr @.str.2455, i64 2, i64 0 }, ptr %a344 + call void @finch_str_concat(ptr %a342, ptr %a343, ptr %a344) + %t345 = load { ptr, i64, i64 }, ptr %a342 + %t346 = load ptr, ptr %a1 + %t347 = icmp eq ptr %t346, null + br i1 %t347, label %panic3988, label %ok3989 +panic3988: + call void @finch_panic(ptr @.str.2456, i64 1713, ptr @.str.2457) + unreachable +ok3989: + %t348 = getelementptr inbounds %S.gen.Gen, ptr %t346, i32 0, i32 29 + %t349 = load i64, ptr %a48 + %t350 = load { ptr, i64, i64 }, ptr %t348 + %t351 = extractvalue { ptr, i64, i64 } %t350, 1 + %t352 = icmp uge i64 %t349, %t351 + br i1 %t352, label %range3990, label %inrange3991 +range3990: + call void @finch_panic_index(ptr @.str.2458, i64 1713, i64 %t349, i64 %t351) + unreachable +inrange3991: + %t353 = extractvalue { ptr, i64, i64 } %t350, 0 + %t354 = getelementptr inbounds { ptr, i64, i64 }, ptr %t353, i64 %t349 + store { ptr, i64, i64 } %t345, ptr %t354 + br label %endif3983 +else3982: + %t355 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t355, ptr %a356 + store { ptr, i64, i64 } { ptr @.str.2459, i64 3, i64 0 }, ptr %a357 + %t358 = call i32 @finch_str_eq(ptr %a356, ptr %a357) + %t359 = icmp ne i32 %t358, 0 + br label %logic.from3992 +logic.from3992: + br i1 %t359, label %logic.end3994, label %logic.rhs3993 +logic.rhs3993: + %t360 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t360, ptr %a361 + store { ptr, i64, i64 } { ptr @.str.2460, i64 5, i64 0 }, ptr %a362 + %t363 = call i32 @finch_str_eq(ptr %a361, ptr %a362) + %t364 = icmp ne i32 %t363, 0 + br label %logic.rend3995 +logic.rend3995: + br label %logic.end3994 +logic.end3994: + %t365 = phi i1 [ true, %logic.from3992 ], [ %t364, %logic.rend3995 ] + br i1 %t365, label %then3996, label %else3997 +then3996: + %t366 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.2461, i64 4, i64 0 }) + store %S.ast.Type %t366, ptr %a367 + %t368 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t368, ptr %a369 + store { ptr, i64, i64 } { ptr @.str.2462, i64 5, i64 0 }, ptr %a370 + %t371 = call i32 @finch_str_eq(ptr %a369, ptr %a370) + %t372 = icmp ne i32 %t371, 0 + br i1 %t372, label %then3999, label %endif4001 +then3999: + %t373 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t374 = load { ptr, i64, i64 }, ptr %t373 + %t375 = extractvalue { ptr, i64, i64 } %t374, 1 + %t376 = icmp uge i64 0, %t375 + br i1 %t376, label %range4002, label %inrange4003 +range4002: + call void @finch_panic_index(ptr @.str.2463, i64 1717, i64 0, i64 %t375) + unreachable +inrange4003: + %t377 = extractvalue { ptr, i64, i64 } %t374, 0 + %t378 = getelementptr inbounds %S.ast.Type, ptr %t377, i64 0 + %t379 = load %S.ast.Type, ptr %t378 + store %S.ast.Type %t379, ptr %a380 + call void @finch.copy.S_ast_Type(ptr %a381, ptr %a380) + %t382 = load %S.ast.Type, ptr %a381 + store %S.ast.Type %t382, ptr %a367 + br label %endif4001 +endif4001: + %t383 = load ptr, ptr %a1 + %t384 = load ptr, ptr %a1 + %t385 = load %S.ast.Type, ptr %a367 + %t386 = call i64 @finch.gen.diType(ptr %t384, %S.ast.Type %t385) + %t387 = call { ptr, i64, i64 } @finch.gen.mdRef(i64 %t386) + store { ptr, i64, i64 } { ptr @.str.2464, i64 51, i64 0 }, ptr %a389 + store { ptr, i64, i64 } %t387, ptr %a390 + call void @finch_str_concat(ptr %a388, ptr %a389, ptr %a390) + %t391 = load { ptr, i64, i64 }, ptr %a388 + store { ptr, i64, i64 } %t391, ptr %a393 + store { ptr, i64, i64 } { ptr @.str.2465, i64 11, i64 0 }, ptr %a394 + call void @finch_str_concat(ptr %a392, ptr %a393, ptr %a394) + %t395 = load { ptr, i64, i64 }, ptr %a392 + %t396 = call i64 @finch.gen.md(ptr %t383, { ptr, i64, i64 } %t395) + store i64 %t396, ptr %a397 + %t398 = load ptr, ptr %a1 + %t399 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.2466, i64 3, i64 0 }) + %t400 = call i64 @finch.gen.diType(ptr %t398, %S.ast.Type %t399) + store i64 %t400, ptr %a401 + %t402 = load ptr, ptr %a1 + %t403 = load i64, ptr %a48 + %t404 = load i64, ptr %a58 + %t405 = load i64, ptr %a397 + %t406 = call i64 @finch.gen.dbgMember(ptr %t402, { ptr, i64, i64 } { ptr @.str.2467, i64 3, i64 0 }, i64 %t403, i64 %t404, i64 0, i64 %t405, i64 64, i64 0) + store i64 %t406, ptr %a407 + %t408 = load ptr, ptr %a1 + %t409 = load i64, ptr %a48 + %t410 = load i64, ptr %a58 + %t411 = load i64, ptr %a401 + %t412 = call i64 @finch.gen.dbgMember(ptr %t408, { ptr, i64, i64 } { ptr @.str.2468, i64 3, i64 0 }, i64 %t409, i64 %t410, i64 0, i64 %t411, i64 64, i64 64) + store i64 %t412, ptr %a413 + %t414 = load ptr, ptr %a1 + %t415 = load i64, ptr %a48 + %t416 = load i64, ptr %a58 + %t417 = load i64, ptr %a401 + %t418 = call i64 @finch.gen.dbgMember(ptr %t414, { ptr, i64, i64 } { ptr @.str.2469, i64 3, i64 0 }, i64 %t415, i64 %t416, i64 0, i64 %t417, i64 64, i64 128) + store i64 %t418, ptr %a419 + %t420 = load %S.ast.Type, ptr %a2 + %t421 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t420) + store { ptr, i64, i64 } { ptr @.str.2470, i64 52, i64 0 }, ptr %a423 + store { ptr, i64, i64 } %t421, ptr %a424 + call void @finch_str_concat(ptr %a422, ptr %a423, ptr %a424) + %t425 = load { ptr, i64, i64 }, ptr %a422 + store { ptr, i64, i64 } %t425, ptr %a427 + store { ptr, i64, i64 } { ptr @.str.2471, i64 10, i64 0 }, ptr %a428 + call void @finch_str_concat(ptr %a426, ptr %a427, ptr %a428) + %t429 = load { ptr, i64, i64 }, ptr %a426 + %t430 = load i64, ptr %a58 + call void @finch_str_from_int(ptr %a431, i64 %t430) + %t432 = load { ptr, i64, i64 }, ptr %a431 + store { ptr, i64, i64 } %t429, ptr %a434 + store { ptr, i64, i64 } %t432, ptr %a435 + call void @finch_str_concat(ptr %a433, ptr %a434, ptr %a435) + %t436 = load { ptr, i64, i64 }, ptr %a433 + store { ptr, i64, i64 } %t436, ptr %a438 + store { ptr, i64, i64 } { ptr @.str.2472, i64 37, i64 0 }, ptr %a439 + call void @finch_str_concat(ptr %a437, ptr %a438, ptr %a439) + %t440 = load { ptr, i64, i64 }, ptr %a437 + %t441 = load i64, ptr %a407 + call void @finch_str_from_int(ptr %a442, i64 %t441) + %t443 = load { ptr, i64, i64 }, ptr %a442 + store { ptr, i64, i64 } %t440, ptr %a445 + store { ptr, i64, i64 } %t443, ptr %a446 + call void @finch_str_concat(ptr %a444, ptr %a445, ptr %a446) + %t447 = load { ptr, i64, i64 }, ptr %a444 + store { ptr, i64, i64 } %t447, ptr %a449 + store { ptr, i64, i64 } { ptr @.str.2473, i64 3, i64 0 }, ptr %a450 + call void @finch_str_concat(ptr %a448, ptr %a449, ptr %a450) + %t451 = load { ptr, i64, i64 }, ptr %a448 + %t452 = load i64, ptr %a413 + call void @finch_str_from_int(ptr %a453, i64 %t452) + %t454 = load { ptr, i64, i64 }, ptr %a453 + store { ptr, i64, i64 } %t451, ptr %a456 + store { ptr, i64, i64 } %t454, ptr %a457 + call void @finch_str_concat(ptr %a455, ptr %a456, ptr %a457) + %t458 = load { ptr, i64, i64 }, ptr %a455 + store { ptr, i64, i64 } %t458, ptr %a460 + store { ptr, i64, i64 } { ptr @.str.2474, i64 3, i64 0 }, ptr %a461 + call void @finch_str_concat(ptr %a459, ptr %a460, ptr %a461) + %t462 = load { ptr, i64, i64 }, ptr %a459 + %t463 = load i64, ptr %a419 + call void @finch_str_from_int(ptr %a464, i64 %t463) + %t465 = load { ptr, i64, i64 }, ptr %a464 + store { ptr, i64, i64 } %t462, ptr %a467 + store { ptr, i64, i64 } %t465, ptr %a468 + call void @finch_str_concat(ptr %a466, ptr %a467, ptr %a468) + %t469 = load { ptr, i64, i64 }, ptr %a466 + store { ptr, i64, i64 } %t469, ptr %a471 + store { ptr, i64, i64 } { ptr @.str.2475, i64 2, i64 0 }, ptr %a472 + call void @finch_str_concat(ptr %a470, ptr %a471, ptr %a472) + %t473 = load { ptr, i64, i64 }, ptr %a470 + %t474 = load ptr, ptr %a1 + %t475 = icmp eq ptr %t474, null + br i1 %t475, label %panic4004, label %ok4005 +panic4004: + call void @finch_panic(ptr @.str.2476, i64 1724, ptr @.str.2477) + unreachable +ok4005: + %t476 = getelementptr inbounds %S.gen.Gen, ptr %t474, i32 0, i32 29 + %t477 = load i64, ptr %a48 + %t478 = load { ptr, i64, i64 }, ptr %t476 + %t479 = extractvalue { ptr, i64, i64 } %t478, 1 + %t480 = icmp uge i64 %t477, %t479 + br i1 %t480, label %range4006, label %inrange4007 +range4006: + call void @finch_panic_index(ptr @.str.2478, i64 1724, i64 %t477, i64 %t479) + unreachable +inrange4007: + %t481 = extractvalue { ptr, i64, i64 } %t478, 0 + %t482 = getelementptr inbounds { ptr, i64, i64 }, ptr %t481, i64 %t477 + store { ptr, i64, i64 } %t473, ptr %t482 + br label %endif3998 +else3997: + %t483 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t483, ptr %a484 + store { ptr, i64, i64 } { ptr @.str.2479, i64 3, i64 0 }, ptr %a485 + %t486 = call i32 @finch_str_eq(ptr %a484, ptr %a485) + %t487 = icmp ne i32 %t486, 0 + br i1 %t487, label %then4008, label %else4009 +then4008: + %t488 = load ptr, ptr %a1 + %t489 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.2480, i64 3, i64 0 }) + %t490 = call i64 @finch.gen.diType(ptr %t488, %S.ast.Type %t489) + store i64 %t490, ptr %a491 + %t492 = load ptr, ptr %a1 + %t493 = call i64 @finch.gen.md(ptr %t492, { ptr, i64, i64 } { ptr @.str.2481, i64 66, i64 0 }) + store i64 %t493, ptr %a494 + %t495 = mul i64 7, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t496 = call ptr @finch_alloc(i64 %t495) + %t497 = getelementptr inbounds { ptr, i64, i64 }, ptr %t496, i64 0 + store { ptr, i64, i64 } { ptr @.str.2482, i64 7, i64 0 }, ptr %t497 + %t498 = getelementptr inbounds { ptr, i64, i64 }, ptr %t496, i64 1 + store { ptr, i64, i64 } { ptr @.str.2483, i64 3, i64 0 }, ptr %t498 + %t499 = getelementptr inbounds { ptr, i64, i64 }, ptr %t496, i64 2 + store { ptr, i64, i64 } { ptr @.str.2484, i64 4, i64 0 }, ptr %t499 + %t500 = getelementptr inbounds { ptr, i64, i64 }, ptr %t496, i64 3 + store { ptr, i64, i64 } { ptr @.str.2485, i64 3, i64 0 }, ptr %t500 + %t501 = getelementptr inbounds { ptr, i64, i64 }, ptr %t496, i64 4 + store { ptr, i64, i64 } { ptr @.str.2486, i64 5, i64 0 }, ptr %t501 + %t502 = getelementptr inbounds { ptr, i64, i64 }, ptr %t496, i64 5 + store { ptr, i64, i64 } { ptr @.str.2487, i64 4, i64 0 }, ptr %t502 + %t503 = getelementptr inbounds { ptr, i64, i64 }, ptr %t496, i64 6 + store { ptr, i64, i64 } { ptr @.str.2488, i64 4, i64 0 }, ptr %t503 + %t504 = insertvalue { ptr, i64, i64 } undef, ptr %t496, 0 + %t505 = insertvalue { ptr, i64, i64 } %t504, i64 7, 1 + %t506 = insertvalue { ptr, i64, i64 } %t505, i64 7, 2 + store { ptr, i64, i64 } %t506, ptr %a507 + store { ptr, i64, i64 } zeroinitializer, ptr %a508 + store i64 0, ptr %a509 + br label %for.cond4011 +for.cond4011: + %t510 = load i64, ptr %a509 + %t511 = icmp slt i64 %t510, 7 + br i1 %t511, label %for.body4012, label %for.end4014 +for.body4012: + %t512 = load i64, ptr %a491 + store i64 %t512, ptr %a513 + %t514 = load i64, ptr %a509 + %t515 = icmp eq i64 %t514, 0 + br label %logic.from4015 +logic.from4015: + br i1 %t515, label %logic.end4017, label %logic.rhs4016 +logic.rhs4016: + %t516 = load i64, ptr %a509 + %t517 = icmp eq i64 %t516, 4 + br label %logic.rend4018 +logic.rend4018: + br label %logic.end4017 +logic.end4017: + %t518 = phi i1 [ true, %logic.from4015 ], [ %t517, %logic.rend4018 ] + br i1 %t518, label %then4019, label %endif4021 +then4019: + %t519 = load i64, ptr %a494 + store i64 %t519, ptr %a513 + br label %endif4021 +endif4021: + %t520 = getelementptr inbounds { ptr, i64, i64 }, ptr %a508, i32 0, i32 1 + %t521 = load ptr, ptr %a1 + %t522 = load i64, ptr %a509 + %t523 = load { ptr, i64, i64 }, ptr %a507 + %t524 = extractvalue { ptr, i64, i64 } %t523, 1 + %t525 = icmp uge i64 %t522, %t524 + br i1 %t525, label %range4022, label %inrange4023 +range4022: + call void @finch_panic_index(ptr @.str.2490, i64 1735, i64 %t522, i64 %t524) + unreachable +inrange4023: + %t526 = extractvalue { ptr, i64, i64 } %t523, 0 + %t527 = getelementptr inbounds { ptr, i64, i64 }, ptr %t526, i64 %t522 + %t528 = load { ptr, i64, i64 }, ptr %t527 + %t529 = load i64, ptr %a48 + %t530 = load i64, ptr %a58 + %t531 = load i64, ptr %a513 + %t532 = load i64, ptr %a509 + %t533 = mul i64 64, %t532 + %t534 = call i64 @finch.gen.dbgMember(ptr %t521, { ptr, i64, i64 } %t528, i64 %t529, i64 %t530, i64 0, i64 %t531, i64 64, i64 %t533) + call void @finch_str_from_int(ptr %a535, i64 %t534) + %t536 = load { ptr, i64, i64 }, ptr %a535 + store { ptr, i64, i64 } { ptr @.str.2489, i64 1, i64 0 }, ptr %a538 + store { ptr, i64, i64 } %t536, ptr %a539 + call void @finch_str_concat(ptr %a537, ptr %a538, ptr %a539) + %t540 = load { ptr, i64, i64 }, ptr %a537 + %t541 = load i64, ptr %t520 + %t542 = add i64 %t541, 1 + call void @finch_arr_reserve(ptr %a508, i64 %t542, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t543 = load ptr, ptr %a508 + %t544 = getelementptr inbounds { ptr, i64, i64 }, ptr %t543, i64 %t541 + store { ptr, i64, i64 } %t540, ptr %t544 + store i64 %t542, ptr %t520 + br label %for.step4013 +for.step4013: + %t545 = load i64, ptr %a509 + %t546 = add i64 %t545, 1 + store i64 %t546, ptr %a509 + br label %for.cond4011 +for.end4014: + %t547 = load %S.ast.Type, ptr %a2 + %t548 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t547) + store { ptr, i64, i64 } { ptr @.str.2491, i64 52, i64 0 }, ptr %a550 + store { ptr, i64, i64 } %t548, ptr %a551 + call void @finch_str_concat(ptr %a549, ptr %a550, ptr %a551) + %t552 = load { ptr, i64, i64 }, ptr %a549 + store { ptr, i64, i64 } %t552, ptr %a554 + store { ptr, i64, i64 } { ptr @.str.2492, i64 10, i64 0 }, ptr %a555 + call void @finch_str_concat(ptr %a553, ptr %a554, ptr %a555) + %t556 = load { ptr, i64, i64 }, ptr %a553 + %t557 = load i64, ptr %a58 + call void @finch_str_from_int(ptr %a558, i64 %t557) + %t559 = load { ptr, i64, i64 }, ptr %a558 + store { ptr, i64, i64 } %t556, ptr %a561 + store { ptr, i64, i64 } %t559, ptr %a562 + call void @finch_str_concat(ptr %a560, ptr %a561, ptr %a562) + %t563 = load { ptr, i64, i64 }, ptr %a560 + store { ptr, i64, i64 } %t563, ptr %a565 + store { ptr, i64, i64 } { ptr @.str.2493, i64 36, i64 0 }, ptr %a566 + call void @finch_str_concat(ptr %a564, ptr %a565, ptr %a566) + %t567 = load { ptr, i64, i64 }, ptr %a564 + %t568 = getelementptr inbounds { ptr, i64, i64 }, ptr %a508, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2494, i64 2, i64 0 }, ptr %a569 + call void @finch_str_join(ptr %a570, ptr %a508, ptr %a569) + %t571 = load { ptr, i64, i64 }, ptr %a570 + store { ptr, i64, i64 } %t567, ptr %a573 + store { ptr, i64, i64 } %t571, ptr %a574 + call void @finch_str_concat(ptr %a572, ptr %a573, ptr %a574) + %t575 = load { ptr, i64, i64 }, ptr %a572 + store { ptr, i64, i64 } %t575, ptr %a577 + store { ptr, i64, i64 } { ptr @.str.2495, i64 2, i64 0 }, ptr %a578 + call void @finch_str_concat(ptr %a576, ptr %a577, ptr %a578) + %t579 = load { ptr, i64, i64 }, ptr %a576 + %t580 = load ptr, ptr %a1 + %t581 = icmp eq ptr %t580, null + br i1 %t581, label %panic4024, label %ok4025 +panic4024: + call void @finch_panic(ptr @.str.2496, i64 1737, ptr @.str.2497) + unreachable +ok4025: + %t582 = getelementptr inbounds %S.gen.Gen, ptr %t580, i32 0, i32 29 + %t583 = load i64, ptr %a48 + %t584 = load { ptr, i64, i64 }, ptr %t582 + %t585 = extractvalue { ptr, i64, i64 } %t584, 1 + %t586 = icmp uge i64 %t583, %t585 + br i1 %t586, label %range4026, label %inrange4027 +range4026: + call void @finch_panic_index(ptr @.str.2498, i64 1737, i64 %t583, i64 %t585) + unreachable +inrange4027: + %t587 = extractvalue { ptr, i64, i64 } %t584, 0 + %t588 = getelementptr inbounds { ptr, i64, i64 }, ptr %t587, i64 %t583 + store { ptr, i64, i64 } %t579, ptr %t588 + br label %endif4010 +else4009: + %t589 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t589, ptr %a590 + store { ptr, i64, i64 } { ptr @.str.2499, i64 6, i64 0 }, ptr %a591 + %t592 = call i32 @finch_str_eq(ptr %a590, ptr %a591) + %t593 = icmp ne i32 %t592, 0 + br i1 %t593, label %then4028, label %else4029 +then4028: + %t594 = load ptr, ptr %a1 + %t595 = icmp eq ptr %t594, null + br i1 %t595, label %panic4031, label %ok4032 +panic4031: + call void @finch_panic(ptr @.str.2500, i64 1739, ptr @.str.2501) + unreachable +ok4032: + %t596 = getelementptr inbounds %S.gen.Gen, ptr %t594, i32 0, i32 15 + %t597 = load ptr, ptr %a1 + %t598 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t599 = load { ptr, i64, i64 }, ptr %t598 + %t600 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t601 = load { ptr, i64, i64 }, ptr %t600 + %t602 = call i64 @finch.gen.findStruct(ptr %t597, { ptr, i64, i64 } %t599, { ptr, i64, i64 } %t601) + %t603 = load { ptr, i64, i64 }, ptr %t596 + %t604 = extractvalue { ptr, i64, i64 } %t603, 1 + %t605 = icmp uge i64 %t602, %t604 + br i1 %t605, label %range4033, label %inrange4034 +range4033: + call void @finch_panic_index(ptr @.str.2502, i64 1739, i64 %t602, i64 %t604) + unreachable +inrange4034: + %t606 = extractvalue { ptr, i64, i64 } %t603, 0 + %t607 = getelementptr inbounds %S.gen.StructDef, ptr %t606, i64 %t602 + %t608 = load %S.gen.StructDef, ptr %t607 + store %S.gen.StructDef %t608, ptr %a609 + call void @finch.copy.S_gen_StructDef(ptr %a610, ptr %a609) + %t611 = load %S.gen.StructDef, ptr %a610 + store %S.gen.StructDef %t611, ptr %a612 + %t613 = load ptr, ptr %a1 + %t614 = load %S.gen.StructDef, ptr %a612 + %t615 = call { ptr, i64, i64 } @finch.gen.fieldOffsets(ptr %t613, %S.gen.StructDef %t614) + store { ptr, i64, i64 } %t615, ptr %a616 + %t617 = load ptr, ptr %a1 + %t618 = load %S.ast.Type, ptr %a2 + %t619 = call %S.gen.SizeAlign @finch.gen.sizeAlign(ptr %t617, %S.ast.Type %t618) + store %S.gen.SizeAlign %t619, ptr %a620 + store { ptr, i64, i64 } zeroinitializer, ptr %a621 + %t622 = getelementptr inbounds %S.gen.StructDef, ptr %a612, i32 0, i32 12 + %t623 = getelementptr inbounds { ptr, i64, i64 }, ptr %t622, i32 0, i32 1 + %t624 = load i64, ptr %t623 + store i64 0, ptr %a625 + br label %for.cond4035 +for.cond4035: + %t626 = load i64, ptr %a625 + %t627 = icmp slt i64 %t626, %t624 + br i1 %t627, label %for.body4036, label %for.end4038 +for.body4036: + %t628 = load ptr, ptr %a1 + %t629 = getelementptr inbounds %S.gen.StructDef, ptr %a612, i32 0, i32 12 + %t630 = load i64, ptr %a625 + %t631 = load { ptr, i64, i64 }, ptr %t629 + %t632 = extractvalue { ptr, i64, i64 } %t631, 1 + %t633 = icmp uge i64 %t630, %t632 + br i1 %t633, label %range4039, label %inrange4040 +range4039: + call void @finch_panic_index(ptr @.str.2503, i64 1744, i64 %t630, i64 %t632) + unreachable +inrange4040: + %t634 = extractvalue { ptr, i64, i64 } %t631, 0 + %t635 = getelementptr inbounds %S.ast.Type, ptr %t634, i64 %t630 + %t636 = load %S.ast.Type, ptr %t635 + %t637 = call %S.gen.SizeAlign @finch.gen.sizeAlign(ptr %t628, %S.ast.Type %t636) + store %S.gen.SizeAlign %t637, ptr %a638 + %t639 = getelementptr inbounds { ptr, i64, i64 }, ptr %a621, i32 0, i32 1 + %t640 = load ptr, ptr %a1 + %t641 = getelementptr inbounds %S.gen.StructDef, ptr %a612, i32 0, i32 11 + %t642 = load i64, ptr %a625 + %t643 = load { ptr, i64, i64 }, ptr %t641 + %t644 = extractvalue { ptr, i64, i64 } %t643, 1 + %t645 = icmp uge i64 %t642, %t644 + br i1 %t645, label %range4041, label %inrange4042 +range4041: + call void @finch_panic_index(ptr @.str.2505, i64 1745, i64 %t642, i64 %t644) + unreachable +inrange4042: + %t646 = extractvalue { ptr, i64, i64 } %t643, 0 + %t647 = getelementptr inbounds { ptr, i64, i64 }, ptr %t646, i64 %t642 + %t648 = load { ptr, i64, i64 }, ptr %t647 + %t649 = load i64, ptr %a48 + %t650 = load i64, ptr %a58 + %t651 = load ptr, ptr %a1 + %t652 = getelementptr inbounds %S.gen.StructDef, ptr %a612, i32 0, i32 12 + %t653 = load i64, ptr %a625 + %t654 = load { ptr, i64, i64 }, ptr %t652 + %t655 = extractvalue { ptr, i64, i64 } %t654, 1 + %t656 = icmp uge i64 %t653, %t655 + br i1 %t656, label %range4043, label %inrange4044 +range4043: + call void @finch_panic_index(ptr @.str.2506, i64 1745, i64 %t653, i64 %t655) + unreachable +inrange4044: + %t657 = extractvalue { ptr, i64, i64 } %t654, 0 + %t658 = getelementptr inbounds %S.ast.Type, ptr %t657, i64 %t653 + %t659 = load %S.ast.Type, ptr %t658 + %t660 = call i64 @finch.gen.diType(ptr %t651, %S.ast.Type %t659) + %t661 = getelementptr inbounds %S.gen.SizeAlign, ptr %a638, i32 0, i32 0 + %t662 = load i64, ptr %t661 + %t663 = mul i64 %t662, 8 + %t664 = load i64, ptr %a625 + %t665 = load { ptr, i64, i64 }, ptr %a616 + %t666 = extractvalue { ptr, i64, i64 } %t665, 1 + %t667 = icmp uge i64 %t664, %t666 + br i1 %t667, label %range4045, label %inrange4046 +range4045: + call void @finch_panic_index(ptr @.str.2507, i64 1745, i64 %t664, i64 %t666) + unreachable +inrange4046: + %t668 = extractvalue { ptr, i64, i64 } %t665, 0 + %t669 = getelementptr inbounds i64, ptr %t668, i64 %t664 + %t670 = load i64, ptr %t669 + %t671 = mul i64 %t670, 8 + %t672 = call i64 @finch.gen.dbgMember(ptr %t640, { ptr, i64, i64 } %t648, i64 %t649, i64 %t650, i64 0, i64 %t660, i64 %t663, i64 %t671) + call void @finch_str_from_int(ptr %a673, i64 %t672) + %t674 = load { ptr, i64, i64 }, ptr %a673 + store { ptr, i64, i64 } { ptr @.str.2504, i64 1, i64 0 }, ptr %a676 + store { ptr, i64, i64 } %t674, ptr %a677 + call void @finch_str_concat(ptr %a675, ptr %a676, ptr %a677) + %t678 = load { ptr, i64, i64 }, ptr %a675 + %t679 = load i64, ptr %t639 + %t680 = add i64 %t679, 1 + call void @finch_arr_reserve(ptr %a621, i64 %t680, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t681 = load ptr, ptr %a621 + %t682 = getelementptr inbounds { ptr, i64, i64 }, ptr %t681, i64 %t679 + store { ptr, i64, i64 } %t678, ptr %t682 + store i64 %t680, ptr %t639 + br label %for.step4037 +for.step4037: + %t683 = load i64, ptr %a625 + %t684 = add i64 %t683, 1 + store i64 %t684, ptr %a625 + br label %for.cond4035 +for.end4038: + %t685 = getelementptr inbounds %S.gen.StructDef, ptr %a612, i32 0, i32 1 + %t686 = load { ptr, i64, i64 }, ptr %t685 + store { ptr, i64, i64 } { ptr @.str.2508, i64 52, i64 0 }, ptr %a688 + store { ptr, i64, i64 } %t686, ptr %a689 + call void @finch_str_concat(ptr %a687, ptr %a688, ptr %a689) + %t690 = load { ptr, i64, i64 }, ptr %a687 + store { ptr, i64, i64 } %t690, ptr %a692 + store { ptr, i64, i64 } { ptr @.str.2509, i64 10, i64 0 }, ptr %a693 + call void @finch_str_concat(ptr %a691, ptr %a692, ptr %a693) + %t694 = load { ptr, i64, i64 }, ptr %a691 + %t695 = load i64, ptr %a58 + call void @finch_str_from_int(ptr %a696, i64 %t695) + %t697 = load { ptr, i64, i64 }, ptr %a696 + store { ptr, i64, i64 } %t694, ptr %a699 + store { ptr, i64, i64 } %t697, ptr %a700 + call void @finch_str_concat(ptr %a698, ptr %a699, ptr %a700) + %t701 = load { ptr, i64, i64 }, ptr %a698 + store { ptr, i64, i64 } %t701, ptr %a703 + store { ptr, i64, i64 } { ptr @.str.2510, i64 8, i64 0 }, ptr %a704 + call void @finch_str_concat(ptr %a702, ptr %a703, ptr %a704) + %t705 = load { ptr, i64, i64 }, ptr %a702 + %t706 = getelementptr inbounds %S.gen.SizeAlign, ptr %a620, i32 0, i32 0 + %t707 = load i64, ptr %t706 + %t708 = mul i64 %t707, 8 + call void @finch_str_from_int(ptr %a709, i64 %t708) + %t710 = load { ptr, i64, i64 }, ptr %a709 + store { ptr, i64, i64 } %t705, ptr %a712 + store { ptr, i64, i64 } %t710, ptr %a713 + call void @finch_str_concat(ptr %a711, ptr %a712, ptr %a713) + %t714 = load { ptr, i64, i64 }, ptr %a711 + store { ptr, i64, i64 } %t714, ptr %a716 + store { ptr, i64, i64 } { ptr @.str.2511, i64 24, i64 0 }, ptr %a717 + call void @finch_str_concat(ptr %a715, ptr %a716, ptr %a717) + %t718 = load { ptr, i64, i64 }, ptr %a715 + %t719 = getelementptr inbounds { ptr, i64, i64 }, ptr %a621, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2512, i64 2, i64 0 }, ptr %a720 + call void @finch_str_join(ptr %a721, ptr %a621, ptr %a720) + %t722 = load { ptr, i64, i64 }, ptr %a721 + store { ptr, i64, i64 } %t718, ptr %a724 + store { ptr, i64, i64 } %t722, ptr %a725 + call void @finch_str_concat(ptr %a723, ptr %a724, ptr %a725) + %t726 = load { ptr, i64, i64 }, ptr %a723 + store { ptr, i64, i64 } %t726, ptr %a728 + store { ptr, i64, i64 } { ptr @.str.2513, i64 2, i64 0 }, ptr %a729 + call void @finch_str_concat(ptr %a727, ptr %a728, ptr %a729) + %t730 = load { ptr, i64, i64 }, ptr %a727 + %t731 = load ptr, ptr %a1 + %t732 = icmp eq ptr %t731, null + br i1 %t732, label %panic4047, label %ok4048 +panic4047: + call void @finch_panic(ptr @.str.2514, i64 1747, ptr @.str.2515) + unreachable +ok4048: + %t733 = getelementptr inbounds %S.gen.Gen, ptr %t731, i32 0, i32 29 + %t734 = load i64, ptr %a48 + %t735 = load { ptr, i64, i64 }, ptr %t733 + %t736 = extractvalue { ptr, i64, i64 } %t735, 1 + %t737 = icmp uge i64 %t734, %t736 + br i1 %t737, label %range4049, label %inrange4050 +range4049: + call void @finch_panic_index(ptr @.str.2516, i64 1747, i64 %t734, i64 %t736) + unreachable +inrange4050: + %t738 = extractvalue { ptr, i64, i64 } %t735, 0 + %t739 = getelementptr inbounds { ptr, i64, i64 }, ptr %t738, i64 %t734 + store { ptr, i64, i64 } %t730, ptr %t739 + br label %endif4030 +else4029: + %t740 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.2517, i64 20, i64 0 }, ptr %a742 + store { ptr, i64, i64 } %t740, ptr %a743 + call void @finch_str_concat(ptr %a741, ptr %a742, ptr %a743) + %t744 = load { ptr, i64, i64 }, ptr %a741 + store { ptr, i64, i64 } %t744, ptr %a746 + store { ptr, i64, i64 } { ptr @.str.2518, i64 39, i64 0 }, ptr %a747 + call void @finch_str_concat(ptr %a745, ptr %a746, ptr %a747) + %t748 = load { ptr, i64, i64 }, ptr %a745 + %t749 = load ptr, ptr %a1 + %t750 = icmp eq ptr %t749, null + br i1 %t750, label %panic4051, label %ok4052 +panic4051: + call void @finch_panic(ptr @.str.2519, i64 1749, ptr @.str.2520) + unreachable +ok4052: + %t751 = getelementptr inbounds %S.gen.Gen, ptr %t749, i32 0, i32 29 + %t752 = load i64, ptr %a48 + %t753 = load { ptr, i64, i64 }, ptr %t751 + %t754 = extractvalue { ptr, i64, i64 } %t753, 1 + %t755 = icmp uge i64 %t752, %t754 + br i1 %t755, label %range4053, label %inrange4054 +range4053: + call void @finch_panic_index(ptr @.str.2521, i64 1749, i64 %t752, i64 %t754) + unreachable +inrange4054: + %t756 = extractvalue { ptr, i64, i64 } %t753, 0 + %t757 = getelementptr inbounds { ptr, i64, i64 }, ptr %t756, i64 %t752 + store { ptr, i64, i64 } %t748, ptr %t757 + br label %endif4030 +endif4030: + br label %endif4010 +endif4010: + br label %endif3998 +endif3998: + br label %endif3983 +endif3983: + br label %endif3971 +endif3971: + %t758 = load i64, ptr %a48 + ret i64 %t758 +endif3952: + br label %endif3946 +endif3946: + br label %endif3943 +endif3943: + br label %endif3940 +endif3940: + br label %endif3937 +endif3937: + br label %endif3934 +endif3934: + br label %endif3931 +endif3931: + %t759 = load i64, ptr %a48 + %t760 = load ptr, ptr %a1 + %t761 = icmp eq ptr %t760, null + br i1 %t761, label %panic4055, label %ok4056 +panic4055: + call void @finch_panic(ptr @.str.2522, i64 1753, ptr @.str.2523) + unreachable +ok4056: + %t762 = getelementptr inbounds %S.gen.Gen, ptr %t760, i32 0, i32 30 + %t763 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t763, ptr %a764 + store i32 0, ptr %a765 + %t766 = call i64 @finch_map_slot(ptr %t762, ptr %a764, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i64 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a765) + %t767 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t762, i32 0, i32 0 + %t768 = load ptr, ptr %t767 + %t769 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t768, i64 %t766 + %t770 = load i32, ptr %a765 + %t771 = icmp ne i32 %t770, 0 + br i1 %t771, label %map.new4057, label %map.have4058 +map.new4057: + %t772 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t769, i32 0, i32 1 + call void @finch_str_copy(ptr %t772, ptr %a764) + %t773 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t769, i32 0, i32 2 + store i64 0, ptr %t773 + br label %map.have4058 +map.have4058: + %t774 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t769, i32 0, i32 2 + store i64 %t759, ptr %t774 + %t775 = load i64, ptr %a48 + ret i64 %t775 +} + +define internal i64 @finch.gen.dbgLocation(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca i64, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca i32, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = icmp eq ptr %t2, null + br i1 %t3, label %panic4059, label %ok4060 +panic4059: + call void @finch_panic(ptr @.str.2525, i64 1758, ptr @.str.2526) + unreachable +ok4060: + %t4 = getelementptr inbounds %S.gen.Gen, ptr %t2, i32 0, i32 33 + %t5 = load i64, ptr %t4 + call void @finch_str_from_int(ptr %a6, i64 %t5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.2524, i64 2, i64 0 }, ptr %a9 + store { ptr, i64, i64 } %t7, ptr %a10 + call void @finch_str_concat(ptr %a8, ptr %a9, ptr %a10) + %t11 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t11, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.2527, i64 1, i64 0 }, ptr %a14 + call void @finch_str_concat(ptr %a12, ptr %a13, ptr %a14) + %t15 = load { ptr, i64, i64 }, ptr %a12 + %t16 = load ptr, ptr %a1 + %t17 = icmp eq ptr %t16, null + br i1 %t17, label %panic4061, label %ok4062 +panic4061: + call void @finch_panic(ptr @.str.2528, i64 1758, ptr @.str.2529) + unreachable +ok4062: + %t18 = getelementptr inbounds %S.gen.Gen, ptr %t16, i32 0, i32 34 + %t19 = load i64, ptr %t18 + call void @finch_str_from_int(ptr %a20, i64 %t19) + %t21 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t15, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.2530, i64 1, i64 0 }, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + %t30 = load ptr, ptr %a1 + %t31 = icmp eq ptr %t30, null + br i1 %t31, label %panic4063, label %ok4064 +panic4063: + call void @finch_panic(ptr @.str.2531, i64 1758, ptr @.str.2532) + unreachable +ok4064: + %t32 = getelementptr inbounds %S.gen.Gen, ptr %t30, i32 0, i32 32 + %t33 = load i64, ptr %t32 + call void @finch_str_from_int(ptr %a34, i64 %t33) + %t35 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t29, ptr %a37 + store { ptr, i64, i64 } %t35, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t39, ptr %a40 + %t41 = load ptr, ptr %a1 + %t42 = icmp eq ptr %t41, null + br i1 %t42, label %panic4065, label %ok4066 +panic4065: + call void @finch_panic(ptr @.str.2533, i64 1759, ptr @.str.2534) + unreachable +ok4066: + %t43 = getelementptr inbounds %S.gen.Gen, ptr %t41, i32 0, i32 30 + %t44 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t44, ptr %a45 + %t46 = call i64 @finch_map_find(ptr %t43, ptr %a45, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i64 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t47 = icmp sge i64 %t46, 0 + br i1 %t47, label %then4067, label %endif4069 +then4067: + %t48 = load ptr, ptr %a1 + %t49 = icmp eq ptr %t48, null + br i1 %t49, label %panic4070, label %ok4071 +panic4070: + call void @finch_panic(ptr @.str.2535, i64 1760, ptr @.str.2536) + unreachable +ok4071: + %t50 = getelementptr inbounds %S.gen.Gen, ptr %t48, i32 0, i32 30 + %t51 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t51, ptr %a52 + %t53 = call i64 @finch_map_find(ptr %t50, ptr %a52, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i64 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t54 = icmp slt i64 %t53, 0 + br i1 %t54, label %map.missing4072, label %map.found4073 +map.missing4072: + store { ptr, i64, i64 } zeroinitializer, ptr %a55 + store { ptr, i64, i64 } %t51, ptr %a56 + call void @finch_buf_str(ptr %a55, ptr %a56, i32 1) + call void @finch_map_missing(ptr @.str.2537, i64 1760, ptr %a55) + unreachable +map.found4073: + %t57 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t50, i32 0, i32 0 + %t58 = load ptr, ptr %t57 + %t59 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t58, i64 %t53 + %t60 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t59, i32 0, i32 2 + %t61 = load i64, ptr %t60 + ret i64 %t61 +endif4069: + %t62 = load ptr, ptr %a1 + %t63 = load ptr, ptr %a1 + %t64 = icmp eq ptr %t63, null + br i1 %t64, label %panic4074, label %ok4075 +panic4074: + call void @finch_panic(ptr @.str.2539, i64 1762, ptr @.str.2540) + unreachable +ok4075: + %t65 = getelementptr inbounds %S.gen.Gen, ptr %t63, i32 0, i32 33 + %t66 = load i64, ptr %t65 + call void @finch_str_from_int(ptr %a67, i64 %t66) + %t68 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.2538, i64 18, i64 0 }, ptr %a70 + store { ptr, i64, i64 } %t68, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + store { ptr, i64, i64 } %t72, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.2541, i64 10, i64 0 }, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + %t77 = load ptr, ptr %a1 + %t78 = icmp eq ptr %t77, null + br i1 %t78, label %panic4076, label %ok4077 +panic4076: + call void @finch_panic(ptr @.str.2542, i64 1762, ptr @.str.2543) + unreachable +ok4077: + %t79 = getelementptr inbounds %S.gen.Gen, ptr %t77, i32 0, i32 34 + %t80 = load i64, ptr %t79 + call void @finch_str_from_int(ptr %a81, i64 %t80) + %t82 = load { ptr, i64, i64 }, ptr %a81 + store { ptr, i64, i64 } %t76, ptr %a84 + store { ptr, i64, i64 } %t82, ptr %a85 + call void @finch_str_concat(ptr %a83, ptr %a84, ptr %a85) + %t86 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t86, ptr %a88 + store { ptr, i64, i64 } { ptr @.str.2544, i64 10, i64 0 }, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + %t91 = load ptr, ptr %a1 + %t92 = icmp eq ptr %t91, null + br i1 %t92, label %panic4078, label %ok4079 +panic4078: + call void @finch_panic(ptr @.str.2545, i64 1762, ptr @.str.2546) + unreachable +ok4079: + %t93 = getelementptr inbounds %S.gen.Gen, ptr %t91, i32 0, i32 32 + %t94 = load i64, ptr %t93 + call void @finch_str_from_int(ptr %a95, i64 %t94) + %t96 = load { ptr, i64, i64 }, ptr %a95 + store { ptr, i64, i64 } %t90, ptr %a98 + store { ptr, i64, i64 } %t96, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + store { ptr, i64, i64 } %t100, ptr %a102 + store { ptr, i64, i64 } { ptr @.str.2547, i64 1, i64 0 }, ptr %a103 + call void @finch_str_concat(ptr %a101, ptr %a102, ptr %a103) + %t104 = load { ptr, i64, i64 }, ptr %a101 + %t105 = call i64 @finch.gen.md(ptr %t62, { ptr, i64, i64 } %t104) + store i64 %t105, ptr %a106 + %t107 = load i64, ptr %a106 + %t108 = load ptr, ptr %a1 + %t109 = icmp eq ptr %t108, null + br i1 %t109, label %panic4080, label %ok4081 +panic4080: + call void @finch_panic(ptr @.str.2548, i64 1763, ptr @.str.2549) + unreachable +ok4081: + %t110 = getelementptr inbounds %S.gen.Gen, ptr %t108, i32 0, i32 30 + %t111 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t111, ptr %a112 + store i32 0, ptr %a113 + %t114 = call i64 @finch_map_slot(ptr %t110, ptr %a112, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i64 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a113) + %t115 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t110, i32 0, i32 0 + %t116 = load ptr, ptr %t115 + %t117 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t116, i64 %t114 + %t118 = load i32, ptr %a113 + %t119 = icmp ne i32 %t118, 0 + br i1 %t119, label %map.new4082, label %map.have4083 +map.new4082: + %t120 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t117, i32 0, i32 1 + call void @finch_str_copy(ptr %t120, ptr %a112) + %t121 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t117, i32 0, i32 2 + store i64 0, ptr %t121 + br label %map.have4083 +map.have4083: + %t122 = getelementptr inbounds { i64, { ptr, i64, i64 }, i64 }, ptr %t117, i32 0, i32 2 + store i64 %t107, ptr %t122 + %t123 = load i64, ptr %a106 + ret i64 %t123 +} + +define internal i64 @finch.gen.dbgSubprogram(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a7 = alloca %S.gen.FnSig, align 16 + %a8 = alloca %S.gen.FnSig, align 16 + %a10 = alloca %S.gen.FnSig, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca i64, align 16 + %a40 = alloca %S.ast.Type, align 16 + %a63 = alloca i64, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca i64, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic4084, label %ok4085 +panic4084: + call void @finch_panic(ptr @.str.2550, i64 1768, ptr @.str.2551) + unreachable +ok4085: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 12 + %t6 = load %S.gen.FnSig, ptr %t5 + store %S.gen.FnSig %t6, ptr %a7 + call void @finch.copy.S_gen_FnSig(ptr %a8, ptr %a7) + %t9 = load %S.gen.FnSig, ptr %a8 + store %S.gen.FnSig %t9, ptr %a10 + store { ptr, i64, i64 } zeroinitializer, ptr %a11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %a11, i32 0, i32 1 + %t13 = load ptr, ptr %a1 + %t14 = getelementptr inbounds %S.gen.FnSig, ptr %a10, i32 0, i32 12 + %t15 = load %S.ast.Type, ptr %t14 + %t16 = call i64 @finch.gen.diType(ptr %t13, %S.ast.Type %t15) + %t17 = call { ptr, i64, i64 } @finch.gen.mdRef(i64 %t16) + %t18 = load i64, ptr %t12 + %t19 = add i64 %t18, 1 + call void @finch_arr_reserve(ptr %a11, i64 %t19, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t20 = load ptr, ptr %a11 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t20, i64 %t18 + store { ptr, i64, i64 } %t17, ptr %t21 + store i64 %t19, ptr %t12 + %t22 = getelementptr inbounds %S.gen.FnSig, ptr %a10, i32 0, i32 2 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load i64, ptr %t23 + %t25 = icmp sgt i64 %t24, 0 + br i1 %t25, label %then4086, label %endif4088 +then4086: + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %a11, i32 0, i32 1 + %t27 = load i64, ptr %t26 + %t28 = add i64 %t27, 1 + call void @finch_arr_reserve(ptr %a11, i64 %t28, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t29 = load ptr, ptr %a11 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 %t27 + store { ptr, i64, i64 } { ptr @.str.2552, i64 4, i64 0 }, ptr %t30 + store i64 %t28, ptr %t26 + br label %endif4088 +endif4088: + %t31 = getelementptr inbounds %S.gen.FnSig, ptr %a10, i32 0, i32 13 + store i64 0, ptr %a32 + br label %each.cond4089 +each.cond4089: + %t33 = getelementptr inbounds { ptr, i64, i64 }, ptr %t31, i32 0, i32 1 + %t34 = load i64, ptr %t33 + %t35 = load i64, ptr %a32 + %t36 = icmp slt i64 %t35, %t34 + br i1 %t36, label %each.body4090, label %each.end4092 +each.body4090: + %t37 = load ptr, ptr %t31 + %t38 = getelementptr inbounds %S.ast.Type, ptr %t37, i64 %t35 + %t39 = load %S.ast.Type, ptr %t38 + store %S.ast.Type %t39, ptr %a40 + %t41 = getelementptr inbounds { ptr, i64, i64 }, ptr %a11, i32 0, i32 1 + %t42 = load ptr, ptr %a1 + %t43 = load %S.ast.Type, ptr %a40 + %t44 = call i64 @finch.gen.diType(ptr %t42, %S.ast.Type %t43) + %t45 = call { ptr, i64, i64 } @finch.gen.mdRef(i64 %t44) + %t46 = load i64, ptr %t41 + %t47 = add i64 %t46, 1 + call void @finch_arr_reserve(ptr %a11, i64 %t47, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t48 = load ptr, ptr %a11 + %t49 = getelementptr inbounds { ptr, i64, i64 }, ptr %t48, i64 %t46 + store { ptr, i64, i64 } %t45, ptr %t49 + store i64 %t47, ptr %t41 + br label %each.step4091 +each.step4091: + %t50 = load i64, ptr %a32 + %t51 = add i64 %t50, 1 + store i64 %t51, ptr %a32 + br label %each.cond4089 +each.end4092: + %t52 = load ptr, ptr %a1 + %t53 = icmp eq ptr %t52, null + br i1 %t53, label %panic4093, label %ok4094 +panic4093: + call void @finch_panic(ptr @.str.2553, i64 1777, ptr @.str.2554) + unreachable +ok4094: + %t54 = getelementptr inbounds %S.gen.Gen, ptr %t52, i32 0, i32 31 + %t55 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t56 = load i64, ptr %t55 + %t57 = load { ptr, i64, i64 }, ptr %t54 + %t58 = extractvalue { ptr, i64, i64 } %t57, 1 + %t59 = icmp uge i64 %t56, %t58 + br i1 %t59, label %range4095, label %inrange4096 +range4095: + call void @finch_panic_index(ptr @.str.2555, i64 1777, i64 %t56, i64 %t58) + unreachable +inrange4096: + %t60 = extractvalue { ptr, i64, i64 } %t57, 0 + %t61 = getelementptr inbounds i64, ptr %t60, i64 %t56 + %t62 = load i64, ptr %t61 + store i64 %t62, ptr %a63 + %t64 = load ptr, ptr %a1 + %t65 = getelementptr inbounds { ptr, i64, i64 }, ptr %a11, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2557, i64 2, i64 0 }, ptr %a66 + call void @finch_str_join(ptr %a67, ptr %a11, ptr %a66) + %t68 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.2556, i64 27, i64 0 }, ptr %a70 + store { ptr, i64, i64 } %t68, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + store { ptr, i64, i64 } %t72, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.2558, i64 2, i64 0 }, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + %t77 = call i64 @finch.gen.md(ptr %t64, { ptr, i64, i64 } %t76) + store i64 %t77, ptr %a78 + %t79 = load ptr, ptr %a1 + %t80 = getelementptr inbounds %S.gen.FnSig, ptr %a10, i32 0, i32 1 + %t81 = load { ptr, i64, i64 }, ptr %t80 + store { ptr, i64, i64 } { ptr @.str.2559, i64 30, i64 0 }, ptr %a83 + store { ptr, i64, i64 } %t81, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t85, ptr %a87 + store { ptr, i64, i64 } { ptr @.str.2560, i64 17, i64 0 }, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + %t90 = getelementptr inbounds %S.gen.FnSig, ptr %a10, i32 0, i32 11 + %t91 = load { ptr, i64, i64 }, ptr %t90 + store { ptr, i64, i64 } %t91, ptr %a92 + %t94 = getelementptr inbounds %S.gen.FnSig, ptr %a10, i32 0, i32 11 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %t94, i32 0, i32 1 + %t96 = load i64, ptr %t95 + call void @finch_str_sub(ptr %a93, ptr %a92, i64 1, i64 %t96, ptr @.str.2561, i64 1779) + %t97 = load { ptr, i64, i64 }, ptr %a93 + store { ptr, i64, i64 } %t89, ptr %a99 + store { ptr, i64, i64 } %t97, ptr %a100 + call void @finch_str_concat(ptr %a98, ptr %a99, ptr %a100) + %t101 = load { ptr, i64, i64 }, ptr %a98 + store { ptr, i64, i64 } %t101, ptr %a103 + store { ptr, i64, i64 } { ptr @.str.2562, i64 11, i64 0 }, ptr %a104 + call void @finch_str_concat(ptr %a102, ptr %a103, ptr %a104) + %t105 = load { ptr, i64, i64 }, ptr %a102 + %t106 = load i64, ptr %a63 + call void @finch_str_from_int(ptr %a107, i64 %t106) + %t108 = load { ptr, i64, i64 }, ptr %a107 + store { ptr, i64, i64 } %t105, ptr %a110 + store { ptr, i64, i64 } %t108, ptr %a111 + call void @finch_str_concat(ptr %a109, ptr %a110, ptr %a111) + %t112 = load { ptr, i64, i64 }, ptr %a109 + store { ptr, i64, i64 } %t112, ptr %a114 + store { ptr, i64, i64 } { ptr @.str.2563, i64 9, i64 0 }, ptr %a115 + call void @finch_str_concat(ptr %a113, ptr %a114, ptr %a115) + %t116 = load { ptr, i64, i64 }, ptr %a113 + %t117 = load i64, ptr %a63 + call void @finch_str_from_int(ptr %a118, i64 %t117) + %t119 = load { ptr, i64, i64 }, ptr %a118 + store { ptr, i64, i64 } %t116, ptr %a121 + store { ptr, i64, i64 } %t119, ptr %a122 + call void @finch_str_concat(ptr %a120, ptr %a121, ptr %a122) + %t123 = load { ptr, i64, i64 }, ptr %a120 + store { ptr, i64, i64 } %t123, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.2564, i64 8, i64 0 }, ptr %a126 + call void @finch_str_concat(ptr %a124, ptr %a125, ptr %a126) + %t127 = load { ptr, i64, i64 }, ptr %a124 + %t128 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t129 = load i64, ptr %t128 + call void @finch_str_from_int(ptr %a130, i64 %t129) + %t131 = load { ptr, i64, i64 }, ptr %a130 + store { ptr, i64, i64 } %t127, ptr %a133 + store { ptr, i64, i64 } %t131, ptr %a134 + call void @finch_str_concat(ptr %a132, ptr %a133, ptr %a134) + %t135 = load { ptr, i64, i64 }, ptr %a132 + store { ptr, i64, i64 } %t135, ptr %a137 + store { ptr, i64, i64 } { ptr @.str.2565, i64 9, i64 0 }, ptr %a138 + call void @finch_str_concat(ptr %a136, ptr %a137, ptr %a138) + %t139 = load { ptr, i64, i64 }, ptr %a136 + %t140 = load i64, ptr %a78 + call void @finch_str_from_int(ptr %a141, i64 %t140) + %t142 = load { ptr, i64, i64 }, ptr %a141 + store { ptr, i64, i64 } %t139, ptr %a144 + store { ptr, i64, i64 } %t142, ptr %a145 + call void @finch_str_concat(ptr %a143, ptr %a144, ptr %a145) + %t146 = load { ptr, i64, i64 }, ptr %a143 + store { ptr, i64, i64 } %t146, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.2566, i64 13, i64 0 }, ptr %a149 + call void @finch_str_concat(ptr %a147, ptr %a148, ptr %a149) + %t150 = load { ptr, i64, i64 }, ptr %a147 + %t151 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t152 = load i64, ptr %t151 + call void @finch_str_from_int(ptr %a153, i64 %t152) + %t154 = load { ptr, i64, i64 }, ptr %a153 + store { ptr, i64, i64 } %t150, ptr %a156 + store { ptr, i64, i64 } %t154, ptr %a157 + call void @finch_str_concat(ptr %a155, ptr %a156, ptr %a157) + %t158 = load { ptr, i64, i64 }, ptr %a155 + store { ptr, i64, i64 } %t158, ptr %a160 + store { ptr, i64, i64 } { ptr @.str.2567, i64 87, i64 0 }, ptr %a161 + call void @finch_str_concat(ptr %a159, ptr %a160, ptr %a161) + %t162 = load { ptr, i64, i64 }, ptr %a159 + %t163 = call i64 @finch.gen.md(ptr %t79, { ptr, i64, i64 } %t162) + ret i64 %t163 +} + +define internal void @finch.gen.dbgVariable(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3, { ptr, i64, i64 } %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca i64, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca i64, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic4097, label %ok4098 +panic4097: + call void @finch_panic(ptr @.str.2568, i64 1783, ptr @.str.2569) + unreachable +ok4098: + %t8 = getelementptr inbounds %S.gen.Gen, ptr %t6, i32 0, i32 26 + %t9 = load i1, ptr %t8 + %t10 = xor i1 %t9, true + br label %logic.from4099 +logic.from4099: + br i1 %t10, label %logic.end4101, label %logic.rhs4100 +logic.rhs4100: + %t11 = load ptr, ptr %a1 + %t12 = icmp eq ptr %t11, null + br i1 %t12, label %panic4102, label %ok4103 +panic4102: + call void @finch_panic(ptr @.str.2570, i64 1783, ptr @.str.2571) + unreachable +ok4103: + %t13 = getelementptr inbounds %S.gen.Gen, ptr %t11, i32 0, i32 32 + %t14 = load i64, ptr %t13 + %t15 = icmp slt i64 %t14, 0 + br label %logic.rend4104 +logic.rend4104: + br label %logic.end4101 +logic.end4101: + %t16 = phi i1 [ true, %logic.from4099 ], [ %t15, %logic.rend4104 ] + br i1 %t16, label %then4105, label %endif4107 +then4105: + ret void +endif4107: + %t17 = load ptr, ptr %a1 + %t18 = load %S.ast.Type, ptr %a4 + %t19 = call i64 @finch.gen.diType(ptr %t17, %S.ast.Type %t18) + store i64 %t19, ptr %a20 + %t21 = load i64, ptr %a20 + %t22 = icmp slt i64 %t21, 0 + br i1 %t22, label %then4108, label %endif4110 +then4108: + ret void +endif4110: + store { ptr, i64, i64 } { ptr @.str.2572, i64 0, i64 0 }, ptr %a23 + %t24 = load ptr, ptr %a1 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic4111, label %ok4112 +panic4111: + call void @finch_panic(ptr @.str.2573, i64 1791, ptr @.str.2574) + unreachable +ok4112: + %t26 = getelementptr inbounds %S.gen.Gen, ptr %t24, i32 0, i32 35 + %t27 = load i64, ptr %t26 + %t28 = icmp sgt i64 %t27, 0 + br i1 %t28, label %then4113, label %endif4115 +then4113: + %t29 = load ptr, ptr %a1 + %t30 = icmp eq ptr %t29, null + br i1 %t30, label %panic4116, label %ok4117 +panic4116: + call void @finch_panic(ptr @.str.2576, i64 1792, ptr @.str.2577) + unreachable +ok4117: + %t31 = getelementptr inbounds %S.gen.Gen, ptr %t29, i32 0, i32 35 + %t32 = load i64, ptr %t31 + call void @finch_str_from_int(ptr %a33, i64 %t32) + %t34 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.2575, i64 7, i64 0 }, ptr %a36 + store { ptr, i64, i64 } %t34, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t38, ptr %a23 + br label %endif4115 +endif4115: + %t39 = load ptr, ptr %a1 + %t40 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.2578, i64 24, i64 0 }, ptr %a42 + store { ptr, i64, i64 } %t40, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + store { ptr, i64, i64 } %t44, ptr %a46 + store { ptr, i64, i64 } { ptr @.str.2579, i64 11, i64 0 }, ptr %a47 + call void @finch_str_concat(ptr %a45, ptr %a46, ptr %a47) + %t48 = load { ptr, i64, i64 }, ptr %a45 + %t49 = load ptr, ptr %a1 + %t50 = icmp eq ptr %t49, null + br i1 %t50, label %panic4118, label %ok4119 +panic4118: + call void @finch_panic(ptr @.str.2580, i64 1794, ptr @.str.2581) + unreachable +ok4119: + %t51 = getelementptr inbounds %S.gen.Gen, ptr %t49, i32 0, i32 32 + %t52 = load i64, ptr %t51 + call void @finch_str_from_int(ptr %a53, i64 %t52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t48, ptr %a56 + store { ptr, i64, i64 } %t54, ptr %a57 + call void @finch_str_concat(ptr %a55, ptr %a56, ptr %a57) + %t58 = load { ptr, i64, i64 }, ptr %a55 + store { ptr, i64, i64 } %t58, ptr %a60 + store { ptr, i64, i64 } { ptr @.str.2582, i64 9, i64 0 }, ptr %a61 + call void @finch_str_concat(ptr %a59, ptr %a60, ptr %a61) + %t62 = load { ptr, i64, i64 }, ptr %a59 + %t63 = load ptr, ptr %a1 + %t64 = icmp eq ptr %t63, null + br i1 %t64, label %panic4120, label %ok4121 +panic4120: + call void @finch_panic(ptr @.str.2583, i64 1794, ptr @.str.2584) + unreachable +ok4121: + %t65 = getelementptr inbounds %S.gen.Gen, ptr %t63, i32 0, i32 31 + %t66 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t67 = load i64, ptr %t66 + %t68 = load { ptr, i64, i64 }, ptr %t65 + %t69 = extractvalue { ptr, i64, i64 } %t68, 1 + %t70 = icmp uge i64 %t67, %t69 + br i1 %t70, label %range4122, label %inrange4123 +range4122: + call void @finch_panic_index(ptr @.str.2585, i64 1794, i64 %t67, i64 %t69) + unreachable +inrange4123: + %t71 = extractvalue { ptr, i64, i64 } %t68, 0 + %t72 = getelementptr inbounds i64, ptr %t71, i64 %t67 + %t73 = load i64, ptr %t72 + call void @finch_str_from_int(ptr %a74, i64 %t73) + %t75 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t62, ptr %a77 + store { ptr, i64, i64 } %t75, ptr %a78 + call void @finch_str_concat(ptr %a76, ptr %a77, ptr %a78) + %t79 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t79, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.2586, i64 8, i64 0 }, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + %t84 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t85 = load i64, ptr %t84 + call void @finch_str_from_int(ptr %a86, i64 %t85) + %t87 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t83, ptr %a89 + store { ptr, i64, i64 } %t87, ptr %a90 + call void @finch_str_concat(ptr %a88, ptr %a89, ptr %a90) + %t91 = load { ptr, i64, i64 }, ptr %a88 + store { ptr, i64, i64 } %t91, ptr %a93 + store { ptr, i64, i64 } { ptr @.str.2587, i64 9, i64 0 }, ptr %a94 + call void @finch_str_concat(ptr %a92, ptr %a93, ptr %a94) + %t95 = load { ptr, i64, i64 }, ptr %a92 + %t96 = load i64, ptr %a20 + call void @finch_str_from_int(ptr %a97, i64 %t96) + %t98 = load { ptr, i64, i64 }, ptr %a97 + store { ptr, i64, i64 } %t95, ptr %a100 + store { ptr, i64, i64 } %t98, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + %t103 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t102, ptr %a105 + store { ptr, i64, i64 } %t103, ptr %a106 + call void @finch_str_concat(ptr %a104, ptr %a105, ptr %a106) + %t107 = load { ptr, i64, i64 }, ptr %a104 + store { ptr, i64, i64 } %t107, ptr %a109 + store { ptr, i64, i64 } { ptr @.str.2588, i64 1, i64 0 }, ptr %a110 + call void @finch_str_concat(ptr %a108, ptr %a109, ptr %a110) + %t111 = load { ptr, i64, i64 }, ptr %a108 + %t112 = call i64 @finch.gen.md(ptr %t39, { ptr, i64, i64 } %t111) + store i64 %t112, ptr %a113 + %t114 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t115 = load i64, ptr %t114 + %t116 = load ptr, ptr %a1 + %t117 = icmp eq ptr %t116, null + br i1 %t117, label %panic4124, label %ok4125 +panic4124: + call void @finch_panic(ptr @.str.2589, i64 1795, ptr @.str.2590) + unreachable +ok4125: + %t118 = getelementptr inbounds %S.gen.Gen, ptr %t116, i32 0, i32 33 + store i64 %t115, ptr %t118 + %t119 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 12 + %t120 = load i64, ptr %t119 + %t121 = load ptr, ptr %a1 + %t122 = icmp eq ptr %t121, null + br i1 %t122, label %panic4126, label %ok4127 +panic4126: + call void @finch_panic(ptr @.str.2591, i64 1796, ptr @.str.2592) + unreachable +ok4127: + %t123 = getelementptr inbounds %S.gen.Gen, ptr %t121, i32 0, i32 34 + store i64 %t120, ptr %t123 + %t124 = load ptr, ptr %a1 + %t125 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.2593, i64 41, i64 0 }, ptr %a127 + store { ptr, i64, i64 } %t125, ptr %a128 + call void @finch_str_concat(ptr %a126, ptr %a127, ptr %a128) + %t129 = load { ptr, i64, i64 }, ptr %a126 + store { ptr, i64, i64 } %t129, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.2594, i64 12, i64 0 }, ptr %a132 + call void @finch_str_concat(ptr %a130, ptr %a131, ptr %a132) + %t133 = load { ptr, i64, i64 }, ptr %a130 + %t134 = load i64, ptr %a113 + call void @finch_str_from_int(ptr %a135, i64 %t134) + %t136 = load { ptr, i64, i64 }, ptr %a135 + store { ptr, i64, i64 } %t133, ptr %a138 + store { ptr, i64, i64 } %t136, ptr %a139 + call void @finch_str_concat(ptr %a137, ptr %a138, ptr %a139) + %t140 = load { ptr, i64, i64 }, ptr %a137 + store { ptr, i64, i64 } %t140, ptr %a142 + store { ptr, i64, i64 } { ptr @.str.2595, i64 27, i64 0 }, ptr %a143 + call void @finch_str_concat(ptr %a141, ptr %a142, ptr %a143) + %t144 = load { ptr, i64, i64 }, ptr %a141 + call void @finch.gen.emit(ptr %t124, { ptr, i64, i64 } %t144) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.dbgModule(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca i64, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + %t2 = mul i64 2, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t3 = call ptr @finch_alloc(i64 %t2) + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 0 + store { ptr, i64, i64 } { ptr @.str.2596, i64 20, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 1 + store { ptr, i64, i64 } { ptr @.str.2597, i64 30, i64 0 }, ptr %t5 + %t6 = insertvalue { ptr, i64, i64 } undef, ptr %t3, 0 + %t7 = insertvalue { ptr, i64, i64 } %t6, i64 2, 1 + %t8 = insertvalue { ptr, i64, i64 } %t7, i64 2, 2 + store { ptr, i64, i64 } %t8, ptr %a9 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic4128, label %ok4129 +panic4128: + call void @finch_panic(ptr @.str.2598, i64 1803, ptr @.str.2599) + unreachable +ok4129: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 29 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t12, i32 0, i32 1 + %t14 = load i64, ptr %t13 + store i64 0, ptr %a15 + br label %for.cond4130 +for.cond4130: + %t16 = load i64, ptr %a15 + %t17 = icmp slt i64 %t16, %t14 + br i1 %t17, label %for.body4131, label %for.end4133 +for.body4131: + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %a9, i32 0, i32 1 + %t19 = load i64, ptr %a15 + call void @finch_str_from_int(ptr %a20, i64 %t19) + %t21 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.2600, i64 1, i64 0 }, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.2601, i64 3, i64 0 }, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + %t30 = load ptr, ptr %a1 + %t31 = icmp eq ptr %t30, null + br i1 %t31, label %panic4134, label %ok4135 +panic4134: + call void @finch_panic(ptr @.str.2602, i64 1804, ptr @.str.2603) + unreachable +ok4135: + %t32 = getelementptr inbounds %S.gen.Gen, ptr %t30, i32 0, i32 29 + %t33 = load i64, ptr %a15 + %t34 = load { ptr, i64, i64 }, ptr %t32 + %t35 = extractvalue { ptr, i64, i64 } %t34, 1 + %t36 = icmp uge i64 %t33, %t35 + br i1 %t36, label %range4136, label %inrange4137 +range4136: + call void @finch_panic_index(ptr @.str.2604, i64 1804, i64 %t33, i64 %t35) + unreachable +inrange4137: + %t37 = extractvalue { ptr, i64, i64 } %t34, 0 + %t38 = getelementptr inbounds { ptr, i64, i64 }, ptr %t37, i64 %t33 + %t39 = load { ptr, i64, i64 }, ptr %t38 + store { ptr, i64, i64 } %t29, ptr %a41 + store { ptr, i64, i64 } %t39, ptr %a42 + call void @finch_str_concat(ptr %a40, ptr %a41, ptr %a42) + %t43 = load { ptr, i64, i64 }, ptr %a40 + %t44 = load i64, ptr %t18 + %t45 = add i64 %t44, 1 + call void @finch_arr_reserve(ptr %a9, i64 %t45, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t46 = load ptr, ptr %a9 + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %t46, i64 %t44 + store { ptr, i64, i64 } %t43, ptr %t47 + store i64 %t45, ptr %t18 + br label %for.step4132 +for.step4132: + %t48 = load i64, ptr %a15 + %t49 = add i64 %t48, 1 + store i64 %t49, ptr %a15 + br label %for.cond4130 +for.end4133: + %t50 = getelementptr inbounds { ptr, i64, i64 }, ptr %a9, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2605, i64 1, i64 0 }, ptr %a51 + call void @finch_str_join(ptr %a52, ptr %a9, ptr %a51) + %t53 = load { ptr, i64, i64 }, ptr %a52 + store { ptr, i64, i64 } %t53, ptr %a55 + store { ptr, i64, i64 } { ptr @.str.2606, i64 1, i64 0 }, ptr %a56 + call void @finch_str_concat(ptr %a54, ptr %a55, ptr %a56) + %t57 = load { ptr, i64, i64 }, ptr %a54 + ret { ptr, i64, i64 } %t57 +} + +define internal void @finch.copy.arr_S_gen_Scope(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.gen.Scope, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond4206 +n.cond4206: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body4207, label %n.end4208 +n.body4207: + %t8 = getelementptr inbounds %S.gen.Scope, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.gen.Scope, ptr %t2, i64 %t6 + call void @finch.copy.S_gen_Scope(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond4206 +n.end4208: + ret void +} + +define internal void @finch.gen.define(ptr %p0, i64 %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a16 = alloca %S.gen.FnSig, align 16 + %a17 = alloca %S.gen.FnSig, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca %S.ast.Node, align 16 + %a104 = alloca %S.ast.Node, align 16 + %a106 = alloca %S.ast.Node, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca i64, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca %S.ast.Type, align 16 + %a226 = alloca %S.ast.Type, align 16 + %a227 = alloca %S.ast.Type, align 16 + %a249 = alloca i64, align 16 + %a263 = alloca %S.ast.Type, align 16 + %a264 = alloca %S.ast.Type, align 16 + %a266 = alloca %S.ast.Type, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a382 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a395 = alloca { ptr, i64, i64 }, align 16 + %a396 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a405 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a422 = alloca { ptr, i64, i64 }, align 16 + %a423 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + %a438 = alloca { ptr, i64, i64 }, align 16 + %a453 = alloca { ptr, i64, i64 }, align 16 + %a454 = alloca { ptr, i64, i64 }, align 16 + %a455 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a458 = alloca { ptr, i64, i64 }, align 16 + %a459 = alloca { ptr, i64, i64 }, align 16 + %a466 = alloca { ptr, i64, i64 }, align 16 + %a467 = alloca { ptr, i64, i64 }, align 16 + %a468 = alloca { ptr, i64, i64 }, align 16 + %a470 = alloca { ptr, i64, i64 }, align 16 + %a471 = alloca { ptr, i64, i64 }, align 16 + %a472 = alloca { ptr, i64, i64 }, align 16 + %a475 = alloca { ptr, i64, i64 }, align 16 + %a476 = alloca { ptr, i64, i64 }, align 16 + %a478 = alloca { ptr, i64, i64 }, align 16 + %a479 = alloca { ptr, i64, i64 }, align 16 + %a480 = alloca { ptr, i64, i64 }, align 16 + %a482 = alloca { ptr, i64, i64 }, align 16 + %a483 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca { ptr, i64, i64 }, align 16 + %a487 = alloca { ptr, i64, i64 }, align 16 + %a488 = alloca { ptr, i64, i64 }, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca { ptr, i64, i64 }, align 16 + %a492 = alloca { ptr, i64, i64 }, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a499 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca { ptr, i64, i64 }, align 16 + %a502 = alloca { ptr, i64, i64 }, align 16 + %a503 = alloca { ptr, i64, i64 }, align 16 + %a504 = alloca { ptr, i64, i64 }, align 16 + %a506 = alloca { ptr, i64, i64 }, align 16 + %a507 = alloca { ptr, i64, i64 }, align 16 + %a508 = alloca { ptr, i64, i64 }, align 16 + %a514 = alloca { ptr, i64, i64 }, align 16 + %a515 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a518 = alloca { ptr, i64, i64 }, align 16 + %a519 = alloca { ptr, i64, i64 }, align 16 + %a521 = alloca { ptr, i64, i64 }, align 16 + %a522 = alloca { ptr, i64, i64 }, align 16 + %a523 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic4138, label %ok4139 +panic4138: + call void @finch_panic(ptr @.str.2607, i64 1810, ptr @.str.2608) + unreachable +ok4139: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 14 + %t6 = load i64, ptr %a2 + %t7 = load { ptr, i64, i64 }, ptr %t5 + %t8 = extractvalue { ptr, i64, i64 } %t7, 1 + %t9 = icmp uge i64 %t6, %t8 + br i1 %t9, label %range4140, label %inrange4141 +range4140: + call void @finch_panic_index(ptr @.str.2609, i64 1810, i64 %t6, i64 %t8) + unreachable +inrange4141: + %t10 = extractvalue { ptr, i64, i64 } %t7, 0 + %t11 = getelementptr inbounds %S.gen.FnSig, ptr %t10, i64 %t6 + %t12 = load %S.gen.FnSig, ptr %t11 + %t13 = load ptr, ptr %a1 + %t14 = icmp eq ptr %t13, null + br i1 %t14, label %panic4142, label %ok4143 +panic4142: + call void @finch_panic(ptr @.str.2610, i64 1810, ptr @.str.2611) + unreachable +ok4143: + %t15 = getelementptr inbounds %S.gen.Gen, ptr %t13, i32 0, i32 12 + store %S.gen.FnSig %t12, ptr %a16 + call void @finch.copy.S_gen_FnSig(ptr %a17, ptr %a16) + %t18 = load %S.gen.FnSig, ptr %a17 + store %S.gen.FnSig %t18, ptr %t15 + %t19 = load ptr, ptr %a1 + %t20 = icmp eq ptr %t19, null + br i1 %t20, label %panic4144, label %ok4145 +panic4144: + call void @finch_panic(ptr @.str.2612, i64 1811, ptr @.str.2613) + unreachable +ok4145: + %t21 = getelementptr inbounds %S.gen.Gen, ptr %t19, i32 0, i32 12 + %t22 = getelementptr inbounds %S.gen.FnSig, ptr %t21, i32 0, i32 0 + %t23 = load { ptr, i64, i64 }, ptr %t22 + %t24 = load ptr, ptr %a1 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic4146, label %ok4147 +panic4146: + call void @finch_panic(ptr @.str.2614, i64 1811, ptr @.str.2615) + unreachable +ok4147: + %t26 = getelementptr inbounds %S.gen.Gen, ptr %t24, i32 0, i32 13 + store { ptr, i64, i64 } %t23, ptr %a27 + call void @finch_str_copy(ptr %a28, ptr %a27) + %t29 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } %t29, ptr %t26 + %t30 = load ptr, ptr %a1 + %t31 = icmp eq ptr %t30, null + br i1 %t31, label %panic4148, label %ok4149 +panic4148: + call void @finch_panic(ptr @.str.2616, i64 1812, ptr @.str.2617) + unreachable +ok4149: + %t32 = getelementptr inbounds %S.gen.Gen, ptr %t30, i32 0, i32 12 + %t33 = getelementptr inbounds %S.gen.FnSig, ptr %t32, i32 0, i32 6 + %t34 = load { ptr, i64, i64 }, ptr %t33 + %t35 = load ptr, ptr %a1 + %t36 = icmp eq ptr %t35, null + br i1 %t36, label %panic4150, label %ok4151 +panic4150: + call void @finch_panic(ptr @.str.2618, i64 1812, ptr @.str.2619) + unreachable +ok4151: + %t37 = getelementptr inbounds %S.gen.Gen, ptr %t35, i32 0, i32 17 + store { ptr, i64, i64 } %t34, ptr %a38 + call void @finch.copy.arr_str(ptr %a39, ptr %a38) + %t40 = load { ptr, i64, i64 }, ptr %a39 + store { ptr, i64, i64 } %t40, ptr %t37 + %t41 = load ptr, ptr %a1 + %t42 = icmp eq ptr %t41, null + br i1 %t42, label %panic4152, label %ok4153 +panic4152: + call void @finch_panic(ptr @.str.2620, i64 1813, ptr @.str.2621) + unreachable +ok4153: + %t43 = getelementptr inbounds %S.gen.Gen, ptr %t41, i32 0, i32 12 + %t44 = getelementptr inbounds %S.gen.FnSig, ptr %t43, i32 0, i32 7 + %t45 = load { ptr, i64, i64 }, ptr %t44 + %t46 = load ptr, ptr %a1 + %t47 = icmp eq ptr %t46, null + br i1 %t47, label %panic4154, label %ok4155 +panic4154: + call void @finch_panic(ptr @.str.2622, i64 1813, ptr @.str.2623) + unreachable +ok4155: + %t48 = getelementptr inbounds %S.gen.Gen, ptr %t46, i32 0, i32 18 + store { ptr, i64, i64 } %t45, ptr %a49 + call void @finch.copy.arr_S_ast_Type(ptr %a50, ptr %a49) + %t51 = load { ptr, i64, i64 }, ptr %a50 + store { ptr, i64, i64 } %t51, ptr %t48 + %t52 = load ptr, ptr %a1 + %t53 = icmp eq ptr %t52, null + br i1 %t53, label %panic4156, label %ok4157 +panic4156: + call void @finch_panic(ptr @.str.2625, i64 1814, ptr @.str.2626) + unreachable +ok4157: + %t54 = getelementptr inbounds %S.gen.Gen, ptr %t52, i32 0, i32 19 + store { ptr, i64, i64 } { ptr @.str.2624, i64 0, i64 0 }, ptr %t54 + %t55 = load ptr, ptr %a1 + %t56 = icmp eq ptr %t55, null + br i1 %t56, label %panic4158, label %ok4159 +panic4158: + call void @finch_panic(ptr @.str.2627, i64 1815, ptr @.str.2628) + unreachable +ok4159: + %t57 = getelementptr inbounds %S.gen.Gen, ptr %t55, i32 0, i32 12 + %t58 = getelementptr inbounds %S.gen.FnSig, ptr %t57, i32 0, i32 7 + %t59 = getelementptr inbounds { ptr, i64, i64 }, ptr %t58, i32 0, i32 1 + %t60 = load i64, ptr %t59 + %t61 = icmp sgt i64 %t60, 0 + br i1 %t61, label %then4160, label %endif4162 +then4160: + %t62 = load ptr, ptr %a1 + %t63 = icmp eq ptr %t62, null + br i1 %t63, label %panic4163, label %ok4164 +panic4163: + call void @finch_panic(ptr @.str.2630, i64 1816, ptr @.str.2631) + unreachable +ok4164: + %t64 = getelementptr inbounds %S.gen.Gen, ptr %t62, i32 0, i32 12 + %t65 = getelementptr inbounds %S.gen.FnSig, ptr %t64, i32 0, i32 8 + %t66 = load { ptr, i64, i64 }, ptr %t65 + store { ptr, i64, i64 } { ptr @.str.2629, i64 17, i64 0 }, ptr %a68 + store { ptr, i64, i64 } %t66, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t70, ptr %a72 + store { ptr, i64, i64 } { ptr @.str.2632, i64 1, i64 0 }, ptr %a73 + call void @finch_str_concat(ptr %a71, ptr %a72, ptr %a73) + %t74 = load { ptr, i64, i64 }, ptr %a71 + %t75 = load ptr, ptr %a1 + %t76 = icmp eq ptr %t75, null + br i1 %t76, label %panic4165, label %ok4166 +panic4165: + call void @finch_panic(ptr @.str.2633, i64 1816, ptr @.str.2634) + unreachable +ok4166: + %t77 = getelementptr inbounds %S.gen.Gen, ptr %t75, i32 0, i32 19 + store { ptr, i64, i64 } %t74, ptr %t77 + br label %endif4162 +endif4162: + %t78 = load ptr, ptr %a1 + %t79 = icmp eq ptr %t78, null + br i1 %t79, label %panic4167, label %ok4168 +panic4167: + call void @finch_panic(ptr @.str.2635, i64 1818, ptr @.str.2636) + unreachable +ok4168: + %t80 = getelementptr inbounds %S.gen.Gen, ptr %t78, i32 0, i32 0 + %t81 = load ptr, ptr %a1 + %t82 = icmp eq ptr %t81, null + br i1 %t82, label %panic4169, label %ok4170 +panic4169: + call void @finch_panic(ptr @.str.2637, i64 1818, ptr @.str.2638) + unreachable +ok4170: + %t83 = getelementptr inbounds %S.gen.Gen, ptr %t81, i32 0, i32 12 + %t84 = getelementptr inbounds %S.gen.FnSig, ptr %t83, i32 0, i32 16 + %t85 = load i64, ptr %t84 + %t86 = load { ptr, i64, i64 }, ptr %t80 + %t87 = extractvalue { ptr, i64, i64 } %t86, 1 + %t88 = icmp uge i64 %t85, %t87 + br i1 %t88, label %range4171, label %inrange4172 +range4171: + call void @finch_panic_index(ptr @.str.2639, i64 1818, i64 %t85, i64 %t87) + unreachable +inrange4172: + %t89 = extractvalue { ptr, i64, i64 } %t86, 0 + %t90 = getelementptr inbounds %S.ast.Program, ptr %t89, i64 %t85 + %t91 = getelementptr inbounds %S.ast.Program, ptr %t90, i32 0, i32 8 + %t92 = load ptr, ptr %a1 + %t93 = icmp eq ptr %t92, null + br i1 %t93, label %panic4173, label %ok4174 +panic4173: + call void @finch_panic(ptr @.str.2640, i64 1818, ptr @.str.2641) + unreachable +ok4174: + %t94 = getelementptr inbounds %S.gen.Gen, ptr %t92, i32 0, i32 12 + %t95 = getelementptr inbounds %S.gen.FnSig, ptr %t94, i32 0, i32 17 + %t96 = load i64, ptr %t95 + %t97 = load { ptr, i64, i64 }, ptr %t91 + %t98 = extractvalue { ptr, i64, i64 } %t97, 1 + %t99 = icmp uge i64 %t96, %t98 + br i1 %t99, label %range4175, label %inrange4176 +range4175: + call void @finch_panic_index(ptr @.str.2642, i64 1818, i64 %t96, i64 %t98) + unreachable +inrange4176: + %t100 = extractvalue { ptr, i64, i64 } %t97, 0 + %t101 = getelementptr inbounds %S.ast.Node, ptr %t100, i64 %t96 + %t102 = load %S.ast.Node, ptr %t101 + store %S.ast.Node %t102, ptr %a103 + call void @finch.copy.S_ast_Node(ptr %a104, ptr %a103) + %t105 = load %S.ast.Node, ptr %a104 + store %S.ast.Node %t105, ptr %a106 + store { ptr, i64, i64 } zeroinitializer, ptr %a107 + %t108 = load { ptr, i64, i64 }, ptr %a107 + %t109 = load ptr, ptr %a1 + %t110 = icmp eq ptr %t109, null + br i1 %t110, label %panic4177, label %ok4178 +panic4177: + call void @finch_panic(ptr @.str.2643, i64 1820, ptr @.str.2644) + unreachable +ok4178: + %t111 = getelementptr inbounds %S.gen.Gen, ptr %t109, i32 0, i32 4 + store { ptr, i64, i64 } %t108, ptr %a112 + call void @finch.copy.arr_str(ptr %a113, ptr %a112) + %t114 = load { ptr, i64, i64 }, ptr %a113 + store { ptr, i64, i64 } %t114, ptr %t111 + %t115 = load { ptr, i64, i64 }, ptr %a107 + %t116 = load ptr, ptr %a1 + %t117 = icmp eq ptr %t116, null + br i1 %t117, label %panic4179, label %ok4180 +panic4179: + call void @finch_panic(ptr @.str.2645, i64 1821, ptr @.str.2646) + unreachable +ok4180: + %t118 = getelementptr inbounds %S.gen.Gen, ptr %t116, i32 0, i32 5 + store { ptr, i64, i64 } %t115, ptr %a119 + call void @finch.copy.arr_str(ptr %a120, ptr %a119) + %t121 = load { ptr, i64, i64 }, ptr %a120 + store { ptr, i64, i64 } %t121, ptr %t118 + %t122 = load ptr, ptr %a1 + %t123 = icmp eq ptr %t122, null + br i1 %t123, label %panic4181, label %ok4182 +panic4181: + call void @finch_panic(ptr @.str.2647, i64 1822, ptr @.str.2648) + unreachable +ok4182: + %t124 = getelementptr inbounds %S.gen.Gen, ptr %t122, i32 0, i32 6 + store i64 0, ptr %t124 + %t125 = load ptr, ptr %a1 + %t126 = icmp eq ptr %t125, null + br i1 %t126, label %panic4183, label %ok4184 +panic4183: + call void @finch_panic(ptr @.str.2649, i64 1823, ptr @.str.2650) + unreachable +ok4184: + %t127 = getelementptr inbounds %S.gen.Gen, ptr %t125, i32 0, i32 9 + store i1 false, ptr %t127 + %t128 = load ptr, ptr %a1 + %t129 = icmp eq ptr %t128, null + br i1 %t129, label %panic4185, label %ok4186 +panic4185: + call void @finch_panic(ptr @.str.2651, i64 1824, ptr @.str.2652) + unreachable +ok4186: + %t130 = getelementptr inbounds %S.gen.Gen, ptr %t128, i32 0, i32 23 + store i64 0, ptr %t130 + %t131 = load ptr, ptr %a1 + %t132 = icmp eq ptr %t131, null + br i1 %t132, label %panic4187, label %ok4188 +panic4187: + call void @finch_panic(ptr @.str.2653, i64 1825, ptr @.str.2654) + unreachable +ok4188: + %t133 = getelementptr inbounds %S.gen.Gen, ptr %t131, i32 0, i32 32 + store i64 -1, ptr %t133 + store i64 -1, ptr %a134 + %t135 = load ptr, ptr %a1 + %t136 = icmp eq ptr %t135, null + br i1 %t136, label %panic4189, label %ok4190 +panic4189: + call void @finch_panic(ptr @.str.2655, i64 1827, ptr @.str.2656) + unreachable +ok4190: + %t137 = getelementptr inbounds %S.gen.Gen, ptr %t135, i32 0, i32 26 + %t138 = load i1, ptr %t137 + br i1 %t138, label %then4191, label %endif4193 +then4191: + %t139 = load ptr, ptr %a1 + %t140 = load %S.ast.Node, ptr %a106 + %t141 = call i64 @finch.gen.dbgSubprogram(ptr %t139, %S.ast.Node %t140) + store i64 %t141, ptr %a134 + %t142 = load i64, ptr %a134 + %t143 = load ptr, ptr %a1 + %t144 = icmp eq ptr %t143, null + br i1 %t144, label %panic4194, label %ok4195 +panic4194: + call void @finch_panic(ptr @.str.2657, i64 1829, ptr @.str.2658) + unreachable +ok4195: + %t145 = getelementptr inbounds %S.gen.Gen, ptr %t143, i32 0, i32 32 + store i64 %t142, ptr %t145 + %t146 = getelementptr inbounds %S.ast.Node, ptr %a106, i32 0, i32 11 + %t147 = load i64, ptr %t146 + %t148 = load ptr, ptr %a1 + %t149 = icmp eq ptr %t148, null + br i1 %t149, label %panic4196, label %ok4197 +panic4196: + call void @finch_panic(ptr @.str.2659, i64 1830, ptr @.str.2660) + unreachable +ok4197: + %t150 = getelementptr inbounds %S.gen.Gen, ptr %t148, i32 0, i32 33 + store i64 %t147, ptr %t150 + %t151 = getelementptr inbounds %S.ast.Node, ptr %a106, i32 0, i32 12 + %t152 = load i64, ptr %t151 + %t153 = load ptr, ptr %a1 + %t154 = icmp eq ptr %t153, null + br i1 %t154, label %panic4198, label %ok4199 +panic4198: + call void @finch_panic(ptr @.str.2661, i64 1831, ptr @.str.2662) + unreachable +ok4199: + %t155 = getelementptr inbounds %S.gen.Gen, ptr %t153, i32 0, i32 34 + store i64 %t152, ptr %t155 + br label %endif4193 +endif4193: + %t156 = load ptr, ptr %a1 + %t157 = icmp eq ptr %t156, null + br i1 %t157, label %panic4200, label %ok4201 +panic4200: + call void @finch_panic(ptr @.str.2663, i64 1833, ptr @.str.2664) + unreachable +ok4201: + %t158 = getelementptr inbounds %S.gen.Gen, ptr %t156, i32 0, i32 40 + store i1 false, ptr %t158 + %t159 = load ptr, ptr %a1 + %t160 = icmp eq ptr %t159, null + br i1 %t160, label %panic4202, label %ok4203 +panic4202: + call void @finch_panic(ptr @.str.2665, i64 1834, ptr @.str.2666) + unreachable +ok4203: + %t161 = getelementptr inbounds %S.gen.Gen, ptr %t159, i32 0, i32 42 + store i64 0, ptr %t161 + store { ptr, i64, i64 } zeroinitializer, ptr %a162 + %t163 = load { ptr, i64, i64 }, ptr %a162 + %t164 = load ptr, ptr %a1 + %t165 = icmp eq ptr %t164, null + br i1 %t165, label %panic4204, label %ok4205 +panic4204: + call void @finch_panic(ptr @.str.2667, i64 1836, ptr @.str.2668) + unreachable +ok4205: + %t166 = getelementptr inbounds %S.gen.Gen, ptr %t164, i32 0, i32 10 + store { ptr, i64, i64 } %t163, ptr %a167 + call void @finch.copy.arr_S_gen_Scope(ptr %a168, ptr %a167) + %t169 = load { ptr, i64, i64 }, ptr %a168 + store { ptr, i64, i64 } %t169, ptr %t166 + %t170 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t170) + store { ptr, i64, i64 } zeroinitializer, ptr %a171 + %t172 = load ptr, ptr %a1 + %t173 = icmp eq ptr %t172, null + br i1 %t173, label %panic4209, label %ok4210 +panic4209: + call void @finch_panic(ptr @.str.2669, i64 1839, ptr @.str.2670) + unreachable +ok4210: + %t174 = getelementptr inbounds %S.gen.Gen, ptr %t172, i32 0, i32 12 + %t175 = getelementptr inbounds %S.gen.FnSig, ptr %t174, i32 0, i32 2 + %t176 = getelementptr inbounds { ptr, i64, i64 }, ptr %t175, i32 0, i32 1 + %t177 = load i64, ptr %t176 + %t178 = icmp sgt i64 %t177, 0 + br i1 %t178, label %then4211, label %endif4213 +then4211: + %t179 = getelementptr inbounds { ptr, i64, i64 }, ptr %a171, i32 0, i32 1 + %t180 = load i64, ptr %t179 + %t181 = add i64 %t180, 1 + call void @finch_arr_reserve(ptr %a171, i64 %t181, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t182 = load ptr, ptr %a171 + %t183 = getelementptr inbounds { ptr, i64, i64 }, ptr %t182, i64 %t180 + store { ptr, i64, i64 } { ptr @.str.2671, i64 9, i64 0 }, ptr %t183 + store i64 %t181, ptr %t179 + store { ptr, i64, i64 } { ptr @.str.2672, i64 6, i64 0 }, ptr %a184 + %t185 = load ptr, ptr %a1 + %t186 = icmp eq ptr %t185, null + br i1 %t186, label %panic4214, label %ok4215 +panic4214: + call void @finch_panic(ptr @.str.2673, i64 1843, ptr @.str.2674) + unreachable +ok4215: + %t187 = getelementptr inbounds %S.gen.Gen, ptr %t185, i32 0, i32 12 + %t188 = getelementptr inbounds %S.gen.FnSig, ptr %t187, i32 0, i32 4 + %t189 = load i1, ptr %t188 + br i1 %t189, label %then4216, label %endif4218 +then4216: + store { ptr, i64, i64 } { ptr @.str.2675, i64 4, i64 0 }, ptr %a184 + br label %endif4218 +endif4218: + %t190 = load { ptr, i64, i64 }, ptr %a184 + store { ptr, i64, i64 } %t190, ptr %a191 + call void @finch_str_copy(ptr %a192, ptr %a191) + %t193 = load { ptr, i64, i64 }, ptr %a192 + %t194 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } %t193, 0 + %t195 = load ptr, ptr %a1 + %t196 = icmp eq ptr %t195, null + br i1 %t196, label %panic4219, label %ok4220 +panic4219: + call void @finch_panic(ptr @.str.2676, i64 1846, ptr @.str.2677) + unreachable +ok4220: + %t197 = getelementptr inbounds %S.gen.Gen, ptr %t195, i32 0, i32 12 + %t198 = getelementptr inbounds %S.gen.FnSig, ptr %t197, i32 0, i32 2 + %t199 = load { ptr, i64, i64 }, ptr %t198 + store { ptr, i64, i64 } %t199, ptr %a200 + call void @finch_str_copy(ptr %a201, ptr %a200) + %t202 = load { ptr, i64, i64 }, ptr %a201 + %t203 = insertvalue %S.ast.Type %t194, { ptr, i64, i64 } %t202, 2 + %t204 = load ptr, ptr %a1 + %t205 = icmp eq ptr %t204, null + br i1 %t205, label %panic4221, label %ok4222 +panic4221: + call void @finch_panic(ptr @.str.2678, i64 1846, ptr @.str.2679) + unreachable +ok4222: + %t206 = getelementptr inbounds %S.gen.Gen, ptr %t204, i32 0, i32 12 + %t207 = getelementptr inbounds %S.gen.FnSig, ptr %t206, i32 0, i32 3 + %t208 = load { ptr, i64, i64 }, ptr %t207 + store { ptr, i64, i64 } %t208, ptr %a209 + call void @finch_str_copy(ptr %a210, ptr %a209) + %t211 = load { ptr, i64, i64 }, ptr %a210 + %t212 = insertvalue %S.ast.Type %t203, { ptr, i64, i64 } %t211, 3 + store %S.ast.Type %t212, ptr %a213 + %t214 = load ptr, ptr %a1 + %t215 = icmp eq ptr %t214, null + br i1 %t215, label %panic4223, label %ok4224 +panic4223: + call void @finch_panic(ptr @.str.2680, i64 1847, ptr @.str.2681) + unreachable +ok4224: + %t216 = getelementptr inbounds %S.gen.Gen, ptr %t214, i32 0, i32 10 + %t217 = load { ptr, i64, i64 }, ptr %t216 + %t218 = extractvalue { ptr, i64, i64 } %t217, 1 + %t219 = icmp uge i64 0, %t218 + br i1 %t219, label %range4225, label %inrange4226 +range4225: + call void @finch_panic_index(ptr @.str.2682, i64 1847, i64 0, i64 %t218) + unreachable +inrange4226: + %t220 = extractvalue { ptr, i64, i64 } %t217, 0 + %t221 = getelementptr inbounds %S.gen.Scope, ptr %t220, i64 0 + %t222 = getelementptr inbounds %S.gen.Scope, ptr %t221, i32 0, i32 0 + %t223 = getelementptr inbounds { ptr, i64, i64 }, ptr %t222, i32 0, i32 1 + %t224 = insertvalue %S.gen.Var zeroinitializer, { ptr, i64, i64 } { ptr @.str.2683, i64 4, i64 0 }, 0 + %t225 = load %S.ast.Type, ptr %a213 + store %S.ast.Type %t225, ptr %a226 + call void @finch.copy.S_ast_Type(ptr %a227, ptr %a226) + %t228 = load %S.ast.Type, ptr %a227 + %t229 = insertvalue %S.gen.Var %t224, %S.ast.Type %t228, 1 + %t230 = insertvalue %S.gen.Var %t229, { ptr, i64, i64 } { ptr @.str.2684, i64 5, i64 0 }, 2 + %t231 = insertvalue %S.gen.Var %t230, i1 false, 3 + %t232 = load i64, ptr %t223 + %t233 = add i64 %t232, 1 + call void @finch_arr_reserve(ptr %t222, i64 %t233, i64 ptrtoint (ptr getelementptr (%S.gen.Var, ptr null, i32 1) to i64)) + %t234 = load ptr, ptr %t222 + %t235 = getelementptr inbounds %S.gen.Var, ptr %t234, i64 %t232 + store %S.gen.Var %t231, ptr %t235 + store i64 %t233, ptr %t223 + %t236 = load ptr, ptr %a1 + %t237 = icmp eq ptr %t236, null + br i1 %t237, label %panic4227, label %ok4228 +panic4227: + call void @finch_panic(ptr @.str.2685, i64 1848, ptr @.str.2686) + unreachable +ok4228: + %t238 = getelementptr inbounds %S.gen.Gen, ptr %t236, i32 0, i32 26 + %t239 = load i1, ptr %t238 + br i1 %t239, label %then4229, label %endif4231 +then4229: + %t240 = load ptr, ptr %a1 + %t241 = load %S.ast.Node, ptr %a106 + %t242 = load %S.ast.Type, ptr %a213 + call void @finch.gen.dbgVariable(ptr %t240, %S.ast.Node %t241, { ptr, i64, i64 } { ptr @.str.2687, i64 4, i64 0 }, %S.ast.Type %t242, { ptr, i64, i64 } { ptr @.str.2688, i64 5, i64 0 }) + br label %endif4231 +endif4231: + br label %endif4213 +endif4213: + %t243 = load ptr, ptr %a1 + %t244 = icmp eq ptr %t243, null + br i1 %t244, label %panic4232, label %ok4233 +panic4232: + call void @finch_panic(ptr @.str.2689, i64 1853, ptr @.str.2690) + unreachable +ok4233: + %t245 = getelementptr inbounds %S.gen.Gen, ptr %t243, i32 0, i32 12 + %t246 = getelementptr inbounds %S.gen.FnSig, ptr %t245, i32 0, i32 13 + %t247 = getelementptr inbounds { ptr, i64, i64 }, ptr %t246, i32 0, i32 1 + %t248 = load i64, ptr %t247 + store i64 0, ptr %a249 + br label %for.cond4234 +for.cond4234: + %t250 = load i64, ptr %a249 + %t251 = icmp slt i64 %t250, %t248 + br i1 %t251, label %for.body4235, label %for.end4237 +for.body4235: + %t252 = load ptr, ptr %a1 + %t253 = icmp eq ptr %t252, null + br i1 %t253, label %panic4238, label %ok4239 +panic4238: + call void @finch_panic(ptr @.str.2691, i64 1854, ptr @.str.2692) + unreachable +ok4239: + %t254 = getelementptr inbounds %S.gen.Gen, ptr %t252, i32 0, i32 12 + %t255 = getelementptr inbounds %S.gen.FnSig, ptr %t254, i32 0, i32 13 + %t256 = load i64, ptr %a249 + %t257 = load { ptr, i64, i64 }, ptr %t255 + %t258 = extractvalue { ptr, i64, i64 } %t257, 1 + %t259 = icmp uge i64 %t256, %t258 + br i1 %t259, label %range4240, label %inrange4241 +range4240: + call void @finch_panic_index(ptr @.str.2693, i64 1854, i64 %t256, i64 %t258) + unreachable +inrange4241: + %t260 = extractvalue { ptr, i64, i64 } %t257, 0 + %t261 = getelementptr inbounds %S.ast.Type, ptr %t260, i64 %t256 + %t262 = load %S.ast.Type, ptr %t261 + store %S.ast.Type %t262, ptr %a263 + call void @finch.copy.S_ast_Type(ptr %a264, ptr %a263) + %t265 = load %S.ast.Type, ptr %a264 + store %S.ast.Type %t265, ptr %a266 + %t267 = getelementptr inbounds { ptr, i64, i64 }, ptr %a171, i32 0, i32 1 + %t268 = load ptr, ptr %a1 + %t269 = load %S.ast.Type, ptr %a266 + %t270 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t268, %S.ast.Type %t269) + store { ptr, i64, i64 } %t270, ptr %a272 + store { ptr, i64, i64 } { ptr @.str.2694, i64 3, i64 0 }, ptr %a273 + call void @finch_str_concat(ptr %a271, ptr %a272, ptr %a273) + %t274 = load { ptr, i64, i64 }, ptr %a271 + %t275 = load i64, ptr %a249 + call void @finch_str_from_int(ptr %a276, i64 %t275) + %t277 = load { ptr, i64, i64 }, ptr %a276 + store { ptr, i64, i64 } %t274, ptr %a279 + store { ptr, i64, i64 } %t277, ptr %a280 + call void @finch_str_concat(ptr %a278, ptr %a279, ptr %a280) + %t281 = load { ptr, i64, i64 }, ptr %a278 + %t282 = load i64, ptr %t267 + %t283 = add i64 %t282, 1 + call void @finch_arr_reserve(ptr %a171, i64 %t283, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t284 = load ptr, ptr %a171 + %t285 = getelementptr inbounds { ptr, i64, i64 }, ptr %t284, i64 %t282 + store { ptr, i64, i64 } %t281, ptr %t285 + store i64 %t283, ptr %t267 + %t286 = load i64, ptr %a249 + call void @finch_str_from_int(ptr %a287, i64 %t286) + %t288 = load { ptr, i64, i64 }, ptr %a287 + store { ptr, i64, i64 } { ptr @.str.2695, i64 2, i64 0 }, ptr %a290 + store { ptr, i64, i64 } %t288, ptr %a291 + call void @finch_str_concat(ptr %a289, ptr %a290, ptr %a291) + %t292 = load { ptr, i64, i64 }, ptr %a289 + store { ptr, i64, i64 } %t292, ptr %a293 + %t294 = load ptr, ptr %a1 + %t295 = load %S.ast.Type, ptr %a266 + %t296 = call i1 @finch.gen.owning(ptr %t294, %S.ast.Type %t295) + br label %logic.from4242 +logic.from4242: + br i1 %t296, label %logic.rhs4243, label %logic.end4244 +logic.rhs4243: + %t297 = load ptr, ptr %a1 + %t298 = icmp eq ptr %t297, null + br i1 %t298, label %panic4245, label %ok4246 +panic4245: + call void @finch_panic(ptr @.str.2696, i64 1857, ptr @.str.2697) + unreachable +ok4246: + %t299 = getelementptr inbounds %S.gen.Gen, ptr %t297, i32 0, i32 12 + %t300 = getelementptr inbounds %S.gen.FnSig, ptr %t299, i32 0, i32 15 + %t301 = load i64, ptr %a249 + %t302 = load { ptr, i64, i64 }, ptr %t300 + %t303 = extractvalue { ptr, i64, i64 } %t302, 1 + %t304 = icmp uge i64 %t301, %t303 + br i1 %t304, label %range4247, label %inrange4248 +range4247: + call void @finch_panic_index(ptr @.str.2698, i64 1857, i64 %t301, i64 %t303) + unreachable +inrange4248: + %t305 = extractvalue { ptr, i64, i64 } %t302, 0 + %t306 = getelementptr inbounds i1, ptr %t305, i64 %t301 + %t307 = load i1, ptr %t306 + %t308 = xor i1 %t307, true + br label %logic.rend4249 +logic.rend4249: + br label %logic.end4244 +logic.end4244: + %t309 = phi i1 [ false, %logic.from4242 ], [ %t308, %logic.rend4249 ] + br i1 %t309, label %then4250, label %endif4252 +then4250: + %t310 = load ptr, ptr %a1 + %t311 = load { ptr, i64, i64 }, ptr %a293 + %t312 = load %S.ast.Type, ptr %a266 + %t313 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t310, { ptr, i64, i64 } %t311, %S.ast.Type %t312) + store { ptr, i64, i64 } %t313, ptr %a293 + br label %endif4252 +endif4252: + %t314 = load i64, ptr %a249 + %t315 = add i64 %t314, 1 + %t316 = load ptr, ptr %a1 + %t317 = icmp eq ptr %t316, null + br i1 %t317, label %panic4253, label %ok4254 +panic4253: + call void @finch_panic(ptr @.str.2699, i64 1860, ptr @.str.2700) + unreachable +ok4254: + %t318 = getelementptr inbounds %S.gen.Gen, ptr %t316, i32 0, i32 35 + store i64 %t315, ptr %t318 + %t319 = load ptr, ptr %a1 + %t320 = icmp eq ptr %t319, null + br i1 %t320, label %panic4255, label %ok4256 +panic4255: + call void @finch_panic(ptr @.str.2701, i64 1861, ptr @.str.2702) + unreachable +ok4256: + %t321 = getelementptr inbounds %S.gen.Gen, ptr %t319, i32 0, i32 12 + %t322 = getelementptr inbounds %S.gen.FnSig, ptr %t321, i32 0, i32 2 + %t323 = getelementptr inbounds { ptr, i64, i64 }, ptr %t322, i32 0, i32 1 + %t324 = load i64, ptr %t323 + %t325 = icmp sgt i64 %t324, 0 + br i1 %t325, label %then4257, label %endif4259 +then4257: + %t326 = load i64, ptr %a249 + %t327 = add i64 %t326, 2 + %t328 = load ptr, ptr %a1 + %t329 = icmp eq ptr %t328, null + br i1 %t329, label %panic4260, label %ok4261 +panic4260: + call void @finch_panic(ptr @.str.2703, i64 1862, ptr @.str.2704) + unreachable +ok4261: + %t330 = getelementptr inbounds %S.gen.Gen, ptr %t328, i32 0, i32 35 + store i64 %t327, ptr %t330 + br label %endif4259 +endif4259: + %t331 = load ptr, ptr %a1 + %t332 = getelementptr inbounds %S.ast.Node, ptr %a106, i32 0, i32 9 + %t333 = load i64, ptr %a249 + %t334 = load { ptr, i64, i64 }, ptr %t332 + %t335 = extractvalue { ptr, i64, i64 } %t334, 1 + %t336 = icmp uge i64 %t333, %t335 + br i1 %t336, label %range4262, label %inrange4263 +range4262: + call void @finch_panic_index(ptr @.str.2705, i64 1864, i64 %t333, i64 %t335) + unreachable +inrange4263: + %t337 = extractvalue { ptr, i64, i64 } %t334, 0 + %t338 = getelementptr inbounds %S.ast.Node, ptr %t337, i64 %t333 + %t339 = load %S.ast.Node, ptr %t338 + %t340 = load ptr, ptr %a1 + %t341 = icmp eq ptr %t340, null + br i1 %t341, label %panic4264, label %ok4265 +panic4264: + call void @finch_panic(ptr @.str.2706, i64 1864, ptr @.str.2707) + unreachable +ok4265: + %t342 = getelementptr inbounds %S.gen.Gen, ptr %t340, i32 0, i32 12 + %t343 = getelementptr inbounds %S.gen.FnSig, ptr %t342, i32 0, i32 14 + %t344 = load i64, ptr %a249 + %t345 = load { ptr, i64, i64 }, ptr %t343 + %t346 = extractvalue { ptr, i64, i64 } %t345, 1 + %t347 = icmp uge i64 %t344, %t346 + br i1 %t347, label %range4266, label %inrange4267 +range4266: + call void @finch_panic_index(ptr @.str.2708, i64 1864, i64 %t344, i64 %t346) + unreachable +inrange4267: + %t348 = extractvalue { ptr, i64, i64 } %t345, 0 + %t349 = getelementptr inbounds { ptr, i64, i64 }, ptr %t348, i64 %t344 + %t350 = load { ptr, i64, i64 }, ptr %t349 + %t351 = load %S.ast.Type, ptr %a266 + %t352 = load { ptr, i64, i64 }, ptr %a293 + %t353 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t331, %S.ast.Node %t339, { ptr, i64, i64 } %t350, %S.ast.Type %t351, { ptr, i64, i64 } %t352, i1 false) + %t354 = load ptr, ptr %a1 + %t355 = icmp eq ptr %t354, null + br i1 %t355, label %panic4268, label %ok4269 +panic4268: + call void @finch_panic(ptr @.str.2709, i64 1865, ptr @.str.2710) + unreachable +ok4269: + %t356 = getelementptr inbounds %S.gen.Gen, ptr %t354, i32 0, i32 35 + store i64 0, ptr %t356 + br label %for.step4236 +for.step4236: + %t357 = load i64, ptr %a249 + %t358 = add i64 %t357, 1 + store i64 %t358, ptr %a249 + br label %for.cond4234 +for.end4237: + %t359 = load ptr, ptr %a1 + %t360 = getelementptr inbounds %S.ast.Node, ptr %a106, i32 0, i32 9 + %t361 = getelementptr inbounds %S.ast.Node, ptr %a106, i32 0, i32 9 + %t362 = getelementptr inbounds { ptr, i64, i64 }, ptr %t361, i32 0, i32 1 + %t363 = load i64, ptr %t362 + %t364 = sub i64 %t363, 1 + %t365 = load { ptr, i64, i64 }, ptr %t360 + %t366 = extractvalue { ptr, i64, i64 } %t365, 1 + %t367 = icmp uge i64 %t364, %t366 + br i1 %t367, label %range4270, label %inrange4271 +range4270: + call void @finch_panic_index(ptr @.str.2711, i64 1867, i64 %t364, i64 %t366) + unreachable +inrange4271: + %t368 = extractvalue { ptr, i64, i64 } %t365, 0 + %t369 = getelementptr inbounds %S.ast.Node, ptr %t368, i64 %t364 + %t370 = load %S.ast.Node, ptr %t369 + call void @finch.gen.block(ptr %t359, %S.ast.Node %t370, i1 false) + %t371 = load ptr, ptr %a1 + %t372 = icmp eq ptr %t371, null + br i1 %t372, label %panic4272, label %ok4273 +panic4272: + call void @finch_panic(ptr @.str.2712, i64 1868, ptr @.str.2713) + unreachable +ok4273: + %t373 = getelementptr inbounds %S.gen.Gen, ptr %t371, i32 0, i32 9 + %t374 = load i1, ptr %t373 + %t375 = xor i1 %t374, true + br i1 %t375, label %then4274, label %endif4276 +then4274: + %t376 = load ptr, ptr %a1 + %t377 = icmp eq ptr %t376, null + br i1 %t377, label %panic4277, label %ok4278 +panic4277: + call void @finch_panic(ptr @.str.2714, i64 1869, ptr @.str.2715) + unreachable +ok4278: + %t378 = getelementptr inbounds %S.gen.Gen, ptr %t376, i32 0, i32 12 + %t379 = getelementptr inbounds %S.gen.FnSig, ptr %t378, i32 0, i32 12 + %t380 = getelementptr inbounds %S.ast.Type, ptr %t379, i32 0, i32 0 + %t381 = load { ptr, i64, i64 }, ptr %t380 + store { ptr, i64, i64 } %t381, ptr %a382 + store { ptr, i64, i64 } { ptr @.str.2716, i64 4, i64 0 }, ptr %a383 + %t384 = call i32 @finch_str_eq(ptr %a382, ptr %a383) + %t385 = icmp eq i32 %t384, 0 + br i1 %t385, label %then4279, label %endif4281 +then4279: + %t386 = load ptr, ptr %a1 + %t387 = load %S.ast.Node, ptr %a106 + %t388 = getelementptr inbounds %S.ast.Node, ptr %a106, i32 0, i32 1 + %t389 = load { ptr, i64, i64 }, ptr %t388 + store { ptr, i64, i64 } { ptr @.str.2717, i64 10, i64 0 }, ptr %a391 + store { ptr, i64, i64 } %t389, ptr %a392 + call void @finch_str_concat(ptr %a390, ptr %a391, ptr %a392) + %t393 = load { ptr, i64, i64 }, ptr %a390 + store { ptr, i64, i64 } %t393, ptr %a395 + store { ptr, i64, i64 } { ptr @.str.2718, i64 38, i64 0 }, ptr %a396 + call void @finch_str_concat(ptr %a394, ptr %a395, ptr %a396) + %t397 = load { ptr, i64, i64 }, ptr %a394 + %t398 = load ptr, ptr %a1 + %t399 = icmp eq ptr %t398, null + br i1 %t399, label %panic4282, label %ok4283 +panic4282: + call void @finch_panic(ptr @.str.2719, i64 1870, ptr @.str.2720) + unreachable +ok4283: + %t400 = getelementptr inbounds %S.gen.Gen, ptr %t398, i32 0, i32 12 + %t401 = getelementptr inbounds %S.gen.FnSig, ptr %t400, i32 0, i32 12 + %t402 = load %S.ast.Type, ptr %t401 + %t403 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t402) + store { ptr, i64, i64 } %t397, ptr %a405 + store { ptr, i64, i64 } %t403, ptr %a406 + call void @finch_str_concat(ptr %a404, ptr %a405, ptr %a406) + %t407 = load { ptr, i64, i64 }, ptr %a404 + call void @finch.gen.fail(ptr %t386, %S.ast.Node %t387, { ptr, i64, i64 } %t407) + br label %endif4281 +endif4281: + %t408 = load ptr, ptr %a1 + call void @finch.gen.runDefers(ptr %t408, i64 0) + %t409 = load ptr, ptr %a1 + %t410 = icmp eq ptr %t409, null + br i1 %t410, label %panic4284, label %ok4285 +panic4284: + call void @finch_panic(ptr @.str.2721, i64 1873, ptr @.str.2722) + unreachable +ok4285: + %t411 = getelementptr inbounds %S.gen.Gen, ptr %t409, i32 0, i32 12 + %t412 = getelementptr inbounds %S.gen.FnSig, ptr %t411, i32 0, i32 9 + %t413 = load i1, ptr %t412 + br i1 %t413, label %then4286, label %else4287 +then4286: + %t414 = load ptr, ptr %a1 + %t415 = load ptr, ptr %a1 + %t416 = load ptr, ptr %a1 + %t417 = icmp eq ptr %t416, null + br i1 %t417, label %panic4289, label %ok4290 +panic4289: + call void @finch_panic(ptr @.str.2724, i64 1874, ptr @.str.2725) + unreachable +ok4290: + %t418 = getelementptr inbounds %S.gen.Gen, ptr %t416, i32 0, i32 12 + %t419 = load %S.gen.FnSig, ptr %t418 + %t420 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t415, %S.gen.FnSig %t419) + store { ptr, i64, i64 } { ptr @.str.2723, i64 4, i64 0 }, ptr %a422 + store { ptr, i64, i64 } %t420, ptr %a423 + call void @finch_str_concat(ptr %a421, ptr %a422, ptr %a423) + %t424 = load { ptr, i64, i64 }, ptr %a421 + store { ptr, i64, i64 } %t424, ptr %a426 + store { ptr, i64, i64 } { ptr @.str.2726, i64 53, i64 0 }, ptr %a427 + call void @finch_str_concat(ptr %a425, ptr %a426, ptr %a427) + %t428 = load { ptr, i64, i64 }, ptr %a425 + call void @finch.gen.emit(ptr %t414, { ptr, i64, i64 } %t428) + br label %endif4288 +else4287: + %t429 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t429, { ptr, i64, i64 } { ptr @.str.2727, i64 8, i64 0 }) + br label %endif4288 +endif4288: + br label %endif4276 +endif4276: + store { ptr, i64, i64 } { ptr @.str.2728, i64 0, i64 0 }, ptr %a430 + %t431 = load i64, ptr %a134 + %t432 = icmp sge i64 %t431, 0 + br i1 %t432, label %then4291, label %endif4293 +then4291: + %t433 = load i64, ptr %a134 + call void @finch_str_from_int(ptr %a434, i64 %t433) + %t435 = load { ptr, i64, i64 }, ptr %a434 + store { ptr, i64, i64 } { ptr @.str.2729, i64 7, i64 0 }, ptr %a437 + store { ptr, i64, i64 } %t435, ptr %a438 + call void @finch_str_concat(ptr %a436, ptr %a437, ptr %a438) + %t439 = load { ptr, i64, i64 }, ptr %a436 + store { ptr, i64, i64 } %t439, ptr %a430 + br label %endif4293 +endif4293: + %t440 = load ptr, ptr %a1 + %t441 = icmp eq ptr %t440, null + br i1 %t441, label %panic4294, label %ok4295 +panic4294: + call void @finch_panic(ptr @.str.2730, i64 1883, ptr @.str.2731) + unreachable +ok4295: + %t442 = getelementptr inbounds %S.gen.Gen, ptr %t440, i32 0, i32 32 + store i64 -1, ptr %t442 + %t443 = load ptr, ptr %a1 + %t444 = icmp eq ptr %t443, null + br i1 %t444, label %panic4296, label %ok4297 +panic4296: + call void @finch_panic(ptr @.str.2732, i64 1884, ptr @.str.2733) + unreachable +ok4297: + %t445 = getelementptr inbounds %S.gen.Gen, ptr %t443, i32 0, i32 3 + %t446 = getelementptr inbounds { ptr, i64, i64 }, ptr %t445, i32 0, i32 1 + %t447 = load ptr, ptr %a1 + %t448 = load ptr, ptr %a1 + %t449 = icmp eq ptr %t448, null + br i1 %t449, label %panic4298, label %ok4299 +panic4298: + call void @finch_panic(ptr @.str.2735, i64 1884, ptr @.str.2736) + unreachable +ok4299: + %t450 = getelementptr inbounds %S.gen.Gen, ptr %t448, i32 0, i32 12 + %t451 = load %S.gen.FnSig, ptr %t450 + %t452 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t447, %S.gen.FnSig %t451) + store { ptr, i64, i64 } { ptr @.str.2734, i64 16, i64 0 }, ptr %a454 + store { ptr, i64, i64 } %t452, ptr %a455 + call void @finch_str_concat(ptr %a453, ptr %a454, ptr %a455) + %t456 = load { ptr, i64, i64 }, ptr %a453 + store { ptr, i64, i64 } %t456, ptr %a458 + store { ptr, i64, i64 } { ptr @.str.2737, i64 1, i64 0 }, ptr %a459 + call void @finch_str_concat(ptr %a457, ptr %a458, ptr %a459) + %t460 = load { ptr, i64, i64 }, ptr %a457 + %t461 = load ptr, ptr %a1 + %t462 = icmp eq ptr %t461, null + br i1 %t462, label %panic4300, label %ok4301 +panic4300: + call void @finch_panic(ptr @.str.2738, i64 1884, ptr @.str.2739) + unreachable +ok4301: + %t463 = getelementptr inbounds %S.gen.Gen, ptr %t461, i32 0, i32 12 + %t464 = getelementptr inbounds %S.gen.FnSig, ptr %t463, i32 0, i32 11 + %t465 = load { ptr, i64, i64 }, ptr %t464 + store { ptr, i64, i64 } %t460, ptr %a467 + store { ptr, i64, i64 } %t465, ptr %a468 + call void @finch_str_concat(ptr %a466, ptr %a467, ptr %a468) + %t469 = load { ptr, i64, i64 }, ptr %a466 + store { ptr, i64, i64 } %t469, ptr %a471 + store { ptr, i64, i64 } { ptr @.str.2740, i64 1, i64 0 }, ptr %a472 + call void @finch_str_concat(ptr %a470, ptr %a471, ptr %a472) + %t473 = load { ptr, i64, i64 }, ptr %a470 + %t474 = getelementptr inbounds { ptr, i64, i64 }, ptr %a171, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2741, i64 2, i64 0 }, ptr %a475 + call void @finch_str_join(ptr %a476, ptr %a171, ptr %a475) + %t477 = load { ptr, i64, i64 }, ptr %a476 + store { ptr, i64, i64 } %t473, ptr %a479 + store { ptr, i64, i64 } %t477, ptr %a480 + call void @finch_str_concat(ptr %a478, ptr %a479, ptr %a480) + %t481 = load { ptr, i64, i64 }, ptr %a478 + store { ptr, i64, i64 } %t481, ptr %a483 + store { ptr, i64, i64 } { ptr @.str.2742, i64 1, i64 0 }, ptr %a484 + call void @finch_str_concat(ptr %a482, ptr %a483, ptr %a484) + %t485 = load { ptr, i64, i64 }, ptr %a482 + %t486 = load { ptr, i64, i64 }, ptr %a430 + store { ptr, i64, i64 } %t485, ptr %a488 + store { ptr, i64, i64 } %t486, ptr %a489 + call void @finch_str_concat(ptr %a487, ptr %a488, ptr %a489) + %t490 = load { ptr, i64, i64 }, ptr %a487 + store { ptr, i64, i64 } %t490, ptr %a492 + store { ptr, i64, i64 } { ptr @.str.2743, i64 10, i64 0 }, ptr %a493 + call void @finch_str_concat(ptr %a491, ptr %a492, ptr %a493) + %t494 = load { ptr, i64, i64 }, ptr %a491 + %t495 = load ptr, ptr %a1 + %t496 = icmp eq ptr %t495, null + br i1 %t496, label %panic4302, label %ok4303 +panic4302: + call void @finch_panic(ptr @.str.2744, i64 1885, ptr @.str.2745) + unreachable +ok4303: + %t497 = getelementptr inbounds %S.gen.Gen, ptr %t495, i32 0, i32 5 + %t498 = getelementptr inbounds { ptr, i64, i64 }, ptr %t497, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2746, i64 1, i64 0 }, ptr %a499 + call void @finch_str_join(ptr %a500, ptr %t497, ptr %a499) + %t501 = load { ptr, i64, i64 }, ptr %a500 + store { ptr, i64, i64 } %t494, ptr %a503 + store { ptr, i64, i64 } %t501, ptr %a504 + call void @finch_str_concat(ptr %a502, ptr %a503, ptr %a504) + %t505 = load { ptr, i64, i64 }, ptr %a502 + store { ptr, i64, i64 } %t505, ptr %a507 + store { ptr, i64, i64 } { ptr @.str.2747, i64 1, i64 0 }, ptr %a508 + call void @finch_str_concat(ptr %a506, ptr %a507, ptr %a508) + %t509 = load { ptr, i64, i64 }, ptr %a506 + %t510 = load ptr, ptr %a1 + %t511 = icmp eq ptr %t510, null + br i1 %t511, label %panic4304, label %ok4305 +panic4304: + call void @finch_panic(ptr @.str.2748, i64 1885, ptr @.str.2749) + unreachable +ok4305: + %t512 = getelementptr inbounds %S.gen.Gen, ptr %t510, i32 0, i32 4 + %t513 = getelementptr inbounds { ptr, i64, i64 }, ptr %t512, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.2750, i64 1, i64 0 }, ptr %a514 + call void @finch_str_join(ptr %a515, ptr %t512, ptr %a514) + %t516 = load { ptr, i64, i64 }, ptr %a515 + store { ptr, i64, i64 } %t509, ptr %a518 + store { ptr, i64, i64 } %t516, ptr %a519 + call void @finch_str_concat(ptr %a517, ptr %a518, ptr %a519) + %t520 = load { ptr, i64, i64 }, ptr %a517 + store { ptr, i64, i64 } %t520, ptr %a522 + store { ptr, i64, i64 } { ptr @.str.2751, i64 3, i64 0 }, ptr %a523 + call void @finch_str_concat(ptr %a521, ptr %a522, ptr %a523) + %t524 = load { ptr, i64, i64 }, ptr %a521 + %t525 = load i64, ptr %t446 + %t526 = add i64 %t525, 1 + call void @finch_arr_reserve(ptr %t445, i64 %t526, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t527 = load ptr, ptr %t445 + %t528 = getelementptr inbounds { ptr, i64, i64 }, ptr %t527, i64 %t525 + store { ptr, i64, i64 } %t524, ptr %t528 + store i64 %t526, ptr %t446 + ret void +} + +define internal void @finch.gen.block(ptr %p0, %S.ast.Node %p1, i1 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i1, align 16 + %a7 = alloca i64, align 16 + %a15 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i1 %p2, ptr %a3 + %t4 = load i1, ptr %a3 + br i1 %t4, label %then4306, label %endif4308 +then4306: + %t5 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t5) + br label %endif4308 +endif4308: + %t6 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + store i64 0, ptr %a7 + br label %each.cond4309 +each.cond4309: + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t6, i32 0, i32 1 + %t9 = load i64, ptr %t8 + %t10 = load i64, ptr %a7 + %t11 = icmp slt i64 %t10, %t9 + br i1 %t11, label %each.body4310, label %each.end4312 +each.body4310: + %t12 = load ptr, ptr %t6 + %t13 = getelementptr inbounds %S.ast.Node, ptr %t12, i64 %t10 + %t14 = load %S.ast.Node, ptr %t13 + store %S.ast.Node %t14, ptr %a15 + %t16 = load ptr, ptr %a1 + %t17 = icmp eq ptr %t16, null + br i1 %t17, label %panic4313, label %ok4314 +panic4313: + call void @finch_panic(ptr @.str.2752, i64 1895, ptr @.str.2753) + unreachable +ok4314: + %t18 = getelementptr inbounds %S.gen.Gen, ptr %t16, i32 0, i32 9 + %t19 = load i1, ptr %t18 + br i1 %t19, label %then4315, label %endif4317 +then4315: + %t20 = load ptr, ptr %a1 + %t21 = load %S.ast.Node, ptr %a15 + call void @finch.gen.fail(ptr %t20, %S.ast.Node %t21, { ptr, i64, i64 } { ptr @.str.2754, i64 66, i64 0 }) + br label %endif4317 +endif4317: + %t22 = load ptr, ptr %a1 + %t23 = load %S.ast.Node, ptr %a15 + call void @finch.gen.stmt(ptr %t22, %S.ast.Node %t23) + br label %each.step4311 +each.step4311: + %t24 = load i64, ptr %a7 + %t25 = add i64 %t24, 1 + store i64 %t25, ptr %a7 + br label %each.cond4309 +each.end4312: + %t26 = load i1, ptr %a3 + br i1 %t26, label %then4318, label %endif4320 +then4318: + %t27 = load ptr, ptr %a1 + call void @finch.gen.endScope(ptr %t27) + br label %endif4320 +endif4320: + ret void +} + +define internal void @finch.copy.S_gen_Loop(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Loop, ptr %src + store %S.gen.Loop %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Loop, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Loop, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Loop, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Loop, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + ret void +} + +define internal void @finch.gen.stmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca i64, align 16 + %a155 = alloca %S.ast.Node, align 16 + %a156 = alloca %S.ast.Node, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca %S.gen.Loop, align 16 + %a233 = alloca %S.gen.Loop, align 16 + %a235 = alloca %S.gen.Loop, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t4 = load i64, ptr %t3 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic4321, label %ok4322 +panic4321: + call void @finch_panic(ptr @.str.2755, i64 1906, ptr @.str.2756) + unreachable +ok4322: + %t7 = getelementptr inbounds %S.gen.Gen, ptr %t5, i32 0, i32 33 + store i64 %t4, ptr %t7 + %t8 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 12 + %t9 = load i64, ptr %t8 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic4323, label %ok4324 +panic4323: + call void @finch_panic(ptr @.str.2757, i64 1907, ptr @.str.2758) + unreachable +ok4324: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 34 + store i64 %t9, ptr %t12 + %t13 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t14 = load { ptr, i64, i64 }, ptr %t13 + store { ptr, i64, i64 } %t14, ptr %a15 + call void @finch_str_copy(ptr %a16, ptr %a15) + %t17 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t17, ptr %a18 + %t19 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.2759, i64 5, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br i1 %t23, label %then4325, label %else4326 +then4325: + %t24 = load ptr, ptr %a1 + %t25 = load %S.ast.Node, ptr %a2 + call void @finch.gen.block(ptr %t24, %S.ast.Node %t25, i1 true) + br label %endif4327 +else4326: + %t26 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t26, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.2760, i64 4, i64 0 }, ptr %a28 + %t29 = call i32 @finch_str_eq(ptr %a27, ptr %a28) + %t30 = icmp ne i32 %t29, 0 + br i1 %t30, label %then4328, label %else4329 +then4328: + %t31 = load ptr, ptr %a1 + %t32 = load %S.ast.Node, ptr %a2 + call void @finch.gen.declStmt(ptr %t31, %S.ast.Node %t32) + br label %endif4330 +else4329: + %t33 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.2761, i64 6, i64 0 }, ptr %a35 + %t36 = call i32 @finch_str_eq(ptr %a34, ptr %a35) + %t37 = icmp ne i32 %t36, 0 + br i1 %t37, label %then4331, label %else4332 +then4331: + %t38 = load ptr, ptr %a1 + %t39 = load %S.ast.Node, ptr %a2 + call void @finch.gen.assignStmt(ptr %t38, %S.ast.Node %t39) + br label %endif4333 +else4332: + %t40 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t40, ptr %a41 + store { ptr, i64, i64 } { ptr @.str.2762, i64 4, i64 0 }, ptr %a42 + %t43 = call i32 @finch_str_eq(ptr %a41, ptr %a42) + %t44 = icmp ne i32 %t43, 0 + br i1 %t44, label %then4334, label %else4335 +then4334: + %t45 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t46 = load { ptr, i64, i64 }, ptr %t45 + %t47 = extractvalue { ptr, i64, i64 } %t46, 1 + %t48 = icmp uge i64 0, %t47 + br i1 %t48, label %range4337, label %inrange4338 +range4337: + call void @finch_panic_index(ptr @.str.2763, i64 1916, i64 0, i64 %t47) + unreachable +inrange4338: + %t49 = extractvalue { ptr, i64, i64 } %t46, 0 + %t50 = getelementptr inbounds %S.ast.Node, ptr %t49, i64 0 + %t51 = getelementptr inbounds %S.ast.Node, ptr %t50, i32 0, i32 0 + %t52 = load { ptr, i64, i64 }, ptr %t51 + store { ptr, i64, i64 } %t52, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.2764, i64 2, i64 0 }, ptr %a54 + %t55 = call i32 @finch_str_eq(ptr %a53, ptr %a54) + %t56 = icmp ne i32 %t55, 0 + br i1 %t56, label %then4339, label %else4340 +then4339: + %t57 = load ptr, ptr %a1 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t59 = load { ptr, i64, i64 }, ptr %t58 + %t60 = extractvalue { ptr, i64, i64 } %t59, 1 + %t61 = icmp uge i64 0, %t60 + br i1 %t61, label %range4342, label %inrange4343 +range4342: + call void @finch_panic_index(ptr @.str.2765, i64 1917, i64 0, i64 %t60) + unreachable +inrange4343: + %t62 = extractvalue { ptr, i64, i64 } %t59, 0 + %t63 = getelementptr inbounds %S.ast.Node, ptr %t62, i64 0 + %t64 = load %S.ast.Node, ptr %t63 + %t65 = call %S.gen.Val @finch.gen.orElse(ptr %t57, %S.ast.Node %t64, i1 true) + br label %endif4341 +else4340: + %t66 = load ptr, ptr %a1 + %t67 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t68 = load { ptr, i64, i64 }, ptr %t67 + %t69 = extractvalue { ptr, i64, i64 } %t68, 1 + %t70 = icmp uge i64 0, %t69 + br i1 %t70, label %range4344, label %inrange4345 +range4344: + call void @finch_panic_index(ptr @.str.2766, i64 1919, i64 0, i64 %t69) + unreachable +inrange4345: + %t71 = extractvalue { ptr, i64, i64 } %t68, 0 + %t72 = getelementptr inbounds %S.ast.Node, ptr %t71, i64 0 + %t73 = load %S.ast.Node, ptr %t72 + %t74 = call %S.gen.Val @finch.gen.expr(ptr %t66, %S.ast.Node %t73) + br label %endif4341 +endif4341: + br label %endif4336 +else4335: + %t75 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t75, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.2767, i64 5, i64 0 }, ptr %a77 + %t78 = call i32 @finch_str_eq(ptr %a76, ptr %a77) + %t79 = icmp ne i32 %t78, 0 + br i1 %t79, label %then4346, label %else4347 +then4346: + %t80 = load ptr, ptr %a1 + %t81 = load %S.ast.Node, ptr %a2 + %t82 = call %S.gen.Val @finch.gen.matchGen(ptr %t80, %S.ast.Node %t81, i1 false) + br label %endif4348 +else4347: + %t83 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t83, ptr %a84 + store { ptr, i64, i64 } { ptr @.str.2768, i64 2, i64 0 }, ptr %a85 + %t86 = call i32 @finch_str_eq(ptr %a84, ptr %a85) + %t87 = icmp ne i32 %t86, 0 + br i1 %t87, label %then4349, label %else4350 +then4349: + %t88 = load ptr, ptr %a1 + %t89 = load %S.ast.Node, ptr %a2 + call void @finch.gen.ifStmt(ptr %t88, %S.ast.Node %t89) + br label %endif4351 +else4350: + %t90 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t90, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.2769, i64 5, i64 0 }, ptr %a92 + %t93 = call i32 @finch_str_eq(ptr %a91, ptr %a92) + %t94 = icmp ne i32 %t93, 0 + br i1 %t94, label %then4352, label %else4353 +then4352: + %t95 = load ptr, ptr %a1 + %t96 = load %S.ast.Node, ptr %a2 + call void @finch.gen.whileStmt(ptr %t95, %S.ast.Node %t96) + br label %endif4354 +else4353: + %t97 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t97, ptr %a98 + store { ptr, i64, i64 } { ptr @.str.2770, i64 3, i64 0 }, ptr %a99 + %t100 = call i32 @finch_str_eq(ptr %a98, ptr %a99) + %t101 = icmp ne i32 %t100, 0 + br i1 %t101, label %then4355, label %else4356 +then4355: + %t102 = load ptr, ptr %a1 + %t103 = load %S.ast.Node, ptr %a2 + call void @finch.gen.forStmt(ptr %t102, %S.ast.Node %t103) + br label %endif4357 +else4356: + %t104 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t104, ptr %a105 + store { ptr, i64, i64 } { ptr @.str.2771, i64 4, i64 0 }, ptr %a106 + %t107 = call i32 @finch_str_eq(ptr %a105, ptr %a106) + %t108 = icmp ne i32 %t107, 0 + br i1 %t108, label %then4358, label %else4359 +then4358: + %t109 = load ptr, ptr %a1 + %t110 = load %S.ast.Node, ptr %a2 + call void @finch.gen.eachStmt(ptr %t109, %S.ast.Node %t110) + br label %endif4360 +else4359: + %t111 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t111, ptr %a112 + store { ptr, i64, i64 } { ptr @.str.2772, i64 6, i64 0 }, ptr %a113 + %t114 = call i32 @finch_str_eq(ptr %a112, ptr %a113) + %t115 = icmp ne i32 %t114, 0 + br i1 %t115, label %then4361, label %else4362 +then4361: + %t116 = load ptr, ptr %a1 + %t117 = load %S.ast.Node, ptr %a2 + call void @finch.gen.returnStmt(ptr %t116, %S.ast.Node %t117) + br label %endif4363 +else4362: + %t118 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t118, ptr %a119 + store { ptr, i64, i64 } { ptr @.str.2773, i64 5, i64 0 }, ptr %a120 + %t121 = call i32 @finch_str_eq(ptr %a119, ptr %a120) + %t122 = icmp ne i32 %t121, 0 + br i1 %t122, label %then4364, label %else4365 +then4364: + %t123 = load ptr, ptr %a1 + %t124 = icmp eq ptr %t123, null + br i1 %t124, label %panic4367, label %ok4368 +panic4367: + call void @finch_panic(ptr @.str.2774, i64 1934, ptr @.str.2775) + unreachable +ok4368: + %t125 = getelementptr inbounds %S.gen.Gen, ptr %t123, i32 0, i32 42 + %t126 = load i64, ptr %t125 + %t127 = icmp sgt i64 %t126, 0 + br i1 %t127, label %then4369, label %endif4371 +then4369: + %t128 = load ptr, ptr %a1 + %t129 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t128, %S.ast.Node %t129, { ptr, i64, i64 } { ptr @.str.2776, i64 33, i64 0 }) + br label %endif4371 +endif4371: + %t130 = load ptr, ptr %a1 + %t131 = icmp eq ptr %t130, null + br i1 %t131, label %panic4372, label %ok4373 +panic4372: + call void @finch_panic(ptr @.str.2777, i64 1937, ptr @.str.2778) + unreachable +ok4373: + %t132 = getelementptr inbounds %S.gen.Gen, ptr %t130, i32 0, i32 10 + %t133 = getelementptr inbounds { ptr, i64, i64 }, ptr %t132, i32 0, i32 1 + %t134 = load i64, ptr %t133 + %t135 = sub i64 %t134, 1 + store i64 %t135, ptr %a136 + %t137 = load ptr, ptr %a1 + %t138 = icmp eq ptr %t137, null + br i1 %t138, label %panic4374, label %ok4375 +panic4374: + call void @finch_panic(ptr @.str.2779, i64 1938, ptr @.str.2780) + unreachable +ok4375: + %t139 = getelementptr inbounds %S.gen.Gen, ptr %t137, i32 0, i32 10 + %t140 = load i64, ptr %a136 + %t141 = load { ptr, i64, i64 }, ptr %t139 + %t142 = extractvalue { ptr, i64, i64 } %t141, 1 + %t143 = icmp uge i64 %t140, %t142 + br i1 %t143, label %range4376, label %inrange4377 +range4376: + call void @finch_panic_index(ptr @.str.2781, i64 1938, i64 %t140, i64 %t142) + unreachable +inrange4377: + %t144 = extractvalue { ptr, i64, i64 } %t141, 0 + %t145 = getelementptr inbounds %S.gen.Scope, ptr %t144, i64 %t140 + %t146 = getelementptr inbounds %S.gen.Scope, ptr %t145, i32 0, i32 1 + %t147 = getelementptr inbounds { ptr, i64, i64 }, ptr %t146, i32 0, i32 1 + %t148 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t149 = load { ptr, i64, i64 }, ptr %t148 + %t150 = extractvalue { ptr, i64, i64 } %t149, 1 + %t151 = icmp uge i64 0, %t150 + br i1 %t151, label %range4378, label %inrange4379 +range4378: + call void @finch_panic_index(ptr @.str.2782, i64 1938, i64 0, i64 %t150) + unreachable +inrange4379: + %t152 = extractvalue { ptr, i64, i64 } %t149, 0 + %t153 = getelementptr inbounds %S.ast.Node, ptr %t152, i64 0 + %t154 = load %S.ast.Node, ptr %t153 + store %S.ast.Node %t154, ptr %a155 + call void @finch.copy.S_ast_Node(ptr %a156, ptr %a155) + %t157 = load %S.ast.Node, ptr %a156 + %t158 = load i64, ptr %t147 + %t159 = add i64 %t158, 1 + call void @finch_arr_reserve(ptr %t146, i64 %t159, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t160 = load ptr, ptr %t146 + %t161 = getelementptr inbounds %S.ast.Node, ptr %t160, i64 %t158 + store %S.ast.Node %t157, ptr %t161 + store i64 %t159, ptr %t147 + %t162 = load ptr, ptr %a1 + %t163 = icmp eq ptr %t162, null + br i1 %t163, label %panic4380, label %ok4381 +panic4380: + call void @finch_panic(ptr @.str.2783, i64 1939, ptr @.str.2784) + unreachable +ok4381: + %t164 = getelementptr inbounds %S.gen.Gen, ptr %t162, i32 0, i32 10 + %t165 = load i64, ptr %a136 + %t166 = load { ptr, i64, i64 }, ptr %t164 + %t167 = extractvalue { ptr, i64, i64 } %t166, 1 + %t168 = icmp uge i64 %t165, %t167 + br i1 %t168, label %range4382, label %inrange4383 +range4382: + call void @finch_panic_index(ptr @.str.2785, i64 1939, i64 %t165, i64 %t167) + unreachable +inrange4383: + %t169 = extractvalue { ptr, i64, i64 } %t166, 0 + %t170 = getelementptr inbounds %S.gen.Scope, ptr %t169, i64 %t165 + %t171 = getelementptr inbounds %S.gen.Scope, ptr %t170, i32 0, i32 2 + %t172 = getelementptr inbounds { ptr, i64, i64 }, ptr %t171, i32 0, i32 1 + %t173 = load ptr, ptr %a1 + %t174 = icmp eq ptr %t173, null + br i1 %t174, label %panic4384, label %ok4385 +panic4384: + call void @finch_panic(ptr @.str.2786, i64 1939, ptr @.str.2787) + unreachable +ok4385: + %t175 = getelementptr inbounds %S.gen.Gen, ptr %t173, i32 0, i32 23 + %t176 = load i64, ptr %t175 + %t177 = load i64, ptr %t172 + %t178 = add i64 %t177, 1 + call void @finch_arr_reserve(ptr %t171, i64 %t178, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t179 = load ptr, ptr %t171 + %t180 = getelementptr inbounds i64, ptr %t179, i64 %t177 + store i64 %t176, ptr %t180 + store i64 %t178, ptr %t172 + br label %endif4366 +else4365: + %t181 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t181, ptr %a182 + store { ptr, i64, i64 } { ptr @.str.2788, i64 5, i64 0 }, ptr %a183 + %t184 = call i32 @finch_str_eq(ptr %a182, ptr %a183) + %t185 = icmp ne i32 %t184, 0 + br label %logic.from4386 +logic.from4386: + br i1 %t185, label %logic.end4388, label %logic.rhs4387 +logic.rhs4387: + %t186 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t186, ptr %a187 + store { ptr, i64, i64 } { ptr @.str.2789, i64 8, i64 0 }, ptr %a188 + %t189 = call i32 @finch_str_eq(ptr %a187, ptr %a188) + %t190 = icmp ne i32 %t189, 0 + br label %logic.rend4389 +logic.rend4389: + br label %logic.end4388 +logic.end4388: + %t191 = phi i1 [ true, %logic.from4386 ], [ %t190, %logic.rend4389 ] + br i1 %t191, label %then4390, label %else4391 +then4390: + %t192 = load ptr, ptr %a1 + %t193 = icmp eq ptr %t192, null + br i1 %t193, label %panic4393, label %ok4394 +panic4393: + call void @finch_panic(ptr @.str.2790, i64 1941, ptr @.str.2791) + unreachable +ok4394: + %t194 = getelementptr inbounds %S.gen.Gen, ptr %t192, i32 0, i32 42 + %t195 = load i64, ptr %t194 + %t196 = icmp sgt i64 %t195, 0 + br i1 %t196, label %then4395, label %endif4397 +then4395: + %t197 = load ptr, ptr %a1 + %t198 = load %S.ast.Node, ptr %a2 + %t199 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t199, ptr %a201 + store { ptr, i64, i64 } { ptr @.str.2792, i64 27, i64 0 }, ptr %a202 + call void @finch_str_concat(ptr %a200, ptr %a201, ptr %a202) + %t203 = load { ptr, i64, i64 }, ptr %a200 + call void @finch.gen.fail(ptr %t197, %S.ast.Node %t198, { ptr, i64, i64 } %t203) + br label %endif4397 +endif4397: + %t204 = load ptr, ptr %a1 + %t205 = icmp eq ptr %t204, null + br i1 %t205, label %panic4398, label %ok4399 +panic4398: + call void @finch_panic(ptr @.str.2793, i64 1944, ptr @.str.2794) + unreachable +ok4399: + %t206 = getelementptr inbounds %S.gen.Gen, ptr %t204, i32 0, i32 11 + %t207 = getelementptr inbounds { ptr, i64, i64 }, ptr %t206, i32 0, i32 1 + %t208 = load i64, ptr %t207 + %t209 = icmp eq i64 %t208, 0 + br i1 %t209, label %then4400, label %endif4402 +then4400: + %t210 = load ptr, ptr %a1 + %t211 = load %S.ast.Node, ptr %a2 + %t212 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t212, ptr %a214 + store { ptr, i64, i64 } { ptr @.str.2795, i64 31, i64 0 }, ptr %a215 + call void @finch_str_concat(ptr %a213, ptr %a214, ptr %a215) + %t216 = load { ptr, i64, i64 }, ptr %a213 + call void @finch.gen.fail(ptr %t210, %S.ast.Node %t211, { ptr, i64, i64 } %t216) + br label %endif4402 +endif4402: + %t217 = load ptr, ptr %a1 + %t218 = icmp eq ptr %t217, null + br i1 %t218, label %panic4403, label %ok4404 +panic4403: + call void @finch_panic(ptr @.str.2796, i64 1947, ptr @.str.2797) + unreachable +ok4404: + %t219 = getelementptr inbounds %S.gen.Gen, ptr %t217, i32 0, i32 11 + %t220 = load ptr, ptr %a1 + %t221 = icmp eq ptr %t220, null + br i1 %t221, label %panic4405, label %ok4406 +panic4405: + call void @finch_panic(ptr @.str.2798, i64 1947, ptr @.str.2799) + unreachable +ok4406: + %t222 = getelementptr inbounds %S.gen.Gen, ptr %t220, i32 0, i32 11 + %t223 = getelementptr inbounds { ptr, i64, i64 }, ptr %t222, i32 0, i32 1 + %t224 = load i64, ptr %t223 + %t225 = sub i64 %t224, 1 + %t226 = load { ptr, i64, i64 }, ptr %t219 + %t227 = extractvalue { ptr, i64, i64 } %t226, 1 + %t228 = icmp uge i64 %t225, %t227 + br i1 %t228, label %range4407, label %inrange4408 +range4407: + call void @finch_panic_index(ptr @.str.2800, i64 1947, i64 %t225, i64 %t227) + unreachable +inrange4408: + %t229 = extractvalue { ptr, i64, i64 } %t226, 0 + %t230 = getelementptr inbounds %S.gen.Loop, ptr %t229, i64 %t225 + %t231 = load %S.gen.Loop, ptr %t230 + store %S.gen.Loop %t231, ptr %a232 + call void @finch.copy.S_gen_Loop(ptr %a233, ptr %a232) + %t234 = load %S.gen.Loop, ptr %a233 + store %S.gen.Loop %t234, ptr %a235 + %t236 = load ptr, ptr %a1 + %t237 = getelementptr inbounds %S.gen.Loop, ptr %a235, i32 0, i32 2 + %t238 = load i64, ptr %t237 + call void @finch.gen.unwind(ptr %t236, i64 %t238) + %t239 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t239, ptr %a240 + store { ptr, i64, i64 } { ptr @.str.2801, i64 5, i64 0 }, ptr %a241 + %t242 = call i32 @finch_str_eq(ptr %a240, ptr %a241) + %t243 = icmp ne i32 %t242, 0 + br i1 %t243, label %then4409, label %else4410 +then4409: + %t244 = load ptr, ptr %a1 + %t245 = getelementptr inbounds %S.gen.Loop, ptr %a235, i32 0, i32 1 + %t246 = load { ptr, i64, i64 }, ptr %t245 + call void @finch.gen.br(ptr %t244, { ptr, i64, i64 } %t246) + br label %endif4411 +else4410: + %t247 = load ptr, ptr %a1 + %t248 = getelementptr inbounds %S.gen.Loop, ptr %a235, i32 0, i32 0 + %t249 = load { ptr, i64, i64 }, ptr %t248 + call void @finch.gen.br(ptr %t247, { ptr, i64, i64 } %t249) + br label %endif4411 +endif4411: + br label %endif4392 +else4391: + %t250 = load ptr, ptr %a1 + %t251 = load %S.ast.Node, ptr %a2 + %t252 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.2802, i64 18, i64 0 }, ptr %a254 + store { ptr, i64, i64 } %t252, ptr %a255 + call void @finch_str_concat(ptr %a253, ptr %a254, ptr %a255) + %t256 = load { ptr, i64, i64 }, ptr %a253 + call void @finch.gen.fail(ptr %t250, %S.ast.Node %t251, { ptr, i64, i64 } %t256) + br label %endif4392 +endif4392: + br label %endif4366 +endif4366: + br label %endif4363 +endif4363: + br label %endif4360 +endif4360: + br label %endif4357 +endif4357: + br label %endif4354 +endif4354: + br label %endif4351 +endif4351: + br label %endif4348 +endif4348: + br label %endif4336 +endif4336: + br label %endif4333 +endif4333: + br label %endif4330 +endif4330: + br label %endif4327 +endif4327: + ret void +} + +define internal void @finch.gen.declStmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a15 = alloca %S.gen.Val, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca %S.ast.Type, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca %S.gen.Val, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 6 + %t4 = load i1, ptr %t3 + %t5 = xor i1 %t4, true + br i1 %t5, label %then4412, label %endif4414 +then4412: + %t6 = load ptr, ptr %a1 + %t7 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t8 = load { ptr, i64, i64 }, ptr %t7 + %t9 = extractvalue { ptr, i64, i64 } %t8, 1 + %t10 = icmp uge i64 0, %t9 + br i1 %t10, label %range4415, label %inrange4416 +range4415: + call void @finch_panic_index(ptr @.str.2803, i64 1961, i64 0, i64 %t9) + unreachable +inrange4416: + %t11 = extractvalue { ptr, i64, i64 } %t8, 0 + %t12 = getelementptr inbounds %S.ast.Node, ptr %t11, i64 0 + %t13 = load %S.ast.Node, ptr %t12 + %t14 = call %S.gen.Val @finch.gen.expr(ptr %t6, %S.ast.Node %t13) + store %S.gen.Val %t14, ptr %a15 + %t16 = getelementptr inbounds %S.gen.Val, ptr %a15, i32 0, i32 1 + %t17 = getelementptr inbounds %S.ast.Type, ptr %t16, i32 0, i32 0 + %t18 = load { ptr, i64, i64 }, ptr %t17 + store { ptr, i64, i64 } %t18, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.2804, i64 4, i64 0 }, ptr %a20 + %t21 = call i32 @finch_str_eq(ptr %a19, ptr %a20) + %t22 = icmp ne i32 %t21, 0 + br i1 %t22, label %then4417, label %endif4419 +then4417: + %t23 = load ptr, ptr %a1 + %t24 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t25 = load { ptr, i64, i64 }, ptr %t24 + %t26 = extractvalue { ptr, i64, i64 } %t25, 1 + %t27 = icmp uge i64 0, %t26 + br i1 %t27, label %range4420, label %inrange4421 +range4420: + call void @finch_panic_index(ptr @.str.2805, i64 1963, i64 0, i64 %t26) + unreachable +inrange4421: + %t28 = extractvalue { ptr, i64, i64 } %t25, 0 + %t29 = getelementptr inbounds %S.ast.Node, ptr %t28, i64 0 + %t30 = load %S.ast.Node, ptr %t29 + call void @finch.gen.fail(ptr %t23, %S.ast.Node %t30, { ptr, i64, i64 } { ptr @.str.2806, i64 46, i64 0 }) + br label %endif4419 +endif4419: + %t31 = getelementptr inbounds %S.gen.Val, ptr %a15, i32 0, i32 1 + %t32 = getelementptr inbounds %S.ast.Type, ptr %t31, i32 0, i32 0 + %t33 = load { ptr, i64, i64 }, ptr %t32 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.2807, i64 4, i64 0 }, ptr %a35 + %t36 = call i32 @finch_str_eq(ptr %a34, ptr %a35) + %t37 = icmp ne i32 %t36, 0 + br i1 %t37, label %then4422, label %endif4424 +then4422: + %t38 = load ptr, ptr %a1 + %t39 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t40 = load { ptr, i64, i64 }, ptr %t39 + %t41 = extractvalue { ptr, i64, i64 } %t40, 1 + %t42 = icmp uge i64 0, %t41 + br i1 %t42, label %range4425, label %inrange4426 +range4425: + call void @finch_panic_index(ptr @.str.2808, i64 1966, i64 0, i64 %t41) + unreachable +inrange4426: + %t43 = extractvalue { ptr, i64, i64 } %t40, 0 + %t44 = getelementptr inbounds %S.ast.Node, ptr %t43, i64 0 + %t45 = load %S.ast.Node, ptr %t44 + %t46 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t47 = load { ptr, i64, i64 }, ptr %t46 + store { ptr, i64, i64 } { ptr @.str.2809, i64 34, i64 0 }, ptr %a49 + store { ptr, i64, i64 } %t47, ptr %a50 + call void @finch_str_concat(ptr %a48, ptr %a49, ptr %a50) + %t51 = load { ptr, i64, i64 }, ptr %a48 + store { ptr, i64, i64 } %t51, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.2810, i64 7, i64 0 }, ptr %a54 + call void @finch_str_concat(ptr %a52, ptr %a53, ptr %a54) + %t55 = load { ptr, i64, i64 }, ptr %a52 + call void @finch.gen.fail(ptr %t38, %S.ast.Node %t45, { ptr, i64, i64 } %t55) + br label %endif4424 +endif4424: + %t56 = load ptr, ptr %a1 + %t57 = load %S.ast.Node, ptr %a2 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t59 = load { ptr, i64, i64 }, ptr %t58 + %t60 = getelementptr inbounds %S.gen.Val, ptr %a15, i32 0, i32 1 + %t61 = load %S.ast.Type, ptr %t60 + %t62 = load ptr, ptr %a1 + %t63 = load %S.gen.Val, ptr %a15 + %t64 = call { ptr, i64, i64 } @finch.gen.own(ptr %t62, %S.gen.Val %t63) + %t65 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t56, %S.ast.Node %t57, { ptr, i64, i64 } %t59, %S.ast.Type %t61, { ptr, i64, i64 } %t64, i1 false) + ret void +endif4414: + %t66 = load ptr, ptr %a1 + %t67 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t68 = load %S.ast.Type, ptr %t67 + %t69 = load %S.ast.Node, ptr %a2 + %t70 = call %S.ast.Type @finch.gen.resolve(ptr %t66, %S.ast.Type %t68, %S.ast.Node %t69) + store %S.ast.Type %t70, ptr %a71 + %t72 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t73 = getelementptr inbounds { ptr, i64, i64 }, ptr %t72, i32 0, i32 1 + %t74 = load i64, ptr %t73 + %t75 = icmp eq i64 %t74, 0 + br i1 %t75, label %then4427, label %endif4429 +then4427: + %t76 = getelementptr inbounds %S.ast.Type, ptr %a71, i32 0, i32 0 + %t77 = load { ptr, i64, i64 }, ptr %t76 + store { ptr, i64, i64 } %t77, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.2811, i64 6, i64 0 }, ptr %a79 + %t80 = call i32 @finch_str_eq(ptr %a78, ptr %a79) + %t81 = icmp ne i32 %t80, 0 + br label %logic.from4430 +logic.from4430: + br i1 %t81, label %logic.rhs4431, label %logic.end4432 +logic.rhs4431: + %t82 = load ptr, ptr %a1 + %t83 = load %S.ast.Type, ptr %a71 + %t84 = call i1 @finch.gen.hasDefaults(ptr %t82, %S.ast.Type %t83) + br label %logic.rend4433 +logic.rend4433: + br label %logic.end4432 +logic.end4432: + %t85 = phi i1 [ false, %logic.from4430 ], [ %t84, %logic.rend4433 ] + br i1 %t85, label %then4434, label %endif4436 +then4434: + store { ptr, i64, i64 } zeroinitializer, ptr %a86 + store { ptr, i64, i64 } zeroinitializer, ptr %a87 + %t88 = load ptr, ptr %a1 + %t89 = load ptr, ptr %a1 + %t90 = getelementptr inbounds %S.ast.Type, ptr %a71, i32 0, i32 3 + %t91 = load { ptr, i64, i64 }, ptr %t90 + %t92 = getelementptr inbounds %S.ast.Type, ptr %a71, i32 0, i32 2 + %t93 = load { ptr, i64, i64 }, ptr %t92 + %t94 = call i64 @finch.gen.findStruct(ptr %t89, { ptr, i64, i64 } %t91, { ptr, i64, i64 } %t93) + %t95 = load { ptr, i64, i64 }, ptr %a86 + %t96 = load { ptr, i64, i64 }, ptr %a87 + %t97 = load %S.ast.Node, ptr %a2 + %t98 = call %S.gen.Val @finch.gen.construct(ptr %t88, i64 %t94, { ptr, i64, i64 } %t95, { ptr, i64, i64 } %t96, %S.ast.Node %t97) + store %S.gen.Val %t98, ptr %a99 + %t100 = load ptr, ptr %a1 + %t101 = load %S.ast.Node, ptr %a2 + %t102 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t103 = load { ptr, i64, i64 }, ptr %t102 + %t104 = load %S.ast.Type, ptr %a71 + %t105 = getelementptr inbounds %S.gen.Val, ptr %a99, i32 0, i32 0 + %t106 = load { ptr, i64, i64 }, ptr %t105 + %t107 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t100, %S.ast.Node %t101, { ptr, i64, i64 } %t103, %S.ast.Type %t104, { ptr, i64, i64 } %t106, i1 false) + ret void +endif4436: + %t108 = load ptr, ptr %a1 + %t109 = load %S.ast.Node, ptr %a2 + %t110 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t111 = load { ptr, i64, i64 }, ptr %t110 + %t112 = load %S.ast.Type, ptr %a71 + %t113 = load %S.ast.Type, ptr %a71 + %t114 = call { ptr, i64, i64 } @finch.gen.zeroOf(%S.ast.Type %t113) + %t115 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t108, %S.ast.Node %t109, { ptr, i64, i64 } %t111, %S.ast.Type %t112, { ptr, i64, i64 } %t114, i1 false) + ret void +endif4429: + %t116 = load ptr, ptr %a1 + %t117 = load ptr, ptr %a1 + %t118 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t119 = load { ptr, i64, i64 }, ptr %t118 + %t120 = extractvalue { ptr, i64, i64 } %t119, 1 + %t121 = icmp uge i64 0, %t120 + br i1 %t121, label %range4437, label %inrange4438 +range4437: + call void @finch_panic_index(ptr @.str.2812, i64 1983, i64 0, i64 %t120) + unreachable +inrange4438: + %t122 = extractvalue { ptr, i64, i64 } %t119, 0 + %t123 = getelementptr inbounds %S.ast.Node, ptr %t122, i64 0 + %t124 = load %S.ast.Node, ptr %t123 + %t125 = load %S.ast.Type, ptr %a71 + %t126 = call %S.gen.Val @finch.gen.exprWant(ptr %t117, %S.ast.Node %t124, %S.ast.Type %t125) + %t127 = load %S.ast.Type, ptr %a71 + %t128 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t129 = load { ptr, i64, i64 }, ptr %t128 + %t130 = extractvalue { ptr, i64, i64 } %t129, 1 + %t131 = icmp uge i64 0, %t130 + br i1 %t131, label %range4439, label %inrange4440 +range4439: + call void @finch_panic_index(ptr @.str.2813, i64 1983, i64 0, i64 %t130) + unreachable +inrange4440: + %t132 = extractvalue { ptr, i64, i64 } %t129, 0 + %t133 = getelementptr inbounds %S.ast.Node, ptr %t132, i64 0 + %t134 = load %S.ast.Node, ptr %t133 + %t135 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t136 = load { ptr, i64, i64 }, ptr %t135 + store { ptr, i64, i64 } { ptr @.str.2814, i64 1, i64 0 }, ptr %a138 + store { ptr, i64, i64 } %t136, ptr %a139 + call void @finch_str_concat(ptr %a137, ptr %a138, ptr %a139) + %t140 = load { ptr, i64, i64 }, ptr %a137 + store { ptr, i64, i64 } %t140, ptr %a142 + store { ptr, i64, i64 } { ptr @.str.2815, i64 1, i64 0 }, ptr %a143 + call void @finch_str_concat(ptr %a141, ptr %a142, ptr %a143) + %t144 = load { ptr, i64, i64 }, ptr %a141 + %t145 = call %S.gen.Val @finch.gen.coerce(ptr %t116, %S.gen.Val %t126, %S.ast.Type %t127, %S.ast.Node %t134, { ptr, i64, i64 } %t144) + store %S.gen.Val %t145, ptr %a146 + %t147 = load ptr, ptr %a1 + %t148 = load %S.ast.Node, ptr %a2 + %t149 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t150 = load { ptr, i64, i64 }, ptr %t149 + %t151 = load %S.ast.Type, ptr %a71 + %t152 = load ptr, ptr %a1 + %t153 = load %S.gen.Val, ptr %a146 + %t154 = call { ptr, i64, i64 } @finch.gen.own(ptr %t152, %S.gen.Val %t153) + %t155 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t147, %S.ast.Node %t148, { ptr, i64, i64 } %t150, %S.ast.Type %t151, { ptr, i64, i64 } %t154, i1 false) + ret void +} + +define internal i1 @finch.gen.hasDefaults(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a18 = alloca %S.gen.StructDef, align 16 + %a19 = alloca %S.gen.StructDef, align 16 + %a21 = alloca %S.gen.StructDef, align 16 + %a43 = alloca i64, align 16 + %a51 = alloca %S.ast.Node, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic4441, label %ok4442 +panic4441: + call void @finch_panic(ptr @.str.2816, i64 1988, ptr @.str.2817) + unreachable +ok4442: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 15 + %t6 = load ptr, ptr %a1 + %t7 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t8 = load { ptr, i64, i64 }, ptr %t7 + %t9 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t10 = load { ptr, i64, i64 }, ptr %t9 + %t11 = call i64 @finch.gen.findStruct(ptr %t6, { ptr, i64, i64 } %t8, { ptr, i64, i64 } %t10) + %t12 = load { ptr, i64, i64 }, ptr %t5 + %t13 = extractvalue { ptr, i64, i64 } %t12, 1 + %t14 = icmp uge i64 %t11, %t13 + br i1 %t14, label %range4443, label %inrange4444 +range4443: + call void @finch_panic_index(ptr @.str.2818, i64 1988, i64 %t11, i64 %t13) + unreachable +inrange4444: + %t15 = extractvalue { ptr, i64, i64 } %t12, 0 + %t16 = getelementptr inbounds %S.gen.StructDef, ptr %t15, i64 %t11 + %t17 = load %S.gen.StructDef, ptr %t16 + store %S.gen.StructDef %t17, ptr %a18 + call void @finch.copy.S_gen_StructDef(ptr %a19, ptr %a18) + %t20 = load %S.gen.StructDef, ptr %a19 + store %S.gen.StructDef %t20, ptr %a21 + %t22 = getelementptr inbounds %S.gen.StructDef, ptr %a21, i32 0, i32 2 + %t23 = load i1, ptr %t22 + br i1 %t23, label %then4445, label %endif4447 +then4445: + ret i1 false +endif4447: + %t24 = load ptr, ptr %a1 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic4448, label %ok4449 +panic4448: + call void @finch_panic(ptr @.str.2819, i64 1992, ptr @.str.2820) + unreachable +ok4449: + %t26 = getelementptr inbounds %S.gen.Gen, ptr %t24, i32 0, i32 0 + %t27 = getelementptr inbounds %S.gen.StructDef, ptr %a21, i32 0, i32 13 + %t28 = load i64, ptr %t27 + %t29 = load { ptr, i64, i64 }, ptr %t26 + %t30 = extractvalue { ptr, i64, i64 } %t29, 1 + %t31 = icmp uge i64 %t28, %t30 + br i1 %t31, label %range4450, label %inrange4451 +range4450: + call void @finch_panic_index(ptr @.str.2821, i64 1992, i64 %t28, i64 %t30) + unreachable +inrange4451: + %t32 = extractvalue { ptr, i64, i64 } %t29, 0 + %t33 = getelementptr inbounds %S.ast.Program, ptr %t32, i64 %t28 + %t34 = getelementptr inbounds %S.ast.Program, ptr %t33, i32 0, i32 6 + %t35 = getelementptr inbounds %S.gen.StructDef, ptr %a21, i32 0, i32 14 + %t36 = load i64, ptr %t35 + %t37 = load { ptr, i64, i64 }, ptr %t34 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 %t36, %t38 + br i1 %t39, label %range4452, label %inrange4453 +range4452: + call void @finch_panic_index(ptr @.str.2822, i64 1992, i64 %t36, i64 %t38) + unreachable +inrange4453: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds %S.ast.Node, ptr %t40, i64 %t36 + %t42 = getelementptr inbounds %S.ast.Node, ptr %t41, i32 0, i32 9 + store i64 0, ptr %a43 + br label %each.cond4454 +each.cond4454: + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t42, i32 0, i32 1 + %t45 = load i64, ptr %t44 + %t46 = load i64, ptr %a43 + %t47 = icmp slt i64 %t46, %t45 + br i1 %t47, label %each.body4455, label %each.end4457 +each.body4455: + %t48 = load ptr, ptr %t42 + %t49 = getelementptr inbounds %S.ast.Node, ptr %t48, i64 %t46 + %t50 = load %S.ast.Node, ptr %t49 + store %S.ast.Node %t50, ptr %a51 + %t52 = getelementptr inbounds %S.ast.Node, ptr %a51, i32 0, i32 9 + %t53 = getelementptr inbounds { ptr, i64, i64 }, ptr %t52, i32 0, i32 1 + %t54 = load i64, ptr %t53 + %t55 = icmp sgt i64 %t54, 0 + br i1 %t55, label %then4458, label %endif4460 +then4458: + ret i1 true +endif4460: + br label %each.step4456 +each.step4456: + %t56 = load i64, ptr %a43 + %t57 = add i64 %t56, 1 + store i64 %t57, ptr %a43 + br label %each.cond4454 +each.end4457: + ret i1 false +} + +define internal void @finch.gen.assignStmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a10 = alloca %S.ast.Node, align 16 + %a11 = alloca %S.ast.Node, align 16 + %a13 = alloca %S.ast.Node, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca i64, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca %S.gen.Val, align 16 + %a106 = alloca %S.gen.Place, align 16 + %a139 = alloca %S.gen.Val, align 16 + %a143 = alloca %S.gen.Place, align 16 + %a155 = alloca %S.ast.Type, align 16 + %a156 = alloca %S.ast.Type, align 16 + %a159 = alloca %S.gen.Val, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t4 = load { ptr, i64, i64 }, ptr %t3 + %t5 = extractvalue { ptr, i64, i64 } %t4, 1 + %t6 = icmp uge i64 0, %t5 + br i1 %t6, label %range4461, label %inrange4462 +range4461: + call void @finch_panic_index(ptr @.str.2823, i64 2001, i64 0, i64 %t5) + unreachable +inrange4462: + %t7 = extractvalue { ptr, i64, i64 } %t4, 0 + %t8 = getelementptr inbounds %S.ast.Node, ptr %t7, i64 0 + %t9 = load %S.ast.Node, ptr %t8 + store %S.ast.Node %t9, ptr %a10 + call void @finch.copy.S_ast_Node(ptr %a11, ptr %a10) + %t12 = load %S.ast.Node, ptr %a11 + store %S.ast.Node %t12, ptr %a13 + %t14 = load %S.ast.Node, ptr %a13 + %t15 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t14) + store { ptr, i64, i64 } %t15, ptr %a16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %a16, i32 0, i32 1 + %t18 = load i64, ptr %t17 + %t19 = icmp sgt i64 %t18, 0 + br i1 %t19, label %then4463, label %endif4465 +then4463: + %t20 = load ptr, ptr %a1 + %t21 = load { ptr, i64, i64 }, ptr %a16 + %t22 = call i64 @finch.gen.lookup(ptr %t20, { ptr, i64, i64 } %t21) + store i64 %t22, ptr %a23 + %t24 = load i64, ptr %a23 + %t25 = icmp slt i64 %t24, 0 + br label %logic.from4466 +logic.from4466: + br i1 %t25, label %logic.rhs4467, label %logic.end4468 +logic.rhs4467: + %t26 = getelementptr inbounds %S.ast.Node, ptr %a13, i32 0, i32 0 + %t27 = load { ptr, i64, i64 }, ptr %t26 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.2824, i64 3, i64 0 }, ptr %a29 + %t30 = call i32 @finch_str_eq(ptr %a28, ptr %a29) + %t31 = icmp ne i32 %t30, 0 + br label %logic.rend4469 +logic.rend4469: + br label %logic.end4468 +logic.end4468: + %t32 = phi i1 [ false, %logic.from4466 ], [ %t31, %logic.rend4469 ] + br i1 %t32, label %then4470, label %endif4472 +then4470: + %t33 = load ptr, ptr %a1 + %t34 = load %S.ast.Node, ptr %a2 + %t35 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.2825, i64 28, i64 0 }, ptr %a37 + store { ptr, i64, i64 } %t35, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t39, ptr %a41 + store { ptr, i64, i64 } { ptr @.str.2826, i64 18, i64 0 }, ptr %a42 + call void @finch_str_concat(ptr %a40, ptr %a41, ptr %a42) + %t43 = load { ptr, i64, i64 }, ptr %a40 + %t44 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t43, ptr %a46 + store { ptr, i64, i64 } %t44, ptr %a47 + call void @finch_str_concat(ptr %a45, ptr %a46, ptr %a47) + %t48 = load { ptr, i64, i64 }, ptr %a45 + store { ptr, i64, i64 } %t48, ptr %a50 + store { ptr, i64, i64 } { ptr @.str.2827, i64 8, i64 0 }, ptr %a51 + call void @finch_str_concat(ptr %a49, ptr %a50, ptr %a51) + %t52 = load { ptr, i64, i64 }, ptr %a49 + call void @finch.gen.fail(ptr %t33, %S.ast.Node %t34, { ptr, i64, i64 } %t52) + br label %endif4472 +endif4472: + %t53 = load i64, ptr %a23 + %t54 = icmp sge i64 %t53, 0 + br label %logic.from4473 +logic.from4473: + br i1 %t54, label %logic.rhs4474, label %logic.end4475 +logic.rhs4474: + %t55 = load ptr, ptr %a1 + %t56 = load i64, ptr %a23 + %t57 = call %S.gen.Var @finch.gen.varAt(ptr %t55, i64 %t56) + %t58 = extractvalue %S.gen.Var %t57, 3 + br label %logic.rend4476 +logic.rend4476: + br label %logic.end4475 +logic.end4475: + %t59 = phi i1 [ false, %logic.from4473 ], [ %t58, %logic.rend4476 ] + br i1 %t59, label %then4477, label %endif4479 +then4477: + %t60 = load ptr, ptr %a1 + %t61 = load %S.ast.Node, ptr %a2 + %t62 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.2828, i64 19, i64 0 }, ptr %a64 + store { ptr, i64, i64 } %t62, ptr %a65 + call void @finch_str_concat(ptr %a63, ptr %a64, ptr %a65) + %t66 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t66, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.2829, i64 18, i64 0 }, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + call void @finch.gen.fail(ptr %t60, %S.ast.Node %t61, { ptr, i64, i64 } %t70) + br label %endif4479 +endif4479: + br label %endif4465 +endif4465: + store { ptr, i64, i64 } { ptr @.str.2830, i64 9, i64 0 }, ptr %a71 + %t72 = getelementptr inbounds %S.ast.Node, ptr %a13, i32 0, i32 0 + %t73 = load { ptr, i64, i64 }, ptr %t72 + store { ptr, i64, i64 } %t73, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.2831, i64 3, i64 0 }, ptr %a75 + %t76 = call i32 @finch_str_eq(ptr %a74, ptr %a75) + %t77 = icmp ne i32 %t76, 0 + br i1 %t77, label %then4480, label %endif4482 +then4480: + %t78 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.2832, i64 1, i64 0 }, ptr %a80 + store { ptr, i64, i64 } %t78, ptr %a81 + call void @finch_str_concat(ptr %a79, ptr %a80, ptr %a81) + %t82 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } %t82, ptr %a84 + store { ptr, i64, i64 } { ptr @.str.2833, i64 1, i64 0 }, ptr %a85 + call void @finch_str_concat(ptr %a83, ptr %a84, ptr %a85) + %t86 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t86, ptr %a71 + br label %endif4482 +endif4482: + %t87 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t88 = load { ptr, i64, i64 }, ptr %t87 + store { ptr, i64, i64 } %t88, ptr %a89 + store { ptr, i64, i64 } { ptr @.str.2834, i64 1, i64 0 }, ptr %a90 + %t91 = call i32 @finch_str_eq(ptr %a89, ptr %a90) + %t92 = icmp ne i32 %t91, 0 + br i1 %t92, label %then4483, label %endif4485 +then4483: + %t93 = load ptr, ptr %a1 + %t94 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t95 = load { ptr, i64, i64 }, ptr %t94 + %t96 = extractvalue { ptr, i64, i64 } %t95, 1 + %t97 = icmp uge i64 1, %t96 + br i1 %t97, label %range4486, label %inrange4487 +range4486: + call void @finch_panic_index(ptr @.str.2835, i64 2017, i64 1, i64 %t96) + unreachable +inrange4487: + %t98 = extractvalue { ptr, i64, i64 } %t95, 0 + %t99 = getelementptr inbounds %S.ast.Node, ptr %t98, i64 1 + %t100 = load %S.ast.Node, ptr %t99 + %t101 = call %S.gen.Val @finch.gen.expr(ptr %t93, %S.ast.Node %t100) + store %S.gen.Val %t101, ptr %a102 + %t103 = load ptr, ptr %a1 + %t104 = load %S.ast.Node, ptr %a13 + %t105 = call %S.gen.Place @finch.gen.place(ptr %t103, %S.ast.Node %t104, i1 true) + store %S.gen.Place %t105, ptr %a106 + %t107 = load ptr, ptr %a1 + %t108 = load %S.gen.Val, ptr %a102 + %t109 = getelementptr inbounds %S.gen.Place, ptr %a106, i32 0, i32 1 + %t110 = load %S.ast.Type, ptr %t109 + %t111 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t112 = load { ptr, i64, i64 }, ptr %t111 + %t113 = extractvalue { ptr, i64, i64 } %t112, 1 + %t114 = icmp uge i64 1, %t113 + br i1 %t114, label %range4488, label %inrange4489 +range4488: + call void @finch_panic_index(ptr @.str.2836, i64 2019, i64 1, i64 %t113) + unreachable +inrange4489: + %t115 = extractvalue { ptr, i64, i64 } %t112, 0 + %t116 = getelementptr inbounds %S.ast.Node, ptr %t115, i64 1 + %t117 = load %S.ast.Node, ptr %t116 + %t118 = load { ptr, i64, i64 }, ptr %a71 + %t119 = call %S.gen.Val @finch.gen.coerce(ptr %t107, %S.gen.Val %t108, %S.ast.Type %t110, %S.ast.Node %t117, { ptr, i64, i64 } %t118) + store %S.gen.Val %t119, ptr %a102 + %t120 = load ptr, ptr %a1 + %t121 = load ptr, ptr %a1 + %t122 = getelementptr inbounds %S.gen.Place, ptr %a106, i32 0, i32 1 + %t123 = load %S.ast.Type, ptr %t122 + %t124 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t121, %S.ast.Type %t123) + %t125 = load ptr, ptr %a1 + %t126 = load %S.gen.Val, ptr %a102 + %t127 = call { ptr, i64, i64 } @finch.gen.own(ptr %t125, %S.gen.Val %t126) + %t128 = getelementptr inbounds %S.gen.Place, ptr %a106, i32 0, i32 0 + %t129 = load { ptr, i64, i64 }, ptr %t128 + call void @finch.gen.store(ptr %t120, { ptr, i64, i64 } %t124, { ptr, i64, i64 } %t127, { ptr, i64, i64 } %t129) + ret void +endif4485: + %t130 = load ptr, ptr %a1 + %t131 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t132 = load { ptr, i64, i64 }, ptr %t131 + %t133 = extractvalue { ptr, i64, i64 } %t132, 1 + %t134 = icmp uge i64 1, %t133 + br i1 %t134, label %range4490, label %inrange4491 +range4490: + call void @finch_panic_index(ptr @.str.2837, i64 2023, i64 1, i64 %t133) + unreachable +inrange4491: + %t135 = extractvalue { ptr, i64, i64 } %t132, 0 + %t136 = getelementptr inbounds %S.ast.Node, ptr %t135, i64 1 + %t137 = load %S.ast.Node, ptr %t136 + %t138 = call %S.gen.Val @finch.gen.expr(ptr %t130, %S.ast.Node %t137) + store %S.gen.Val %t138, ptr %a139 + %t140 = load ptr, ptr %a1 + %t141 = load %S.ast.Node, ptr %a13 + %t142 = call %S.gen.Place @finch.gen.place(ptr %t140, %S.ast.Node %t141, i1 true) + store %S.gen.Place %t142, ptr %a143 + %t144 = load ptr, ptr %a1 + %t145 = load ptr, ptr %a1 + %t146 = getelementptr inbounds %S.gen.Place, ptr %a143, i32 0, i32 1 + %t147 = load %S.ast.Type, ptr %t146 + %t148 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t145, %S.ast.Type %t147) + %t149 = getelementptr inbounds %S.gen.Place, ptr %a143, i32 0, i32 0 + %t150 = load { ptr, i64, i64 }, ptr %t149 + %t151 = call { ptr, i64, i64 } @finch.gen.load(ptr %t144, { ptr, i64, i64 } %t148, { ptr, i64, i64 } %t150) + %t152 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t151, 0 + %t153 = getelementptr inbounds %S.gen.Place, ptr %a143, i32 0, i32 1 + %t154 = load %S.ast.Type, ptr %t153 + store %S.ast.Type %t154, ptr %a155 + call void @finch.copy.S_ast_Type(ptr %a156, ptr %a155) + %t157 = load %S.ast.Type, ptr %a156 + %t158 = insertvalue %S.gen.Val %t152, %S.ast.Type %t157, 1 + store %S.gen.Val %t158, ptr %a159 + %t160 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t161 = load { ptr, i64, i64 }, ptr %t160 + store { ptr, i64, i64 } %t161, ptr %a162 + call void @finch_str_sub(ptr %a163, ptr %a162, i64 0, i64 1, ptr @.str.2838, i64 2026) + %t164 = load { ptr, i64, i64 }, ptr %a163 + store { ptr, i64, i64 } %t164, ptr %a165 + %t166 = load ptr, ptr %a1 + %t167 = load ptr, ptr %a1 + %t168 = load { ptr, i64, i64 }, ptr %a165 + %t169 = load %S.gen.Val, ptr %a159 + %t170 = load %S.gen.Val, ptr %a139 + %t171 = load %S.ast.Node, ptr %a2 + %t172 = call %S.gen.Val @finch.gen.arith(ptr %t167, { ptr, i64, i64 } %t168, %S.gen.Val %t169, %S.gen.Val %t170, %S.ast.Node %t171) + %t173 = getelementptr inbounds %S.gen.Place, ptr %a143, i32 0, i32 1 + %t174 = load %S.ast.Type, ptr %t173 + %t175 = load %S.ast.Node, ptr %a2 + %t176 = load { ptr, i64, i64 }, ptr %a71 + %t177 = call %S.gen.Val @finch.gen.coerce(ptr %t166, %S.gen.Val %t172, %S.ast.Type %t174, %S.ast.Node %t175, { ptr, i64, i64 } %t176) + store %S.gen.Val %t177, ptr %a178 + %t179 = load ptr, ptr %a1 + %t180 = load ptr, ptr %a1 + %t181 = getelementptr inbounds %S.gen.Place, ptr %a143, i32 0, i32 1 + %t182 = load %S.ast.Type, ptr %t181 + %t183 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t180, %S.ast.Type %t182) + %t184 = load ptr, ptr %a1 + %t185 = load %S.gen.Val, ptr %a178 + %t186 = call { ptr, i64, i64 } @finch.gen.own(ptr %t184, %S.gen.Val %t185) + %t187 = getelementptr inbounds %S.gen.Place, ptr %a143, i32 0, i32 0 + %t188 = load { ptr, i64, i64 }, ptr %t187 + call void @finch.gen.store(ptr %t179, { ptr, i64, i64 } %t183, { ptr, i64, i64 } %t186, { ptr, i64, i64 } %t188) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.condition(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load ptr, ptr %a1 + %t5 = load %S.ast.Node, ptr %a2 + %t6 = call %S.gen.Val @finch.gen.expr(ptr %t4, %S.ast.Node %t5) + %t7 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2839, i64 4, i64 0 }) + %t8 = load %S.ast.Node, ptr %a2 + %t9 = call %S.gen.Val @finch.gen.coerce(ptr %t3, %S.gen.Val %t6, %S.ast.Type %t7, %S.ast.Node %t8, { ptr, i64, i64 } { ptr @.str.2840, i64 11, i64 0 }) + %t10 = extractvalue %S.gen.Val %t9, 0 + store { ptr, i64, i64 } %t10, ptr %a11 + call void @finch_str_copy(ptr %a12, ptr %a11) + %t13 = load { ptr, i64, i64 }, ptr %a12 + ret { ptr, i64, i64 } %t13 +} + +define internal void @finch.gen.ifStmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca i1, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t5 = load { ptr, i64, i64 }, ptr %t4 + %t6 = extractvalue { ptr, i64, i64 } %t5, 1 + %t7 = icmp uge i64 0, %t6 + br i1 %t7, label %range4492, label %inrange4493 +range4492: + call void @finch_panic_index(ptr @.str.2841, i64 2036, i64 0, i64 %t6) + unreachable +inrange4493: + %t8 = extractvalue { ptr, i64, i64 } %t5, 0 + %t9 = getelementptr inbounds %S.ast.Node, ptr %t8, i64 0 + %t10 = load %S.ast.Node, ptr %t9 + %t11 = call { ptr, i64, i64 } @finch.gen.condition(ptr %t3, %S.ast.Node %t10) + store { ptr, i64, i64 } %t11, ptr %a12 + %t13 = load ptr, ptr %a1 + %t14 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t13, { ptr, i64, i64 } { ptr @.str.2842, i64 4, i64 0 }) + store { ptr, i64, i64 } %t14, ptr %a15 + %t16 = load ptr, ptr %a1 + %t17 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t16, { ptr, i64, i64 } { ptr @.str.2843, i64 4, i64 0 }) + store { ptr, i64, i64 } %t17, ptr %a18 + %t19 = load ptr, ptr %a1 + %t20 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t19, { ptr, i64, i64 } { ptr @.str.2844, i64 5, i64 0 }) + store { ptr, i64, i64 } %t20, ptr %a21 + %t22 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load i64, ptr %t23 + %t25 = icmp sgt i64 %t24, 2 + br i1 %t25, label %then4494, label %else4495 +then4494: + %t26 = load ptr, ptr %a1 + %t27 = load { ptr, i64, i64 }, ptr %a12 + %t28 = load { ptr, i64, i64 }, ptr %a15 + %t29 = load { ptr, i64, i64 }, ptr %a18 + call void @finch.gen.condBr(ptr %t26, { ptr, i64, i64 } %t27, { ptr, i64, i64 } %t28, { ptr, i64, i64 } %t29) + br label %endif4496 +else4495: + %t30 = load ptr, ptr %a1 + %t31 = load { ptr, i64, i64 }, ptr %a12 + %t32 = load { ptr, i64, i64 }, ptr %a15 + %t33 = load { ptr, i64, i64 }, ptr %a21 + call void @finch.gen.condBr(ptr %t30, { ptr, i64, i64 } %t31, { ptr, i64, i64 } %t32, { ptr, i64, i64 } %t33) + br label %endif4496 +endif4496: + %t34 = load ptr, ptr %a1 + %t35 = load { ptr, i64, i64 }, ptr %a15 + call void @finch.gen.label(ptr %t34, { ptr, i64, i64 } %t35) + %t36 = load ptr, ptr %a1 + %t37 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t38 = load { ptr, i64, i64 }, ptr %t37 + %t39 = extractvalue { ptr, i64, i64 } %t38, 1 + %t40 = icmp uge i64 1, %t39 + br i1 %t40, label %range4497, label %inrange4498 +range4497: + call void @finch_panic_index(ptr @.str.2845, i64 2046, i64 1, i64 %t39) + unreachable +inrange4498: + %t41 = extractvalue { ptr, i64, i64 } %t38, 0 + %t42 = getelementptr inbounds %S.ast.Node, ptr %t41, i64 1 + %t43 = load %S.ast.Node, ptr %t42 + call void @finch.gen.block(ptr %t36, %S.ast.Node %t43, i1 true) + %t44 = load ptr, ptr %a1 + %t45 = icmp eq ptr %t44, null + br i1 %t45, label %panic4499, label %ok4500 +panic4499: + call void @finch_panic(ptr @.str.2846, i64 2047, ptr @.str.2847) + unreachable +ok4500: + %t46 = getelementptr inbounds %S.gen.Gen, ptr %t44, i32 0, i32 9 + %t47 = load i1, ptr %t46 + %t48 = xor i1 %t47, true + store i1 %t48, ptr %a49 + %t50 = load ptr, ptr %a1 + %t51 = load { ptr, i64, i64 }, ptr %a21 + call void @finch.gen.br(ptr %t50, { ptr, i64, i64 } %t51) + %t52 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t53 = getelementptr inbounds { ptr, i64, i64 }, ptr %t52, i32 0, i32 1 + %t54 = load i64, ptr %t53 + %t55 = icmp sgt i64 %t54, 2 + br i1 %t55, label %then4501, label %else4502 +then4501: + %t56 = load ptr, ptr %a1 + %t57 = load { ptr, i64, i64 }, ptr %a18 + call void @finch.gen.label(ptr %t56, { ptr, i64, i64 } %t57) + %t58 = load ptr, ptr %a1 + %t59 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t60 = load { ptr, i64, i64 }, ptr %t59 + %t61 = extractvalue { ptr, i64, i64 } %t60, 1 + %t62 = icmp uge i64 2, %t61 + br i1 %t62, label %range4504, label %inrange4505 +range4504: + call void @finch_panic_index(ptr @.str.2848, i64 2051, i64 2, i64 %t61) + unreachable +inrange4505: + %t63 = extractvalue { ptr, i64, i64 } %t60, 0 + %t64 = getelementptr inbounds %S.ast.Node, ptr %t63, i64 2 + %t65 = load %S.ast.Node, ptr %t64 + call void @finch.gen.stmt(ptr %t58, %S.ast.Node %t65) + %t66 = load i1, ptr %a49 + br label %logic.from4506 +logic.from4506: + br i1 %t66, label %logic.end4508, label %logic.rhs4507 +logic.rhs4507: + %t67 = load ptr, ptr %a1 + %t68 = icmp eq ptr %t67, null + br i1 %t68, label %panic4509, label %ok4510 +panic4509: + call void @finch_panic(ptr @.str.2849, i64 2052, ptr @.str.2850) + unreachable +ok4510: + %t69 = getelementptr inbounds %S.gen.Gen, ptr %t67, i32 0, i32 9 + %t70 = load i1, ptr %t69 + %t71 = xor i1 %t70, true + br label %logic.rend4511 +logic.rend4511: + br label %logic.end4508 +logic.end4508: + %t72 = phi i1 [ true, %logic.from4506 ], [ %t71, %logic.rend4511 ] + store i1 %t72, ptr %a49 + %t73 = load ptr, ptr %a1 + %t74 = load { ptr, i64, i64 }, ptr %a21 + call void @finch.gen.br(ptr %t73, { ptr, i64, i64 } %t74) + br label %endif4503 +else4502: + store i1 true, ptr %a49 + br label %endif4503 +endif4503: + %t75 = load i1, ptr %a49 + br i1 %t75, label %then4512, label %endif4514 +then4512: + %t76 = load ptr, ptr %a1 + %t77 = load { ptr, i64, i64 }, ptr %a21 + call void @finch.gen.label(ptr %t76, { ptr, i64, i64 } %t77) + br label %endif4514 +endif4514: + ret void +} + +define internal void @finch.gen.whileStmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca i1, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca i1, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t3, { ptr, i64, i64 } { ptr @.str.2851, i64 10, i64 0 }) + store { ptr, i64, i64 } %t4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t6, { ptr, i64, i64 } { ptr @.str.2852, i64 10, i64 0 }) + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = load ptr, ptr %a1 + %t10 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t9, { ptr, i64, i64 } { ptr @.str.2853, i64 9, i64 0 }) + store { ptr, i64, i64 } %t10, ptr %a11 + %t12 = load ptr, ptr %a1 + %t13 = load { ptr, i64, i64 }, ptr %a5 + call void @finch.gen.br(ptr %t12, { ptr, i64, i64 } %t13) + %t14 = load ptr, ptr %a1 + %t15 = load { ptr, i64, i64 }, ptr %a5 + call void @finch.gen.label(ptr %t14, { ptr, i64, i64 } %t15) + %t16 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t17 = load { ptr, i64, i64 }, ptr %t16 + %t18 = extractvalue { ptr, i64, i64 } %t17, 1 + %t19 = icmp uge i64 0, %t18 + br i1 %t19, label %range4515, label %inrange4516 +range4515: + call void @finch_panic_index(ptr @.str.2854, i64 2068, i64 0, i64 %t18) + unreachable +inrange4516: + %t20 = extractvalue { ptr, i64, i64 } %t17, 0 + %t21 = getelementptr inbounds %S.ast.Node, ptr %t20, i64 0 + %t22 = getelementptr inbounds %S.ast.Node, ptr %t21, i32 0, i32 0 + %t23 = load { ptr, i64, i64 }, ptr %t22 + store { ptr, i64, i64 } %t23, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.2855, i64 4, i64 0 }, ptr %a25 + %t26 = call i32 @finch_str_eq(ptr %a24, ptr %a25) + %t27 = icmp ne i32 %t26, 0 + br label %logic.from4517 +logic.from4517: + br i1 %t27, label %logic.rhs4518, label %logic.end4519 +logic.rhs4518: + %t28 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t29 = load { ptr, i64, i64 }, ptr %t28 + %t30 = extractvalue { ptr, i64, i64 } %t29, 1 + %t31 = icmp uge i64 0, %t30 + br i1 %t31, label %range4520, label %inrange4521 +range4520: + call void @finch_panic_index(ptr @.str.2856, i64 2068, i64 0, i64 %t30) + unreachable +inrange4521: + %t32 = extractvalue { ptr, i64, i64 } %t29, 0 + %t33 = getelementptr inbounds %S.ast.Node, ptr %t32, i64 0 + %t34 = getelementptr inbounds %S.ast.Node, ptr %t33, i32 0, i32 4 + %t35 = load { ptr, i64, i64 }, ptr %t34 + store { ptr, i64, i64 } %t35, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.2857, i64 4, i64 0 }, ptr %a37 + %t38 = call i32 @finch_str_eq(ptr %a36, ptr %a37) + %t39 = icmp ne i32 %t38, 0 + br label %logic.rend4522 +logic.rend4522: + br label %logic.end4519 +logic.end4519: + %t40 = phi i1 [ false, %logic.from4517 ], [ %t39, %logic.rend4522 ] + store i1 %t40, ptr %a41 + %t42 = load ptr, ptr %a1 + %t43 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t44 = load { ptr, i64, i64 }, ptr %t43 + %t45 = extractvalue { ptr, i64, i64 } %t44, 1 + %t46 = icmp uge i64 0, %t45 + br i1 %t46, label %range4523, label %inrange4524 +range4523: + call void @finch_panic_index(ptr @.str.2858, i64 2069, i64 0, i64 %t45) + unreachable +inrange4524: + %t47 = extractvalue { ptr, i64, i64 } %t44, 0 + %t48 = getelementptr inbounds %S.ast.Node, ptr %t47, i64 0 + %t49 = load %S.ast.Node, ptr %t48 + %t50 = call { ptr, i64, i64 } @finch.gen.condition(ptr %t42, %S.ast.Node %t49) + store { ptr, i64, i64 } %t50, ptr %a51 + %t52 = load i1, ptr %a41 + br i1 %t52, label %then4525, label %else4526 +then4525: + %t53 = load ptr, ptr %a1 + %t54 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.br(ptr %t53, { ptr, i64, i64 } %t54) + br label %endif4527 +else4526: + %t55 = load ptr, ptr %a1 + %t56 = load { ptr, i64, i64 }, ptr %a51 + %t57 = load { ptr, i64, i64 }, ptr %a8 + %t58 = load { ptr, i64, i64 }, ptr %a11 + call void @finch.gen.condBr(ptr %t55, { ptr, i64, i64 } %t56, { ptr, i64, i64 } %t57, { ptr, i64, i64 } %t58) + br label %endif4527 +endif4527: + %t59 = load ptr, ptr %a1 + %t60 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.label(ptr %t59, { ptr, i64, i64 } %t60) + %t61 = load ptr, ptr %a1 + %t62 = icmp eq ptr %t61, null + br i1 %t62, label %panic4528, label %ok4529 +panic4528: + call void @finch_panic(ptr @.str.2859, i64 2076, ptr @.str.2860) + unreachable +ok4529: + %t63 = getelementptr inbounds %S.gen.Gen, ptr %t61, i32 0, i32 11 + %t64 = getelementptr inbounds { ptr, i64, i64 }, ptr %t63, i32 0, i32 1 + %t65 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t65, ptr %a66 + call void @finch_str_copy(ptr %a67, ptr %a66) + %t68 = load { ptr, i64, i64 }, ptr %a67 + %t69 = insertvalue %S.gen.Loop zeroinitializer, { ptr, i64, i64 } %t68, 0 + %t70 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t70, ptr %a71 + call void @finch_str_copy(ptr %a72, ptr %a71) + %t73 = load { ptr, i64, i64 }, ptr %a72 + %t74 = insertvalue %S.gen.Loop %t69, { ptr, i64, i64 } %t73, 1 + %t75 = load ptr, ptr %a1 + %t76 = icmp eq ptr %t75, null + br i1 %t76, label %panic4530, label %ok4531 +panic4530: + call void @finch_panic(ptr @.str.2861, i64 2076, ptr @.str.2862) + unreachable +ok4531: + %t77 = getelementptr inbounds %S.gen.Gen, ptr %t75, i32 0, i32 10 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %t77, i32 0, i32 1 + %t79 = load i64, ptr %t78 + %t80 = insertvalue %S.gen.Loop %t74, i64 %t79, 2 + %t81 = load i64, ptr %t64 + %t82 = add i64 %t81, 1 + call void @finch_arr_reserve(ptr %t63, i64 %t82, i64 ptrtoint (ptr getelementptr (%S.gen.Loop, ptr null, i32 1) to i64)) + %t83 = load ptr, ptr %t63 + %t84 = getelementptr inbounds %S.gen.Loop, ptr %t83, i64 %t81 + store %S.gen.Loop %t80, ptr %t84 + store i64 %t82, ptr %t64 + %t85 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t86 = load { ptr, i64, i64 }, ptr %t85 + %t87 = extractvalue { ptr, i64, i64 } %t86, 1 + %t88 = icmp uge i64 1, %t87 + br i1 %t88, label %range4532, label %inrange4533 +range4532: + call void @finch_panic_index(ptr @.str.2863, i64 2077, i64 1, i64 %t87) + unreachable +inrange4533: + %t89 = extractvalue { ptr, i64, i64 } %t86, 0 + %t90 = getelementptr inbounds %S.ast.Node, ptr %t89, i64 1 + %t91 = load %S.ast.Node, ptr %t90 + %t92 = call i1 @finch.gen.countBreaks(%S.ast.Node %t91) + store i1 %t92, ptr %a93 + %t94 = load ptr, ptr %a1 + %t95 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t96 = load { ptr, i64, i64 }, ptr %t95 + %t97 = extractvalue { ptr, i64, i64 } %t96, 1 + %t98 = icmp uge i64 1, %t97 + br i1 %t98, label %range4534, label %inrange4535 +range4534: + call void @finch_panic_index(ptr @.str.2864, i64 2078, i64 1, i64 %t97) + unreachable +inrange4535: + %t99 = extractvalue { ptr, i64, i64 } %t96, 0 + %t100 = getelementptr inbounds %S.ast.Node, ptr %t99, i64 1 + %t101 = load %S.ast.Node, ptr %t100 + call void @finch.gen.block(ptr %t94, %S.ast.Node %t101, i1 true) + %t102 = load ptr, ptr %a1 + %t103 = icmp eq ptr %t102, null + br i1 %t103, label %panic4536, label %ok4537 +panic4536: + call void @finch_panic(ptr @.str.2865, i64 2079, ptr @.str.2866) + unreachable +ok4537: + %t104 = getelementptr inbounds %S.gen.Gen, ptr %t102, i32 0, i32 11 + %t105 = getelementptr inbounds { ptr, i64, i64 }, ptr %t104, i32 0, i32 1 + %t106 = load i64, ptr %t105 + %t107 = icmp eq i64 %t106, 0 + br i1 %t107, label %panic4538, label %ok4539 +panic4538: + call void @finch_panic(ptr @.str.2867, i64 2079, ptr @.str.2868) + unreachable +ok4539: + %t108 = sub i64 %t106, 1 + %t109 = load ptr, ptr %t104 + %t110 = getelementptr inbounds %S.gen.Loop, ptr %t109, i64 %t108 + %t111 = load %S.gen.Loop, ptr %t110 + store i64 %t108, ptr %t105 + %t112 = load ptr, ptr %a1 + %t113 = load { ptr, i64, i64 }, ptr %a5 + call void @finch.gen.br(ptr %t112, { ptr, i64, i64 } %t113) + %t114 = load i1, ptr %a41 + %t115 = xor i1 %t114, true + br label %logic.from4540 +logic.from4540: + br i1 %t115, label %logic.end4542, label %logic.rhs4541 +logic.rhs4541: + %t116 = load i1, ptr %a93 + br label %logic.rend4543 +logic.rend4543: + br label %logic.end4542 +logic.end4542: + %t117 = phi i1 [ true, %logic.from4540 ], [ %t116, %logic.rend4543 ] + br i1 %t117, label %then4544, label %endif4546 +then4544: + %t118 = load ptr, ptr %a1 + %t119 = load { ptr, i64, i64 }, ptr %a11 + call void @finch.gen.label(ptr %t118, { ptr, i64, i64 } %t119) + br label %endif4546 +endif4546: + ret void +} + +define internal i1 @finch.gen.countBreaks(%S.ast.Node %p0) { +entry: + %a1 = alloca %S.ast.Node, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca i64, align 16 + %a37 = alloca %S.ast.Node, align 16 + store %S.ast.Node %p0, ptr %a1 + %t2 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t3 = load { ptr, i64, i64 }, ptr %t2 + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.2869, i64 5, i64 0 }, ptr %a5 + %t6 = call i32 @finch_str_eq(ptr %a4, ptr %a5) + %t7 = icmp ne i32 %t6, 0 + br i1 %t7, label %then4547, label %endif4549 +then4547: + ret i1 true +endif4549: + %t8 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t9 = load { ptr, i64, i64 }, ptr %t8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.2870, i64 5, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br label %logic.from4550 +logic.from4550: + br i1 %t13, label %logic.end4552, label %logic.rhs4551 +logic.rhs4551: + %t14 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t15 = load { ptr, i64, i64 }, ptr %t14 + store { ptr, i64, i64 } %t15, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.2871, i64 3, i64 0 }, ptr %a17 + %t18 = call i32 @finch_str_eq(ptr %a16, ptr %a17) + %t19 = icmp ne i32 %t18, 0 + br label %logic.rend4553 +logic.rend4553: + br label %logic.end4552 +logic.end4552: + %t20 = phi i1 [ true, %logic.from4550 ], [ %t19, %logic.rend4553 ] + br label %logic.from4554 +logic.from4554: + br i1 %t20, label %logic.end4556, label %logic.rhs4555 +logic.rhs4555: + %t21 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 0 + %t22 = load { ptr, i64, i64 }, ptr %t21 + store { ptr, i64, i64 } %t22, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.2872, i64 4, i64 0 }, ptr %a24 + %t25 = call i32 @finch_str_eq(ptr %a23, ptr %a24) + %t26 = icmp ne i32 %t25, 0 + br label %logic.rend4557 +logic.rend4557: + br label %logic.end4556 +logic.end4556: + %t27 = phi i1 [ true, %logic.from4554 ], [ %t26, %logic.rend4557 ] + br i1 %t27, label %then4558, label %endif4560 +then4558: + ret i1 false +endif4560: + %t28 = getelementptr inbounds %S.ast.Node, ptr %a1, i32 0, i32 9 + store i64 0, ptr %a29 + br label %each.cond4561 +each.cond4561: + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t28, i32 0, i32 1 + %t31 = load i64, ptr %t30 + %t32 = load i64, ptr %a29 + %t33 = icmp slt i64 %t32, %t31 + br i1 %t33, label %each.body4562, label %each.end4564 +each.body4562: + %t34 = load ptr, ptr %t28 + %t35 = getelementptr inbounds %S.ast.Node, ptr %t34, i64 %t32 + %t36 = load %S.ast.Node, ptr %t35 + store %S.ast.Node %t36, ptr %a37 + %t38 = load %S.ast.Node, ptr %a37 + %t39 = call i1 @finch.gen.countBreaks(%S.ast.Node %t38) + br i1 %t39, label %then4565, label %endif4567 +then4565: + ret i1 true +endif4567: + br label %each.step4563 +each.step4563: + %t40 = load i64, ptr %a29 + %t41 = add i64 %t40, 1 + store i64 %t41, ptr %a29 + br label %each.cond4561 +each.end4564: + ret i1 false +} + +define internal void @finch.gen.forStmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load ptr, ptr %a1 + %t5 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = icmp uge i64 0, %t7 + br i1 %t8, label %range4568, label %inrange4569 +range4568: + call void @finch_panic_index(ptr @.str.2873, i64 2103, i64 0, i64 %t7) + unreachable +inrange4569: + %t9 = extractvalue { ptr, i64, i64 } %t6, 0 + %t10 = getelementptr inbounds %S.ast.Node, ptr %t9, i64 0 + %t11 = load %S.ast.Node, ptr %t10 + %t12 = call %S.gen.Val @finch.gen.expr(ptr %t4, %S.ast.Node %t11) + %t13 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2874, i64 3, i64 0 }) + %t14 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t15 = load { ptr, i64, i64 }, ptr %t14 + %t16 = extractvalue { ptr, i64, i64 } %t15, 1 + %t17 = icmp uge i64 0, %t16 + br i1 %t17, label %range4570, label %inrange4571 +range4570: + call void @finch_panic_index(ptr @.str.2875, i64 2103, i64 0, i64 %t16) + unreachable +inrange4571: + %t18 = extractvalue { ptr, i64, i64 } %t15, 0 + %t19 = getelementptr inbounds %S.ast.Node, ptr %t18, i64 0 + %t20 = load %S.ast.Node, ptr %t19 + %t21 = call %S.gen.Val @finch.gen.coerce(ptr %t3, %S.gen.Val %t12, %S.ast.Type %t13, %S.ast.Node %t20, { ptr, i64, i64 } { ptr @.str.2876, i64 20, i64 0 }) + %t22 = extractvalue %S.gen.Val %t21, 0 + store { ptr, i64, i64 } %t22, ptr %a23 + call void @finch_str_copy(ptr %a24, ptr %a23) + %t25 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t25, ptr %a26 + %t27 = load ptr, ptr %a1 + %t28 = load ptr, ptr %a1 + %t29 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t30 = load { ptr, i64, i64 }, ptr %t29 + %t31 = extractvalue { ptr, i64, i64 } %t30, 1 + %t32 = icmp uge i64 1, %t31 + br i1 %t32, label %range4572, label %inrange4573 +range4572: + call void @finch_panic_index(ptr @.str.2877, i64 2104, i64 1, i64 %t31) + unreachable +inrange4573: + %t33 = extractvalue { ptr, i64, i64 } %t30, 0 + %t34 = getelementptr inbounds %S.ast.Node, ptr %t33, i64 1 + %t35 = load %S.ast.Node, ptr %t34 + %t36 = call %S.gen.Val @finch.gen.expr(ptr %t28, %S.ast.Node %t35) + %t37 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2878, i64 3, i64 0 }) + %t38 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t39 = load { ptr, i64, i64 }, ptr %t38 + %t40 = extractvalue { ptr, i64, i64 } %t39, 1 + %t41 = icmp uge i64 1, %t40 + br i1 %t41, label %range4574, label %inrange4575 +range4574: + call void @finch_panic_index(ptr @.str.2879, i64 2104, i64 1, i64 %t40) + unreachable +inrange4575: + %t42 = extractvalue { ptr, i64, i64 } %t39, 0 + %t43 = getelementptr inbounds %S.ast.Node, ptr %t42, i64 1 + %t44 = load %S.ast.Node, ptr %t43 + %t45 = call %S.gen.Val @finch.gen.coerce(ptr %t27, %S.gen.Val %t36, %S.ast.Type %t37, %S.ast.Node %t44, { ptr, i64, i64 } { ptr @.str.2880, i64 18, i64 0 }) + %t46 = extractvalue %S.gen.Val %t45, 0 + store { ptr, i64, i64 } %t46, ptr %a47 + call void @finch_str_copy(ptr %a48, ptr %a47) + %t49 = load { ptr, i64, i64 }, ptr %a48 + store { ptr, i64, i64 } %t49, ptr %a50 + %t51 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t51) + %t52 = load ptr, ptr %a1 + %t53 = load %S.ast.Node, ptr %a2 + %t54 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t55 = load { ptr, i64, i64 }, ptr %t54 + %t56 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2881, i64 3, i64 0 }) + %t57 = load { ptr, i64, i64 }, ptr %a26 + %t58 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t52, %S.ast.Node %t53, { ptr, i64, i64 } %t55, %S.ast.Type %t56, { ptr, i64, i64 } %t57, i1 true) + store { ptr, i64, i64 } %t58, ptr %a59 + %t60 = load ptr, ptr %a1 + %t61 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t60, { ptr, i64, i64 } { ptr @.str.2882, i64 8, i64 0 }) + store { ptr, i64, i64 } %t61, ptr %a62 + %t63 = load ptr, ptr %a1 + %t64 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t63, { ptr, i64, i64 } { ptr @.str.2883, i64 8, i64 0 }) + store { ptr, i64, i64 } %t64, ptr %a65 + %t66 = load ptr, ptr %a1 + %t67 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t66, { ptr, i64, i64 } { ptr @.str.2884, i64 8, i64 0 }) + store { ptr, i64, i64 } %t67, ptr %a68 + %t69 = load ptr, ptr %a1 + %t70 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t69, { ptr, i64, i64 } { ptr @.str.2885, i64 7, i64 0 }) + store { ptr, i64, i64 } %t70, ptr %a71 + %t72 = load ptr, ptr %a1 + %t73 = load { ptr, i64, i64 }, ptr %a62 + call void @finch.gen.br(ptr %t72, { ptr, i64, i64 } %t73) + %t74 = load ptr, ptr %a1 + %t75 = load { ptr, i64, i64 }, ptr %a62 + call void @finch.gen.label(ptr %t74, { ptr, i64, i64 } %t75) + %t76 = load ptr, ptr %a1 + %t77 = load { ptr, i64, i64 }, ptr %a59 + %t78 = call { ptr, i64, i64 } @finch.gen.load(ptr %t76, { ptr, i64, i64 } { ptr @.str.2886, i64 3, i64 0 }, { ptr, i64, i64 } %t77) + store { ptr, i64, i64 } %t78, ptr %a79 + %t80 = load ptr, ptr %a1 + %t81 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.2887, i64 13, i64 0 }, ptr %a83 + store { ptr, i64, i64 } %t81, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t85, ptr %a87 + store { ptr, i64, i64 } { ptr @.str.2888, i64 2, i64 0 }, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + %t90 = load { ptr, i64, i64 }, ptr %a50 + store { ptr, i64, i64 } %t89, ptr %a92 + store { ptr, i64, i64 } %t90, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + %t95 = call { ptr, i64, i64 } @finch.gen.op(ptr %t80, { ptr, i64, i64 } %t94) + store { ptr, i64, i64 } %t95, ptr %a96 + %t97 = load ptr, ptr %a1 + %t98 = load { ptr, i64, i64 }, ptr %a96 + %t99 = load { ptr, i64, i64 }, ptr %a65 + %t100 = load { ptr, i64, i64 }, ptr %a71 + call void @finch.gen.condBr(ptr %t97, { ptr, i64, i64 } %t98, { ptr, i64, i64 } %t99, { ptr, i64, i64 } %t100) + %t101 = load ptr, ptr %a1 + %t102 = load { ptr, i64, i64 }, ptr %a65 + call void @finch.gen.label(ptr %t101, { ptr, i64, i64 } %t102) + %t103 = load ptr, ptr %a1 + %t104 = icmp eq ptr %t103, null + br i1 %t104, label %panic4576, label %ok4577 +panic4576: + call void @finch_panic(ptr @.str.2889, i64 2117, ptr @.str.2890) + unreachable +ok4577: + %t105 = getelementptr inbounds %S.gen.Gen, ptr %t103, i32 0, i32 11 + %t106 = getelementptr inbounds { ptr, i64, i64 }, ptr %t105, i32 0, i32 1 + %t107 = load { ptr, i64, i64 }, ptr %a68 + store { ptr, i64, i64 } %t107, ptr %a108 + call void @finch_str_copy(ptr %a109, ptr %a108) + %t110 = load { ptr, i64, i64 }, ptr %a109 + %t111 = insertvalue %S.gen.Loop zeroinitializer, { ptr, i64, i64 } %t110, 0 + %t112 = load { ptr, i64, i64 }, ptr %a71 + store { ptr, i64, i64 } %t112, ptr %a113 + call void @finch_str_copy(ptr %a114, ptr %a113) + %t115 = load { ptr, i64, i64 }, ptr %a114 + %t116 = insertvalue %S.gen.Loop %t111, { ptr, i64, i64 } %t115, 1 + %t117 = load ptr, ptr %a1 + %t118 = icmp eq ptr %t117, null + br i1 %t118, label %panic4578, label %ok4579 +panic4578: + call void @finch_panic(ptr @.str.2891, i64 2117, ptr @.str.2892) + unreachable +ok4579: + %t119 = getelementptr inbounds %S.gen.Gen, ptr %t117, i32 0, i32 10 + %t120 = getelementptr inbounds { ptr, i64, i64 }, ptr %t119, i32 0, i32 1 + %t121 = load i64, ptr %t120 + %t122 = insertvalue %S.gen.Loop %t116, i64 %t121, 2 + %t123 = load i64, ptr %t106 + %t124 = add i64 %t123, 1 + call void @finch_arr_reserve(ptr %t105, i64 %t124, i64 ptrtoint (ptr getelementptr (%S.gen.Loop, ptr null, i32 1) to i64)) + %t125 = load ptr, ptr %t105 + %t126 = getelementptr inbounds %S.gen.Loop, ptr %t125, i64 %t123 + store %S.gen.Loop %t122, ptr %t126 + store i64 %t124, ptr %t106 + %t127 = load ptr, ptr %a1 + %t128 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t129 = load { ptr, i64, i64 }, ptr %t128 + %t130 = extractvalue { ptr, i64, i64 } %t129, 1 + %t131 = icmp uge i64 2, %t130 + br i1 %t131, label %range4580, label %inrange4581 +range4580: + call void @finch_panic_index(ptr @.str.2893, i64 2118, i64 2, i64 %t130) + unreachable +inrange4581: + %t132 = extractvalue { ptr, i64, i64 } %t129, 0 + %t133 = getelementptr inbounds %S.ast.Node, ptr %t132, i64 2 + %t134 = load %S.ast.Node, ptr %t133 + call void @finch.gen.block(ptr %t127, %S.ast.Node %t134, i1 true) + %t135 = load ptr, ptr %a1 + %t136 = icmp eq ptr %t135, null + br i1 %t136, label %panic4582, label %ok4583 +panic4582: + call void @finch_panic(ptr @.str.2894, i64 2119, ptr @.str.2895) + unreachable +ok4583: + %t137 = getelementptr inbounds %S.gen.Gen, ptr %t135, i32 0, i32 11 + %t138 = getelementptr inbounds { ptr, i64, i64 }, ptr %t137, i32 0, i32 1 + %t139 = load i64, ptr %t138 + %t140 = icmp eq i64 %t139, 0 + br i1 %t140, label %panic4584, label %ok4585 +panic4584: + call void @finch_panic(ptr @.str.2896, i64 2119, ptr @.str.2897) + unreachable +ok4585: + %t141 = sub i64 %t139, 1 + %t142 = load ptr, ptr %t137 + %t143 = getelementptr inbounds %S.gen.Loop, ptr %t142, i64 %t141 + %t144 = load %S.gen.Loop, ptr %t143 + store i64 %t141, ptr %t138 + %t145 = load ptr, ptr %a1 + %t146 = load { ptr, i64, i64 }, ptr %a68 + call void @finch.gen.br(ptr %t145, { ptr, i64, i64 } %t146) + %t147 = load ptr, ptr %a1 + %t148 = load { ptr, i64, i64 }, ptr %a68 + call void @finch.gen.label(ptr %t147, { ptr, i64, i64 } %t148) + %t149 = load ptr, ptr %a1 + %t150 = load { ptr, i64, i64 }, ptr %a59 + %t151 = call { ptr, i64, i64 } @finch.gen.load(ptr %t149, { ptr, i64, i64 } { ptr @.str.2898, i64 3, i64 0 }, { ptr, i64, i64 } %t150) + store { ptr, i64, i64 } %t151, ptr %a152 + %t153 = load ptr, ptr %a1 + %t154 = load ptr, ptr %a1 + %t155 = load { ptr, i64, i64 }, ptr %a152 + store { ptr, i64, i64 } { ptr @.str.2900, i64 8, i64 0 }, ptr %a157 + store { ptr, i64, i64 } %t155, ptr %a158 + call void @finch_str_concat(ptr %a156, ptr %a157, ptr %a158) + %t159 = load { ptr, i64, i64 }, ptr %a156 + store { ptr, i64, i64 } %t159, ptr %a161 + store { ptr, i64, i64 } { ptr @.str.2901, i64 3, i64 0 }, ptr %a162 + call void @finch_str_concat(ptr %a160, ptr %a161, ptr %a162) + %t163 = load { ptr, i64, i64 }, ptr %a160 + %t164 = call { ptr, i64, i64 } @finch.gen.op(ptr %t154, { ptr, i64, i64 } %t163) + %t165 = load { ptr, i64, i64 }, ptr %a59 + call void @finch.gen.store(ptr %t153, { ptr, i64, i64 } { ptr @.str.2899, i64 3, i64 0 }, { ptr, i64, i64 } %t164, { ptr, i64, i64 } %t165) + %t166 = load ptr, ptr %a1 + %t167 = load { ptr, i64, i64 }, ptr %a62 + call void @finch.gen.br(ptr %t166, { ptr, i64, i64 } %t167) + %t168 = load ptr, ptr %a1 + %t169 = load { ptr, i64, i64 }, ptr %a71 + call void @finch.gen.label(ptr %t168, { ptr, i64, i64 } %t169) + %t170 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t170) + ret void +} + +define internal void @finch.gen.eachMap(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3, i1 %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca i1, align 16 + %a13 = alloca %S.ast.Type, align 16 + %a14 = alloca %S.ast.Type, align 16 + %a16 = alloca %S.ast.Type, align 16 + %a24 = alloca %S.ast.Type, align 16 + %a25 = alloca %S.ast.Type, align 16 + %a27 = alloca %S.ast.Type, align 16 + %a47 = alloca i1, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a231 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a377 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store i1 %p4, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t7 = load { ptr, i64, i64 }, ptr %t6 + %t8 = extractvalue { ptr, i64, i64 } %t7, 1 + %t9 = icmp uge i64 0, %t8 + br i1 %t9, label %range4586, label %inrange4587 +range4586: + call void @finch_panic_index(ptr @.str.2902, i64 2131, i64 0, i64 %t8) + unreachable +inrange4587: + %t10 = extractvalue { ptr, i64, i64 } %t7, 0 + %t11 = getelementptr inbounds %S.ast.Type, ptr %t10, i64 0 + %t12 = load %S.ast.Type, ptr %t11 + store %S.ast.Type %t12, ptr %a13 + call void @finch.copy.S_ast_Type(ptr %a14, ptr %a13) + %t15 = load %S.ast.Type, ptr %a14 + store %S.ast.Type %t15, ptr %a16 + %t17 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t18 = load { ptr, i64, i64 }, ptr %t17 + %t19 = extractvalue { ptr, i64, i64 } %t18, 1 + %t20 = icmp uge i64 1, %t19 + br i1 %t20, label %range4588, label %inrange4589 +range4588: + call void @finch_panic_index(ptr @.str.2903, i64 2132, i64 1, i64 %t19) + unreachable +inrange4589: + %t21 = extractvalue { ptr, i64, i64 } %t18, 0 + %t22 = getelementptr inbounds %S.ast.Type, ptr %t21, i64 1 + %t23 = load %S.ast.Type, ptr %t22 + store %S.ast.Type %t23, ptr %a24 + call void @finch.copy.S_ast_Type(ptr %a25, ptr %a24) + %t26 = load %S.ast.Type, ptr %a25 + store %S.ast.Type %t26, ptr %a27 + %t28 = load i1, ptr %a5 + br label %logic.from4590 +logic.from4590: + br i1 %t28, label %logic.rhs4591, label %logic.end4592 +logic.rhs4591: + %t29 = load ptr, ptr %a1 + %t30 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t31 = load { ptr, i64, i64 }, ptr %t30 + %t32 = extractvalue { ptr, i64, i64 } %t31, 1 + %t33 = icmp uge i64 0, %t32 + br i1 %t33, label %range4593, label %inrange4594 +range4593: + call void @finch_panic_index(ptr @.str.2904, i64 2133, i64 0, i64 %t32) + unreachable +inrange4594: + %t34 = extractvalue { ptr, i64, i64 } %t31, 0 + %t35 = getelementptr inbounds %S.ast.Node, ptr %t34, i64 0 + %t36 = load %S.ast.Node, ptr %t35 + %t37 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t36) + %t38 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t39 = load { ptr, i64, i64 }, ptr %t38 + %t40 = extractvalue { ptr, i64, i64 } %t39, 1 + %t41 = icmp uge i64 1, %t40 + br i1 %t41, label %range4595, label %inrange4596 +range4595: + call void @finch_panic_index(ptr @.str.2905, i64 2133, i64 1, i64 %t40) + unreachable +inrange4596: + %t42 = extractvalue { ptr, i64, i64 } %t39, 0 + %t43 = getelementptr inbounds %S.ast.Node, ptr %t42, i64 1 + %t44 = load %S.ast.Node, ptr %t43 + %t45 = call i1 @finch.gen.mutates(ptr %t29, { ptr, i64, i64 } %t37, %S.ast.Node %t44) + br label %logic.rend4597 +logic.rend4597: + br label %logic.end4592 +logic.end4592: + %t46 = phi i1 [ false, %logic.from4590 ], [ %t45, %logic.rend4597 ] + store i1 %t46, ptr %a47 + %t48 = load ptr, ptr %a1 + %t49 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t48, { ptr, i64, i64 } { ptr @.str.2906, i64 3, i64 0 }) + store { ptr, i64, i64 } %t49, ptr %a50 + %t51 = load ptr, ptr %a1 + %t52 = load { ptr, i64, i64 }, ptr %a50 + call void @finch.gen.store(ptr %t51, { ptr, i64, i64 } { ptr @.str.2907, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.2908, i64 1, i64 0 }, { ptr, i64, i64 } %t52) + store { ptr, i64, i64 } { ptr @.str.2909, i64 0, i64 0 }, ptr %a53 + %t54 = load i1, ptr %a5 + br i1 %t54, label %then4598, label %endif4600 +then4598: + %t55 = load ptr, ptr %a1 + %t56 = load ptr, ptr %a1 + %t57 = load ptr, ptr %a1 + %t58 = load %S.ast.Type, ptr %a4 + %t59 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t57, %S.ast.Type %t58) + store { ptr, i64, i64 } { ptr @.str.2911, i64 23, i64 0 }, ptr %a61 + store { ptr, i64, i64 } %t59, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + store { ptr, i64, i64 } %t63, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.2912, i64 6, i64 0 }, ptr %a66 + call void @finch_str_concat(ptr %a64, ptr %a65, ptr %a66) + %t67 = load { ptr, i64, i64 }, ptr %a64 + %t68 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t67, ptr %a70 + store { ptr, i64, i64 } %t68, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + store { ptr, i64, i64 } %t72, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.2913, i64 14, i64 0 }, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + %t77 = call { ptr, i64, i64 } @finch.gen.op(ptr %t56, { ptr, i64, i64 } %t76) + %t78 = call { ptr, i64, i64 } @finch.gen.load(ptr %t55, { ptr, i64, i64 } { ptr @.str.2910, i64 3, i64 0 }, { ptr, i64, i64 } %t77) + store { ptr, i64, i64 } %t78, ptr %a53 + br label %endif4600 +endif4600: + %t79 = load ptr, ptr %a1 + %t80 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t79, { ptr, i64, i64 } { ptr @.str.2914, i64 8, i64 0 }) + store { ptr, i64, i64 } %t80, ptr %a81 + %t82 = load ptr, ptr %a1 + %t83 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t82, { ptr, i64, i64 } { ptr @.str.2915, i64 9, i64 0 }) + store { ptr, i64, i64 } %t83, ptr %a84 + %t85 = load ptr, ptr %a1 + %t86 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t85, { ptr, i64, i64 } { ptr @.str.2916, i64 8, i64 0 }) + store { ptr, i64, i64 } %t86, ptr %a87 + %t88 = load ptr, ptr %a1 + %t89 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t88, { ptr, i64, i64 } { ptr @.str.2917, i64 8, i64 0 }) + store { ptr, i64, i64 } %t89, ptr %a90 + %t91 = load ptr, ptr %a1 + %t92 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t91, { ptr, i64, i64 } { ptr @.str.2918, i64 7, i64 0 }) + store { ptr, i64, i64 } %t92, ptr %a93 + %t94 = load ptr, ptr %a1 + %t95 = load { ptr, i64, i64 }, ptr %a81 + call void @finch.gen.br(ptr %t94, { ptr, i64, i64 } %t95) + %t96 = load ptr, ptr %a1 + %t97 = load { ptr, i64, i64 }, ptr %a81 + call void @finch.gen.label(ptr %t96, { ptr, i64, i64 } %t97) + %t98 = load i1, ptr %a5 + br label %logic.from4601 +logic.from4601: + br i1 %t98, label %logic.rhs4602, label %logic.end4603 +logic.rhs4602: + %t99 = load i1, ptr %a47 + br label %logic.rend4604 +logic.rend4604: + br label %logic.end4603 +logic.end4603: + %t100 = phi i1 [ false, %logic.from4601 ], [ %t99, %logic.rend4604 ] + br i1 %t100, label %then4605, label %endif4607 +then4605: + %t101 = load ptr, ptr %a1 + %t102 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t101, { ptr, i64, i64 } { ptr @.str.2919, i64 11, i64 0 }) + store { ptr, i64, i64 } %t102, ptr %a103 + %t104 = load ptr, ptr %a1 + %t105 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t104, { ptr, i64, i64 } { ptr @.str.2920, i64 8, i64 0 }) + store { ptr, i64, i64 } %t105, ptr %a106 + %t107 = load ptr, ptr %a1 + %t108 = load ptr, ptr %a1 + %t109 = load ptr, ptr %a1 + %t110 = load %S.ast.Type, ptr %a4 + %t111 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t109, %S.ast.Type %t110) + store { ptr, i64, i64 } { ptr @.str.2922, i64 23, i64 0 }, ptr %a113 + store { ptr, i64, i64 } %t111, ptr %a114 + call void @finch_str_concat(ptr %a112, ptr %a113, ptr %a114) + %t115 = load { ptr, i64, i64 }, ptr %a112 + store { ptr, i64, i64 } %t115, ptr %a117 + store { ptr, i64, i64 } { ptr @.str.2923, i64 6, i64 0 }, ptr %a118 + call void @finch_str_concat(ptr %a116, ptr %a117, ptr %a118) + %t119 = load { ptr, i64, i64 }, ptr %a116 + %t120 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t119, ptr %a122 + store { ptr, i64, i64 } %t120, ptr %a123 + call void @finch_str_concat(ptr %a121, ptr %a122, ptr %a123) + %t124 = load { ptr, i64, i64 }, ptr %a121 + store { ptr, i64, i64 } %t124, ptr %a126 + store { ptr, i64, i64 } { ptr @.str.2924, i64 14, i64 0 }, ptr %a127 + call void @finch_str_concat(ptr %a125, ptr %a126, ptr %a127) + %t128 = load { ptr, i64, i64 }, ptr %a125 + %t129 = call { ptr, i64, i64 } @finch.gen.op(ptr %t108, { ptr, i64, i64 } %t128) + %t130 = call { ptr, i64, i64 } @finch.gen.load(ptr %t107, { ptr, i64, i64 } { ptr @.str.2921, i64 3, i64 0 }, { ptr, i64, i64 } %t129) + store { ptr, i64, i64 } %t130, ptr %a131 + %t132 = load ptr, ptr %a1 + %t133 = load ptr, ptr %a1 + %t134 = load { ptr, i64, i64 }, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.2925, i64 12, i64 0 }, ptr %a136 + store { ptr, i64, i64 } %t134, ptr %a137 + call void @finch_str_concat(ptr %a135, ptr %a136, ptr %a137) + %t138 = load { ptr, i64, i64 }, ptr %a135 + store { ptr, i64, i64 } %t138, ptr %a140 + store { ptr, i64, i64 } { ptr @.str.2926, i64 2, i64 0 }, ptr %a141 + call void @finch_str_concat(ptr %a139, ptr %a140, ptr %a141) + %t142 = load { ptr, i64, i64 }, ptr %a139 + %t143 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t142, ptr %a145 + store { ptr, i64, i64 } %t143, ptr %a146 + call void @finch_str_concat(ptr %a144, ptr %a145, ptr %a146) + %t147 = load { ptr, i64, i64 }, ptr %a144 + %t148 = call { ptr, i64, i64 } @finch.gen.op(ptr %t133, { ptr, i64, i64 } %t147) + %t149 = load { ptr, i64, i64 }, ptr %a103 + %t150 = load { ptr, i64, i64 }, ptr %a106 + call void @finch.gen.condBr(ptr %t132, { ptr, i64, i64 } %t148, { ptr, i64, i64 } %t149, { ptr, i64, i64 } %t150) + %t151 = load ptr, ptr %a1 + %t152 = load { ptr, i64, i64 }, ptr %a103 + call void @finch.gen.label(ptr %t151, { ptr, i64, i64 } %t152) + %t153 = load ptr, ptr %a1 + %t154 = load ptr, ptr %a1 + %t155 = load ptr, ptr %a1 + %t156 = icmp eq ptr %t155, null + br i1 %t156, label %panic4608, label %ok4609 +panic4608: + call void @finch_panic(ptr @.str.2928, i64 2154, ptr @.str.2929) + unreachable +ok4609: + %t157 = getelementptr inbounds %S.gen.Gen, ptr %t155, i32 0, i32 1 + %t158 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t159 = load i64, ptr %t158 + %t160 = load { ptr, i64, i64 }, ptr %t157 + %t161 = extractvalue { ptr, i64, i64 } %t160, 1 + %t162 = icmp uge i64 %t159, %t161 + br i1 %t162, label %range4610, label %inrange4611 +range4610: + call void @finch_panic_index(ptr @.str.2930, i64 2154, i64 %t159, i64 %t161) + unreachable +inrange4611: + %t163 = extractvalue { ptr, i64, i64 } %t160, 0 + %t164 = getelementptr inbounds { ptr, i64, i64 }, ptr %t163, i64 %t159 + %t165 = load { ptr, i64, i64 }, ptr %t164 + %t166 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t154, { ptr, i64, i64 } %t165) + store { ptr, i64, i64 } { ptr @.str.2927, i64 33, i64 0 }, ptr %a168 + store { ptr, i64, i64 } %t166, ptr %a169 + call void @finch_str_concat(ptr %a167, ptr %a168, ptr %a169) + %t170 = load { ptr, i64, i64 }, ptr %a167 + store { ptr, i64, i64 } %t170, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.2931, i64 6, i64 0 }, ptr %a173 + call void @finch_str_concat(ptr %a171, ptr %a172, ptr %a173) + %t174 = load { ptr, i64, i64 }, ptr %a171 + %t175 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t176 = load i64, ptr %t175 + call void @finch_str_from_int(ptr %a177, i64 %t176) + %t178 = load { ptr, i64, i64 }, ptr %a177 + store { ptr, i64, i64 } %t174, ptr %a180 + store { ptr, i64, i64 } %t178, ptr %a181 + call void @finch_str_concat(ptr %a179, ptr %a180, ptr %a181) + %t182 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t182, ptr %a184 + store { ptr, i64, i64 } { ptr @.str.2932, i64 1, i64 0 }, ptr %a185 + call void @finch_str_concat(ptr %a183, ptr %a184, ptr %a185) + %t186 = load { ptr, i64, i64 }, ptr %a183 + call void @finch.gen.emit(ptr %t153, { ptr, i64, i64 } %t186) + %t187 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t187, { ptr, i64, i64 } { ptr @.str.2933, i64 11, i64 0 }) + %t188 = load ptr, ptr %a1 + %t189 = icmp eq ptr %t188, null + br i1 %t189, label %panic4612, label %ok4613 +panic4612: + call void @finch_panic(ptr @.str.2934, i64 2156, ptr @.str.2935) + unreachable +ok4613: + %t190 = getelementptr inbounds %S.gen.Gen, ptr %t188, i32 0, i32 9 + store i1 true, ptr %t190 + %t191 = load ptr, ptr %a1 + %t192 = load { ptr, i64, i64 }, ptr %a106 + call void @finch.gen.label(ptr %t191, { ptr, i64, i64 } %t192) + br label %endif4607 +endif4607: + %t193 = load ptr, ptr %a1 + %t194 = load { ptr, i64, i64 }, ptr %a50 + %t195 = call { ptr, i64, i64 } @finch.gen.load(ptr %t193, { ptr, i64, i64 } { ptr @.str.2936, i64 3, i64 0 }, { ptr, i64, i64 } %t194) + store { ptr, i64, i64 } %t195, ptr %a196 + %t197 = load ptr, ptr %a1 + %t198 = load ptr, ptr %a1 + %t199 = load ptr, ptr %a1 + %t200 = load %S.ast.Type, ptr %a4 + %t201 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t199, %S.ast.Type %t200) + store { ptr, i64, i64 } { ptr @.str.2938, i64 23, i64 0 }, ptr %a203 + store { ptr, i64, i64 } %t201, ptr %a204 + call void @finch_str_concat(ptr %a202, ptr %a203, ptr %a204) + %t205 = load { ptr, i64, i64 }, ptr %a202 + store { ptr, i64, i64 } %t205, ptr %a207 + store { ptr, i64, i64 } { ptr @.str.2939, i64 6, i64 0 }, ptr %a208 + call void @finch_str_concat(ptr %a206, ptr %a207, ptr %a208) + %t209 = load { ptr, i64, i64 }, ptr %a206 + %t210 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t209, ptr %a212 + store { ptr, i64, i64 } %t210, ptr %a213 + call void @finch_str_concat(ptr %a211, ptr %a212, ptr %a213) + %t214 = load { ptr, i64, i64 }, ptr %a211 + store { ptr, i64, i64 } %t214, ptr %a216 + store { ptr, i64, i64 } { ptr @.str.2940, i64 14, i64 0 }, ptr %a217 + call void @finch_str_concat(ptr %a215, ptr %a216, ptr %a217) + %t218 = load { ptr, i64, i64 }, ptr %a215 + %t219 = call { ptr, i64, i64 } @finch.gen.op(ptr %t198, { ptr, i64, i64 } %t218) + %t220 = call { ptr, i64, i64 } @finch.gen.load(ptr %t197, { ptr, i64, i64 } { ptr @.str.2937, i64 3, i64 0 }, { ptr, i64, i64 } %t219) + store { ptr, i64, i64 } %t220, ptr %a221 + %t222 = load ptr, ptr %a1 + %t223 = load ptr, ptr %a1 + %t224 = load { ptr, i64, i64 }, ptr %a196 + store { ptr, i64, i64 } { ptr @.str.2941, i64 13, i64 0 }, ptr %a226 + store { ptr, i64, i64 } %t224, ptr %a227 + call void @finch_str_concat(ptr %a225, ptr %a226, ptr %a227) + %t228 = load { ptr, i64, i64 }, ptr %a225 + store { ptr, i64, i64 } %t228, ptr %a230 + store { ptr, i64, i64 } { ptr @.str.2942, i64 2, i64 0 }, ptr %a231 + call void @finch_str_concat(ptr %a229, ptr %a230, ptr %a231) + %t232 = load { ptr, i64, i64 }, ptr %a229 + %t233 = load { ptr, i64, i64 }, ptr %a221 + store { ptr, i64, i64 } %t232, ptr %a235 + store { ptr, i64, i64 } %t233, ptr %a236 + call void @finch_str_concat(ptr %a234, ptr %a235, ptr %a236) + %t237 = load { ptr, i64, i64 }, ptr %a234 + %t238 = call { ptr, i64, i64 } @finch.gen.op(ptr %t223, { ptr, i64, i64 } %t237) + %t239 = load { ptr, i64, i64 }, ptr %a84 + %t240 = load { ptr, i64, i64 }, ptr %a93 + call void @finch.gen.condBr(ptr %t222, { ptr, i64, i64 } %t238, { ptr, i64, i64 } %t239, { ptr, i64, i64 } %t240) + %t241 = load ptr, ptr %a1 + %t242 = load { ptr, i64, i64 }, ptr %a84 + call void @finch.gen.label(ptr %t241, { ptr, i64, i64 } %t242) + %t243 = load ptr, ptr %a1 + %t244 = load { ptr, i64, i64 }, ptr %a3 + %t245 = load %S.ast.Type, ptr %a4 + %t246 = load { ptr, i64, i64 }, ptr %a196 + %t247 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t243, { ptr, i64, i64 } %t244, %S.ast.Type %t245, { ptr, i64, i64 } %t246) + store { ptr, i64, i64 } %t247, ptr %a248 + %t249 = load ptr, ptr %a1 + %t250 = load ptr, ptr %a1 + %t251 = load { ptr, i64, i64 }, ptr %a248 + %t252 = load %S.ast.Type, ptr %a4 + %t253 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t250, { ptr, i64, i64 } %t251, %S.ast.Type %t252, i64 0) + %t254 = call { ptr, i64, i64 } @finch.gen.load(ptr %t249, { ptr, i64, i64 } { ptr @.str.2943, i64 3, i64 0 }, { ptr, i64, i64 } %t253) + store { ptr, i64, i64 } %t254, ptr %a255 + %t256 = load ptr, ptr %a1 + %t257 = load ptr, ptr %a1 + %t258 = load { ptr, i64, i64 }, ptr %a255 + store { ptr, i64, i64 } { ptr @.str.2944, i64 12, i64 0 }, ptr %a260 + store { ptr, i64, i64 } %t258, ptr %a261 + call void @finch_str_concat(ptr %a259, ptr %a260, ptr %a261) + %t262 = load { ptr, i64, i64 }, ptr %a259 + store { ptr, i64, i64 } %t262, ptr %a264 + store { ptr, i64, i64 } { ptr @.str.2945, i64 3, i64 0 }, ptr %a265 + call void @finch_str_concat(ptr %a263, ptr %a264, ptr %a265) + %t266 = load { ptr, i64, i64 }, ptr %a263 + %t267 = call { ptr, i64, i64 } @finch.gen.op(ptr %t257, { ptr, i64, i64 } %t266) + %t268 = load { ptr, i64, i64 }, ptr %a90 + %t269 = load { ptr, i64, i64 }, ptr %a87 + call void @finch.gen.condBr(ptr %t256, { ptr, i64, i64 } %t267, { ptr, i64, i64 } %t268, { ptr, i64, i64 } %t269) + %t270 = load ptr, ptr %a1 + %t271 = load { ptr, i64, i64 }, ptr %a87 + call void @finch.gen.label(ptr %t270, { ptr, i64, i64 } %t271) + %t272 = load ptr, ptr %a1 + %t273 = icmp eq ptr %t272, null + br i1 %t273, label %panic4614, label %ok4615 +panic4614: + call void @finch_panic(ptr @.str.2946, i64 2167, ptr @.str.2947) + unreachable +ok4615: + %t274 = getelementptr inbounds %S.gen.Gen, ptr %t272, i32 0, i32 11 + %t275 = getelementptr inbounds { ptr, i64, i64 }, ptr %t274, i32 0, i32 1 + %t276 = load { ptr, i64, i64 }, ptr %a90 + store { ptr, i64, i64 } %t276, ptr %a277 + call void @finch_str_copy(ptr %a278, ptr %a277) + %t279 = load { ptr, i64, i64 }, ptr %a278 + %t280 = insertvalue %S.gen.Loop zeroinitializer, { ptr, i64, i64 } %t279, 0 + %t281 = load { ptr, i64, i64 }, ptr %a93 + store { ptr, i64, i64 } %t281, ptr %a282 + call void @finch_str_copy(ptr %a283, ptr %a282) + %t284 = load { ptr, i64, i64 }, ptr %a283 + %t285 = insertvalue %S.gen.Loop %t280, { ptr, i64, i64 } %t284, 1 + %t286 = load ptr, ptr %a1 + %t287 = icmp eq ptr %t286, null + br i1 %t287, label %panic4616, label %ok4617 +panic4616: + call void @finch_panic(ptr @.str.2948, i64 2167, ptr @.str.2949) + unreachable +ok4617: + %t288 = getelementptr inbounds %S.gen.Gen, ptr %t286, i32 0, i32 10 + %t289 = getelementptr inbounds { ptr, i64, i64 }, ptr %t288, i32 0, i32 1 + %t290 = load i64, ptr %t289 + %t291 = insertvalue %S.gen.Loop %t285, i64 %t290, 2 + %t292 = load i64, ptr %t275 + %t293 = add i64 %t292, 1 + call void @finch_arr_reserve(ptr %t274, i64 %t293, i64 ptrtoint (ptr getelementptr (%S.gen.Loop, ptr null, i32 1) to i64)) + %t294 = load ptr, ptr %t274 + %t295 = getelementptr inbounds %S.gen.Loop, ptr %t294, i64 %t292 + store %S.gen.Loop %t291, ptr %t295 + store i64 %t293, ptr %t275 + %t296 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t296) + %t297 = load ptr, ptr %a1 + %t298 = load ptr, ptr %a1 + %t299 = load %S.ast.Type, ptr %a16 + %t300 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t298, %S.ast.Type %t299) + %t301 = load ptr, ptr %a1 + %t302 = load { ptr, i64, i64 }, ptr %a248 + %t303 = load %S.ast.Type, ptr %a4 + %t304 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t301, { ptr, i64, i64 } %t302, %S.ast.Type %t303, i64 1) + %t305 = call { ptr, i64, i64 } @finch.gen.load(ptr %t297, { ptr, i64, i64 } %t300, { ptr, i64, i64 } %t304) + store { ptr, i64, i64 } %t305, ptr %a306 + %t307 = load i1, ptr %a47 + br i1 %t307, label %then4618, label %endif4620 +then4618: + %t308 = load ptr, ptr %a1 + %t309 = load { ptr, i64, i64 }, ptr %a306 + %t310 = load %S.ast.Type, ptr %a16 + %t311 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t308, { ptr, i64, i64 } %t309, %S.ast.Type %t310) + store { ptr, i64, i64 } %t311, ptr %a306 + br label %endif4620 +endif4620: + %t312 = load ptr, ptr %a1 + %t313 = load %S.ast.Node, ptr %a2 + %t314 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t315 = load { ptr, i64, i64 }, ptr %t314 + %t316 = load %S.ast.Type, ptr %a16 + %t317 = load { ptr, i64, i64 }, ptr %a306 + %t318 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t312, %S.ast.Node %t313, { ptr, i64, i64 } %t315, %S.ast.Type %t316, { ptr, i64, i64 } %t317, i1 true) + %t319 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t320 = getelementptr inbounds { ptr, i64, i64 }, ptr %t319, i32 0, i32 1 + %t321 = load i64, ptr %t320 + %t322 = icmp sgt i64 %t321, 0 + br i1 %t322, label %then4621, label %endif4623 +then4621: + %t323 = load ptr, ptr %a1 + %t324 = load ptr, ptr %a1 + %t325 = load %S.ast.Type, ptr %a27 + %t326 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t324, %S.ast.Type %t325) + %t327 = load ptr, ptr %a1 + %t328 = load { ptr, i64, i64 }, ptr %a248 + %t329 = load %S.ast.Type, ptr %a4 + %t330 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t327, { ptr, i64, i64 } %t328, %S.ast.Type %t329, i64 2) + %t331 = call { ptr, i64, i64 } @finch.gen.load(ptr %t323, { ptr, i64, i64 } %t326, { ptr, i64, i64 } %t330) + store { ptr, i64, i64 } %t331, ptr %a332 + %t333 = load i1, ptr %a47 + br i1 %t333, label %then4624, label %endif4626 +then4624: + %t334 = load ptr, ptr %a1 + %t335 = load { ptr, i64, i64 }, ptr %a332 + %t336 = load %S.ast.Type, ptr %a27 + %t337 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t334, { ptr, i64, i64 } %t335, %S.ast.Type %t336) + store { ptr, i64, i64 } %t337, ptr %a332 + br label %endif4626 +endif4626: + %t338 = load ptr, ptr %a1 + %t339 = load %S.ast.Node, ptr %a2 + %t340 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t341 = load { ptr, i64, i64 }, ptr %t340 + %t342 = load %S.ast.Type, ptr %a27 + %t343 = load { ptr, i64, i64 }, ptr %a332 + %t344 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t338, %S.ast.Node %t339, { ptr, i64, i64 } %t341, %S.ast.Type %t342, { ptr, i64, i64 } %t343, i1 true) + br label %endif4623 +endif4623: + %t345 = load ptr, ptr %a1 + %t346 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t347 = load { ptr, i64, i64 }, ptr %t346 + %t348 = extractvalue { ptr, i64, i64 } %t347, 1 + %t349 = icmp uge i64 1, %t348 + br i1 %t349, label %range4627, label %inrange4628 +range4627: + call void @finch_panic_index(ptr @.str.2950, i64 2181, i64 1, i64 %t348) + unreachable +inrange4628: + %t350 = extractvalue { ptr, i64, i64 } %t347, 0 + %t351 = getelementptr inbounds %S.ast.Node, ptr %t350, i64 1 + %t352 = load %S.ast.Node, ptr %t351 + call void @finch.gen.block(ptr %t345, %S.ast.Node %t352, i1 true) + %t353 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t353) + %t354 = load ptr, ptr %a1 + %t355 = icmp eq ptr %t354, null + br i1 %t355, label %panic4629, label %ok4630 +panic4629: + call void @finch_panic(ptr @.str.2951, i64 2183, ptr @.str.2952) + unreachable +ok4630: + %t356 = getelementptr inbounds %S.gen.Gen, ptr %t354, i32 0, i32 11 + %t357 = getelementptr inbounds { ptr, i64, i64 }, ptr %t356, i32 0, i32 1 + %t358 = load i64, ptr %t357 + %t359 = icmp eq i64 %t358, 0 + br i1 %t359, label %panic4631, label %ok4632 +panic4631: + call void @finch_panic(ptr @.str.2953, i64 2183, ptr @.str.2954) + unreachable +ok4632: + %t360 = sub i64 %t358, 1 + %t361 = load ptr, ptr %t356 + %t362 = getelementptr inbounds %S.gen.Loop, ptr %t361, i64 %t360 + %t363 = load %S.gen.Loop, ptr %t362 + store i64 %t360, ptr %t357 + %t364 = load ptr, ptr %a1 + %t365 = load { ptr, i64, i64 }, ptr %a90 + call void @finch.gen.br(ptr %t364, { ptr, i64, i64 } %t365) + %t366 = load ptr, ptr %a1 + %t367 = load { ptr, i64, i64 }, ptr %a90 + call void @finch.gen.label(ptr %t366, { ptr, i64, i64 } %t367) + %t368 = load ptr, ptr %a1 + %t369 = load { ptr, i64, i64 }, ptr %a50 + %t370 = call { ptr, i64, i64 } @finch.gen.load(ptr %t368, { ptr, i64, i64 } { ptr @.str.2955, i64 3, i64 0 }, { ptr, i64, i64 } %t369) + store { ptr, i64, i64 } %t370, ptr %a371 + %t372 = load ptr, ptr %a1 + %t373 = load ptr, ptr %a1 + %t374 = load { ptr, i64, i64 }, ptr %a371 + store { ptr, i64, i64 } { ptr @.str.2957, i64 8, i64 0 }, ptr %a376 + store { ptr, i64, i64 } %t374, ptr %a377 + call void @finch_str_concat(ptr %a375, ptr %a376, ptr %a377) + %t378 = load { ptr, i64, i64 }, ptr %a375 + store { ptr, i64, i64 } %t378, ptr %a380 + store { ptr, i64, i64 } { ptr @.str.2958, i64 3, i64 0 }, ptr %a381 + call void @finch_str_concat(ptr %a379, ptr %a380, ptr %a381) + %t382 = load { ptr, i64, i64 }, ptr %a379 + %t383 = call { ptr, i64, i64 } @finch.gen.op(ptr %t373, { ptr, i64, i64 } %t382) + %t384 = load { ptr, i64, i64 }, ptr %a50 + call void @finch.gen.store(ptr %t372, { ptr, i64, i64 } { ptr @.str.2956, i64 3, i64 0 }, { ptr, i64, i64 } %t383, { ptr, i64, i64 } %t384) + %t385 = load ptr, ptr %a1 + %t386 = load { ptr, i64, i64 }, ptr %a81 + call void @finch.gen.br(ptr %t385, { ptr, i64, i64 } %t386) + %t387 = load ptr, ptr %a1 + %t388 = load { ptr, i64, i64 }, ptr %a93 + call void @finch.gen.label(ptr %t387, { ptr, i64, i64 } %t388) + ret void +} + +define internal void @finch.gen.eachStmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a13 = alloca %S.gen.Ref, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca %S.ast.Type, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca %S.ast.Type, align 16 + %a29 = alloca %S.ast.Type, align 16 + %a34 = alloca %S.ast.Type, align 16 + %a35 = alloca %S.ast.Type, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca %S.ast.Type, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca %S.ast.Type, align 16 + %a101 = alloca %S.ast.Type, align 16 + %a127 = alloca i1, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t3) + %t4 = load ptr, ptr %a1 + %t5 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = icmp uge i64 0, %t7 + br i1 %t8, label %range4633, label %inrange4634 +range4633: + call void @finch_panic_index(ptr @.str.2959, i64 2194, i64 0, i64 %t7) + unreachable +inrange4634: + %t9 = extractvalue { ptr, i64, i64 } %t6, 0 + %t10 = getelementptr inbounds %S.ast.Node, ptr %t9, i64 0 + %t11 = load %S.ast.Node, ptr %t10 + %t12 = call %S.gen.Ref @finch.gen.ref(ptr %t4, %S.ast.Node %t11, i1 false) + store %S.gen.Ref %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.2960, i64 0, i64 0 }, ptr %a14 + %t15 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2961, i64 4, i64 0 }) + store %S.ast.Type %t15, ptr %a16 + %t17 = getelementptr inbounds %S.gen.Ref, ptr %a13, i32 0, i32 0 + %t18 = load i1, ptr %t17 + br i1 %t18, label %then4635, label %else4636 +then4635: + %t19 = getelementptr inbounds %S.gen.Ref, ptr %a13, i32 0, i32 1 + %t20 = getelementptr inbounds %S.gen.Place, ptr %t19, i32 0, i32 0 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a22 + call void @finch_str_copy(ptr %a23, ptr %a22) + %t24 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t24, ptr %a14 + %t25 = getelementptr inbounds %S.gen.Ref, ptr %a13, i32 0, i32 1 + %t26 = getelementptr inbounds %S.gen.Place, ptr %t25, i32 0, i32 1 + %t27 = load %S.ast.Type, ptr %t26 + store %S.ast.Type %t27, ptr %a28 + call void @finch.copy.S_ast_Type(ptr %a29, ptr %a28) + %t30 = load %S.ast.Type, ptr %a29 + store %S.ast.Type %t30, ptr %a16 + br label %endif4637 +else4636: + %t31 = getelementptr inbounds %S.gen.Ref, ptr %a13, i32 0, i32 2 + %t32 = getelementptr inbounds %S.gen.Val, ptr %t31, i32 0, i32 1 + %t33 = load %S.ast.Type, ptr %t32 + store %S.ast.Type %t33, ptr %a34 + call void @finch.copy.S_ast_Type(ptr %a35, ptr %a34) + %t36 = load %S.ast.Type, ptr %a35 + store %S.ast.Type %t36, ptr %a16 + %t37 = load ptr, ptr %a1 + %t38 = getelementptr inbounds %S.gen.Ref, ptr %a13, i32 0, i32 2 + %t39 = load %S.gen.Val, ptr %t38 + %t40 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t37, %S.gen.Val %t39) + store { ptr, i64, i64 } %t40, ptr %a14 + br label %endif4637 +endif4637: + %t41 = getelementptr inbounds %S.ast.Type, ptr %a16, i32 0, i32 0 + %t42 = load { ptr, i64, i64 }, ptr %t41 + store { ptr, i64, i64 } %t42, ptr %a43 + store { ptr, i64, i64 } { ptr @.str.2962, i64 3, i64 0 }, ptr %a44 + %t45 = call i32 @finch_str_eq(ptr %a43, ptr %a44) + %t46 = icmp ne i32 %t45, 0 + br i1 %t46, label %then4638, label %endif4640 +then4638: + %t47 = load ptr, ptr %a1 + %t48 = load %S.ast.Node, ptr %a2 + %t49 = load { ptr, i64, i64 }, ptr %a14 + %t50 = load %S.ast.Type, ptr %a16 + %t51 = getelementptr inbounds %S.gen.Ref, ptr %a13, i32 0, i32 0 + %t52 = load i1, ptr %t51 + call void @finch.gen.eachMap(ptr %t47, %S.ast.Node %t48, { ptr, i64, i64 } %t49, %S.ast.Type %t50, i1 %t52) + %t53 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t53) + ret void +endif4640: + %t54 = getelementptr inbounds %S.ast.Type, ptr %a16, i32 0, i32 0 + %t55 = load { ptr, i64, i64 }, ptr %t54 + store { ptr, i64, i64 } %t55, ptr %a56 + store { ptr, i64, i64 } { ptr @.str.2963, i64 5, i64 0 }, ptr %a57 + %t58 = call i32 @finch_str_eq(ptr %a56, ptr %a57) + %t59 = icmp eq i32 %t58, 0 + br label %logic.from4641 +logic.from4641: + br i1 %t59, label %logic.rhs4642, label %logic.end4643 +logic.rhs4642: + %t60 = getelementptr inbounds %S.ast.Type, ptr %a16, i32 0, i32 0 + %t61 = load { ptr, i64, i64 }, ptr %t60 + store { ptr, i64, i64 } %t61, ptr %a62 + store { ptr, i64, i64 } { ptr @.str.2964, i64 3, i64 0 }, ptr %a63 + %t64 = call i32 @finch_str_eq(ptr %a62, ptr %a63) + %t65 = icmp eq i32 %t64, 0 + br label %logic.rend4644 +logic.rend4644: + br label %logic.end4643 +logic.end4643: + %t66 = phi i1 [ false, %logic.from4641 ], [ %t65, %logic.rend4644 ] + br i1 %t66, label %then4645, label %endif4647 +then4645: + %t67 = load ptr, ptr %a1 + %t68 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t69 = load { ptr, i64, i64 }, ptr %t68 + %t70 = extractvalue { ptr, i64, i64 } %t69, 1 + %t71 = icmp uge i64 0, %t70 + br i1 %t71, label %range4648, label %inrange4649 +range4648: + call void @finch_panic_index(ptr @.str.2965, i64 2210, i64 0, i64 %t70) + unreachable +inrange4649: + %t72 = extractvalue { ptr, i64, i64 } %t69, 0 + %t73 = getelementptr inbounds %S.ast.Node, ptr %t72, i64 0 + %t74 = load %S.ast.Node, ptr %t73 + %t75 = load %S.ast.Type, ptr %a16 + %t76 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t75) + store { ptr, i64, i64 } { ptr @.str.2966, i64 55, i64 0 }, ptr %a78 + store { ptr, i64, i64 } %t76, ptr %a79 + call void @finch_str_concat(ptr %a77, ptr %a78, ptr %a79) + %t80 = load { ptr, i64, i64 }, ptr %a77 + store { ptr, i64, i64 } %t80, ptr %a82 + store { ptr, i64, i64 } { ptr @.str.2967, i64 36, i64 0 }, ptr %a83 + call void @finch_str_concat(ptr %a81, ptr %a82, ptr %a83) + %t84 = load { ptr, i64, i64 }, ptr %a81 + call void @finch.gen.fail(ptr %t67, %S.ast.Node %t74, { ptr, i64, i64 } %t84) + br label %endif4647 +endif4647: + %t85 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2968, i64 4, i64 0 }) + store %S.ast.Type %t85, ptr %a86 + %t87 = getelementptr inbounds %S.ast.Type, ptr %a16, i32 0, i32 0 + %t88 = load { ptr, i64, i64 }, ptr %t87 + store { ptr, i64, i64 } %t88, ptr %a89 + store { ptr, i64, i64 } { ptr @.str.2969, i64 5, i64 0 }, ptr %a90 + %t91 = call i32 @finch_str_eq(ptr %a89, ptr %a90) + %t92 = icmp ne i32 %t91, 0 + br i1 %t92, label %then4650, label %endif4652 +then4650: + %t93 = getelementptr inbounds %S.ast.Type, ptr %a16, i32 0, i32 1 + %t94 = load { ptr, i64, i64 }, ptr %t93 + %t95 = extractvalue { ptr, i64, i64 } %t94, 1 + %t96 = icmp uge i64 0, %t95 + br i1 %t96, label %range4653, label %inrange4654 +range4653: + call void @finch_panic_index(ptr @.str.2970, i64 2214, i64 0, i64 %t95) + unreachable +inrange4654: + %t97 = extractvalue { ptr, i64, i64 } %t94, 0 + %t98 = getelementptr inbounds %S.ast.Type, ptr %t97, i64 0 + %t99 = load %S.ast.Type, ptr %t98 + store %S.ast.Type %t99, ptr %a100 + call void @finch.copy.S_ast_Type(ptr %a101, ptr %a100) + %t102 = load %S.ast.Type, ptr %a101 + store %S.ast.Type %t102, ptr %a86 + br label %endif4652 +endif4652: + %t103 = getelementptr inbounds %S.gen.Ref, ptr %a13, i32 0, i32 0 + %t104 = load i1, ptr %t103 + br label %logic.from4655 +logic.from4655: + br i1 %t104, label %logic.rhs4656, label %logic.end4657 +logic.rhs4656: + %t105 = load ptr, ptr %a1 + %t106 = load %S.ast.Type, ptr %a86 + %t107 = call i1 @finch.gen.owning(ptr %t105, %S.ast.Type %t106) + br label %logic.rend4658 +logic.rend4658: + br label %logic.end4657 +logic.end4657: + %t108 = phi i1 [ false, %logic.from4655 ], [ %t107, %logic.rend4658 ] + br label %logic.from4659 +logic.from4659: + br i1 %t108, label %logic.rhs4660, label %logic.end4661 +logic.rhs4660: + %t109 = load ptr, ptr %a1 + %t110 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t111 = load { ptr, i64, i64 }, ptr %t110 + %t112 = extractvalue { ptr, i64, i64 } %t111, 1 + %t113 = icmp uge i64 0, %t112 + br i1 %t113, label %range4662, label %inrange4663 +range4662: + call void @finch_panic_index(ptr @.str.2971, i64 2216, i64 0, i64 %t112) + unreachable +inrange4663: + %t114 = extractvalue { ptr, i64, i64 } %t111, 0 + %t115 = getelementptr inbounds %S.ast.Node, ptr %t114, i64 0 + %t116 = load %S.ast.Node, ptr %t115 + %t117 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t116) + %t118 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t119 = load { ptr, i64, i64 }, ptr %t118 + %t120 = extractvalue { ptr, i64, i64 } %t119, 1 + %t121 = icmp uge i64 1, %t120 + br i1 %t121, label %range4664, label %inrange4665 +range4664: + call void @finch_panic_index(ptr @.str.2972, i64 2216, i64 1, i64 %t120) + unreachable +inrange4665: + %t122 = extractvalue { ptr, i64, i64 } %t119, 0 + %t123 = getelementptr inbounds %S.ast.Node, ptr %t122, i64 1 + %t124 = load %S.ast.Node, ptr %t123 + %t125 = call i1 @finch.gen.mutates(ptr %t109, { ptr, i64, i64 } %t117, %S.ast.Node %t124) + br label %logic.rend4666 +logic.rend4666: + br label %logic.end4661 +logic.end4661: + %t126 = phi i1 [ false, %logic.from4659 ], [ %t125, %logic.rend4666 ] + store i1 %t126, ptr %a127 + %t128 = load ptr, ptr %a1 + %t129 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t128, { ptr, i64, i64 } { ptr @.str.2973, i64 3, i64 0 }) + store { ptr, i64, i64 } %t129, ptr %a130 + %t131 = load ptr, ptr %a1 + %t132 = load { ptr, i64, i64 }, ptr %a130 + call void @finch.gen.store(ptr %t131, { ptr, i64, i64 } { ptr @.str.2974, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.2975, i64 1, i64 0 }, { ptr, i64, i64 } %t132) + %t133 = load ptr, ptr %a1 + %t134 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t133, { ptr, i64, i64 } { ptr @.str.2976, i64 9, i64 0 }) + store { ptr, i64, i64 } %t134, ptr %a135 + %t136 = load ptr, ptr %a1 + %t137 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t136, { ptr, i64, i64 } { ptr @.str.2977, i64 9, i64 0 }) + store { ptr, i64, i64 } %t137, ptr %a138 + %t139 = load ptr, ptr %a1 + %t140 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t139, { ptr, i64, i64 } { ptr @.str.2978, i64 9, i64 0 }) + store { ptr, i64, i64 } %t140, ptr %a141 + %t142 = load ptr, ptr %a1 + %t143 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t142, { ptr, i64, i64 } { ptr @.str.2979, i64 8, i64 0 }) + store { ptr, i64, i64 } %t143, ptr %a144 + %t145 = load ptr, ptr %a1 + %t146 = load { ptr, i64, i64 }, ptr %a135 + call void @finch.gen.br(ptr %t145, { ptr, i64, i64 } %t146) + %t147 = load ptr, ptr %a1 + %t148 = load { ptr, i64, i64 }, ptr %a135 + call void @finch.gen.label(ptr %t147, { ptr, i64, i64 } %t148) + %t149 = load ptr, ptr %a1 + %t150 = load ptr, ptr %a1 + %t151 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.2981, i64 46, i64 0 }, ptr %a153 + store { ptr, i64, i64 } %t151, ptr %a154 + call void @finch_str_concat(ptr %a152, ptr %a153, ptr %a154) + %t155 = load { ptr, i64, i64 }, ptr %a152 + store { ptr, i64, i64 } %t155, ptr %a157 + store { ptr, i64, i64 } { ptr @.str.2982, i64 14, i64 0 }, ptr %a158 + call void @finch_str_concat(ptr %a156, ptr %a157, ptr %a158) + %t159 = load { ptr, i64, i64 }, ptr %a156 + %t160 = call { ptr, i64, i64 } @finch.gen.op(ptr %t150, { ptr, i64, i64 } %t159) + %t161 = call { ptr, i64, i64 } @finch.gen.load(ptr %t149, { ptr, i64, i64 } { ptr @.str.2980, i64 3, i64 0 }, { ptr, i64, i64 } %t160) + store { ptr, i64, i64 } %t161, ptr %a162 + %t163 = load ptr, ptr %a1 + %t164 = load { ptr, i64, i64 }, ptr %a130 + %t165 = call { ptr, i64, i64 } @finch.gen.load(ptr %t163, { ptr, i64, i64 } { ptr @.str.2983, i64 3, i64 0 }, { ptr, i64, i64 } %t164) + store { ptr, i64, i64 } %t165, ptr %a166 + %t167 = load ptr, ptr %a1 + %t168 = load { ptr, i64, i64 }, ptr %a166 + store { ptr, i64, i64 } { ptr @.str.2984, i64 13, i64 0 }, ptr %a170 + store { ptr, i64, i64 } %t168, ptr %a171 + call void @finch_str_concat(ptr %a169, ptr %a170, ptr %a171) + %t172 = load { ptr, i64, i64 }, ptr %a169 + store { ptr, i64, i64 } %t172, ptr %a174 + store { ptr, i64, i64 } { ptr @.str.2985, i64 2, i64 0 }, ptr %a175 + call void @finch_str_concat(ptr %a173, ptr %a174, ptr %a175) + %t176 = load { ptr, i64, i64 }, ptr %a173 + %t177 = load { ptr, i64, i64 }, ptr %a162 + store { ptr, i64, i64 } %t176, ptr %a179 + store { ptr, i64, i64 } %t177, ptr %a180 + call void @finch_str_concat(ptr %a178, ptr %a179, ptr %a180) + %t181 = load { ptr, i64, i64 }, ptr %a178 + %t182 = call { ptr, i64, i64 } @finch.gen.op(ptr %t167, { ptr, i64, i64 } %t181) + store { ptr, i64, i64 } %t182, ptr %a183 + %t184 = load ptr, ptr %a1 + %t185 = load { ptr, i64, i64 }, ptr %a183 + %t186 = load { ptr, i64, i64 }, ptr %a138 + %t187 = load { ptr, i64, i64 }, ptr %a144 + call void @finch.gen.condBr(ptr %t184, { ptr, i64, i64 } %t185, { ptr, i64, i64 } %t186, { ptr, i64, i64 } %t187) + %t188 = load ptr, ptr %a1 + %t189 = load { ptr, i64, i64 }, ptr %a138 + call void @finch.gen.label(ptr %t188, { ptr, i64, i64 } %t189) + %t190 = load ptr, ptr %a1 + %t191 = load { ptr, i64, i64 }, ptr %a14 + %t192 = call { ptr, i64, i64 } @finch.gen.load(ptr %t190, { ptr, i64, i64 } { ptr @.str.2986, i64 3, i64 0 }, { ptr, i64, i64 } %t191) + store { ptr, i64, i64 } %t192, ptr %a193 + %t194 = load ptr, ptr %a1 + %t195 = load ptr, ptr %a1 + %t196 = load %S.ast.Type, ptr %a86 + %t197 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t195, %S.ast.Type %t196) + store { ptr, i64, i64 } { ptr @.str.2987, i64 23, i64 0 }, ptr %a199 + store { ptr, i64, i64 } %t197, ptr %a200 + call void @finch_str_concat(ptr %a198, ptr %a199, ptr %a200) + %t201 = load { ptr, i64, i64 }, ptr %a198 + store { ptr, i64, i64 } %t201, ptr %a203 + store { ptr, i64, i64 } { ptr @.str.2988, i64 6, i64 0 }, ptr %a204 + call void @finch_str_concat(ptr %a202, ptr %a203, ptr %a204) + %t205 = load { ptr, i64, i64 }, ptr %a202 + %t206 = load { ptr, i64, i64 }, ptr %a193 + store { ptr, i64, i64 } %t205, ptr %a208 + store { ptr, i64, i64 } %t206, ptr %a209 + call void @finch_str_concat(ptr %a207, ptr %a208, ptr %a209) + %t210 = load { ptr, i64, i64 }, ptr %a207 + store { ptr, i64, i64 } %t210, ptr %a212 + store { ptr, i64, i64 } { ptr @.str.2989, i64 6, i64 0 }, ptr %a213 + call void @finch_str_concat(ptr %a211, ptr %a212, ptr %a213) + %t214 = load { ptr, i64, i64 }, ptr %a211 + %t215 = load { ptr, i64, i64 }, ptr %a166 + store { ptr, i64, i64 } %t214, ptr %a217 + store { ptr, i64, i64 } %t215, ptr %a218 + call void @finch_str_concat(ptr %a216, ptr %a217, ptr %a218) + %t219 = load { ptr, i64, i64 }, ptr %a216 + %t220 = call { ptr, i64, i64 } @finch.gen.op(ptr %t194, { ptr, i64, i64 } %t219) + store { ptr, i64, i64 } %t220, ptr %a221 + %t222 = load ptr, ptr %a1 + %t223 = load ptr, ptr %a1 + %t224 = load %S.ast.Type, ptr %a86 + %t225 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t223, %S.ast.Type %t224) + %t226 = load { ptr, i64, i64 }, ptr %a221 + %t227 = call { ptr, i64, i64 } @finch.gen.load(ptr %t222, { ptr, i64, i64 } %t225, { ptr, i64, i64 } %t226) + store { ptr, i64, i64 } %t227, ptr %a228 + %t229 = load i1, ptr %a127 + br i1 %t229, label %then4667, label %endif4669 +then4667: + %t230 = load ptr, ptr %a1 + %t231 = load { ptr, i64, i64 }, ptr %a228 + %t232 = load %S.ast.Type, ptr %a86 + %t233 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t230, { ptr, i64, i64 } %t231, %S.ast.Type %t232) + store { ptr, i64, i64 } %t233, ptr %a228 + br label %endif4669 +endif4669: + %t234 = load ptr, ptr %a1 + %t235 = icmp eq ptr %t234, null + br i1 %t235, label %panic4670, label %ok4671 +panic4670: + call void @finch_panic(ptr @.str.2990, i64 2236, ptr @.str.2991) + unreachable +ok4671: + %t236 = getelementptr inbounds %S.gen.Gen, ptr %t234, i32 0, i32 11 + %t237 = getelementptr inbounds { ptr, i64, i64 }, ptr %t236, i32 0, i32 1 + %t238 = load { ptr, i64, i64 }, ptr %a141 + store { ptr, i64, i64 } %t238, ptr %a239 + call void @finch_str_copy(ptr %a240, ptr %a239) + %t241 = load { ptr, i64, i64 }, ptr %a240 + %t242 = insertvalue %S.gen.Loop zeroinitializer, { ptr, i64, i64 } %t241, 0 + %t243 = load { ptr, i64, i64 }, ptr %a144 + store { ptr, i64, i64 } %t243, ptr %a244 + call void @finch_str_copy(ptr %a245, ptr %a244) + %t246 = load { ptr, i64, i64 }, ptr %a245 + %t247 = insertvalue %S.gen.Loop %t242, { ptr, i64, i64 } %t246, 1 + %t248 = load ptr, ptr %a1 + %t249 = icmp eq ptr %t248, null + br i1 %t249, label %panic4672, label %ok4673 +panic4672: + call void @finch_panic(ptr @.str.2992, i64 2236, ptr @.str.2993) + unreachable +ok4673: + %t250 = getelementptr inbounds %S.gen.Gen, ptr %t248, i32 0, i32 10 + %t251 = getelementptr inbounds { ptr, i64, i64 }, ptr %t250, i32 0, i32 1 + %t252 = load i64, ptr %t251 + %t253 = insertvalue %S.gen.Loop %t247, i64 %t252, 2 + %t254 = load i64, ptr %t237 + %t255 = add i64 %t254, 1 + call void @finch_arr_reserve(ptr %t236, i64 %t255, i64 ptrtoint (ptr getelementptr (%S.gen.Loop, ptr null, i32 1) to i64)) + %t256 = load ptr, ptr %t236 + %t257 = getelementptr inbounds %S.gen.Loop, ptr %t256, i64 %t254 + store %S.gen.Loop %t253, ptr %t257 + store i64 %t255, ptr %t237 + %t258 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t258) + %t259 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t260 = load { ptr, i64, i64 }, ptr %t259 + store { ptr, i64, i64 } %t260, ptr %a261 + call void @finch_str_copy(ptr %a262, ptr %a261) + %t263 = load { ptr, i64, i64 }, ptr %a262 + store { ptr, i64, i64 } %t263, ptr %a264 + %t265 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t266 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i32 0, i32 1 + %t267 = load i64, ptr %t266 + %t268 = icmp sgt i64 %t267, 0 + br i1 %t268, label %then4674, label %endif4676 +then4674: + %t269 = load ptr, ptr %a1 + %t270 = load %S.ast.Node, ptr %a2 + %t271 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t272 = load { ptr, i64, i64 }, ptr %t271 + %t273 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.2994, i64 3, i64 0 }) + %t274 = load { ptr, i64, i64 }, ptr %a166 + %t275 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t269, %S.ast.Node %t270, { ptr, i64, i64 } %t272, %S.ast.Type %t273, { ptr, i64, i64 } %t274, i1 true) + %t276 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t277 = load { ptr, i64, i64 }, ptr %t276 + store { ptr, i64, i64 } %t277, ptr %a278 + call void @finch_str_copy(ptr %a279, ptr %a278) + %t280 = load { ptr, i64, i64 }, ptr %a279 + store { ptr, i64, i64 } %t280, ptr %a264 + br label %endif4676 +endif4676: + %t281 = load ptr, ptr %a1 + %t282 = load %S.ast.Node, ptr %a2 + %t283 = load { ptr, i64, i64 }, ptr %a264 + %t284 = load %S.ast.Type, ptr %a86 + %t285 = load { ptr, i64, i64 }, ptr %a228 + %t286 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t281, %S.ast.Node %t282, { ptr, i64, i64 } %t283, %S.ast.Type %t284, { ptr, i64, i64 } %t285, i1 true) + %t287 = load ptr, ptr %a1 + %t288 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t289 = load { ptr, i64, i64 }, ptr %t288 + %t290 = extractvalue { ptr, i64, i64 } %t289, 1 + %t291 = icmp uge i64 1, %t290 + br i1 %t291, label %range4677, label %inrange4678 +range4677: + call void @finch_panic_index(ptr @.str.2995, i64 2244, i64 1, i64 %t290) + unreachable +inrange4678: + %t292 = extractvalue { ptr, i64, i64 } %t289, 0 + %t293 = getelementptr inbounds %S.ast.Node, ptr %t292, i64 1 + %t294 = load %S.ast.Node, ptr %t293 + call void @finch.gen.block(ptr %t287, %S.ast.Node %t294, i1 true) + %t295 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t295) + %t296 = load ptr, ptr %a1 + %t297 = icmp eq ptr %t296, null + br i1 %t297, label %panic4679, label %ok4680 +panic4679: + call void @finch_panic(ptr @.str.2996, i64 2246, ptr @.str.2997) + unreachable +ok4680: + %t298 = getelementptr inbounds %S.gen.Gen, ptr %t296, i32 0, i32 11 + %t299 = getelementptr inbounds { ptr, i64, i64 }, ptr %t298, i32 0, i32 1 + %t300 = load i64, ptr %t299 + %t301 = icmp eq i64 %t300, 0 + br i1 %t301, label %panic4681, label %ok4682 +panic4681: + call void @finch_panic(ptr @.str.2998, i64 2246, ptr @.str.2999) + unreachable +ok4682: + %t302 = sub i64 %t300, 1 + %t303 = load ptr, ptr %t298 + %t304 = getelementptr inbounds %S.gen.Loop, ptr %t303, i64 %t302 + %t305 = load %S.gen.Loop, ptr %t304 + store i64 %t302, ptr %t299 + %t306 = load ptr, ptr %a1 + %t307 = load { ptr, i64, i64 }, ptr %a141 + call void @finch.gen.br(ptr %t306, { ptr, i64, i64 } %t307) + %t308 = load ptr, ptr %a1 + %t309 = load { ptr, i64, i64 }, ptr %a141 + call void @finch.gen.label(ptr %t308, { ptr, i64, i64 } %t309) + %t310 = load ptr, ptr %a1 + %t311 = load { ptr, i64, i64 }, ptr %a130 + %t312 = call { ptr, i64, i64 } @finch.gen.load(ptr %t310, { ptr, i64, i64 } { ptr @.str.3000, i64 3, i64 0 }, { ptr, i64, i64 } %t311) + store { ptr, i64, i64 } %t312, ptr %a313 + %t314 = load ptr, ptr %a1 + %t315 = load ptr, ptr %a1 + %t316 = load { ptr, i64, i64 }, ptr %a313 + store { ptr, i64, i64 } { ptr @.str.3002, i64 8, i64 0 }, ptr %a318 + store { ptr, i64, i64 } %t316, ptr %a319 + call void @finch_str_concat(ptr %a317, ptr %a318, ptr %a319) + %t320 = load { ptr, i64, i64 }, ptr %a317 + store { ptr, i64, i64 } %t320, ptr %a322 + store { ptr, i64, i64 } { ptr @.str.3003, i64 3, i64 0 }, ptr %a323 + call void @finch_str_concat(ptr %a321, ptr %a322, ptr %a323) + %t324 = load { ptr, i64, i64 }, ptr %a321 + %t325 = call { ptr, i64, i64 } @finch.gen.op(ptr %t315, { ptr, i64, i64 } %t324) + %t326 = load { ptr, i64, i64 }, ptr %a130 + call void @finch.gen.store(ptr %t314, { ptr, i64, i64 } { ptr @.str.3001, i64 3, i64 0 }, { ptr, i64, i64 } %t325, { ptr, i64, i64 } %t326) + %t327 = load ptr, ptr %a1 + %t328 = load { ptr, i64, i64 }, ptr %a135 + call void @finch.gen.br(ptr %t327, { ptr, i64, i64 } %t328) + %t329 = load ptr, ptr %a1 + %t330 = load { ptr, i64, i64 }, ptr %a144 + call void @finch.gen.label(ptr %t329, { ptr, i64, i64 } %t330) + %t331 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t331) + ret void +} + +define internal void @finch.gen.returnStmt(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca %S.ast.Node, align 16 + %a48 = alloca %S.ast.Node, align 16 + %a50 = alloca %S.ast.Node, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca %S.gen.Val, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca %S.gen.Val, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca i1, align 16 + %a309 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca i64, align 16 + %a348 = alloca { ptr, i64, i64 }, align 16 + %a349 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca { ptr, i64, i64 }, align 16 + %a353 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a369 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a374 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a378 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a389 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a395 = alloca { ptr, i64, i64 }, align 16 + %a398 = alloca { ptr, i64, i64 }, align 16 + %a399 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a403 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a415 = alloca { ptr, i64, i64 }, align 16 + %a416 = alloca { ptr, i64, i64 }, align 16 + %a417 = alloca { ptr, i64, i64 }, align 16 + %a419 = alloca { ptr, i64, i64 }, align 16 + %a420 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + %a438 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a441 = alloca { ptr, i64, i64 }, align 16 + %a442 = alloca { ptr, i64, i64 }, align 16 + %a445 = alloca { ptr, i64, i64 }, align 16 + %a446 = alloca { ptr, i64, i64 }, align 16 + %a447 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic4683, label %ok4684 +panic4683: + call void @finch_panic(ptr @.str.3004, i64 2257, ptr @.str.3005) + unreachable +ok4684: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 42 + %t6 = load i64, ptr %t5 + %t7 = icmp sgt i64 %t6, 0 + br i1 %t7, label %then4685, label %endif4687 +then4685: + %t8 = load ptr, ptr %a1 + %t9 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t8, %S.ast.Node %t9, { ptr, i64, i64 } { ptr @.str.3006, i64 33, i64 0 }) + br label %endif4687 +endif4687: + %t10 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t10, i32 0, i32 1 + %t12 = load i64, ptr %t11 + %t13 = icmp sgt i64 %t12, 0 + br label %logic.from4688 +logic.from4688: + br i1 %t13, label %logic.rhs4689, label %logic.end4690 +logic.rhs4689: + %t14 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t15 = load { ptr, i64, i64 }, ptr %t14 + %t16 = extractvalue { ptr, i64, i64 } %t15, 1 + %t17 = icmp uge i64 0, %t16 + br i1 %t17, label %range4691, label %inrange4692 +range4691: + call void @finch_panic_index(ptr @.str.3007, i64 2261, i64 0, i64 %t16) + unreachable +inrange4692: + %t18 = extractvalue { ptr, i64, i64 } %t15, 0 + %t19 = getelementptr inbounds %S.ast.Node, ptr %t18, i64 0 + %t20 = getelementptr inbounds %S.ast.Node, ptr %t19, i32 0, i32 0 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.3008, i64 4, i64 0 }, ptr %a23 + %t24 = call i32 @finch_str_eq(ptr %a22, ptr %a23) + %t25 = icmp ne i32 %t24, 0 + br label %logic.rend4693 +logic.rend4693: + br label %logic.end4690 +logic.end4690: + %t26 = phi i1 [ false, %logic.from4688 ], [ %t25, %logic.rend4693 ] + br label %logic.from4694 +logic.from4694: + br i1 %t26, label %logic.rhs4695, label %logic.end4696 +logic.rhs4695: + %t27 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t28 = load { ptr, i64, i64 }, ptr %t27 + %t29 = extractvalue { ptr, i64, i64 } %t28, 1 + %t30 = icmp uge i64 0, %t29 + br i1 %t30, label %range4697, label %inrange4698 +range4697: + call void @finch_panic_index(ptr @.str.3009, i64 2261, i64 0, i64 %t29) + unreachable +inrange4698: + %t31 = extractvalue { ptr, i64, i64 } %t28, 0 + %t32 = getelementptr inbounds %S.ast.Node, ptr %t31, i64 0 + %t33 = getelementptr inbounds %S.ast.Node, ptr %t32, i32 0, i32 1 + %t34 = load { ptr, i64, i64 }, ptr %t33 + store { ptr, i64, i64 } %t34, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.3010, i64 5, i64 0 }, ptr %a36 + %t37 = call i32 @finch_str_eq(ptr %a35, ptr %a36) + %t38 = icmp ne i32 %t37, 0 + br label %logic.rend4699 +logic.rend4699: + br label %logic.end4696 +logic.end4696: + %t39 = phi i1 [ false, %logic.from4694 ], [ %t38, %logic.rend4699 ] + br i1 %t39, label %then4700, label %endif4702 +then4700: + %t40 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t41 = load { ptr, i64, i64 }, ptr %t40 + %t42 = extractvalue { ptr, i64, i64 } %t41, 1 + %t43 = icmp uge i64 0, %t42 + br i1 %t43, label %range4703, label %inrange4704 +range4703: + call void @finch_panic_index(ptr @.str.3011, i64 2262, i64 0, i64 %t42) + unreachable +inrange4704: + %t44 = extractvalue { ptr, i64, i64 } %t41, 0 + %t45 = getelementptr inbounds %S.ast.Node, ptr %t44, i64 0 + %t46 = load %S.ast.Node, ptr %t45 + store %S.ast.Node %t46, ptr %a47 + call void @finch.copy.S_ast_Node(ptr %a48, ptr %a47) + %t49 = load %S.ast.Node, ptr %a48 + store %S.ast.Node %t49, ptr %a50 + %t51 = load ptr, ptr %a1 + %t52 = icmp eq ptr %t51, null + br i1 %t52, label %panic4705, label %ok4706 +panic4705: + call void @finch_panic(ptr @.str.3012, i64 2263, ptr @.str.3013) + unreachable +ok4706: + %t53 = getelementptr inbounds %S.gen.Gen, ptr %t51, i32 0, i32 12 + %t54 = getelementptr inbounds %S.gen.FnSig, ptr %t53, i32 0, i32 9 + %t55 = load i1, ptr %t54 + %t56 = xor i1 %t55, true + br i1 %t56, label %then4707, label %endif4709 +then4707: + store { ptr, i64, i64 } { ptr @.str.3014, i64 1, i64 0 }, ptr %a57 + %t58 = load ptr, ptr %a1 + %t59 = icmp eq ptr %t58, null + br i1 %t59, label %panic4710, label %ok4711 +panic4710: + call void @finch_panic(ptr @.str.3015, i64 2265, ptr @.str.3016) + unreachable +ok4711: + %t60 = getelementptr inbounds %S.gen.Gen, ptr %t58, i32 0, i32 12 + %t61 = getelementptr inbounds %S.gen.FnSig, ptr %t60, i32 0, i32 12 + %t62 = getelementptr inbounds %S.ast.Type, ptr %t61, i32 0, i32 0 + %t63 = load { ptr, i64, i64 }, ptr %t62 + store { ptr, i64, i64 } %t63, ptr %a64 + store { ptr, i64, i64 } { ptr @.str.3017, i64 4, i64 0 }, ptr %a65 + %t66 = call i32 @finch_str_eq(ptr %a64, ptr %a65) + %t67 = icmp eq i32 %t66, 0 + br i1 %t67, label %then4712, label %endif4714 +then4712: + %t68 = load ptr, ptr %a1 + %t69 = icmp eq ptr %t68, null + br i1 %t69, label %panic4715, label %ok4716 +panic4715: + call void @finch_panic(ptr @.str.3018, i64 2266, ptr @.str.3019) + unreachable +ok4716: + %t70 = getelementptr inbounds %S.gen.Gen, ptr %t68, i32 0, i32 12 + %t71 = getelementptr inbounds %S.gen.FnSig, ptr %t70, i32 0, i32 12 + %t72 = load %S.ast.Type, ptr %t71 + %t73 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t72) + store { ptr, i64, i64 } %t73, ptr %a75 + store { ptr, i64, i64 } { ptr @.str.3020, i64 1, i64 0 }, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t77, ptr %a57 + br label %endif4714 +endif4714: + %t78 = load ptr, ptr %a1 + %t79 = load %S.ast.Node, ptr %a50 + %t80 = load ptr, ptr %a1 + %t81 = icmp eq ptr %t80, null + br i1 %t81, label %panic4717, label %ok4718 +panic4717: + call void @finch_panic(ptr @.str.3022, i64 2268, ptr @.str.3023) + unreachable +ok4718: + %t82 = getelementptr inbounds %S.gen.Gen, ptr %t80, i32 0, i32 12 + %t83 = getelementptr inbounds %S.gen.FnSig, ptr %t82, i32 0, i32 1 + %t84 = load { ptr, i64, i64 }, ptr %t83 + store { ptr, i64, i64 } { ptr @.str.3021, i64 1, i64 0 }, ptr %a86 + store { ptr, i64, i64 } %t84, ptr %a87 + call void @finch_str_concat(ptr %a85, ptr %a86, ptr %a87) + %t88 = load { ptr, i64, i64 }, ptr %a85 + store { ptr, i64, i64 } %t88, ptr %a90 + store { ptr, i64, i64 } { ptr @.str.3024, i64 64, i64 0 }, ptr %a91 + call void @finch_str_concat(ptr %a89, ptr %a90, ptr %a91) + %t92 = load { ptr, i64, i64 }, ptr %a89 + %t93 = load { ptr, i64, i64 }, ptr %a57 + store { ptr, i64, i64 } %t92, ptr %a95 + store { ptr, i64, i64 } %t93, ptr %a96 + call void @finch_str_concat(ptr %a94, ptr %a95, ptr %a96) + %t97 = load { ptr, i64, i64 }, ptr %a94 + store { ptr, i64, i64 } %t97, ptr %a99 + store { ptr, i64, i64 } { ptr @.str.3025, i64 1, i64 0 }, ptr %a100 + call void @finch_str_concat(ptr %a98, ptr %a99, ptr %a100) + %t101 = load { ptr, i64, i64 }, ptr %a98 + call void @finch.gen.fail(ptr %t78, %S.ast.Node %t79, { ptr, i64, i64 } %t101) + br label %endif4709 +endif4709: + %t102 = load ptr, ptr %a1 + %t103 = load %S.ast.Node, ptr %a50 + call void @finch.gen.checkArgs(ptr %t102, %S.ast.Node %t103, i64 0, i64 1, { ptr, i64, i64 } { ptr @.str.3026, i64 5, i64 0 }) + %t104 = load ptr, ptr %a1 + %t105 = load ptr, ptr %a1 + %t106 = getelementptr inbounds %S.ast.Node, ptr %a50, i32 0, i32 9 + %t107 = load { ptr, i64, i64 }, ptr %t106 + %t108 = extractvalue { ptr, i64, i64 } %t107, 1 + %t109 = icmp uge i64 0, %t108 + br i1 %t109, label %range4719, label %inrange4720 +range4719: + call void @finch_panic_index(ptr @.str.3027, i64 2271, i64 0, i64 %t108) + unreachable +inrange4720: + %t110 = extractvalue { ptr, i64, i64 } %t107, 0 + %t111 = getelementptr inbounds %S.ast.Node, ptr %t110, i64 0 + %t112 = load %S.ast.Node, ptr %t111 + %t113 = call %S.gen.Val @finch.gen.expr(ptr %t105, %S.ast.Node %t112) + %t114 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3028, i64 3, i64 0 }) + %t115 = getelementptr inbounds %S.ast.Node, ptr %a50, i32 0, i32 9 + %t116 = load { ptr, i64, i64 }, ptr %t115 + %t117 = extractvalue { ptr, i64, i64 } %t116, 1 + %t118 = icmp uge i64 0, %t117 + br i1 %t118, label %range4721, label %inrange4722 +range4721: + call void @finch_panic_index(ptr @.str.3029, i64 2271, i64 0, i64 %t117) + unreachable +inrange4722: + %t119 = extractvalue { ptr, i64, i64 } %t116, 0 + %t120 = getelementptr inbounds %S.ast.Node, ptr %t119, i64 0 + %t121 = load %S.ast.Node, ptr %t120 + %t122 = call %S.gen.Val @finch.gen.coerce(ptr %t104, %S.gen.Val %t113, %S.ast.Type %t114, %S.ast.Node %t121, { ptr, i64, i64 } { ptr @.str.3030, i64 17, i64 0 }) + store %S.gen.Val %t122, ptr %a123 + %t124 = load ptr, ptr %a1 + %t125 = load %S.gen.Val, ptr %a123 + %t126 = call { ptr, i64, i64 } @finch.gen.own(ptr %t124, %S.gen.Val %t125) + store { ptr, i64, i64 } %t126, ptr %a127 + %t128 = load ptr, ptr %a1 + call void @finch.gen.unwind(ptr %t128, i64 0) + %t129 = load ptr, ptr %a1 + %t130 = load ptr, ptr %a1 + %t131 = load ptr, ptr %a1 + %t132 = icmp eq ptr %t131, null + br i1 %t132, label %panic4723, label %ok4724 +panic4723: + call void @finch_panic(ptr @.str.3032, i64 2274, ptr @.str.3033) + unreachable +ok4724: + %t133 = getelementptr inbounds %S.gen.Gen, ptr %t131, i32 0, i32 12 + %t134 = load %S.gen.FnSig, ptr %t133 + %t135 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t130, %S.gen.FnSig %t134) + store { ptr, i64, i64 } { ptr @.str.3031, i64 4, i64 0 }, ptr %a137 + store { ptr, i64, i64 } %t135, ptr %a138 + call void @finch_str_concat(ptr %a136, ptr %a137, ptr %a138) + %t139 = load { ptr, i64, i64 }, ptr %a136 + store { ptr, i64, i64 } %t139, ptr %a141 + store { ptr, i64, i64 } { ptr @.str.3034, i64 1, i64 0 }, ptr %a142 + call void @finch_str_concat(ptr %a140, ptr %a141, ptr %a142) + %t143 = load { ptr, i64, i64 }, ptr %a140 + %t144 = load ptr, ptr %a1 + %t145 = load ptr, ptr %a1 + %t146 = load ptr, ptr %a1 + %t147 = icmp eq ptr %t146, null + br i1 %t147, label %panic4725, label %ok4726 +panic4725: + call void @finch_panic(ptr @.str.3036, i64 2274, ptr @.str.3037) + unreachable +ok4726: + %t148 = getelementptr inbounds %S.gen.Gen, ptr %t146, i32 0, i32 12 + %t149 = load %S.gen.FnSig, ptr %t148 + %t150 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t145, %S.gen.FnSig %t149) + store { ptr, i64, i64 } { ptr @.str.3035, i64 12, i64 0 }, ptr %a152 + store { ptr, i64, i64 } %t150, ptr %a153 + call void @finch_str_concat(ptr %a151, ptr %a152, ptr %a153) + %t154 = load { ptr, i64, i64 }, ptr %a151 + store { ptr, i64, i64 } %t154, ptr %a156 + store { ptr, i64, i64 } { ptr @.str.3038, i64 36, i64 0 }, ptr %a157 + call void @finch_str_concat(ptr %a155, ptr %a156, ptr %a157) + %t158 = load { ptr, i64, i64 }, ptr %a155 + %t159 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t158, ptr %a161 + store { ptr, i64, i64 } %t159, ptr %a162 + call void @finch_str_concat(ptr %a160, ptr %a161, ptr %a162) + %t163 = load { ptr, i64, i64 }, ptr %a160 + store { ptr, i64, i64 } %t163, ptr %a165 + store { ptr, i64, i64 } { ptr @.str.3039, i64 3, i64 0 }, ptr %a166 + call void @finch_str_concat(ptr %a164, ptr %a165, ptr %a166) + %t167 = load { ptr, i64, i64 }, ptr %a164 + %t168 = call { ptr, i64, i64 } @finch.gen.op(ptr %t144, { ptr, i64, i64 } %t167) + store { ptr, i64, i64 } %t143, ptr %a170 + store { ptr, i64, i64 } %t168, ptr %a171 + call void @finch_str_concat(ptr %a169, ptr %a170, ptr %a171) + %t172 = load { ptr, i64, i64 }, ptr %a169 + call void @finch.gen.emit(ptr %t129, { ptr, i64, i64 } %t172) + %t173 = load ptr, ptr %a1 + %t174 = icmp eq ptr %t173, null + br i1 %t174, label %panic4727, label %ok4728 +panic4727: + call void @finch_panic(ptr @.str.3040, i64 2275, ptr @.str.3041) + unreachable +ok4728: + %t175 = getelementptr inbounds %S.gen.Gen, ptr %t173, i32 0, i32 9 + store i1 true, ptr %t175 + ret void +endif4702: + %t176 = load ptr, ptr %a1 + %t177 = icmp eq ptr %t176, null + br i1 %t177, label %panic4729, label %ok4730 +panic4729: + call void @finch_panic(ptr @.str.3042, i64 2278, ptr @.str.3043) + unreachable +ok4730: + %t178 = getelementptr inbounds %S.gen.Gen, ptr %t176, i32 0, i32 12 + %t179 = getelementptr inbounds %S.gen.FnSig, ptr %t178, i32 0, i32 12 + %t180 = getelementptr inbounds %S.ast.Type, ptr %t179, i32 0, i32 0 + %t181 = load { ptr, i64, i64 }, ptr %t180 + store { ptr, i64, i64 } %t181, ptr %a182 + store { ptr, i64, i64 } { ptr @.str.3044, i64 4, i64 0 }, ptr %a183 + %t184 = call i32 @finch_str_eq(ptr %a182, ptr %a183) + %t185 = icmp ne i32 %t184, 0 + br i1 %t185, label %then4731, label %endif4733 +then4731: + %t186 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t187 = getelementptr inbounds { ptr, i64, i64 }, ptr %t186, i32 0, i32 1 + %t188 = load i64, ptr %t187 + %t189 = icmp sgt i64 %t188, 0 + br i1 %t189, label %then4734, label %endif4736 +then4734: + %t190 = load ptr, ptr %a1 + %t191 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t192 = load { ptr, i64, i64 }, ptr %t191 + %t193 = extractvalue { ptr, i64, i64 } %t192, 1 + %t194 = icmp uge i64 0, %t193 + br i1 %t194, label %range4737, label %inrange4738 +range4737: + call void @finch_panic_index(ptr @.str.3045, i64 2280, i64 0, i64 %t193) + unreachable +inrange4738: + %t195 = extractvalue { ptr, i64, i64 } %t192, 0 + %t196 = getelementptr inbounds %S.ast.Node, ptr %t195, i64 0 + %t197 = load %S.ast.Node, ptr %t196 + %t198 = load ptr, ptr %a1 + %t199 = icmp eq ptr %t198, null + br i1 %t199, label %panic4739, label %ok4740 +panic4739: + call void @finch_panic(ptr @.str.3047, i64 2280, ptr @.str.3048) + unreachable +ok4740: + %t200 = getelementptr inbounds %S.gen.Gen, ptr %t198, i32 0, i32 12 + %t201 = getelementptr inbounds %S.gen.FnSig, ptr %t200, i32 0, i32 1 + %t202 = load { ptr, i64, i64 }, ptr %t201 + store { ptr, i64, i64 } { ptr @.str.3046, i64 1, i64 0 }, ptr %a204 + store { ptr, i64, i64 } %t202, ptr %a205 + call void @finch_str_concat(ptr %a203, ptr %a204, ptr %a205) + %t206 = load { ptr, i64, i64 }, ptr %a203 + store { ptr, i64, i64 } %t206, ptr %a208 + store { ptr, i64, i64 } { ptr @.str.3049, i64 46, i64 0 }, ptr %a209 + call void @finch_str_concat(ptr %a207, ptr %a208, ptr %a209) + %t210 = load { ptr, i64, i64 }, ptr %a207 + call void @finch.gen.fail(ptr %t190, %S.ast.Node %t197, { ptr, i64, i64 } %t210) + br label %endif4736 +endif4736: + %t211 = load ptr, ptr %a1 + call void @finch.gen.unwind(ptr %t211, i64 0) + %t212 = load ptr, ptr %a1 + %t213 = icmp eq ptr %t212, null + br i1 %t213, label %panic4741, label %ok4742 +panic4741: + call void @finch_panic(ptr @.str.3050, i64 2283, ptr @.str.3051) + unreachable +ok4742: + %t214 = getelementptr inbounds %S.gen.Gen, ptr %t212, i32 0, i32 12 + %t215 = getelementptr inbounds %S.gen.FnSig, ptr %t214, i32 0, i32 9 + %t216 = load i1, ptr %t215 + br i1 %t216, label %then4743, label %else4744 +then4743: + %t217 = load ptr, ptr %a1 + %t218 = load ptr, ptr %a1 + %t219 = load ptr, ptr %a1 + %t220 = icmp eq ptr %t219, null + br i1 %t220, label %panic4746, label %ok4747 +panic4746: + call void @finch_panic(ptr @.str.3053, i64 2284, ptr @.str.3054) + unreachable +ok4747: + %t221 = getelementptr inbounds %S.gen.Gen, ptr %t219, i32 0, i32 12 + %t222 = load %S.gen.FnSig, ptr %t221 + %t223 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t218, %S.gen.FnSig %t222) + store { ptr, i64, i64 } { ptr @.str.3052, i64 4, i64 0 }, ptr %a225 + store { ptr, i64, i64 } %t223, ptr %a226 + call void @finch_str_concat(ptr %a224, ptr %a225, ptr %a226) + %t227 = load { ptr, i64, i64 }, ptr %a224 + store { ptr, i64, i64 } %t227, ptr %a229 + store { ptr, i64, i64 } { ptr @.str.3055, i64 53, i64 0 }, ptr %a230 + call void @finch_str_concat(ptr %a228, ptr %a229, ptr %a230) + %t231 = load { ptr, i64, i64 }, ptr %a228 + call void @finch.gen.emit(ptr %t217, { ptr, i64, i64 } %t231) + br label %endif4745 +else4744: + %t232 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t232, { ptr, i64, i64 } { ptr @.str.3056, i64 8, i64 0 }) + br label %endif4745 +endif4745: + %t233 = load ptr, ptr %a1 + %t234 = icmp eq ptr %t233, null + br i1 %t234, label %panic4748, label %ok4749 +panic4748: + call void @finch_panic(ptr @.str.3057, i64 2288, ptr @.str.3058) + unreachable +ok4749: + %t235 = getelementptr inbounds %S.gen.Gen, ptr %t233, i32 0, i32 9 + store i1 true, ptr %t235 + ret void +endif4733: + %t236 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t237 = getelementptr inbounds { ptr, i64, i64 }, ptr %t236, i32 0, i32 1 + %t238 = load i64, ptr %t237 + %t239 = icmp eq i64 %t238, 0 + br i1 %t239, label %then4750, label %endif4752 +then4750: + %t240 = load ptr, ptr %a1 + %t241 = load %S.ast.Node, ptr %a2 + %t242 = load ptr, ptr %a1 + %t243 = icmp eq ptr %t242, null + br i1 %t243, label %panic4753, label %ok4754 +panic4753: + call void @finch_panic(ptr @.str.3060, i64 2292, ptr @.str.3061) + unreachable +ok4754: + %t244 = getelementptr inbounds %S.gen.Gen, ptr %t242, i32 0, i32 12 + %t245 = getelementptr inbounds %S.gen.FnSig, ptr %t244, i32 0, i32 1 + %t246 = load { ptr, i64, i64 }, ptr %t245 + store { ptr, i64, i64 } { ptr @.str.3059, i64 1, i64 0 }, ptr %a248 + store { ptr, i64, i64 } %t246, ptr %a249 + call void @finch_str_concat(ptr %a247, ptr %a248, ptr %a249) + %t250 = load { ptr, i64, i64 }, ptr %a247 + store { ptr, i64, i64 } %t250, ptr %a252 + store { ptr, i64, i64 } { ptr @.str.3062, i64 14, i64 0 }, ptr %a253 + call void @finch_str_concat(ptr %a251, ptr %a252, ptr %a253) + %t254 = load { ptr, i64, i64 }, ptr %a251 + %t255 = load ptr, ptr %a1 + %t256 = icmp eq ptr %t255, null + br i1 %t256, label %panic4755, label %ok4756 +panic4755: + call void @finch_panic(ptr @.str.3063, i64 2292, ptr @.str.3064) + unreachable +ok4756: + %t257 = getelementptr inbounds %S.gen.Gen, ptr %t255, i32 0, i32 12 + %t258 = getelementptr inbounds %S.gen.FnSig, ptr %t257, i32 0, i32 12 + %t259 = load %S.ast.Type, ptr %t258 + %t260 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t259) + store { ptr, i64, i64 } %t254, ptr %a262 + store { ptr, i64, i64 } %t260, ptr %a263 + call void @finch_str_concat(ptr %a261, ptr %a262, ptr %a263) + %t264 = load { ptr, i64, i64 }, ptr %a261 + call void @finch.gen.fail(ptr %t240, %S.ast.Node %t241, { ptr, i64, i64 } %t264) + br label %endif4752 +endif4752: + %t265 = load ptr, ptr %a1 + %t266 = load ptr, ptr %a1 + %t267 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t268 = load { ptr, i64, i64 }, ptr %t267 + %t269 = extractvalue { ptr, i64, i64 } %t268, 1 + %t270 = icmp uge i64 0, %t269 + br i1 %t270, label %range4757, label %inrange4758 +range4757: + call void @finch_panic_index(ptr @.str.3065, i64 2294, i64 0, i64 %t269) + unreachable +inrange4758: + %t271 = extractvalue { ptr, i64, i64 } %t268, 0 + %t272 = getelementptr inbounds %S.ast.Node, ptr %t271, i64 0 + %t273 = load %S.ast.Node, ptr %t272 + %t274 = load ptr, ptr %a1 + %t275 = icmp eq ptr %t274, null + br i1 %t275, label %panic4759, label %ok4760 +panic4759: + call void @finch_panic(ptr @.str.3066, i64 2294, ptr @.str.3067) + unreachable +ok4760: + %t276 = getelementptr inbounds %S.gen.Gen, ptr %t274, i32 0, i32 12 + %t277 = getelementptr inbounds %S.gen.FnSig, ptr %t276, i32 0, i32 12 + %t278 = load %S.ast.Type, ptr %t277 + %t279 = call %S.gen.Val @finch.gen.exprWant(ptr %t266, %S.ast.Node %t273, %S.ast.Type %t278) + %t280 = load ptr, ptr %a1 + %t281 = icmp eq ptr %t280, null + br i1 %t281, label %panic4761, label %ok4762 +panic4761: + call void @finch_panic(ptr @.str.3068, i64 2294, ptr @.str.3069) + unreachable +ok4762: + %t282 = getelementptr inbounds %S.gen.Gen, ptr %t280, i32 0, i32 12 + %t283 = getelementptr inbounds %S.gen.FnSig, ptr %t282, i32 0, i32 12 + %t284 = load %S.ast.Type, ptr %t283 + %t285 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t286 = load { ptr, i64, i64 }, ptr %t285 + %t287 = extractvalue { ptr, i64, i64 } %t286, 1 + %t288 = icmp uge i64 0, %t287 + br i1 %t288, label %range4763, label %inrange4764 +range4763: + call void @finch_panic_index(ptr @.str.3070, i64 2294, i64 0, i64 %t287) + unreachable +inrange4764: + %t289 = extractvalue { ptr, i64, i64 } %t286, 0 + %t290 = getelementptr inbounds %S.ast.Node, ptr %t289, i64 0 + %t291 = load %S.ast.Node, ptr %t290 + %t292 = call %S.gen.Val @finch.gen.coerce(ptr %t265, %S.gen.Val %t279, %S.ast.Type %t284, %S.ast.Node %t291, { ptr, i64, i64 } { ptr @.str.3071, i64 18, i64 0 }) + store %S.gen.Val %t292, ptr %a293 + %t294 = getelementptr inbounds %S.gen.Val, ptr %a293, i32 0, i32 0 + %t295 = load { ptr, i64, i64 }, ptr %t294 + store { ptr, i64, i64 } %t295, ptr %a296 + call void @finch_str_copy(ptr %a297, ptr %a296) + %t298 = load { ptr, i64, i64 }, ptr %a297 + store { ptr, i64, i64 } %t298, ptr %a299 + store i1 false, ptr %a300 + %t301 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t302 = load { ptr, i64, i64 }, ptr %t301 + %t303 = extractvalue { ptr, i64, i64 } %t302, 1 + %t304 = icmp uge i64 0, %t303 + br i1 %t304, label %range4765, label %inrange4766 +range4765: + call void @finch_panic_index(ptr @.str.3072, i64 2298, i64 0, i64 %t303) + unreachable +inrange4766: + %t305 = extractvalue { ptr, i64, i64 } %t302, 0 + %t306 = getelementptr inbounds %S.ast.Node, ptr %t305, i64 0 + %t307 = getelementptr inbounds %S.ast.Node, ptr %t306, i32 0, i32 0 + %t308 = load { ptr, i64, i64 }, ptr %t307 + store { ptr, i64, i64 } %t308, ptr %a309 + store { ptr, i64, i64 } { ptr @.str.3073, i64 3, i64 0 }, ptr %a310 + %t311 = call i32 @finch_str_eq(ptr %a309, ptr %a310) + %t312 = icmp ne i32 %t311, 0 + br i1 %t312, label %then4767, label %endif4769 +then4767: + %t313 = load ptr, ptr %a1 + %t314 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t315 = load { ptr, i64, i64 }, ptr %t314 + %t316 = extractvalue { ptr, i64, i64 } %t315, 1 + %t317 = icmp uge i64 0, %t316 + br i1 %t317, label %range4770, label %inrange4771 +range4770: + call void @finch_panic_index(ptr @.str.3074, i64 2299, i64 0, i64 %t316) + unreachable +inrange4771: + %t318 = extractvalue { ptr, i64, i64 } %t315, 0 + %t319 = getelementptr inbounds %S.ast.Node, ptr %t318, i64 0 + %t320 = getelementptr inbounds %S.ast.Node, ptr %t319, i32 0, i32 1 + %t321 = load { ptr, i64, i64 }, ptr %t320 + %t322 = call i64 @finch.gen.lookup(ptr %t313, { ptr, i64, i64 } %t321) + store i64 %t322, ptr %a323 + %t324 = load i64, ptr %a323 + %t325 = icmp sge i64 %t324, 0 + br label %logic.from4772 +logic.from4772: + br i1 %t325, label %logic.rhs4773, label %logic.end4774 +logic.rhs4773: + %t326 = load i64, ptr %a323 + %t327 = sdiv i64 %t326, 100000 + %t328 = icmp sgt i64 %t327, 0 + br label %logic.rend4775 +logic.rend4775: + br label %logic.end4774 +logic.end4774: + %t329 = phi i1 [ false, %logic.from4772 ], [ %t328, %logic.rend4775 ] + store i1 %t329, ptr %a300 + br label %endif4769 +endif4769: + %t330 = load i1, ptr %a300 + %t331 = xor i1 %t330, true + br i1 %t331, label %then4776, label %endif4778 +then4776: + %t332 = load ptr, ptr %a1 + %t333 = load %S.gen.Val, ptr %a293 + %t334 = call { ptr, i64, i64 } @finch.gen.own(ptr %t332, %S.gen.Val %t333) + store { ptr, i64, i64 } %t334, ptr %a299 + br label %endif4778 +endif4778: + %t335 = load ptr, ptr %a1 + call void @finch.gen.unwind(ptr %t335, i64 0) + %t336 = load ptr, ptr %a1 + %t337 = icmp eq ptr %t336, null + br i1 %t337, label %panic4779, label %ok4780 +panic4779: + call void @finch_panic(ptr @.str.3075, i64 2306, ptr @.str.3076) + unreachable +ok4780: + %t338 = getelementptr inbounds %S.gen.Gen, ptr %t336, i32 0, i32 12 + %t339 = getelementptr inbounds %S.gen.FnSig, ptr %t338, i32 0, i32 9 + %t340 = load i1, ptr %t339 + br i1 %t340, label %then4781, label %else4782 +then4781: + %t341 = load ptr, ptr %a1 + %t342 = load ptr, ptr %a1 + %t343 = load ptr, ptr %a1 + %t344 = icmp eq ptr %t343, null + br i1 %t344, label %panic4784, label %ok4785 +panic4784: + call void @finch_panic(ptr @.str.3078, i64 2307, ptr @.str.3079) + unreachable +ok4785: + %t345 = getelementptr inbounds %S.gen.Gen, ptr %t343, i32 0, i32 12 + %t346 = load %S.gen.FnSig, ptr %t345 + %t347 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t342, %S.gen.FnSig %t346) + store { ptr, i64, i64 } { ptr @.str.3077, i64 12, i64 0 }, ptr %a349 + store { ptr, i64, i64 } %t347, ptr %a350 + call void @finch_str_concat(ptr %a348, ptr %a349, ptr %a350) + %t351 = load { ptr, i64, i64 }, ptr %a348 + store { ptr, i64, i64 } %t351, ptr %a353 + store { ptr, i64, i64 } { ptr @.str.3080, i64 28, i64 0 }, ptr %a354 + call void @finch_str_concat(ptr %a352, ptr %a353, ptr %a354) + %t355 = load { ptr, i64, i64 }, ptr %a352 + %t356 = call { ptr, i64, i64 } @finch.gen.op(ptr %t341, { ptr, i64, i64 } %t355) + store { ptr, i64, i64 } %t356, ptr %a357 + %t358 = load ptr, ptr %a1 + %t359 = load ptr, ptr %a1 + %t360 = load ptr, ptr %a1 + %t361 = icmp eq ptr %t360, null + br i1 %t361, label %panic4786, label %ok4787 +panic4786: + call void @finch_panic(ptr @.str.3082, i64 2308, ptr @.str.3083) + unreachable +ok4787: + %t362 = getelementptr inbounds %S.gen.Gen, ptr %t360, i32 0, i32 12 + %t363 = load %S.gen.FnSig, ptr %t362 + %t364 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t359, %S.gen.FnSig %t363) + store { ptr, i64, i64 } { ptr @.str.3081, i64 12, i64 0 }, ptr %a366 + store { ptr, i64, i64 } %t364, ptr %a367 + call void @finch_str_concat(ptr %a365, ptr %a366, ptr %a367) + %t368 = load { ptr, i64, i64 }, ptr %a365 + store { ptr, i64, i64 } %t368, ptr %a370 + store { ptr, i64, i64 } { ptr @.str.3084, i64 1, i64 0 }, ptr %a371 + call void @finch_str_concat(ptr %a369, ptr %a370, ptr %a371) + %t372 = load { ptr, i64, i64 }, ptr %a369 + %t373 = load { ptr, i64, i64 }, ptr %a357 + store { ptr, i64, i64 } %t372, ptr %a375 + store { ptr, i64, i64 } %t373, ptr %a376 + call void @finch_str_concat(ptr %a374, ptr %a375, ptr %a376) + %t377 = load { ptr, i64, i64 }, ptr %a374 + store { ptr, i64, i64 } %t377, ptr %a379 + store { ptr, i64, i64 } { ptr @.str.3085, i64 2, i64 0 }, ptr %a380 + call void @finch_str_concat(ptr %a378, ptr %a379, ptr %a380) + %t381 = load { ptr, i64, i64 }, ptr %a378 + %t382 = load ptr, ptr %a1 + %t383 = load ptr, ptr %a1 + %t384 = icmp eq ptr %t383, null + br i1 %t384, label %panic4788, label %ok4789 +panic4788: + call void @finch_panic(ptr @.str.3086, i64 2308, ptr @.str.3087) + unreachable +ok4789: + %t385 = getelementptr inbounds %S.gen.Gen, ptr %t383, i32 0, i32 12 + %t386 = getelementptr inbounds %S.gen.FnSig, ptr %t385, i32 0, i32 12 + %t387 = load %S.ast.Type, ptr %t386 + %t388 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t382, %S.ast.Type %t387) + store { ptr, i64, i64 } %t381, ptr %a390 + store { ptr, i64, i64 } %t388, ptr %a391 + call void @finch_str_concat(ptr %a389, ptr %a390, ptr %a391) + %t392 = load { ptr, i64, i64 }, ptr %a389 + store { ptr, i64, i64 } %t392, ptr %a394 + store { ptr, i64, i64 } { ptr @.str.3088, i64 1, i64 0 }, ptr %a395 + call void @finch_str_concat(ptr %a393, ptr %a394, ptr %a395) + %t396 = load { ptr, i64, i64 }, ptr %a393 + %t397 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } %t396, ptr %a399 + store { ptr, i64, i64 } %t397, ptr %a400 + call void @finch_str_concat(ptr %a398, ptr %a399, ptr %a400) + %t401 = load { ptr, i64, i64 }, ptr %a398 + store { ptr, i64, i64 } %t401, ptr %a403 + store { ptr, i64, i64 } { ptr @.str.3089, i64 3, i64 0 }, ptr %a404 + call void @finch_str_concat(ptr %a402, ptr %a403, ptr %a404) + %t405 = load { ptr, i64, i64 }, ptr %a402 + %t406 = call { ptr, i64, i64 } @finch.gen.op(ptr %t358, { ptr, i64, i64 } %t405) + store { ptr, i64, i64 } %t406, ptr %a407 + %t408 = load ptr, ptr %a1 + %t409 = load ptr, ptr %a1 + %t410 = load ptr, ptr %a1 + %t411 = icmp eq ptr %t410, null + br i1 %t411, label %panic4790, label %ok4791 +panic4790: + call void @finch_panic(ptr @.str.3091, i64 2309, ptr @.str.3092) + unreachable +ok4791: + %t412 = getelementptr inbounds %S.gen.Gen, ptr %t410, i32 0, i32 12 + %t413 = load %S.gen.FnSig, ptr %t412 + %t414 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t409, %S.gen.FnSig %t413) + store { ptr, i64, i64 } { ptr @.str.3090, i64 4, i64 0 }, ptr %a416 + store { ptr, i64, i64 } %t414, ptr %a417 + call void @finch_str_concat(ptr %a415, ptr %a416, ptr %a417) + %t418 = load { ptr, i64, i64 }, ptr %a415 + store { ptr, i64, i64 } %t418, ptr %a420 + store { ptr, i64, i64 } { ptr @.str.3093, i64 1, i64 0 }, ptr %a421 + call void @finch_str_concat(ptr %a419, ptr %a420, ptr %a421) + %t422 = load { ptr, i64, i64 }, ptr %a419 + %t423 = load { ptr, i64, i64 }, ptr %a407 + store { ptr, i64, i64 } %t422, ptr %a425 + store { ptr, i64, i64 } %t423, ptr %a426 + call void @finch_str_concat(ptr %a424, ptr %a425, ptr %a426) + %t427 = load { ptr, i64, i64 }, ptr %a424 + call void @finch.gen.emit(ptr %t408, { ptr, i64, i64 } %t427) + br label %endif4783 +else4782: + %t428 = load ptr, ptr %a1 + %t429 = load ptr, ptr %a1 + %t430 = load ptr, ptr %a1 + %t431 = icmp eq ptr %t430, null + br i1 %t431, label %panic4792, label %ok4793 +panic4792: + call void @finch_panic(ptr @.str.3095, i64 2311, ptr @.str.3096) + unreachable +ok4793: + %t432 = getelementptr inbounds %S.gen.Gen, ptr %t430, i32 0, i32 12 + %t433 = getelementptr inbounds %S.gen.FnSig, ptr %t432, i32 0, i32 12 + %t434 = load %S.ast.Type, ptr %t433 + %t435 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t429, %S.ast.Type %t434) + store { ptr, i64, i64 } { ptr @.str.3094, i64 4, i64 0 }, ptr %a437 + store { ptr, i64, i64 } %t435, ptr %a438 + call void @finch_str_concat(ptr %a436, ptr %a437, ptr %a438) + %t439 = load { ptr, i64, i64 }, ptr %a436 + store { ptr, i64, i64 } %t439, ptr %a441 + store { ptr, i64, i64 } { ptr @.str.3097, i64 1, i64 0 }, ptr %a442 + call void @finch_str_concat(ptr %a440, ptr %a441, ptr %a442) + %t443 = load { ptr, i64, i64 }, ptr %a440 + %t444 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } %t443, ptr %a446 + store { ptr, i64, i64 } %t444, ptr %a447 + call void @finch_str_concat(ptr %a445, ptr %a446, ptr %a447) + %t448 = load { ptr, i64, i64 }, ptr %a445 + call void @finch.gen.emit(ptr %t428, { ptr, i64, i64 } %t448) + br label %endif4783 +endif4783: + %t449 = load ptr, ptr %a1 + %t450 = icmp eq ptr %t449, null + br i1 %t450, label %panic4794, label %ok4795 +panic4794: + call void @finch_panic(ptr @.str.3098, i64 2313, ptr @.str.3099) + unreachable +ok4795: + %t451 = getelementptr inbounds %S.gen.Gen, ptr %t449, i32 0, i32 9 + store i1 true, ptr %t451 + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.entryTy(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t5 = load { ptr, i64, i64 }, ptr %t4 + %t6 = extractvalue { ptr, i64, i64 } %t5, 1 + %t7 = icmp uge i64 0, %t6 + br i1 %t7, label %range4796, label %inrange4797 +range4796: + call void @finch_panic_index(ptr @.str.3101, i64 2325, i64 0, i64 %t6) + unreachable +inrange4797: + %t8 = extractvalue { ptr, i64, i64 } %t5, 0 + %t9 = getelementptr inbounds %S.ast.Type, ptr %t8, i64 0 + %t10 = load %S.ast.Type, ptr %t9 + %t11 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t3, %S.ast.Type %t10) + store { ptr, i64, i64 } { ptr @.str.3100, i64 7, i64 0 }, ptr %a13 + store { ptr, i64, i64 } %t11, ptr %a14 + call void @finch_str_concat(ptr %a12, ptr %a13, ptr %a14) + %t15 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t15, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.3102, i64 2, i64 0 }, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + %t20 = load ptr, ptr %a1 + %t21 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t22 = load { ptr, i64, i64 }, ptr %t21 + %t23 = extractvalue { ptr, i64, i64 } %t22, 1 + %t24 = icmp uge i64 1, %t23 + br i1 %t24, label %range4798, label %inrange4799 +range4798: + call void @finch_panic_index(ptr @.str.3103, i64 2325, i64 1, i64 %t23) + unreachable +inrange4799: + %t25 = extractvalue { ptr, i64, i64 } %t22, 0 + %t26 = getelementptr inbounds %S.ast.Type, ptr %t25, i64 1 + %t27 = load %S.ast.Type, ptr %t26 + %t28 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t20, %S.ast.Type %t27) + store { ptr, i64, i64 } %t19, ptr %a30 + store { ptr, i64, i64 } %t28, ptr %a31 + call void @finch_str_concat(ptr %a29, ptr %a30, ptr %a31) + %t32 = load { ptr, i64, i64 }, ptr %a29 + store { ptr, i64, i64 } %t32, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.3104, i64 2, i64 0 }, ptr %a35 + call void @finch_str_concat(ptr %a33, ptr %a34, ptr %a35) + %t36 = load { ptr, i64, i64 }, ptr %a33 + ret { ptr, i64, i64 } %t36 +} + +define internal { ptr, i64, i64 } @finch.gen.entrySize(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = load %S.ast.Type, ptr %a2 + %t5 = call { ptr, i64, i64 } @finch.gen.entryTy(ptr %t3, %S.ast.Type %t4) + store { ptr, i64, i64 } { ptr @.str.3105, i64 29, i64 0 }, ptr %a7 + store { ptr, i64, i64 } %t5, ptr %a8 + call void @finch_str_concat(ptr %a6, ptr %a7, ptr %a8) + %t9 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t9, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.3106, i64 26, i64 0 }, ptr %a12 + call void @finch_str_concat(ptr %a10, ptr %a11, ptr %a12) + %t13 = load { ptr, i64, i64 }, ptr %a10 + ret { ptr, i64, i64 } %t13 +} + +define internal { ptr, i64, i64 } @finch.gen.entryAt(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2, { ptr, i64, i64 } %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = load ptr, ptr %a1 + %t7 = load ptr, ptr %a1 + %t8 = load %S.ast.Type, ptr %a3 + %t9 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t7, %S.ast.Type %t8) + store { ptr, i64, i64 } { ptr @.str.3108, i64 23, i64 0 }, ptr %a11 + store { ptr, i64, i64 } %t9, ptr %a12 + call void @finch_str_concat(ptr %a10, ptr %a11, ptr %a12) + %t13 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t13, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.3109, i64 6, i64 0 }, ptr %a16 + call void @finch_str_concat(ptr %a14, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + %t18 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t17, ptr %a20 + store { ptr, i64, i64 } %t18, ptr %a21 + call void @finch_str_concat(ptr %a19, ptr %a20, ptr %a21) + %t22 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t22, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.3110, i64 14, i64 0 }, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + %t27 = call { ptr, i64, i64 } @finch.gen.op(ptr %t6, { ptr, i64, i64 } %t26) + %t28 = call { ptr, i64, i64 } @finch.gen.load(ptr %t5, { ptr, i64, i64 } { ptr @.str.3107, i64 3, i64 0 }, { ptr, i64, i64 } %t27) + store { ptr, i64, i64 } %t28, ptr %a29 + %t30 = load ptr, ptr %a1 + %t31 = load ptr, ptr %a1 + %t32 = load %S.ast.Type, ptr %a3 + %t33 = call { ptr, i64, i64 } @finch.gen.entryTy(ptr %t31, %S.ast.Type %t32) + store { ptr, i64, i64 } { ptr @.str.3111, i64 23, i64 0 }, ptr %a35 + store { ptr, i64, i64 } %t33, ptr %a36 + call void @finch_str_concat(ptr %a34, ptr %a35, ptr %a36) + %t37 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t37, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.3112, i64 6, i64 0 }, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + %t42 = load { ptr, i64, i64 }, ptr %a29 + store { ptr, i64, i64 } %t41, ptr %a44 + store { ptr, i64, i64 } %t42, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + store { ptr, i64, i64 } %t46, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.3113, i64 6, i64 0 }, ptr %a49 + call void @finch_str_concat(ptr %a47, ptr %a48, ptr %a49) + %t50 = load { ptr, i64, i64 }, ptr %a47 + %t51 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t50, ptr %a53 + store { ptr, i64, i64 } %t51, ptr %a54 + call void @finch_str_concat(ptr %a52, ptr %a53, ptr %a54) + %t55 = load { ptr, i64, i64 }, ptr %a52 + %t56 = call { ptr, i64, i64 } @finch.gen.op(ptr %t30, { ptr, i64, i64 } %t55) + ret { ptr, i64, i64 } %t56 +} + +define internal { ptr, i64, i64 } @finch.gen.entryField(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2, i64 %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca i64, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store i64 %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = load ptr, ptr %a1 + %t7 = load %S.ast.Type, ptr %a3 + %t8 = call { ptr, i64, i64 } @finch.gen.entryTy(ptr %t6, %S.ast.Type %t7) + store { ptr, i64, i64 } { ptr @.str.3114, i64 23, i64 0 }, ptr %a10 + store { ptr, i64, i64 } %t8, ptr %a11 + call void @finch_str_concat(ptr %a9, ptr %a10, ptr %a11) + %t12 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t12, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.3115, i64 6, i64 0 }, ptr %a15 + call void @finch_str_concat(ptr %a13, ptr %a14, ptr %a15) + %t16 = load { ptr, i64, i64 }, ptr %a13 + %t17 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t16, ptr %a19 + store { ptr, i64, i64 } %t17, ptr %a20 + call void @finch_str_concat(ptr %a18, ptr %a19, ptr %a20) + %t21 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.3116, i64 13, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + %t26 = load i64, ptr %a4 + call void @finch_str_from_int(ptr %a27, i64 %t26) + %t28 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t25, ptr %a30 + store { ptr, i64, i64 } %t28, ptr %a31 + call void @finch_str_concat(ptr %a29, ptr %a30, ptr %a31) + %t32 = load { ptr, i64, i64 }, ptr %a29 + %t33 = call { ptr, i64, i64 } @finch.gen.op(ptr %t5, { ptr, i64, i64 } %t32) + ret { ptr, i64, i64 } %t33 +} + +define internal { ptr, i64, i64 } @finch.gen.mapArgs(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.3117, i64 1, i64 0 }, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t7 = load { ptr, i64, i64 }, ptr %t6 + %t8 = extractvalue { ptr, i64, i64 } %t7, 1 + %t9 = icmp uge i64 0, %t8 + br i1 %t9, label %range4800, label %inrange4801 +range4800: + call void @finch_panic_index(ptr @.str.3118, i64 2345, i64 0, i64 %t8) + unreachable +inrange4801: + %t10 = extractvalue { ptr, i64, i64 } %t7, 0 + %t11 = getelementptr inbounds %S.ast.Type, ptr %t10, i64 0 + %t12 = getelementptr inbounds %S.ast.Type, ptr %t11, i32 0, i32 0 + %t13 = load { ptr, i64, i64 }, ptr %t12 + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.3119, i64 3, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp ne i32 %t16, 0 + br i1 %t17, label %then4802, label %endif4804 +then4802: + store { ptr, i64, i64 } { ptr @.str.3120, i64 1, i64 0 }, ptr %a5 + br label %endif4804 +endif4804: + %t18 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.3121, i64 4, i64 0 }, ptr %a20 + store { ptr, i64, i64 } %t18, ptr %a21 + call void @finch_str_concat(ptr %a19, ptr %a20, ptr %a21) + %t22 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t22, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.3122, i64 6, i64 0 }, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + %t27 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t26, ptr %a29 + store { ptr, i64, i64 } %t27, ptr %a30 + call void @finch_str_concat(ptr %a28, ptr %a29, ptr %a30) + %t31 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } %t31, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.3123, i64 6, i64 0 }, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + %t36 = load ptr, ptr %a1 + %t37 = load %S.ast.Type, ptr %a4 + %t38 = call { ptr, i64, i64 } @finch.gen.entrySize(ptr %t36, %S.ast.Type %t37) + store { ptr, i64, i64 } %t35, ptr %a40 + store { ptr, i64, i64 } %t38, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + store { ptr, i64, i64 } %t42, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.3124, i64 6, i64 0 }, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + %t47 = load ptr, ptr %a1 + %t48 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t49 = load { ptr, i64, i64 }, ptr %t48 + %t50 = extractvalue { ptr, i64, i64 } %t49, 1 + %t51 = icmp uge i64 0, %t50 + br i1 %t51, label %range4805, label %inrange4806 +range4805: + call void @finch_panic_index(ptr @.str.3125, i64 2348, i64 0, i64 %t50) + unreachable +inrange4806: + %t52 = extractvalue { ptr, i64, i64 } %t49, 0 + %t53 = getelementptr inbounds %S.ast.Type, ptr %t52, i64 0 + %t54 = load %S.ast.Type, ptr %t53 + %t55 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t47, %S.ast.Type %t54) + store { ptr, i64, i64 } %t46, ptr %a57 + store { ptr, i64, i64 } %t55, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t59, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.3126, i64 6, i64 0 }, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + %t64 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t63, ptr %a66 + store { ptr, i64, i64 } %t64, ptr %a67 + call void @finch_str_concat(ptr %a65, ptr %a66, ptr %a67) + %t68 = load { ptr, i64, i64 }, ptr %a65 + ret { ptr, i64, i64 } %t68 +} + +define internal { ptr, i64, i64 } @finch.gen.mapFind(ptr %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = load ptr, ptr %a1 + %t7 = load { ptr, i64, i64 }, ptr %a2 + %t8 = load { ptr, i64, i64 }, ptr %a3 + %t9 = load %S.ast.Type, ptr %a4 + %t10 = call { ptr, i64, i64 } @finch.gen.mapArgs(ptr %t6, { ptr, i64, i64 } %t7, { ptr, i64, i64 } %t8, %S.ast.Type %t9) + store { ptr, i64, i64 } { ptr @.str.3127, i64 25, i64 0 }, ptr %a12 + store { ptr, i64, i64 } %t10, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t14, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.3128, i64 1, i64 0 }, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + %t19 = call { ptr, i64, i64 } @finch.gen.op(ptr %t5, { ptr, i64, i64 } %t18) + ret { ptr, i64, i64 } %t19 +} + +define internal { ptr, i64, i64 } @finch.gen.defaultVal(ptr %p0, %S.ast.Type %p1, %S.ast.Node %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.ast.Node, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + store %S.ast.Node %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.3129, i64 6, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br label %logic.from4807 +logic.from4807: + br i1 %t9, label %logic.rhs4808, label %logic.end4809 +logic.rhs4808: + %t10 = load ptr, ptr %a1 + %t11 = load %S.ast.Type, ptr %a2 + %t12 = call i1 @finch.gen.hasDefaults(ptr %t10, %S.ast.Type %t11) + br label %logic.rend4810 +logic.rend4810: + br label %logic.end4809 +logic.end4809: + %t13 = phi i1 [ false, %logic.from4807 ], [ %t12, %logic.rend4810 ] + br i1 %t13, label %then4811, label %endif4813 +then4811: + store { ptr, i64, i64 } zeroinitializer, ptr %a14 + store { ptr, i64, i64 } zeroinitializer, ptr %a15 + %t16 = load ptr, ptr %a1 + %t17 = load ptr, ptr %a1 + %t18 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t19 = load { ptr, i64, i64 }, ptr %t18 + %t20 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t21 = load { ptr, i64, i64 }, ptr %t20 + %t22 = call i64 @finch.gen.findStruct(ptr %t17, { ptr, i64, i64 } %t19, { ptr, i64, i64 } %t21) + %t23 = load { ptr, i64, i64 }, ptr %a14 + %t24 = load { ptr, i64, i64 }, ptr %a15 + %t25 = load %S.ast.Node, ptr %a3 + %t26 = call %S.gen.Val @finch.gen.construct(ptr %t16, i64 %t22, { ptr, i64, i64 } %t23, { ptr, i64, i64 } %t24, %S.ast.Node %t25) + %t27 = extractvalue %S.gen.Val %t26, 0 + store { ptr, i64, i64 } %t27, ptr %a28 + call void @finch_str_copy(ptr %a29, ptr %a28) + %t30 = load { ptr, i64, i64 }, ptr %a29 + ret { ptr, i64, i64 } %t30 +endif4813: + %t31 = load %S.ast.Type, ptr %a2 + %t32 = call { ptr, i64, i64 } @finch.gen.zeroOf(%S.ast.Type %t31) + ret { ptr, i64, i64 } %t32 +} + +define internal { ptr, i64, i64 } @finch.gen.mapSlot(ptr %p0, { ptr, i64, i64 } %p1, %S.ast.Type %p2, %S.gen.Val %p3, i1 %p4, %S.ast.Node %p5) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.gen.Val, align 16 + %a5 = alloca i1, align 16 + %a6 = alloca %S.ast.Node, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca %S.ast.Type, align 16 + %a115 = alloca %S.ast.Type, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + store %S.gen.Val %p3, ptr %a4 + store i1 %p4, ptr %a5 + store %S.ast.Node %p5, ptr %a6 + %t7 = load ptr, ptr %a1 + %t8 = load %S.gen.Val, ptr %a4 + %t9 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t7, %S.gen.Val %t8) + store { ptr, i64, i64 } %t9, ptr %a10 + %t11 = load ptr, ptr %a1 + %t12 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t11, { ptr, i64, i64 } { ptr @.str.3130, i64 3, i64 0 }) + store { ptr, i64, i64 } %t12, ptr %a13 + %t14 = load ptr, ptr %a1 + %t15 = load { ptr, i64, i64 }, ptr %a13 + call void @finch.gen.store(ptr %t14, { ptr, i64, i64 } { ptr @.str.3131, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.3132, i64 1, i64 0 }, { ptr, i64, i64 } %t15) + %t16 = load ptr, ptr %a1 + %t17 = load ptr, ptr %a1 + %t18 = load { ptr, i64, i64 }, ptr %a2 + %t19 = load { ptr, i64, i64 }, ptr %a10 + %t20 = load %S.ast.Type, ptr %a3 + %t21 = call { ptr, i64, i64 } @finch.gen.mapArgs(ptr %t17, { ptr, i64, i64 } %t18, { ptr, i64, i64 } %t19, %S.ast.Type %t20) + store { ptr, i64, i64 } { ptr @.str.3133, i64 25, i64 0 }, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.3134, i64 6, i64 0 }, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + %t30 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t29, ptr %a32 + store { ptr, i64, i64 } %t30, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t34, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.3135, i64 1, i64 0 }, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + %t39 = call { ptr, i64, i64 } @finch.gen.op(ptr %t16, { ptr, i64, i64 } %t38) + store { ptr, i64, i64 } %t39, ptr %a40 + %t41 = load ptr, ptr %a1 + %t42 = load { ptr, i64, i64 }, ptr %a2 + %t43 = load %S.ast.Type, ptr %a3 + %t44 = load { ptr, i64, i64 }, ptr %a40 + %t45 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t41, { ptr, i64, i64 } %t42, %S.ast.Type %t43, { ptr, i64, i64 } %t44) + store { ptr, i64, i64 } %t45, ptr %a46 + %t47 = load ptr, ptr %a1 + %t48 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t47, { ptr, i64, i64 } { ptr @.str.3136, i64 7, i64 0 }) + store { ptr, i64, i64 } %t48, ptr %a49 + %t50 = load ptr, ptr %a1 + %t51 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t50, { ptr, i64, i64 } { ptr @.str.3137, i64 8, i64 0 }) + store { ptr, i64, i64 } %t51, ptr %a52 + %t53 = load ptr, ptr %a1 + %t54 = load ptr, ptr %a1 + %t55 = load ptr, ptr %a1 + %t56 = load { ptr, i64, i64 }, ptr %a13 + %t57 = call { ptr, i64, i64 } @finch.gen.load(ptr %t55, { ptr, i64, i64 } { ptr @.str.3139, i64 3, i64 0 }, { ptr, i64, i64 } %t56) + store { ptr, i64, i64 } { ptr @.str.3138, i64 12, i64 0 }, ptr %a59 + store { ptr, i64, i64 } %t57, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + store { ptr, i64, i64 } %t61, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.3140, i64 3, i64 0 }, ptr %a64 + call void @finch_str_concat(ptr %a62, ptr %a63, ptr %a64) + %t65 = load { ptr, i64, i64 }, ptr %a62 + %t66 = call { ptr, i64, i64 } @finch.gen.op(ptr %t54, { ptr, i64, i64 } %t65) + %t67 = load { ptr, i64, i64 }, ptr %a49 + %t68 = load { ptr, i64, i64 }, ptr %a52 + call void @finch.gen.condBr(ptr %t53, { ptr, i64, i64 } %t66, { ptr, i64, i64 } %t67, { ptr, i64, i64 } %t68) + %t69 = load ptr, ptr %a1 + %t70 = load { ptr, i64, i64 }, ptr %a49 + call void @finch.gen.label(ptr %t69, { ptr, i64, i64 } %t70) + %t71 = load ptr, ptr %a1 + %t72 = load ptr, ptr %a1 + %t73 = load { ptr, i64, i64 }, ptr %a46 + %t74 = load %S.ast.Type, ptr %a3 + %t75 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t72, { ptr, i64, i64 } %t73, %S.ast.Type %t74, i64 1) + %t76 = load { ptr, i64, i64 }, ptr %a10 + %t77 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t78 = load { ptr, i64, i64 }, ptr %t77 + %t79 = extractvalue { ptr, i64, i64 } %t78, 1 + %t80 = icmp uge i64 0, %t79 + br i1 %t80, label %range4814, label %inrange4815 +range4814: + call void @finch_panic_index(ptr @.str.3141, i64 2376, i64 0, i64 %t79) + unreachable +inrange4815: + %t81 = extractvalue { ptr, i64, i64 } %t78, 0 + %t82 = getelementptr inbounds %S.ast.Type, ptr %t81, i64 0 + %t83 = load %S.ast.Type, ptr %t82 + call void @finch.gen.copyAt(ptr %t71, { ptr, i64, i64 } %t75, { ptr, i64, i64 } %t76, %S.ast.Type %t83) + %t84 = load i1, ptr %a5 + br i1 %t84, label %then4816, label %endif4818 +then4816: + %t85 = load ptr, ptr %a1 + %t86 = load ptr, ptr %a1 + %t87 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t88 = load { ptr, i64, i64 }, ptr %t87 + %t89 = extractvalue { ptr, i64, i64 } %t88, 1 + %t90 = icmp uge i64 1, %t89 + br i1 %t90, label %range4819, label %inrange4820 +range4819: + call void @finch_panic_index(ptr @.str.3142, i64 2378, i64 1, i64 %t89) + unreachable +inrange4820: + %t91 = extractvalue { ptr, i64, i64 } %t88, 0 + %t92 = getelementptr inbounds %S.ast.Type, ptr %t91, i64 1 + %t93 = load %S.ast.Type, ptr %t92 + %t94 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t86, %S.ast.Type %t93) + %t95 = load ptr, ptr %a1 + %t96 = load ptr, ptr %a1 + %t97 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t98 = load { ptr, i64, i64 }, ptr %t97 + %t99 = extractvalue { ptr, i64, i64 } %t98, 1 + %t100 = icmp uge i64 1, %t99 + br i1 %t100, label %range4821, label %inrange4822 +range4821: + call void @finch_panic_index(ptr @.str.3143, i64 2378, i64 1, i64 %t99) + unreachable +inrange4822: + %t101 = extractvalue { ptr, i64, i64 } %t98, 0 + %t102 = getelementptr inbounds %S.ast.Type, ptr %t101, i64 1 + %t103 = load %S.ast.Type, ptr %t102 + %t104 = load %S.ast.Node, ptr %a6 + %t105 = call { ptr, i64, i64 } @finch.gen.defaultVal(ptr %t96, %S.ast.Type %t103, %S.ast.Node %t104) + %t106 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t105, 0 + %t107 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t108 = load { ptr, i64, i64 }, ptr %t107 + %t109 = extractvalue { ptr, i64, i64 } %t108, 1 + %t110 = icmp uge i64 1, %t109 + br i1 %t110, label %range4823, label %inrange4824 +range4823: + call void @finch_panic_index(ptr @.str.3144, i64 2378, i64 1, i64 %t109) + unreachable +inrange4824: + %t111 = extractvalue { ptr, i64, i64 } %t108, 0 + %t112 = getelementptr inbounds %S.ast.Type, ptr %t111, i64 1 + %t113 = load %S.ast.Type, ptr %t112 + store %S.ast.Type %t113, ptr %a114 + call void @finch.copy.S_ast_Type(ptr %a115, ptr %a114) + %t116 = load %S.ast.Type, ptr %a115 + %t117 = insertvalue %S.gen.Val %t106, %S.ast.Type %t116, 1 + %t118 = insertvalue %S.gen.Val %t117, i1 true, 2 + %t119 = call { ptr, i64, i64 } @finch.gen.own(ptr %t95, %S.gen.Val %t118) + %t120 = load ptr, ptr %a1 + %t121 = load { ptr, i64, i64 }, ptr %a46 + %t122 = load %S.ast.Type, ptr %a3 + %t123 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t120, { ptr, i64, i64 } %t121, %S.ast.Type %t122, i64 2) + call void @finch.gen.store(ptr %t85, { ptr, i64, i64 } %t94, { ptr, i64, i64 } %t119, { ptr, i64, i64 } %t123) + br label %endif4818 +endif4818: + %t124 = load ptr, ptr %a1 + %t125 = load { ptr, i64, i64 }, ptr %a52 + call void @finch.gen.br(ptr %t124, { ptr, i64, i64 } %t125) + %t126 = load ptr, ptr %a1 + %t127 = load { ptr, i64, i64 }, ptr %a52 + call void @finch.gen.label(ptr %t126, { ptr, i64, i64 } %t127) + %t128 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t128, ptr %a129 + call void @finch_str_copy(ptr %a130, ptr %a129) + %t131 = load { ptr, i64, i64 }, ptr %a130 + ret { ptr, i64, i64 } %t131 +} + +define internal %S.gen.Ref @finch.gen.mapIndex(ptr %p0, %S.ast.Node %p1, %S.gen.Ref %p2, %S.ast.Type %p3, i1 %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.gen.Ref, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca i1, align 16 + %a13 = alloca %S.ast.Type, align 16 + %a14 = alloca %S.ast.Type, align 16 + %a16 = alloca %S.ast.Type, align 16 + %a24 = alloca %S.ast.Type, align 16 + %a25 = alloca %S.ast.Type, align 16 + %a27 = alloca %S.ast.Type, align 16 + %a48 = alloca %S.gen.Val, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca %S.ast.Type, align 16 + %a72 = alloca %S.ast.Type, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca %S.ast.Type, align 16 + %a199 = alloca %S.ast.Type, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca %S.ast.Type, align 16 + %a217 = alloca %S.ast.Type, align 16 + %a220 = alloca %S.gen.Val, align 16 + %a234 = alloca %S.ast.Type, align 16 + %a235 = alloca %S.ast.Type, align 16 + %a241 = alloca %S.gen.Val, align 16 + %a242 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.gen.Ref %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store i1 %p4, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t7 = load { ptr, i64, i64 }, ptr %t6 + %t8 = extractvalue { ptr, i64, i64 } %t7, 1 + %t9 = icmp uge i64 0, %t8 + br i1 %t9, label %range4825, label %inrange4826 +range4825: + call void @finch_panic_index(ptr @.str.3145, i64 2387, i64 0, i64 %t8) + unreachable +inrange4826: + %t10 = extractvalue { ptr, i64, i64 } %t7, 0 + %t11 = getelementptr inbounds %S.ast.Type, ptr %t10, i64 0 + %t12 = load %S.ast.Type, ptr %t11 + store %S.ast.Type %t12, ptr %a13 + call void @finch.copy.S_ast_Type(ptr %a14, ptr %a13) + %t15 = load %S.ast.Type, ptr %a14 + store %S.ast.Type %t15, ptr %a16 + %t17 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t18 = load { ptr, i64, i64 }, ptr %t17 + %t19 = extractvalue { ptr, i64, i64 } %t18, 1 + %t20 = icmp uge i64 1, %t19 + br i1 %t20, label %range4827, label %inrange4828 +range4827: + call void @finch_panic_index(ptr @.str.3146, i64 2388, i64 1, i64 %t19) + unreachable +inrange4828: + %t21 = extractvalue { ptr, i64, i64 } %t18, 0 + %t22 = getelementptr inbounds %S.ast.Type, ptr %t21, i64 1 + %t23 = load %S.ast.Type, ptr %t22 + store %S.ast.Type %t23, ptr %a24 + call void @finch.copy.S_ast_Type(ptr %a25, ptr %a24) + %t26 = load %S.ast.Type, ptr %a25 + store %S.ast.Type %t26, ptr %a27 + %t28 = load ptr, ptr %a1 + %t29 = load ptr, ptr %a1 + %t30 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t31 = load { ptr, i64, i64 }, ptr %t30 + %t32 = extractvalue { ptr, i64, i64 } %t31, 1 + %t33 = icmp uge i64 1, %t32 + br i1 %t33, label %range4829, label %inrange4830 +range4829: + call void @finch_panic_index(ptr @.str.3147, i64 2389, i64 1, i64 %t32) + unreachable +inrange4830: + %t34 = extractvalue { ptr, i64, i64 } %t31, 0 + %t35 = getelementptr inbounds %S.ast.Node, ptr %t34, i64 1 + %t36 = load %S.ast.Node, ptr %t35 + %t37 = load %S.ast.Type, ptr %a16 + %t38 = call %S.gen.Val @finch.gen.exprWant(ptr %t29, %S.ast.Node %t36, %S.ast.Type %t37) + %t39 = load %S.ast.Type, ptr %a16 + %t40 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t41 = load { ptr, i64, i64 }, ptr %t40 + %t42 = extractvalue { ptr, i64, i64 } %t41, 1 + %t43 = icmp uge i64 1, %t42 + br i1 %t43, label %range4831, label %inrange4832 +range4831: + call void @finch_panic_index(ptr @.str.3148, i64 2389, i64 1, i64 %t42) + unreachable +inrange4832: + %t44 = extractvalue { ptr, i64, i64 } %t41, 0 + %t45 = getelementptr inbounds %S.ast.Node, ptr %t44, i64 1 + %t46 = load %S.ast.Node, ptr %t45 + %t47 = call %S.gen.Val @finch.gen.coerce(ptr %t28, %S.gen.Val %t38, %S.ast.Type %t39, %S.ast.Node %t46, { ptr, i64, i64 } { ptr @.str.3149, i64 7, i64 0 }) + store %S.gen.Val %t47, ptr %a48 + %t49 = load i1, ptr %a5 + br i1 %t49, label %then4833, label %endif4835 +then4833: + %t50 = getelementptr inbounds %S.gen.Ref, ptr %a3, i32 0, i32 0 + %t51 = load i1, ptr %t50 + %t52 = xor i1 %t51, true + br i1 %t52, label %then4836, label %endif4838 +then4836: + %t53 = load ptr, ptr %a1 + %t54 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t53, %S.ast.Node %t54, { ptr, i64, i64 } { ptr @.str.3150, i64 44, i64 0 }) + br label %endif4838 +endif4838: + %t55 = load ptr, ptr %a1 + %t56 = getelementptr inbounds %S.gen.Ref, ptr %a3, i32 0, i32 1 + %t57 = getelementptr inbounds %S.gen.Place, ptr %t56, i32 0, i32 0 + %t58 = load { ptr, i64, i64 }, ptr %t57 + %t59 = load %S.ast.Type, ptr %a4 + %t60 = load %S.gen.Val, ptr %a48 + %t61 = load %S.ast.Node, ptr %a2 + %t62 = call { ptr, i64, i64 } @finch.gen.mapSlot(ptr %t55, { ptr, i64, i64 } %t58, %S.ast.Type %t59, %S.gen.Val %t60, i1 true, %S.ast.Node %t61) + store { ptr, i64, i64 } %t62, ptr %a63 + %t64 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t65 = load ptr, ptr %a1 + %t66 = load { ptr, i64, i64 }, ptr %a63 + %t67 = load %S.ast.Type, ptr %a4 + %t68 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t65, { ptr, i64, i64 } %t66, %S.ast.Type %t67, i64 2) + %t69 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t68, 0 + %t70 = load %S.ast.Type, ptr %a27 + store %S.ast.Type %t70, ptr %a71 + call void @finch.copy.S_ast_Type(ptr %a72, ptr %a71) + %t73 = load %S.ast.Type, ptr %a72 + %t74 = insertvalue %S.gen.Place %t69, %S.ast.Type %t73, 1 + %t75 = insertvalue %S.gen.Ref %t64, %S.gen.Place %t74, 1 + ret %S.gen.Ref %t75 +endif4835: + store { ptr, i64, i64 } { ptr @.str.3151, i64 0, i64 0 }, ptr %a76 + %t77 = getelementptr inbounds %S.gen.Ref, ptr %a3, i32 0, i32 0 + %t78 = load i1, ptr %t77 + br i1 %t78, label %then4839, label %else4840 +then4839: + %t79 = getelementptr inbounds %S.gen.Ref, ptr %a3, i32 0, i32 1 + %t80 = getelementptr inbounds %S.gen.Place, ptr %t79, i32 0, i32 0 + %t81 = load { ptr, i64, i64 }, ptr %t80 + store { ptr, i64, i64 } %t81, ptr %a82 + call void @finch_str_copy(ptr %a83, ptr %a82) + %t84 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t84, ptr %a76 + br label %endif4841 +else4840: + %t85 = load ptr, ptr %a1 + %t86 = getelementptr inbounds %S.gen.Ref, ptr %a3, i32 0, i32 2 + %t87 = load %S.gen.Val, ptr %t86 + %t88 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t85, %S.gen.Val %t87) + store { ptr, i64, i64 } %t88, ptr %a76 + br label %endif4841 +endif4841: + %t89 = load ptr, ptr %a1 + %t90 = load %S.gen.Val, ptr %a48 + %t91 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t89, %S.gen.Val %t90) + store { ptr, i64, i64 } %t91, ptr %a92 + %t93 = load ptr, ptr %a1 + %t94 = load { ptr, i64, i64 }, ptr %a76 + %t95 = load { ptr, i64, i64 }, ptr %a92 + %t96 = load %S.ast.Type, ptr %a4 + %t97 = call { ptr, i64, i64 } @finch.gen.mapFind(ptr %t93, { ptr, i64, i64 } %t94, { ptr, i64, i64 } %t95, %S.ast.Type %t96) + store { ptr, i64, i64 } %t97, ptr %a98 + %t99 = load ptr, ptr %a1 + %t100 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t99, { ptr, i64, i64 } { ptr @.str.3152, i64 11, i64 0 }) + store { ptr, i64, i64 } %t100, ptr %a101 + %t102 = load ptr, ptr %a1 + %t103 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t102, { ptr, i64, i64 } { ptr @.str.3153, i64 9, i64 0 }) + store { ptr, i64, i64 } %t103, ptr %a104 + %t105 = load ptr, ptr %a1 + %t106 = load ptr, ptr %a1 + %t107 = load { ptr, i64, i64 }, ptr %a98 + store { ptr, i64, i64 } { ptr @.str.3154, i64 13, i64 0 }, ptr %a109 + store { ptr, i64, i64 } %t107, ptr %a110 + call void @finch_str_concat(ptr %a108, ptr %a109, ptr %a110) + %t111 = load { ptr, i64, i64 }, ptr %a108 + store { ptr, i64, i64 } %t111, ptr %a113 + store { ptr, i64, i64 } { ptr @.str.3155, i64 3, i64 0 }, ptr %a114 + call void @finch_str_concat(ptr %a112, ptr %a113, ptr %a114) + %t115 = load { ptr, i64, i64 }, ptr %a112 + %t116 = call { ptr, i64, i64 } @finch.gen.op(ptr %t106, { ptr, i64, i64 } %t115) + %t117 = load { ptr, i64, i64 }, ptr %a101 + %t118 = load { ptr, i64, i64 }, ptr %a104 + call void @finch.gen.condBr(ptr %t105, { ptr, i64, i64 } %t116, { ptr, i64, i64 } %t117, { ptr, i64, i64 } %t118) + %t119 = load ptr, ptr %a1 + %t120 = load { ptr, i64, i64 }, ptr %a101 + call void @finch.gen.label(ptr %t119, { ptr, i64, i64 } %t120) + %t121 = load ptr, ptr %a1 + %t122 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t121, { ptr, i64, i64 } { ptr @.str.3156, i64 17, i64 0 }) + store { ptr, i64, i64 } %t122, ptr %a123 + %t124 = load ptr, ptr %a1 + %t125 = load { ptr, i64, i64 }, ptr %a123 + call void @finch.gen.store(ptr %t124, { ptr, i64, i64 } { ptr @.str.3157, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.3158, i64 15, i64 0 }, { ptr, i64, i64 } %t125) + %t126 = load ptr, ptr %a1 + %t127 = load { ptr, i64, i64 }, ptr %a123 + %t128 = getelementptr inbounds %S.gen.Val, ptr %a48, i32 0, i32 0 + %t129 = load { ptr, i64, i64 }, ptr %t128 + %t130 = load %S.ast.Type, ptr %a16 + call void @finch.gen.emitFormat(ptr %t126, { ptr, i64, i64 } %t127, { ptr, i64, i64 } %t129, %S.ast.Type %t130, i1 true) + %t131 = load ptr, ptr %a1 + %t132 = load ptr, ptr %a1 + %t133 = load ptr, ptr %a1 + %t134 = icmp eq ptr %t133, null + br i1 %t134, label %panic4842, label %ok4843 +panic4842: + call void @finch_panic(ptr @.str.3160, i64 2412, ptr @.str.3161) + unreachable +ok4843: + %t135 = getelementptr inbounds %S.gen.Gen, ptr %t133, i32 0, i32 1 + %t136 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t137 = load i64, ptr %t136 + %t138 = load { ptr, i64, i64 }, ptr %t135 + %t139 = extractvalue { ptr, i64, i64 } %t138, 1 + %t140 = icmp uge i64 %t137, %t139 + br i1 %t140, label %range4844, label %inrange4845 +range4844: + call void @finch_panic_index(ptr @.str.3162, i64 2412, i64 %t137, i64 %t139) + unreachable +inrange4845: + %t141 = extractvalue { ptr, i64, i64 } %t138, 0 + %t142 = getelementptr inbounds { ptr, i64, i64 }, ptr %t141, i64 %t137 + %t143 = load { ptr, i64, i64 }, ptr %t142 + %t144 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t132, { ptr, i64, i64 } %t143) + store { ptr, i64, i64 } { ptr @.str.3159, i64 33, i64 0 }, ptr %a146 + store { ptr, i64, i64 } %t144, ptr %a147 + call void @finch_str_concat(ptr %a145, ptr %a146, ptr %a147) + %t148 = load { ptr, i64, i64 }, ptr %a145 + store { ptr, i64, i64 } %t148, ptr %a150 + store { ptr, i64, i64 } { ptr @.str.3163, i64 6, i64 0 }, ptr %a151 + call void @finch_str_concat(ptr %a149, ptr %a150, ptr %a151) + %t152 = load { ptr, i64, i64 }, ptr %a149 + %t153 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t154 = load i64, ptr %t153 + call void @finch_str_from_int(ptr %a155, i64 %t154) + %t156 = load { ptr, i64, i64 }, ptr %a155 + store { ptr, i64, i64 } %t152, ptr %a158 + store { ptr, i64, i64 } %t156, ptr %a159 + call void @finch_str_concat(ptr %a157, ptr %a158, ptr %a159) + %t160 = load { ptr, i64, i64 }, ptr %a157 + store { ptr, i64, i64 } %t160, ptr %a162 + store { ptr, i64, i64 } { ptr @.str.3164, i64 6, i64 0 }, ptr %a163 + call void @finch_str_concat(ptr %a161, ptr %a162, ptr %a163) + %t164 = load { ptr, i64, i64 }, ptr %a161 + %t165 = load { ptr, i64, i64 }, ptr %a123 + store { ptr, i64, i64 } %t164, ptr %a167 + store { ptr, i64, i64 } %t165, ptr %a168 + call void @finch_str_concat(ptr %a166, ptr %a167, ptr %a168) + %t169 = load { ptr, i64, i64 }, ptr %a166 + store { ptr, i64, i64 } %t169, ptr %a171 + store { ptr, i64, i64 } { ptr @.str.3165, i64 1, i64 0 }, ptr %a172 + call void @finch_str_concat(ptr %a170, ptr %a171, ptr %a172) + %t173 = load { ptr, i64, i64 }, ptr %a170 + call void @finch.gen.emit(ptr %t131, { ptr, i64, i64 } %t173) + %t174 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t174, { ptr, i64, i64 } { ptr @.str.3166, i64 11, i64 0 }) + %t175 = load ptr, ptr %a1 + %t176 = icmp eq ptr %t175, null + br i1 %t176, label %panic4846, label %ok4847 +panic4846: + call void @finch_panic(ptr @.str.3167, i64 2414, ptr @.str.3168) + unreachable +ok4847: + %t177 = getelementptr inbounds %S.gen.Gen, ptr %t175, i32 0, i32 9 + store i1 true, ptr %t177 + %t178 = load ptr, ptr %a1 + %t179 = load { ptr, i64, i64 }, ptr %a104 + call void @finch.gen.label(ptr %t178, { ptr, i64, i64 } %t179) + %t180 = load ptr, ptr %a1 + %t181 = load ptr, ptr %a1 + %t182 = load { ptr, i64, i64 }, ptr %a76 + %t183 = load %S.ast.Type, ptr %a4 + %t184 = load { ptr, i64, i64 }, ptr %a98 + %t185 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t181, { ptr, i64, i64 } %t182, %S.ast.Type %t183, { ptr, i64, i64 } %t184) + %t186 = load %S.ast.Type, ptr %a4 + %t187 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t180, { ptr, i64, i64 } %t185, %S.ast.Type %t186, i64 2) + store { ptr, i64, i64 } %t187, ptr %a188 + %t189 = getelementptr inbounds %S.gen.Ref, ptr %a3, i32 0, i32 0 + %t190 = load i1, ptr %t189 + br i1 %t190, label %then4848, label %endif4850 +then4848: + %t191 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t192 = load { ptr, i64, i64 }, ptr %a188 + store { ptr, i64, i64 } %t192, ptr %a193 + call void @finch_str_copy(ptr %a194, ptr %a193) + %t195 = load { ptr, i64, i64 }, ptr %a194 + %t196 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t195, 0 + %t197 = load %S.ast.Type, ptr %a27 + store %S.ast.Type %t197, ptr %a198 + call void @finch.copy.S_ast_Type(ptr %a199, ptr %a198) + %t200 = load %S.ast.Type, ptr %a199 + %t201 = insertvalue %S.gen.Place %t196, %S.ast.Type %t200, 1 + %t202 = insertvalue %S.gen.Ref %t191, %S.gen.Place %t201, 1 + ret %S.gen.Ref %t202 +endif4850: + %t203 = load ptr, ptr %a1 + %t204 = load ptr, ptr %a1 + %t205 = load %S.ast.Type, ptr %a27 + %t206 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t204, %S.ast.Type %t205) + %t207 = load { ptr, i64, i64 }, ptr %a188 + %t208 = call { ptr, i64, i64 } @finch.gen.load(ptr %t203, { ptr, i64, i64 } %t206, { ptr, i64, i64 } %t207) + store { ptr, i64, i64 } %t208, ptr %a209 + %t210 = load { ptr, i64, i64 }, ptr %a209 + store { ptr, i64, i64 } %t210, ptr %a211 + call void @finch_str_copy(ptr %a212, ptr %a211) + %t213 = load { ptr, i64, i64 }, ptr %a212 + %t214 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t213, 0 + %t215 = load %S.ast.Type, ptr %a27 + store %S.ast.Type %t215, ptr %a216 + call void @finch.copy.S_ast_Type(ptr %a217, ptr %a216) + %t218 = load %S.ast.Type, ptr %a217 + %t219 = insertvalue %S.gen.Val %t214, %S.ast.Type %t218, 1 + store %S.gen.Val %t219, ptr %a220 + %t221 = load ptr, ptr %a1 + %t222 = load %S.ast.Type, ptr %a27 + %t223 = call i1 @finch.gen.owning(ptr %t221, %S.ast.Type %t222) + br label %logic.from4851 +logic.from4851: + br i1 %t223, label %logic.rhs4852, label %logic.end4853 +logic.rhs4852: + %t224 = getelementptr inbounds %S.gen.Ref, ptr %a3, i32 0, i32 2 + %t225 = getelementptr inbounds %S.gen.Val, ptr %t224, i32 0, i32 2 + %t226 = load i1, ptr %t225 + br label %logic.rend4854 +logic.rend4854: + br label %logic.end4853 +logic.end4853: + %t227 = phi i1 [ false, %logic.from4851 ], [ %t226, %logic.rend4854 ] + br i1 %t227, label %then4855, label %endif4857 +then4855: + %t228 = load ptr, ptr %a1 + %t229 = load { ptr, i64, i64 }, ptr %a209 + %t230 = load %S.ast.Type, ptr %a27 + %t231 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t228, { ptr, i64, i64 } %t229, %S.ast.Type %t230) + %t232 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t231, 0 + %t233 = load %S.ast.Type, ptr %a27 + store %S.ast.Type %t233, ptr %a234 + call void @finch.copy.S_ast_Type(ptr %a235, ptr %a234) + %t236 = load %S.ast.Type, ptr %a235 + %t237 = insertvalue %S.gen.Val %t232, %S.ast.Type %t236, 1 + %t238 = insertvalue %S.gen.Val %t237, i1 true, 2 + store %S.gen.Val %t238, ptr %a220 + br label %endif4857 +endif4857: + %t239 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t240 = load %S.gen.Val, ptr %a220 + store %S.gen.Val %t240, ptr %a241 + call void @finch.copy.S_gen_Val(ptr %a242, ptr %a241) + %t243 = load %S.gen.Val, ptr %a242 + %t244 = insertvalue %S.gen.Ref %t239, %S.gen.Val %t243, 2 + ret %S.gen.Ref %t244 +} + +define internal %S.gen.Val @finch.gen.mapLit(ptr %p0, %S.ast.Node %p1, %S.ast.Type %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a5 = alloca %S.ast.Type, align 16 + %a6 = alloca %S.ast.Type, align 16 + %a8 = alloca %S.ast.Type, align 16 + %a9 = alloca i1, align 16 + %a10 = alloca %S.gen.Val, align 16 + %a11 = alloca %S.gen.Val, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca i1, align 16 + %a25 = alloca i1, align 16 + %a30 = alloca i64, align 16 + %a43 = alloca %S.ast.Node, align 16 + %a44 = alloca %S.ast.Node, align 16 + %a46 = alloca %S.ast.Node, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca %S.ast.Node, align 16 + %a68 = alloca %S.ast.Node, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca %S.ast.Type, align 16 + %a151 = alloca %S.ast.Type, align 16 + %a153 = alloca %S.ast.Type, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca i64, align 16 + %a181 = alloca %S.gen.Val, align 16 + %a182 = alloca %S.gen.Val, align 16 + %a184 = alloca %S.gen.Val, align 16 + %a186 = alloca %S.gen.Val, align 16 + %a187 = alloca %S.gen.Val, align 16 + %a189 = alloca %S.gen.Val, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca %S.ast.Type, align 16 + %a308 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + %t4 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t4, ptr %a5 + call void @finch.copy.S_ast_Type(ptr %a6, ptr %a5) + %t7 = load %S.ast.Type, ptr %a6 + store %S.ast.Type %t7, ptr %a8 + store i1 false, ptr %a9 + store %S.gen.Val zeroinitializer, ptr %a10 + store %S.gen.Val zeroinitializer, ptr %a11 + %t12 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t13 = load { ptr, i64, i64 }, ptr %t12 + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.3169, i64 3, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp eq i32 %t16, 0 + br i1 %t17, label %then4858, label %endif4860 +then4858: + %t18 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i32 0, i32 1 + %t20 = load i64, ptr %t19 + %t21 = icmp eq i64 %t20, 0 + br i1 %t21, label %then4861, label %endif4863 +then4861: + %t22 = load ptr, ptr %a1 + %t23 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t22, %S.ast.Node %t23, { ptr, i64, i64 } { ptr @.str.3170, i64 52, i64 0 }) + br label %endif4863 +endif4863: + store i1 true, ptr %a24 + store i1 false, ptr %a25 + %t26 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %t26, i32 0, i32 1 + %t28 = load i64, ptr %t27 + %t29 = sdiv i64 %t28, 2 + store i64 0, ptr %a30 + br label %for.cond4864 +for.cond4864: + %t31 = load i64, ptr %a30 + %t32 = icmp slt i64 %t31, %t29 + br i1 %t32, label %for.body4865, label %for.end4867 +for.body4865: + %t33 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t34 = load i64, ptr %a30 + %t35 = mul i64 2, %t34 + %t36 = add i64 %t35, 1 + %t37 = load { ptr, i64, i64 }, ptr %t33 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 %t36, %t38 + br i1 %t39, label %range4868, label %inrange4869 +range4868: + call void @finch_panic_index(ptr @.str.3171, i64 2442, i64 %t36, i64 %t38) + unreachable +inrange4869: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds %S.ast.Node, ptr %t40, i64 %t36 + %t42 = load %S.ast.Node, ptr %t41 + store %S.ast.Node %t42, ptr %a43 + call void @finch.copy.S_ast_Node(ptr %a44, ptr %a43) + %t45 = load %S.ast.Node, ptr %a44 + store %S.ast.Node %t45, ptr %a46 + %t47 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 0 + %t48 = load { ptr, i64, i64 }, ptr %t47 + store { ptr, i64, i64 } %t48, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.3172, i64 5, i64 0 }, ptr %a50 + %t51 = call i32 @finch_str_eq(ptr %a49, ptr %a50) + %t52 = icmp ne i32 %t51, 0 + br label %logic.from4870 +logic.from4870: + br i1 %t52, label %logic.rhs4871, label %logic.end4872 +logic.rhs4871: + %t53 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 1 + %t54 = load { ptr, i64, i64 }, ptr %t53 + store { ptr, i64, i64 } %t54, ptr %a55 + store { ptr, i64, i64 } { ptr @.str.3173, i64 1, i64 0 }, ptr %a56 + %t57 = call i32 @finch_str_eq(ptr %a55, ptr %a56) + %t58 = icmp ne i32 %t57, 0 + br label %logic.rend4873 +logic.rend4873: + br label %logic.end4872 +logic.end4872: + %t59 = phi i1 [ false, %logic.from4870 ], [ %t58, %logic.rend4873 ] + br i1 %t59, label %then4874, label %endif4876 +then4874: + %t60 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 9 + %t61 = load { ptr, i64, i64 }, ptr %t60 + %t62 = extractvalue { ptr, i64, i64 } %t61, 1 + %t63 = icmp uge i64 0, %t62 + br i1 %t63, label %range4877, label %inrange4878 +range4877: + call void @finch_panic_index(ptr @.str.3174, i64 2444, i64 0, i64 %t62) + unreachable +inrange4878: + %t64 = extractvalue { ptr, i64, i64 } %t61, 0 + %t65 = getelementptr inbounds %S.ast.Node, ptr %t64, i64 0 + %t66 = load %S.ast.Node, ptr %t65 + store %S.ast.Node %t66, ptr %a67 + call void @finch.copy.S_ast_Node(ptr %a68, ptr %a67) + %t69 = load %S.ast.Node, ptr %a68 + store %S.ast.Node %t69, ptr %a46 + br label %endif4876 +endif4876: + %t70 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 0 + %t71 = load { ptr, i64, i64 }, ptr %t70 + store { ptr, i64, i64 } %t71, ptr %a72 + store { ptr, i64, i64 } { ptr @.str.3175, i64 5, i64 0 }, ptr %a73 + %t74 = call i32 @finch_str_eq(ptr %a72, ptr %a73) + %t75 = icmp ne i32 %t74, 0 + br i1 %t75, label %then4879, label %else4880 +then4879: + store i1 true, ptr %a25 + br label %endif4881 +else4880: + %t76 = getelementptr inbounds %S.ast.Node, ptr %a46, i32 0, i32 0 + %t77 = load { ptr, i64, i64 }, ptr %t76 + store { ptr, i64, i64 } %t77, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.3176, i64 3, i64 0 }, ptr %a79 + %t80 = call i32 @finch_str_eq(ptr %a78, ptr %a79) + %t81 = icmp eq i32 %t80, 0 + br i1 %t81, label %then4882, label %endif4884 +then4882: + store i1 false, ptr %a24 + br label %endif4884 +endif4884: + br label %endif4881 +endif4881: + br label %for.step4866 +for.step4866: + %t82 = load i64, ptr %a30 + %t83 = add i64 %t82, 1 + store i64 %t83, ptr %a30 + br label %for.cond4864 +for.end4867: + %t84 = load ptr, ptr %a1 + %t85 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t86 = load { ptr, i64, i64 }, ptr %t85 + %t87 = extractvalue { ptr, i64, i64 } %t86, 1 + %t88 = icmp uge i64 0, %t87 + br i1 %t88, label %range4885, label %inrange4886 +range4885: + call void @finch_panic_index(ptr @.str.3177, i64 2452, i64 0, i64 %t87) + unreachable +inrange4886: + %t89 = extractvalue { ptr, i64, i64 } %t86, 0 + %t90 = getelementptr inbounds %S.ast.Node, ptr %t89, i64 0 + %t91 = load %S.ast.Node, ptr %t90 + %t92 = call %S.gen.Val @finch.gen.expr(ptr %t84, %S.ast.Node %t91) + store %S.gen.Val %t92, ptr %a10 + %t93 = load ptr, ptr %a1 + %t94 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t95 = load { ptr, i64, i64 }, ptr %t94 + %t96 = extractvalue { ptr, i64, i64 } %t95, 1 + %t97 = icmp uge i64 1, %t96 + br i1 %t97, label %range4887, label %inrange4888 +range4887: + call void @finch_panic_index(ptr @.str.3178, i64 2453, i64 1, i64 %t96) + unreachable +inrange4888: + %t98 = extractvalue { ptr, i64, i64 } %t95, 0 + %t99 = getelementptr inbounds %S.ast.Node, ptr %t98, i64 1 + %t100 = load %S.ast.Node, ptr %t99 + %t101 = call %S.gen.Val @finch.gen.expr(ptr %t93, %S.ast.Node %t100) + store %S.gen.Val %t101, ptr %a11 + %t102 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t103 = getelementptr inbounds %S.ast.Type, ptr %t102, i32 0, i32 0 + %t104 = load { ptr, i64, i64 }, ptr %t103 + store { ptr, i64, i64 } %t104, ptr %a105 + store { ptr, i64, i64 } { ptr @.str.3179, i64 4, i64 0 }, ptr %a106 + %t107 = call i32 @finch_str_eq(ptr %a105, ptr %a106) + %t108 = icmp ne i32 %t107, 0 + br label %logic.from4889 +logic.from4889: + br i1 %t108, label %logic.end4891, label %logic.rhs4890 +logic.rhs4890: + %t109 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t110 = getelementptr inbounds %S.ast.Type, ptr %t109, i32 0, i32 0 + %t111 = load { ptr, i64, i64 }, ptr %t110 + store { ptr, i64, i64 } %t111, ptr %a112 + store { ptr, i64, i64 } { ptr @.str.3180, i64 4, i64 0 }, ptr %a113 + %t114 = call i32 @finch_str_eq(ptr %a112, ptr %a113) + %t115 = icmp ne i32 %t114, 0 + br label %logic.rend4892 +logic.rend4892: + br label %logic.end4891 +logic.end4891: + %t116 = phi i1 [ true, %logic.from4889 ], [ %t115, %logic.rend4892 ] + br i1 %t116, label %then4893, label %endif4895 +then4893: + %t117 = load ptr, ptr %a1 + %t118 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t119 = load { ptr, i64, i64 }, ptr %t118 + %t120 = extractvalue { ptr, i64, i64 } %t119, 1 + %t121 = icmp uge i64 0, %t120 + br i1 %t121, label %range4896, label %inrange4897 +range4896: + call void @finch_panic_index(ptr @.str.3181, i64 2455, i64 0, i64 %t120) + unreachable +inrange4897: + %t122 = extractvalue { ptr, i64, i64 } %t119, 0 + %t123 = getelementptr inbounds %S.ast.Node, ptr %t122, i64 0 + %t124 = load %S.ast.Node, ptr %t123 + call void @finch.gen.fail(ptr %t117, %S.ast.Node %t124, { ptr, i64, i64 } { ptr @.str.3182, i64 35, i64 0 }) + br label %endif4895 +endif4895: + %t125 = getelementptr inbounds %S.gen.Val, ptr %a11, i32 0, i32 1 + %t126 = getelementptr inbounds %S.ast.Type, ptr %t125, i32 0, i32 0 + %t127 = load { ptr, i64, i64 }, ptr %t126 + store { ptr, i64, i64 } %t127, ptr %a128 + store { ptr, i64, i64 } { ptr @.str.3183, i64 4, i64 0 }, ptr %a129 + %t130 = call i32 @finch_str_eq(ptr %a128, ptr %a129) + %t131 = icmp ne i32 %t130, 0 + br label %logic.from4898 +logic.from4898: + br i1 %t131, label %logic.end4900, label %logic.rhs4899 +logic.rhs4899: + %t132 = getelementptr inbounds %S.gen.Val, ptr %a11, i32 0, i32 1 + %t133 = getelementptr inbounds %S.ast.Type, ptr %t132, i32 0, i32 0 + %t134 = load { ptr, i64, i64 }, ptr %t133 + store { ptr, i64, i64 } %t134, ptr %a135 + store { ptr, i64, i64 } { ptr @.str.3184, i64 4, i64 0 }, ptr %a136 + %t137 = call i32 @finch_str_eq(ptr %a135, ptr %a136) + %t138 = icmp ne i32 %t137, 0 + br label %logic.rend4901 +logic.rend4901: + br label %logic.end4900 +logic.end4900: + %t139 = phi i1 [ true, %logic.from4898 ], [ %t138, %logic.rend4901 ] + br i1 %t139, label %then4902, label %endif4904 +then4902: + %t140 = load ptr, ptr %a1 + %t141 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t142 = load { ptr, i64, i64 }, ptr %t141 + %t143 = extractvalue { ptr, i64, i64 } %t142, 1 + %t144 = icmp uge i64 1, %t143 + br i1 %t144, label %range4905, label %inrange4906 +range4905: + call void @finch_panic_index(ptr @.str.3185, i64 2458, i64 1, i64 %t143) + unreachable +inrange4906: + %t145 = extractvalue { ptr, i64, i64 } %t142, 0 + %t146 = getelementptr inbounds %S.ast.Node, ptr %t145, i64 1 + %t147 = load %S.ast.Node, ptr %t146 + call void @finch.gen.fail(ptr %t140, %S.ast.Node %t147, { ptr, i64, i64 } { ptr @.str.3186, i64 37, i64 0 }) + br label %endif4904 +endif4904: + %t148 = getelementptr inbounds %S.gen.Val, ptr %a11, i32 0, i32 1 + %t149 = load %S.ast.Type, ptr %t148 + store %S.ast.Type %t149, ptr %a150 + call void @finch.copy.S_ast_Type(ptr %a151, ptr %a150) + %t152 = load %S.ast.Type, ptr %a151 + store %S.ast.Type %t152, ptr %a153 + %t154 = load i1, ptr %a24 + br label %logic.from4907 +logic.from4907: + br i1 %t154, label %logic.rhs4908, label %logic.end4909 +logic.rhs4908: + %t155 = load i1, ptr %a25 + br label %logic.rend4910 +logic.rend4910: + br label %logic.end4909 +logic.end4909: + %t156 = phi i1 [ false, %logic.from4907 ], [ %t155, %logic.rend4910 ] + br i1 %t156, label %then4911, label %endif4913 +then4911: + %t157 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3187, i64 5, i64 0 }) + store %S.ast.Type %t157, ptr %a153 + br label %endif4913 +endif4913: + %t158 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t159 = load %S.ast.Type, ptr %t158 + %t160 = load %S.ast.Type, ptr %a153 + %t161 = call %S.ast.Type @finch.ast.mapOf(%S.ast.Type %t159, %S.ast.Type %t160) + store %S.ast.Type %t161, ptr %a8 + store i1 true, ptr %a9 + br label %endif4860 +endif4860: + %t162 = load ptr, ptr %a1 + %t163 = load ptr, ptr %a1 + %t164 = load %S.ast.Type, ptr %a8 + %t165 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t163, %S.ast.Type %t164) + %t166 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t162, { ptr, i64, i64 } %t165) + store { ptr, i64, i64 } %t166, ptr %a167 + %t168 = load ptr, ptr %a1 + %t169 = load ptr, ptr %a1 + %t170 = load %S.ast.Type, ptr %a8 + %t171 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t169, %S.ast.Type %t170) + %t172 = load { ptr, i64, i64 }, ptr %a167 + call void @finch.gen.store(ptr %t168, { ptr, i64, i64 } %t171, { ptr, i64, i64 } { ptr @.str.3188, i64 15, i64 0 }, { ptr, i64, i64 } %t172) + %t173 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t174 = getelementptr inbounds { ptr, i64, i64 }, ptr %t173, i32 0, i32 1 + %t175 = load i64, ptr %t174 + %t176 = sdiv i64 %t175, 2 + store i64 0, ptr %a177 + br label %for.cond4914 +for.cond4914: + %t178 = load i64, ptr %a177 + %t179 = icmp slt i64 %t178, %t176 + br i1 %t179, label %for.body4915, label %for.end4917 +for.body4915: + %t180 = load %S.gen.Val, ptr %a10 + store %S.gen.Val %t180, ptr %a181 + call void @finch.copy.S_gen_Val(ptr %a182, ptr %a181) + %t183 = load %S.gen.Val, ptr %a182 + store %S.gen.Val %t183, ptr %a184 + %t185 = load %S.gen.Val, ptr %a11 + store %S.gen.Val %t185, ptr %a186 + call void @finch.copy.S_gen_Val(ptr %a187, ptr %a186) + %t188 = load %S.gen.Val, ptr %a187 + store %S.gen.Val %t188, ptr %a189 + %t190 = load i64, ptr %a177 + %t191 = icmp eq i64 %t190, 0 + br label %logic.from4918 +logic.from4918: + br i1 %t191, label %logic.rhs4919, label %logic.end4920 +logic.rhs4919: + %t192 = load i1, ptr %a9 + br label %logic.rend4921 +logic.rend4921: + br label %logic.end4920 +logic.end4920: + %t193 = phi i1 [ false, %logic.from4918 ], [ %t192, %logic.rend4921 ] + %t194 = xor i1 %t193, true + br i1 %t194, label %then4922, label %endif4924 +then4922: + %t195 = load ptr, ptr %a1 + %t196 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t197 = load i64, ptr %a177 + %t198 = mul i64 2, %t197 + %t199 = load { ptr, i64, i64 }, ptr %t196 + %t200 = extractvalue { ptr, i64, i64 } %t199, 1 + %t201 = icmp uge i64 %t198, %t200 + br i1 %t201, label %range4925, label %inrange4926 +range4925: + call void @finch_panic_index(ptr @.str.3189, i64 2473, i64 %t198, i64 %t200) + unreachable +inrange4926: + %t202 = extractvalue { ptr, i64, i64 } %t199, 0 + %t203 = getelementptr inbounds %S.ast.Node, ptr %t202, i64 %t198 + %t204 = load %S.ast.Node, ptr %t203 + %t205 = getelementptr inbounds %S.ast.Type, ptr %a8, i32 0, i32 1 + %t206 = load { ptr, i64, i64 }, ptr %t205 + %t207 = extractvalue { ptr, i64, i64 } %t206, 1 + %t208 = icmp uge i64 0, %t207 + br i1 %t208, label %range4927, label %inrange4928 +range4927: + call void @finch_panic_index(ptr @.str.3190, i64 2473, i64 0, i64 %t207) + unreachable +inrange4928: + %t209 = extractvalue { ptr, i64, i64 } %t206, 0 + %t210 = getelementptr inbounds %S.ast.Type, ptr %t209, i64 0 + %t211 = load %S.ast.Type, ptr %t210 + %t212 = call %S.gen.Val @finch.gen.exprWant(ptr %t195, %S.ast.Node %t204, %S.ast.Type %t211) + store %S.gen.Val %t212, ptr %a184 + %t213 = load ptr, ptr %a1 + %t214 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t215 = load i64, ptr %a177 + %t216 = mul i64 2, %t215 + %t217 = add i64 %t216, 1 + %t218 = load { ptr, i64, i64 }, ptr %t214 + %t219 = extractvalue { ptr, i64, i64 } %t218, 1 + %t220 = icmp uge i64 %t217, %t219 + br i1 %t220, label %range4929, label %inrange4930 +range4929: + call void @finch_panic_index(ptr @.str.3191, i64 2474, i64 %t217, i64 %t219) + unreachable +inrange4930: + %t221 = extractvalue { ptr, i64, i64 } %t218, 0 + %t222 = getelementptr inbounds %S.ast.Node, ptr %t221, i64 %t217 + %t223 = load %S.ast.Node, ptr %t222 + %t224 = getelementptr inbounds %S.ast.Type, ptr %a8, i32 0, i32 1 + %t225 = load { ptr, i64, i64 }, ptr %t224 + %t226 = extractvalue { ptr, i64, i64 } %t225, 1 + %t227 = icmp uge i64 1, %t226 + br i1 %t227, label %range4931, label %inrange4932 +range4931: + call void @finch_panic_index(ptr @.str.3192, i64 2474, i64 1, i64 %t226) + unreachable +inrange4932: + %t228 = extractvalue { ptr, i64, i64 } %t225, 0 + %t229 = getelementptr inbounds %S.ast.Type, ptr %t228, i64 1 + %t230 = load %S.ast.Type, ptr %t229 + %t231 = call %S.gen.Val @finch.gen.exprWant(ptr %t213, %S.ast.Node %t223, %S.ast.Type %t230) + store %S.gen.Val %t231, ptr %a189 + br label %endif4924 +endif4924: + %t232 = load ptr, ptr %a1 + %t233 = load %S.gen.Val, ptr %a184 + %t234 = getelementptr inbounds %S.ast.Type, ptr %a8, i32 0, i32 1 + %t235 = load { ptr, i64, i64 }, ptr %t234 + %t236 = extractvalue { ptr, i64, i64 } %t235, 1 + %t237 = icmp uge i64 0, %t236 + br i1 %t237, label %range4933, label %inrange4934 +range4933: + call void @finch_panic_index(ptr @.str.3193, i64 2476, i64 0, i64 %t236) + unreachable +inrange4934: + %t238 = extractvalue { ptr, i64, i64 } %t235, 0 + %t239 = getelementptr inbounds %S.ast.Type, ptr %t238, i64 0 + %t240 = load %S.ast.Type, ptr %t239 + %t241 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t242 = load i64, ptr %a177 + %t243 = mul i64 2, %t242 + %t244 = load { ptr, i64, i64 }, ptr %t241 + %t245 = extractvalue { ptr, i64, i64 } %t244, 1 + %t246 = icmp uge i64 %t243, %t245 + br i1 %t246, label %range4935, label %inrange4936 +range4935: + call void @finch_panic_index(ptr @.str.3194, i64 2476, i64 %t243, i64 %t245) + unreachable +inrange4936: + %t247 = extractvalue { ptr, i64, i64 } %t244, 0 + %t248 = getelementptr inbounds %S.ast.Node, ptr %t247, i64 %t243 + %t249 = load %S.ast.Node, ptr %t248 + %t250 = call %S.gen.Val @finch.gen.coerce(ptr %t232, %S.gen.Val %t233, %S.ast.Type %t240, %S.ast.Node %t249, { ptr, i64, i64 } { ptr @.str.3195, i64 21, i64 0 }) + store %S.gen.Val %t250, ptr %a184 + %t251 = load ptr, ptr %a1 + %t252 = load %S.gen.Val, ptr %a189 + %t253 = getelementptr inbounds %S.ast.Type, ptr %a8, i32 0, i32 1 + %t254 = load { ptr, i64, i64 }, ptr %t253 + %t255 = extractvalue { ptr, i64, i64 } %t254, 1 + %t256 = icmp uge i64 1, %t255 + br i1 %t256, label %range4937, label %inrange4938 +range4937: + call void @finch_panic_index(ptr @.str.3196, i64 2477, i64 1, i64 %t255) + unreachable +inrange4938: + %t257 = extractvalue { ptr, i64, i64 } %t254, 0 + %t258 = getelementptr inbounds %S.ast.Type, ptr %t257, i64 1 + %t259 = load %S.ast.Type, ptr %t258 + %t260 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t261 = load i64, ptr %a177 + %t262 = mul i64 2, %t261 + %t263 = add i64 %t262, 1 + %t264 = load { ptr, i64, i64 }, ptr %t260 + %t265 = extractvalue { ptr, i64, i64 } %t264, 1 + %t266 = icmp uge i64 %t263, %t265 + br i1 %t266, label %range4939, label %inrange4940 +range4939: + call void @finch_panic_index(ptr @.str.3197, i64 2477, i64 %t263, i64 %t265) + unreachable +inrange4940: + %t267 = extractvalue { ptr, i64, i64 } %t264, 0 + %t268 = getelementptr inbounds %S.ast.Node, ptr %t267, i64 %t263 + %t269 = load %S.ast.Node, ptr %t268 + %t270 = call %S.gen.Val @finch.gen.coerce(ptr %t251, %S.gen.Val %t252, %S.ast.Type %t259, %S.ast.Node %t269, { ptr, i64, i64 } { ptr @.str.3198, i64 23, i64 0 }) + store %S.gen.Val %t270, ptr %a189 + %t271 = load ptr, ptr %a1 + %t272 = load %S.gen.Val, ptr %a189 + %t273 = call { ptr, i64, i64 } @finch.gen.own(ptr %t271, %S.gen.Val %t272) + store { ptr, i64, i64 } %t273, ptr %a274 + %t275 = load ptr, ptr %a1 + %t276 = load { ptr, i64, i64 }, ptr %a167 + %t277 = load %S.ast.Type, ptr %a8 + %t278 = load %S.gen.Val, ptr %a184 + %t279 = load %S.ast.Node, ptr %a2 + %t280 = call { ptr, i64, i64 } @finch.gen.mapSlot(ptr %t275, { ptr, i64, i64 } %t276, %S.ast.Type %t277, %S.gen.Val %t278, i1 false, %S.ast.Node %t279) + store { ptr, i64, i64 } %t280, ptr %a281 + %t282 = load ptr, ptr %a1 + %t283 = load ptr, ptr %a1 + %t284 = getelementptr inbounds %S.ast.Type, ptr %a8, i32 0, i32 1 + %t285 = load { ptr, i64, i64 }, ptr %t284 + %t286 = extractvalue { ptr, i64, i64 } %t285, 1 + %t287 = icmp uge i64 1, %t286 + br i1 %t287, label %range4941, label %inrange4942 +range4941: + call void @finch_panic_index(ptr @.str.3199, i64 2480, i64 1, i64 %t286) + unreachable +inrange4942: + %t288 = extractvalue { ptr, i64, i64 } %t285, 0 + %t289 = getelementptr inbounds %S.ast.Type, ptr %t288, i64 1 + %t290 = load %S.ast.Type, ptr %t289 + %t291 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t283, %S.ast.Type %t290) + %t292 = load { ptr, i64, i64 }, ptr %a274 + %t293 = load ptr, ptr %a1 + %t294 = load { ptr, i64, i64 }, ptr %a281 + %t295 = load %S.ast.Type, ptr %a8 + %t296 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t293, { ptr, i64, i64 } %t294, %S.ast.Type %t295, i64 2) + call void @finch.gen.store(ptr %t282, { ptr, i64, i64 } %t291, { ptr, i64, i64 } %t292, { ptr, i64, i64 } %t296) + br label %for.step4916 +for.step4916: + %t297 = load i64, ptr %a177 + %t298 = add i64 %t297, 1 + store i64 %t298, ptr %a177 + br label %for.cond4914 +for.end4917: + %t299 = load ptr, ptr %a1 + %t300 = load ptr, ptr %a1 + %t301 = load %S.ast.Type, ptr %a8 + %t302 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t300, %S.ast.Type %t301) + %t303 = load { ptr, i64, i64 }, ptr %a167 + %t304 = call { ptr, i64, i64 } @finch.gen.load(ptr %t299, { ptr, i64, i64 } %t302, { ptr, i64, i64 } %t303) + %t305 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t304, 0 + %t306 = load %S.ast.Type, ptr %a8 + store %S.ast.Type %t306, ptr %a307 + call void @finch.copy.S_ast_Type(ptr %a308, ptr %a307) + %t309 = load %S.ast.Type, ptr %a308 + %t310 = insertvalue %S.gen.Val %t305, %S.ast.Type %t309, 1 + %t311 = insertvalue %S.gen.Val %t310, i1 true, 2 + ret %S.gen.Val %t311 +} + +define internal %S.gen.Val @finch.gen.mapMethod(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca %S.ast.Type, align 16 + %a19 = alloca %S.ast.Type, align 16 + %a21 = alloca %S.ast.Type, align 16 + %a29 = alloca %S.ast.Type, align 16 + %a30 = alloca %S.ast.Type, align 16 + %a32 = alloca %S.ast.Type, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca %S.gen.Val, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca %S.ast.Type, align 16 + %a301 = alloca %S.ast.Type, align 16 + %a309 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a330 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a335 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca i64, align 16 + %a344 = alloca %S.ast.Type, align 16 + %a345 = alloca %S.ast.Type, align 16 + %a347 = alloca %S.ast.Type, align 16 + %a349 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca %S.ast.Type, align 16 + %a355 = alloca %S.ast.Type, align 16 + %a359 = alloca %S.ast.Type, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a372 = alloca { ptr, i64, i64 }, align 16 + %a374 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca { ptr, i64, i64 }, align 16 + %a384 = alloca { ptr, i64, i64 }, align 16 + %a385 = alloca { ptr, i64, i64 }, align 16 + %a389 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a396 = alloca { ptr, i64, i64 }, align 16 + %a397 = alloca { ptr, i64, i64 }, align 16 + %a398 = alloca { ptr, i64, i64 }, align 16 + %a401 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a403 = alloca { ptr, i64, i64 }, align 16 + %a405 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a414 = alloca { ptr, i64, i64 }, align 16 + %a416 = alloca { ptr, i64, i64 }, align 16 + %a417 = alloca { ptr, i64, i64 }, align 16 + %a418 = alloca { ptr, i64, i64 }, align 16 + %a423 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a438 = alloca { ptr, i64, i64 }, align 16 + %a439 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a443 = alloca { ptr, i64, i64 }, align 16 + %a444 = alloca { ptr, i64, i64 }, align 16 + %a445 = alloca { ptr, i64, i64 }, align 16 + %a447 = alloca { ptr, i64, i64 }, align 16 + %a448 = alloca { ptr, i64, i64 }, align 16 + %a449 = alloca { ptr, i64, i64 }, align 16 + %a453 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a468 = alloca { ptr, i64, i64 }, align 16 + %a471 = alloca { ptr, i64, i64 }, align 16 + %a474 = alloca { ptr, i64, i64 }, align 16 + %a483 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca { ptr, i64, i64 }, align 16 + %a485 = alloca { ptr, i64, i64 }, align 16 + %a487 = alloca { ptr, i64, i64 }, align 16 + %a488 = alloca { ptr, i64, i64 }, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a499 = alloca { ptr, i64, i64 }, align 16 + %a505 = alloca { ptr, i64, i64 }, align 16 + %a506 = alloca { ptr, i64, i64 }, align 16 + %a507 = alloca { ptr, i64, i64 }, align 16 + %a509 = alloca { ptr, i64, i64 }, align 16 + %a510 = alloca { ptr, i64, i64 }, align 16 + %a511 = alloca { ptr, i64, i64 }, align 16 + %a514 = alloca { ptr, i64, i64 }, align 16 + %a515 = alloca { ptr, i64, i64 }, align 16 + %a516 = alloca { ptr, i64, i64 }, align 16 + %a518 = alloca { ptr, i64, i64 }, align 16 + %a519 = alloca { ptr, i64, i64 }, align 16 + %a520 = alloca { ptr, i64, i64 }, align 16 + %a523 = alloca { ptr, i64, i64 }, align 16 + %a524 = alloca { ptr, i64, i64 }, align 16 + %a525 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a538 = alloca { ptr, i64, i64 }, align 16 + %a539 = alloca { ptr, i64, i64 }, align 16 + %a541 = alloca { ptr, i64, i64 }, align 16 + %a542 = alloca { ptr, i64, i64 }, align 16 + %a543 = alloca { ptr, i64, i64 }, align 16 + %a558 = alloca %S.ast.Type, align 16 + %a559 = alloca %S.ast.Type, align 16 + %a566 = alloca { ptr, i64, i64 }, align 16 + %a567 = alloca { ptr, i64, i64 }, align 16 + %a568 = alloca { ptr, i64, i64 }, align 16 + %a570 = alloca { ptr, i64, i64 }, align 16 + %a571 = alloca { ptr, i64, i64 }, align 16 + %a572 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t6 = load { ptr, i64, i64 }, ptr %t5 + store { ptr, i64, i64 } %t6, ptr %a7 + call void @finch_str_copy(ptr %a8, ptr %a7) + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + %t11 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t12 = load { ptr, i64, i64 }, ptr %t11 + %t13 = extractvalue { ptr, i64, i64 } %t12, 1 + %t14 = icmp uge i64 0, %t13 + br i1 %t14, label %range4943, label %inrange4944 +range4943: + call void @finch_panic_index(ptr @.str.3200, i64 2487, i64 0, i64 %t13) + unreachable +inrange4944: + %t15 = extractvalue { ptr, i64, i64 } %t12, 0 + %t16 = getelementptr inbounds %S.ast.Type, ptr %t15, i64 0 + %t17 = load %S.ast.Type, ptr %t16 + store %S.ast.Type %t17, ptr %a18 + call void @finch.copy.S_ast_Type(ptr %a19, ptr %a18) + %t20 = load %S.ast.Type, ptr %a19 + store %S.ast.Type %t20, ptr %a21 + %t22 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t23 = load { ptr, i64, i64 }, ptr %t22 + %t24 = extractvalue { ptr, i64, i64 } %t23, 1 + %t25 = icmp uge i64 1, %t24 + br i1 %t25, label %range4945, label %inrange4946 +range4945: + call void @finch_panic_index(ptr @.str.3201, i64 2488, i64 1, i64 %t24) + unreachable +inrange4946: + %t26 = extractvalue { ptr, i64, i64 } %t23, 0 + %t27 = getelementptr inbounds %S.ast.Type, ptr %t26, i64 1 + %t28 = load %S.ast.Type, ptr %t27 + store %S.ast.Type %t28, ptr %a29 + call void @finch.copy.S_ast_Type(ptr %a30, ptr %a29) + %t31 = load %S.ast.Type, ptr %a30 + store %S.ast.Type %t31, ptr %a32 + %t33 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.3202, i64 3, i64 0 }, ptr %a35 + %t36 = call i32 @finch_str_eq(ptr %a34, ptr %a35) + %t37 = icmp ne i32 %t36, 0 + br label %logic.from4947 +logic.from4947: + br i1 %t37, label %logic.end4949, label %logic.rhs4948 +logic.rhs4948: + %t38 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t38, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.3203, i64 3, i64 0 }, ptr %a40 + %t41 = call i32 @finch_str_eq(ptr %a39, ptr %a40) + %t42 = icmp ne i32 %t41, 0 + br label %logic.rend4950 +logic.rend4950: + br label %logic.end4949 +logic.end4949: + %t43 = phi i1 [ true, %logic.from4947 ], [ %t42, %logic.rend4950 ] + br label %logic.from4951 +logic.from4951: + br i1 %t43, label %logic.end4953, label %logic.rhs4952 +logic.rhs4952: + %t44 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t44, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.3204, i64 6, i64 0 }, ptr %a46 + %t47 = call i32 @finch_str_eq(ptr %a45, ptr %a46) + %t48 = icmp ne i32 %t47, 0 + br label %logic.rend4954 +logic.rend4954: + br label %logic.end4953 +logic.end4953: + %t49 = phi i1 [ true, %logic.from4951 ], [ %t48, %logic.rend4954 ] + br i1 %t49, label %then4955, label %endif4957 +then4955: + %t50 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t50, ptr %a51 + store { ptr, i64, i64 } { ptr @.str.3205, i64 3, i64 0 }, ptr %a52 + %t53 = call i32 @finch_str_eq(ptr %a51, ptr %a52) + %t54 = icmp ne i32 %t53, 0 + br i1 %t54, label %then4958, label %else4959 +then4958: + %t55 = load ptr, ptr %a1 + %t56 = load %S.ast.Node, ptr %a2 + %t57 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.checkArgs(ptr %t55, %S.ast.Node %t56, i64 1, i64 2, { ptr, i64, i64 } %t57) + br label %endif4960 +else4959: + %t58 = load ptr, ptr %a1 + %t59 = load %S.ast.Node, ptr %a2 + %t60 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.checkArgs(ptr %t58, %S.ast.Node %t59, i64 1, i64 1, { ptr, i64, i64 } %t60) + br label %endif4960 +endif4960: + %t61 = load ptr, ptr %a1 + %t62 = load ptr, ptr %a1 + %t63 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t64 = load { ptr, i64, i64 }, ptr %t63 + %t65 = extractvalue { ptr, i64, i64 } %t64, 1 + %t66 = icmp uge i64 1, %t65 + br i1 %t66, label %range4961, label %inrange4962 +range4961: + call void @finch_panic_index(ptr @.str.3206, i64 2495, i64 1, i64 %t65) + unreachable +inrange4962: + %t67 = extractvalue { ptr, i64, i64 } %t64, 0 + %t68 = getelementptr inbounds %S.ast.Node, ptr %t67, i64 1 + %t69 = load %S.ast.Node, ptr %t68 + %t70 = load %S.ast.Type, ptr %a21 + %t71 = call %S.gen.Val @finch.gen.exprWant(ptr %t62, %S.ast.Node %t69, %S.ast.Type %t70) + %t72 = load %S.ast.Type, ptr %a21 + %t73 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t74 = load { ptr, i64, i64 }, ptr %t73 + %t75 = extractvalue { ptr, i64, i64 } %t74, 1 + %t76 = icmp uge i64 1, %t75 + br i1 %t76, label %range4963, label %inrange4964 +range4963: + call void @finch_panic_index(ptr @.str.3207, i64 2495, i64 1, i64 %t75) + unreachable +inrange4964: + %t77 = extractvalue { ptr, i64, i64 } %t74, 0 + %t78 = getelementptr inbounds %S.ast.Node, ptr %t77, i64 1 + %t79 = load %S.ast.Node, ptr %t78 + %t80 = call %S.gen.Val @finch.gen.coerce(ptr %t61, %S.gen.Val %t71, %S.ast.Type %t72, %S.ast.Node %t79, { ptr, i64, i64 } { ptr @.str.3208, i64 7, i64 0 }) + store %S.gen.Val %t80, ptr %a81 + %t82 = load ptr, ptr %a1 + %t83 = load { ptr, i64, i64 }, ptr %a3 + %t84 = load ptr, ptr %a1 + %t85 = load %S.gen.Val, ptr %a81 + %t86 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t84, %S.gen.Val %t85) + %t87 = load %S.ast.Type, ptr %a4 + %t88 = call { ptr, i64, i64 } @finch.gen.mapFind(ptr %t82, { ptr, i64, i64 } %t83, { ptr, i64, i64 } %t86, %S.ast.Type %t87) + store { ptr, i64, i64 } %t88, ptr %a89 + %t90 = load ptr, ptr %a1 + %t91 = load { ptr, i64, i64 }, ptr %a89 + store { ptr, i64, i64 } { ptr @.str.3209, i64 13, i64 0 }, ptr %a93 + store { ptr, i64, i64 } %t91, ptr %a94 + call void @finch_str_concat(ptr %a92, ptr %a93, ptr %a94) + %t95 = load { ptr, i64, i64 }, ptr %a92 + store { ptr, i64, i64 } %t95, ptr %a97 + store { ptr, i64, i64 } { ptr @.str.3210, i64 3, i64 0 }, ptr %a98 + call void @finch_str_concat(ptr %a96, ptr %a97, ptr %a98) + %t99 = load { ptr, i64, i64 }, ptr %a96 + %t100 = call { ptr, i64, i64 } @finch.gen.op(ptr %t90, { ptr, i64, i64 } %t99) + store { ptr, i64, i64 } %t100, ptr %a101 + %t102 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t102, ptr %a103 + store { ptr, i64, i64 } { ptr @.str.3211, i64 3, i64 0 }, ptr %a104 + %t105 = call i32 @finch_str_eq(ptr %a103, ptr %a104) + %t106 = icmp ne i32 %t105, 0 + br i1 %t106, label %then4965, label %endif4967 +then4965: + %t107 = load { ptr, i64, i64 }, ptr %a101 + store { ptr, i64, i64 } %t107, ptr %a108 + call void @finch_str_copy(ptr %a109, ptr %a108) + %t110 = load { ptr, i64, i64 }, ptr %a109 + %t111 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t110, 0 + %t112 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3212, i64 4, i64 0 }) + %t113 = insertvalue %S.gen.Val %t111, %S.ast.Type %t112, 1 + ret %S.gen.Val %t113 +endif4967: + %t114 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t114, ptr %a115 + store { ptr, i64, i64 } { ptr @.str.3213, i64 6, i64 0 }, ptr %a116 + %t117 = call i32 @finch_str_eq(ptr %a115, ptr %a116) + %t118 = icmp ne i32 %t117, 0 + br i1 %t118, label %then4968, label %endif4970 +then4968: + %t119 = load ptr, ptr %a1 + %t120 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t119, { ptr, i64, i64 } { ptr @.str.3214, i64 10, i64 0 }) + store { ptr, i64, i64 } %t120, ptr %a121 + %t122 = load ptr, ptr %a1 + %t123 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t122, { ptr, i64, i64 } { ptr @.str.3215, i64 10, i64 0 }) + store { ptr, i64, i64 } %t123, ptr %a124 + %t125 = load ptr, ptr %a1 + %t126 = load { ptr, i64, i64 }, ptr %a101 + %t127 = load { ptr, i64, i64 }, ptr %a121 + %t128 = load { ptr, i64, i64 }, ptr %a124 + call void @finch.gen.condBr(ptr %t125, { ptr, i64, i64 } %t126, { ptr, i64, i64 } %t127, { ptr, i64, i64 } %t128) + %t129 = load ptr, ptr %a1 + %t130 = load { ptr, i64, i64 }, ptr %a121 + call void @finch.gen.label(ptr %t129, { ptr, i64, i64 } %t130) + %t131 = load ptr, ptr %a1 + %t132 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.3216, i64 35, i64 0 }, ptr %a134 + store { ptr, i64, i64 } %t132, ptr %a135 + call void @finch_str_concat(ptr %a133, ptr %a134, ptr %a135) + %t136 = load { ptr, i64, i64 }, ptr %a133 + store { ptr, i64, i64 } %t136, ptr %a138 + store { ptr, i64, i64 } { ptr @.str.3217, i64 6, i64 0 }, ptr %a139 + call void @finch_str_concat(ptr %a137, ptr %a138, ptr %a139) + %t140 = load { ptr, i64, i64 }, ptr %a137 + %t141 = load { ptr, i64, i64 }, ptr %a89 + store { ptr, i64, i64 } %t140, ptr %a143 + store { ptr, i64, i64 } %t141, ptr %a144 + call void @finch_str_concat(ptr %a142, ptr %a143, ptr %a144) + %t145 = load { ptr, i64, i64 }, ptr %a142 + store { ptr, i64, i64 } %t145, ptr %a147 + store { ptr, i64, i64 } { ptr @.str.3218, i64 6, i64 0 }, ptr %a148 + call void @finch_str_concat(ptr %a146, ptr %a147, ptr %a148) + %t149 = load { ptr, i64, i64 }, ptr %a146 + %t150 = load ptr, ptr %a1 + %t151 = load %S.ast.Type, ptr %a4 + %t152 = call { ptr, i64, i64 } @finch.gen.entrySize(ptr %t150, %S.ast.Type %t151) + store { ptr, i64, i64 } %t149, ptr %a154 + store { ptr, i64, i64 } %t152, ptr %a155 + call void @finch_str_concat(ptr %a153, ptr %a154, ptr %a155) + %t156 = load { ptr, i64, i64 }, ptr %a153 + store { ptr, i64, i64 } %t156, ptr %a158 + store { ptr, i64, i64 } { ptr @.str.3219, i64 1, i64 0 }, ptr %a159 + call void @finch_str_concat(ptr %a157, ptr %a158, ptr %a159) + %t160 = load { ptr, i64, i64 }, ptr %a157 + call void @finch.gen.emit(ptr %t131, { ptr, i64, i64 } %t160) + %t161 = load ptr, ptr %a1 + %t162 = load { ptr, i64, i64 }, ptr %a124 + call void @finch.gen.br(ptr %t161, { ptr, i64, i64 } %t162) + %t163 = load ptr, ptr %a1 + %t164 = load { ptr, i64, i64 }, ptr %a124 + call void @finch.gen.label(ptr %t163, { ptr, i64, i64 } %t164) + %t165 = load { ptr, i64, i64 }, ptr %a101 + store { ptr, i64, i64 } %t165, ptr %a166 + call void @finch_str_copy(ptr %a167, ptr %a166) + %t168 = load { ptr, i64, i64 }, ptr %a167 + %t169 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t168, 0 + %t170 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3220, i64 4, i64 0 }) + %t171 = insertvalue %S.gen.Val %t169, %S.ast.Type %t170, 1 + ret %S.gen.Val %t171 +endif4970: + %t172 = load ptr, ptr %a1 + %t173 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t172, { ptr, i64, i64 } { ptr @.str.3221, i64 9, i64 0 }) + store { ptr, i64, i64 } %t173, ptr %a174 + %t175 = load ptr, ptr %a1 + %t176 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t175, { ptr, i64, i64 } { ptr @.str.3222, i64 11, i64 0 }) + store { ptr, i64, i64 } %t176, ptr %a177 + %t178 = load ptr, ptr %a1 + %t179 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t178, { ptr, i64, i64 } { ptr @.str.3223, i64 8, i64 0 }) + store { ptr, i64, i64 } %t179, ptr %a180 + %t181 = load ptr, ptr %a1 + %t182 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t181, { ptr, i64, i64 } { ptr @.str.3224, i64 8, i64 0 }) + store { ptr, i64, i64 } %t182, ptr %a183 + %t184 = load ptr, ptr %a1 + %t185 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t184, { ptr, i64, i64 } { ptr @.str.3225, i64 7, i64 0 }) + store { ptr, i64, i64 } %t185, ptr %a186 + %t187 = load ptr, ptr %a1 + %t188 = load { ptr, i64, i64 }, ptr %a101 + %t189 = load { ptr, i64, i64 }, ptr %a174 + %t190 = load { ptr, i64, i64 }, ptr %a177 + call void @finch.gen.condBr(ptr %t187, { ptr, i64, i64 } %t188, { ptr, i64, i64 } %t189, { ptr, i64, i64 } %t190) + %t191 = load ptr, ptr %a1 + %t192 = load { ptr, i64, i64 }, ptr %a174 + call void @finch.gen.label(ptr %t191, { ptr, i64, i64 } %t192) + %t193 = load ptr, ptr %a1 + %t194 = load ptr, ptr %a1 + %t195 = load ptr, ptr %a1 + %t196 = load %S.ast.Type, ptr %a32 + %t197 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t195, %S.ast.Type %t196) + %t198 = load ptr, ptr %a1 + %t199 = load ptr, ptr %a1 + %t200 = load { ptr, i64, i64 }, ptr %a3 + %t201 = load %S.ast.Type, ptr %a4 + %t202 = load { ptr, i64, i64 }, ptr %a89 + %t203 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t199, { ptr, i64, i64 } %t200, %S.ast.Type %t201, { ptr, i64, i64 } %t202) + %t204 = load %S.ast.Type, ptr %a4 + %t205 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t198, { ptr, i64, i64 } %t203, %S.ast.Type %t204, i64 2) + %t206 = call { ptr, i64, i64 } @finch.gen.load(ptr %t194, { ptr, i64, i64 } %t197, { ptr, i64, i64 } %t205) + %t207 = load %S.ast.Type, ptr %a32 + %t208 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t193, { ptr, i64, i64 } %t206, %S.ast.Type %t207) + store { ptr, i64, i64 } %t208, ptr %a209 + %t210 = load ptr, ptr %a1 + %t211 = load { ptr, i64, i64 }, ptr %a180 + call void @finch.gen.br(ptr %t210, { ptr, i64, i64 } %t211) + %t212 = load ptr, ptr %a1 + %t213 = load { ptr, i64, i64 }, ptr %a180 + call void @finch.gen.label(ptr %t212, { ptr, i64, i64 } %t213) + %t214 = load ptr, ptr %a1 + %t215 = load { ptr, i64, i64 }, ptr %a186 + call void @finch.gen.br(ptr %t214, { ptr, i64, i64 } %t215) + %t216 = load ptr, ptr %a1 + %t217 = load { ptr, i64, i64 }, ptr %a177 + call void @finch.gen.label(ptr %t216, { ptr, i64, i64 } %t217) + %t218 = load ptr, ptr %a1 + %t219 = load ptr, ptr %a1 + %t220 = load ptr, ptr %a1 + %t221 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t222 = load { ptr, i64, i64 }, ptr %t221 + %t223 = extractvalue { ptr, i64, i64 } %t222, 1 + %t224 = icmp uge i64 2, %t223 + br i1 %t224, label %range4971, label %inrange4972 +range4971: + call void @finch_panic_index(ptr @.str.3226, i64 2524, i64 2, i64 %t223) + unreachable +inrange4972: + %t225 = extractvalue { ptr, i64, i64 } %t222, 0 + %t226 = getelementptr inbounds %S.ast.Node, ptr %t225, i64 2 + %t227 = load %S.ast.Node, ptr %t226 + %t228 = load %S.ast.Type, ptr %a32 + %t229 = call %S.gen.Val @finch.gen.exprWant(ptr %t220, %S.ast.Node %t227, %S.ast.Type %t228) + %t230 = load %S.ast.Type, ptr %a32 + %t231 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t232 = load { ptr, i64, i64 }, ptr %t231 + %t233 = extractvalue { ptr, i64, i64 } %t232, 1 + %t234 = icmp uge i64 2, %t233 + br i1 %t234, label %range4973, label %inrange4974 +range4973: + call void @finch_panic_index(ptr @.str.3227, i64 2524, i64 2, i64 %t233) + unreachable +inrange4974: + %t235 = extractvalue { ptr, i64, i64 } %t232, 0 + %t236 = getelementptr inbounds %S.ast.Node, ptr %t235, i64 2 + %t237 = load %S.ast.Node, ptr %t236 + %t238 = call %S.gen.Val @finch.gen.coerce(ptr %t219, %S.gen.Val %t229, %S.ast.Type %t230, %S.ast.Node %t237, { ptr, i64, i64 } { ptr @.str.3228, i64 11, i64 0 }) + %t239 = call { ptr, i64, i64 } @finch.gen.own(ptr %t218, %S.gen.Val %t238) + store { ptr, i64, i64 } %t239, ptr %a240 + %t241 = load ptr, ptr %a1 + %t242 = load { ptr, i64, i64 }, ptr %a183 + call void @finch.gen.br(ptr %t241, { ptr, i64, i64 } %t242) + %t243 = load ptr, ptr %a1 + %t244 = load { ptr, i64, i64 }, ptr %a183 + call void @finch.gen.label(ptr %t243, { ptr, i64, i64 } %t244) + %t245 = load ptr, ptr %a1 + %t246 = load { ptr, i64, i64 }, ptr %a186 + call void @finch.gen.br(ptr %t245, { ptr, i64, i64 } %t246) + %t247 = load ptr, ptr %a1 + %t248 = load { ptr, i64, i64 }, ptr %a186 + call void @finch.gen.label(ptr %t247, { ptr, i64, i64 } %t248) + %t249 = load ptr, ptr %a1 + %t250 = load ptr, ptr %a1 + %t251 = load %S.ast.Type, ptr %a32 + %t252 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t250, %S.ast.Type %t251) + store { ptr, i64, i64 } { ptr @.str.3229, i64 4, i64 0 }, ptr %a254 + store { ptr, i64, i64 } %t252, ptr %a255 + call void @finch_str_concat(ptr %a253, ptr %a254, ptr %a255) + %t256 = load { ptr, i64, i64 }, ptr %a253 + store { ptr, i64, i64 } %t256, ptr %a258 + store { ptr, i64, i64 } { ptr @.str.3230, i64 3, i64 0 }, ptr %a259 + call void @finch_str_concat(ptr %a257, ptr %a258, ptr %a259) + %t260 = load { ptr, i64, i64 }, ptr %a257 + %t261 = load { ptr, i64, i64 }, ptr %a209 + store { ptr, i64, i64 } %t260, ptr %a263 + store { ptr, i64, i64 } %t261, ptr %a264 + call void @finch_str_concat(ptr %a262, ptr %a263, ptr %a264) + %t265 = load { ptr, i64, i64 }, ptr %a262 + store { ptr, i64, i64 } %t265, ptr %a267 + store { ptr, i64, i64 } { ptr @.str.3231, i64 3, i64 0 }, ptr %a268 + call void @finch_str_concat(ptr %a266, ptr %a267, ptr %a268) + %t269 = load { ptr, i64, i64 }, ptr %a266 + %t270 = load { ptr, i64, i64 }, ptr %a180 + store { ptr, i64, i64 } %t269, ptr %a272 + store { ptr, i64, i64 } %t270, ptr %a273 + call void @finch_str_concat(ptr %a271, ptr %a272, ptr %a273) + %t274 = load { ptr, i64, i64 }, ptr %a271 + store { ptr, i64, i64 } %t274, ptr %a276 + store { ptr, i64, i64 } { ptr @.str.3232, i64 6, i64 0 }, ptr %a277 + call void @finch_str_concat(ptr %a275, ptr %a276, ptr %a277) + %t278 = load { ptr, i64, i64 }, ptr %a275 + %t279 = load { ptr, i64, i64 }, ptr %a240 + store { ptr, i64, i64 } %t278, ptr %a281 + store { ptr, i64, i64 } %t279, ptr %a282 + call void @finch_str_concat(ptr %a280, ptr %a281, ptr %a282) + %t283 = load { ptr, i64, i64 }, ptr %a280 + store { ptr, i64, i64 } %t283, ptr %a285 + store { ptr, i64, i64 } { ptr @.str.3233, i64 3, i64 0 }, ptr %a286 + call void @finch_str_concat(ptr %a284, ptr %a285, ptr %a286) + %t287 = load { ptr, i64, i64 }, ptr %a284 + %t288 = load { ptr, i64, i64 }, ptr %a183 + store { ptr, i64, i64 } %t287, ptr %a290 + store { ptr, i64, i64 } %t288, ptr %a291 + call void @finch_str_concat(ptr %a289, ptr %a290, ptr %a291) + %t292 = load { ptr, i64, i64 }, ptr %a289 + store { ptr, i64, i64 } %t292, ptr %a294 + store { ptr, i64, i64 } { ptr @.str.3234, i64 2, i64 0 }, ptr %a295 + call void @finch_str_concat(ptr %a293, ptr %a294, ptr %a295) + %t296 = load { ptr, i64, i64 }, ptr %a293 + %t297 = call { ptr, i64, i64 } @finch.gen.op(ptr %t249, { ptr, i64, i64 } %t296) + %t298 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t297, 0 + %t299 = load %S.ast.Type, ptr %a32 + store %S.ast.Type %t299, ptr %a300 + call void @finch.copy.S_ast_Type(ptr %a301, ptr %a300) + %t302 = load %S.ast.Type, ptr %a301 + %t303 = insertvalue %S.gen.Val %t298, %S.ast.Type %t302, 1 + %t304 = load ptr, ptr %a1 + %t305 = load %S.ast.Type, ptr %a32 + %t306 = call i1 @finch.gen.owning(ptr %t304, %S.ast.Type %t305) + %t307 = insertvalue %S.gen.Val %t303, i1 %t306, 2 + ret %S.gen.Val %t307 +endif4957: + %t308 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t308, ptr %a309 + store { ptr, i64, i64 } { ptr @.str.3235, i64 5, i64 0 }, ptr %a310 + %t311 = call i32 @finch_str_eq(ptr %a309, ptr %a310) + %t312 = icmp ne i32 %t311, 0 + br i1 %t312, label %then4975, label %endif4977 +then4975: + %t313 = load ptr, ptr %a1 + %t314 = load %S.ast.Node, ptr %a2 + %t315 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.checkArgs(ptr %t313, %S.ast.Node %t314, i64 1, i64 0, { ptr, i64, i64 } %t315) + %t316 = load ptr, ptr %a1 + %t317 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.3236, i64 31, i64 0 }, ptr %a319 + store { ptr, i64, i64 } %t317, ptr %a320 + call void @finch_str_concat(ptr %a318, ptr %a319, ptr %a320) + %t321 = load { ptr, i64, i64 }, ptr %a318 + store { ptr, i64, i64 } %t321, ptr %a323 + store { ptr, i64, i64 } { ptr @.str.3237, i64 1, i64 0 }, ptr %a324 + call void @finch_str_concat(ptr %a322, ptr %a323, ptr %a324) + %t325 = load { ptr, i64, i64 }, ptr %a322 + call void @finch.gen.emit(ptr %t316, { ptr, i64, i64 } %t325) + %t326 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3238, i64 4, i64 0 }) + %t327 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t326, 1 + ret %S.gen.Val %t327 +endif4977: + %t328 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t328, ptr %a329 + store { ptr, i64, i64 } { ptr @.str.3239, i64 4, i64 0 }, ptr %a330 + %t331 = call i32 @finch_str_eq(ptr %a329, ptr %a330) + %t332 = icmp ne i32 %t331, 0 + br label %logic.from4978 +logic.from4978: + br i1 %t332, label %logic.end4980, label %logic.rhs4979 +logic.rhs4979: + %t333 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t333, ptr %a334 + store { ptr, i64, i64 } { ptr @.str.3240, i64 6, i64 0 }, ptr %a335 + %t336 = call i32 @finch_str_eq(ptr %a334, ptr %a335) + %t337 = icmp ne i32 %t336, 0 + br label %logic.rend4981 +logic.rend4981: + br label %logic.end4980 +logic.end4980: + %t338 = phi i1 [ true, %logic.from4978 ], [ %t337, %logic.rend4981 ] + br i1 %t338, label %then4982, label %endif4984 +then4982: + %t339 = load ptr, ptr %a1 + %t340 = load %S.ast.Node, ptr %a2 + %t341 = load { ptr, i64, i64 }, ptr %a10 + call void @finch.gen.checkArgs(ptr %t339, %S.ast.Node %t340, i64 1, i64 0, { ptr, i64, i64 } %t341) + store i64 1, ptr %a342 + %t343 = load %S.ast.Type, ptr %a21 + store %S.ast.Type %t343, ptr %a344 + call void @finch.copy.S_ast_Type(ptr %a345, ptr %a344) + %t346 = load %S.ast.Type, ptr %a345 + store %S.ast.Type %t346, ptr %a347 + %t348 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t348, ptr %a349 + store { ptr, i64, i64 } { ptr @.str.3241, i64 6, i64 0 }, ptr %a350 + %t351 = call i32 @finch_str_eq(ptr %a349, ptr %a350) + %t352 = icmp ne i32 %t351, 0 + br i1 %t352, label %then4985, label %endif4987 +then4985: + store i64 2, ptr %a342 + %t353 = load %S.ast.Type, ptr %a32 + store %S.ast.Type %t353, ptr %a354 + call void @finch.copy.S_ast_Type(ptr %a355, ptr %a354) + %t356 = load %S.ast.Type, ptr %a355 + store %S.ast.Type %t356, ptr %a347 + br label %endif4987 +endif4987: + %t357 = load %S.ast.Type, ptr %a347 + %t358 = call %S.ast.Type @finch.ast.arrayOf(%S.ast.Type %t357) + store %S.ast.Type %t358, ptr %a359 + %t360 = load ptr, ptr %a1 + %t361 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t360, { ptr, i64, i64 } { ptr @.str.3242, i64 17, i64 0 }) + store { ptr, i64, i64 } %t361, ptr %a362 + %t363 = load ptr, ptr %a1 + %t364 = load { ptr, i64, i64 }, ptr %a362 + call void @finch.gen.store(ptr %t363, { ptr, i64, i64 } { ptr @.str.3243, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.3244, i64 15, i64 0 }, { ptr, i64, i64 } %t364) + %t365 = load ptr, ptr %a1 + %t366 = load ptr, ptr %a1 + %t367 = load ptr, ptr %a1 + %t368 = load %S.ast.Type, ptr %a4 + %t369 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t367, %S.ast.Type %t368) + store { ptr, i64, i64 } { ptr @.str.3246, i64 23, i64 0 }, ptr %a371 + store { ptr, i64, i64 } %t369, ptr %a372 + call void @finch_str_concat(ptr %a370, ptr %a371, ptr %a372) + %t373 = load { ptr, i64, i64 }, ptr %a370 + store { ptr, i64, i64 } %t373, ptr %a375 + store { ptr, i64, i64 } { ptr @.str.3247, i64 6, i64 0 }, ptr %a376 + call void @finch_str_concat(ptr %a374, ptr %a375, ptr %a376) + %t377 = load { ptr, i64, i64 }, ptr %a374 + %t378 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t377, ptr %a380 + store { ptr, i64, i64 } %t378, ptr %a381 + call void @finch_str_concat(ptr %a379, ptr %a380, ptr %a381) + %t382 = load { ptr, i64, i64 }, ptr %a379 + store { ptr, i64, i64 } %t382, ptr %a384 + store { ptr, i64, i64 } { ptr @.str.3248, i64 14, i64 0 }, ptr %a385 + call void @finch_str_concat(ptr %a383, ptr %a384, ptr %a385) + %t386 = load { ptr, i64, i64 }, ptr %a383 + %t387 = call { ptr, i64, i64 } @finch.gen.op(ptr %t366, { ptr, i64, i64 } %t386) + %t388 = call { ptr, i64, i64 } @finch.gen.load(ptr %t365, { ptr, i64, i64 } { ptr @.str.3245, i64 3, i64 0 }, { ptr, i64, i64 } %t387) + store { ptr, i64, i64 } %t388, ptr %a389 + %t390 = load ptr, ptr %a1 + %t391 = load { ptr, i64, i64 }, ptr %a362 + store { ptr, i64, i64 } { ptr @.str.3249, i64 30, i64 0 }, ptr %a393 + store { ptr, i64, i64 } %t391, ptr %a394 + call void @finch_str_concat(ptr %a392, ptr %a393, ptr %a394) + %t395 = load { ptr, i64, i64 }, ptr %a392 + store { ptr, i64, i64 } %t395, ptr %a397 + store { ptr, i64, i64 } { ptr @.str.3250, i64 6, i64 0 }, ptr %a398 + call void @finch_str_concat(ptr %a396, ptr %a397, ptr %a398) + %t399 = load { ptr, i64, i64 }, ptr %a396 + %t400 = load { ptr, i64, i64 }, ptr %a389 + store { ptr, i64, i64 } %t399, ptr %a402 + store { ptr, i64, i64 } %t400, ptr %a403 + call void @finch_str_concat(ptr %a401, ptr %a402, ptr %a403) + %t404 = load { ptr, i64, i64 }, ptr %a401 + store { ptr, i64, i64 } %t404, ptr %a406 + store { ptr, i64, i64 } { ptr @.str.3251, i64 6, i64 0 }, ptr %a407 + call void @finch_str_concat(ptr %a405, ptr %a406, ptr %a407) + %t408 = load { ptr, i64, i64 }, ptr %a405 + %t409 = load ptr, ptr %a1 + %t410 = load %S.ast.Type, ptr %a347 + %t411 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t409, %S.ast.Type %t410) + store { ptr, i64, i64 } %t408, ptr %a413 + store { ptr, i64, i64 } %t411, ptr %a414 + call void @finch_str_concat(ptr %a412, ptr %a413, ptr %a414) + %t415 = load { ptr, i64, i64 }, ptr %a412 + store { ptr, i64, i64 } %t415, ptr %a417 + store { ptr, i64, i64 } { ptr @.str.3252, i64 1, i64 0 }, ptr %a418 + call void @finch_str_concat(ptr %a416, ptr %a417, ptr %a418) + %t419 = load { ptr, i64, i64 }, ptr %a416 + call void @finch.gen.emit(ptr %t390, { ptr, i64, i64 } %t419) + %t420 = load ptr, ptr %a1 + %t421 = load { ptr, i64, i64 }, ptr %a362 + %t422 = call { ptr, i64, i64 } @finch.gen.load(ptr %t420, { ptr, i64, i64 } { ptr @.str.3253, i64 3, i64 0 }, { ptr, i64, i64 } %t421) + store { ptr, i64, i64 } %t422, ptr %a423 + %t424 = load ptr, ptr %a1 + %t425 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t424, { ptr, i64, i64 } { ptr @.str.3254, i64 3, i64 0 }) + store { ptr, i64, i64 } %t425, ptr %a426 + %t427 = load ptr, ptr %a1 + %t428 = load { ptr, i64, i64 }, ptr %a426 + call void @finch.gen.store(ptr %t427, { ptr, i64, i64 } { ptr @.str.3255, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.3256, i64 1, i64 0 }, { ptr, i64, i64 } %t428) + %t429 = load ptr, ptr %a1 + %t430 = load ptr, ptr %a1 + %t431 = load ptr, ptr %a1 + %t432 = load %S.ast.Type, ptr %a4 + %t433 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t431, %S.ast.Type %t432) + store { ptr, i64, i64 } { ptr @.str.3258, i64 23, i64 0 }, ptr %a435 + store { ptr, i64, i64 } %t433, ptr %a436 + call void @finch_str_concat(ptr %a434, ptr %a435, ptr %a436) + %t437 = load { ptr, i64, i64 }, ptr %a434 + store { ptr, i64, i64 } %t437, ptr %a439 + store { ptr, i64, i64 } { ptr @.str.3259, i64 6, i64 0 }, ptr %a440 + call void @finch_str_concat(ptr %a438, ptr %a439, ptr %a440) + %t441 = load { ptr, i64, i64 }, ptr %a438 + %t442 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t441, ptr %a444 + store { ptr, i64, i64 } %t442, ptr %a445 + call void @finch_str_concat(ptr %a443, ptr %a444, ptr %a445) + %t446 = load { ptr, i64, i64 }, ptr %a443 + store { ptr, i64, i64 } %t446, ptr %a448 + store { ptr, i64, i64 } { ptr @.str.3260, i64 14, i64 0 }, ptr %a449 + call void @finch_str_concat(ptr %a447, ptr %a448, ptr %a449) + %t450 = load { ptr, i64, i64 }, ptr %a447 + %t451 = call { ptr, i64, i64 } @finch.gen.op(ptr %t430, { ptr, i64, i64 } %t450) + %t452 = call { ptr, i64, i64 } @finch.gen.load(ptr %t429, { ptr, i64, i64 } { ptr @.str.3257, i64 3, i64 0 }, { ptr, i64, i64 } %t451) + store { ptr, i64, i64 } %t452, ptr %a453 + %t454 = load ptr, ptr %a1 + %t455 = load { ptr, i64, i64 }, ptr %a453 + %t456 = call { ptr, i64, i64 } @finch.gen.loopStart(ptr %t454, { ptr, i64, i64 } %t455) + store { ptr, i64, i64 } %t456, ptr %a457 + %t458 = load ptr, ptr %a1 + %t459 = load { ptr, i64, i64 }, ptr %a3 + %t460 = load %S.ast.Type, ptr %a4 + %t461 = load { ptr, i64, i64 }, ptr %a457 + %t462 = extractvalue { ptr, i64, i64 } %t461, 1 + %t463 = icmp uge i64 3, %t462 + br i1 %t463, label %range4988, label %inrange4989 +range4988: + call void @finch_panic_index(ptr @.str.3261, i64 2554, i64 3, i64 %t462) + unreachable +inrange4989: + %t464 = extractvalue { ptr, i64, i64 } %t461, 0 + %t465 = getelementptr inbounds { ptr, i64, i64 }, ptr %t464, i64 3 + %t466 = load { ptr, i64, i64 }, ptr %t465 + %t467 = call { ptr, i64, i64 } @finch.gen.entryAt(ptr %t458, { ptr, i64, i64 } %t459, %S.ast.Type %t460, { ptr, i64, i64 } %t466) + store { ptr, i64, i64 } %t467, ptr %a468 + %t469 = load ptr, ptr %a1 + %t470 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t469, { ptr, i64, i64 } { ptr @.str.3262, i64 10, i64 0 }) + store { ptr, i64, i64 } %t470, ptr %a471 + %t472 = load ptr, ptr %a1 + %t473 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t472, { ptr, i64, i64 } { ptr @.str.3263, i64 10, i64 0 }) + store { ptr, i64, i64 } %t473, ptr %a474 + %t475 = load ptr, ptr %a1 + %t476 = load ptr, ptr %a1 + %t477 = load ptr, ptr %a1 + %t478 = load ptr, ptr %a1 + %t479 = load { ptr, i64, i64 }, ptr %a468 + %t480 = load %S.ast.Type, ptr %a4 + %t481 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t478, { ptr, i64, i64 } %t479, %S.ast.Type %t480, i64 0) + %t482 = call { ptr, i64, i64 } @finch.gen.load(ptr %t477, { ptr, i64, i64 } { ptr @.str.3265, i64 3, i64 0 }, { ptr, i64, i64 } %t481) + store { ptr, i64, i64 } { ptr @.str.3264, i64 12, i64 0 }, ptr %a484 + store { ptr, i64, i64 } %t482, ptr %a485 + call void @finch_str_concat(ptr %a483, ptr %a484, ptr %a485) + %t486 = load { ptr, i64, i64 }, ptr %a483 + store { ptr, i64, i64 } %t486, ptr %a488 + store { ptr, i64, i64 } { ptr @.str.3266, i64 3, i64 0 }, ptr %a489 + call void @finch_str_concat(ptr %a487, ptr %a488, ptr %a489) + %t490 = load { ptr, i64, i64 }, ptr %a487 + %t491 = call { ptr, i64, i64 } @finch.gen.op(ptr %t476, { ptr, i64, i64 } %t490) + %t492 = load { ptr, i64, i64 }, ptr %a471 + %t493 = load { ptr, i64, i64 }, ptr %a474 + call void @finch.gen.condBr(ptr %t475, { ptr, i64, i64 } %t491, { ptr, i64, i64 } %t492, { ptr, i64, i64 } %t493) + %t494 = load ptr, ptr %a1 + %t495 = load { ptr, i64, i64 }, ptr %a471 + call void @finch.gen.label(ptr %t494, { ptr, i64, i64 } %t495) + %t496 = load ptr, ptr %a1 + %t497 = load { ptr, i64, i64 }, ptr %a426 + %t498 = call { ptr, i64, i64 } @finch.gen.load(ptr %t496, { ptr, i64, i64 } { ptr @.str.3267, i64 3, i64 0 }, { ptr, i64, i64 } %t497) + store { ptr, i64, i64 } %t498, ptr %a499 + %t500 = load ptr, ptr %a1 + %t501 = load ptr, ptr %a1 + %t502 = load ptr, ptr %a1 + %t503 = load %S.ast.Type, ptr %a347 + %t504 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t502, %S.ast.Type %t503) + store { ptr, i64, i64 } { ptr @.str.3268, i64 23, i64 0 }, ptr %a506 + store { ptr, i64, i64 } %t504, ptr %a507 + call void @finch_str_concat(ptr %a505, ptr %a506, ptr %a507) + %t508 = load { ptr, i64, i64 }, ptr %a505 + store { ptr, i64, i64 } %t508, ptr %a510 + store { ptr, i64, i64 } { ptr @.str.3269, i64 6, i64 0 }, ptr %a511 + call void @finch_str_concat(ptr %a509, ptr %a510, ptr %a511) + %t512 = load { ptr, i64, i64 }, ptr %a509 + %t513 = load { ptr, i64, i64 }, ptr %a423 + store { ptr, i64, i64 } %t512, ptr %a515 + store { ptr, i64, i64 } %t513, ptr %a516 + call void @finch_str_concat(ptr %a514, ptr %a515, ptr %a516) + %t517 = load { ptr, i64, i64 }, ptr %a514 + store { ptr, i64, i64 } %t517, ptr %a519 + store { ptr, i64, i64 } { ptr @.str.3270, i64 6, i64 0 }, ptr %a520 + call void @finch_str_concat(ptr %a518, ptr %a519, ptr %a520) + %t521 = load { ptr, i64, i64 }, ptr %a518 + %t522 = load { ptr, i64, i64 }, ptr %a499 + store { ptr, i64, i64 } %t521, ptr %a524 + store { ptr, i64, i64 } %t522, ptr %a525 + call void @finch_str_concat(ptr %a523, ptr %a524, ptr %a525) + %t526 = load { ptr, i64, i64 }, ptr %a523 + %t527 = call { ptr, i64, i64 } @finch.gen.op(ptr %t501, { ptr, i64, i64 } %t526) + %t528 = load ptr, ptr %a1 + %t529 = load { ptr, i64, i64 }, ptr %a468 + %t530 = load %S.ast.Type, ptr %a4 + %t531 = load i64, ptr %a342 + %t532 = call { ptr, i64, i64 } @finch.gen.entryField(ptr %t528, { ptr, i64, i64 } %t529, %S.ast.Type %t530, i64 %t531) + %t533 = load %S.ast.Type, ptr %a347 + call void @finch.gen.copyAt(ptr %t500, { ptr, i64, i64 } %t527, { ptr, i64, i64 } %t532, %S.ast.Type %t533) + %t534 = load ptr, ptr %a1 + %t535 = load ptr, ptr %a1 + %t536 = load { ptr, i64, i64 }, ptr %a499 + store { ptr, i64, i64 } { ptr @.str.3272, i64 8, i64 0 }, ptr %a538 + store { ptr, i64, i64 } %t536, ptr %a539 + call void @finch_str_concat(ptr %a537, ptr %a538, ptr %a539) + %t540 = load { ptr, i64, i64 }, ptr %a537 + store { ptr, i64, i64 } %t540, ptr %a542 + store { ptr, i64, i64 } { ptr @.str.3273, i64 3, i64 0 }, ptr %a543 + call void @finch_str_concat(ptr %a541, ptr %a542, ptr %a543) + %t544 = load { ptr, i64, i64 }, ptr %a541 + %t545 = call { ptr, i64, i64 } @finch.gen.op(ptr %t535, { ptr, i64, i64 } %t544) + %t546 = load { ptr, i64, i64 }, ptr %a426 + call void @finch.gen.store(ptr %t534, { ptr, i64, i64 } { ptr @.str.3271, i64 3, i64 0 }, { ptr, i64, i64 } %t545, { ptr, i64, i64 } %t546) + %t547 = load ptr, ptr %a1 + %t548 = load { ptr, i64, i64 }, ptr %a474 + call void @finch.gen.br(ptr %t547, { ptr, i64, i64 } %t548) + %t549 = load ptr, ptr %a1 + %t550 = load { ptr, i64, i64 }, ptr %a474 + call void @finch.gen.label(ptr %t549, { ptr, i64, i64 } %t550) + %t551 = load ptr, ptr %a1 + %t552 = load { ptr, i64, i64 }, ptr %a457 + call void @finch.gen.loopEnd(ptr %t551, { ptr, i64, i64 } %t552) + %t553 = load ptr, ptr %a1 + %t554 = load { ptr, i64, i64 }, ptr %a362 + %t555 = call { ptr, i64, i64 } @finch.gen.load(ptr %t553, { ptr, i64, i64 } { ptr @.str.3274, i64 17, i64 0 }, { ptr, i64, i64 } %t554) + %t556 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t555, 0 + %t557 = load %S.ast.Type, ptr %a359 + store %S.ast.Type %t557, ptr %a558 + call void @finch.copy.S_ast_Type(ptr %a559, ptr %a558) + %t560 = load %S.ast.Type, ptr %a559 + %t561 = insertvalue %S.gen.Val %t556, %S.ast.Type %t560, 1 + %t562 = insertvalue %S.gen.Val %t561, i1 true, 2 + ret %S.gen.Val %t562 +endif4984: + %t563 = load ptr, ptr %a1 + %t564 = load %S.ast.Node, ptr %a2 + %t565 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.3275, i64 21, i64 0 }, ptr %a567 + store { ptr, i64, i64 } %t565, ptr %a568 + call void @finch_str_concat(ptr %a566, ptr %a567, ptr %a568) + %t569 = load { ptr, i64, i64 }, ptr %a566 + store { ptr, i64, i64 } %t569, ptr %a571 + store { ptr, i64, i64 } { ptr @.str.3276, i64 49, i64 0 }, ptr %a572 + call void @finch_str_concat(ptr %a570, ptr %a571, ptr %a572) + %t573 = load { ptr, i64, i64 }, ptr %a570 + call void @finch.gen.fail(ptr %t563, %S.ast.Node %t564, { ptr, i64, i64 } %t573) + ret %S.gen.Val zeroinitializer +} + +define internal %S.gen.Val @finch.gen.patternValue(ptr %p0, %S.ast.Node %p1, %S.ast.Type %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca %S.gen.EnumDef, align 16 + %a39 = alloca %S.gen.EnumDef, align 16 + %a41 = alloca %S.gen.EnumDef, align 16 + %a46 = alloca i64, align 16 + %a49 = alloca i64, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca i64, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca %S.ast.Type, align 16 + %a111 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.3277, i64 4, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br label %logic.from4990 +logic.from4990: + br i1 %t9, label %logic.rhs4991, label %logic.end4992 +logic.rhs4991: + %t10 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t11 = load { ptr, i64, i64 }, ptr %t10 + store { ptr, i64, i64 } %t11, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.3278, i64 3, i64 0 }, ptr %a13 + %t14 = call i32 @finch_str_eq(ptr %a12, ptr %a13) + %t15 = icmp ne i32 %t14, 0 + br label %logic.rend4993 +logic.rend4993: + br label %logic.end4992 +logic.end4992: + %t16 = phi i1 [ false, %logic.from4990 ], [ %t15, %logic.rend4993 ] + br label %logic.from4994 +logic.from4994: + br i1 %t16, label %logic.rhs4995, label %logic.end4996 +logic.rhs4995: + %t17 = load ptr, ptr %a1 + %t18 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t19 = load { ptr, i64, i64 }, ptr %t18 + %t20 = call i64 @finch.gen.lookup(ptr %t17, { ptr, i64, i64 } %t19) + %t21 = icmp slt i64 %t20, 0 + br label %logic.rend4997 +logic.rend4997: + br label %logic.end4996 +logic.end4996: + %t22 = phi i1 [ false, %logic.from4994 ], [ %t21, %logic.rend4997 ] + br i1 %t22, label %then4998, label %endif5000 +then4998: + %t23 = load ptr, ptr %a1 + %t24 = icmp eq ptr %t23, null + br i1 %t24, label %panic5001, label %ok5002 +panic5001: + call void @finch_panic(ptr @.str.3279, i64 2576, ptr @.str.3280) + unreachable +ok5002: + %t25 = getelementptr inbounds %S.gen.Gen, ptr %t23, i32 0, i32 20 + %t26 = load ptr, ptr %a1 + %t27 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 3 + %t28 = load { ptr, i64, i64 }, ptr %t27 + %t29 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 2 + %t30 = load { ptr, i64, i64 }, ptr %t29 + %t31 = call i64 @finch.gen.findEnum(ptr %t26, { ptr, i64, i64 } %t28, { ptr, i64, i64 } %t30) + %t32 = load { ptr, i64, i64 }, ptr %t25 + %t33 = extractvalue { ptr, i64, i64 } %t32, 1 + %t34 = icmp uge i64 %t31, %t33 + br i1 %t34, label %range5003, label %inrange5004 +range5003: + call void @finch_panic_index(ptr @.str.3281, i64 2576, i64 %t31, i64 %t33) + unreachable +inrange5004: + %t35 = extractvalue { ptr, i64, i64 } %t32, 0 + %t36 = getelementptr inbounds %S.gen.EnumDef, ptr %t35, i64 %t31 + %t37 = load %S.gen.EnumDef, ptr %t36 + store %S.gen.EnumDef %t37, ptr %a38 + call void @finch.copy.S_gen_EnumDef(ptr %a39, ptr %a38) + %t40 = load %S.gen.EnumDef, ptr %a39 + store %S.gen.EnumDef %t40, ptr %a41 + %t42 = getelementptr inbounds %S.gen.EnumDef, ptr %a41, i32 0, i32 2 + %t43 = getelementptr inbounds { ptr, i64, i64 }, ptr %t42, i32 0, i32 1 + %t44 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t45 = load { ptr, i64, i64 }, ptr %t44 + store i64 -1, ptr %a46 + %t47 = load i64, ptr %t43 + %t48 = load ptr, ptr %t42 + store i64 0, ptr %a49 + br label %find.cond5005 +find.cond5005: + %t50 = load i64, ptr %a49 + %t51 = icmp slt i64 %t50, %t47 + br i1 %t51, label %find.body5006, label %find.end5009 +find.body5006: + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %t48, i64 %t50 + %t53 = load { ptr, i64, i64 }, ptr %t52 + store { ptr, i64, i64 } %t53, ptr %a54 + store { ptr, i64, i64 } %t45, ptr %a55 + %t56 = call i32 @finch_str_eq(ptr %a54, ptr %a55) + %t57 = icmp ne i32 %t56, 0 + br i1 %t57, label %find.hit5007, label %find.next5008 +find.hit5007: + store i64 %t50, ptr %a46 + br label %find.end5009 +find.next5008: + %t58 = add i64 %t50, 1 + store i64 %t58, ptr %a49 + br label %find.cond5005 +find.end5009: + %t59 = load i64, ptr %a46 + store i64 %t59, ptr %a60 + %t61 = load i64, ptr %a60 + %t62 = icmp slt i64 %t61, 0 + br i1 %t62, label %then5010, label %endif5012 +then5010: + %t63 = load ptr, ptr %a1 + %t64 = load %S.ast.Node, ptr %a2 + %t65 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t66 = load { ptr, i64, i64 }, ptr %t65 + store { ptr, i64, i64 } { ptr @.str.3282, i64 1, i64 0 }, ptr %a68 + store { ptr, i64, i64 } %t66, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t70, ptr %a72 + store { ptr, i64, i64 } { ptr @.str.3283, i64 22, i64 0 }, ptr %a73 + call void @finch_str_concat(ptr %a71, ptr %a72, ptr %a73) + %t74 = load { ptr, i64, i64 }, ptr %a71 + %t75 = getelementptr inbounds %S.gen.EnumDef, ptr %a41, i32 0, i32 1 + %t76 = load { ptr, i64, i64 }, ptr %t75 + store { ptr, i64, i64 } %t74, ptr %a78 + store { ptr, i64, i64 } %t76, ptr %a79 + call void @finch_str_concat(ptr %a77, ptr %a78, ptr %a79) + %t80 = load { ptr, i64, i64 }, ptr %a77 + store { ptr, i64, i64 } %t80, ptr %a82 + store { ptr, i64, i64 } { ptr @.str.3284, i64 10, i64 0 }, ptr %a83 + call void @finch_str_concat(ptr %a81, ptr %a82, ptr %a83) + %t84 = load { ptr, i64, i64 }, ptr %a81 + %t85 = getelementptr inbounds %S.gen.EnumDef, ptr %a41, i32 0, i32 2 + %t86 = getelementptr inbounds { ptr, i64, i64 }, ptr %t85, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.3285, i64 2, i64 0 }, ptr %a87 + call void @finch_str_join(ptr %a88, ptr %t85, ptr %a87) + %t89 = load { ptr, i64, i64 }, ptr %a88 + store { ptr, i64, i64 } %t84, ptr %a91 + store { ptr, i64, i64 } %t89, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + store { ptr, i64, i64 } %t93, ptr %a95 + store { ptr, i64, i64 } { ptr @.str.3286, i64 1, i64 0 }, ptr %a96 + call void @finch_str_concat(ptr %a94, ptr %a95, ptr %a96) + %t97 = load { ptr, i64, i64 }, ptr %a94 + call void @finch.gen.fail(ptr %t63, %S.ast.Node %t64, { ptr, i64, i64 } %t97) + br label %endif5012 +endif5012: + %t98 = getelementptr inbounds %S.gen.EnumDef, ptr %a41, i32 0, i32 3 + %t99 = load i64, ptr %a60 + %t100 = load { ptr, i64, i64 }, ptr %t98 + %t101 = extractvalue { ptr, i64, i64 } %t100, 1 + %t102 = icmp uge i64 %t99, %t101 + br i1 %t102, label %range5013, label %inrange5014 +range5013: + call void @finch_panic_index(ptr @.str.3287, i64 2581, i64 %t99, i64 %t101) + unreachable +inrange5014: + %t103 = extractvalue { ptr, i64, i64 } %t100, 0 + %t104 = getelementptr inbounds i64, ptr %t103, i64 %t99 + %t105 = load i64, ptr %t104 + call void @finch_str_from_int(ptr %a106, i64 %t105) + %t107 = load { ptr, i64, i64 }, ptr %a106 + %t108 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t107, 0 + %t109 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t109, ptr %a110 + call void @finch.copy.S_ast_Type(ptr %a111, ptr %a110) + %t112 = load %S.ast.Type, ptr %a111 + %t113 = insertvalue %S.gen.Val %t108, %S.ast.Type %t112, 1 + ret %S.gen.Val %t113 +endif5000: + %t114 = load ptr, ptr %a1 + %t115 = load ptr, ptr %a1 + %t116 = load %S.ast.Node, ptr %a2 + %t117 = load %S.ast.Type, ptr %a3 + %t118 = call %S.gen.Val @finch.gen.exprWant(ptr %t115, %S.ast.Node %t116, %S.ast.Type %t117) + %t119 = load %S.ast.Type, ptr %a3 + %t120 = load %S.ast.Node, ptr %a2 + %t121 = call %S.gen.Val @finch.gen.coerce(ptr %t114, %S.gen.Val %t118, %S.ast.Type %t119, %S.ast.Node %t120, { ptr, i64, i64 } { ptr @.str.3288, i64 12, i64 0 }) + ret %S.gen.Val %t121 +} + +define internal %S.gen.Val @finch.gen.matchGen(ptr %p0, %S.ast.Node %p1, i1 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i1, align 16 + %a13 = alloca %S.gen.Val, align 16 + %a16 = alloca %S.ast.Type, align 16 + %a17 = alloca %S.ast.Type, align 16 + %a19 = alloca %S.ast.Type, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca i1, align 16 + %a45 = alloca i1, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca %S.ast.Type, align 16 + %a55 = alloca i64, align 16 + %a57 = alloca i64, align 16 + %a69 = alloca %S.ast.Node, align 16 + %a70 = alloca %S.ast.Node, align 16 + %a72 = alloca %S.ast.Node, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca i64, align 16 + %a113 = alloca %S.gen.Val, align 16 + %a117 = alloca i64, align 16 + %a120 = alloca i64, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca %S.gen.Val, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca %S.ast.Node, align 16 + %a201 = alloca %S.ast.Node, align 16 + %a203 = alloca %S.ast.Node, align 16 + %a208 = alloca %S.gen.Val, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca %S.ast.Type, align 16 + %a238 = alloca %S.ast.Type, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca %S.gen.EnumDef, align 16 + %a324 = alloca %S.gen.EnumDef, align 16 + %a326 = alloca %S.gen.EnumDef, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca i64, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca i64, align 16 + %a348 = alloca i64, align 16 + %a353 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a385 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a389 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a401 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a405 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca { ptr, i64, i64 }, align 16 + %a433 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a441 = alloca { ptr, i64, i64 }, align 16 + %a442 = alloca { ptr, i64, i64 }, align 16 + %a447 = alloca %S.ast.Type, align 16 + %a448 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i1 %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = icmp uge i64 0, %t7 + br i1 %t8, label %range5015, label %inrange5016 +range5015: + call void @finch_panic_index(ptr @.str.3289, i64 2589, i64 0, i64 %t7) + unreachable +inrange5016: + %t9 = extractvalue { ptr, i64, i64 } %t6, 0 + %t10 = getelementptr inbounds %S.ast.Node, ptr %t9, i64 0 + %t11 = load %S.ast.Node, ptr %t10 + %t12 = call %S.gen.Val @finch.gen.expr(ptr %t4, %S.ast.Node %t11) + store %S.gen.Val %t12, ptr %a13 + %t14 = getelementptr inbounds %S.gen.Val, ptr %a13, i32 0, i32 1 + %t15 = load %S.ast.Type, ptr %t14 + store %S.ast.Type %t15, ptr %a16 + call void @finch.copy.S_ast_Type(ptr %a17, ptr %a16) + %t18 = load %S.ast.Type, ptr %a17 + store %S.ast.Type %t18, ptr %a19 + %t20 = getelementptr inbounds %S.ast.Type, ptr %a19, i32 0, i32 0 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.3290, i64 4, i64 0 }, ptr %a23 + %t24 = call i32 @finch_str_eq(ptr %a22, ptr %a23) + %t25 = icmp ne i32 %t24, 0 + br label %logic.from5017 +logic.from5017: + br i1 %t25, label %logic.end5019, label %logic.rhs5018 +logic.rhs5018: + %t26 = getelementptr inbounds %S.ast.Type, ptr %a19, i32 0, i32 0 + %t27 = load { ptr, i64, i64 }, ptr %t26 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.3291, i64 4, i64 0 }, ptr %a29 + %t30 = call i32 @finch_str_eq(ptr %a28, ptr %a29) + %t31 = icmp ne i32 %t30, 0 + br label %logic.rend5020 +logic.rend5020: + br label %logic.end5019 +logic.end5019: + %t32 = phi i1 [ true, %logic.from5017 ], [ %t31, %logic.rend5020 ] + br i1 %t32, label %then5021, label %endif5023 +then5021: + %t33 = load ptr, ptr %a1 + %t34 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t35 = load { ptr, i64, i64 }, ptr %t34 + %t36 = extractvalue { ptr, i64, i64 } %t35, 1 + %t37 = icmp uge i64 0, %t36 + br i1 %t37, label %range5024, label %inrange5025 +range5024: + call void @finch_panic_index(ptr @.str.3292, i64 2592, i64 0, i64 %t36) + unreachable +inrange5025: + %t38 = extractvalue { ptr, i64, i64 } %t35, 0 + %t39 = getelementptr inbounds %S.ast.Node, ptr %t38, i64 0 + %t40 = load %S.ast.Node, ptr %t39 + call void @finch.gen.fail(ptr %t33, %S.ast.Node %t40, { ptr, i64, i64 } { ptr @.str.3293, i64 30, i64 0 }) + br label %endif5023 +endif5023: + %t41 = load ptr, ptr %a1 + %t42 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t41, { ptr, i64, i64 } { ptr @.str.3294, i64 9, i64 0 }) + store { ptr, i64, i64 } %t42, ptr %a43 + store i1 false, ptr %a44 + store i1 false, ptr %a45 + store { ptr, i64, i64 } zeroinitializer, ptr %a46 + store { ptr, i64, i64 } zeroinitializer, ptr %a47 + store { ptr, i64, i64 } zeroinitializer, ptr %a48 + %t49 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3295, i64 4, i64 0 }) + store %S.ast.Type %t49, ptr %a50 + %t51 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %t51, i32 0, i32 1 + %t53 = load i64, ptr %t52 + %t54 = sub i64 %t53, 1 + store i64 %t54, ptr %a55 + %t56 = load i64, ptr %a55 + store i64 0, ptr %a57 + br label %for.cond5026 +for.cond5026: + %t58 = load i64, ptr %a57 + %t59 = icmp slt i64 %t58, %t56 + br i1 %t59, label %for.body5027, label %for.end5029 +for.body5027: + %t60 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t61 = load i64, ptr %a57 + %t62 = add i64 1, %t61 + %t63 = load { ptr, i64, i64 }, ptr %t60 + %t64 = extractvalue { ptr, i64, i64 } %t63, 1 + %t65 = icmp uge i64 %t62, %t64 + br i1 %t65, label %range5030, label %inrange5031 +range5030: + call void @finch_panic_index(ptr @.str.3296, i64 2603, i64 %t62, i64 %t64) + unreachable +inrange5031: + %t66 = extractvalue { ptr, i64, i64 } %t63, 0 + %t67 = getelementptr inbounds %S.ast.Node, ptr %t66, i64 %t62 + %t68 = load %S.ast.Node, ptr %t67 + store %S.ast.Node %t68, ptr %a69 + call void @finch.copy.S_ast_Node(ptr %a70, ptr %a69) + %t71 = load %S.ast.Node, ptr %a70 + store %S.ast.Node %t71, ptr %a72 + %t73 = load i1, ptr %a44 + br i1 %t73, label %then5032, label %endif5034 +then5032: + %t74 = load ptr, ptr %a1 + %t75 = load %S.ast.Node, ptr %a72 + call void @finch.gen.fail(ptr %t74, %S.ast.Node %t75, { ptr, i64, i64 } { ptr @.str.3297, i64 72, i64 0 }) + br label %endif5034 +endif5034: + %t76 = load ptr, ptr %a1 + %t77 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t76, { ptr, i64, i64 } { ptr @.str.3298, i64 9, i64 0 }) + store { ptr, i64, i64 } %t77, ptr %a78 + %t79 = load ptr, ptr %a1 + %t80 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t79, { ptr, i64, i64 } { ptr @.str.3299, i64 10, i64 0 }) + store { ptr, i64, i64 } %t80, ptr %a81 + %t82 = getelementptr inbounds %S.ast.Node, ptr %a72, i32 0, i32 6 + %t83 = load i1, ptr %t82 + br i1 %t83, label %then5035, label %else5036 +then5035: + store i1 true, ptr %a44 + %t84 = load ptr, ptr %a1 + %t85 = load { ptr, i64, i64 }, ptr %a78 + call void @finch.gen.br(ptr %t84, { ptr, i64, i64 } %t85) + br label %endif5037 +else5036: + %t86 = getelementptr inbounds %S.ast.Node, ptr %a72, i32 0, i32 9 + %t87 = load { ptr, i64, i64 }, ptr %t86 + %t88 = extractvalue { ptr, i64, i64 } %t87, 1 + %t89 = icmp uge i64 0, %t88 + br i1 %t89, label %range5038, label %inrange5039 +range5038: + call void @finch_panic_index(ptr @.str.3300, i64 2613, i64 0, i64 %t88) + unreachable +inrange5039: + %t90 = extractvalue { ptr, i64, i64 } %t87, 0 + %t91 = getelementptr inbounds %S.ast.Node, ptr %t90, i64 0 + %t92 = getelementptr inbounds %S.ast.Node, ptr %t91, i32 0, i32 9 + %t93 = load { ptr, i64, i64 }, ptr %t92 + store { ptr, i64, i64 } %t93, ptr %a94 + call void @finch.copy.arr_S_ast_Node(ptr %a95, ptr %a94) + %t96 = load { ptr, i64, i64 }, ptr %a95 + store { ptr, i64, i64 } %t96, ptr %a97 + %t98 = getelementptr inbounds { ptr, i64, i64 }, ptr %a97, i32 0, i32 1 + %t99 = load i64, ptr %t98 + store i64 0, ptr %a100 + br label %for.cond5040 +for.cond5040: + %t101 = load i64, ptr %a100 + %t102 = icmp slt i64 %t101, %t99 + br i1 %t102, label %for.body5041, label %for.end5043 +for.body5041: + %t103 = load ptr, ptr %a1 + %t104 = load i64, ptr %a100 + %t105 = load { ptr, i64, i64 }, ptr %a97 + %t106 = extractvalue { ptr, i64, i64 } %t105, 1 + %t107 = icmp uge i64 %t104, %t106 + br i1 %t107, label %range5044, label %inrange5045 +range5044: + call void @finch_panic_index(ptr @.str.3301, i64 2615, i64 %t104, i64 %t106) + unreachable +inrange5045: + %t108 = extractvalue { ptr, i64, i64 } %t105, 0 + %t109 = getelementptr inbounds %S.ast.Node, ptr %t108, i64 %t104 + %t110 = load %S.ast.Node, ptr %t109 + %t111 = load %S.ast.Type, ptr %a19 + %t112 = call %S.gen.Val @finch.gen.patternValue(ptr %t103, %S.ast.Node %t110, %S.ast.Type %t111) + store %S.gen.Val %t112, ptr %a113 + %t114 = getelementptr inbounds { ptr, i64, i64 }, ptr %a46, i32 0, i32 1 + %t115 = getelementptr inbounds %S.gen.Val, ptr %a113, i32 0, i32 0 + %t116 = load { ptr, i64, i64 }, ptr %t115 + store i64 -1, ptr %a117 + %t118 = load i64, ptr %t114 + %t119 = load ptr, ptr %a46 + store i64 0, ptr %a120 + br label %find.cond5046 +find.cond5046: + %t121 = load i64, ptr %a120 + %t122 = icmp slt i64 %t121, %t118 + br i1 %t122, label %find.body5047, label %find.end5050 +find.body5047: + %t123 = getelementptr inbounds { ptr, i64, i64 }, ptr %t119, i64 %t121 + %t124 = load { ptr, i64, i64 }, ptr %t123 + store { ptr, i64, i64 } %t124, ptr %a125 + store { ptr, i64, i64 } %t116, ptr %a126 + %t127 = call i32 @finch_str_eq(ptr %a125, ptr %a126) + %t128 = icmp ne i32 %t127, 0 + br i1 %t128, label %find.hit5048, label %find.next5049 +find.hit5048: + store i64 %t121, ptr %a117 + br label %find.end5050 +find.next5049: + %t129 = add i64 %t121, 1 + store i64 %t129, ptr %a120 + br label %find.cond5046 +find.end5050: + %t130 = load i64, ptr %a117 + %t131 = icmp sge i64 %t130, 0 + br label %logic.from5051 +logic.from5051: + br i1 %t131, label %logic.rhs5052, label %logic.end5053 +logic.rhs5052: + %t132 = getelementptr inbounds %S.ast.Type, ptr %a19, i32 0, i32 0 + %t133 = load { ptr, i64, i64 }, ptr %t132 + store { ptr, i64, i64 } %t133, ptr %a134 + store { ptr, i64, i64 } { ptr @.str.3302, i64 4, i64 0 }, ptr %a135 + %t136 = call i32 @finch_str_eq(ptr %a134, ptr %a135) + %t137 = icmp ne i32 %t136, 0 + br label %logic.rend5054 +logic.rend5054: + br label %logic.end5053 +logic.end5053: + %t138 = phi i1 [ false, %logic.from5051 ], [ %t137, %logic.rend5054 ] + br i1 %t138, label %then5055, label %endif5057 +then5055: + %t139 = load ptr, ptr %a1 + %t140 = load i64, ptr %a100 + %t141 = load { ptr, i64, i64 }, ptr %a97 + %t142 = extractvalue { ptr, i64, i64 } %t141, 1 + %t143 = icmp uge i64 %t140, %t142 + br i1 %t143, label %range5058, label %inrange5059 +range5058: + call void @finch_panic_index(ptr @.str.3303, i64 2617, i64 %t140, i64 %t142) + unreachable +inrange5059: + %t144 = extractvalue { ptr, i64, i64 } %t141, 0 + %t145 = getelementptr inbounds %S.ast.Node, ptr %t144, i64 %t140 + %t146 = load %S.ast.Node, ptr %t145 + call void @finch.gen.fail(ptr %t139, %S.ast.Node %t146, { ptr, i64, i64 } { ptr @.str.3304, i64 49, i64 0 }) + br label %endif5057 +endif5057: + %t147 = getelementptr inbounds { ptr, i64, i64 }, ptr %a46, i32 0, i32 1 + %t148 = getelementptr inbounds %S.gen.Val, ptr %a113, i32 0, i32 0 + %t149 = load { ptr, i64, i64 }, ptr %t148 + store { ptr, i64, i64 } %t149, ptr %a150 + call void @finch_str_copy(ptr %a151, ptr %a150) + %t152 = load { ptr, i64, i64 }, ptr %a151 + %t153 = load i64, ptr %t147 + %t154 = add i64 %t153, 1 + call void @finch_arr_reserve(ptr %a46, i64 %t154, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t155 = load ptr, ptr %a46 + %t156 = getelementptr inbounds { ptr, i64, i64 }, ptr %t155, i64 %t153 + store { ptr, i64, i64 } %t152, ptr %t156 + store i64 %t154, ptr %t147 + %t157 = load ptr, ptr %a1 + %t158 = load %S.gen.Val, ptr %a13 + %t159 = load %S.gen.Val, ptr %a113 + %t160 = load i64, ptr %a100 + %t161 = load { ptr, i64, i64 }, ptr %a97 + %t162 = extractvalue { ptr, i64, i64 } %t161, 1 + %t163 = icmp uge i64 %t160, %t162 + br i1 %t163, label %range5060, label %inrange5061 +range5060: + call void @finch_panic_index(ptr @.str.3306, i64 2620, i64 %t160, i64 %t162) + unreachable +inrange5061: + %t164 = extractvalue { ptr, i64, i64 } %t161, 0 + %t165 = getelementptr inbounds %S.ast.Node, ptr %t164, i64 %t160 + %t166 = load %S.ast.Node, ptr %t165 + %t167 = call %S.gen.Val @finch.gen.compare(ptr %t157, { ptr, i64, i64 } { ptr @.str.3305, i64 2, i64 0 }, %S.gen.Val %t158, %S.gen.Val %t159, %S.ast.Node %t166) + store %S.gen.Val %t167, ptr %a168 + %t169 = load i64, ptr %a100 + %t170 = getelementptr inbounds { ptr, i64, i64 }, ptr %a97, i32 0, i32 1 + %t171 = load i64, ptr %t170 + %t172 = sub i64 %t171, 1 + %t173 = icmp eq i64 %t169, %t172 + br i1 %t173, label %then5062, label %else5063 +then5062: + %t174 = load ptr, ptr %a1 + %t175 = getelementptr inbounds %S.gen.Val, ptr %a168, i32 0, i32 0 + %t176 = load { ptr, i64, i64 }, ptr %t175 + %t177 = load { ptr, i64, i64 }, ptr %a78 + %t178 = load { ptr, i64, i64 }, ptr %a81 + call void @finch.gen.condBr(ptr %t174, { ptr, i64, i64 } %t176, { ptr, i64, i64 } %t177, { ptr, i64, i64 } %t178) + br label %endif5064 +else5063: + %t179 = load ptr, ptr %a1 + %t180 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t179, { ptr, i64, i64 } { ptr @.str.3307, i64 8, i64 0 }) + store { ptr, i64, i64 } %t180, ptr %a181 + %t182 = load ptr, ptr %a1 + %t183 = getelementptr inbounds %S.gen.Val, ptr %a168, i32 0, i32 0 + %t184 = load { ptr, i64, i64 }, ptr %t183 + %t185 = load { ptr, i64, i64 }, ptr %a78 + %t186 = load { ptr, i64, i64 }, ptr %a181 + call void @finch.gen.condBr(ptr %t182, { ptr, i64, i64 } %t184, { ptr, i64, i64 } %t185, { ptr, i64, i64 } %t186) + %t187 = load ptr, ptr %a1 + %t188 = load { ptr, i64, i64 }, ptr %a181 + call void @finch.gen.label(ptr %t187, { ptr, i64, i64 } %t188) + br label %endif5064 +endif5064: + br label %for.step5042 +for.step5042: + %t189 = load i64, ptr %a100 + %t190 = add i64 %t189, 1 + store i64 %t190, ptr %a100 + br label %for.cond5040 +for.end5043: + br label %endif5037 +endif5037: + %t191 = load ptr, ptr %a1 + %t192 = load { ptr, i64, i64 }, ptr %a78 + call void @finch.gen.label(ptr %t191, { ptr, i64, i64 } %t192) + %t193 = getelementptr inbounds %S.ast.Node, ptr %a72, i32 0, i32 9 + %t194 = load { ptr, i64, i64 }, ptr %t193 + %t195 = extractvalue { ptr, i64, i64 } %t194, 1 + %t196 = icmp uge i64 1, %t195 + br i1 %t196, label %range5065, label %inrange5066 +range5065: + call void @finch_panic_index(ptr @.str.3308, i64 2631, i64 1, i64 %t195) + unreachable +inrange5066: + %t197 = extractvalue { ptr, i64, i64 } %t194, 0 + %t198 = getelementptr inbounds %S.ast.Node, ptr %t197, i64 1 + %t199 = load %S.ast.Node, ptr %t198 + store %S.ast.Node %t199, ptr %a200 + call void @finch.copy.S_ast_Node(ptr %a201, ptr %a200) + %t202 = load %S.ast.Node, ptr %a201 + store %S.ast.Node %t202, ptr %a203 + %t204 = load i1, ptr %a3 + br i1 %t204, label %then5067, label %else5068 +then5067: + %t205 = load ptr, ptr %a1 + %t206 = load %S.ast.Node, ptr %a203 + %t207 = call %S.gen.Val @finch.gen.expr(ptr %t205, %S.ast.Node %t206) + store %S.gen.Val %t207, ptr %a208 + %t209 = load i64, ptr %a57 + %t210 = icmp eq i64 %t209, 0 + br label %logic.from5070 +logic.from5070: + br i1 %t210, label %logic.end5072, label %logic.rhs5071 +logic.rhs5071: + %t211 = getelementptr inbounds %S.ast.Type, ptr %a50, i32 0, i32 0 + %t212 = load { ptr, i64, i64 }, ptr %t211 + store { ptr, i64, i64 } %t212, ptr %a213 + store { ptr, i64, i64 } { ptr @.str.3309, i64 4, i64 0 }, ptr %a214 + %t215 = call i32 @finch_str_eq(ptr %a213, ptr %a214) + %t216 = icmp ne i32 %t215, 0 + br label %logic.rend5073 +logic.rend5073: + br label %logic.end5072 +logic.end5072: + %t217 = phi i1 [ true, %logic.from5070 ], [ %t216, %logic.rend5073 ] + br i1 %t217, label %then5074, label %endif5076 +then5074: + %t218 = getelementptr inbounds %S.gen.Val, ptr %a208, i32 0, i32 1 + %t219 = getelementptr inbounds %S.ast.Type, ptr %t218, i32 0, i32 0 + %t220 = load { ptr, i64, i64 }, ptr %t219 + store { ptr, i64, i64 } %t220, ptr %a221 + store { ptr, i64, i64 } { ptr @.str.3310, i64 4, i64 0 }, ptr %a222 + %t223 = call i32 @finch_str_eq(ptr %a221, ptr %a222) + %t224 = icmp ne i32 %t223, 0 + br label %logic.from5077 +logic.from5077: + br i1 %t224, label %logic.end5079, label %logic.rhs5078 +logic.rhs5078: + %t225 = getelementptr inbounds %S.gen.Val, ptr %a208, i32 0, i32 1 + %t226 = getelementptr inbounds %S.ast.Type, ptr %t225, i32 0, i32 0 + %t227 = load { ptr, i64, i64 }, ptr %t226 + store { ptr, i64, i64 } %t227, ptr %a228 + store { ptr, i64, i64 } { ptr @.str.3311, i64 4, i64 0 }, ptr %a229 + %t230 = call i32 @finch_str_eq(ptr %a228, ptr %a229) + %t231 = icmp ne i32 %t230, 0 + br label %logic.rend5080 +logic.rend5080: + br label %logic.end5079 +logic.end5079: + %t232 = phi i1 [ true, %logic.from5077 ], [ %t231, %logic.rend5080 ] + br i1 %t232, label %then5081, label %endif5083 +then5081: + %t233 = load ptr, ptr %a1 + %t234 = load %S.ast.Node, ptr %a203 + call void @finch.gen.fail(ptr %t233, %S.ast.Node %t234, { ptr, i64, i64 } { ptr @.str.3312, i64 52, i64 0 }) + br label %endif5083 +endif5083: + %t235 = getelementptr inbounds %S.gen.Val, ptr %a208, i32 0, i32 1 + %t236 = load %S.ast.Type, ptr %t235 + store %S.ast.Type %t236, ptr %a237 + call void @finch.copy.S_ast_Type(ptr %a238, ptr %a237) + %t239 = load %S.ast.Type, ptr %a238 + store %S.ast.Type %t239, ptr %a50 + br label %endif5076 +endif5076: + %t240 = load ptr, ptr %a1 + %t241 = load %S.gen.Val, ptr %a208 + %t242 = load %S.ast.Type, ptr %a50 + %t243 = load %S.ast.Node, ptr %a203 + %t244 = call %S.gen.Val @finch.gen.coerce(ptr %t240, %S.gen.Val %t241, %S.ast.Type %t242, %S.ast.Node %t243, { ptr, i64, i64 } { ptr @.str.3313, i64 57, i64 0 }) + store %S.gen.Val %t244, ptr %a208 + %t245 = load ptr, ptr %a1 + %t246 = load %S.gen.Val, ptr %a208 + %t247 = call { ptr, i64, i64 } @finch.gen.own(ptr %t245, %S.gen.Val %t246) + store { ptr, i64, i64 } %t247, ptr %a248 + %t249 = load ptr, ptr %a1 + %t250 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t249, { ptr, i64, i64 } { ptr @.str.3314, i64 10, i64 0 }) + store { ptr, i64, i64 } %t250, ptr %a251 + %t252 = load ptr, ptr %a1 + %t253 = load { ptr, i64, i64 }, ptr %a251 + call void @finch.gen.br(ptr %t252, { ptr, i64, i64 } %t253) + %t254 = load ptr, ptr %a1 + %t255 = load { ptr, i64, i64 }, ptr %a251 + call void @finch.gen.label(ptr %t254, { ptr, i64, i64 } %t255) + %t256 = getelementptr inbounds { ptr, i64, i64 }, ptr %a47, i32 0, i32 1 + %t257 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t257, ptr %a258 + call void @finch_str_copy(ptr %a259, ptr %a258) + %t260 = load { ptr, i64, i64 }, ptr %a259 + %t261 = load i64, ptr %t256 + %t262 = add i64 %t261, 1 + call void @finch_arr_reserve(ptr %a47, i64 %t262, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t263 = load ptr, ptr %a47 + %t264 = getelementptr inbounds { ptr, i64, i64 }, ptr %t263, i64 %t261 + store { ptr, i64, i64 } %t260, ptr %t264 + store i64 %t262, ptr %t256 + %t265 = getelementptr inbounds { ptr, i64, i64 }, ptr %a48, i32 0, i32 1 + %t266 = load { ptr, i64, i64 }, ptr %a251 + store { ptr, i64, i64 } %t266, ptr %a267 + call void @finch_str_copy(ptr %a268, ptr %a267) + %t269 = load { ptr, i64, i64 }, ptr %a268 + %t270 = load i64, ptr %t265 + %t271 = add i64 %t270, 1 + call void @finch_arr_reserve(ptr %a48, i64 %t271, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t272 = load ptr, ptr %a48 + %t273 = getelementptr inbounds { ptr, i64, i64 }, ptr %t272, i64 %t270 + store { ptr, i64, i64 } %t269, ptr %t273 + store i64 %t271, ptr %t265 + %t274 = load ptr, ptr %a1 + %t275 = load { ptr, i64, i64 }, ptr %a43 + call void @finch.gen.br(ptr %t274, { ptr, i64, i64 } %t275) + store i1 true, ptr %a45 + br label %endif5069 +else5068: + %t276 = getelementptr inbounds %S.ast.Node, ptr %a203, i32 0, i32 0 + %t277 = load { ptr, i64, i64 }, ptr %t276 + store { ptr, i64, i64 } %t277, ptr %a278 + store { ptr, i64, i64 } { ptr @.str.3315, i64 5, i64 0 }, ptr %a279 + %t280 = call i32 @finch_str_eq(ptr %a278, ptr %a279) + %t281 = icmp ne i32 %t280, 0 + br i1 %t281, label %then5084, label %else5085 +then5084: + %t282 = load ptr, ptr %a1 + %t283 = load %S.ast.Node, ptr %a203 + call void @finch.gen.block(ptr %t282, %S.ast.Node %t283, i1 true) + br label %endif5086 +else5085: + %t284 = load ptr, ptr %a1 + %t285 = load %S.ast.Node, ptr %a203 + call void @finch.gen.stmt(ptr %t284, %S.ast.Node %t285) + br label %endif5086 +endif5086: + %t286 = load ptr, ptr %a1 + %t287 = icmp eq ptr %t286, null + br i1 %t287, label %panic5087, label %ok5088 +panic5087: + call void @finch_panic(ptr @.str.3316, i64 2655, ptr @.str.3317) + unreachable +ok5088: + %t288 = getelementptr inbounds %S.gen.Gen, ptr %t286, i32 0, i32 9 + %t289 = load i1, ptr %t288 + %t290 = xor i1 %t289, true + br i1 %t290, label %then5089, label %endif5091 +then5089: + store i1 true, ptr %a45 + br label %endif5091 +endif5091: + %t291 = load ptr, ptr %a1 + %t292 = load { ptr, i64, i64 }, ptr %a43 + call void @finch.gen.br(ptr %t291, { ptr, i64, i64 } %t292) + br label %endif5069 +endif5069: + %t293 = getelementptr inbounds %S.ast.Node, ptr %a72, i32 0, i32 6 + %t294 = load i1, ptr %t293 + %t295 = xor i1 %t294, true + br i1 %t295, label %then5092, label %endif5094 +then5092: + %t296 = load ptr, ptr %a1 + %t297 = load { ptr, i64, i64 }, ptr %a81 + call void @finch.gen.label(ptr %t296, { ptr, i64, i64 } %t297) + br label %endif5094 +endif5094: + br label %for.step5028 +for.step5028: + %t298 = load i64, ptr %a57 + %t299 = add i64 %t298, 1 + store i64 %t299, ptr %a57 + br label %for.cond5026 +for.end5029: + %t300 = load i1, ptr %a44 + %t301 = xor i1 %t300, true + br i1 %t301, label %then5095, label %endif5097 +then5095: + %t302 = getelementptr inbounds %S.ast.Type, ptr %a19, i32 0, i32 0 + %t303 = load { ptr, i64, i64 }, ptr %t302 + store { ptr, i64, i64 } %t303, ptr %a304 + store { ptr, i64, i64 } { ptr @.str.3318, i64 4, i64 0 }, ptr %a305 + %t306 = call i32 @finch_str_eq(ptr %a304, ptr %a305) + %t307 = icmp ne i32 %t306, 0 + br i1 %t307, label %then5098, label %else5099 +then5098: + %t308 = load ptr, ptr %a1 + %t309 = icmp eq ptr %t308, null + br i1 %t309, label %panic5101, label %ok5102 +panic5101: + call void @finch_panic(ptr @.str.3319, i64 2666, ptr @.str.3320) + unreachable +ok5102: + %t310 = getelementptr inbounds %S.gen.Gen, ptr %t308, i32 0, i32 20 + %t311 = load ptr, ptr %a1 + %t312 = getelementptr inbounds %S.ast.Type, ptr %a19, i32 0, i32 3 + %t313 = load { ptr, i64, i64 }, ptr %t312 + %t314 = getelementptr inbounds %S.ast.Type, ptr %a19, i32 0, i32 2 + %t315 = load { ptr, i64, i64 }, ptr %t314 + %t316 = call i64 @finch.gen.findEnum(ptr %t311, { ptr, i64, i64 } %t313, { ptr, i64, i64 } %t315) + %t317 = load { ptr, i64, i64 }, ptr %t310 + %t318 = extractvalue { ptr, i64, i64 } %t317, 1 + %t319 = icmp uge i64 %t316, %t318 + br i1 %t319, label %range5103, label %inrange5104 +range5103: + call void @finch_panic_index(ptr @.str.3321, i64 2666, i64 %t316, i64 %t318) + unreachable +inrange5104: + %t320 = extractvalue { ptr, i64, i64 } %t317, 0 + %t321 = getelementptr inbounds %S.gen.EnumDef, ptr %t320, i64 %t316 + %t322 = load %S.gen.EnumDef, ptr %t321 + store %S.gen.EnumDef %t322, ptr %a323 + call void @finch.copy.S_gen_EnumDef(ptr %a324, ptr %a323) + %t325 = load %S.gen.EnumDef, ptr %a324 + store %S.gen.EnumDef %t325, ptr %a326 + store { ptr, i64, i64 } zeroinitializer, ptr %a327 + %t328 = getelementptr inbounds %S.gen.EnumDef, ptr %a326, i32 0, i32 2 + %t329 = getelementptr inbounds { ptr, i64, i64 }, ptr %t328, i32 0, i32 1 + %t330 = load i64, ptr %t329 + store i64 0, ptr %a331 + br label %for.cond5105 +for.cond5105: + %t332 = load i64, ptr %a331 + %t333 = icmp slt i64 %t332, %t330 + br i1 %t333, label %for.body5106, label %for.end5108 +for.body5106: + %t334 = getelementptr inbounds { ptr, i64, i64 }, ptr %a46, i32 0, i32 1 + %t335 = getelementptr inbounds %S.gen.EnumDef, ptr %a326, i32 0, i32 3 + %t336 = load i64, ptr %a331 + %t337 = load { ptr, i64, i64 }, ptr %t335 + %t338 = extractvalue { ptr, i64, i64 } %t337, 1 + %t339 = icmp uge i64 %t336, %t338 + br i1 %t339, label %range5109, label %inrange5110 +range5109: + call void @finch_panic_index(ptr @.str.3322, i64 2669, i64 %t336, i64 %t338) + unreachable +inrange5110: + %t340 = extractvalue { ptr, i64, i64 } %t337, 0 + %t341 = getelementptr inbounds i64, ptr %t340, i64 %t336 + %t342 = load i64, ptr %t341 + call void @finch_str_from_int(ptr %a343, i64 %t342) + %t344 = load { ptr, i64, i64 }, ptr %a343 + store i64 -1, ptr %a345 + %t346 = load i64, ptr %t334 + %t347 = load ptr, ptr %a46 + store i64 0, ptr %a348 + br label %find.cond5111 +find.cond5111: + %t349 = load i64, ptr %a348 + %t350 = icmp slt i64 %t349, %t346 + br i1 %t350, label %find.body5112, label %find.end5115 +find.body5112: + %t351 = getelementptr inbounds { ptr, i64, i64 }, ptr %t347, i64 %t349 + %t352 = load { ptr, i64, i64 }, ptr %t351 + store { ptr, i64, i64 } %t352, ptr %a353 + store { ptr, i64, i64 } %t344, ptr %a354 + %t355 = call i32 @finch_str_eq(ptr %a353, ptr %a354) + %t356 = icmp ne i32 %t355, 0 + br i1 %t356, label %find.hit5113, label %find.next5114 +find.hit5113: + store i64 %t349, ptr %a345 + br label %find.end5115 +find.next5114: + %t357 = add i64 %t349, 1 + store i64 %t357, ptr %a348 + br label %find.cond5111 +find.end5115: + %t358 = load i64, ptr %a345 + %t359 = icmp sge i64 %t358, 0 + %t360 = xor i1 %t359, true + br i1 %t360, label %then5116, label %endif5118 +then5116: + %t361 = getelementptr inbounds { ptr, i64, i64 }, ptr %a327, i32 0, i32 1 + %t362 = getelementptr inbounds %S.gen.EnumDef, ptr %a326, i32 0, i32 2 + %t363 = load i64, ptr %a331 + %t364 = load { ptr, i64, i64 }, ptr %t362 + %t365 = extractvalue { ptr, i64, i64 } %t364, 1 + %t366 = icmp uge i64 %t363, %t365 + br i1 %t366, label %range5119, label %inrange5120 +range5119: + call void @finch_panic_index(ptr @.str.3323, i64 2670, i64 %t363, i64 %t365) + unreachable +inrange5120: + %t367 = extractvalue { ptr, i64, i64 } %t364, 0 + %t368 = getelementptr inbounds { ptr, i64, i64 }, ptr %t367, i64 %t363 + %t369 = load { ptr, i64, i64 }, ptr %t368 + store { ptr, i64, i64 } %t369, ptr %a370 + call void @finch_str_copy(ptr %a371, ptr %a370) + %t372 = load { ptr, i64, i64 }, ptr %a371 + %t373 = load i64, ptr %t361 + %t374 = add i64 %t373, 1 + call void @finch_arr_reserve(ptr %a327, i64 %t374, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t375 = load ptr, ptr %a327 + %t376 = getelementptr inbounds { ptr, i64, i64 }, ptr %t375, i64 %t373 + store { ptr, i64, i64 } %t372, ptr %t376 + store i64 %t374, ptr %t361 + br label %endif5118 +endif5118: + br label %for.step5107 +for.step5107: + %t377 = load i64, ptr %a331 + %t378 = add i64 %t377, 1 + store i64 %t378, ptr %a331 + br label %for.cond5105 +for.end5108: + %t379 = getelementptr inbounds { ptr, i64, i64 }, ptr %a327, i32 0, i32 1 + %t380 = load i64, ptr %t379 + %t381 = icmp sgt i64 %t380, 0 + br i1 %t381, label %then5121, label %endif5123 +then5121: + %t382 = load ptr, ptr %a1 + %t383 = load %S.ast.Node, ptr %a2 + %t384 = getelementptr inbounds { ptr, i64, i64 }, ptr %a327, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.3325, i64 2, i64 0 }, ptr %a385 + call void @finch_str_join(ptr %a386, ptr %a327, ptr %a385) + %t387 = load { ptr, i64, i64 }, ptr %a386 + store { ptr, i64, i64 } { ptr @.str.3324, i64 26, i64 0 }, ptr %a389 + store { ptr, i64, i64 } %t387, ptr %a390 + call void @finch_str_concat(ptr %a388, ptr %a389, ptr %a390) + %t391 = load { ptr, i64, i64 }, ptr %a388 + store { ptr, i64, i64 } %t391, ptr %a393 + store { ptr, i64, i64 } { ptr @.str.3326, i64 29, i64 0 }, ptr %a394 + call void @finch_str_concat(ptr %a392, ptr %a393, ptr %a394) + %t395 = load { ptr, i64, i64 }, ptr %a392 + call void @finch.gen.fail(ptr %t382, %S.ast.Node %t383, { ptr, i64, i64 } %t395) + br label %endif5123 +endif5123: + br label %endif5100 +else5099: + %t396 = load ptr, ptr %a1 + %t397 = load %S.ast.Node, ptr %a2 + %t398 = load %S.ast.Type, ptr %a19 + %t399 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t398) + store { ptr, i64, i64 } { ptr @.str.3327, i64 11, i64 0 }, ptr %a401 + store { ptr, i64, i64 } %t399, ptr %a402 + call void @finch_str_concat(ptr %a400, ptr %a401, ptr %a402) + %t403 = load { ptr, i64, i64 }, ptr %a400 + store { ptr, i64, i64 } %t403, ptr %a405 + store { ptr, i64, i64 } { ptr @.str.3328, i64 54, i64 0 }, ptr %a406 + call void @finch_str_concat(ptr %a404, ptr %a405, ptr %a406) + %t407 = load { ptr, i64, i64 }, ptr %a404 + call void @finch.gen.fail(ptr %t396, %S.ast.Node %t397, { ptr, i64, i64 } %t407) + br label %endif5100 +endif5100: + %t408 = load ptr, ptr %a1 + %t409 = load %S.ast.Node, ptr %a2 + call void @finch.gen.panicIf(ptr %t408, { ptr, i64, i64 } { ptr @.str.3329, i64 4, i64 0 }, { ptr, i64, i64 } { ptr @.str.3330, i64 35, i64 0 }, %S.ast.Node %t409) + %t410 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t410, { ptr, i64, i64 } { ptr @.str.3331, i64 11, i64 0 }) + %t411 = load ptr, ptr %a1 + %t412 = icmp eq ptr %t411, null + br i1 %t412, label %panic5124, label %ok5125 +panic5124: + call void @finch_panic(ptr @.str.3332, i64 2682, ptr @.str.3333) + unreachable +ok5125: + %t413 = getelementptr inbounds %S.gen.Gen, ptr %t411, i32 0, i32 9 + store i1 true, ptr %t413 + br label %endif5097 +endif5097: + %t414 = load ptr, ptr %a1 + %t415 = load { ptr, i64, i64 }, ptr %a43 + call void @finch.gen.label(ptr %t414, { ptr, i64, i64 } %t415) + %t416 = load i1, ptr %a45 + %t417 = xor i1 %t416, true + br i1 %t417, label %then5126, label %endif5128 +then5126: + %t418 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t418, { ptr, i64, i64 } { ptr @.str.3334, i64 11, i64 0 }) + %t419 = load ptr, ptr %a1 + %t420 = icmp eq ptr %t419, null + br i1 %t420, label %panic5129, label %ok5130 +panic5129: + call void @finch_panic(ptr @.str.3335, i64 2687, ptr @.str.3336) + unreachable +ok5130: + %t421 = getelementptr inbounds %S.gen.Gen, ptr %t419, i32 0, i32 9 + store i1 true, ptr %t421 + %t422 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3337, i64 4, i64 0 }) + %t423 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t422, 1 + ret %S.gen.Val %t423 +endif5128: + %t424 = load i1, ptr %a3 + br i1 %t424, label %then5131, label %endif5133 +then5131: + %t425 = load ptr, ptr %a1 + %t426 = load ptr, ptr %a1 + %t427 = load %S.ast.Type, ptr %a50 + %t428 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t426, %S.ast.Type %t427) + store { ptr, i64, i64 } { ptr @.str.3338, i64 4, i64 0 }, ptr %a430 + store { ptr, i64, i64 } %t428, ptr %a431 + call void @finch_str_concat(ptr %a429, ptr %a430, ptr %a431) + %t432 = load { ptr, i64, i64 }, ptr %a429 + store { ptr, i64, i64 } %t432, ptr %a434 + store { ptr, i64, i64 } { ptr @.str.3339, i64 1, i64 0 }, ptr %a435 + call void @finch_str_concat(ptr %a433, ptr %a434, ptr %a435) + %t436 = load { ptr, i64, i64 }, ptr %a433 + %t437 = load { ptr, i64, i64 }, ptr %a47 + %t438 = load { ptr, i64, i64 }, ptr %a48 + %t439 = call { ptr, i64, i64 } @finch.gen.phiList({ ptr, i64, i64 } %t437, { ptr, i64, i64 } %t438) + store { ptr, i64, i64 } %t436, ptr %a441 + store { ptr, i64, i64 } %t439, ptr %a442 + call void @finch_str_concat(ptr %a440, ptr %a441, ptr %a442) + %t443 = load { ptr, i64, i64 }, ptr %a440 + %t444 = call { ptr, i64, i64 } @finch.gen.op(ptr %t425, { ptr, i64, i64 } %t443) + %t445 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t444, 0 + %t446 = load %S.ast.Type, ptr %a50 + store %S.ast.Type %t446, ptr %a447 + call void @finch.copy.S_ast_Type(ptr %a448, ptr %a447) + %t449 = load %S.ast.Type, ptr %a448 + %t450 = insertvalue %S.gen.Val %t445, %S.ast.Type %t449, 1 + %t451 = load ptr, ptr %a1 + %t452 = load %S.ast.Type, ptr %a50 + %t453 = call i1 @finch.gen.owning(ptr %t451, %S.ast.Type %t452) + %t454 = insertvalue %S.gen.Val %t450, i1 %t453, 2 + ret %S.gen.Val %t454 +endif5133: + %t455 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3340, i64 4, i64 0 }) + %t456 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t455, 1 + ret %S.gen.Val %t456 +} + +define internal { ptr, i64, i64 } @finch.gen.phiList({ ptr, i64, i64 } %p0, { ptr, i64, i64 } %p1) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca i64, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } zeroinitializer, ptr %a3 + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t5 = load i64, ptr %t4 + store i64 0, ptr %a6 + br label %for.cond5134 +for.cond5134: + %t7 = load i64, ptr %a6 + %t8 = icmp slt i64 %t7, %t5 + br i1 %t8, label %for.body5135, label %for.end5137 +for.body5135: + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t10 = load i64, ptr %a6 + %t11 = load { ptr, i64, i64 }, ptr %a1 + %t12 = extractvalue { ptr, i64, i64 } %t11, 1 + %t13 = icmp uge i64 %t10, %t12 + br i1 %t13, label %range5138, label %inrange5139 +range5138: + call void @finch_panic_index(ptr @.str.3342, i64 2699, i64 %t10, i64 %t12) + unreachable +inrange5139: + %t14 = extractvalue { ptr, i64, i64 } %t11, 0 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t14, i64 %t10 + %t16 = load { ptr, i64, i64 }, ptr %t15 + store { ptr, i64, i64 } { ptr @.str.3341, i64 2, i64 0 }, ptr %a18 + store { ptr, i64, i64 } %t16, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t20, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.3343, i64 3, i64 0 }, ptr %a23 + call void @finch_str_concat(ptr %a21, ptr %a22, ptr %a23) + %t24 = load { ptr, i64, i64 }, ptr %a21 + %t25 = load i64, ptr %a6 + %t26 = load { ptr, i64, i64 }, ptr %a2 + %t27 = extractvalue { ptr, i64, i64 } %t26, 1 + %t28 = icmp uge i64 %t25, %t27 + br i1 %t28, label %range5140, label %inrange5141 +range5140: + call void @finch_panic_index(ptr @.str.3344, i64 2699, i64 %t25, i64 %t27) + unreachable +inrange5141: + %t29 = extractvalue { ptr, i64, i64 } %t26, 0 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 %t25 + %t31 = load { ptr, i64, i64 }, ptr %t30 + store { ptr, i64, i64 } %t24, ptr %a33 + store { ptr, i64, i64 } %t31, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t35, ptr %a37 + store { ptr, i64, i64 } { ptr @.str.3345, i64 2, i64 0 }, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + %t40 = load i64, ptr %t9 + %t41 = add i64 %t40, 1 + call void @finch_arr_reserve(ptr %a3, i64 %t41, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t42 = load ptr, ptr %a3 + %t43 = getelementptr inbounds { ptr, i64, i64 }, ptr %t42, i64 %t40 + store { ptr, i64, i64 } %t39, ptr %t43 + store i64 %t41, ptr %t9 + br label %for.step5136 +for.step5136: + %t44 = load i64, ptr %a6 + %t45 = add i64 %t44, 1 + store i64 %t45, ptr %a6 + br label %for.cond5134 +for.end5137: + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.3346, i64 2, i64 0 }, ptr %a47 + call void @finch_str_join(ptr %a48, ptr %a3, ptr %a47) + %t49 = load { ptr, i64, i64 }, ptr %a48 + ret { ptr, i64, i64 } %t49 +} + +define internal void @finch.copy.S_gen_Fallible(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Fallible, ptr %src + store %S.gen.Fallible %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Fallible, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Fallible, ptr %src, i32 0, i32 0 + call void @finch.copy.S_gen_Val(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Fallible, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Fallible, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.Fallible, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.Fallible, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + ret void +} + +define internal %S.gen.Fallible @finch.gen.fallibleCall(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca %S.gen.Val, align 16 + %a58 = alloca %S.gen.Val, align 16 + %a59 = alloca %S.gen.Val, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca %S.gen.Fallible, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca %S.gen.Fallible, align 16 + %a108 = alloca %S.gen.Fallible, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.3347, i64 4, i64 0 }, ptr %a6 + %t7 = call i32 @finch_str_eq(ptr %a5, ptr %a6) + %t8 = icmp eq i32 %t7, 0 + br label %logic.from5142 +logic.from5142: + br i1 %t8, label %logic.rhs5143, label %logic.end5144 +logic.rhs5143: + %t9 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t10 = load { ptr, i64, i64 }, ptr %t9 + store { ptr, i64, i64 } %t10, ptr %a11 + store { ptr, i64, i64 } { ptr @.str.3348, i64 6, i64 0 }, ptr %a12 + %t13 = call i32 @finch_str_eq(ptr %a11, ptr %a12) + %t14 = icmp eq i32 %t13, 0 + br label %logic.rend5145 +logic.rend5145: + br label %logic.end5144 +logic.end5144: + %t15 = phi i1 [ false, %logic.from5142 ], [ %t14, %logic.rend5145 ] + br i1 %t15, label %then5146, label %endif5148 +then5146: + %t16 = load ptr, ptr %a1 + %t17 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t16, %S.ast.Node %t17, { ptr, i64, i64 } { ptr @.str.3349, i64 80, i64 0 }) + br label %endif5148 +endif5148: + %t18 = load ptr, ptr %a1 + %t19 = icmp eq ptr %t18, null + br i1 %t19, label %panic5149, label %ok5150 +panic5149: + call void @finch_panic(ptr @.str.3350, i64 2717, ptr @.str.3351) + unreachable +ok5150: + %t20 = getelementptr inbounds %S.gen.Gen, ptr %t18, i32 0, i32 37 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a22 + call void @finch_str_copy(ptr %a23, ptr %a22) + %t24 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t24, ptr %a25 + %t26 = load ptr, ptr %a1 + %t27 = icmp eq ptr %t26, null + br i1 %t27, label %panic5151, label %ok5152 +panic5151: + call void @finch_panic(ptr @.str.3352, i64 2718, ptr @.str.3353) + unreachable +ok5152: + %t28 = getelementptr inbounds %S.gen.Gen, ptr %t26, i32 0, i32 38 + %t29 = load { ptr, i64, i64 }, ptr %t28 + store { ptr, i64, i64 } %t29, ptr %a30 + call void @finch_str_copy(ptr %a31, ptr %a30) + %t32 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t32, ptr %a33 + %t34 = load ptr, ptr %a1 + %t35 = icmp eq ptr %t34, null + br i1 %t35, label %panic5153, label %ok5154 +panic5153: + call void @finch_panic(ptr @.str.3354, i64 2719, ptr @.str.3355) + unreachable +ok5154: + %t36 = getelementptr inbounds %S.gen.Gen, ptr %t34, i32 0, i32 39 + %t37 = load { ptr, i64, i64 }, ptr %t36 + store { ptr, i64, i64 } %t37, ptr %a38 + call void @finch_str_copy(ptr %a39, ptr %a38) + %t40 = load { ptr, i64, i64 }, ptr %a39 + store { ptr, i64, i64 } %t40, ptr %a41 + %t42 = load %S.ast.Node, ptr %a2 + %t43 = call { ptr, i64, i64 } @finch.gen.nodeKey(%S.ast.Node %t42) + %t44 = load ptr, ptr %a1 + %t45 = icmp eq ptr %t44, null + br i1 %t45, label %panic5155, label %ok5156 +panic5155: + call void @finch_panic(ptr @.str.3356, i64 2720, ptr @.str.3357) + unreachable +ok5156: + %t46 = getelementptr inbounds %S.gen.Gen, ptr %t44, i32 0, i32 37 + store { ptr, i64, i64 } %t43, ptr %t46 + %t47 = load ptr, ptr %a1 + %t48 = icmp eq ptr %t47, null + br i1 %t48, label %panic5157, label %ok5158 +panic5157: + call void @finch_panic(ptr @.str.3359, i64 2721, ptr @.str.3360) + unreachable +ok5158: + %t49 = getelementptr inbounds %S.gen.Gen, ptr %t47, i32 0, i32 38 + store { ptr, i64, i64 } { ptr @.str.3358, i64 0, i64 0 }, ptr %t49 + %t50 = load ptr, ptr %a1 + %t51 = icmp eq ptr %t50, null + br i1 %t51, label %panic5159, label %ok5160 +panic5159: + call void @finch_panic(ptr @.str.3362, i64 2722, ptr @.str.3363) + unreachable +ok5160: + %t52 = getelementptr inbounds %S.gen.Gen, ptr %t50, i32 0, i32 39 + store { ptr, i64, i64 } { ptr @.str.3361, i64 0, i64 0 }, ptr %t52 + %t53 = load ptr, ptr %a1 + %t54 = load %S.ast.Node, ptr %a2 + %t55 = call %S.gen.Val @finch.gen.expr(ptr %t53, %S.ast.Node %t54) + store %S.gen.Val %t55, ptr %a56 + %t57 = load %S.gen.Val, ptr %a56 + store %S.gen.Val %t57, ptr %a58 + call void @finch.copy.S_gen_Val(ptr %a59, ptr %a58) + %t60 = load %S.gen.Val, ptr %a59 + %t61 = insertvalue %S.gen.Fallible zeroinitializer, %S.gen.Val %t60, 0 + %t62 = load ptr, ptr %a1 + %t63 = icmp eq ptr %t62, null + br i1 %t63, label %panic5161, label %ok5162 +panic5161: + call void @finch_panic(ptr @.str.3364, i64 2724, ptr @.str.3365) + unreachable +ok5162: + %t64 = getelementptr inbounds %S.gen.Gen, ptr %t62, i32 0, i32 38 + %t65 = load { ptr, i64, i64 }, ptr %t64 + store { ptr, i64, i64 } %t65, ptr %a66 + call void @finch_str_copy(ptr %a67, ptr %a66) + %t68 = load { ptr, i64, i64 }, ptr %a67 + %t69 = insertvalue %S.gen.Fallible %t61, { ptr, i64, i64 } %t68, 1 + %t70 = load ptr, ptr %a1 + %t71 = icmp eq ptr %t70, null + br i1 %t71, label %panic5163, label %ok5164 +panic5163: + call void @finch_panic(ptr @.str.3366, i64 2724, ptr @.str.3367) + unreachable +ok5164: + %t72 = getelementptr inbounds %S.gen.Gen, ptr %t70, i32 0, i32 39 + %t73 = load { ptr, i64, i64 }, ptr %t72 + store { ptr, i64, i64 } %t73, ptr %a74 + call void @finch_str_copy(ptr %a75, ptr %a74) + %t76 = load { ptr, i64, i64 }, ptr %a75 + %t77 = insertvalue %S.gen.Fallible %t69, { ptr, i64, i64 } %t76, 2 + store %S.gen.Fallible %t77, ptr %a78 + %t79 = load { ptr, i64, i64 }, ptr %a25 + %t80 = load ptr, ptr %a1 + %t81 = icmp eq ptr %t80, null + br i1 %t81, label %panic5165, label %ok5166 +panic5165: + call void @finch_panic(ptr @.str.3368, i64 2725, ptr @.str.3369) + unreachable +ok5166: + %t82 = getelementptr inbounds %S.gen.Gen, ptr %t80, i32 0, i32 37 + store { ptr, i64, i64 } %t79, ptr %a83 + call void @finch_str_copy(ptr %a84, ptr %a83) + %t85 = load { ptr, i64, i64 }, ptr %a84 + store { ptr, i64, i64 } %t85, ptr %t82 + %t86 = load { ptr, i64, i64 }, ptr %a33 + %t87 = load ptr, ptr %a1 + %t88 = icmp eq ptr %t87, null + br i1 %t88, label %panic5167, label %ok5168 +panic5167: + call void @finch_panic(ptr @.str.3370, i64 2726, ptr @.str.3371) + unreachable +ok5168: + %t89 = getelementptr inbounds %S.gen.Gen, ptr %t87, i32 0, i32 38 + store { ptr, i64, i64 } %t86, ptr %a90 + call void @finch_str_copy(ptr %a91, ptr %a90) + %t92 = load { ptr, i64, i64 }, ptr %a91 + store { ptr, i64, i64 } %t92, ptr %t89 + %t93 = load { ptr, i64, i64 }, ptr %a41 + %t94 = load ptr, ptr %a1 + %t95 = icmp eq ptr %t94, null + br i1 %t95, label %panic5169, label %ok5170 +panic5169: + call void @finch_panic(ptr @.str.3372, i64 2727, ptr @.str.3373) + unreachable +ok5170: + %t96 = getelementptr inbounds %S.gen.Gen, ptr %t94, i32 0, i32 39 + store { ptr, i64, i64 } %t93, ptr %a97 + call void @finch_str_copy(ptr %a98, ptr %a97) + %t99 = load { ptr, i64, i64 }, ptr %a98 + store { ptr, i64, i64 } %t99, ptr %t96 + %t100 = getelementptr inbounds %S.gen.Fallible, ptr %a78, i32 0, i32 1 + %t101 = getelementptr inbounds { ptr, i64, i64 }, ptr %t100, i32 0, i32 1 + %t102 = load i64, ptr %t101 + %t103 = icmp eq i64 %t102, 0 + br i1 %t103, label %then5171, label %endif5173 +then5171: + %t104 = load ptr, ptr %a1 + %t105 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t104, %S.ast.Node %t105, { ptr, i64, i64 } { ptr @.str.3374, i64 50, i64 0 }) + br label %endif5173 +endif5173: + %t106 = load %S.gen.Fallible, ptr %a78 + store %S.gen.Fallible %t106, ptr %a107 + call void @finch.copy.S_gen_Fallible(ptr %a108, ptr %a107) + %t109 = load %S.gen.Fallible, ptr %a108 + ret %S.gen.Fallible %t109 +} + +define internal %S.gen.Val @finch.gen.tryExpr(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca %S.gen.Fallible, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca %S.gen.Val, align 16 + %a138 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic5174, label %ok5175 +panic5174: + call void @finch_panic(ptr @.str.3375, i64 2736, ptr @.str.3376) + unreachable +ok5175: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 42 + %t6 = load i64, ptr %t5 + %t7 = icmp sgt i64 %t6, 0 + br i1 %t7, label %then5176, label %endif5178 +then5176: + %t8 = load ptr, ptr %a1 + %t9 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t8, %S.ast.Node %t9, { ptr, i64, i64 } { ptr @.str.3377, i64 30, i64 0 }) + br label %endif5178 +endif5178: + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic5179, label %ok5180 +panic5179: + call void @finch_panic(ptr @.str.3378, i64 2739, ptr @.str.3379) + unreachable +ok5180: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 12 + %t13 = getelementptr inbounds %S.gen.FnSig, ptr %t12, i32 0, i32 9 + %t14 = load i1, ptr %t13 + %t15 = xor i1 %t14, true + br i1 %t15, label %then5181, label %endif5183 +then5181: + store { ptr, i64, i64 } { ptr @.str.3380, i64 1, i64 0 }, ptr %a16 + %t17 = load ptr, ptr %a1 + %t18 = icmp eq ptr %t17, null + br i1 %t18, label %panic5184, label %ok5185 +panic5184: + call void @finch_panic(ptr @.str.3381, i64 2741, ptr @.str.3382) + unreachable +ok5185: + %t19 = getelementptr inbounds %S.gen.Gen, ptr %t17, i32 0, i32 12 + %t20 = getelementptr inbounds %S.gen.FnSig, ptr %t19, i32 0, i32 12 + %t21 = getelementptr inbounds %S.ast.Type, ptr %t20, i32 0, i32 0 + %t22 = load { ptr, i64, i64 }, ptr %t21 + store { ptr, i64, i64 } %t22, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.3383, i64 4, i64 0 }, ptr %a24 + %t25 = call i32 @finch_str_eq(ptr %a23, ptr %a24) + %t26 = icmp eq i32 %t25, 0 + br i1 %t26, label %then5186, label %endif5188 +then5186: + %t27 = load ptr, ptr %a1 + %t28 = icmp eq ptr %t27, null + br i1 %t28, label %panic5189, label %ok5190 +panic5189: + call void @finch_panic(ptr @.str.3384, i64 2742, ptr @.str.3385) + unreachable +ok5190: + %t29 = getelementptr inbounds %S.gen.Gen, ptr %t27, i32 0, i32 12 + %t30 = getelementptr inbounds %S.gen.FnSig, ptr %t29, i32 0, i32 12 + %t31 = load %S.ast.Type, ptr %t30 + %t32 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t31) + store { ptr, i64, i64 } %t32, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.3386, i64 1, i64 0 }, ptr %a35 + call void @finch_str_concat(ptr %a33, ptr %a34, ptr %a35) + %t36 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } %t36, ptr %a16 + br label %endif5188 +endif5188: + %t37 = load ptr, ptr %a1 + %t38 = load %S.ast.Node, ptr %a2 + %t39 = load ptr, ptr %a1 + %t40 = icmp eq ptr %t39, null + br i1 %t40, label %panic5191, label %ok5192 +panic5191: + call void @finch_panic(ptr @.str.3388, i64 2744, ptr @.str.3389) + unreachable +ok5192: + %t41 = getelementptr inbounds %S.gen.Gen, ptr %t39, i32 0, i32 12 + %t42 = getelementptr inbounds %S.gen.FnSig, ptr %t41, i32 0, i32 1 + %t43 = load { ptr, i64, i64 }, ptr %t42 + store { ptr, i64, i64 } { ptr @.str.3387, i64 29, i64 0 }, ptr %a45 + store { ptr, i64, i64 } %t43, ptr %a46 + call void @finch_str_concat(ptr %a44, ptr %a45, ptr %a46) + %t47 = load { ptr, i64, i64 }, ptr %a44 + store { ptr, i64, i64 } %t47, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.3390, i64 31, i64 0 }, ptr %a50 + call void @finch_str_concat(ptr %a48, ptr %a49, ptr %a50) + %t51 = load { ptr, i64, i64 }, ptr %a48 + %t52 = load { ptr, i64, i64 }, ptr %a16 + store { ptr, i64, i64 } %t51, ptr %a54 + store { ptr, i64, i64 } %t52, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t56, ptr %a58 + store { ptr, i64, i64 } { ptr @.str.3391, i64 55, i64 0 }, ptr %a59 + call void @finch_str_concat(ptr %a57, ptr %a58, ptr %a59) + %t60 = load { ptr, i64, i64 }, ptr %a57 + call void @finch.gen.fail(ptr %t37, %S.ast.Node %t38, { ptr, i64, i64 } %t60) + br label %endif5183 +endif5183: + %t61 = load ptr, ptr %a1 + %t62 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t63 = load { ptr, i64, i64 }, ptr %t62 + %t64 = extractvalue { ptr, i64, i64 } %t63, 1 + %t65 = icmp uge i64 0, %t64 + br i1 %t65, label %range5193, label %inrange5194 +range5193: + call void @finch_panic_index(ptr @.str.3392, i64 2746, i64 0, i64 %t64) + unreachable +inrange5194: + %t66 = extractvalue { ptr, i64, i64 } %t63, 0 + %t67 = getelementptr inbounds %S.ast.Node, ptr %t66, i64 0 + %t68 = load %S.ast.Node, ptr %t67 + %t69 = call %S.gen.Fallible @finch.gen.fallibleCall(ptr %t61, %S.ast.Node %t68) + store %S.gen.Fallible %t69, ptr %a70 + %t71 = load ptr, ptr %a1 + %t72 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t71, { ptr, i64, i64 } { ptr @.str.3393, i64 10, i64 0 }) + store { ptr, i64, i64 } %t72, ptr %a73 + %t74 = load ptr, ptr %a1 + %t75 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t74, { ptr, i64, i64 } { ptr @.str.3394, i64 6, i64 0 }) + store { ptr, i64, i64 } %t75, ptr %a76 + %t77 = load ptr, ptr %a1 + %t78 = getelementptr inbounds %S.gen.Fallible, ptr %a70, i32 0, i32 1 + %t79 = load { ptr, i64, i64 }, ptr %t78 + %t80 = load { ptr, i64, i64 }, ptr %a73 + %t81 = load { ptr, i64, i64 }, ptr %a76 + call void @finch.gen.condBr(ptr %t77, { ptr, i64, i64 } %t79, { ptr, i64, i64 } %t80, { ptr, i64, i64 } %t81) + %t82 = load ptr, ptr %a1 + %t83 = load { ptr, i64, i64 }, ptr %a73 + call void @finch.gen.label(ptr %t82, { ptr, i64, i64 } %t83) + %t84 = load ptr, ptr %a1 + call void @finch.gen.unwind(ptr %t84, i64 0) + %t85 = load ptr, ptr %a1 + %t86 = load ptr, ptr %a1 + %t87 = load ptr, ptr %a1 + %t88 = icmp eq ptr %t87, null + br i1 %t88, label %panic5195, label %ok5196 +panic5195: + call void @finch_panic(ptr @.str.3396, i64 2752, ptr @.str.3397) + unreachable +ok5196: + %t89 = getelementptr inbounds %S.gen.Gen, ptr %t87, i32 0, i32 12 + %t90 = load %S.gen.FnSig, ptr %t89 + %t91 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t86, %S.gen.FnSig %t90) + store { ptr, i64, i64 } { ptr @.str.3395, i64 4, i64 0 }, ptr %a93 + store { ptr, i64, i64 } %t91, ptr %a94 + call void @finch_str_concat(ptr %a92, ptr %a93, ptr %a94) + %t95 = load { ptr, i64, i64 }, ptr %a92 + store { ptr, i64, i64 } %t95, ptr %a97 + store { ptr, i64, i64 } { ptr @.str.3398, i64 1, i64 0 }, ptr %a98 + call void @finch_str_concat(ptr %a96, ptr %a97, ptr %a98) + %t99 = load { ptr, i64, i64 }, ptr %a96 + %t100 = load ptr, ptr %a1 + %t101 = load ptr, ptr %a1 + %t102 = load ptr, ptr %a1 + %t103 = icmp eq ptr %t102, null + br i1 %t103, label %panic5197, label %ok5198 +panic5197: + call void @finch_panic(ptr @.str.3400, i64 2752, ptr @.str.3401) + unreachable +ok5198: + %t104 = getelementptr inbounds %S.gen.Gen, ptr %t102, i32 0, i32 12 + %t105 = load %S.gen.FnSig, ptr %t104 + %t106 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t101, %S.gen.FnSig %t105) + store { ptr, i64, i64 } { ptr @.str.3399, i64 12, i64 0 }, ptr %a108 + store { ptr, i64, i64 } %t106, ptr %a109 + call void @finch_str_concat(ptr %a107, ptr %a108, ptr %a109) + %t110 = load { ptr, i64, i64 }, ptr %a107 + store { ptr, i64, i64 } %t110, ptr %a112 + store { ptr, i64, i64 } { ptr @.str.3402, i64 36, i64 0 }, ptr %a113 + call void @finch_str_concat(ptr %a111, ptr %a112, ptr %a113) + %t114 = load { ptr, i64, i64 }, ptr %a111 + %t115 = getelementptr inbounds %S.gen.Fallible, ptr %a70, i32 0, i32 2 + %t116 = load { ptr, i64, i64 }, ptr %t115 + store { ptr, i64, i64 } %t114, ptr %a118 + store { ptr, i64, i64 } %t116, ptr %a119 + call void @finch_str_concat(ptr %a117, ptr %a118, ptr %a119) + %t120 = load { ptr, i64, i64 }, ptr %a117 + store { ptr, i64, i64 } %t120, ptr %a122 + store { ptr, i64, i64 } { ptr @.str.3403, i64 3, i64 0 }, ptr %a123 + call void @finch_str_concat(ptr %a121, ptr %a122, ptr %a123) + %t124 = load { ptr, i64, i64 }, ptr %a121 + %t125 = call { ptr, i64, i64 } @finch.gen.op(ptr %t100, { ptr, i64, i64 } %t124) + store { ptr, i64, i64 } %t99, ptr %a127 + store { ptr, i64, i64 } %t125, ptr %a128 + call void @finch_str_concat(ptr %a126, ptr %a127, ptr %a128) + %t129 = load { ptr, i64, i64 }, ptr %a126 + call void @finch.gen.emit(ptr %t85, { ptr, i64, i64 } %t129) + %t130 = load ptr, ptr %a1 + %t131 = icmp eq ptr %t130, null + br i1 %t131, label %panic5199, label %ok5200 +panic5199: + call void @finch_panic(ptr @.str.3404, i64 2753, ptr @.str.3405) + unreachable +ok5200: + %t132 = getelementptr inbounds %S.gen.Gen, ptr %t130, i32 0, i32 9 + store i1 true, ptr %t132 + %t133 = load ptr, ptr %a1 + %t134 = load { ptr, i64, i64 }, ptr %a76 + call void @finch.gen.label(ptr %t133, { ptr, i64, i64 } %t134) + %t135 = getelementptr inbounds %S.gen.Fallible, ptr %a70, i32 0, i32 0 + %t136 = load %S.gen.Val, ptr %t135 + store %S.gen.Val %t136, ptr %a137 + call void @finch.copy.S_gen_Val(ptr %a138, ptr %a137) + %t139 = load %S.gen.Val, ptr %a138 + ret %S.gen.Val %t139 +} + +define internal %S.gen.Val @finch.gen.orElse(ptr %p0, %S.ast.Node %p1, i1 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i1, align 16 + %a13 = alloca %S.gen.Fallible, align 16 + %a16 = alloca %S.gen.Val, align 16 + %a17 = alloca %S.gen.Val, align 16 + %a19 = alloca %S.gen.Val, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca i1, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca %S.gen.Val, align 16 + %a105 = alloca %S.gen.Val, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca %S.gen.Val, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca %S.ast.Type, align 16 + %a230 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i1 %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = icmp uge i64 0, %t7 + br i1 %t8, label %range5201, label %inrange5202 +range5201: + call void @finch_panic_index(ptr @.str.3406, i64 2760, i64 0, i64 %t7) + unreachable +inrange5202: + %t9 = extractvalue { ptr, i64, i64 } %t6, 0 + %t10 = getelementptr inbounds %S.ast.Node, ptr %t9, i64 0 + %t11 = load %S.ast.Node, ptr %t10 + %t12 = call %S.gen.Fallible @finch.gen.fallibleCall(ptr %t4, %S.ast.Node %t11) + store %S.gen.Fallible %t12, ptr %a13 + %t14 = getelementptr inbounds %S.gen.Fallible, ptr %a13, i32 0, i32 0 + %t15 = load %S.gen.Val, ptr %t14 + store %S.gen.Val %t15, ptr %a16 + call void @finch.copy.S_gen_Val(ptr %a17, ptr %a16) + %t18 = load %S.gen.Val, ptr %a17 + store %S.gen.Val %t18, ptr %a19 + %t20 = load ptr, ptr %a1 + %t21 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t20, { ptr, i64, i64 } { ptr @.str.3407, i64 9, i64 0 }) + store { ptr, i64, i64 } %t21, ptr %a22 + %t23 = load ptr, ptr %a1 + %t24 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t23, { ptr, i64, i64 } { ptr @.str.3408, i64 5, i64 0 }) + store { ptr, i64, i64 } %t24, ptr %a25 + %t26 = load ptr, ptr %a1 + %t27 = getelementptr inbounds %S.gen.Fallible, ptr %a13, i32 0, i32 1 + %t28 = load { ptr, i64, i64 }, ptr %t27 + %t29 = load { ptr, i64, i64 }, ptr %a22 + %t30 = load { ptr, i64, i64 }, ptr %a25 + call void @finch.gen.condBr(ptr %t26, { ptr, i64, i64 } %t28, { ptr, i64, i64 } %t29, { ptr, i64, i64 } %t30) + %t31 = load ptr, ptr %a1 + %t32 = load { ptr, i64, i64 }, ptr %a22 + call void @finch.gen.label(ptr %t31, { ptr, i64, i64 } %t32) + %t33 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 6 + %t34 = load i1, ptr %t33 + br i1 %t34, label %then5203, label %endif5205 +then5203: + %t35 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t35) + %t36 = load ptr, ptr %a1 + %t37 = load %S.ast.Node, ptr %a2 + %t38 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3410, i64 3, i64 0 }) + %t39 = getelementptr inbounds %S.gen.Fallible, ptr %a13, i32 0, i32 2 + %t40 = load { ptr, i64, i64 }, ptr %t39 + %t41 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t36, %S.ast.Node %t37, { ptr, i64, i64 } { ptr @.str.3409, i64 3, i64 0 }, %S.ast.Type %t38, { ptr, i64, i64 } %t40, i1 true) + %t42 = load ptr, ptr %a1 + %t43 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t44 = load { ptr, i64, i64 }, ptr %t43 + %t45 = extractvalue { ptr, i64, i64 } %t44, 1 + %t46 = icmp uge i64 1, %t45 + br i1 %t46, label %range5206, label %inrange5207 +range5206: + call void @finch_panic_index(ptr @.str.3411, i64 2769, i64 1, i64 %t45) + unreachable +inrange5207: + %t47 = extractvalue { ptr, i64, i64 } %t44, 0 + %t48 = getelementptr inbounds %S.ast.Node, ptr %t47, i64 1 + %t49 = load %S.ast.Node, ptr %t48 + call void @finch.gen.block(ptr %t42, %S.ast.Node %t49, i1 true) + %t50 = load ptr, ptr %a1 + %t51 = icmp eq ptr %t50, null + br i1 %t51, label %panic5208, label %ok5209 +panic5208: + call void @finch_panic(ptr @.str.3412, i64 2770, ptr @.str.3413) + unreachable +ok5209: + %t52 = getelementptr inbounds %S.gen.Gen, ptr %t50, i32 0, i32 9 + %t53 = load i1, ptr %t52 + store i1 %t53, ptr %a54 + %t55 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t55) + %t56 = load i1, ptr %a54 + %t57 = xor i1 %t56, true + br label %logic.from5210 +logic.from5210: + br i1 %t57, label %logic.rhs5211, label %logic.end5212 +logic.rhs5211: + %t58 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t59 = getelementptr inbounds %S.ast.Type, ptr %t58, i32 0, i32 0 + %t60 = load { ptr, i64, i64 }, ptr %t59 + store { ptr, i64, i64 } %t60, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.3414, i64 4, i64 0 }, ptr %a62 + %t63 = call i32 @finch_str_eq(ptr %a61, ptr %a62) + %t64 = icmp eq i32 %t63, 0 + br label %logic.rend5213 +logic.rend5213: + br label %logic.end5212 +logic.end5212: + %t65 = phi i1 [ false, %logic.from5210 ], [ %t64, %logic.rend5213 ] + br label %logic.from5214 +logic.from5214: + br i1 %t65, label %logic.rhs5215, label %logic.end5216 +logic.rhs5215: + %t66 = load i1, ptr %a3 + %t67 = xor i1 %t66, true + br label %logic.rend5217 +logic.rend5217: + br label %logic.end5216 +logic.end5216: + %t68 = phi i1 [ false, %logic.from5214 ], [ %t67, %logic.rend5217 ] + br i1 %t68, label %then5218, label %endif5220 +then5218: + %t69 = load ptr, ptr %a1 + %t70 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t71 = load { ptr, i64, i64 }, ptr %t70 + %t72 = extractvalue { ptr, i64, i64 } %t71, 1 + %t73 = icmp uge i64 1, %t72 + br i1 %t73, label %range5221, label %inrange5222 +range5221: + call void @finch_panic_index(ptr @.str.3415, i64 2773, i64 1, i64 %t72) + unreachable +inrange5222: + %t74 = extractvalue { ptr, i64, i64 } %t71, 0 + %t75 = getelementptr inbounds %S.ast.Node, ptr %t74, i64 1 + %t76 = load %S.ast.Node, ptr %t75 + call void @finch.gen.fail(ptr %t69, %S.ast.Node %t76, { ptr, i64, i64 } { ptr @.str.3416, i64 142, i64 0 }) + br label %endif5220 +endif5220: + %t77 = load i1, ptr %a3 + br label %logic.from5223 +logic.from5223: + br i1 %t77, label %logic.rhs5224, label %logic.end5225 +logic.rhs5224: + %t78 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t79 = getelementptr inbounds %S.ast.Type, ptr %t78, i32 0, i32 0 + %t80 = load { ptr, i64, i64 }, ptr %t79 + store { ptr, i64, i64 } %t80, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.3417, i64 4, i64 0 }, ptr %a82 + %t83 = call i32 @finch_str_eq(ptr %a81, ptr %a82) + %t84 = icmp eq i32 %t83, 0 + br label %logic.rend5226 +logic.rend5226: + br label %logic.end5225 +logic.end5225: + %t85 = phi i1 [ false, %logic.from5223 ], [ %t84, %logic.rend5226 ] + br i1 %t85, label %then5227, label %endif5229 +then5227: + %t86 = load ptr, ptr %a1 + %t87 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t86, { ptr, i64, i64 } { ptr @.str.3418, i64 6, i64 0 }) + store { ptr, i64, i64 } %t87, ptr %a88 + %t89 = load ptr, ptr %a1 + %t90 = load { ptr, i64, i64 }, ptr %a88 + call void @finch.gen.br(ptr %t89, { ptr, i64, i64 } %t90) + %t91 = load ptr, ptr %a1 + %t92 = load { ptr, i64, i64 }, ptr %a25 + call void @finch.gen.label(ptr %t91, { ptr, i64, i64 } %t92) + %t93 = load ptr, ptr %a1 + %t94 = load { ptr, i64, i64 }, ptr %a88 + call void @finch.gen.br(ptr %t93, { ptr, i64, i64 } %t94) + %t95 = load ptr, ptr %a1 + %t96 = load { ptr, i64, i64 }, ptr %a88 + call void @finch.gen.label(ptr %t95, { ptr, i64, i64 } %t96) + %t97 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3419, i64 4, i64 0 }) + %t98 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t97, 1 + ret %S.gen.Val %t98 +endif5229: + %t99 = load ptr, ptr %a1 + %t100 = load { ptr, i64, i64 }, ptr %a25 + call void @finch.gen.br(ptr %t99, { ptr, i64, i64 } %t100) + %t101 = load ptr, ptr %a1 + %t102 = load { ptr, i64, i64 }, ptr %a25 + call void @finch.gen.label(ptr %t101, { ptr, i64, i64 } %t102) + %t103 = load %S.gen.Val, ptr %a19 + store %S.gen.Val %t103, ptr %a104 + call void @finch.copy.S_gen_Val(ptr %a105, ptr %a104) + %t106 = load %S.gen.Val, ptr %a105 + ret %S.gen.Val %t106 +endif5205: + %t107 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t108 = getelementptr inbounds %S.ast.Type, ptr %t107, i32 0, i32 0 + %t109 = load { ptr, i64, i64 }, ptr %t108 + store { ptr, i64, i64 } %t109, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.3420, i64 4, i64 0 }, ptr %a111 + %t112 = call i32 @finch_str_eq(ptr %a110, ptr %a111) + %t113 = icmp ne i32 %t112, 0 + br i1 %t113, label %then5230, label %endif5232 +then5230: + %t114 = load ptr, ptr %a1 + %t115 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t116 = load { ptr, i64, i64 }, ptr %t115 + %t117 = extractvalue { ptr, i64, i64 } %t116, 1 + %t118 = icmp uge i64 1, %t117 + br i1 %t118, label %range5233, label %inrange5234 +range5233: + call void @finch_panic_index(ptr @.str.3421, i64 2788, i64 1, i64 %t117) + unreachable +inrange5234: + %t119 = extractvalue { ptr, i64, i64 } %t116, 0 + %t120 = getelementptr inbounds %S.ast.Node, ptr %t119, i64 1 + %t121 = load %S.ast.Node, ptr %t120 + call void @finch.gen.fail(ptr %t114, %S.ast.Node %t121, { ptr, i64, i64 } { ptr @.str.3422, i64 98, i64 0 }) + br label %endif5232 +endif5232: + %t122 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t122) + %t123 = load ptr, ptr %a1 + %t124 = load %S.ast.Node, ptr %a2 + %t125 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3424, i64 3, i64 0 }) + %t126 = getelementptr inbounds %S.gen.Fallible, ptr %a13, i32 0, i32 2 + %t127 = load { ptr, i64, i64 }, ptr %t126 + %t128 = call { ptr, i64, i64 } @finch.gen.addVar(ptr %t123, %S.ast.Node %t124, { ptr, i64, i64 } { ptr @.str.3423, i64 3, i64 0 }, %S.ast.Type %t125, { ptr, i64, i64 } %t127, i1 true) + %t129 = load ptr, ptr %a1 + %t130 = load ptr, ptr %a1 + %t131 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t132 = load { ptr, i64, i64 }, ptr %t131 + %t133 = extractvalue { ptr, i64, i64 } %t132, 1 + %t134 = icmp uge i64 1, %t133 + br i1 %t134, label %range5235, label %inrange5236 +range5235: + call void @finch_panic_index(ptr @.str.3425, i64 2792, i64 1, i64 %t133) + unreachable +inrange5236: + %t135 = extractvalue { ptr, i64, i64 } %t132, 0 + %t136 = getelementptr inbounds %S.ast.Node, ptr %t135, i64 1 + %t137 = load %S.ast.Node, ptr %t136 + %t138 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t139 = load %S.ast.Type, ptr %t138 + %t140 = call %S.gen.Val @finch.gen.exprWant(ptr %t130, %S.ast.Node %t137, %S.ast.Type %t139) + %t141 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t142 = load %S.ast.Type, ptr %t141 + %t143 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t144 = load { ptr, i64, i64 }, ptr %t143 + %t145 = extractvalue { ptr, i64, i64 } %t144, 1 + %t146 = icmp uge i64 1, %t145 + br i1 %t146, label %range5237, label %inrange5238 +range5237: + call void @finch_panic_index(ptr @.str.3426, i64 2792, i64 1, i64 %t145) + unreachable +inrange5238: + %t147 = extractvalue { ptr, i64, i64 } %t144, 0 + %t148 = getelementptr inbounds %S.ast.Node, ptr %t147, i64 1 + %t149 = load %S.ast.Node, ptr %t148 + %t150 = call %S.gen.Val @finch.gen.coerce(ptr %t129, %S.gen.Val %t140, %S.ast.Type %t142, %S.ast.Node %t149, { ptr, i64, i64 } { ptr @.str.3427, i64 20, i64 0 }) + store %S.gen.Val %t150, ptr %a151 + %t152 = load ptr, ptr %a1 + %t153 = load %S.gen.Val, ptr %a151 + %t154 = call { ptr, i64, i64 } @finch.gen.own(ptr %t152, %S.gen.Val %t153) + store { ptr, i64, i64 } %t154, ptr %a155 + %t156 = load ptr, ptr %a1 + call void @finch.gen.popScope(ptr %t156) + %t157 = load ptr, ptr %a1 + %t158 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t157, { ptr, i64, i64 } { ptr @.str.3428, i64 7, i64 0 }) + store { ptr, i64, i64 } %t158, ptr %a159 + %t160 = load ptr, ptr %a1 + %t161 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t160, { ptr, i64, i64 } { ptr @.str.3429, i64 6, i64 0 }) + store { ptr, i64, i64 } %t161, ptr %a162 + %t163 = load ptr, ptr %a1 + %t164 = load { ptr, i64, i64 }, ptr %a159 + call void @finch.gen.br(ptr %t163, { ptr, i64, i64 } %t164) + %t165 = load ptr, ptr %a1 + %t166 = load { ptr, i64, i64 }, ptr %a159 + call void @finch.gen.label(ptr %t165, { ptr, i64, i64 } %t166) + %t167 = load ptr, ptr %a1 + %t168 = load { ptr, i64, i64 }, ptr %a162 + call void @finch.gen.br(ptr %t167, { ptr, i64, i64 } %t168) + %t169 = load ptr, ptr %a1 + %t170 = load { ptr, i64, i64 }, ptr %a25 + call void @finch.gen.label(ptr %t169, { ptr, i64, i64 } %t170) + %t171 = load ptr, ptr %a1 + %t172 = load { ptr, i64, i64 }, ptr %a162 + call void @finch.gen.br(ptr %t171, { ptr, i64, i64 } %t172) + %t173 = load ptr, ptr %a1 + %t174 = load { ptr, i64, i64 }, ptr %a162 + call void @finch.gen.label(ptr %t173, { ptr, i64, i64 } %t174) + %t175 = load ptr, ptr %a1 + %t176 = load ptr, ptr %a1 + %t177 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t178 = load %S.ast.Type, ptr %t177 + %t179 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t176, %S.ast.Type %t178) + store { ptr, i64, i64 } { ptr @.str.3430, i64 4, i64 0 }, ptr %a181 + store { ptr, i64, i64 } %t179, ptr %a182 + call void @finch_str_concat(ptr %a180, ptr %a181, ptr %a182) + %t183 = load { ptr, i64, i64 }, ptr %a180 + store { ptr, i64, i64 } %t183, ptr %a185 + store { ptr, i64, i64 } { ptr @.str.3431, i64 3, i64 0 }, ptr %a186 + call void @finch_str_concat(ptr %a184, ptr %a185, ptr %a186) + %t187 = load { ptr, i64, i64 }, ptr %a184 + %t188 = load { ptr, i64, i64 }, ptr %a155 + store { ptr, i64, i64 } %t187, ptr %a190 + store { ptr, i64, i64 } %t188, ptr %a191 + call void @finch_str_concat(ptr %a189, ptr %a190, ptr %a191) + %t192 = load { ptr, i64, i64 }, ptr %a189 + store { ptr, i64, i64 } %t192, ptr %a194 + store { ptr, i64, i64 } { ptr @.str.3432, i64 3, i64 0 }, ptr %a195 + call void @finch_str_concat(ptr %a193, ptr %a194, ptr %a195) + %t196 = load { ptr, i64, i64 }, ptr %a193 + %t197 = load { ptr, i64, i64 }, ptr %a159 + store { ptr, i64, i64 } %t196, ptr %a199 + store { ptr, i64, i64 } %t197, ptr %a200 + call void @finch_str_concat(ptr %a198, ptr %a199, ptr %a200) + %t201 = load { ptr, i64, i64 }, ptr %a198 + store { ptr, i64, i64 } %t201, ptr %a203 + store { ptr, i64, i64 } { ptr @.str.3433, i64 6, i64 0 }, ptr %a204 + call void @finch_str_concat(ptr %a202, ptr %a203, ptr %a204) + %t205 = load { ptr, i64, i64 }, ptr %a202 + %t206 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 0 + %t207 = load { ptr, i64, i64 }, ptr %t206 + store { ptr, i64, i64 } %t205, ptr %a209 + store { ptr, i64, i64 } %t207, ptr %a210 + call void @finch_str_concat(ptr %a208, ptr %a209, ptr %a210) + %t211 = load { ptr, i64, i64 }, ptr %a208 + store { ptr, i64, i64 } %t211, ptr %a213 + store { ptr, i64, i64 } { ptr @.str.3434, i64 3, i64 0 }, ptr %a214 + call void @finch_str_concat(ptr %a212, ptr %a213, ptr %a214) + %t215 = load { ptr, i64, i64 }, ptr %a212 + %t216 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t215, ptr %a218 + store { ptr, i64, i64 } %t216, ptr %a219 + call void @finch_str_concat(ptr %a217, ptr %a218, ptr %a219) + %t220 = load { ptr, i64, i64 }, ptr %a217 + store { ptr, i64, i64 } %t220, ptr %a222 + store { ptr, i64, i64 } { ptr @.str.3435, i64 2, i64 0 }, ptr %a223 + call void @finch_str_concat(ptr %a221, ptr %a222, ptr %a223) + %t224 = load { ptr, i64, i64 }, ptr %a221 + %t225 = call { ptr, i64, i64 } @finch.gen.op(ptr %t175, { ptr, i64, i64 } %t224) + %t226 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t225, 0 + %t227 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t228 = load %S.ast.Type, ptr %t227 + store %S.ast.Type %t228, ptr %a229 + call void @finch.copy.S_ast_Type(ptr %a230, ptr %a229) + %t231 = load %S.ast.Type, ptr %a230 + %t232 = insertvalue %S.gen.Val %t226, %S.ast.Type %t231, 1 + %t233 = load ptr, ptr %a1 + %t234 = getelementptr inbounds %S.gen.Val, ptr %a19, i32 0, i32 1 + %t235 = load %S.ast.Type, ptr %t234 + %t236 = call i1 @finch.gen.owning(ptr %t233, %S.ast.Type %t235) + %t237 = insertvalue %S.gen.Val %t232, i1 %t236, 2 + ret %S.gen.Val %t237 +} + +define internal %S.gen.Val @finch.gen.exprWant(ptr %p0, %S.ast.Node %p1, %S.ast.Type %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.3436, i64 5, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br i1 %t9, label %then5239, label %endif5241 +then5239: + %t10 = load ptr, ptr %a1 + %t11 = load %S.ast.Node, ptr %a2 + %t12 = load %S.ast.Type, ptr %a3 + %t13 = call %S.gen.Val @finch.gen.arrayLit(ptr %t10, %S.ast.Node %t11, %S.ast.Type %t12) + ret %S.gen.Val %t13 +endif5241: + %t14 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t15 = load { ptr, i64, i64 }, ptr %t14 + store { ptr, i64, i64 } %t15, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.3437, i64 3, i64 0 }, ptr %a17 + %t18 = call i32 @finch_str_eq(ptr %a16, ptr %a17) + %t19 = icmp ne i32 %t18, 0 + br i1 %t19, label %then5242, label %endif5244 +then5242: + %t20 = load ptr, ptr %a1 + %t21 = load %S.ast.Node, ptr %a2 + %t22 = load %S.ast.Type, ptr %a3 + %t23 = call %S.gen.Val @finch.gen.mapLit(ptr %t20, %S.ast.Node %t21, %S.ast.Type %t22) + ret %S.gen.Val %t23 +endif5244: + %t24 = load ptr, ptr %a1 + %t25 = load %S.ast.Node, ptr %a2 + %t26 = call %S.gen.Val @finch.gen.expr(ptr %t24, %S.ast.Node %t25) + ret %S.gen.Val %t26 +} + +define internal %S.gen.Val @finch.gen.expr(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca i64, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca i64, align 16 + %a47 = alloca i8, align 16 + %a52 = alloca i64, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca i64, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca %S.gen.Ref, align 16 + %a186 = alloca %S.gen.Val, align 16 + %a187 = alloca %S.gen.Val, align 16 + %a203 = alloca %S.ast.Type, align 16 + %a204 = alloca %S.ast.Type, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch_str_copy(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.3438, i64 3, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br i1 %t13, label %then5245, label %endif5247 +then5245: + %t14 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t15 = load { ptr, i64, i64 }, ptr %t14 + store { ptr, i64, i64 } %t15, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.3440, i64 2, i64 0 }, ptr %a18 + %t19 = call i32 @finch_str_starts(ptr %a16, ptr %a18) + %t20 = icmp ne i32 %t19, 0 + br label %logic.from5248 +logic.from5248: + br i1 %t20, label %logic.end5250, label %logic.rhs5249 +logic.rhs5249: + %t21 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t22 = load { ptr, i64, i64 }, ptr %t21 + store { ptr, i64, i64 } %t22, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.3442, i64 2, i64 0 }, ptr %a25 + %t26 = call i32 @finch_str_starts(ptr %a23, ptr %a25) + %t27 = icmp ne i32 %t26, 0 + br label %logic.rend5251 +logic.rend5251: + br label %logic.end5250 +logic.end5250: + %t28 = phi i1 [ true, %logic.from5248 ], [ %t27, %logic.rend5251 ] + br i1 %t28, label %then5252, label %endif5254 +then5252: + store i64 0, ptr %a29 + %t30 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t31 = load { ptr, i64, i64 }, ptr %t30 + store { ptr, i64, i64 } %t31, ptr %a32 + %t34 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t35 = getelementptr inbounds { ptr, i64, i64 }, ptr %t34, i32 0, i32 1 + %t36 = load i64, ptr %t35 + call void @finch_str_sub(ptr %a33, ptr %a32, i64 2, i64 %t36, ptr @.str.3443, i64 2821) + %t37 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } %t37, ptr %a38 + store i64 0, ptr %a39 + br label %each.cond5255 +each.cond5255: + %t40 = getelementptr inbounds { ptr, i64, i64 }, ptr %a38, i32 0, i32 1 + %t41 = load i64, ptr %t40 + %t42 = load i64, ptr %a39 + %t43 = icmp slt i64 %t42, %t41 + br i1 %t43, label %each.body5256, label %each.end5258 +each.body5256: + %t44 = load ptr, ptr %a38 + %t45 = getelementptr inbounds i8, ptr %t44, i64 %t42 + %t46 = load i8, ptr %t45 + store i8 %t46, ptr %a47 + %t48 = load i8, ptr %a47 + %t49 = zext i8 %t48 to i64 + %t50 = zext i8 48 to i64 + %t51 = sub i64 %t49, %t50 + store i64 %t51, ptr %a52 + %t53 = load i8, ptr %a47 + %t54 = icmp uge i8 %t53, 97 + br label %logic.from5259 +logic.from5259: + br i1 %t54, label %logic.rhs5260, label %logic.end5261 +logic.rhs5260: + %t55 = load i8, ptr %a47 + %t56 = icmp ule i8 %t55, 102 + br label %logic.rend5262 +logic.rend5262: + br label %logic.end5261 +logic.end5261: + %t57 = phi i1 [ false, %logic.from5259 ], [ %t56, %logic.rend5262 ] + br i1 %t57, label %then5263, label %endif5265 +then5263: + %t58 = load i8, ptr %a47 + %t59 = zext i8 %t58 to i64 + %t60 = zext i8 97 to i64 + %t61 = sub i64 %t59, %t60 + %t62 = add i64 %t61, 10 + store i64 %t62, ptr %a52 + br label %endif5265 +endif5265: + %t63 = load i8, ptr %a47 + %t64 = icmp uge i8 %t63, 65 + br label %logic.from5266 +logic.from5266: + br i1 %t64, label %logic.rhs5267, label %logic.end5268 +logic.rhs5267: + %t65 = load i8, ptr %a47 + %t66 = icmp ule i8 %t65, 70 + br label %logic.rend5269 +logic.rend5269: + br label %logic.end5268 +logic.end5268: + %t67 = phi i1 [ false, %logic.from5266 ], [ %t66, %logic.rend5269 ] + br i1 %t67, label %then5270, label %endif5272 +then5270: + %t68 = load i8, ptr %a47 + %t69 = zext i8 %t68 to i64 + %t70 = zext i8 65 to i64 + %t71 = sub i64 %t69, %t70 + %t72 = add i64 %t71, 10 + store i64 %t72, ptr %a52 + br label %endif5272 +endif5272: + %t73 = load i64, ptr %a29 + %t74 = mul i64 %t73, 16 + %t75 = load i64, ptr %a52 + %t76 = add i64 %t74, %t75 + store i64 %t76, ptr %a29 + br label %each.step5257 +each.step5257: + %t77 = load i64, ptr %a39 + %t78 = add i64 %t77, 1 + store i64 %t78, ptr %a39 + br label %each.cond5255 +each.end5258: + %t79 = load i64, ptr %a29 + call void @finch_str_from_int(ptr %a80, i64 %t79) + %t81 = load { ptr, i64, i64 }, ptr %a80 + %t82 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t81, 0 + %t83 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3444, i64 3, i64 0 }) + %t84 = insertvalue %S.gen.Val %t82, %S.ast.Type %t83, 1 + %t85 = insertvalue %S.gen.Val %t84, i1 true, 3 + ret %S.gen.Val %t85 +endif5254: + %t86 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t87 = load { ptr, i64, i64 }, ptr %t86 + store { ptr, i64, i64 } %t87, ptr %a88 + %t89 = call i64 @finch_str_to_int(ptr %a88, ptr @.str.3445, i64 2833) + call void @finch_str_from_int(ptr %a90, i64 %t89) + %t91 = load { ptr, i64, i64 }, ptr %a90 + %t92 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t91, 0 + %t93 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3446, i64 3, i64 0 }) + %t94 = insertvalue %S.gen.Val %t92, %S.ast.Type %t93, 1 + %t95 = insertvalue %S.gen.Val %t94, i1 true, 3 + ret %S.gen.Val %t95 +endif5247: + %t96 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t96, ptr %a97 + store { ptr, i64, i64 } { ptr @.str.3447, i64 5, i64 0 }, ptr %a98 + %t99 = call i32 @finch_str_eq(ptr %a97, ptr %a98) + %t100 = icmp ne i32 %t99, 0 + br i1 %t100, label %then5273, label %endif5275 +then5273: + %t101 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t102 = load { ptr, i64, i64 }, ptr %t101 + store { ptr, i64, i64 } %t102, ptr %a103 + call void @finch_str_copy(ptr %a104, ptr %a103) + %t105 = load { ptr, i64, i64 }, ptr %a104 + %t106 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t105, 0 + %t107 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3448, i64 5, i64 0 }) + %t108 = insertvalue %S.gen.Val %t106, %S.ast.Type %t107, 1 + %t109 = insertvalue %S.gen.Val %t108, i1 true, 3 + ret %S.gen.Val %t109 +endif5275: + %t110 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t110, ptr %a111 + store { ptr, i64, i64 } { ptr @.str.3449, i64 4, i64 0 }, ptr %a112 + %t113 = call i32 @finch_str_eq(ptr %a111, ptr %a112) + %t114 = icmp ne i32 %t113, 0 + br i1 %t114, label %then5276, label %endif5278 +then5276: + %t115 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t116 = load { ptr, i64, i64 }, ptr %t115 + store { ptr, i64, i64 } %t116, ptr %a117 + call void @finch_str_copy(ptr %a118, ptr %a117) + %t119 = load { ptr, i64, i64 }, ptr %a118 + %t120 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t119, 0 + %t121 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3450, i64 4, i64 0 }) + %t122 = insertvalue %S.gen.Val %t120, %S.ast.Type %t121, 1 + ret %S.gen.Val %t122 +endif5278: + %t123 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t123, ptr %a124 + store { ptr, i64, i64 } { ptr @.str.3451, i64 4, i64 0 }, ptr %a125 + %t126 = call i32 @finch_str_eq(ptr %a124, ptr %a125) + %t127 = icmp ne i32 %t126, 0 + br i1 %t127, label %then5279, label %endif5281 +then5279: + %t128 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t129 = load { ptr, i64, i64 }, ptr %t128 + %t130 = extractvalue { ptr, i64, i64 } %t129, 1 + %t131 = icmp uge i64 0, %t130 + br i1 %t131, label %range5282, label %inrange5283 +range5282: + call void @finch_panic_index(ptr @.str.3452, i64 2842, i64 0, i64 %t130) + unreachable +inrange5283: + %t132 = extractvalue { ptr, i64, i64 } %t129, 0 + %t133 = getelementptr inbounds i8, ptr %t132, i64 0 + %t134 = load i8, ptr %t133 + %t135 = zext i8 %t134 to i64 + store i64 %t135, ptr %a136 + %t137 = load i64, ptr %a136 + call void @finch_str_from_int(ptr %a138, i64 %t137) + %t139 = load { ptr, i64, i64 }, ptr %a138 + %t140 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t139, 0 + %t141 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3453, i64 4, i64 0 }) + %t142 = insertvalue %S.gen.Val %t140, %S.ast.Type %t141, 1 + ret %S.gen.Val %t142 +endif5281: + %t143 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t143, ptr %a144 + store { ptr, i64, i64 } { ptr @.str.3454, i64 3, i64 0 }, ptr %a145 + %t146 = call i32 @finch_str_eq(ptr %a144, ptr %a145) + %t147 = icmp ne i32 %t146, 0 + br i1 %t147, label %then5284, label %endif5286 +then5284: + %t148 = load ptr, ptr %a1 + %t149 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 4 + %t150 = load { ptr, i64, i64 }, ptr %t149 + %t151 = call %S.gen.Val @finch.gen.strConst(ptr %t148, { ptr, i64, i64 } %t150) + ret %S.gen.Val %t151 +endif5286: + %t152 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t152, ptr %a153 + store { ptr, i64, i64 } { ptr @.str.3455, i64 4, i64 0 }, ptr %a154 + %t155 = call i32 @finch_str_eq(ptr %a153, ptr %a154) + %t156 = icmp ne i32 %t155, 0 + br i1 %t156, label %then5287, label %endif5289 +then5287: + %t157 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } { ptr @.str.3456, i64 4, i64 0 }, 0 + %t158 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3457, i64 4, i64 0 }) + %t159 = insertvalue %S.gen.Val %t157, %S.ast.Type %t158, 1 + ret %S.gen.Val %t159 +endif5289: + %t160 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t160, ptr %a161 + store { ptr, i64, i64 } { ptr @.str.3458, i64 3, i64 0 }, ptr %a162 + %t163 = call i32 @finch_str_eq(ptr %a161, ptr %a162) + %t164 = icmp ne i32 %t163, 0 + br label %logic.from5290 +logic.from5290: + br i1 %t164, label %logic.end5292, label %logic.rhs5291 +logic.rhs5291: + %t165 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t165, ptr %a166 + store { ptr, i64, i64 } { ptr @.str.3459, i64 6, i64 0 }, ptr %a167 + %t168 = call i32 @finch_str_eq(ptr %a166, ptr %a167) + %t169 = icmp ne i32 %t168, 0 + br label %logic.rend5293 +logic.rend5293: + br label %logic.end5292 +logic.end5292: + %t170 = phi i1 [ true, %logic.from5290 ], [ %t169, %logic.rend5293 ] + br label %logic.from5294 +logic.from5294: + br i1 %t170, label %logic.end5296, label %logic.rhs5295 +logic.rhs5295: + %t171 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t171, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.3460, i64 5, i64 0 }, ptr %a173 + %t174 = call i32 @finch_str_eq(ptr %a172, ptr %a173) + %t175 = icmp ne i32 %t174, 0 + br label %logic.rend5297 +logic.rend5297: + br label %logic.end5296 +logic.end5296: + %t176 = phi i1 [ true, %logic.from5294 ], [ %t175, %logic.rend5297 ] + br i1 %t176, label %then5298, label %endif5300 +then5298: + %t177 = load ptr, ptr %a1 + %t178 = load %S.ast.Node, ptr %a2 + %t179 = call %S.gen.Ref @finch.gen.ref(ptr %t177, %S.ast.Node %t178, i1 false) + store %S.gen.Ref %t179, ptr %a180 + %t181 = getelementptr inbounds %S.gen.Ref, ptr %a180, i32 0, i32 0 + %t182 = load i1, ptr %t181 + %t183 = xor i1 %t182, true + br i1 %t183, label %then5301, label %endif5303 +then5301: + %t184 = getelementptr inbounds %S.gen.Ref, ptr %a180, i32 0, i32 2 + %t185 = load %S.gen.Val, ptr %t184 + store %S.gen.Val %t185, ptr %a186 + call void @finch.copy.S_gen_Val(ptr %a187, ptr %a186) + %t188 = load %S.gen.Val, ptr %a187 + ret %S.gen.Val %t188 +endif5303: + %t189 = load ptr, ptr %a1 + %t190 = load ptr, ptr %a1 + %t191 = getelementptr inbounds %S.gen.Ref, ptr %a180, i32 0, i32 1 + %t192 = getelementptr inbounds %S.gen.Place, ptr %t191, i32 0, i32 1 + %t193 = load %S.ast.Type, ptr %t192 + %t194 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t190, %S.ast.Type %t193) + %t195 = getelementptr inbounds %S.gen.Ref, ptr %a180, i32 0, i32 1 + %t196 = getelementptr inbounds %S.gen.Place, ptr %t195, i32 0, i32 0 + %t197 = load { ptr, i64, i64 }, ptr %t196 + %t198 = call { ptr, i64, i64 } @finch.gen.load(ptr %t189, { ptr, i64, i64 } %t194, { ptr, i64, i64 } %t197) + %t199 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t198, 0 + %t200 = getelementptr inbounds %S.gen.Ref, ptr %a180, i32 0, i32 1 + %t201 = getelementptr inbounds %S.gen.Place, ptr %t200, i32 0, i32 1 + %t202 = load %S.ast.Type, ptr %t201 + store %S.ast.Type %t202, ptr %a203 + call void @finch.copy.S_ast_Type(ptr %a204, ptr %a203) + %t205 = load %S.ast.Type, ptr %a204 + %t206 = insertvalue %S.gen.Val %t199, %S.ast.Type %t205, 1 + ret %S.gen.Val %t206 +endif5300: + %t207 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t207, ptr %a208 + store { ptr, i64, i64 } { ptr @.str.3461, i64 5, i64 0 }, ptr %a209 + %t210 = call i32 @finch_str_eq(ptr %a208, ptr %a209) + %t211 = icmp ne i32 %t210, 0 + br i1 %t211, label %then5304, label %endif5306 +then5304: + %t212 = load ptr, ptr %a1 + %t213 = load %S.ast.Node, ptr %a2 + %t214 = call %S.gen.Val @finch.gen.matchGen(ptr %t212, %S.ast.Node %t213, i1 true) + ret %S.gen.Val %t214 +endif5306: + %t215 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t215, ptr %a216 + store { ptr, i64, i64 } { ptr @.str.3462, i64 3, i64 0 }, ptr %a217 + %t218 = call i32 @finch_str_eq(ptr %a216, ptr %a217) + %t219 = icmp ne i32 %t218, 0 + br i1 %t219, label %then5307, label %endif5309 +then5307: + %t220 = load ptr, ptr %a1 + %t221 = load %S.ast.Node, ptr %a2 + %t222 = call %S.gen.Val @finch.gen.tryExpr(ptr %t220, %S.ast.Node %t221) + ret %S.gen.Val %t222 +endif5309: + %t223 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t223, ptr %a224 + store { ptr, i64, i64 } { ptr @.str.3463, i64 2, i64 0 }, ptr %a225 + %t226 = call i32 @finch_str_eq(ptr %a224, ptr %a225) + %t227 = icmp ne i32 %t226, 0 + br i1 %t227, label %then5310, label %endif5312 +then5310: + %t228 = load ptr, ptr %a1 + %t229 = load %S.ast.Node, ptr %a2 + %t230 = call %S.gen.Val @finch.gen.orElse(ptr %t228, %S.ast.Node %t229, i1 false) + ret %S.gen.Val %t230 +endif5312: + %t231 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t231, ptr %a232 + store { ptr, i64, i64 } { ptr @.str.3464, i64 5, i64 0 }, ptr %a233 + %t234 = call i32 @finch_str_eq(ptr %a232, ptr %a233) + %t235 = icmp ne i32 %t234, 0 + br i1 %t235, label %then5313, label %endif5315 +then5313: + %t236 = load ptr, ptr %a1 + %t237 = load %S.ast.Node, ptr %a2 + %t238 = call %S.gen.Val @finch.gen.unary(ptr %t236, %S.ast.Node %t237) + ret %S.gen.Val %t238 +endif5315: + %t239 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t239, ptr %a240 + store { ptr, i64, i64 } { ptr @.str.3465, i64 6, i64 0 }, ptr %a241 + %t242 = call i32 @finch_str_eq(ptr %a240, ptr %a241) + %t243 = icmp ne i32 %t242, 0 + br i1 %t243, label %then5316, label %endif5318 +then5316: + %t244 = load ptr, ptr %a1 + %t245 = load %S.ast.Node, ptr %a2 + %t246 = call %S.gen.Val @finch.gen.binary(ptr %t244, %S.ast.Node %t245) + ret %S.gen.Val %t246 +endif5318: + %t247 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t247, ptr %a248 + store { ptr, i64, i64 } { ptr @.str.3466, i64 4, i64 0 }, ptr %a249 + %t250 = call i32 @finch_str_eq(ptr %a248, ptr %a249) + %t251 = icmp ne i32 %t250, 0 + br i1 %t251, label %then5319, label %endif5321 +then5319: + %t252 = load ptr, ptr %a1 + %t253 = load %S.ast.Node, ptr %a2 + %t254 = call %S.gen.Val @finch.gen.call(ptr %t252, %S.ast.Node %t253) + ret %S.gen.Val %t254 +endif5321: + %t255 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t255, ptr %a256 + store { ptr, i64, i64 } { ptr @.str.3467, i64 6, i64 0 }, ptr %a257 + %t258 = call i32 @finch_str_eq(ptr %a256, ptr %a257) + %t259 = icmp ne i32 %t258, 0 + br i1 %t259, label %then5322, label %endif5324 +then5322: + %t260 = load ptr, ptr %a1 + %t261 = load %S.ast.Node, ptr %a2 + %t262 = call %S.gen.Val @finch.gen.method(ptr %t260, %S.ast.Node %t261) + ret %S.gen.Val %t262 +endif5324: + %t263 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t263, ptr %a264 + store { ptr, i64, i64 } { ptr @.str.3468, i64 5, i64 0 }, ptr %a265 + %t266 = call i32 @finch_str_eq(ptr %a264, ptr %a265) + %t267 = icmp ne i32 %t266, 0 + br i1 %t267, label %then5325, label %endif5327 +then5325: + %t268 = load ptr, ptr %a1 + %t269 = load %S.ast.Node, ptr %a2 + %t270 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3469, i64 4, i64 0 }) + %t271 = call %S.gen.Val @finch.gen.arrayLit(ptr %t268, %S.ast.Node %t269, %S.ast.Type %t270) + ret %S.gen.Val %t271 +endif5327: + %t272 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t272, ptr %a273 + store { ptr, i64, i64 } { ptr @.str.3470, i64 3, i64 0 }, ptr %a274 + %t275 = call i32 @finch_str_eq(ptr %a273, ptr %a274) + %t276 = icmp ne i32 %t275, 0 + br i1 %t276, label %then5328, label %endif5330 +then5328: + %t277 = load ptr, ptr %a1 + %t278 = load %S.ast.Node, ptr %a2 + %t279 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3471, i64 4, i64 0 }) + %t280 = call %S.gen.Val @finch.gen.mapLit(ptr %t277, %S.ast.Node %t278, %S.ast.Type %t279) + ret %S.gen.Val %t280 +endif5330: + %t281 = load ptr, ptr %a1 + %t282 = load %S.ast.Node, ptr %a2 + %t283 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.3472, i64 19, i64 0 }, ptr %a285 + store { ptr, i64, i64 } %t283, ptr %a286 + call void @finch_str_concat(ptr %a284, ptr %a285, ptr %a286) + %t287 = load { ptr, i64, i64 }, ptr %a284 + call void @finch.gen.fail(ptr %t281, %S.ast.Node %t282, { ptr, i64, i64 } %t287) + ret %S.gen.Val zeroinitializer +} + +define internal %S.gen.Val @finch.gen.unary(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a12 = alloca %S.gen.Val, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca %S.gen.Val, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca %S.ast.Type, align 16 + %a93 = alloca %S.ast.Type, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca %S.ast.Type, align 16 + %a132 = alloca %S.ast.Type, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca %S.ast.Type, align 16 + %a146 = alloca %S.ast.Type, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca %S.ast.Type, align 16 + %a174 = alloca %S.ast.Type, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca %S.ast.Type, align 16 + %a204 = alloca %S.ast.Type, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca %S.gen.Val, align 16 + %a218 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t5 = load { ptr, i64, i64 }, ptr %t4 + %t6 = extractvalue { ptr, i64, i64 } %t5, 1 + %t7 = icmp uge i64 0, %t6 + br i1 %t7, label %range5331, label %inrange5332 +range5331: + call void @finch_panic_index(ptr @.str.3473, i64 2890, i64 0, i64 %t6) + unreachable +inrange5332: + %t8 = extractvalue { ptr, i64, i64 } %t5, 0 + %t9 = getelementptr inbounds %S.ast.Node, ptr %t8, i64 0 + %t10 = load %S.ast.Node, ptr %t9 + %t11 = call %S.gen.Val @finch.gen.expr(ptr %t3, %S.ast.Node %t10) + store %S.gen.Val %t11, ptr %a12 + %t13 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t14 = load { ptr, i64, i64 }, ptr %t13 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.3474, i64 1, i64 0 }, ptr %a16 + %t17 = call i32 @finch_str_eq(ptr %a15, ptr %a16) + %t18 = icmp ne i32 %t17, 0 + br i1 %t18, label %then5333, label %endif5335 +then5333: + %t19 = load ptr, ptr %a1 + %t20 = load %S.gen.Val, ptr %a12 + %t21 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3475, i64 4, i64 0 }) + %t22 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t23 = load { ptr, i64, i64 }, ptr %t22 + %t24 = extractvalue { ptr, i64, i64 } %t23, 1 + %t25 = icmp uge i64 0, %t24 + br i1 %t25, label %range5336, label %inrange5337 +range5336: + call void @finch_panic_index(ptr @.str.3476, i64 2892, i64 0, i64 %t24) + unreachable +inrange5337: + %t26 = extractvalue { ptr, i64, i64 } %t23, 0 + %t27 = getelementptr inbounds %S.ast.Node, ptr %t26, i64 0 + %t28 = load %S.ast.Node, ptr %t27 + %t29 = call %S.gen.Val @finch.gen.coerce(ptr %t19, %S.gen.Val %t20, %S.ast.Type %t21, %S.ast.Node %t28, { ptr, i64, i64 } { ptr @.str.3477, i64 19, i64 0 }) + store %S.gen.Val %t29, ptr %a30 + %t31 = load ptr, ptr %a1 + %t32 = getelementptr inbounds %S.gen.Val, ptr %a30, i32 0, i32 0 + %t33 = load { ptr, i64, i64 }, ptr %t32 + store { ptr, i64, i64 } { ptr @.str.3478, i64 7, i64 0 }, ptr %a35 + store { ptr, i64, i64 } %t33, ptr %a36 + call void @finch_str_concat(ptr %a34, ptr %a35, ptr %a36) + %t37 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t37, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.3479, i64 6, i64 0 }, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + %t42 = call { ptr, i64, i64 } @finch.gen.op(ptr %t31, { ptr, i64, i64 } %t41) + %t43 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t42, 0 + %t44 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3480, i64 4, i64 0 }) + %t45 = insertvalue %S.gen.Val %t43, %S.ast.Type %t44, 1 + ret %S.gen.Val %t45 +endif5335: + %t46 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t47 = load { ptr, i64, i64 }, ptr %t46 + store { ptr, i64, i64 } %t47, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.3481, i64 1, i64 0 }, ptr %a49 + %t50 = call i32 @finch_str_eq(ptr %a48, ptr %a49) + %t51 = icmp ne i32 %t50, 0 + br i1 %t51, label %then5338, label %endif5340 +then5338: + %t52 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t53 = load %S.ast.Type, ptr %t52 + %t54 = call i1 @finch.gen.isInt(%S.ast.Type %t53) + %t55 = xor i1 %t54, true + br i1 %t55, label %then5341, label %endif5343 +then5341: + %t56 = load ptr, ptr %a1 + %t57 = load %S.ast.Node, ptr %a2 + %t58 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t59 = load %S.ast.Type, ptr %t58 + %t60 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t59) + store { ptr, i64, i64 } { ptr @.str.3482, i64 45, i64 0 }, ptr %a62 + store { ptr, i64, i64 } %t60, ptr %a63 + call void @finch_str_concat(ptr %a61, ptr %a62, ptr %a63) + %t64 = load { ptr, i64, i64 }, ptr %a61 + call void @finch.gen.fail(ptr %t56, %S.ast.Node %t57, { ptr, i64, i64 } %t64) + br label %endif5343 +endif5343: + %t65 = load ptr, ptr %a1 + %t66 = load ptr, ptr %a1 + %t67 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t68 = load %S.ast.Type, ptr %t67 + %t69 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t66, %S.ast.Type %t68) + store { ptr, i64, i64 } { ptr @.str.3483, i64 4, i64 0 }, ptr %a71 + store { ptr, i64, i64 } %t69, ptr %a72 + call void @finch_str_concat(ptr %a70, ptr %a71, ptr %a72) + %t73 = load { ptr, i64, i64 }, ptr %a70 + store { ptr, i64, i64 } %t73, ptr %a75 + store { ptr, i64, i64 } { ptr @.str.3484, i64 1, i64 0 }, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + %t78 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 0 + %t79 = load { ptr, i64, i64 }, ptr %t78 + store { ptr, i64, i64 } %t77, ptr %a81 + store { ptr, i64, i64 } %t79, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t83, ptr %a85 + store { ptr, i64, i64 } { ptr @.str.3485, i64 4, i64 0 }, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + %t88 = call { ptr, i64, i64 } @finch.gen.op(ptr %t65, { ptr, i64, i64 } %t87) + %t89 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t88, 0 + %t90 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t91 = load %S.ast.Type, ptr %t90 + store %S.ast.Type %t91, ptr %a92 + call void @finch.copy.S_ast_Type(ptr %a93, ptr %a92) + %t94 = load %S.ast.Type, ptr %a93 + %t95 = insertvalue %S.gen.Val %t89, %S.ast.Type %t94, 1 + ret %S.gen.Val %t95 +endif5340: + %t96 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t97 = load %S.ast.Type, ptr %t96 + %t98 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t97) + br i1 %t98, label %then5344, label %endif5346 +then5344: + %t99 = load ptr, ptr %a1 + %t100 = load %S.ast.Node, ptr %a2 + %t101 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t102 = load %S.ast.Type, ptr %t101 + %t103 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t102) + store { ptr, i64, i64 } %t103, ptr %a105 + store { ptr, i64, i64 } { ptr @.str.3486, i64 34, i64 0 }, ptr %a106 + call void @finch_str_concat(ptr %a104, ptr %a105, ptr %a106) + %t107 = load { ptr, i64, i64 }, ptr %a104 + call void @finch.gen.fail(ptr %t99, %S.ast.Node %t100, { ptr, i64, i64 } %t107) + br label %endif5346 +endif5346: + %t108 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t109 = load %S.ast.Type, ptr %t108 + %t110 = call i1 @finch.gen.isSigned(%S.ast.Type %t109) + br i1 %t110, label %then5347, label %endif5349 +then5347: + %t111 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 3 + %t112 = load i1, ptr %t111 + br i1 %t112, label %then5350, label %endif5352 +then5350: + %t113 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 0 + %t114 = load { ptr, i64, i64 }, ptr %t113 + store { ptr, i64, i64 } %t114, ptr %a115 + store { ptr, i64, i64 } { ptr @.str.3488, i64 1, i64 0 }, ptr %a117 + %t118 = call i32 @finch_str_starts(ptr %a115, ptr %a117) + %t119 = icmp ne i32 %t118, 0 + br i1 %t119, label %then5353, label %endif5355 +then5353: + %t120 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 0 + %t121 = load { ptr, i64, i64 }, ptr %t120 + store { ptr, i64, i64 } %t121, ptr %a122 + %t124 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 0 + %t125 = getelementptr inbounds { ptr, i64, i64 }, ptr %t124, i32 0, i32 1 + %t126 = load i64, ptr %t125 + call void @finch_str_sub(ptr %a123, ptr %a122, i64 1, i64 %t126, ptr @.str.3489, i64 2907) + %t127 = load { ptr, i64, i64 }, ptr %a123 + %t128 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t127, 0 + %t129 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t130 = load %S.ast.Type, ptr %t129 + store %S.ast.Type %t130, ptr %a131 + call void @finch.copy.S_ast_Type(ptr %a132, ptr %a131) + %t133 = load %S.ast.Type, ptr %a132 + %t134 = insertvalue %S.gen.Val %t128, %S.ast.Type %t133, 1 + %t135 = insertvalue %S.gen.Val %t134, i1 true, 3 + ret %S.gen.Val %t135 +endif5355: + %t136 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 0 + %t137 = load { ptr, i64, i64 }, ptr %t136 + store { ptr, i64, i64 } { ptr @.str.3490, i64 1, i64 0 }, ptr %a139 + store { ptr, i64, i64 } %t137, ptr %a140 + call void @finch_str_concat(ptr %a138, ptr %a139, ptr %a140) + %t141 = load { ptr, i64, i64 }, ptr %a138 + %t142 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t141, 0 + %t143 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t144 = load %S.ast.Type, ptr %t143 + store %S.ast.Type %t144, ptr %a145 + call void @finch.copy.S_ast_Type(ptr %a146, ptr %a145) + %t147 = load %S.ast.Type, ptr %a146 + %t148 = insertvalue %S.gen.Val %t142, %S.ast.Type %t147, 1 + %t149 = insertvalue %S.gen.Val %t148, i1 true, 3 + ret %S.gen.Val %t149 +endif5352: + %t150 = load ptr, ptr %a1 + %t151 = load ptr, ptr %a1 + %t152 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t153 = load %S.ast.Type, ptr %t152 + %t154 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t151, %S.ast.Type %t153) + store { ptr, i64, i64 } { ptr @.str.3491, i64 4, i64 0 }, ptr %a156 + store { ptr, i64, i64 } %t154, ptr %a157 + call void @finch_str_concat(ptr %a155, ptr %a156, ptr %a157) + %t158 = load { ptr, i64, i64 }, ptr %a155 + store { ptr, i64, i64 } %t158, ptr %a160 + store { ptr, i64, i64 } { ptr @.str.3492, i64 4, i64 0 }, ptr %a161 + call void @finch_str_concat(ptr %a159, ptr %a160, ptr %a161) + %t162 = load { ptr, i64, i64 }, ptr %a159 + %t163 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 0 + %t164 = load { ptr, i64, i64 }, ptr %t163 + store { ptr, i64, i64 } %t162, ptr %a166 + store { ptr, i64, i64 } %t164, ptr %a167 + call void @finch_str_concat(ptr %a165, ptr %a166, ptr %a167) + %t168 = load { ptr, i64, i64 }, ptr %a165 + %t169 = call { ptr, i64, i64 } @finch.gen.op(ptr %t150, { ptr, i64, i64 } %t168) + %t170 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t169, 0 + %t171 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t172 = load %S.ast.Type, ptr %t171 + store %S.ast.Type %t172, ptr %a173 + call void @finch.copy.S_ast_Type(ptr %a174, ptr %a173) + %t175 = load %S.ast.Type, ptr %a174 + %t176 = insertvalue %S.gen.Val %t170, %S.ast.Type %t175, 1 + ret %S.gen.Val %t176 +endif5349: + %t177 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t178 = load %S.ast.Type, ptr %t177 + %t179 = call i1 @finch.gen.isFloat(%S.ast.Type %t178) + br i1 %t179, label %then5356, label %endif5358 +then5356: + %t180 = load ptr, ptr %a1 + %t181 = load ptr, ptr %a1 + %t182 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t183 = load %S.ast.Type, ptr %t182 + %t184 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t181, %S.ast.Type %t183) + store { ptr, i64, i64 } { ptr @.str.3493, i64 5, i64 0 }, ptr %a186 + store { ptr, i64, i64 } %t184, ptr %a187 + call void @finch_str_concat(ptr %a185, ptr %a186, ptr %a187) + %t188 = load { ptr, i64, i64 }, ptr %a185 + store { ptr, i64, i64 } %t188, ptr %a190 + store { ptr, i64, i64 } { ptr @.str.3494, i64 1, i64 0 }, ptr %a191 + call void @finch_str_concat(ptr %a189, ptr %a190, ptr %a191) + %t192 = load { ptr, i64, i64 }, ptr %a189 + %t193 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 0 + %t194 = load { ptr, i64, i64 }, ptr %t193 + store { ptr, i64, i64 } %t192, ptr %a196 + store { ptr, i64, i64 } %t194, ptr %a197 + call void @finch_str_concat(ptr %a195, ptr %a196, ptr %a197) + %t198 = load { ptr, i64, i64 }, ptr %a195 + %t199 = call { ptr, i64, i64 } @finch.gen.op(ptr %t180, { ptr, i64, i64 } %t198) + %t200 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t199, 0 + %t201 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t202 = load %S.ast.Type, ptr %t201 + store %S.ast.Type %t202, ptr %a203 + call void @finch.copy.S_ast_Type(ptr %a204, ptr %a203) + %t205 = load %S.ast.Type, ptr %a204 + %t206 = insertvalue %S.gen.Val %t200, %S.ast.Type %t205, 1 + ret %S.gen.Val %t206 +endif5358: + %t207 = load ptr, ptr %a1 + %t208 = load %S.ast.Node, ptr %a2 + %t209 = getelementptr inbounds %S.gen.Val, ptr %a12, i32 0, i32 1 + %t210 = load %S.ast.Type, ptr %t209 + %t211 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t210) + store { ptr, i64, i64 } { ptr @.str.3495, i64 26, i64 0 }, ptr %a213 + store { ptr, i64, i64 } %t211, ptr %a214 + call void @finch_str_concat(ptr %a212, ptr %a213, ptr %a214) + %t215 = load { ptr, i64, i64 }, ptr %a212 + call void @finch.gen.fail(ptr %t207, %S.ast.Node %t208, { ptr, i64, i64 } %t215) + %t216 = load %S.gen.Val, ptr %a12 + store %S.gen.Val %t216, ptr %a217 + call void @finch.copy.S_gen_Val(ptr %a218, ptr %a217) + %t219 = load %S.gen.Val, ptr %a218 + ret %S.gen.Val %t219 +} + +define internal void @finch.gen.badOperands(ptr %p0, { ptr, i64, i64 } %p1, %S.gen.Val %p2, %S.gen.Val %p3, %S.ast.Node %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.gen.Val, align 16 + %a4 = alloca %S.gen.Val, align 16 + %a5 = alloca %S.ast.Node, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.gen.Val %p2, ptr %a3 + store %S.gen.Val %p3, ptr %a4 + store %S.ast.Node %p4, ptr %a5 + %t6 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.3496, i64 11, i64 0 }, ptr %a8 + store { ptr, i64, i64 } %t6, ptr %a9 + call void @finch_str_concat(ptr %a7, ptr %a8, ptr %a9) + %t10 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t10, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.3497, i64 5, i64 0 }, ptr %a13 + call void @finch_str_concat(ptr %a11, ptr %a12, ptr %a13) + %t14 = load { ptr, i64, i64 }, ptr %a11 + %t15 = getelementptr inbounds %S.gen.Val, ptr %a3, i32 0, i32 1 + %t16 = load %S.ast.Type, ptr %t15 + %t17 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t16) + store { ptr, i64, i64 } %t14, ptr %a19 + store { ptr, i64, i64 } %t17, ptr %a20 + call void @finch_str_concat(ptr %a18, ptr %a19, ptr %a20) + %t21 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t21, ptr %a22 + %t23 = getelementptr inbounds %S.gen.Val, ptr %a3, i32 0, i32 1 + %t24 = load %S.ast.Type, ptr %t23 + %t25 = getelementptr inbounds %S.gen.Val, ptr %a4, i32 0, i32 1 + %t26 = load %S.ast.Type, ptr %t25 + %t27 = call i1 @finch.ast.same(%S.ast.Type %t24, %S.ast.Type %t26) + %t28 = xor i1 %t27, true + br i1 %t28, label %then5359, label %endif5361 +then5359: + %t29 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t29, ptr %a31 + store { ptr, i64, i64 } { ptr @.str.3498, i64 5, i64 0 }, ptr %a32 + call void @finch_str_concat(ptr %a30, ptr %a31, ptr %a32) + %t33 = load { ptr, i64, i64 }, ptr %a30 + %t34 = getelementptr inbounds %S.gen.Val, ptr %a4, i32 0, i32 1 + %t35 = load %S.ast.Type, ptr %t34 + %t36 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t35) + store { ptr, i64, i64 } %t33, ptr %a38 + store { ptr, i64, i64 } %t36, ptr %a39 + call void @finch_str_concat(ptr %a37, ptr %a38, ptr %a39) + %t40 = load { ptr, i64, i64 }, ptr %a37 + store { ptr, i64, i64 } %t40, ptr %a22 + br label %endif5361 +endif5361: + %t41 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t41, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.3499, i64 1, i64 0 }, ptr %a43 + %t44 = call i32 @finch_str_eq(ptr %a42, ptr %a43) + %t45 = icmp ne i32 %t44, 0 + br label %logic.from5362 +logic.from5362: + br i1 %t45, label %logic.rhs5363, label %logic.end5364 +logic.rhs5363: + %t46 = getelementptr inbounds %S.gen.Val, ptr %a3, i32 0, i32 1 + %t47 = getelementptr inbounds %S.ast.Type, ptr %t46, i32 0, i32 0 + %t48 = load { ptr, i64, i64 }, ptr %t47 + store { ptr, i64, i64 } %t48, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.3500, i64 3, i64 0 }, ptr %a50 + %t51 = call i32 @finch_str_eq(ptr %a49, ptr %a50) + %t52 = icmp ne i32 %t51, 0 + br label %logic.from5365 +logic.from5365: + br i1 %t52, label %logic.end5367, label %logic.rhs5366 +logic.rhs5366: + %t53 = getelementptr inbounds %S.gen.Val, ptr %a4, i32 0, i32 1 + %t54 = getelementptr inbounds %S.ast.Type, ptr %t53, i32 0, i32 0 + %t55 = load { ptr, i64, i64 }, ptr %t54 + store { ptr, i64, i64 } %t55, ptr %a56 + store { ptr, i64, i64 } { ptr @.str.3501, i64 3, i64 0 }, ptr %a57 + %t58 = call i32 @finch_str_eq(ptr %a56, ptr %a57) + %t59 = icmp ne i32 %t58, 0 + br label %logic.rend5368 +logic.rend5368: + br label %logic.end5367 +logic.end5367: + %t60 = phi i1 [ true, %logic.from5365 ], [ %t59, %logic.rend5368 ] + br label %logic.rend5369 +logic.rend5369: + br label %logic.end5364 +logic.end5364: + %t61 = phi i1 [ false, %logic.from5362 ], [ %t60, %logic.rend5369 ] + br i1 %t61, label %then5370, label %endif5372 +then5370: + %t62 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t62, ptr %a64 + store { ptr, i64, i64 } { ptr @.str.3502, i64 48, i64 0 }, ptr %a65 + call void @finch_str_concat(ptr %a63, ptr %a64, ptr %a65) + %t66 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t66, ptr %a22 + br label %endif5372 +endif5372: + %t67 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t67, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.3503, i64 1, i64 0 }, ptr %a69 + %t70 = call i32 @finch_str_eq(ptr %a68, ptr %a69) + %t71 = icmp ne i32 %t70, 0 + br label %logic.from5373 +logic.from5373: + br i1 %t71, label %logic.end5375, label %logic.rhs5374 +logic.rhs5374: + %t72 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t72, ptr %a73 + store { ptr, i64, i64 } { ptr @.str.3504, i64 1, i64 0 }, ptr %a74 + %t75 = call i32 @finch_str_eq(ptr %a73, ptr %a74) + %t76 = icmp ne i32 %t75, 0 + br label %logic.rend5376 +logic.rend5376: + br label %logic.end5375 +logic.end5375: + %t77 = phi i1 [ true, %logic.from5373 ], [ %t76, %logic.rend5376 ] + br label %logic.from5377 +logic.from5377: + br i1 %t77, label %logic.rhs5378, label %logic.end5379 +logic.rhs5378: + %t78 = getelementptr inbounds %S.gen.Val, ptr %a3, i32 0, i32 1 + %t79 = getelementptr inbounds %S.ast.Type, ptr %t78, i32 0, i32 0 + %t80 = load { ptr, i64, i64 }, ptr %t79 + store { ptr, i64, i64 } %t80, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.3505, i64 4, i64 0 }, ptr %a82 + %t83 = call i32 @finch_str_eq(ptr %a81, ptr %a82) + %t84 = icmp ne i32 %t83, 0 + br label %logic.rend5380 +logic.rend5380: + br label %logic.end5379 +logic.end5379: + %t85 = phi i1 [ false, %logic.from5377 ], [ %t84, %logic.rend5380 ] + br i1 %t85, label %then5381, label %else5382 +then5381: + %t86 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t86, ptr %a87 + store { ptr, i64, i64 } { ptr @.str.3506, i64 1, i64 0 }, ptr %a88 + %t89 = call i32 @finch_str_eq(ptr %a87, ptr %a88) + %t90 = icmp ne i32 %t89, 0 + br i1 %t90, label %then5384, label %else5385 +then5384: + %t91 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t91, ptr %a93 + store { ptr, i64, i64 } { ptr @.str.3507, i64 26, i64 0 }, ptr %a94 + call void @finch_str_concat(ptr %a92, ptr %a93, ptr %a94) + %t95 = load { ptr, i64, i64 }, ptr %a92 + store { ptr, i64, i64 } %t95, ptr %a22 + br label %endif5386 +else5385: + %t96 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t96, ptr %a98 + store { ptr, i64, i64 } { ptr @.str.3508, i64 26, i64 0 }, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + store { ptr, i64, i64 } %t100, ptr %a22 + br label %endif5386 +endif5386: + br label %endif5383 +else5382: + %t101 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t101, ptr %a102 + store { ptr, i64, i64 } { ptr @.str.3509, i64 1, i64 0 }, ptr %a103 + %t104 = call i32 @finch_str_eq(ptr %a102, ptr %a103) + %t105 = icmp ne i32 %t104, 0 + br label %logic.from5387 +logic.from5387: + br i1 %t105, label %logic.end5389, label %logic.rhs5388 +logic.rhs5388: + %t106 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t106, ptr %a107 + store { ptr, i64, i64 } { ptr @.str.3510, i64 1, i64 0 }, ptr %a108 + %t109 = call i32 @finch_str_eq(ptr %a107, ptr %a108) + %t110 = icmp ne i32 %t109, 0 + br label %logic.rend5390 +logic.rend5390: + br label %logic.end5389 +logic.end5389: + %t111 = phi i1 [ true, %logic.from5387 ], [ %t110, %logic.rend5390 ] + br label %logic.from5391 +logic.from5391: + br i1 %t111, label %logic.end5393, label %logic.rhs5392 +logic.rhs5392: + %t112 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t112, ptr %a113 + store { ptr, i64, i64 } { ptr @.str.3511, i64 1, i64 0 }, ptr %a114 + %t115 = call i32 @finch_str_eq(ptr %a113, ptr %a114) + %t116 = icmp ne i32 %t115, 0 + br label %logic.rend5394 +logic.rend5394: + br label %logic.end5393 +logic.end5393: + %t117 = phi i1 [ true, %logic.from5391 ], [ %t116, %logic.rend5394 ] + br label %logic.from5395 +logic.from5395: + br i1 %t117, label %logic.end5397, label %logic.rhs5396 +logic.rhs5396: + %t118 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t118, ptr %a119 + store { ptr, i64, i64 } { ptr @.str.3512, i64 2, i64 0 }, ptr %a120 + %t121 = call i32 @finch_str_eq(ptr %a119, ptr %a120) + %t122 = icmp ne i32 %t121, 0 + br label %logic.rend5398 +logic.rend5398: + br label %logic.end5397 +logic.end5397: + %t123 = phi i1 [ true, %logic.from5395 ], [ %t122, %logic.rend5398 ] + br label %logic.from5399 +logic.from5399: + br i1 %t123, label %logic.end5401, label %logic.rhs5400 +logic.rhs5400: + %t124 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t124, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.3513, i64 2, i64 0 }, ptr %a126 + %t127 = call i32 @finch_str_eq(ptr %a125, ptr %a126) + %t128 = icmp ne i32 %t127, 0 + br label %logic.rend5402 +logic.rend5402: + br label %logic.end5401 +logic.end5401: + %t129 = phi i1 [ true, %logic.from5399 ], [ %t128, %logic.rend5402 ] + br i1 %t129, label %then5403, label %endif5405 +then5403: + %t130 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t130, ptr %a132 + store { ptr, i64, i64 } { ptr @.str.3514, i64 43, i64 0 }, ptr %a133 + call void @finch_str_concat(ptr %a131, ptr %a132, ptr %a133) + %t134 = load { ptr, i64, i64 }, ptr %a131 + store { ptr, i64, i64 } %t134, ptr %a22 + br label %endif5405 +endif5405: + br label %endif5383 +endif5383: + %t135 = getelementptr inbounds %S.gen.Val, ptr %a3, i32 0, i32 1 + %t136 = getelementptr inbounds %S.ast.Type, ptr %t135, i32 0, i32 0 + %t137 = load { ptr, i64, i64 }, ptr %t136 + store { ptr, i64, i64 } %t137, ptr %a138 + store { ptr, i64, i64 } { ptr @.str.3515, i64 6, i64 0 }, ptr %a139 + %t140 = call i32 @finch_str_eq(ptr %a138, ptr %a139) + %t141 = icmp ne i32 %t140, 0 + br label %logic.from5406 +logic.from5406: + br i1 %t141, label %logic.end5408, label %logic.rhs5407 +logic.rhs5407: + %t142 = getelementptr inbounds %S.gen.Val, ptr %a3, i32 0, i32 1 + %t143 = getelementptr inbounds %S.ast.Type, ptr %t142, i32 0, i32 0 + %t144 = load { ptr, i64, i64 }, ptr %t143 + store { ptr, i64, i64 } %t144, ptr %a145 + store { ptr, i64, i64 } { ptr @.str.3516, i64 5, i64 0 }, ptr %a146 + %t147 = call i32 @finch_str_eq(ptr %a145, ptr %a146) + %t148 = icmp ne i32 %t147, 0 + br label %logic.rend5409 +logic.rend5409: + br label %logic.end5408 +logic.end5408: + %t149 = phi i1 [ true, %logic.from5406 ], [ %t148, %logic.rend5409 ] + br label %logic.from5410 +logic.from5410: + br i1 %t149, label %logic.rhs5411, label %logic.end5412 +logic.rhs5411: + %t150 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t150, ptr %a151 + store { ptr, i64, i64 } { ptr @.str.3517, i64 2, i64 0 }, ptr %a152 + %t153 = call i32 @finch_str_eq(ptr %a151, ptr %a152) + %t154 = icmp ne i32 %t153, 0 + br label %logic.from5413 +logic.from5413: + br i1 %t154, label %logic.end5415, label %logic.rhs5414 +logic.rhs5414: + %t155 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t155, ptr %a156 + store { ptr, i64, i64 } { ptr @.str.3518, i64 2, i64 0 }, ptr %a157 + %t158 = call i32 @finch_str_eq(ptr %a156, ptr %a157) + %t159 = icmp ne i32 %t158, 0 + br label %logic.rend5416 +logic.rend5416: + br label %logic.end5415 +logic.end5415: + %t160 = phi i1 [ true, %logic.from5413 ], [ %t159, %logic.rend5416 ] + br label %logic.rend5417 +logic.rend5417: + br label %logic.end5412 +logic.end5412: + %t161 = phi i1 [ false, %logic.from5410 ], [ %t160, %logic.rend5417 ] + br i1 %t161, label %then5418, label %endif5420 +then5418: + %t162 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t162, ptr %a164 + store { ptr, i64, i64 } { ptr @.str.3519, i64 31, i64 0 }, ptr %a165 + call void @finch_str_concat(ptr %a163, ptr %a164, ptr %a165) + %t166 = load { ptr, i64, i64 }, ptr %a163 + store { ptr, i64, i64 } %t166, ptr %a22 + br label %endif5420 +endif5420: + %t167 = load ptr, ptr %a1 + %t168 = load %S.ast.Node, ptr %a5 + %t169 = load { ptr, i64, i64 }, ptr %a22 + call void @finch.gen.fail(ptr %t167, %S.ast.Node %t168, { ptr, i64, i64 } %t169) + ret void +} + +define internal i1 @finch.gen.unify(ptr %p0, ptr %p1, ptr %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca ptr, align 16 + %a3 = alloca ptr, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca %S.ast.Type, align 16 + %a61 = alloca %S.ast.Type, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca %S.ast.Type, align 16 + %a104 = alloca %S.ast.Type, align 16 + %a138 = alloca %S.ast.Type, align 16 + %a139 = alloca %S.ast.Type, align 16 + %a172 = alloca %S.ast.Type, align 16 + %a173 = alloca %S.ast.Type, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store ptr %p1, ptr %a2 + store ptr %p2, ptr %a3 + %t4 = load ptr, ptr %a2 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic5421, label %ok5422 +panic5421: + call void @finch_panic(ptr @.str.3520, i64 2944, ptr @.str.3521) + unreachable +ok5422: + %t6 = getelementptr inbounds %S.gen.Val, ptr %t4, i32 0, i32 1 + %t7 = load %S.ast.Type, ptr %t6 + %t8 = load ptr, ptr %a3 + %t9 = icmp eq ptr %t8, null + br i1 %t9, label %panic5423, label %ok5424 +panic5423: + call void @finch_panic(ptr @.str.3522, i64 2944, ptr @.str.3523) + unreachable +ok5424: + %t10 = getelementptr inbounds %S.gen.Val, ptr %t8, i32 0, i32 1 + %t11 = load %S.ast.Type, ptr %t10 + %t12 = call i1 @finch.ast.same(%S.ast.Type %t7, %S.ast.Type %t11) + br i1 %t12, label %then5425, label %endif5427 +then5425: + ret i1 true +endif5427: + %t13 = load ptr, ptr %a2 + %t14 = icmp eq ptr %t13, null + br i1 %t14, label %panic5428, label %ok5429 +panic5428: + call void @finch_panic(ptr @.str.3524, i64 2947, ptr @.str.3525) + unreachable +ok5429: + %t15 = getelementptr inbounds %S.gen.Val, ptr %t13, i32 0, i32 1 + %t16 = load %S.ast.Type, ptr %t15 + %t17 = call i1 @finch.gen.isInt(%S.ast.Type %t16) + br label %logic.from5430 +logic.from5430: + br i1 %t17, label %logic.rhs5431, label %logic.end5432 +logic.rhs5431: + %t18 = load ptr, ptr %a3 + %t19 = icmp eq ptr %t18, null + br i1 %t19, label %panic5433, label %ok5434 +panic5433: + call void @finch_panic(ptr @.str.3526, i64 2947, ptr @.str.3527) + unreachable +ok5434: + %t20 = getelementptr inbounds %S.gen.Val, ptr %t18, i32 0, i32 1 + %t21 = load %S.ast.Type, ptr %t20 + %t22 = call i1 @finch.gen.isInt(%S.ast.Type %t21) + br label %logic.rend5435 +logic.rend5435: + br label %logic.end5432 +logic.end5432: + %t23 = phi i1 [ false, %logic.from5430 ], [ %t22, %logic.rend5435 ] + br i1 %t23, label %then5436, label %endif5438 +then5436: + %t24 = load ptr, ptr %a2 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic5439, label %ok5440 +panic5439: + call void @finch_panic(ptr @.str.3528, i64 2950, ptr @.str.3529) + unreachable +ok5440: + %t26 = getelementptr inbounds %S.gen.Val, ptr %t24, i32 0, i32 3 + %t27 = load i1, ptr %t26 + br label %logic.from5441 +logic.from5441: + br i1 %t27, label %logic.rhs5442, label %logic.end5443 +logic.rhs5442: + %t28 = load ptr, ptr %a3 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic5444, label %ok5445 +panic5444: + call void @finch_panic(ptr @.str.3530, i64 2950, ptr @.str.3531) + unreachable +ok5445: + %t30 = getelementptr inbounds %S.gen.Val, ptr %t28, i32 0, i32 3 + %t31 = load i1, ptr %t30 + %t32 = xor i1 %t31, true + br label %logic.rend5446 +logic.rend5446: + br label %logic.end5443 +logic.end5443: + %t33 = phi i1 [ false, %logic.from5441 ], [ %t32, %logic.rend5446 ] + br label %logic.from5447 +logic.from5447: + br i1 %t33, label %logic.rhs5448, label %logic.end5449 +logic.rhs5448: + %t34 = load ptr, ptr %a2 + %t35 = icmp eq ptr %t34, null + br i1 %t35, label %panic5450, label %ok5451 +panic5450: + call void @finch_panic(ptr @.str.3532, i64 2950, ptr @.str.3533) + unreachable +ok5451: + %t36 = getelementptr inbounds %S.gen.Val, ptr %t34, i32 0, i32 0 + %t37 = load { ptr, i64, i64 }, ptr %t36 + %t38 = load ptr, ptr %a2 + %t39 = icmp eq ptr %t38, null + br i1 %t39, label %panic5452, label %ok5453 +panic5452: + call void @finch_panic(ptr @.str.3534, i64 2950, ptr @.str.3535) + unreachable +ok5453: + %t40 = getelementptr inbounds %S.gen.Val, ptr %t38, i32 0, i32 1 + %t41 = load %S.ast.Type, ptr %t40 + %t42 = load ptr, ptr %a3 + %t43 = icmp eq ptr %t42, null + br i1 %t43, label %panic5454, label %ok5455 +panic5454: + call void @finch_panic(ptr @.str.3536, i64 2950, ptr @.str.3537) + unreachable +ok5455: + %t44 = getelementptr inbounds %S.gen.Val, ptr %t42, i32 0, i32 1 + %t45 = load %S.ast.Type, ptr %t44 + %t46 = call i1 @finch.gen.fits({ ptr, i64, i64 } %t37, %S.ast.Type %t41, %S.ast.Type %t45) + br label %logic.rend5456 +logic.rend5456: + br label %logic.end5449 +logic.end5449: + %t47 = phi i1 [ false, %logic.from5447 ], [ %t46, %logic.rend5456 ] + br i1 %t47, label %then5457, label %endif5459 +then5457: + %t48 = load ptr, ptr %a2 + %t49 = icmp eq ptr %t48, null + br i1 %t49, label %panic5460, label %ok5461 +panic5460: + call void @finch_panic(ptr @.str.3538, i64 2951, ptr @.str.3539) + unreachable +ok5461: + %t50 = getelementptr inbounds %S.gen.Val, ptr %t48, i32 0, i32 0 + %t51 = load { ptr, i64, i64 }, ptr %t50 + store { ptr, i64, i64 } %t51, ptr %a52 + call void @finch_str_copy(ptr %a53, ptr %a52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + %t55 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t54, 0 + %t56 = load ptr, ptr %a3 + %t57 = icmp eq ptr %t56, null + br i1 %t57, label %panic5462, label %ok5463 +panic5462: + call void @finch_panic(ptr @.str.3540, i64 2951, ptr @.str.3541) + unreachable +ok5463: + %t58 = getelementptr inbounds %S.gen.Val, ptr %t56, i32 0, i32 1 + %t59 = load %S.ast.Type, ptr %t58 + store %S.ast.Type %t59, ptr %a60 + call void @finch.copy.S_ast_Type(ptr %a61, ptr %a60) + %t62 = load %S.ast.Type, ptr %a61 + %t63 = insertvalue %S.gen.Val %t55, %S.ast.Type %t62, 1 + %t64 = insertvalue %S.gen.Val %t63, i1 true, 3 + %t65 = load ptr, ptr %a2 + %t66 = icmp eq ptr %t65, null + br i1 %t66, label %panic5464, label %ok5465 +panic5464: + call void @finch_panic(ptr @.str.3542, i64 2951, ptr @.str.3543) + unreachable +ok5465: + store %S.gen.Val %t64, ptr %t65 + ret i1 true +endif5459: + %t67 = load ptr, ptr %a3 + %t68 = icmp eq ptr %t67, null + br i1 %t68, label %panic5466, label %ok5467 +panic5466: + call void @finch_panic(ptr @.str.3544, i64 2954, ptr @.str.3545) + unreachable +ok5467: + %t69 = getelementptr inbounds %S.gen.Val, ptr %t67, i32 0, i32 3 + %t70 = load i1, ptr %t69 + br label %logic.from5468 +logic.from5468: + br i1 %t70, label %logic.rhs5469, label %logic.end5470 +logic.rhs5469: + %t71 = load ptr, ptr %a2 + %t72 = icmp eq ptr %t71, null + br i1 %t72, label %panic5471, label %ok5472 +panic5471: + call void @finch_panic(ptr @.str.3546, i64 2954, ptr @.str.3547) + unreachable +ok5472: + %t73 = getelementptr inbounds %S.gen.Val, ptr %t71, i32 0, i32 3 + %t74 = load i1, ptr %t73 + %t75 = xor i1 %t74, true + br label %logic.rend5473 +logic.rend5473: + br label %logic.end5470 +logic.end5470: + %t76 = phi i1 [ false, %logic.from5468 ], [ %t75, %logic.rend5473 ] + br label %logic.from5474 +logic.from5474: + br i1 %t76, label %logic.rhs5475, label %logic.end5476 +logic.rhs5475: + %t77 = load ptr, ptr %a3 + %t78 = icmp eq ptr %t77, null + br i1 %t78, label %panic5477, label %ok5478 +panic5477: + call void @finch_panic(ptr @.str.3548, i64 2954, ptr @.str.3549) + unreachable +ok5478: + %t79 = getelementptr inbounds %S.gen.Val, ptr %t77, i32 0, i32 0 + %t80 = load { ptr, i64, i64 }, ptr %t79 + %t81 = load ptr, ptr %a3 + %t82 = icmp eq ptr %t81, null + br i1 %t82, label %panic5479, label %ok5480 +panic5479: + call void @finch_panic(ptr @.str.3550, i64 2954, ptr @.str.3551) + unreachable +ok5480: + %t83 = getelementptr inbounds %S.gen.Val, ptr %t81, i32 0, i32 1 + %t84 = load %S.ast.Type, ptr %t83 + %t85 = load ptr, ptr %a2 + %t86 = icmp eq ptr %t85, null + br i1 %t86, label %panic5481, label %ok5482 +panic5481: + call void @finch_panic(ptr @.str.3552, i64 2954, ptr @.str.3553) + unreachable +ok5482: + %t87 = getelementptr inbounds %S.gen.Val, ptr %t85, i32 0, i32 1 + %t88 = load %S.ast.Type, ptr %t87 + %t89 = call i1 @finch.gen.fits({ ptr, i64, i64 } %t80, %S.ast.Type %t84, %S.ast.Type %t88) + br label %logic.rend5483 +logic.rend5483: + br label %logic.end5476 +logic.end5476: + %t90 = phi i1 [ false, %logic.from5474 ], [ %t89, %logic.rend5483 ] + br i1 %t90, label %then5484, label %endif5486 +then5484: + %t91 = load ptr, ptr %a3 + %t92 = icmp eq ptr %t91, null + br i1 %t92, label %panic5487, label %ok5488 +panic5487: + call void @finch_panic(ptr @.str.3554, i64 2955, ptr @.str.3555) + unreachable +ok5488: + %t93 = getelementptr inbounds %S.gen.Val, ptr %t91, i32 0, i32 0 + %t94 = load { ptr, i64, i64 }, ptr %t93 + store { ptr, i64, i64 } %t94, ptr %a95 + call void @finch_str_copy(ptr %a96, ptr %a95) + %t97 = load { ptr, i64, i64 }, ptr %a96 + %t98 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t97, 0 + %t99 = load ptr, ptr %a2 + %t100 = icmp eq ptr %t99, null + br i1 %t100, label %panic5489, label %ok5490 +panic5489: + call void @finch_panic(ptr @.str.3556, i64 2955, ptr @.str.3557) + unreachable +ok5490: + %t101 = getelementptr inbounds %S.gen.Val, ptr %t99, i32 0, i32 1 + %t102 = load %S.ast.Type, ptr %t101 + store %S.ast.Type %t102, ptr %a103 + call void @finch.copy.S_ast_Type(ptr %a104, ptr %a103) + %t105 = load %S.ast.Type, ptr %a104 + %t106 = insertvalue %S.gen.Val %t98, %S.ast.Type %t105, 1 + %t107 = insertvalue %S.gen.Val %t106, i1 true, 3 + %t108 = load ptr, ptr %a3 + %t109 = icmp eq ptr %t108, null + br i1 %t109, label %panic5491, label %ok5492 +panic5491: + call void @finch_panic(ptr @.str.3558, i64 2955, ptr @.str.3559) + unreachable +ok5492: + store %S.gen.Val %t107, ptr %t108 + ret i1 true +endif5486: + %t110 = load ptr, ptr %a2 + %t111 = icmp eq ptr %t110, null + br i1 %t111, label %panic5493, label %ok5494 +panic5493: + call void @finch_panic(ptr @.str.3560, i64 2958, ptr @.str.3561) + unreachable +ok5494: + %t112 = getelementptr inbounds %S.gen.Val, ptr %t110, i32 0, i32 1 + %t113 = load %S.ast.Type, ptr %t112 + %t114 = load ptr, ptr %a3 + %t115 = icmp eq ptr %t114, null + br i1 %t115, label %panic5495, label %ok5496 +panic5495: + call void @finch_panic(ptr @.str.3562, i64 2958, ptr @.str.3563) + unreachable +ok5496: + %t116 = getelementptr inbounds %S.gen.Val, ptr %t114, i32 0, i32 1 + %t117 = load %S.ast.Type, ptr %t116 + %t118 = call i1 @finch.gen.widens(%S.ast.Type %t113, %S.ast.Type %t117) + br i1 %t118, label %then5497, label %endif5499 +then5497: + %t119 = load ptr, ptr %a1 + %t120 = load ptr, ptr %a2 + %t121 = icmp eq ptr %t120, null + br i1 %t121, label %panic5500, label %ok5501 +panic5500: + call void @finch_panic(ptr @.str.3564, i64 2959, ptr @.str.3565) + unreachable +ok5501: + %t122 = getelementptr inbounds %S.gen.Val, ptr %t120, i32 0, i32 0 + %t123 = load { ptr, i64, i64 }, ptr %t122 + %t124 = load ptr, ptr %a2 + %t125 = icmp eq ptr %t124, null + br i1 %t125, label %panic5502, label %ok5503 +panic5502: + call void @finch_panic(ptr @.str.3566, i64 2959, ptr @.str.3567) + unreachable +ok5503: + %t126 = getelementptr inbounds %S.gen.Val, ptr %t124, i32 0, i32 1 + %t127 = load %S.ast.Type, ptr %t126 + %t128 = load ptr, ptr %a3 + %t129 = icmp eq ptr %t128, null + br i1 %t129, label %panic5504, label %ok5505 +panic5504: + call void @finch_panic(ptr @.str.3568, i64 2959, ptr @.str.3569) + unreachable +ok5505: + %t130 = getelementptr inbounds %S.gen.Val, ptr %t128, i32 0, i32 1 + %t131 = load %S.ast.Type, ptr %t130 + %t132 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t119, { ptr, i64, i64 } %t123, %S.ast.Type %t127, %S.ast.Type %t131) + %t133 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t132, 0 + %t134 = load ptr, ptr %a3 + %t135 = icmp eq ptr %t134, null + br i1 %t135, label %panic5506, label %ok5507 +panic5506: + call void @finch_panic(ptr @.str.3570, i64 2959, ptr @.str.3571) + unreachable +ok5507: + %t136 = getelementptr inbounds %S.gen.Val, ptr %t134, i32 0, i32 1 + %t137 = load %S.ast.Type, ptr %t136 + store %S.ast.Type %t137, ptr %a138 + call void @finch.copy.S_ast_Type(ptr %a139, ptr %a138) + %t140 = load %S.ast.Type, ptr %a139 + %t141 = insertvalue %S.gen.Val %t133, %S.ast.Type %t140, 1 + %t142 = load ptr, ptr %a2 + %t143 = icmp eq ptr %t142, null + br i1 %t143, label %panic5508, label %ok5509 +panic5508: + call void @finch_panic(ptr @.str.3572, i64 2959, ptr @.str.3573) + unreachable +ok5509: + store %S.gen.Val %t141, ptr %t142 + ret i1 true +endif5499: + %t144 = load ptr, ptr %a3 + %t145 = icmp eq ptr %t144, null + br i1 %t145, label %panic5510, label %ok5511 +panic5510: + call void @finch_panic(ptr @.str.3574, i64 2962, ptr @.str.3575) + unreachable +ok5511: + %t146 = getelementptr inbounds %S.gen.Val, ptr %t144, i32 0, i32 1 + %t147 = load %S.ast.Type, ptr %t146 + %t148 = load ptr, ptr %a2 + %t149 = icmp eq ptr %t148, null + br i1 %t149, label %panic5512, label %ok5513 +panic5512: + call void @finch_panic(ptr @.str.3576, i64 2962, ptr @.str.3577) + unreachable +ok5513: + %t150 = getelementptr inbounds %S.gen.Val, ptr %t148, i32 0, i32 1 + %t151 = load %S.ast.Type, ptr %t150 + %t152 = call i1 @finch.gen.widens(%S.ast.Type %t147, %S.ast.Type %t151) + br i1 %t152, label %then5514, label %endif5516 +then5514: + %t153 = load ptr, ptr %a1 + %t154 = load ptr, ptr %a3 + %t155 = icmp eq ptr %t154, null + br i1 %t155, label %panic5517, label %ok5518 +panic5517: + call void @finch_panic(ptr @.str.3578, i64 2963, ptr @.str.3579) + unreachable +ok5518: + %t156 = getelementptr inbounds %S.gen.Val, ptr %t154, i32 0, i32 0 + %t157 = load { ptr, i64, i64 }, ptr %t156 + %t158 = load ptr, ptr %a3 + %t159 = icmp eq ptr %t158, null + br i1 %t159, label %panic5519, label %ok5520 +panic5519: + call void @finch_panic(ptr @.str.3580, i64 2963, ptr @.str.3581) + unreachable +ok5520: + %t160 = getelementptr inbounds %S.gen.Val, ptr %t158, i32 0, i32 1 + %t161 = load %S.ast.Type, ptr %t160 + %t162 = load ptr, ptr %a2 + %t163 = icmp eq ptr %t162, null + br i1 %t163, label %panic5521, label %ok5522 +panic5521: + call void @finch_panic(ptr @.str.3582, i64 2963, ptr @.str.3583) + unreachable +ok5522: + %t164 = getelementptr inbounds %S.gen.Val, ptr %t162, i32 0, i32 1 + %t165 = load %S.ast.Type, ptr %t164 + %t166 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t153, { ptr, i64, i64 } %t157, %S.ast.Type %t161, %S.ast.Type %t165) + %t167 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t166, 0 + %t168 = load ptr, ptr %a2 + %t169 = icmp eq ptr %t168, null + br i1 %t169, label %panic5523, label %ok5524 +panic5523: + call void @finch_panic(ptr @.str.3584, i64 2963, ptr @.str.3585) + unreachable +ok5524: + %t170 = getelementptr inbounds %S.gen.Val, ptr %t168, i32 0, i32 1 + %t171 = load %S.ast.Type, ptr %t170 + store %S.ast.Type %t171, ptr %a172 + call void @finch.copy.S_ast_Type(ptr %a173, ptr %a172) + %t174 = load %S.ast.Type, ptr %a173 + %t175 = insertvalue %S.gen.Val %t167, %S.ast.Type %t174, 1 + %t176 = load ptr, ptr %a3 + %t177 = icmp eq ptr %t176, null + br i1 %t177, label %panic5525, label %ok5526 +panic5525: + call void @finch_panic(ptr @.str.3586, i64 2963, ptr @.str.3587) + unreachable +ok5526: + store %S.gen.Val %t175, ptr %t176 + ret i1 true +endif5516: + ret i1 false +endif5438: + %t178 = load ptr, ptr %a2 + %t179 = icmp eq ptr %t178, null + br i1 %t179, label %panic5527, label %ok5528 +panic5527: + call void @finch_panic(ptr @.str.3588, i64 2968, ptr @.str.3589) + unreachable +ok5528: + %t180 = getelementptr inbounds %S.gen.Val, ptr %t178, i32 0, i32 1 + %t181 = load %S.ast.Type, ptr %t180 + %t182 = call i1 @finch.gen.isInt(%S.ast.Type %t181) + br label %logic.from5529 +logic.from5529: + br i1 %t182, label %logic.rhs5530, label %logic.end5531 +logic.rhs5530: + %t183 = load ptr, ptr %a3 + %t184 = icmp eq ptr %t183, null + br i1 %t184, label %panic5532, label %ok5533 +panic5532: + call void @finch_panic(ptr @.str.3590, i64 2968, ptr @.str.3591) + unreachable +ok5533: + %t185 = getelementptr inbounds %S.gen.Val, ptr %t183, i32 0, i32 1 + %t186 = load %S.ast.Type, ptr %t185 + %t187 = call i1 @finch.gen.isFloat(%S.ast.Type %t186) + br label %logic.rend5534 +logic.rend5534: + br label %logic.end5531 +logic.end5531: + %t188 = phi i1 [ false, %logic.from5529 ], [ %t187, %logic.rend5534 ] + br i1 %t188, label %then5535, label %endif5537 +then5535: + %t189 = load ptr, ptr %a1 + %t190 = load ptr, ptr %a2 + %t191 = icmp eq ptr %t190, null + br i1 %t191, label %panic5538, label %ok5539 +panic5538: + call void @finch_panic(ptr @.str.3592, i64 2969, ptr @.str.3593) + unreachable +ok5539: + %t192 = load %S.gen.Val, ptr %t190 + %t193 = load ptr, ptr %a3 + %t194 = icmp eq ptr %t193, null + br i1 %t194, label %panic5540, label %ok5541 +panic5540: + call void @finch_panic(ptr @.str.3594, i64 2969, ptr @.str.3595) + unreachable +ok5541: + %t195 = getelementptr inbounds %S.gen.Val, ptr %t193, i32 0, i32 1 + %t196 = load %S.ast.Type, ptr %t195 + %t197 = call %S.ast.Node @finch.gen.Node0() + %t198 = call %S.gen.Val @finch.gen.coerce(ptr %t189, %S.gen.Val %t192, %S.ast.Type %t196, %S.ast.Node %t197, { ptr, i64, i64 } { ptr @.str.3596, i64 0, i64 0 }) + %t199 = load ptr, ptr %a2 + %t200 = icmp eq ptr %t199, null + br i1 %t200, label %panic5542, label %ok5543 +panic5542: + call void @finch_panic(ptr @.str.3597, i64 2969, ptr @.str.3598) + unreachable +ok5543: + store %S.gen.Val %t198, ptr %t199 + ret i1 true +endif5537: + %t201 = load ptr, ptr %a2 + %t202 = icmp eq ptr %t201, null + br i1 %t202, label %panic5544, label %ok5545 +panic5544: + call void @finch_panic(ptr @.str.3599, i64 2972, ptr @.str.3600) + unreachable +ok5545: + %t203 = getelementptr inbounds %S.gen.Val, ptr %t201, i32 0, i32 1 + %t204 = load %S.ast.Type, ptr %t203 + %t205 = call i1 @finch.gen.isFloat(%S.ast.Type %t204) + br label %logic.from5546 +logic.from5546: + br i1 %t205, label %logic.rhs5547, label %logic.end5548 +logic.rhs5547: + %t206 = load ptr, ptr %a3 + %t207 = icmp eq ptr %t206, null + br i1 %t207, label %panic5549, label %ok5550 +panic5549: + call void @finch_panic(ptr @.str.3601, i64 2972, ptr @.str.3602) + unreachable +ok5550: + %t208 = getelementptr inbounds %S.gen.Val, ptr %t206, i32 0, i32 1 + %t209 = load %S.ast.Type, ptr %t208 + %t210 = call i1 @finch.gen.isInt(%S.ast.Type %t209) + br label %logic.rend5551 +logic.rend5551: + br label %logic.end5548 +logic.end5548: + %t211 = phi i1 [ false, %logic.from5546 ], [ %t210, %logic.rend5551 ] + br i1 %t211, label %then5552, label %endif5554 +then5552: + %t212 = load ptr, ptr %a1 + %t213 = load ptr, ptr %a3 + %t214 = icmp eq ptr %t213, null + br i1 %t214, label %panic5555, label %ok5556 +panic5555: + call void @finch_panic(ptr @.str.3603, i64 2973, ptr @.str.3604) + unreachable +ok5556: + %t215 = load %S.gen.Val, ptr %t213 + %t216 = load ptr, ptr %a2 + %t217 = icmp eq ptr %t216, null + br i1 %t217, label %panic5557, label %ok5558 +panic5557: + call void @finch_panic(ptr @.str.3605, i64 2973, ptr @.str.3606) + unreachable +ok5558: + %t218 = getelementptr inbounds %S.gen.Val, ptr %t216, i32 0, i32 1 + %t219 = load %S.ast.Type, ptr %t218 + %t220 = call %S.ast.Node @finch.gen.Node0() + %t221 = call %S.gen.Val @finch.gen.coerce(ptr %t212, %S.gen.Val %t215, %S.ast.Type %t219, %S.ast.Node %t220, { ptr, i64, i64 } { ptr @.str.3607, i64 0, i64 0 }) + %t222 = load ptr, ptr %a3 + %t223 = icmp eq ptr %t222, null + br i1 %t223, label %panic5559, label %ok5560 +panic5559: + call void @finch_panic(ptr @.str.3608, i64 2973, ptr @.str.3609) + unreachable +ok5560: + store %S.gen.Val %t221, ptr %t222 + ret i1 true +endif5554: + %t224 = load ptr, ptr %a2 + %t225 = icmp eq ptr %t224, null + br i1 %t225, label %panic5561, label %ok5562 +panic5561: + call void @finch_panic(ptr @.str.3610, i64 2976, ptr @.str.3611) + unreachable +ok5562: + %t226 = getelementptr inbounds %S.gen.Val, ptr %t224, i32 0, i32 1 + %t227 = load %S.ast.Type, ptr %t226 + %t228 = call i1 @finch.gen.isFloat(%S.ast.Type %t227) + br label %logic.from5563 +logic.from5563: + br i1 %t228, label %logic.rhs5564, label %logic.end5565 +logic.rhs5564: + %t229 = load ptr, ptr %a3 + %t230 = icmp eq ptr %t229, null + br i1 %t230, label %panic5566, label %ok5567 +panic5566: + call void @finch_panic(ptr @.str.3612, i64 2976, ptr @.str.3613) + unreachable +ok5567: + %t231 = getelementptr inbounds %S.gen.Val, ptr %t229, i32 0, i32 1 + %t232 = load %S.ast.Type, ptr %t231 + %t233 = call i1 @finch.gen.isFloat(%S.ast.Type %t232) + br label %logic.rend5568 +logic.rend5568: + br label %logic.end5565 +logic.end5565: + %t234 = phi i1 [ false, %logic.from5563 ], [ %t233, %logic.rend5568 ] + br i1 %t234, label %then5569, label %endif5571 +then5569: + %t235 = load ptr, ptr %a2 + %t236 = icmp eq ptr %t235, null + br i1 %t236, label %panic5572, label %ok5573 +panic5572: + call void @finch_panic(ptr @.str.3614, i64 2977, ptr @.str.3615) + unreachable +ok5573: + %t237 = getelementptr inbounds %S.gen.Val, ptr %t235, i32 0, i32 1 + %t238 = getelementptr inbounds %S.ast.Type, ptr %t237, i32 0, i32 0 + %t239 = load { ptr, i64, i64 }, ptr %t238 + store { ptr, i64, i64 } %t239, ptr %a240 + store { ptr, i64, i64 } { ptr @.str.3616, i64 3, i64 0 }, ptr %a241 + %t242 = call i32 @finch_str_eq(ptr %a240, ptr %a241) + %t243 = icmp ne i32 %t242, 0 + br i1 %t243, label %then5574, label %endif5576 +then5574: + %t244 = load ptr, ptr %a1 + %t245 = load ptr, ptr %a2 + %t246 = icmp eq ptr %t245, null + br i1 %t246, label %panic5577, label %ok5578 +panic5577: + call void @finch_panic(ptr @.str.3617, i64 2978, ptr @.str.3618) + unreachable +ok5578: + %t247 = getelementptr inbounds %S.gen.Val, ptr %t245, i32 0, i32 0 + %t248 = load { ptr, i64, i64 }, ptr %t247 + %t249 = load ptr, ptr %a2 + %t250 = icmp eq ptr %t249, null + br i1 %t250, label %panic5579, label %ok5580 +panic5579: + call void @finch_panic(ptr @.str.3619, i64 2978, ptr @.str.3620) + unreachable +ok5580: + %t251 = getelementptr inbounds %S.gen.Val, ptr %t249, i32 0, i32 1 + %t252 = load %S.ast.Type, ptr %t251 + %t253 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3621, i64 5, i64 0 }) + %t254 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t244, { ptr, i64, i64 } %t248, %S.ast.Type %t252, %S.ast.Type %t253) + %t255 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t254, 0 + %t256 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3622, i64 5, i64 0 }) + %t257 = insertvalue %S.gen.Val %t255, %S.ast.Type %t256, 1 + %t258 = load ptr, ptr %a2 + %t259 = icmp eq ptr %t258, null + br i1 %t259, label %panic5581, label %ok5582 +panic5581: + call void @finch_panic(ptr @.str.3623, i64 2978, ptr @.str.3624) + unreachable +ok5582: + store %S.gen.Val %t257, ptr %t258 + br label %endif5576 +endif5576: + %t260 = load ptr, ptr %a3 + %t261 = icmp eq ptr %t260, null + br i1 %t261, label %panic5583, label %ok5584 +panic5583: + call void @finch_panic(ptr @.str.3625, i64 2980, ptr @.str.3626) + unreachable +ok5584: + %t262 = getelementptr inbounds %S.gen.Val, ptr %t260, i32 0, i32 1 + %t263 = getelementptr inbounds %S.ast.Type, ptr %t262, i32 0, i32 0 + %t264 = load { ptr, i64, i64 }, ptr %t263 + store { ptr, i64, i64 } %t264, ptr %a265 + store { ptr, i64, i64 } { ptr @.str.3627, i64 3, i64 0 }, ptr %a266 + %t267 = call i32 @finch_str_eq(ptr %a265, ptr %a266) + %t268 = icmp ne i32 %t267, 0 + br i1 %t268, label %then5585, label %endif5587 +then5585: + %t269 = load ptr, ptr %a1 + %t270 = load ptr, ptr %a3 + %t271 = icmp eq ptr %t270, null + br i1 %t271, label %panic5588, label %ok5589 +panic5588: + call void @finch_panic(ptr @.str.3628, i64 2981, ptr @.str.3629) + unreachable +ok5589: + %t272 = getelementptr inbounds %S.gen.Val, ptr %t270, i32 0, i32 0 + %t273 = load { ptr, i64, i64 }, ptr %t272 + %t274 = load ptr, ptr %a3 + %t275 = icmp eq ptr %t274, null + br i1 %t275, label %panic5590, label %ok5591 +panic5590: + call void @finch_panic(ptr @.str.3630, i64 2981, ptr @.str.3631) + unreachable +ok5591: + %t276 = getelementptr inbounds %S.gen.Val, ptr %t274, i32 0, i32 1 + %t277 = load %S.ast.Type, ptr %t276 + %t278 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3632, i64 5, i64 0 }) + %t279 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t269, { ptr, i64, i64 } %t273, %S.ast.Type %t277, %S.ast.Type %t278) + %t280 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t279, 0 + %t281 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3633, i64 5, i64 0 }) + %t282 = insertvalue %S.gen.Val %t280, %S.ast.Type %t281, 1 + %t283 = load ptr, ptr %a3 + %t284 = icmp eq ptr %t283, null + br i1 %t284, label %panic5592, label %ok5593 +panic5592: + call void @finch_panic(ptr @.str.3634, i64 2981, ptr @.str.3635) + unreachable +ok5593: + store %S.gen.Val %t282, ptr %t283 + br label %endif5587 +endif5587: + ret i1 true +endif5571: + ret i1 false +} + +define internal %S.ast.Node @finch.gen.Node0() { +entry: + + ret %S.ast.Node zeroinitializer +} + +define internal %S.gen.Val @finch.gen.arith(ptr %p0, { ptr, i64, i64 } %p1, %S.gen.Val %p2, %S.gen.Val %p3, %S.ast.Node %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.gen.Val, align 16 + %a4 = alloca %S.gen.Val, align 16 + %a6 = alloca %S.gen.Val, align 16 + %a7 = alloca %S.gen.Val, align 16 + %a8 = alloca %S.gen.Val, align 16 + %a10 = alloca %S.gen.Val, align 16 + %a11 = alloca %S.ast.Node, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca i64, align 16 + %a141 = alloca i64, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca i64, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a231 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca %S.ast.Type, align 16 + %a255 = alloca %S.ast.Type, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca i64, align 16 + %a288 = alloca i64, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca i64, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a335 = alloca { ptr, i64, i64 }, align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a339 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a344 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a351 = alloca %S.ast.Type, align 16 + %a352 = alloca %S.ast.Type, align 16 + %a361 = alloca %S.gen.Val, align 16 + %a362 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.gen.Val %p2, ptr %a3 + call void @finch.copy.S_gen_Val(ptr %a4, ptr %a3) + %t5 = load %S.gen.Val, ptr %a4 + store %S.gen.Val %t5, ptr %a6 + store %S.gen.Val %p3, ptr %a7 + call void @finch.copy.S_gen_Val(ptr %a8, ptr %a7) + %t9 = load %S.gen.Val, ptr %a8 + store %S.gen.Val %t9, ptr %a10 + store %S.ast.Node %p4, ptr %a11 + %t12 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.3636, i64 1, i64 0 }, ptr %a14 + %t15 = call i32 @finch_str_eq(ptr %a13, ptr %a14) + %t16 = icmp ne i32 %t15, 0 + br label %logic.from5594 +logic.from5594: + br i1 %t16, label %logic.rhs5595, label %logic.end5596 +logic.rhs5595: + %t17 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t18 = getelementptr inbounds %S.ast.Type, ptr %t17, i32 0, i32 0 + %t19 = load { ptr, i64, i64 }, ptr %t18 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.3637, i64 3, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br label %logic.rend5597 +logic.rend5597: + br label %logic.end5596 +logic.end5596: + %t24 = phi i1 [ false, %logic.from5594 ], [ %t23, %logic.rend5597 ] + br label %logic.from5598 +logic.from5598: + br i1 %t24, label %logic.rhs5599, label %logic.end5600 +logic.rhs5599: + %t25 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t26 = getelementptr inbounds %S.ast.Type, ptr %t25, i32 0, i32 0 + %t27 = load { ptr, i64, i64 }, ptr %t26 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.3638, i64 3, i64 0 }, ptr %a29 + %t30 = call i32 @finch_str_eq(ptr %a28, ptr %a29) + %t31 = icmp ne i32 %t30, 0 + br label %logic.rend5601 +logic.rend5601: + br label %logic.end5600 +logic.end5600: + %t32 = phi i1 [ false, %logic.from5598 ], [ %t31, %logic.rend5601 ] + br i1 %t32, label %then5602, label %endif5604 +then5602: + %t33 = load ptr, ptr %a1 + %t34 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t33, { ptr, i64, i64 } { ptr @.str.3639, i64 17, i64 0 }) + store { ptr, i64, i64 } %t34, ptr %a35 + %t36 = load ptr, ptr %a1 + %t37 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.3640, i64 32, i64 0 }, ptr %a39 + store { ptr, i64, i64 } %t37, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + store { ptr, i64, i64 } %t41, ptr %a43 + store { ptr, i64, i64 } { ptr @.str.3641, i64 6, i64 0 }, ptr %a44 + call void @finch_str_concat(ptr %a42, ptr %a43, ptr %a44) + %t45 = load { ptr, i64, i64 }, ptr %a42 + %t46 = load ptr, ptr %a1 + %t47 = load %S.gen.Val, ptr %a6 + %t48 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t46, %S.gen.Val %t47) + store { ptr, i64, i64 } %t45, ptr %a50 + store { ptr, i64, i64 } %t48, ptr %a51 + call void @finch_str_concat(ptr %a49, ptr %a50, ptr %a51) + %t52 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t52, ptr %a54 + store { ptr, i64, i64 } { ptr @.str.3642, i64 6, i64 0 }, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + %t57 = load ptr, ptr %a1 + %t58 = load %S.gen.Val, ptr %a10 + %t59 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t57, %S.gen.Val %t58) + store { ptr, i64, i64 } %t56, ptr %a61 + store { ptr, i64, i64 } %t59, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + store { ptr, i64, i64 } %t63, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.3643, i64 1, i64 0 }, ptr %a66 + call void @finch_str_concat(ptr %a64, ptr %a65, ptr %a66) + %t67 = load { ptr, i64, i64 }, ptr %a64 + call void @finch.gen.emit(ptr %t36, { ptr, i64, i64 } %t67) + %t68 = load ptr, ptr %a1 + %t69 = load { ptr, i64, i64 }, ptr %a35 + %t70 = call { ptr, i64, i64 } @finch.gen.load(ptr %t68, { ptr, i64, i64 } { ptr @.str.3644, i64 17, i64 0 }, { ptr, i64, i64 } %t69) + %t71 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t70, 0 + %t72 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3645, i64 3, i64 0 }) + %t73 = insertvalue %S.gen.Val %t71, %S.ast.Type %t72, 1 + %t74 = insertvalue %S.gen.Val %t73, i1 true, 2 + ret %S.gen.Val %t74 +endif5604: + %t75 = load ptr, ptr %a1 + %t76 = call i1 @finch.gen.unify(ptr %t75, ptr %a6, ptr %a10) + %t77 = xor i1 %t76, true + br i1 %t77, label %then5605, label %endif5607 +then5605: + %t78 = load ptr, ptr %a1 + %t79 = load { ptr, i64, i64 }, ptr %a2 + %t80 = load %S.gen.Val, ptr %a6 + %t81 = load %S.gen.Val, ptr %a10 + %t82 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t78, { ptr, i64, i64 } %t79, %S.gen.Val %t80, %S.gen.Val %t81, %S.ast.Node %t82) + br label %endif5607 +endif5607: + %t83 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t84 = load %S.ast.Type, ptr %t83 + %t85 = call i1 @finch.gen.isInt(%S.ast.Type %t84) + br i1 %t85, label %then5608, label %endif5610 +then5608: + %t86 = mul i64 10, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t87 = call ptr @finch_alloc(i64 %t86) + %t88 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 0 + store { ptr, i64, i64 } { ptr @.str.3646, i64 1, i64 0 }, ptr %t88 + %t89 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 1 + store { ptr, i64, i64 } { ptr @.str.3647, i64 1, i64 0 }, ptr %t89 + %t90 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 2 + store { ptr, i64, i64 } { ptr @.str.3648, i64 1, i64 0 }, ptr %t90 + %t91 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 3 + store { ptr, i64, i64 } { ptr @.str.3649, i64 1, i64 0 }, ptr %t91 + %t92 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 4 + store { ptr, i64, i64 } { ptr @.str.3650, i64 1, i64 0 }, ptr %t92 + %t93 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 5 + store { ptr, i64, i64 } { ptr @.str.3651, i64 1, i64 0 }, ptr %t93 + %t94 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 6 + store { ptr, i64, i64 } { ptr @.str.3652, i64 1, i64 0 }, ptr %t94 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 7 + store { ptr, i64, i64 } { ptr @.str.3653, i64 1, i64 0 }, ptr %t95 + %t96 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 8 + store { ptr, i64, i64 } { ptr @.str.3654, i64 2, i64 0 }, ptr %t96 + %t97 = getelementptr inbounds { ptr, i64, i64 }, ptr %t87, i64 9 + store { ptr, i64, i64 } { ptr @.str.3655, i64 2, i64 0 }, ptr %t97 + %t98 = insertvalue { ptr, i64, i64 } undef, ptr %t87, 0 + %t99 = insertvalue { ptr, i64, i64 } %t98, i64 10, 1 + %t100 = insertvalue { ptr, i64, i64 } %t99, i64 10, 2 + store { ptr, i64, i64 } %t100, ptr %a101 + %t102 = mul i64 10, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t103 = call ptr @finch_alloc(i64 %t102) + %t104 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 0 + store { ptr, i64, i64 } { ptr @.str.3656, i64 3, i64 0 }, ptr %t104 + %t105 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 1 + store { ptr, i64, i64 } { ptr @.str.3657, i64 3, i64 0 }, ptr %t105 + %t106 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 2 + store { ptr, i64, i64 } { ptr @.str.3658, i64 3, i64 0 }, ptr %t106 + %t107 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 3 + store { ptr, i64, i64 } { ptr @.str.3659, i64 4, i64 0 }, ptr %t107 + %t108 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 4 + store { ptr, i64, i64 } { ptr @.str.3660, i64 4, i64 0 }, ptr %t108 + %t109 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 5 + store { ptr, i64, i64 } { ptr @.str.3661, i64 3, i64 0 }, ptr %t109 + %t110 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 6 + store { ptr, i64, i64 } { ptr @.str.3662, i64 2, i64 0 }, ptr %t110 + %t111 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 7 + store { ptr, i64, i64 } { ptr @.str.3663, i64 3, i64 0 }, ptr %t111 + %t112 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 8 + store { ptr, i64, i64 } { ptr @.str.3664, i64 3, i64 0 }, ptr %t112 + %t113 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 9 + store { ptr, i64, i64 } { ptr @.str.3665, i64 4, i64 0 }, ptr %t113 + %t114 = insertvalue { ptr, i64, i64 } undef, ptr %t103, 0 + %t115 = insertvalue { ptr, i64, i64 } %t114, i64 10, 1 + %t116 = insertvalue { ptr, i64, i64 } %t115, i64 10, 2 + store { ptr, i64, i64 } %t116, ptr %a117 + %t118 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t119 = load %S.ast.Type, ptr %t118 + %t120 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t119) + br i1 %t120, label %then5611, label %endif5613 +then5611: + %t121 = mul i64 10, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t122 = call ptr @finch_alloc(i64 %t121) + %t123 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 0 + store { ptr, i64, i64 } { ptr @.str.3666, i64 3, i64 0 }, ptr %t123 + %t124 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 1 + store { ptr, i64, i64 } { ptr @.str.3667, i64 3, i64 0 }, ptr %t124 + %t125 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 2 + store { ptr, i64, i64 } { ptr @.str.3668, i64 3, i64 0 }, ptr %t125 + %t126 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 3 + store { ptr, i64, i64 } { ptr @.str.3669, i64 4, i64 0 }, ptr %t126 + %t127 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 4 + store { ptr, i64, i64 } { ptr @.str.3670, i64 4, i64 0 }, ptr %t127 + %t128 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 5 + store { ptr, i64, i64 } { ptr @.str.3671, i64 3, i64 0 }, ptr %t128 + %t129 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 6 + store { ptr, i64, i64 } { ptr @.str.3672, i64 2, i64 0 }, ptr %t129 + %t130 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 7 + store { ptr, i64, i64 } { ptr @.str.3673, i64 3, i64 0 }, ptr %t130 + %t131 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 8 + store { ptr, i64, i64 } { ptr @.str.3674, i64 3, i64 0 }, ptr %t131 + %t132 = getelementptr inbounds { ptr, i64, i64 }, ptr %t122, i64 9 + store { ptr, i64, i64 } { ptr @.str.3675, i64 4, i64 0 }, ptr %t132 + %t133 = insertvalue { ptr, i64, i64 } undef, ptr %t122, 0 + %t134 = insertvalue { ptr, i64, i64 } %t133, i64 10, 1 + %t135 = insertvalue { ptr, i64, i64 } %t134, i64 10, 2 + store { ptr, i64, i64 } %t135, ptr %a117 + br label %endif5613 +endif5613: + %t136 = getelementptr inbounds { ptr, i64, i64 }, ptr %a101, i32 0, i32 1 + %t137 = load { ptr, i64, i64 }, ptr %a2 + store i64 -1, ptr %a138 + %t139 = load i64, ptr %t136 + %t140 = load ptr, ptr %a101 + store i64 0, ptr %a141 + br label %find.cond5614 +find.cond5614: + %t142 = load i64, ptr %a141 + %t143 = icmp slt i64 %t142, %t139 + br i1 %t143, label %find.body5615, label %find.end5618 +find.body5615: + %t144 = getelementptr inbounds { ptr, i64, i64 }, ptr %t140, i64 %t142 + %t145 = load { ptr, i64, i64 }, ptr %t144 + store { ptr, i64, i64 } %t145, ptr %a146 + store { ptr, i64, i64 } %t137, ptr %a147 + %t148 = call i32 @finch_str_eq(ptr %a146, ptr %a147) + %t149 = icmp ne i32 %t148, 0 + br i1 %t149, label %find.hit5616, label %find.next5617 +find.hit5616: + store i64 %t142, ptr %a138 + br label %find.end5618 +find.next5617: + %t150 = add i64 %t142, 1 + store i64 %t150, ptr %a141 + br label %find.cond5614 +find.end5618: + %t151 = load i64, ptr %a138 + store i64 %t151, ptr %a152 + %t153 = load i64, ptr %a152 + %t154 = icmp slt i64 %t153, 0 + br i1 %t154, label %then5619, label %endif5621 +then5619: + %t155 = load ptr, ptr %a1 + %t156 = load { ptr, i64, i64 }, ptr %a2 + %t157 = load %S.gen.Val, ptr %a6 + %t158 = load %S.gen.Val, ptr %a10 + %t159 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t155, { ptr, i64, i64 } %t156, %S.gen.Val %t157, %S.gen.Val %t158, %S.ast.Node %t159) + br label %endif5621 +endif5621: + %t160 = load ptr, ptr %a1 + %t161 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t162 = load %S.ast.Type, ptr %t161 + %t163 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t160, %S.ast.Type %t162) + store { ptr, i64, i64 } %t163, ptr %a164 + %t165 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t165, ptr %a166 + store { ptr, i64, i64 } { ptr @.str.3676, i64 1, i64 0 }, ptr %a167 + %t168 = call i32 @finch_str_eq(ptr %a166, ptr %a167) + %t169 = icmp ne i32 %t168, 0 + br label %logic.from5622 +logic.from5622: + br i1 %t169, label %logic.end5624, label %logic.rhs5623 +logic.rhs5623: + %t170 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t170, ptr %a171 + store { ptr, i64, i64 } { ptr @.str.3677, i64 1, i64 0 }, ptr %a172 + %t173 = call i32 @finch_str_eq(ptr %a171, ptr %a172) + %t174 = icmp ne i32 %t173, 0 + br label %logic.rend5625 +logic.rend5625: + br label %logic.end5624 +logic.end5624: + %t175 = phi i1 [ true, %logic.from5622 ], [ %t174, %logic.rend5625 ] + br i1 %t175, label %then5626, label %endif5628 +then5626: + %t176 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 3 + %t177 = load i1, ptr %t176 + br label %logic.from5629 +logic.from5629: + br i1 %t177, label %logic.rhs5630, label %logic.end5631 +logic.rhs5630: + %t178 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t179 = load { ptr, i64, i64 }, ptr %t178 + store { ptr, i64, i64 } %t179, ptr %a180 + store { ptr, i64, i64 } { ptr @.str.3678, i64 1, i64 0 }, ptr %a181 + %t182 = call i32 @finch_str_eq(ptr %a180, ptr %a181) + %t183 = icmp ne i32 %t182, 0 + br label %logic.rend5632 +logic.rend5632: + br label %logic.end5631 +logic.end5631: + %t184 = phi i1 [ false, %logic.from5629 ], [ %t183, %logic.rend5632 ] + br i1 %t184, label %then5633, label %endif5635 +then5633: + %t185 = load ptr, ptr %a1 + %t186 = load %S.ast.Node, ptr %a11 + call void @finch.gen.fail(ptr %t185, %S.ast.Node %t186, { ptr, i64, i64 } { ptr @.str.3679, i64 16, i64 0 }) + br label %endif5635 +endif5635: + %t187 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 3 + %t188 = load i1, ptr %t187 + %t189 = xor i1 %t188, true + br i1 %t189, label %then5636, label %endif5638 +then5636: + %t190 = load ptr, ptr %a1 + %t191 = load ptr, ptr %a1 + %t192 = load { ptr, i64, i64 }, ptr %a164 + store { ptr, i64, i64 } { ptr @.str.3680, i64 8, i64 0 }, ptr %a194 + store { ptr, i64, i64 } %t192, ptr %a195 + call void @finch_str_concat(ptr %a193, ptr %a194, ptr %a195) + %t196 = load { ptr, i64, i64 }, ptr %a193 + store { ptr, i64, i64 } %t196, ptr %a198 + store { ptr, i64, i64 } { ptr @.str.3681, i64 1, i64 0 }, ptr %a199 + call void @finch_str_concat(ptr %a197, ptr %a198, ptr %a199) + %t200 = load { ptr, i64, i64 }, ptr %a197 + %t201 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t202 = load { ptr, i64, i64 }, ptr %t201 + store { ptr, i64, i64 } %t200, ptr %a204 + store { ptr, i64, i64 } %t202, ptr %a205 + call void @finch_str_concat(ptr %a203, ptr %a204, ptr %a205) + %t206 = load { ptr, i64, i64 }, ptr %a203 + store { ptr, i64, i64 } %t206, ptr %a208 + store { ptr, i64, i64 } { ptr @.str.3682, i64 3, i64 0 }, ptr %a209 + call void @finch_str_concat(ptr %a207, ptr %a208, ptr %a209) + %t210 = load { ptr, i64, i64 }, ptr %a207 + %t211 = call { ptr, i64, i64 } @finch.gen.op(ptr %t191, { ptr, i64, i64 } %t210) + %t212 = load %S.ast.Node, ptr %a11 + call void @finch.gen.panicIf(ptr %t190, { ptr, i64, i64 } %t211, { ptr, i64, i64 } { ptr @.str.3683, i64 16, i64 0 }, %S.ast.Node %t212) + br label %endif5638 +endif5638: + br label %endif5628 +endif5628: + %t213 = load ptr, ptr %a1 + %t214 = load i64, ptr %a152 + %t215 = load { ptr, i64, i64 }, ptr %a117 + %t216 = extractvalue { ptr, i64, i64 } %t215, 1 + %t217 = icmp uge i64 %t214, %t216 + br i1 %t217, label %range5639, label %inrange5640 +range5639: + call void @finch_panic_index(ptr @.str.3684, i64 3020, i64 %t214, i64 %t216) + unreachable +inrange5640: + %t218 = extractvalue { ptr, i64, i64 } %t215, 0 + %t219 = getelementptr inbounds { ptr, i64, i64 }, ptr %t218, i64 %t214 + %t220 = load { ptr, i64, i64 }, ptr %t219 + store { ptr, i64, i64 } %t220, ptr %a222 + store { ptr, i64, i64 } { ptr @.str.3685, i64 1, i64 0 }, ptr %a223 + call void @finch_str_concat(ptr %a221, ptr %a222, ptr %a223) + %t224 = load { ptr, i64, i64 }, ptr %a221 + %t225 = load { ptr, i64, i64 }, ptr %a164 + store { ptr, i64, i64 } %t224, ptr %a227 + store { ptr, i64, i64 } %t225, ptr %a228 + call void @finch_str_concat(ptr %a226, ptr %a227, ptr %a228) + %t229 = load { ptr, i64, i64 }, ptr %a226 + store { ptr, i64, i64 } %t229, ptr %a231 + store { ptr, i64, i64 } { ptr @.str.3686, i64 1, i64 0 }, ptr %a232 + call void @finch_str_concat(ptr %a230, ptr %a231, ptr %a232) + %t233 = load { ptr, i64, i64 }, ptr %a230 + %t234 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 0 + %t235 = load { ptr, i64, i64 }, ptr %t234 + store { ptr, i64, i64 } %t233, ptr %a237 + store { ptr, i64, i64 } %t235, ptr %a238 + call void @finch_str_concat(ptr %a236, ptr %a237, ptr %a238) + %t239 = load { ptr, i64, i64 }, ptr %a236 + store { ptr, i64, i64 } %t239, ptr %a241 + store { ptr, i64, i64 } { ptr @.str.3687, i64 2, i64 0 }, ptr %a242 + call void @finch_str_concat(ptr %a240, ptr %a241, ptr %a242) + %t243 = load { ptr, i64, i64 }, ptr %a240 + %t244 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t245 = load { ptr, i64, i64 }, ptr %t244 + store { ptr, i64, i64 } %t243, ptr %a247 + store { ptr, i64, i64 } %t245, ptr %a248 + call void @finch_str_concat(ptr %a246, ptr %a247, ptr %a248) + %t249 = load { ptr, i64, i64 }, ptr %a246 + %t250 = call { ptr, i64, i64 } @finch.gen.op(ptr %t213, { ptr, i64, i64 } %t249) + %t251 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t250, 0 + %t252 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t253 = load %S.ast.Type, ptr %t252 + store %S.ast.Type %t253, ptr %a254 + call void @finch.copy.S_ast_Type(ptr %a255, ptr %a254) + %t256 = load %S.ast.Type, ptr %a255 + %t257 = insertvalue %S.gen.Val %t251, %S.ast.Type %t256, 1 + ret %S.gen.Val %t257 +endif5610: + %t258 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t259 = load %S.ast.Type, ptr %t258 + %t260 = call i1 @finch.gen.isFloat(%S.ast.Type %t259) + br i1 %t260, label %then5641, label %endif5643 +then5641: + %t261 = mul i64 5, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t262 = call ptr @finch_alloc(i64 %t261) + %t263 = getelementptr inbounds { ptr, i64, i64 }, ptr %t262, i64 0 + store { ptr, i64, i64 } { ptr @.str.3688, i64 1, i64 0 }, ptr %t263 + %t264 = getelementptr inbounds { ptr, i64, i64 }, ptr %t262, i64 1 + store { ptr, i64, i64 } { ptr @.str.3689, i64 1, i64 0 }, ptr %t264 + %t265 = getelementptr inbounds { ptr, i64, i64 }, ptr %t262, i64 2 + store { ptr, i64, i64 } { ptr @.str.3690, i64 1, i64 0 }, ptr %t265 + %t266 = getelementptr inbounds { ptr, i64, i64 }, ptr %t262, i64 3 + store { ptr, i64, i64 } { ptr @.str.3691, i64 1, i64 0 }, ptr %t266 + %t267 = getelementptr inbounds { ptr, i64, i64 }, ptr %t262, i64 4 + store { ptr, i64, i64 } { ptr @.str.3692, i64 1, i64 0 }, ptr %t267 + %t268 = insertvalue { ptr, i64, i64 } undef, ptr %t262, 0 + %t269 = insertvalue { ptr, i64, i64 } %t268, i64 5, 1 + %t270 = insertvalue { ptr, i64, i64 } %t269, i64 5, 2 + store { ptr, i64, i64 } %t270, ptr %a271 + %t272 = mul i64 5, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t273 = call ptr @finch_alloc(i64 %t272) + %t274 = getelementptr inbounds { ptr, i64, i64 }, ptr %t273, i64 0 + store { ptr, i64, i64 } { ptr @.str.3693, i64 4, i64 0 }, ptr %t274 + %t275 = getelementptr inbounds { ptr, i64, i64 }, ptr %t273, i64 1 + store { ptr, i64, i64 } { ptr @.str.3694, i64 4, i64 0 }, ptr %t275 + %t276 = getelementptr inbounds { ptr, i64, i64 }, ptr %t273, i64 2 + store { ptr, i64, i64 } { ptr @.str.3695, i64 4, i64 0 }, ptr %t276 + %t277 = getelementptr inbounds { ptr, i64, i64 }, ptr %t273, i64 3 + store { ptr, i64, i64 } { ptr @.str.3696, i64 4, i64 0 }, ptr %t277 + %t278 = getelementptr inbounds { ptr, i64, i64 }, ptr %t273, i64 4 + store { ptr, i64, i64 } { ptr @.str.3697, i64 4, i64 0 }, ptr %t278 + %t279 = insertvalue { ptr, i64, i64 } undef, ptr %t273, 0 + %t280 = insertvalue { ptr, i64, i64 } %t279, i64 5, 1 + %t281 = insertvalue { ptr, i64, i64 } %t280, i64 5, 2 + store { ptr, i64, i64 } %t281, ptr %a282 + %t283 = getelementptr inbounds { ptr, i64, i64 }, ptr %a271, i32 0, i32 1 + %t284 = load { ptr, i64, i64 }, ptr %a2 + store i64 -1, ptr %a285 + %t286 = load i64, ptr %t283 + %t287 = load ptr, ptr %a271 + store i64 0, ptr %a288 + br label %find.cond5644 +find.cond5644: + %t289 = load i64, ptr %a288 + %t290 = icmp slt i64 %t289, %t286 + br i1 %t290, label %find.body5645, label %find.end5648 +find.body5645: + %t291 = getelementptr inbounds { ptr, i64, i64 }, ptr %t287, i64 %t289 + %t292 = load { ptr, i64, i64 }, ptr %t291 + store { ptr, i64, i64 } %t292, ptr %a293 + store { ptr, i64, i64 } %t284, ptr %a294 + %t295 = call i32 @finch_str_eq(ptr %a293, ptr %a294) + %t296 = icmp ne i32 %t295, 0 + br i1 %t296, label %find.hit5646, label %find.next5647 +find.hit5646: + store i64 %t289, ptr %a285 + br label %find.end5648 +find.next5647: + %t297 = add i64 %t289, 1 + store i64 %t297, ptr %a288 + br label %find.cond5644 +find.end5648: + %t298 = load i64, ptr %a285 + store i64 %t298, ptr %a299 + %t300 = load i64, ptr %a299 + %t301 = icmp slt i64 %t300, 0 + br i1 %t301, label %then5649, label %endif5651 +then5649: + %t302 = load ptr, ptr %a1 + %t303 = load { ptr, i64, i64 }, ptr %a2 + %t304 = load %S.gen.Val, ptr %a6 + %t305 = load %S.gen.Val, ptr %a10 + %t306 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t302, { ptr, i64, i64 } %t303, %S.gen.Val %t304, %S.gen.Val %t305, %S.ast.Node %t306) + br label %endif5651 +endif5651: + %t307 = load ptr, ptr %a1 + %t308 = load i64, ptr %a299 + %t309 = load { ptr, i64, i64 }, ptr %a282 + %t310 = extractvalue { ptr, i64, i64 } %t309, 1 + %t311 = icmp uge i64 %t308, %t310 + br i1 %t311, label %range5652, label %inrange5653 +range5652: + call void @finch_panic_index(ptr @.str.3698, i64 3029, i64 %t308, i64 %t310) + unreachable +inrange5653: + %t312 = extractvalue { ptr, i64, i64 } %t309, 0 + %t313 = getelementptr inbounds { ptr, i64, i64 }, ptr %t312, i64 %t308 + %t314 = load { ptr, i64, i64 }, ptr %t313 + store { ptr, i64, i64 } %t314, ptr %a316 + store { ptr, i64, i64 } { ptr @.str.3699, i64 1, i64 0 }, ptr %a317 + call void @finch_str_concat(ptr %a315, ptr %a316, ptr %a317) + %t318 = load { ptr, i64, i64 }, ptr %a315 + %t319 = load ptr, ptr %a1 + %t320 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t321 = load %S.ast.Type, ptr %t320 + %t322 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t319, %S.ast.Type %t321) + store { ptr, i64, i64 } %t318, ptr %a324 + store { ptr, i64, i64 } %t322, ptr %a325 + call void @finch_str_concat(ptr %a323, ptr %a324, ptr %a325) + %t326 = load { ptr, i64, i64 }, ptr %a323 + store { ptr, i64, i64 } %t326, ptr %a328 + store { ptr, i64, i64 } { ptr @.str.3700, i64 1, i64 0 }, ptr %a329 + call void @finch_str_concat(ptr %a327, ptr %a328, ptr %a329) + %t330 = load { ptr, i64, i64 }, ptr %a327 + %t331 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 0 + %t332 = load { ptr, i64, i64 }, ptr %t331 + store { ptr, i64, i64 } %t330, ptr %a334 + store { ptr, i64, i64 } %t332, ptr %a335 + call void @finch_str_concat(ptr %a333, ptr %a334, ptr %a335) + %t336 = load { ptr, i64, i64 }, ptr %a333 + store { ptr, i64, i64 } %t336, ptr %a338 + store { ptr, i64, i64 } { ptr @.str.3701, i64 2, i64 0 }, ptr %a339 + call void @finch_str_concat(ptr %a337, ptr %a338, ptr %a339) + %t340 = load { ptr, i64, i64 }, ptr %a337 + %t341 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t342 = load { ptr, i64, i64 }, ptr %t341 + store { ptr, i64, i64 } %t340, ptr %a344 + store { ptr, i64, i64 } %t342, ptr %a345 + call void @finch_str_concat(ptr %a343, ptr %a344, ptr %a345) + %t346 = load { ptr, i64, i64 }, ptr %a343 + %t347 = call { ptr, i64, i64 } @finch.gen.op(ptr %t307, { ptr, i64, i64 } %t346) + %t348 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t347, 0 + %t349 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t350 = load %S.ast.Type, ptr %t349 + store %S.ast.Type %t350, ptr %a351 + call void @finch.copy.S_ast_Type(ptr %a352, ptr %a351) + %t353 = load %S.ast.Type, ptr %a352 + %t354 = insertvalue %S.gen.Val %t348, %S.ast.Type %t353, 1 + ret %S.gen.Val %t354 +endif5643: + %t355 = load ptr, ptr %a1 + %t356 = load { ptr, i64, i64 }, ptr %a2 + %t357 = load %S.gen.Val, ptr %a6 + %t358 = load %S.gen.Val, ptr %a10 + %t359 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t355, { ptr, i64, i64 } %t356, %S.gen.Val %t357, %S.gen.Val %t358, %S.ast.Node %t359) + %t360 = load %S.gen.Val, ptr %a6 + store %S.gen.Val %t360, ptr %a361 + call void @finch.copy.S_gen_Val(ptr %a362, ptr %a361) + %t363 = load %S.gen.Val, ptr %a362 + ret %S.gen.Val %t363 +} + +define internal %S.gen.Val @finch.gen.compare(ptr %p0, { ptr, i64, i64 } %p1, %S.gen.Val %p2, %S.gen.Val %p3, %S.ast.Node %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.gen.Val, align 16 + %a4 = alloca %S.gen.Val, align 16 + %a6 = alloca %S.gen.Val, align 16 + %a7 = alloca %S.gen.Val, align 16 + %a8 = alloca %S.gen.Val, align 16 + %a10 = alloca %S.gen.Val, align 16 + %a11 = alloca %S.ast.Node, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca i1, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca i64, align 16 + %a282 = alloca i64, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a301 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a348 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a351 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a360 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a372 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a377 = alloca { ptr, i64, i64 }, align 16 + %a378 = alloca { ptr, i64, i64 }, align 16 + %a385 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a403 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + %a438 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a441 = alloca { ptr, i64, i64 }, align 16 + %a442 = alloca { ptr, i64, i64 }, align 16 + %a446 = alloca { ptr, i64, i64 }, align 16 + %a447 = alloca { ptr, i64, i64 }, align 16 + %a448 = alloca { ptr, i64, i64 }, align 16 + %a450 = alloca { ptr, i64, i64 }, align 16 + %a451 = alloca { ptr, i64, i64 }, align 16 + %a452 = alloca { ptr, i64, i64 }, align 16 + %a456 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a458 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.gen.Val %p2, ptr %a3 + call void @finch.copy.S_gen_Val(ptr %a4, ptr %a3) + %t5 = load %S.gen.Val, ptr %a4 + store %S.gen.Val %t5, ptr %a6 + store %S.gen.Val %p3, ptr %a7 + call void @finch.copy.S_gen_Val(ptr %a8, ptr %a7) + %t9 = load %S.gen.Val, ptr %a8 + store %S.gen.Val %t9, ptr %a10 + store %S.ast.Node %p4, ptr %a11 + %t12 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.3702, i64 2, i64 0 }, ptr %a14 + %t15 = call i32 @finch_str_eq(ptr %a13, ptr %a14) + %t16 = icmp ne i32 %t15, 0 + br label %logic.from5654 +logic.from5654: + br i1 %t16, label %logic.end5656, label %logic.rhs5655 +logic.rhs5655: + %t17 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t17, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.3703, i64 2, i64 0 }, ptr %a19 + %t20 = call i32 @finch_str_eq(ptr %a18, ptr %a19) + %t21 = icmp ne i32 %t20, 0 + br label %logic.rend5657 +logic.rend5657: + br label %logic.end5656 +logic.end5656: + %t22 = phi i1 [ true, %logic.from5654 ], [ %t21, %logic.rend5657 ] + store i1 %t22, ptr %a23 + %t24 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t25 = getelementptr inbounds %S.ast.Type, ptr %t24, i32 0, i32 0 + %t26 = load { ptr, i64, i64 }, ptr %t25 + store { ptr, i64, i64 } %t26, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.3704, i64 3, i64 0 }, ptr %a28 + %t29 = call i32 @finch_str_eq(ptr %a27, ptr %a28) + %t30 = icmp ne i32 %t29, 0 + br label %logic.from5658 +logic.from5658: + br i1 %t30, label %logic.end5660, label %logic.rhs5659 +logic.rhs5659: + %t31 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t32 = getelementptr inbounds %S.ast.Type, ptr %t31, i32 0, i32 0 + %t33 = load { ptr, i64, i64 }, ptr %t32 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.3705, i64 3, i64 0 }, ptr %a35 + %t36 = call i32 @finch_str_eq(ptr %a34, ptr %a35) + %t37 = icmp ne i32 %t36, 0 + br label %logic.rend5661 +logic.rend5661: + br label %logic.end5660 +logic.end5660: + %t38 = phi i1 [ true, %logic.from5658 ], [ %t37, %logic.rend5661 ] + br label %logic.from5662 +logic.from5662: + br i1 %t38, label %logic.end5664, label %logic.rhs5663 +logic.rhs5663: + %t39 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t40 = getelementptr inbounds %S.ast.Type, ptr %t39, i32 0, i32 0 + %t41 = load { ptr, i64, i64 }, ptr %t40 + store { ptr, i64, i64 } %t41, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.3706, i64 4, i64 0 }, ptr %a43 + %t44 = call i32 @finch_str_eq(ptr %a42, ptr %a43) + %t45 = icmp ne i32 %t44, 0 + br label %logic.rend5665 +logic.rend5665: + br label %logic.end5664 +logic.end5664: + %t46 = phi i1 [ true, %logic.from5662 ], [ %t45, %logic.rend5665 ] + br label %logic.from5666 +logic.from5666: + br i1 %t46, label %logic.end5668, label %logic.rhs5667 +logic.rhs5667: + %t47 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t48 = getelementptr inbounds %S.ast.Type, ptr %t47, i32 0, i32 0 + %t49 = load { ptr, i64, i64 }, ptr %t48 + store { ptr, i64, i64 } %t49, ptr %a50 + store { ptr, i64, i64 } { ptr @.str.3707, i64 4, i64 0 }, ptr %a51 + %t52 = call i32 @finch_str_eq(ptr %a50, ptr %a51) + %t53 = icmp ne i32 %t52, 0 + br label %logic.rend5669 +logic.rend5669: + br label %logic.end5668 +logic.end5668: + %t54 = phi i1 [ true, %logic.from5666 ], [ %t53, %logic.rend5669 ] + br i1 %t54, label %then5670, label %endif5672 +then5670: + %t55 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t56 = getelementptr inbounds %S.ast.Type, ptr %t55, i32 0, i32 0 + %t57 = load { ptr, i64, i64 }, ptr %t56 + store { ptr, i64, i64 } %t57, ptr %a58 + store { ptr, i64, i64 } { ptr @.str.3708, i64 3, i64 0 }, ptr %a59 + %t60 = call i32 @finch_str_eq(ptr %a58, ptr %a59) + %t61 = icmp ne i32 %t60, 0 + br label %logic.from5673 +logic.from5673: + br i1 %t61, label %logic.end5675, label %logic.rhs5674 +logic.rhs5674: + %t62 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t63 = getelementptr inbounds %S.ast.Type, ptr %t62, i32 0, i32 0 + %t64 = load { ptr, i64, i64 }, ptr %t63 + store { ptr, i64, i64 } %t64, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.3709, i64 3, i64 0 }, ptr %a66 + %t67 = call i32 @finch_str_eq(ptr %a65, ptr %a66) + %t68 = icmp ne i32 %t67, 0 + br label %logic.rend5676 +logic.rend5676: + br label %logic.end5675 +logic.end5675: + %t69 = phi i1 [ true, %logic.from5673 ], [ %t68, %logic.rend5676 ] + br i1 %t69, label %then5677, label %endif5679 +then5677: + %t70 = load ptr, ptr %a1 + %t71 = load %S.ast.Node, ptr %a11 + call void @finch.gen.fail(ptr %t70, %S.ast.Node %t71, { ptr, i64, i64 } { ptr @.str.3710, i64 59, i64 0 }) + br label %endif5679 +endif5679: + %t72 = load i1, ptr %a23 + %t73 = xor i1 %t72, true + br i1 %t73, label %then5680, label %endif5682 +then5680: + %t74 = load ptr, ptr %a1 + %t75 = load { ptr, i64, i64 }, ptr %a2 + %t76 = load %S.gen.Val, ptr %a6 + %t77 = load %S.gen.Val, ptr %a10 + %t78 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t74, { ptr, i64, i64 } %t75, %S.gen.Val %t76, %S.gen.Val %t77, %S.ast.Node %t78) + br label %endif5682 +endif5682: + store { ptr, i64, i64 } { ptr @.str.3711, i64 2, i64 0 }, ptr %a79 + %t80 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t80, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.3712, i64 2, i64 0 }, ptr %a82 + %t83 = call i32 @finch_str_eq(ptr %a81, ptr %a82) + %t84 = icmp ne i32 %t83, 0 + br i1 %t84, label %then5683, label %endif5685 +then5683: + store { ptr, i64, i64 } { ptr @.str.3713, i64 2, i64 0 }, ptr %a79 + br label %endif5685 +endif5685: + %t85 = load ptr, ptr %a1 + %t86 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.3714, i64 5, i64 0 }, ptr %a88 + store { ptr, i64, i64 } %t86, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t90, ptr %a92 + store { ptr, i64, i64 } { ptr @.str.3715, i64 5, i64 0 }, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + %t95 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 0 + %t96 = load { ptr, i64, i64 }, ptr %t95 + store { ptr, i64, i64 } %t94, ptr %a98 + store { ptr, i64, i64 } %t96, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + store { ptr, i64, i64 } %t100, ptr %a102 + store { ptr, i64, i64 } { ptr @.str.3716, i64 2, i64 0 }, ptr %a103 + call void @finch_str_concat(ptr %a101, ptr %a102, ptr %a103) + %t104 = load { ptr, i64, i64 }, ptr %a101 + %t105 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t106 = load { ptr, i64, i64 }, ptr %t105 + store { ptr, i64, i64 } %t104, ptr %a108 + store { ptr, i64, i64 } %t106, ptr %a109 + call void @finch_str_concat(ptr %a107, ptr %a108, ptr %a109) + %t110 = load { ptr, i64, i64 }, ptr %a107 + %t111 = call { ptr, i64, i64 } @finch.gen.op(ptr %t85, { ptr, i64, i64 } %t110) + %t112 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t111, 0 + %t113 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3717, i64 4, i64 0 }) + %t114 = insertvalue %S.gen.Val %t112, %S.ast.Type %t113, 1 + ret %S.gen.Val %t114 +endif5672: + %t115 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t116 = getelementptr inbounds %S.ast.Type, ptr %t115, i32 0, i32 0 + %t117 = load { ptr, i64, i64 }, ptr %t116 + store { ptr, i64, i64 } %t117, ptr %a118 + store { ptr, i64, i64 } { ptr @.str.3718, i64 3, i64 0 }, ptr %a119 + %t120 = call i32 @finch_str_eq(ptr %a118, ptr %a119) + %t121 = icmp ne i32 %t120, 0 + br label %logic.from5686 +logic.from5686: + br i1 %t121, label %logic.rhs5687, label %logic.end5688 +logic.rhs5687: + %t122 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 1 + %t123 = getelementptr inbounds %S.ast.Type, ptr %t122, i32 0, i32 0 + %t124 = load { ptr, i64, i64 }, ptr %t123 + store { ptr, i64, i64 } %t124, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.3719, i64 3, i64 0 }, ptr %a126 + %t127 = call i32 @finch_str_eq(ptr %a125, ptr %a126) + %t128 = icmp ne i32 %t127, 0 + br label %logic.rend5689 +logic.rend5689: + br label %logic.end5688 +logic.end5688: + %t129 = phi i1 [ false, %logic.from5686 ], [ %t128, %logic.rend5689 ] + br i1 %t129, label %then5690, label %endif5692 +then5690: + %t130 = load i1, ptr %a23 + br i1 %t130, label %then5693, label %endif5695 +then5693: + %t131 = load ptr, ptr %a1 + %t132 = load ptr, ptr %a1 + %t133 = load %S.gen.Val, ptr %a6 + %t134 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t132, %S.gen.Val %t133) + store { ptr, i64, i64 } { ptr @.str.3720, i64 27, i64 0 }, ptr %a136 + store { ptr, i64, i64 } %t134, ptr %a137 + call void @finch_str_concat(ptr %a135, ptr %a136, ptr %a137) + %t138 = load { ptr, i64, i64 }, ptr %a135 + store { ptr, i64, i64 } %t138, ptr %a140 + store { ptr, i64, i64 } { ptr @.str.3721, i64 6, i64 0 }, ptr %a141 + call void @finch_str_concat(ptr %a139, ptr %a140, ptr %a141) + %t142 = load { ptr, i64, i64 }, ptr %a139 + %t143 = load ptr, ptr %a1 + %t144 = load %S.gen.Val, ptr %a10 + %t145 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t143, %S.gen.Val %t144) + store { ptr, i64, i64 } %t142, ptr %a147 + store { ptr, i64, i64 } %t145, ptr %a148 + call void @finch_str_concat(ptr %a146, ptr %a147, ptr %a148) + %t149 = load { ptr, i64, i64 }, ptr %a146 + store { ptr, i64, i64 } %t149, ptr %a151 + store { ptr, i64, i64 } { ptr @.str.3722, i64 1, i64 0 }, ptr %a152 + call void @finch_str_concat(ptr %a150, ptr %a151, ptr %a152) + %t153 = load { ptr, i64, i64 }, ptr %a150 + %t154 = call { ptr, i64, i64 } @finch.gen.op(ptr %t131, { ptr, i64, i64 } %t153) + store { ptr, i64, i64 } %t154, ptr %a155 + store { ptr, i64, i64 } { ptr @.str.3723, i64 2, i64 0 }, ptr %a156 + %t157 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t157, ptr %a158 + store { ptr, i64, i64 } { ptr @.str.3724, i64 2, i64 0 }, ptr %a159 + %t160 = call i32 @finch_str_eq(ptr %a158, ptr %a159) + %t161 = icmp ne i32 %t160, 0 + br i1 %t161, label %then5696, label %endif5698 +then5696: + store { ptr, i64, i64 } { ptr @.str.3725, i64 2, i64 0 }, ptr %a156 + br label %endif5698 +endif5698: + %t162 = load ptr, ptr %a1 + %t163 = load { ptr, i64, i64 }, ptr %a156 + store { ptr, i64, i64 } { ptr @.str.3726, i64 5, i64 0 }, ptr %a165 + store { ptr, i64, i64 } %t163, ptr %a166 + call void @finch_str_concat(ptr %a164, ptr %a165, ptr %a166) + %t167 = load { ptr, i64, i64 }, ptr %a164 + store { ptr, i64, i64 } %t167, ptr %a169 + store { ptr, i64, i64 } { ptr @.str.3727, i64 5, i64 0 }, ptr %a170 + call void @finch_str_concat(ptr %a168, ptr %a169, ptr %a170) + %t171 = load { ptr, i64, i64 }, ptr %a168 + %t172 = load { ptr, i64, i64 }, ptr %a155 + store { ptr, i64, i64 } %t171, ptr %a174 + store { ptr, i64, i64 } %t172, ptr %a175 + call void @finch_str_concat(ptr %a173, ptr %a174, ptr %a175) + %t176 = load { ptr, i64, i64 }, ptr %a173 + store { ptr, i64, i64 } %t176, ptr %a178 + store { ptr, i64, i64 } { ptr @.str.3728, i64 3, i64 0 }, ptr %a179 + call void @finch_str_concat(ptr %a177, ptr %a178, ptr %a179) + %t180 = load { ptr, i64, i64 }, ptr %a177 + %t181 = call { ptr, i64, i64 } @finch.gen.op(ptr %t162, { ptr, i64, i64 } %t180) + %t182 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t181, 0 + %t183 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3729, i64 4, i64 0 }) + %t184 = insertvalue %S.gen.Val %t182, %S.ast.Type %t183, 1 + ret %S.gen.Val %t184 +endif5695: + %t185 = load ptr, ptr %a1 + %t186 = load ptr, ptr %a1 + %t187 = load %S.gen.Val, ptr %a6 + %t188 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t186, %S.gen.Val %t187) + store { ptr, i64, i64 } { ptr @.str.3730, i64 28, i64 0 }, ptr %a190 + store { ptr, i64, i64 } %t188, ptr %a191 + call void @finch_str_concat(ptr %a189, ptr %a190, ptr %a191) + %t192 = load { ptr, i64, i64 }, ptr %a189 + store { ptr, i64, i64 } %t192, ptr %a194 + store { ptr, i64, i64 } { ptr @.str.3731, i64 6, i64 0 }, ptr %a195 + call void @finch_str_concat(ptr %a193, ptr %a194, ptr %a195) + %t196 = load { ptr, i64, i64 }, ptr %a193 + %t197 = load ptr, ptr %a1 + %t198 = load %S.gen.Val, ptr %a10 + %t199 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t197, %S.gen.Val %t198) + store { ptr, i64, i64 } %t196, ptr %a201 + store { ptr, i64, i64 } %t199, ptr %a202 + call void @finch_str_concat(ptr %a200, ptr %a201, ptr %a202) + %t203 = load { ptr, i64, i64 }, ptr %a200 + store { ptr, i64, i64 } %t203, ptr %a205 + store { ptr, i64, i64 } { ptr @.str.3732, i64 1, i64 0 }, ptr %a206 + call void @finch_str_concat(ptr %a204, ptr %a205, ptr %a206) + %t207 = load { ptr, i64, i64 }, ptr %a204 + %t208 = call { ptr, i64, i64 } @finch.gen.op(ptr %t185, { ptr, i64, i64 } %t207) + store { ptr, i64, i64 } %t208, ptr %a209 + %t210 = load ptr, ptr %a1 + %t211 = load { ptr, i64, i64 }, ptr %a2 + %t212 = call { ptr, i64, i64 } @finch.gen.intPred({ ptr, i64, i64 } %t211, i1 true) + store { ptr, i64, i64 } { ptr @.str.3733, i64 5, i64 0 }, ptr %a214 + store { ptr, i64, i64 } %t212, ptr %a215 + call void @finch_str_concat(ptr %a213, ptr %a214, ptr %a215) + %t216 = load { ptr, i64, i64 }, ptr %a213 + store { ptr, i64, i64 } %t216, ptr %a218 + store { ptr, i64, i64 } { ptr @.str.3734, i64 5, i64 0 }, ptr %a219 + call void @finch_str_concat(ptr %a217, ptr %a218, ptr %a219) + %t220 = load { ptr, i64, i64 }, ptr %a217 + %t221 = load { ptr, i64, i64 }, ptr %a209 + store { ptr, i64, i64 } %t220, ptr %a223 + store { ptr, i64, i64 } %t221, ptr %a224 + call void @finch_str_concat(ptr %a222, ptr %a223, ptr %a224) + %t225 = load { ptr, i64, i64 }, ptr %a222 + store { ptr, i64, i64 } %t225, ptr %a227 + store { ptr, i64, i64 } { ptr @.str.3735, i64 3, i64 0 }, ptr %a228 + call void @finch_str_concat(ptr %a226, ptr %a227, ptr %a228) + %t229 = load { ptr, i64, i64 }, ptr %a226 + %t230 = call { ptr, i64, i64 } @finch.gen.op(ptr %t210, { ptr, i64, i64 } %t229) + %t231 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t230, 0 + %t232 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3736, i64 4, i64 0 }) + %t233 = insertvalue %S.gen.Val %t231, %S.ast.Type %t232, 1 + ret %S.gen.Val %t233 +endif5692: + %t234 = load ptr, ptr %a1 + %t235 = call i1 @finch.gen.unify(ptr %t234, ptr %a6, ptr %a10) + %t236 = xor i1 %t235, true + br i1 %t236, label %then5699, label %endif5701 +then5699: + %t237 = load ptr, ptr %a1 + %t238 = load { ptr, i64, i64 }, ptr %a2 + %t239 = load %S.gen.Val, ptr %a6 + %t240 = load %S.gen.Val, ptr %a10 + %t241 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t237, { ptr, i64, i64 } %t238, %S.gen.Val %t239, %S.gen.Val %t240, %S.ast.Node %t241) + br label %endif5701 +endif5701: + %t242 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t243 = getelementptr inbounds %S.ast.Type, ptr %t242, i32 0, i32 0 + %t244 = load { ptr, i64, i64 }, ptr %t243 + store { ptr, i64, i64 } %t244, ptr %a245 + call void @finch_str_copy(ptr %a246, ptr %a245) + %t247 = load { ptr, i64, i64 }, ptr %a246 + store { ptr, i64, i64 } %t247, ptr %a248 + %t249 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t250 = load %S.ast.Type, ptr %t249 + %t251 = call i1 @finch.gen.isFloat(%S.ast.Type %t250) + br i1 %t251, label %then5702, label %endif5704 +then5702: + %t252 = mul i64 6, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t253 = call ptr @finch_alloc(i64 %t252) + %t254 = getelementptr inbounds { ptr, i64, i64 }, ptr %t253, i64 0 + store { ptr, i64, i64 } { ptr @.str.3737, i64 2, i64 0 }, ptr %t254 + %t255 = getelementptr inbounds { ptr, i64, i64 }, ptr %t253, i64 1 + store { ptr, i64, i64 } { ptr @.str.3738, i64 2, i64 0 }, ptr %t255 + %t256 = getelementptr inbounds { ptr, i64, i64 }, ptr %t253, i64 2 + store { ptr, i64, i64 } { ptr @.str.3739, i64 1, i64 0 }, ptr %t256 + %t257 = getelementptr inbounds { ptr, i64, i64 }, ptr %t253, i64 3 + store { ptr, i64, i64 } { ptr @.str.3740, i64 2, i64 0 }, ptr %t257 + %t258 = getelementptr inbounds { ptr, i64, i64 }, ptr %t253, i64 4 + store { ptr, i64, i64 } { ptr @.str.3741, i64 1, i64 0 }, ptr %t258 + %t259 = getelementptr inbounds { ptr, i64, i64 }, ptr %t253, i64 5 + store { ptr, i64, i64 } { ptr @.str.3742, i64 2, i64 0 }, ptr %t259 + %t260 = insertvalue { ptr, i64, i64 } undef, ptr %t253, 0 + %t261 = insertvalue { ptr, i64, i64 } %t260, i64 6, 1 + %t262 = insertvalue { ptr, i64, i64 } %t261, i64 6, 2 + store { ptr, i64, i64 } %t262, ptr %a263 + %t264 = mul i64 6, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t265 = call ptr @finch_alloc(i64 %t264) + %t266 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i64 0 + store { ptr, i64, i64 } { ptr @.str.3743, i64 3, i64 0 }, ptr %t266 + %t267 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i64 1 + store { ptr, i64, i64 } { ptr @.str.3744, i64 3, i64 0 }, ptr %t267 + %t268 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i64 2 + store { ptr, i64, i64 } { ptr @.str.3745, i64 3, i64 0 }, ptr %t268 + %t269 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i64 3 + store { ptr, i64, i64 } { ptr @.str.3746, i64 3, i64 0 }, ptr %t269 + %t270 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i64 4 + store { ptr, i64, i64 } { ptr @.str.3747, i64 3, i64 0 }, ptr %t270 + %t271 = getelementptr inbounds { ptr, i64, i64 }, ptr %t265, i64 5 + store { ptr, i64, i64 } { ptr @.str.3748, i64 3, i64 0 }, ptr %t271 + %t272 = insertvalue { ptr, i64, i64 } undef, ptr %t265, 0 + %t273 = insertvalue { ptr, i64, i64 } %t272, i64 6, 1 + %t274 = insertvalue { ptr, i64, i64 } %t273, i64 6, 2 + store { ptr, i64, i64 } %t274, ptr %a275 + %t276 = load ptr, ptr %a1 + %t277 = getelementptr inbounds { ptr, i64, i64 }, ptr %a263, i32 0, i32 1 + %t278 = load { ptr, i64, i64 }, ptr %a2 + store i64 -1, ptr %a279 + %t280 = load i64, ptr %t277 + %t281 = load ptr, ptr %a263 + store i64 0, ptr %a282 + br label %find.cond5705 +find.cond5705: + %t283 = load i64, ptr %a282 + %t284 = icmp slt i64 %t283, %t280 + br i1 %t284, label %find.body5706, label %find.end5709 +find.body5706: + %t285 = getelementptr inbounds { ptr, i64, i64 }, ptr %t281, i64 %t283 + %t286 = load { ptr, i64, i64 }, ptr %t285 + store { ptr, i64, i64 } %t286, ptr %a287 + store { ptr, i64, i64 } %t278, ptr %a288 + %t289 = call i32 @finch_str_eq(ptr %a287, ptr %a288) + %t290 = icmp ne i32 %t289, 0 + br i1 %t290, label %find.hit5707, label %find.next5708 +find.hit5707: + store i64 %t283, ptr %a279 + br label %find.end5709 +find.next5708: + %t291 = add i64 %t283, 1 + store i64 %t291, ptr %a282 + br label %find.cond5705 +find.end5709: + %t292 = load i64, ptr %a279 + %t293 = load { ptr, i64, i64 }, ptr %a275 + %t294 = extractvalue { ptr, i64, i64 } %t293, 1 + %t295 = icmp uge i64 %t292, %t294 + br i1 %t295, label %range5710, label %inrange5711 +range5710: + call void @finch_panic_index(ptr @.str.3750, i64 3069, i64 %t292, i64 %t294) + unreachable +inrange5711: + %t296 = extractvalue { ptr, i64, i64 } %t293, 0 + %t297 = getelementptr inbounds { ptr, i64, i64 }, ptr %t296, i64 %t292 + %t298 = load { ptr, i64, i64 }, ptr %t297 + store { ptr, i64, i64 } { ptr @.str.3749, i64 5, i64 0 }, ptr %a300 + store { ptr, i64, i64 } %t298, ptr %a301 + call void @finch_str_concat(ptr %a299, ptr %a300, ptr %a301) + %t302 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } %t302, ptr %a304 + store { ptr, i64, i64 } { ptr @.str.3751, i64 1, i64 0 }, ptr %a305 + call void @finch_str_concat(ptr %a303, ptr %a304, ptr %a305) + %t306 = load { ptr, i64, i64 }, ptr %a303 + %t307 = load ptr, ptr %a1 + %t308 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t309 = load %S.ast.Type, ptr %t308 + %t310 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t307, %S.ast.Type %t309) + store { ptr, i64, i64 } %t306, ptr %a312 + store { ptr, i64, i64 } %t310, ptr %a313 + call void @finch_str_concat(ptr %a311, ptr %a312, ptr %a313) + %t314 = load { ptr, i64, i64 }, ptr %a311 + store { ptr, i64, i64 } %t314, ptr %a316 + store { ptr, i64, i64 } { ptr @.str.3752, i64 1, i64 0 }, ptr %a317 + call void @finch_str_concat(ptr %a315, ptr %a316, ptr %a317) + %t318 = load { ptr, i64, i64 }, ptr %a315 + %t319 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 0 + %t320 = load { ptr, i64, i64 }, ptr %t319 + store { ptr, i64, i64 } %t318, ptr %a322 + store { ptr, i64, i64 } %t320, ptr %a323 + call void @finch_str_concat(ptr %a321, ptr %a322, ptr %a323) + %t324 = load { ptr, i64, i64 }, ptr %a321 + store { ptr, i64, i64 } %t324, ptr %a326 + store { ptr, i64, i64 } { ptr @.str.3753, i64 2, i64 0 }, ptr %a327 + call void @finch_str_concat(ptr %a325, ptr %a326, ptr %a327) + %t328 = load { ptr, i64, i64 }, ptr %a325 + %t329 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t330 = load { ptr, i64, i64 }, ptr %t329 + store { ptr, i64, i64 } %t328, ptr %a332 + store { ptr, i64, i64 } %t330, ptr %a333 + call void @finch_str_concat(ptr %a331, ptr %a332, ptr %a333) + %t334 = load { ptr, i64, i64 }, ptr %a331 + %t335 = call { ptr, i64, i64 } @finch.gen.op(ptr %t276, { ptr, i64, i64 } %t334) + %t336 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t335, 0 + %t337 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3754, i64 4, i64 0 }) + %t338 = insertvalue %S.gen.Val %t336, %S.ast.Type %t337, 1 + ret %S.gen.Val %t338 +endif5704: + %t339 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t339, ptr %a340 + store { ptr, i64, i64 } { ptr @.str.3755, i64 4, i64 0 }, ptr %a341 + %t342 = call i32 @finch_str_eq(ptr %a340, ptr %a341) + %t343 = icmp ne i32 %t342, 0 + br i1 %t343, label %then5712, label %endif5714 +then5712: + %t344 = load i1, ptr %a23 + %t345 = xor i1 %t344, true + br i1 %t345, label %then5715, label %endif5717 +then5715: + %t346 = load ptr, ptr %a1 + %t347 = load %S.ast.Node, ptr %a11 + call void @finch.gen.fail(ptr %t346, %S.ast.Node %t347, { ptr, i64, i64 } { ptr @.str.3756, i64 115, i64 0 }) + br label %endif5717 +endif5717: + store { ptr, i64, i64 } { ptr @.str.3757, i64 2, i64 0 }, ptr %a348 + %t349 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t349, ptr %a350 + store { ptr, i64, i64 } { ptr @.str.3758, i64 2, i64 0 }, ptr %a351 + %t352 = call i32 @finch_str_eq(ptr %a350, ptr %a351) + %t353 = icmp ne i32 %t352, 0 + br i1 %t353, label %then5718, label %endif5720 +then5718: + store { ptr, i64, i64 } { ptr @.str.3759, i64 2, i64 0 }, ptr %a348 + br label %endif5720 +endif5720: + %t354 = load ptr, ptr %a1 + %t355 = load { ptr, i64, i64 }, ptr %a348 + store { ptr, i64, i64 } { ptr @.str.3760, i64 5, i64 0 }, ptr %a357 + store { ptr, i64, i64 } %t355, ptr %a358 + call void @finch_str_concat(ptr %a356, ptr %a357, ptr %a358) + %t359 = load { ptr, i64, i64 }, ptr %a356 + store { ptr, i64, i64 } %t359, ptr %a361 + store { ptr, i64, i64 } { ptr @.str.3761, i64 5, i64 0 }, ptr %a362 + call void @finch_str_concat(ptr %a360, ptr %a361, ptr %a362) + %t363 = load { ptr, i64, i64 }, ptr %a360 + %t364 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 0 + %t365 = load { ptr, i64, i64 }, ptr %t364 + store { ptr, i64, i64 } %t363, ptr %a367 + store { ptr, i64, i64 } %t365, ptr %a368 + call void @finch_str_concat(ptr %a366, ptr %a367, ptr %a368) + %t369 = load { ptr, i64, i64 }, ptr %a366 + store { ptr, i64, i64 } %t369, ptr %a371 + store { ptr, i64, i64 } { ptr @.str.3762, i64 2, i64 0 }, ptr %a372 + call void @finch_str_concat(ptr %a370, ptr %a371, ptr %a372) + %t373 = load { ptr, i64, i64 }, ptr %a370 + %t374 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t375 = load { ptr, i64, i64 }, ptr %t374 + store { ptr, i64, i64 } %t373, ptr %a377 + store { ptr, i64, i64 } %t375, ptr %a378 + call void @finch_str_concat(ptr %a376, ptr %a377, ptr %a378) + %t379 = load { ptr, i64, i64 }, ptr %a376 + %t380 = call { ptr, i64, i64 } @finch.gen.op(ptr %t354, { ptr, i64, i64 } %t379) + %t381 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t380, 0 + %t382 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3763, i64 4, i64 0 }) + %t383 = insertvalue %S.gen.Val %t381, %S.ast.Type %t382, 1 + ret %S.gen.Val %t383 +endif5714: + %t384 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t384, ptr %a385 + store { ptr, i64, i64 } { ptr @.str.3764, i64 4, i64 0 }, ptr %a386 + %t387 = call i32 @finch_str_eq(ptr %a385, ptr %a386) + %t388 = icmp ne i32 %t387, 0 + br label %logic.from5721 +logic.from5721: + br i1 %t388, label %logic.rhs5722, label %logic.end5723 +logic.rhs5722: + %t389 = load i1, ptr %a23 + %t390 = xor i1 %t389, true + br label %logic.rend5724 +logic.rend5724: + br label %logic.end5723 +logic.end5723: + %t391 = phi i1 [ false, %logic.from5721 ], [ %t390, %logic.rend5724 ] + br i1 %t391, label %then5725, label %endif5727 +then5725: + %t392 = load ptr, ptr %a1 + %t393 = load { ptr, i64, i64 }, ptr %a2 + %t394 = load %S.gen.Val, ptr %a6 + %t395 = load %S.gen.Val, ptr %a10 + %t396 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t392, { ptr, i64, i64 } %t393, %S.gen.Val %t394, %S.gen.Val %t395, %S.ast.Node %t396) + br label %endif5727 +endif5727: + %t397 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t398 = load %S.ast.Type, ptr %t397 + %t399 = call i1 @finch.gen.isInt(%S.ast.Type %t398) + %t400 = xor i1 %t399, true + br label %logic.from5728 +logic.from5728: + br i1 %t400, label %logic.rhs5729, label %logic.end5730 +logic.rhs5729: + %t401 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t401, ptr %a402 + store { ptr, i64, i64 } { ptr @.str.3765, i64 4, i64 0 }, ptr %a403 + %t404 = call i32 @finch_str_eq(ptr %a402, ptr %a403) + %t405 = icmp eq i32 %t404, 0 + br label %logic.rend5731 +logic.rend5731: + br label %logic.end5730 +logic.end5730: + %t406 = phi i1 [ false, %logic.from5728 ], [ %t405, %logic.rend5731 ] + br label %logic.from5732 +logic.from5732: + br i1 %t406, label %logic.rhs5733, label %logic.end5734 +logic.rhs5733: + %t407 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t407, ptr %a408 + store { ptr, i64, i64 } { ptr @.str.3766, i64 4, i64 0 }, ptr %a409 + %t410 = call i32 @finch_str_eq(ptr %a408, ptr %a409) + %t411 = icmp eq i32 %t410, 0 + br label %logic.rend5735 +logic.rend5735: + br label %logic.end5734 +logic.end5734: + %t412 = phi i1 [ false, %logic.from5732 ], [ %t411, %logic.rend5735 ] + br i1 %t412, label %then5736, label %endif5738 +then5736: + %t413 = load ptr, ptr %a1 + %t414 = load { ptr, i64, i64 }, ptr %a2 + %t415 = load %S.gen.Val, ptr %a6 + %t416 = load %S.gen.Val, ptr %a10 + %t417 = load %S.ast.Node, ptr %a11 + call void @finch.gen.badOperands(ptr %t413, { ptr, i64, i64 } %t414, %S.gen.Val %t415, %S.gen.Val %t416, %S.ast.Node %t417) + br label %endif5738 +endif5738: + %t418 = load ptr, ptr %a1 + %t419 = load { ptr, i64, i64 }, ptr %a2 + %t420 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t421 = load %S.ast.Type, ptr %t420 + %t422 = call i1 @finch.gen.isSigned(%S.ast.Type %t421) + %t423 = call { ptr, i64, i64 } @finch.gen.intPred({ ptr, i64, i64 } %t419, i1 %t422) + store { ptr, i64, i64 } { ptr @.str.3767, i64 5, i64 0 }, ptr %a425 + store { ptr, i64, i64 } %t423, ptr %a426 + call void @finch_str_concat(ptr %a424, ptr %a425, ptr %a426) + %t427 = load { ptr, i64, i64 }, ptr %a424 + store { ptr, i64, i64 } %t427, ptr %a429 + store { ptr, i64, i64 } { ptr @.str.3768, i64 1, i64 0 }, ptr %a430 + call void @finch_str_concat(ptr %a428, ptr %a429, ptr %a430) + %t431 = load { ptr, i64, i64 }, ptr %a428 + %t432 = load ptr, ptr %a1 + %t433 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 1 + %t434 = load %S.ast.Type, ptr %t433 + %t435 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t432, %S.ast.Type %t434) + store { ptr, i64, i64 } %t431, ptr %a437 + store { ptr, i64, i64 } %t435, ptr %a438 + call void @finch_str_concat(ptr %a436, ptr %a437, ptr %a438) + %t439 = load { ptr, i64, i64 }, ptr %a436 + store { ptr, i64, i64 } %t439, ptr %a441 + store { ptr, i64, i64 } { ptr @.str.3769, i64 1, i64 0 }, ptr %a442 + call void @finch_str_concat(ptr %a440, ptr %a441, ptr %a442) + %t443 = load { ptr, i64, i64 }, ptr %a440 + %t444 = getelementptr inbounds %S.gen.Val, ptr %a6, i32 0, i32 0 + %t445 = load { ptr, i64, i64 }, ptr %t444 + store { ptr, i64, i64 } %t443, ptr %a447 + store { ptr, i64, i64 } %t445, ptr %a448 + call void @finch_str_concat(ptr %a446, ptr %a447, ptr %a448) + %t449 = load { ptr, i64, i64 }, ptr %a446 + store { ptr, i64, i64 } %t449, ptr %a451 + store { ptr, i64, i64 } { ptr @.str.3770, i64 2, i64 0 }, ptr %a452 + call void @finch_str_concat(ptr %a450, ptr %a451, ptr %a452) + %t453 = load { ptr, i64, i64 }, ptr %a450 + %t454 = getelementptr inbounds %S.gen.Val, ptr %a10, i32 0, i32 0 + %t455 = load { ptr, i64, i64 }, ptr %t454 + store { ptr, i64, i64 } %t453, ptr %a457 + store { ptr, i64, i64 } %t455, ptr %a458 + call void @finch_str_concat(ptr %a456, ptr %a457, ptr %a458) + %t459 = load { ptr, i64, i64 }, ptr %a456 + %t460 = call { ptr, i64, i64 } @finch.gen.op(ptr %t418, { ptr, i64, i64 } %t459) + %t461 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t460, 0 + %t462 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3771, i64 4, i64 0 }) + %t463 = insertvalue %S.gen.Val %t461, %S.ast.Type %t462, 1 + ret %S.gen.Val %t463 +} + +define internal { ptr, i64, i64 } @finch.gen.intPred({ ptr, i64, i64 } %p0, i1 %p1) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca i1, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca i64, align 16 + %a44 = alloca i64, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store i1 %p1, ptr %a2 + %t3 = mul i64 6, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t4 = call ptr @finch_alloc(i64 %t3) + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i64 0 + store { ptr, i64, i64 } { ptr @.str.3772, i64 2, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i64 1 + store { ptr, i64, i64 } { ptr @.str.3773, i64 2, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i64 2 + store { ptr, i64, i64 } { ptr @.str.3774, i64 1, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i64 3 + store { ptr, i64, i64 } { ptr @.str.3775, i64 2, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i64 4 + store { ptr, i64, i64 } { ptr @.str.3776, i64 1, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i64 5 + store { ptr, i64, i64 } { ptr @.str.3777, i64 2, i64 0 }, ptr %t10 + %t11 = insertvalue { ptr, i64, i64 } undef, ptr %t4, 0 + %t12 = insertvalue { ptr, i64, i64 } %t11, i64 6, 1 + %t13 = insertvalue { ptr, i64, i64 } %t12, i64 6, 2 + store { ptr, i64, i64 } %t13, ptr %a14 + %t15 = mul i64 6, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t16 = call ptr @finch_alloc(i64 %t15) + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t16, i64 0 + store { ptr, i64, i64 } { ptr @.str.3778, i64 2, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t16, i64 1 + store { ptr, i64, i64 } { ptr @.str.3779, i64 2, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t16, i64 2 + store { ptr, i64, i64 } { ptr @.str.3780, i64 3, i64 0 }, ptr %t19 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t16, i64 3 + store { ptr, i64, i64 } { ptr @.str.3781, i64 3, i64 0 }, ptr %t20 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t16, i64 4 + store { ptr, i64, i64 } { ptr @.str.3782, i64 3, i64 0 }, ptr %t21 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t16, i64 5 + store { ptr, i64, i64 } { ptr @.str.3783, i64 3, i64 0 }, ptr %t22 + %t23 = insertvalue { ptr, i64, i64 } undef, ptr %t16, 0 + %t24 = insertvalue { ptr, i64, i64 } %t23, i64 6, 1 + %t25 = insertvalue { ptr, i64, i64 } %t24, i64 6, 2 + store { ptr, i64, i64 } %t25, ptr %a26 + %t27 = load i1, ptr %a2 + br i1 %t27, label %then5739, label %endif5741 +then5739: + %t28 = mul i64 6, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t29 = call ptr @finch_alloc(i64 %t28) + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 0 + store { ptr, i64, i64 } { ptr @.str.3784, i64 2, i64 0 }, ptr %t30 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 1 + store { ptr, i64, i64 } { ptr @.str.3785, i64 2, i64 0 }, ptr %t31 + %t32 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 2 + store { ptr, i64, i64 } { ptr @.str.3786, i64 3, i64 0 }, ptr %t32 + %t33 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 3 + store { ptr, i64, i64 } { ptr @.str.3787, i64 3, i64 0 }, ptr %t33 + %t34 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 4 + store { ptr, i64, i64 } { ptr @.str.3788, i64 3, i64 0 }, ptr %t34 + %t35 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i64 5 + store { ptr, i64, i64 } { ptr @.str.3789, i64 3, i64 0 }, ptr %t35 + %t36 = insertvalue { ptr, i64, i64 } undef, ptr %t29, 0 + %t37 = insertvalue { ptr, i64, i64 } %t36, i64 6, 1 + %t38 = insertvalue { ptr, i64, i64 } %t37, i64 6, 2 + store { ptr, i64, i64 } %t38, ptr %a26 + br label %endif5741 +endif5741: + %t39 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t40 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a41 + %t42 = load i64, ptr %t39 + %t43 = load ptr, ptr %a14 + store i64 0, ptr %a44 + br label %find.cond5742 +find.cond5742: + %t45 = load i64, ptr %a44 + %t46 = icmp slt i64 %t45, %t42 + br i1 %t46, label %find.body5743, label %find.end5746 +find.body5743: + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i64 %t45 + %t48 = load { ptr, i64, i64 }, ptr %t47 + store { ptr, i64, i64 } %t48, ptr %a49 + store { ptr, i64, i64 } %t40, ptr %a50 + %t51 = call i32 @finch_str_eq(ptr %a49, ptr %a50) + %t52 = icmp ne i32 %t51, 0 + br i1 %t52, label %find.hit5744, label %find.next5745 +find.hit5744: + store i64 %t45, ptr %a41 + br label %find.end5746 +find.next5745: + %t53 = add i64 %t45, 1 + store i64 %t53, ptr %a44 + br label %find.cond5742 +find.end5746: + %t54 = load i64, ptr %a41 + %t55 = load { ptr, i64, i64 }, ptr %a26 + %t56 = extractvalue { ptr, i64, i64 } %t55, 1 + %t57 = icmp uge i64 %t54, %t56 + br i1 %t57, label %range5747, label %inrange5748 +range5747: + call void @finch_panic_index(ptr @.str.3790, i64 3096, i64 %t54, i64 %t56) + unreachable +inrange5748: + %t58 = extractvalue { ptr, i64, i64 } %t55, 0 + %t59 = getelementptr inbounds { ptr, i64, i64 }, ptr %t58, i64 %t54 + %t60 = load { ptr, i64, i64 }, ptr %t59 + store { ptr, i64, i64 } %t60, ptr %a61 + call void @finch_str_copy(ptr %a62, ptr %a61) + %t63 = load { ptr, i64, i64 }, ptr %a62 + ret { ptr, i64, i64 } %t63 +} + +define internal %S.gen.Val @finch.gen.binary(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca %S.gen.Val, align 16 + %a145 = alloca %S.gen.Val, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch_str_copy(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.3791, i64 2, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br label %logic.from5749 +logic.from5749: + br i1 %t13, label %logic.end5751, label %logic.rhs5750 +logic.rhs5750: + %t14 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.3792, i64 2, i64 0 }, ptr %a16 + %t17 = call i32 @finch_str_eq(ptr %a15, ptr %a16) + %t18 = icmp ne i32 %t17, 0 + br label %logic.rend5752 +logic.rend5752: + br label %logic.end5751 +logic.end5751: + %t19 = phi i1 [ true, %logic.from5749 ], [ %t18, %logic.rend5752 ] + br i1 %t19, label %then5753, label %endif5755 +then5753: + %t20 = load ptr, ptr %a1 + %t21 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t22 = load { ptr, i64, i64 }, ptr %t21 + %t23 = extractvalue { ptr, i64, i64 } %t22, 1 + %t24 = icmp uge i64 0, %t23 + br i1 %t24, label %range5756, label %inrange5757 +range5756: + call void @finch_panic_index(ptr @.str.3793, i64 3102, i64 0, i64 %t23) + unreachable +inrange5757: + %t25 = extractvalue { ptr, i64, i64 } %t22, 0 + %t26 = getelementptr inbounds %S.ast.Node, ptr %t25, i64 0 + %t27 = load %S.ast.Node, ptr %t26 + %t28 = call { ptr, i64, i64 } @finch.gen.condition(ptr %t20, %S.ast.Node %t27) + store { ptr, i64, i64 } %t28, ptr %a29 + %t30 = load ptr, ptr %a1 + %t31 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t30, { ptr, i64, i64 } { ptr @.str.3794, i64 10, i64 0 }) + store { ptr, i64, i64 } %t31, ptr %a32 + %t33 = load ptr, ptr %a1 + %t34 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t33, { ptr, i64, i64 } { ptr @.str.3795, i64 9, i64 0 }) + store { ptr, i64, i64 } %t34, ptr %a35 + %t36 = load ptr, ptr %a1 + %t37 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t36, { ptr, i64, i64 } { ptr @.str.3796, i64 9, i64 0 }) + store { ptr, i64, i64 } %t37, ptr %a38 + %t39 = load ptr, ptr %a1 + %t40 = load { ptr, i64, i64 }, ptr %a32 + call void @finch.gen.br(ptr %t39, { ptr, i64, i64 } %t40) + %t41 = load ptr, ptr %a1 + %t42 = load { ptr, i64, i64 }, ptr %a32 + call void @finch.gen.label(ptr %t41, { ptr, i64, i64 } %t42) + %t43 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t43, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.3797, i64 2, i64 0 }, ptr %a45 + %t46 = call i32 @finch_str_eq(ptr %a44, ptr %a45) + %t47 = icmp ne i32 %t46, 0 + br i1 %t47, label %then5758, label %else5759 +then5758: + %t48 = load ptr, ptr %a1 + %t49 = load { ptr, i64, i64 }, ptr %a29 + %t50 = load { ptr, i64, i64 }, ptr %a35 + %t51 = load { ptr, i64, i64 }, ptr %a38 + call void @finch.gen.condBr(ptr %t48, { ptr, i64, i64 } %t49, { ptr, i64, i64 } %t50, { ptr, i64, i64 } %t51) + br label %endif5760 +else5759: + %t52 = load ptr, ptr %a1 + %t53 = load { ptr, i64, i64 }, ptr %a29 + %t54 = load { ptr, i64, i64 }, ptr %a38 + %t55 = load { ptr, i64, i64 }, ptr %a35 + call void @finch.gen.condBr(ptr %t52, { ptr, i64, i64 } %t53, { ptr, i64, i64 } %t54, { ptr, i64, i64 } %t55) + br label %endif5760 +endif5760: + %t56 = load ptr, ptr %a1 + %t57 = load { ptr, i64, i64 }, ptr %a35 + call void @finch.gen.label(ptr %t56, { ptr, i64, i64 } %t57) + %t58 = load ptr, ptr %a1 + %t59 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t60 = load { ptr, i64, i64 }, ptr %t59 + %t61 = extractvalue { ptr, i64, i64 } %t60, 1 + %t62 = icmp uge i64 1, %t61 + br i1 %t62, label %range5761, label %inrange5762 +range5761: + call void @finch_panic_index(ptr @.str.3798, i64 3114, i64 1, i64 %t61) + unreachable +inrange5762: + %t63 = extractvalue { ptr, i64, i64 } %t60, 0 + %t64 = getelementptr inbounds %S.ast.Node, ptr %t63, i64 1 + %t65 = load %S.ast.Node, ptr %t64 + %t66 = call { ptr, i64, i64 } @finch.gen.condition(ptr %t58, %S.ast.Node %t65) + store { ptr, i64, i64 } %t66, ptr %a67 + %t68 = load ptr, ptr %a1 + %t69 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t68, { ptr, i64, i64 } { ptr @.str.3799, i64 10, i64 0 }) + store { ptr, i64, i64 } %t69, ptr %a70 + %t71 = load ptr, ptr %a1 + %t72 = load { ptr, i64, i64 }, ptr %a70 + call void @finch.gen.br(ptr %t71, { ptr, i64, i64 } %t72) + %t73 = load ptr, ptr %a1 + %t74 = load { ptr, i64, i64 }, ptr %a70 + call void @finch.gen.label(ptr %t73, { ptr, i64, i64 } %t74) + %t75 = load ptr, ptr %a1 + %t76 = load { ptr, i64, i64 }, ptr %a38 + call void @finch.gen.br(ptr %t75, { ptr, i64, i64 } %t76) + %t77 = load ptr, ptr %a1 + %t78 = load { ptr, i64, i64 }, ptr %a38 + call void @finch.gen.label(ptr %t77, { ptr, i64, i64 } %t78) + store { ptr, i64, i64 } { ptr @.str.3800, i64 4, i64 0 }, ptr %a79 + %t80 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t80, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.3801, i64 2, i64 0 }, ptr %a82 + %t83 = call i32 @finch_str_eq(ptr %a81, ptr %a82) + %t84 = icmp ne i32 %t83, 0 + br i1 %t84, label %then5763, label %endif5765 +then5763: + store { ptr, i64, i64 } { ptr @.str.3802, i64 5, i64 0 }, ptr %a79 + br label %endif5765 +endif5765: + %t85 = load ptr, ptr %a1 + %t86 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.3803, i64 9, i64 0 }, ptr %a88 + store { ptr, i64, i64 } %t86, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t90, ptr %a92 + store { ptr, i64, i64 } { ptr @.str.3804, i64 3, i64 0 }, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + %t95 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t94, ptr %a97 + store { ptr, i64, i64 } %t95, ptr %a98 + call void @finch_str_concat(ptr %a96, ptr %a97, ptr %a98) + %t99 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t99, ptr %a101 + store { ptr, i64, i64 } { ptr @.str.3805, i64 6, i64 0 }, ptr %a102 + call void @finch_str_concat(ptr %a100, ptr %a101, ptr %a102) + %t103 = load { ptr, i64, i64 }, ptr %a100 + %t104 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t103, ptr %a106 + store { ptr, i64, i64 } %t104, ptr %a107 + call void @finch_str_concat(ptr %a105, ptr %a106, ptr %a107) + %t108 = load { ptr, i64, i64 }, ptr %a105 + store { ptr, i64, i64 } %t108, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.3806, i64 3, i64 0 }, ptr %a111 + call void @finch_str_concat(ptr %a109, ptr %a110, ptr %a111) + %t112 = load { ptr, i64, i64 }, ptr %a109 + %t113 = load { ptr, i64, i64 }, ptr %a70 + store { ptr, i64, i64 } %t112, ptr %a115 + store { ptr, i64, i64 } %t113, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + store { ptr, i64, i64 } %t117, ptr %a119 + store { ptr, i64, i64 } { ptr @.str.3807, i64 2, i64 0 }, ptr %a120 + call void @finch_str_concat(ptr %a118, ptr %a119, ptr %a120) + %t121 = load { ptr, i64, i64 }, ptr %a118 + %t122 = call { ptr, i64, i64 } @finch.gen.op(ptr %t85, { ptr, i64, i64 } %t121) + %t123 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t122, 0 + %t124 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3808, i64 4, i64 0 }) + %t125 = insertvalue %S.gen.Val %t123, %S.ast.Type %t124, 1 + ret %S.gen.Val %t125 +endif5755: + %t126 = load ptr, ptr %a1 + %t127 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t128 = load { ptr, i64, i64 }, ptr %t127 + %t129 = extractvalue { ptr, i64, i64 } %t128, 1 + %t130 = icmp uge i64 0, %t129 + br i1 %t130, label %range5766, label %inrange5767 +range5766: + call void @finch_panic_index(ptr @.str.3809, i64 3126, i64 0, i64 %t129) + unreachable +inrange5767: + %t131 = extractvalue { ptr, i64, i64 } %t128, 0 + %t132 = getelementptr inbounds %S.ast.Node, ptr %t131, i64 0 + %t133 = load %S.ast.Node, ptr %t132 + %t134 = call %S.gen.Val @finch.gen.expr(ptr %t126, %S.ast.Node %t133) + store %S.gen.Val %t134, ptr %a135 + %t136 = load ptr, ptr %a1 + %t137 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t138 = load { ptr, i64, i64 }, ptr %t137 + %t139 = extractvalue { ptr, i64, i64 } %t138, 1 + %t140 = icmp uge i64 1, %t139 + br i1 %t140, label %range5768, label %inrange5769 +range5768: + call void @finch_panic_index(ptr @.str.3810, i64 3127, i64 1, i64 %t139) + unreachable +inrange5769: + %t141 = extractvalue { ptr, i64, i64 } %t138, 0 + %t142 = getelementptr inbounds %S.ast.Node, ptr %t141, i64 1 + %t143 = load %S.ast.Node, ptr %t142 + %t144 = call %S.gen.Val @finch.gen.expr(ptr %t136, %S.ast.Node %t143) + store %S.gen.Val %t144, ptr %a145 + %t146 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t146, ptr %a147 + store { ptr, i64, i64 } { ptr @.str.3811, i64 2, i64 0 }, ptr %a148 + %t149 = call i32 @finch_str_eq(ptr %a147, ptr %a148) + %t150 = icmp ne i32 %t149, 0 + br label %logic.from5770 +logic.from5770: + br i1 %t150, label %logic.end5772, label %logic.rhs5771 +logic.rhs5771: + %t151 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t151, ptr %a152 + store { ptr, i64, i64 } { ptr @.str.3812, i64 2, i64 0 }, ptr %a153 + %t154 = call i32 @finch_str_eq(ptr %a152, ptr %a153) + %t155 = icmp ne i32 %t154, 0 + br label %logic.rend5773 +logic.rend5773: + br label %logic.end5772 +logic.end5772: + %t156 = phi i1 [ true, %logic.from5770 ], [ %t155, %logic.rend5773 ] + br label %logic.from5774 +logic.from5774: + br i1 %t156, label %logic.end5776, label %logic.rhs5775 +logic.rhs5775: + %t157 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t157, ptr %a158 + store { ptr, i64, i64 } { ptr @.str.3813, i64 1, i64 0 }, ptr %a159 + %t160 = call i32 @finch_str_eq(ptr %a158, ptr %a159) + %t161 = icmp ne i32 %t160, 0 + br label %logic.rend5777 +logic.rend5777: + br label %logic.end5776 +logic.end5776: + %t162 = phi i1 [ true, %logic.from5774 ], [ %t161, %logic.rend5777 ] + br label %logic.from5778 +logic.from5778: + br i1 %t162, label %logic.end5780, label %logic.rhs5779 +logic.rhs5779: + %t163 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t163, ptr %a164 + store { ptr, i64, i64 } { ptr @.str.3814, i64 2, i64 0 }, ptr %a165 + %t166 = call i32 @finch_str_eq(ptr %a164, ptr %a165) + %t167 = icmp ne i32 %t166, 0 + br label %logic.rend5781 +logic.rend5781: + br label %logic.end5780 +logic.end5780: + %t168 = phi i1 [ true, %logic.from5778 ], [ %t167, %logic.rend5781 ] + br label %logic.from5782 +logic.from5782: + br i1 %t168, label %logic.end5784, label %logic.rhs5783 +logic.rhs5783: + %t169 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t169, ptr %a170 + store { ptr, i64, i64 } { ptr @.str.3815, i64 1, i64 0 }, ptr %a171 + %t172 = call i32 @finch_str_eq(ptr %a170, ptr %a171) + %t173 = icmp ne i32 %t172, 0 + br label %logic.rend5785 +logic.rend5785: + br label %logic.end5784 +logic.end5784: + %t174 = phi i1 [ true, %logic.from5782 ], [ %t173, %logic.rend5785 ] + br label %logic.from5786 +logic.from5786: + br i1 %t174, label %logic.end5788, label %logic.rhs5787 +logic.rhs5787: + %t175 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t175, ptr %a176 + store { ptr, i64, i64 } { ptr @.str.3816, i64 2, i64 0 }, ptr %a177 + %t178 = call i32 @finch_str_eq(ptr %a176, ptr %a177) + %t179 = icmp ne i32 %t178, 0 + br label %logic.rend5789 +logic.rend5789: + br label %logic.end5788 +logic.end5788: + %t180 = phi i1 [ true, %logic.from5786 ], [ %t179, %logic.rend5789 ] + br i1 %t180, label %then5790, label %endif5792 +then5790: + %t181 = load ptr, ptr %a1 + %t182 = load { ptr, i64, i64 }, ptr %a8 + %t183 = load %S.gen.Val, ptr %a135 + %t184 = load %S.gen.Val, ptr %a145 + %t185 = load %S.ast.Node, ptr %a2 + %t186 = call %S.gen.Val @finch.gen.compare(ptr %t181, { ptr, i64, i64 } %t182, %S.gen.Val %t183, %S.gen.Val %t184, %S.ast.Node %t185) + ret %S.gen.Val %t186 +endif5792: + %t187 = load ptr, ptr %a1 + %t188 = load { ptr, i64, i64 }, ptr %a8 + %t189 = load %S.gen.Val, ptr %a135 + %t190 = load %S.gen.Val, ptr %a145 + %t191 = load %S.ast.Node, ptr %a2 + %t192 = call %S.gen.Val @finch.gen.arith(ptr %t187, { ptr, i64, i64 } %t188, %S.gen.Val %t189, %S.gen.Val %t190, %S.ast.Node %t191) + ret %S.gen.Val %t192 +} + +define internal %S.gen.Val @finch.gen.arrayLit(ptr %p0, %S.ast.Node %p1, %S.ast.Type %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a5 = alloca %S.ast.Type, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca %S.ast.Type, align 16 + %a20 = alloca %S.ast.Type, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca i64, align 16 + %a38 = alloca %S.ast.Node, align 16 + %a39 = alloca %S.gen.Val, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca %S.ast.Type, align 16 + %a52 = alloca %S.ast.Type, align 16 + %a75 = alloca %S.ast.Type, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca i64, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca %S.ast.Type, align 16 + %a225 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + %t4 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3817, i64 4, i64 0 }) + store %S.ast.Type %t4, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t7 = load { ptr, i64, i64 }, ptr %t6 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.3818, i64 5, i64 0 }, ptr %a9 + %t10 = call i32 @finch_str_eq(ptr %a8, ptr %a9) + %t11 = icmp ne i32 %t10, 0 + br i1 %t11, label %then5793, label %else5794 +then5793: + %t12 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 1 + %t13 = load { ptr, i64, i64 }, ptr %t12 + %t14 = extractvalue { ptr, i64, i64 } %t13, 1 + %t15 = icmp uge i64 0, %t14 + br i1 %t15, label %range5796, label %inrange5797 +range5796: + call void @finch_panic_index(ptr @.str.3819, i64 3137, i64 0, i64 %t14) + unreachable +inrange5797: + %t16 = extractvalue { ptr, i64, i64 } %t13, 0 + %t17 = getelementptr inbounds %S.ast.Type, ptr %t16, i64 0 + %t18 = load %S.ast.Type, ptr %t17 + store %S.ast.Type %t18, ptr %a19 + call void @finch.copy.S_ast_Type(ptr %a20, ptr %a19) + %t21 = load %S.ast.Type, ptr %a20 + store %S.ast.Type %t21, ptr %a5 + br label %endif5795 +else5794: + %t22 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load i64, ptr %t23 + %t25 = icmp eq i64 %t24, 0 + br i1 %t25, label %then5798, label %endif5800 +then5798: + %t26 = load ptr, ptr %a1 + %t27 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t26, %S.ast.Node %t27, { ptr, i64, i64 } { ptr @.str.3820, i64 47, i64 0 }) + br label %endif5800 +endif5800: + br label %endif5795 +endif5795: + store { ptr, i64, i64 } zeroinitializer, ptr %a28 + %t29 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + store i64 0, ptr %a30 + br label %each.cond5801 +each.cond5801: + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i32 0, i32 1 + %t32 = load i64, ptr %t31 + %t33 = load i64, ptr %a30 + %t34 = icmp slt i64 %t33, %t32 + br i1 %t34, label %each.body5802, label %each.end5804 +each.body5802: + %t35 = load ptr, ptr %t29 + %t36 = getelementptr inbounds %S.ast.Node, ptr %t35, i64 %t33 + %t37 = load %S.ast.Node, ptr %t36 + store %S.ast.Node %t37, ptr %a38 + store %S.gen.Val zeroinitializer, ptr %a39 + %t40 = getelementptr inbounds %S.ast.Type, ptr %a5, i32 0, i32 0 + %t41 = load { ptr, i64, i64 }, ptr %t40 + store { ptr, i64, i64 } %t41, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.3821, i64 4, i64 0 }, ptr %a43 + %t44 = call i32 @finch_str_eq(ptr %a42, ptr %a43) + %t45 = icmp ne i32 %t44, 0 + br i1 %t45, label %then5805, label %else5806 +then5805: + %t46 = load ptr, ptr %a1 + %t47 = load %S.ast.Node, ptr %a38 + %t48 = call %S.gen.Val @finch.gen.expr(ptr %t46, %S.ast.Node %t47) + store %S.gen.Val %t48, ptr %a39 + %t49 = getelementptr inbounds %S.gen.Val, ptr %a39, i32 0, i32 1 + %t50 = load %S.ast.Type, ptr %t49 + store %S.ast.Type %t50, ptr %a51 + call void @finch.copy.S_ast_Type(ptr %a52, ptr %a51) + %t53 = load %S.ast.Type, ptr %a52 + store %S.ast.Type %t53, ptr %a5 + br label %endif5807 +else5806: + %t54 = load ptr, ptr %a1 + %t55 = load %S.ast.Node, ptr %a38 + %t56 = load %S.ast.Type, ptr %a5 + %t57 = call %S.gen.Val @finch.gen.exprWant(ptr %t54, %S.ast.Node %t55, %S.ast.Type %t56) + store %S.gen.Val %t57, ptr %a39 + br label %endif5807 +endif5807: + %t58 = load ptr, ptr %a1 + %t59 = load %S.gen.Val, ptr %a39 + %t60 = load %S.ast.Type, ptr %a5 + %t61 = load %S.ast.Node, ptr %a38 + %t62 = call %S.gen.Val @finch.gen.coerce(ptr %t58, %S.gen.Val %t59, %S.ast.Type %t60, %S.ast.Node %t61, { ptr, i64, i64 } { ptr @.str.3822, i64 27, i64 0 }) + store %S.gen.Val %t62, ptr %a39 + %t63 = getelementptr inbounds { ptr, i64, i64 }, ptr %a28, i32 0, i32 1 + %t64 = load ptr, ptr %a1 + %t65 = load %S.gen.Val, ptr %a39 + %t66 = call { ptr, i64, i64 } @finch.gen.own(ptr %t64, %S.gen.Val %t65) + %t67 = load i64, ptr %t63 + %t68 = add i64 %t67, 1 + call void @finch_arr_reserve(ptr %a28, i64 %t68, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t69 = load ptr, ptr %a28 + %t70 = getelementptr inbounds { ptr, i64, i64 }, ptr %t69, i64 %t67 + store { ptr, i64, i64 } %t66, ptr %t70 + store i64 %t68, ptr %t63 + br label %each.step5803 +each.step5803: + %t71 = load i64, ptr %a30 + %t72 = add i64 %t71, 1 + store i64 %t72, ptr %a30 + br label %each.cond5801 +each.end5804: + %t73 = load %S.ast.Type, ptr %a5 + %t74 = call %S.ast.Type @finch.ast.arrayOf(%S.ast.Type %t73) + store %S.ast.Type %t74, ptr %a75 + %t76 = getelementptr inbounds { ptr, i64, i64 }, ptr %a28, i32 0, i32 1 + %t77 = load i64, ptr %t76 + call void @finch_str_from_int(ptr %a78, i64 %t77) + %t79 = load { ptr, i64, i64 }, ptr %a78 + store { ptr, i64, i64 } %t79, ptr %a80 + store { ptr, i64, i64 } { ptr @.str.3823, i64 4, i64 0 }, ptr %a81 + %t82 = getelementptr inbounds { ptr, i64, i64 }, ptr %a28, i32 0, i32 1 + %t83 = load i64, ptr %t82 + %t84 = icmp sgt i64 %t83, 0 + br i1 %t84, label %then5808, label %endif5810 +then5808: + %t85 = load ptr, ptr %a1 + %t86 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } { ptr @.str.3824, i64 8, i64 0 }, ptr %a88 + store { ptr, i64, i64 } %t86, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t90, ptr %a92 + store { ptr, i64, i64 } { ptr @.str.3825, i64 2, i64 0 }, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + %t95 = load ptr, ptr %a1 + %t96 = load %S.ast.Type, ptr %a5 + %t97 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t95, %S.ast.Type %t96) + store { ptr, i64, i64 } %t94, ptr %a99 + store { ptr, i64, i64 } %t97, ptr %a100 + call void @finch_str_concat(ptr %a98, ptr %a99, ptr %a100) + %t101 = load { ptr, i64, i64 }, ptr %a98 + %t102 = call { ptr, i64, i64 } @finch.gen.op(ptr %t85, { ptr, i64, i64 } %t101) + store { ptr, i64, i64 } %t102, ptr %a103 + %t104 = load ptr, ptr %a1 + %t105 = load { ptr, i64, i64 }, ptr %a103 + store { ptr, i64, i64 } { ptr @.str.3826, i64 26, i64 0 }, ptr %a107 + store { ptr, i64, i64 } %t105, ptr %a108 + call void @finch_str_concat(ptr %a106, ptr %a107, ptr %a108) + %t109 = load { ptr, i64, i64 }, ptr %a106 + store { ptr, i64, i64 } %t109, ptr %a111 + store { ptr, i64, i64 } { ptr @.str.3827, i64 1, i64 0 }, ptr %a112 + call void @finch_str_concat(ptr %a110, ptr %a111, ptr %a112) + %t113 = load { ptr, i64, i64 }, ptr %a110 + %t114 = call { ptr, i64, i64 } @finch.gen.op(ptr %t104, { ptr, i64, i64 } %t113) + store { ptr, i64, i64 } %t114, ptr %a81 + br label %endif5810 +endif5810: + %t115 = getelementptr inbounds { ptr, i64, i64 }, ptr %a28, i32 0, i32 1 + %t116 = load i64, ptr %t115 + store i64 0, ptr %a117 + br label %for.cond5811 +for.cond5811: + %t118 = load i64, ptr %a117 + %t119 = icmp slt i64 %t118, %t116 + br i1 %t119, label %for.body5812, label %for.end5814 +for.body5812: + %t120 = load ptr, ptr %a1 + %t121 = load ptr, ptr %a1 + %t122 = load %S.ast.Type, ptr %a5 + %t123 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t121, %S.ast.Type %t122) + store { ptr, i64, i64 } { ptr @.str.3828, i64 23, i64 0 }, ptr %a125 + store { ptr, i64, i64 } %t123, ptr %a126 + call void @finch_str_concat(ptr %a124, ptr %a125, ptr %a126) + %t127 = load { ptr, i64, i64 }, ptr %a124 + store { ptr, i64, i64 } %t127, ptr %a129 + store { ptr, i64, i64 } { ptr @.str.3829, i64 6, i64 0 }, ptr %a130 + call void @finch_str_concat(ptr %a128, ptr %a129, ptr %a130) + %t131 = load { ptr, i64, i64 }, ptr %a128 + %t132 = load { ptr, i64, i64 }, ptr %a81 + store { ptr, i64, i64 } %t131, ptr %a134 + store { ptr, i64, i64 } %t132, ptr %a135 + call void @finch_str_concat(ptr %a133, ptr %a134, ptr %a135) + %t136 = load { ptr, i64, i64 }, ptr %a133 + store { ptr, i64, i64 } %t136, ptr %a138 + store { ptr, i64, i64 } { ptr @.str.3830, i64 6, i64 0 }, ptr %a139 + call void @finch_str_concat(ptr %a137, ptr %a138, ptr %a139) + %t140 = load { ptr, i64, i64 }, ptr %a137 + %t141 = load i64, ptr %a117 + call void @finch_str_from_int(ptr %a142, i64 %t141) + %t143 = load { ptr, i64, i64 }, ptr %a142 + store { ptr, i64, i64 } %t140, ptr %a145 + store { ptr, i64, i64 } %t143, ptr %a146 + call void @finch_str_concat(ptr %a144, ptr %a145, ptr %a146) + %t147 = load { ptr, i64, i64 }, ptr %a144 + %t148 = call { ptr, i64, i64 } @finch.gen.op(ptr %t120, { ptr, i64, i64 } %t147) + store { ptr, i64, i64 } %t148, ptr %a149 + %t150 = load ptr, ptr %a1 + %t151 = load ptr, ptr %a1 + %t152 = load %S.ast.Type, ptr %a5 + %t153 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t151, %S.ast.Type %t152) + %t154 = load i64, ptr %a117 + %t155 = load { ptr, i64, i64 }, ptr %a28 + %t156 = extractvalue { ptr, i64, i64 } %t155, 1 + %t157 = icmp uge i64 %t154, %t156 + br i1 %t157, label %range5815, label %inrange5816 +range5815: + call void @finch_panic_index(ptr @.str.3831, i64 3162, i64 %t154, i64 %t156) + unreachable +inrange5816: + %t158 = extractvalue { ptr, i64, i64 } %t155, 0 + %t159 = getelementptr inbounds { ptr, i64, i64 }, ptr %t158, i64 %t154 + %t160 = load { ptr, i64, i64 }, ptr %t159 + %t161 = load { ptr, i64, i64 }, ptr %a149 + call void @finch.gen.store(ptr %t150, { ptr, i64, i64 } %t153, { ptr, i64, i64 } %t160, { ptr, i64, i64 } %t161) + br label %for.step5813 +for.step5813: + %t162 = load i64, ptr %a117 + %t163 = add i64 %t162, 1 + store i64 %t163, ptr %a117 + br label %for.cond5811 +for.end5814: + %t164 = load ptr, ptr %a1 + %t165 = load { ptr, i64, i64 }, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.3832, i64 41, i64 0 }, ptr %a167 + store { ptr, i64, i64 } %t165, ptr %a168 + call void @finch_str_concat(ptr %a166, ptr %a167, ptr %a168) + %t169 = load { ptr, i64, i64 }, ptr %a166 + store { ptr, i64, i64 } %t169, ptr %a171 + store { ptr, i64, i64 } { ptr @.str.3833, i64 3, i64 0 }, ptr %a172 + call void @finch_str_concat(ptr %a170, ptr %a171, ptr %a172) + %t173 = load { ptr, i64, i64 }, ptr %a170 + %t174 = call { ptr, i64, i64 } @finch.gen.op(ptr %t164, { ptr, i64, i64 } %t173) + store { ptr, i64, i64 } %t174, ptr %a175 + %t176 = load ptr, ptr %a1 + %t177 = load { ptr, i64, i64 }, ptr %a175 + store { ptr, i64, i64 } { ptr @.str.3834, i64 30, i64 0 }, ptr %a179 + store { ptr, i64, i64 } %t177, ptr %a180 + call void @finch_str_concat(ptr %a178, ptr %a179, ptr %a180) + %t181 = load { ptr, i64, i64 }, ptr %a178 + store { ptr, i64, i64 } %t181, ptr %a183 + store { ptr, i64, i64 } { ptr @.str.3835, i64 6, i64 0 }, ptr %a184 + call void @finch_str_concat(ptr %a182, ptr %a183, ptr %a184) + %t185 = load { ptr, i64, i64 }, ptr %a182 + %t186 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t185, ptr %a188 + store { ptr, i64, i64 } %t186, ptr %a189 + call void @finch_str_concat(ptr %a187, ptr %a188, ptr %a189) + %t190 = load { ptr, i64, i64 }, ptr %a187 + store { ptr, i64, i64 } %t190, ptr %a192 + store { ptr, i64, i64 } { ptr @.str.3836, i64 3, i64 0 }, ptr %a193 + call void @finch_str_concat(ptr %a191, ptr %a192, ptr %a193) + %t194 = load { ptr, i64, i64 }, ptr %a191 + %t195 = call { ptr, i64, i64 } @finch.gen.op(ptr %t176, { ptr, i64, i64 } %t194) + store { ptr, i64, i64 } %t195, ptr %a196 + %t197 = load ptr, ptr %a1 + %t198 = load { ptr, i64, i64 }, ptr %a196 + store { ptr, i64, i64 } { ptr @.str.3837, i64 30, i64 0 }, ptr %a200 + store { ptr, i64, i64 } %t198, ptr %a201 + call void @finch_str_concat(ptr %a199, ptr %a200, ptr %a201) + %t202 = load { ptr, i64, i64 }, ptr %a199 + store { ptr, i64, i64 } %t202, ptr %a204 + store { ptr, i64, i64 } { ptr @.str.3838, i64 6, i64 0 }, ptr %a205 + call void @finch_str_concat(ptr %a203, ptr %a204, ptr %a205) + %t206 = load { ptr, i64, i64 }, ptr %a203 + %t207 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t206, ptr %a209 + store { ptr, i64, i64 } %t207, ptr %a210 + call void @finch_str_concat(ptr %a208, ptr %a209, ptr %a210) + %t211 = load { ptr, i64, i64 }, ptr %a208 + store { ptr, i64, i64 } %t211, ptr %a213 + store { ptr, i64, i64 } { ptr @.str.3839, i64 3, i64 0 }, ptr %a214 + call void @finch_str_concat(ptr %a212, ptr %a213, ptr %a214) + %t215 = load { ptr, i64, i64 }, ptr %a212 + %t216 = call { ptr, i64, i64 } @finch.gen.op(ptr %t197, { ptr, i64, i64 } %t215) + store { ptr, i64, i64 } %t216, ptr %a217 + %t218 = load { ptr, i64, i64 }, ptr %a217 + store { ptr, i64, i64 } %t218, ptr %a219 + call void @finch_str_copy(ptr %a220, ptr %a219) + %t221 = load { ptr, i64, i64 }, ptr %a220 + %t222 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t221, 0 + %t223 = load %S.ast.Type, ptr %a75 + store %S.ast.Type %t223, ptr %a224 + call void @finch.copy.S_ast_Type(ptr %a225, ptr %a224) + %t226 = load %S.ast.Type, ptr %a225 + %t227 = insertvalue %S.gen.Val %t222, %S.ast.Type %t226, 1 + %t228 = insertvalue %S.gen.Val %t227, i1 true, 2 + ret %S.gen.Val %t228 +} + +define internal void @finch.copy.S_gen_Place(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Place, ptr %src + store %S.gen.Place %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Place, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Place, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Place, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Place, ptr %src, i32 0, i32 1 + call void @finch.copy.S_ast_Type(ptr %t4, ptr %t5) + ret void +} + +define internal %S.gen.Place @finch.gen.place(ptr %p0, %S.ast.Node %p1, i1 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i1, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca %S.gen.Ref, align 16 + %a40 = alloca %S.gen.Place, align 16 + %a41 = alloca %S.gen.Place, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i1 %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.3840, i64 3, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br label %logic.from5817 +logic.from5817: + br i1 %t9, label %logic.rhs5818, label %logic.end5819 +logic.rhs5818: + %t10 = load ptr, ptr %a1 + %t11 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t12 = load { ptr, i64, i64 }, ptr %t11 + %t13 = call i64 @finch.gen.lookup(ptr %t10, { ptr, i64, i64 } %t12) + %t14 = icmp slt i64 %t13, 0 + br label %logic.rend5820 +logic.rend5820: + br label %logic.end5819 +logic.end5819: + %t15 = phi i1 [ false, %logic.from5817 ], [ %t14, %logic.rend5820 ] + br i1 %t15, label %then5821, label %endif5823 +then5821: + %t16 = load ptr, ptr %a1 + %t17 = load %S.ast.Node, ptr %a2 + %t18 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t19 = load { ptr, i64, i64 }, ptr %t18 + store { ptr, i64, i64 } { ptr @.str.3841, i64 28, i64 0 }, ptr %a21 + store { ptr, i64, i64 } %t19, ptr %a22 + call void @finch_str_concat(ptr %a20, ptr %a21, ptr %a22) + %t23 = load { ptr, i64, i64 }, ptr %a20 + store { ptr, i64, i64 } %t23, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.3842, i64 1, i64 0 }, ptr %a26 + call void @finch_str_concat(ptr %a24, ptr %a25, ptr %a26) + %t27 = load { ptr, i64, i64 }, ptr %a24 + call void @finch.gen.fail(ptr %t16, %S.ast.Node %t17, { ptr, i64, i64 } %t27) + br label %endif5823 +endif5823: + %t28 = load ptr, ptr %a1 + %t29 = load %S.ast.Node, ptr %a2 + %t30 = load i1, ptr %a3 + %t31 = call %S.gen.Ref @finch.gen.ref(ptr %t28, %S.ast.Node %t29, i1 %t30) + store %S.gen.Ref %t31, ptr %a32 + %t33 = getelementptr inbounds %S.gen.Ref, ptr %a32, i32 0, i32 0 + %t34 = load i1, ptr %t33 + %t35 = xor i1 %t34, true + br i1 %t35, label %then5824, label %endif5826 +then5824: + %t36 = load ptr, ptr %a1 + %t37 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t36, %S.ast.Node %t37, { ptr, i64, i64 } { ptr @.str.3843, i64 60, i64 0 }) + br label %endif5826 +endif5826: + %t38 = getelementptr inbounds %S.gen.Ref, ptr %a32, i32 0, i32 1 + %t39 = load %S.gen.Place, ptr %t38 + store %S.gen.Place %t39, ptr %a40 + call void @finch.copy.S_gen_Place(ptr %a41, ptr %a40) + %t42 = load %S.gen.Place, ptr %a41 + ret %S.gen.Place %t42 +} + +define internal void @finch.copy.S_cimport_CConst(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.cimport.CConst, ptr %src + store %S.cimport.CConst %t1, ptr %dst + %t2 = getelementptr inbounds %S.cimport.CConst, ptr %dst, i32 0, i32 3 + %t3 = getelementptr inbounds %S.cimport.CConst, ptr %src, i32 0, i32 3 + call void @finch_str_copy(ptr %t2, ptr %t3) + ret void +} + +define internal %S.gen.Ref @finch.gen.ref(ptr %p0, %S.ast.Node %p1, i1 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i1, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca i64, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca %S.cimport.CConst, align 16 + %a44 = alloca %S.cimport.CConst, align 16 + %a46 = alloca %S.cimport.CConst, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca %S.ast.Type, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca i64, align 16 + %a184 = alloca i64, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca %S.ast.Type, align 16 + %a246 = alloca %S.ast.Type, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a270 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca %S.gen.Var, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca %S.ast.Type, align 16 + %a304 = alloca %S.ast.Type, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i1 %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.3844, i64 3, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br i1 %t9, label %then5827, label %endif5829 +then5827: + %t10 = load ptr, ptr %a1 + %t11 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t12 = load { ptr, i64, i64 }, ptr %t11 + %t13 = call i64 @finch.gen.lookup(ptr %t10, { ptr, i64, i64 } %t12) + store i64 %t13, ptr %a14 + %t15 = load i64, ptr %a14 + %t16 = icmp slt i64 %t15, 0 + br label %logic.from5830 +logic.from5830: + br i1 %t16, label %logic.rhs5831, label %logic.end5832 +logic.rhs5831: + %t17 = load ptr, ptr %a1 + %t18 = icmp eq ptr %t17, null + br i1 %t18, label %panic5833, label %ok5834 +panic5833: + call void @finch_panic(ptr @.str.3845, i64 3186, ptr @.str.3846) + unreachable +ok5834: + %t19 = getelementptr inbounds %S.gen.Gen, ptr %t17, i32 0, i32 24 + %t20 = getelementptr inbounds %S.cimport.CImports, ptr %t19, i32 0, i32 1 + %t21 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t22 = load { ptr, i64, i64 }, ptr %t21 + store { ptr, i64, i64 } %t22, ptr %a23 + %t24 = call i64 @finch_map_find(ptr %t20, ptr %a23, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t25 = icmp sge i64 %t24, 0 + br label %logic.rend5835 +logic.rend5835: + br label %logic.end5832 +logic.end5832: + %t26 = phi i1 [ false, %logic.from5830 ], [ %t25, %logic.rend5835 ] + br i1 %t26, label %then5836, label %endif5838 +then5836: + %t27 = load ptr, ptr %a1 + %t28 = icmp eq ptr %t27, null + br i1 %t28, label %panic5839, label %ok5840 +panic5839: + call void @finch_panic(ptr @.str.3847, i64 3187, ptr @.str.3848) + unreachable +ok5840: + %t29 = getelementptr inbounds %S.gen.Gen, ptr %t27, i32 0, i32 24 + %t30 = getelementptr inbounds %S.cimport.CImports, ptr %t29, i32 0, i32 1 + %t31 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t32 = load { ptr, i64, i64 }, ptr %t31 + store { ptr, i64, i64 } %t32, ptr %a33 + %t34 = call i64 @finch_map_find(ptr %t30, ptr %a33, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t35 = icmp slt i64 %t34, 0 + br i1 %t35, label %map.missing5841, label %map.found5842 +map.missing5841: + store { ptr, i64, i64 } zeroinitializer, ptr %a36 + store { ptr, i64, i64 } %t32, ptr %a37 + call void @finch_buf_str(ptr %a36, ptr %a37, i32 1) + call void @finch_map_missing(ptr @.str.3849, i64 3187, ptr %a36) + unreachable +map.found5842: + %t38 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t30, i32 0, i32 0 + %t39 = load ptr, ptr %t38 + %t40 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t39, i64 %t34 + %t41 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t40, i32 0, i32 2 + %t42 = load %S.cimport.CConst, ptr %t41 + store %S.cimport.CConst %t42, ptr %a43 + call void @finch.copy.S_cimport_CConst(ptr %a44, ptr %a43) + %t45 = load %S.cimport.CConst, ptr %a44 + store %S.cimport.CConst %t45, ptr %a46 + %t47 = getelementptr inbounds %S.cimport.CConst, ptr %a46, i32 0, i32 0 + %t48 = load i1, ptr %t47 + br i1 %t48, label %then5843, label %endif5845 +then5843: + %t49 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t50 = getelementptr inbounds %S.cimport.CConst, ptr %a46, i32 0, i32 3 + %t51 = load { ptr, i64, i64 }, ptr %t50 + %t52 = call { ptr, i64, i64 } @finch.gen.llFloat({ ptr, i64, i64 } %t51) + %t53 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t52, 0 + %t54 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3850, i64 5, i64 0 }) + %t55 = insertvalue %S.gen.Val %t53, %S.ast.Type %t54, 1 + %t56 = insertvalue %S.gen.Val %t55, i1 true, 3 + %t57 = insertvalue %S.gen.Ref %t49, %S.gen.Val %t56, 2 + ret %S.gen.Ref %t57 +endif5845: + %t58 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t59 = getelementptr inbounds %S.cimport.CConst, ptr %a46, i32 0, i32 1 + %t60 = load i64, ptr %t59 + call void @finch_str_from_int(ptr %a61, i64 %t60) + %t62 = load { ptr, i64, i64 }, ptr %a61 + %t63 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t62, 0 + %t64 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3851, i64 3, i64 0 }) + %t65 = insertvalue %S.gen.Val %t63, %S.ast.Type %t64, 1 + %t66 = insertvalue %S.gen.Val %t65, i1 true, 3 + %t67 = insertvalue %S.gen.Ref %t58, %S.gen.Val %t66, 2 + ret %S.gen.Ref %t67 +endif5838: + %t68 = load i64, ptr %a14 + %t69 = icmp slt i64 %t68, 0 + br label %logic.from5846 +logic.from5846: + br i1 %t69, label %logic.rhs5847, label %logic.end5848 +logic.rhs5847: + %t70 = load ptr, ptr %a1 + %t71 = icmp eq ptr %t70, null + br i1 %t71, label %panic5849, label %ok5850 +panic5849: + call void @finch_panic(ptr @.str.3852, i64 3194, ptr @.str.3853) + unreachable +ok5850: + %t72 = getelementptr inbounds %S.gen.Gen, ptr %t70, i32 0, i32 24 + %t73 = getelementptr inbounds %S.cimport.CImports, ptr %t72, i32 0, i32 2 + %t74 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t75 = load { ptr, i64, i64 }, ptr %t74 + store { ptr, i64, i64 } %t75, ptr %a76 + %t77 = call i64 @finch_map_find(ptr %t73, ptr %a76, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.ast.Type }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t78 = icmp sge i64 %t77, 0 + %t79 = xor i1 %t78, true + br label %logic.rend5851 +logic.rend5851: + br label %logic.end5848 +logic.end5848: + %t80 = phi i1 [ false, %logic.from5846 ], [ %t79, %logic.rend5851 ] + br label %logic.from5852 +logic.from5852: + br i1 %t80, label %logic.rhs5853, label %logic.end5854 +logic.rhs5853: + %t81 = load ptr, ptr %a1 + %t82 = icmp eq ptr %t81, null + br i1 %t82, label %panic5855, label %ok5856 +panic5855: + call void @finch_panic(ptr @.str.3854, i64 3194, ptr @.str.3855) + unreachable +ok5856: + %t83 = getelementptr inbounds %S.gen.Gen, ptr %t81, i32 0, i32 24 + %t84 = getelementptr inbounds %S.cimport.CImports, ptr %t83, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.3856, i64 7, i64 0 }, ptr %a85 + %t86 = call i64 @finch_map_find(ptr %t84, ptr %a85, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t87 = icmp sge i64 %t86, 0 + br label %logic.rend5857 +logic.rend5857: + br label %logic.end5854 +logic.end5854: + %t88 = phi i1 [ false, %logic.from5852 ], [ %t87, %logic.rend5857 ] + br label %logic.from5858 +logic.from5858: + br i1 %t88, label %logic.rhs5859, label %logic.end5860 +logic.rhs5859: + %t89 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t90 = load { ptr, i64, i64 }, ptr %t89 + store { ptr, i64, i64 } %t90, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.3857, i64 5, i64 0 }, ptr %a92 + %t93 = call i32 @finch_str_eq(ptr %a91, ptr %a92) + %t94 = icmp ne i32 %t93, 0 + br label %logic.from5861 +logic.from5861: + br i1 %t94, label %logic.end5863, label %logic.rhs5862 +logic.rhs5862: + %t95 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t96 = load { ptr, i64, i64 }, ptr %t95 + store { ptr, i64, i64 } %t96, ptr %a97 + store { ptr, i64, i64 } { ptr @.str.3858, i64 6, i64 0 }, ptr %a98 + %t99 = call i32 @finch_str_eq(ptr %a97, ptr %a98) + %t100 = icmp ne i32 %t99, 0 + br label %logic.rend5864 +logic.rend5864: + br label %logic.end5863 +logic.end5863: + %t101 = phi i1 [ true, %logic.from5861 ], [ %t100, %logic.rend5864 ] + br label %logic.from5865 +logic.from5865: + br i1 %t101, label %logic.end5867, label %logic.rhs5866 +logic.rhs5866: + %t102 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t103 = load { ptr, i64, i64 }, ptr %t102 + store { ptr, i64, i64 } %t103, ptr %a104 + store { ptr, i64, i64 } { ptr @.str.3859, i64 6, i64 0 }, ptr %a105 + %t106 = call i32 @finch_str_eq(ptr %a104, ptr %a105) + %t107 = icmp ne i32 %t106, 0 + br label %logic.rend5868 +logic.rend5868: + br label %logic.end5867 +logic.end5867: + %t108 = phi i1 [ true, %logic.from5865 ], [ %t107, %logic.rend5868 ] + br label %logic.rend5869 +logic.rend5869: + br label %logic.end5860 +logic.end5860: + %t109 = phi i1 [ false, %logic.from5858 ], [ %t108, %logic.rend5869 ] + br i1 %t109, label %then5870, label %endif5872 +then5870: + store { ptr, i64, i64 } { ptr @.str.3860, i64 1, i64 0 }, ptr %a110 + %t111 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t112 = load { ptr, i64, i64 }, ptr %t111 + store { ptr, i64, i64 } %t112, ptr %a113 + store { ptr, i64, i64 } { ptr @.str.3861, i64 5, i64 0 }, ptr %a114 + %t115 = call i32 @finch_str_eq(ptr %a113, ptr %a114) + %t116 = icmp ne i32 %t115, 0 + br i1 %t116, label %then5873, label %else5874 +then5873: + store { ptr, i64, i64 } { ptr @.str.3862, i64 1, i64 0 }, ptr %a110 + br label %endif5875 +else5874: + %t117 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t118 = load { ptr, i64, i64 }, ptr %t117 + store { ptr, i64, i64 } %t118, ptr %a119 + store { ptr, i64, i64 } { ptr @.str.3863, i64 6, i64 0 }, ptr %a120 + %t121 = call i32 @finch_str_eq(ptr %a119, ptr %a120) + %t122 = icmp ne i32 %t121, 0 + br i1 %t122, label %then5876, label %endif5878 +then5876: + store { ptr, i64, i64 } { ptr @.str.3864, i64 1, i64 0 }, ptr %a110 + br label %endif5878 +endif5878: + br label %endif5875 +endif5875: + %t123 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t124 = load ptr, ptr %a1 + %t125 = load { ptr, i64, i64 }, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.3865, i64 31, i64 0 }, ptr %a127 + store { ptr, i64, i64 } %t125, ptr %a128 + call void @finch_str_concat(ptr %a126, ptr %a127, ptr %a128) + %t129 = load { ptr, i64, i64 }, ptr %a126 + store { ptr, i64, i64 } %t129, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.3866, i64 1, i64 0 }, ptr %a132 + call void @finch_str_concat(ptr %a130, ptr %a131, ptr %a132) + %t133 = load { ptr, i64, i64 }, ptr %a130 + %t134 = call { ptr, i64, i64 } @finch.gen.op(ptr %t124, { ptr, i64, i64 } %t133) + %t135 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t134, 0 + %t136 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3867, i64 3, i64 0 }) + %t137 = insertvalue %S.gen.Val %t135, %S.ast.Type %t136, 1 + %t138 = insertvalue %S.gen.Ref %t123, %S.gen.Val %t137, 2 + ret %S.gen.Ref %t138 +endif5872: + %t139 = load i64, ptr %a14 + %t140 = icmp slt i64 %t139, 0 + br label %logic.from5879 +logic.from5879: + br i1 %t140, label %logic.rhs5880, label %logic.end5881 +logic.rhs5880: + %t141 = load ptr, ptr %a1 + %t142 = icmp eq ptr %t141, null + br i1 %t142, label %panic5882, label %ok5883 +panic5882: + call void @finch_panic(ptr @.str.3868, i64 3203, ptr @.str.3869) + unreachable +ok5883: + %t143 = getelementptr inbounds %S.gen.Gen, ptr %t141, i32 0, i32 24 + %t144 = getelementptr inbounds %S.cimport.CImports, ptr %t143, i32 0, i32 2 + %t145 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t146 = load { ptr, i64, i64 }, ptr %t145 + store { ptr, i64, i64 } %t146, ptr %a147 + %t148 = call i64 @finch_map_find(ptr %t144, ptr %a147, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.ast.Type }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t149 = icmp sge i64 %t148, 0 + br label %logic.rend5884 +logic.rend5884: + br label %logic.end5881 +logic.end5881: + %t150 = phi i1 [ false, %logic.from5879 ], [ %t149, %logic.rend5884 ] + br i1 %t150, label %then5885, label %endif5887 +then5885: + %t151 = load ptr, ptr %a1 + %t152 = load ptr, ptr %a1 + %t153 = icmp eq ptr %t152, null + br i1 %t153, label %panic5888, label %ok5889 +panic5888: + call void @finch_panic(ptr @.str.3870, i64 3204, ptr @.str.3871) + unreachable +ok5889: + %t154 = getelementptr inbounds %S.gen.Gen, ptr %t152, i32 0, i32 24 + %t155 = getelementptr inbounds %S.cimport.CImports, ptr %t154, i32 0, i32 2 + %t156 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t157 = load { ptr, i64, i64 }, ptr %t156 + store { ptr, i64, i64 } %t157, ptr %a158 + %t159 = call i64 @finch_map_find(ptr %t155, ptr %a158, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.ast.Type }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t160 = icmp slt i64 %t159, 0 + br i1 %t160, label %map.missing5890, label %map.found5891 +map.missing5890: + store { ptr, i64, i64 } zeroinitializer, ptr %a161 + store { ptr, i64, i64 } %t157, ptr %a162 + call void @finch_buf_str(ptr %a161, ptr %a162, i32 1) + call void @finch_map_missing(ptr @.str.3872, i64 3204, ptr %a161) + unreachable +map.found5891: + %t163 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t155, i32 0, i32 0 + %t164 = load ptr, ptr %t163 + %t165 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t164, i64 %t159 + %t166 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t165, i32 0, i32 2 + %t167 = load %S.ast.Type, ptr %t166 + %t168 = load %S.ast.Node, ptr %a2 + %t169 = call %S.ast.Type @finch.gen.resolve(ptr %t151, %S.ast.Type %t167, %S.ast.Node %t168) + store %S.ast.Type %t169, ptr %a170 + %t171 = load ptr, ptr %a1 + %t172 = icmp eq ptr %t171, null + br i1 %t172, label %panic5892, label %ok5893 +panic5892: + call void @finch_panic(ptr @.str.3873, i64 3205, ptr @.str.3874) + unreachable +ok5893: + %t173 = getelementptr inbounds %S.gen.Gen, ptr %t171, i32 0, i32 36 + %t174 = getelementptr inbounds { ptr, i64, i64 }, ptr %t173, i32 0, i32 1 + %t175 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t176 = load { ptr, i64, i64 }, ptr %t175 + store { ptr, i64, i64 } { ptr @.str.3875, i64 2, i64 0 }, ptr %a178 + store { ptr, i64, i64 } %t176, ptr %a179 + call void @finch_str_concat(ptr %a177, ptr %a178, ptr %a179) + %t180 = load { ptr, i64, i64 }, ptr %a177 + store i64 -1, ptr %a181 + %t182 = load i64, ptr %t174 + %t183 = load ptr, ptr %t173 + store i64 0, ptr %a184 + br label %find.cond5894 +find.cond5894: + %t185 = load i64, ptr %a184 + %t186 = icmp slt i64 %t185, %t182 + br i1 %t186, label %find.body5895, label %find.end5898 +find.body5895: + %t187 = getelementptr inbounds { ptr, i64, i64 }, ptr %t183, i64 %t185 + %t188 = load { ptr, i64, i64 }, ptr %t187 + store { ptr, i64, i64 } %t188, ptr %a189 + store { ptr, i64, i64 } %t180, ptr %a190 + %t191 = call i32 @finch_str_eq(ptr %a189, ptr %a190) + %t192 = icmp ne i32 %t191, 0 + br i1 %t192, label %find.hit5896, label %find.next5897 +find.hit5896: + store i64 %t185, ptr %a181 + br label %find.end5898 +find.next5897: + %t193 = add i64 %t185, 1 + store i64 %t193, ptr %a184 + br label %find.cond5894 +find.end5898: + %t194 = load i64, ptr %a181 + %t195 = icmp sge i64 %t194, 0 + %t196 = xor i1 %t195, true + br i1 %t196, label %then5899, label %endif5901 +then5899: + %t197 = load ptr, ptr %a1 + %t198 = icmp eq ptr %t197, null + br i1 %t198, label %panic5902, label %ok5903 +panic5902: + call void @finch_panic(ptr @.str.3876, i64 3206, ptr @.str.3877) + unreachable +ok5903: + %t199 = getelementptr inbounds %S.gen.Gen, ptr %t197, i32 0, i32 36 + %t200 = getelementptr inbounds { ptr, i64, i64 }, ptr %t199, i32 0, i32 1 + %t201 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t202 = load { ptr, i64, i64 }, ptr %t201 + store { ptr, i64, i64 } { ptr @.str.3878, i64 2, i64 0 }, ptr %a204 + store { ptr, i64, i64 } %t202, ptr %a205 + call void @finch_str_concat(ptr %a203, ptr %a204, ptr %a205) + %t206 = load { ptr, i64, i64 }, ptr %a203 + %t207 = load i64, ptr %t200 + %t208 = add i64 %t207, 1 + call void @finch_arr_reserve(ptr %t199, i64 %t208, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t209 = load ptr, ptr %t199 + %t210 = getelementptr inbounds { ptr, i64, i64 }, ptr %t209, i64 %t207 + store { ptr, i64, i64 } %t206, ptr %t210 + store i64 %t208, ptr %t200 + %t211 = load ptr, ptr %a1 + %t212 = icmp eq ptr %t211, null + br i1 %t212, label %panic5904, label %ok5905 +panic5904: + call void @finch_panic(ptr @.str.3879, i64 3207, ptr @.str.3880) + unreachable +ok5905: + %t213 = getelementptr inbounds %S.gen.Gen, ptr %t211, i32 0, i32 2 + %t214 = getelementptr inbounds { ptr, i64, i64 }, ptr %t213, i32 0, i32 1 + %t215 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t216 = load { ptr, i64, i64 }, ptr %t215 + store { ptr, i64, i64 } { ptr @.str.3881, i64 1, i64 0 }, ptr %a218 + store { ptr, i64, i64 } %t216, ptr %a219 + call void @finch_str_concat(ptr %a217, ptr %a218, ptr %a219) + %t220 = load { ptr, i64, i64 }, ptr %a217 + store { ptr, i64, i64 } %t220, ptr %a222 + store { ptr, i64, i64 } { ptr @.str.3882, i64 19, i64 0 }, ptr %a223 + call void @finch_str_concat(ptr %a221, ptr %a222, ptr %a223) + %t224 = load { ptr, i64, i64 }, ptr %a221 + %t225 = load ptr, ptr %a1 + %t226 = load %S.ast.Type, ptr %a170 + %t227 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t225, %S.ast.Type %t226) + store { ptr, i64, i64 } %t224, ptr %a229 + store { ptr, i64, i64 } %t227, ptr %a230 + call void @finch_str_concat(ptr %a228, ptr %a229, ptr %a230) + %t231 = load { ptr, i64, i64 }, ptr %a228 + %t232 = load i64, ptr %t214 + %t233 = add i64 %t232, 1 + call void @finch_arr_reserve(ptr %t213, i64 %t233, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t234 = load ptr, ptr %t213 + %t235 = getelementptr inbounds { ptr, i64, i64 }, ptr %t234, i64 %t232 + store { ptr, i64, i64 } %t231, ptr %t235 + store i64 %t233, ptr %t214 + br label %endif5901 +endif5901: + %t236 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t237 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t238 = load { ptr, i64, i64 }, ptr %t237 + store { ptr, i64, i64 } { ptr @.str.3883, i64 1, i64 0 }, ptr %a240 + store { ptr, i64, i64 } %t238, ptr %a241 + call void @finch_str_concat(ptr %a239, ptr %a240, ptr %a241) + %t242 = load { ptr, i64, i64 }, ptr %a239 + %t243 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t242, 0 + %t244 = load %S.ast.Type, ptr %a170 + store %S.ast.Type %t244, ptr %a245 + call void @finch.copy.S_ast_Type(ptr %a246, ptr %a245) + %t247 = load %S.ast.Type, ptr %a246 + %t248 = insertvalue %S.gen.Place %t243, %S.ast.Type %t247, 1 + %t249 = insertvalue %S.gen.Ref %t236, %S.gen.Place %t248, 1 + ret %S.gen.Ref %t249 +endif5887: + %t250 = load i64, ptr %a14 + %t251 = icmp slt i64 %t250, 0 + br i1 %t251, label %then5906, label %endif5908 +then5906: + %t252 = load ptr, ptr %a1 + %t253 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t254 = load { ptr, i64, i64 }, ptr %t253 + %t255 = call i1 @finch.gen.imports(ptr %t252, { ptr, i64, i64 } %t254) + br i1 %t255, label %then5909, label %endif5911 +then5909: + %t256 = load ptr, ptr %a1 + %t257 = load %S.ast.Node, ptr %a2 + %t258 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t259 = load { ptr, i64, i64 }, ptr %t258 + store { ptr, i64, i64 } { ptr @.str.3884, i64 1, i64 0 }, ptr %a261 + store { ptr, i64, i64 } %t259, ptr %a262 + call void @finch_str_concat(ptr %a260, ptr %a261, ptr %a262) + %t263 = load { ptr, i64, i64 }, ptr %a260 + store { ptr, i64, i64 } %t263, ptr %a265 + store { ptr, i64, i64 } { ptr @.str.3885, i64 43, i64 0 }, ptr %a266 + call void @finch_str_concat(ptr %a264, ptr %a265, ptr %a266) + %t267 = load { ptr, i64, i64 }, ptr %a264 + %t268 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t269 = load { ptr, i64, i64 }, ptr %t268 + store { ptr, i64, i64 } %t267, ptr %a271 + store { ptr, i64, i64 } %t269, ptr %a272 + call void @finch_str_concat(ptr %a270, ptr %a271, ptr %a272) + %t273 = load { ptr, i64, i64 }, ptr %a270 + store { ptr, i64, i64 } %t273, ptr %a275 + store { ptr, i64, i64 } { ptr @.str.3886, i64 10, i64 0 }, ptr %a276 + call void @finch_str_concat(ptr %a274, ptr %a275, ptr %a276) + %t277 = load { ptr, i64, i64 }, ptr %a274 + call void @finch.gen.fail(ptr %t256, %S.ast.Node %t257, { ptr, i64, i64 } %t277) + br label %endif5911 +endif5911: + %t278 = load ptr, ptr %a1 + %t279 = load %S.ast.Node, ptr %a2 + %t280 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t281 = load { ptr, i64, i64 }, ptr %t280 + store { ptr, i64, i64 } { ptr @.str.3887, i64 28, i64 0 }, ptr %a283 + store { ptr, i64, i64 } %t281, ptr %a284 + call void @finch_str_concat(ptr %a282, ptr %a283, ptr %a284) + %t285 = load { ptr, i64, i64 }, ptr %a282 + store { ptr, i64, i64 } %t285, ptr %a287 + store { ptr, i64, i64 } { ptr @.str.3888, i64 1, i64 0 }, ptr %a288 + call void @finch_str_concat(ptr %a286, ptr %a287, ptr %a288) + %t289 = load { ptr, i64, i64 }, ptr %a286 + call void @finch.gen.fail(ptr %t278, %S.ast.Node %t279, { ptr, i64, i64 } %t289) + br label %endif5908 +endif5908: + %t290 = load ptr, ptr %a1 + %t291 = load i64, ptr %a14 + %t292 = call %S.gen.Var @finch.gen.varAt(ptr %t290, i64 %t291) + store %S.gen.Var %t292, ptr %a293 + %t294 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t295 = getelementptr inbounds %S.gen.Var, ptr %a293, i32 0, i32 2 + %t296 = load { ptr, i64, i64 }, ptr %t295 + store { ptr, i64, i64 } %t296, ptr %a297 + call void @finch_str_copy(ptr %a298, ptr %a297) + %t299 = load { ptr, i64, i64 }, ptr %a298 + %t300 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t299, 0 + %t301 = getelementptr inbounds %S.gen.Var, ptr %a293, i32 0, i32 1 + %t302 = load %S.ast.Type, ptr %t301 + store %S.ast.Type %t302, ptr %a303 + call void @finch.copy.S_ast_Type(ptr %a304, ptr %a303) + %t305 = load %S.ast.Type, ptr %a304 + %t306 = insertvalue %S.gen.Place %t300, %S.ast.Type %t305, 1 + %t307 = insertvalue %S.gen.Ref %t294, %S.gen.Place %t306, 1 + ret %S.gen.Ref %t307 +endif5829: + %t308 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t309 = load { ptr, i64, i64 }, ptr %t308 + store { ptr, i64, i64 } %t309, ptr %a310 + store { ptr, i64, i64 } { ptr @.str.3889, i64 6, i64 0 }, ptr %a311 + %t312 = call i32 @finch_str_eq(ptr %a310, ptr %a311) + %t313 = icmp ne i32 %t312, 0 + br i1 %t313, label %then5912, label %endif5914 +then5912: + %t314 = load ptr, ptr %a1 + %t315 = load %S.ast.Node, ptr %a2 + %t316 = load i1, ptr %a3 + %t317 = call %S.gen.Ref @finch.gen.member(ptr %t314, %S.ast.Node %t315, i1 %t316) + ret %S.gen.Ref %t317 +endif5914: + %t318 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t319 = load { ptr, i64, i64 }, ptr %t318 + store { ptr, i64, i64 } %t319, ptr %a320 + store { ptr, i64, i64 } { ptr @.str.3890, i64 5, i64 0 }, ptr %a321 + %t322 = call i32 @finch_str_eq(ptr %a320, ptr %a321) + %t323 = icmp ne i32 %t322, 0 + br i1 %t323, label %then5915, label %endif5917 +then5915: + %t324 = load ptr, ptr %a1 + %t325 = load %S.ast.Node, ptr %a2 + %t326 = load i1, ptr %a3 + %t327 = call %S.gen.Ref @finch.gen.index(ptr %t324, %S.ast.Node %t325, i1 %t326) + ret %S.gen.Ref %t327 +endif5917: + %t328 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t329 = load ptr, ptr %a1 + %t330 = load %S.ast.Node, ptr %a2 + %t331 = call %S.gen.Val @finch.gen.expr(ptr %t329, %S.ast.Node %t330) + %t332 = insertvalue %S.gen.Ref %t328, %S.gen.Val %t331, 2 + ret %S.gen.Ref %t332 +} + +define internal { ptr, i64, i64 } @finch.gen.llFloat({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca i64, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + call void @finch_str_copy(ptr %a4, ptr %a3) + %t5 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t5, ptr %a6 + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.3892, i64 1, i64 0 }, ptr %a10 + %t11 = call i32 @finch_str_starts(ptr %a8, ptr %a10) + %t12 = icmp ne i32 %t11, 0 + br i1 %t12, label %then5918, label %endif5920 +then5918: + %t13 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.3893, i64 1, i64 0 }, ptr %a15 + store { ptr, i64, i64 } %t13, ptr %a16 + call void @finch_str_concat(ptr %a14, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t17, ptr %a6 + br label %endif5920 +endif5920: + %t18 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t18, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.3895, i64 1, i64 0 }, ptr %a21 + %t22 = call i64 @finch_str_find(ptr %a19, ptr %a21) + %t23 = icmp sge i64 %t22, 0 + %t24 = xor i1 %t23, true + br i1 %t24, label %then5921, label %endif5923 +then5921: + %t25 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t25, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.3897, i64 1, i64 0 }, ptr %a28 + %t29 = call i64 @finch_str_find(ptr %a26, ptr %a28) + store i64 %t29, ptr %a30 + %t31 = load i64, ptr %a30 + %t32 = icmp slt i64 %t31, 0 + br i1 %t32, label %then5924, label %endif5926 +then5924: + %t33 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.3899, i64 1, i64 0 }, ptr %a36 + %t37 = call i64 @finch_str_find(ptr %a34, ptr %a36) + store i64 %t37, ptr %a30 + br label %endif5926 +endif5926: + %t38 = load i64, ptr %a30 + %t39 = icmp slt i64 %t38, 0 + br i1 %t39, label %then5927, label %endif5929 +then5927: + %t40 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t40, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.3900, i64 2, i64 0 }, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + ret { ptr, i64, i64 } %t44 +endif5929: + %t45 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t45, ptr %a46 + %t48 = load i64, ptr %a30 + call void @finch_str_sub(ptr %a47, ptr %a46, i64 0, i64 %t48, ptr @.str.3901, i64 3243) + %t49 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } %t49, ptr %a51 + store { ptr, i64, i64 } { ptr @.str.3902, i64 2, i64 0 }, ptr %a52 + call void @finch_str_concat(ptr %a50, ptr %a51, ptr %a52) + %t53 = load { ptr, i64, i64 }, ptr %a50 + %t54 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t54, ptr %a55 + %t57 = load i64, ptr %a30 + %t58 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t59 = load i64, ptr %t58 + call void @finch_str_sub(ptr %a56, ptr %a55, i64 %t57, i64 %t59, ptr @.str.3903, i64 3243) + %t60 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t53, ptr %a62 + store { ptr, i64, i64 } %t60, ptr %a63 + call void @finch_str_concat(ptr %a61, ptr %a62, ptr %a63) + %t64 = load { ptr, i64, i64 }, ptr %a61 + ret { ptr, i64, i64 } %t64 +endif5923: + %t65 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t65, ptr %a66 + call void @finch_str_copy(ptr %a67, ptr %a66) + %t68 = load { ptr, i64, i64 }, ptr %a67 + ret { ptr, i64, i64 } %t68 +} + +define internal i64 @finch.gen.enumNamed(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.3904, i64 3, i64 0 }, ptr %a6 + %t7 = call i32 @finch_str_eq(ptr %a5, ptr %a6) + %t8 = icmp ne i32 %t7, 0 + br label %logic.from5930 +logic.from5930: + br i1 %t8, label %logic.rhs5931, label %logic.end5932 +logic.rhs5931: + %t9 = load ptr, ptr %a1 + %t10 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t11 = load { ptr, i64, i64 }, ptr %t10 + %t12 = call i64 @finch.gen.lookup(ptr %t9, { ptr, i64, i64 } %t11) + %t13 = icmp slt i64 %t12, 0 + br label %logic.rend5933 +logic.rend5933: + br label %logic.end5932 +logic.end5932: + %t14 = phi i1 [ false, %logic.from5930 ], [ %t13, %logic.rend5933 ] + br i1 %t14, label %then5934, label %endif5936 +then5934: + %t15 = load ptr, ptr %a1 + %t16 = load ptr, ptr %a1 + %t17 = icmp eq ptr %t16, null + br i1 %t17, label %panic5937, label %ok5938 +panic5937: + call void @finch_panic(ptr @.str.3905, i64 3251, ptr @.str.3906) + unreachable +ok5938: + %t18 = getelementptr inbounds %S.gen.Gen, ptr %t16, i32 0, i32 13 + %t19 = load { ptr, i64, i64 }, ptr %t18 + %t20 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t21 = load { ptr, i64, i64 }, ptr %t20 + %t22 = call i64 @finch.gen.findEnum(ptr %t15, { ptr, i64, i64 } %t19, { ptr, i64, i64 } %t21) + ret i64 %t22 +endif5936: + %t23 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 0 + %t24 = load { ptr, i64, i64 }, ptr %t23 + store { ptr, i64, i64 } %t24, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.3907, i64 6, i64 0 }, ptr %a26 + %t27 = call i32 @finch_str_eq(ptr %a25, ptr %a26) + %t28 = icmp ne i32 %t27, 0 + br label %logic.from5939 +logic.from5939: + br i1 %t28, label %logic.rhs5940, label %logic.end5941 +logic.rhs5940: + %t29 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t30 = load { ptr, i64, i64 }, ptr %t29 + %t31 = extractvalue { ptr, i64, i64 } %t30, 1 + %t32 = icmp uge i64 0, %t31 + br i1 %t32, label %range5942, label %inrange5943 +range5942: + call void @finch_panic_index(ptr @.str.3908, i64 3253, i64 0, i64 %t31) + unreachable +inrange5943: + %t33 = extractvalue { ptr, i64, i64 } %t30, 0 + %t34 = getelementptr inbounds %S.ast.Node, ptr %t33, i64 0 + %t35 = getelementptr inbounds %S.ast.Node, ptr %t34, i32 0, i32 0 + %t36 = load { ptr, i64, i64 }, ptr %t35 + store { ptr, i64, i64 } %t36, ptr %a37 + store { ptr, i64, i64 } { ptr @.str.3909, i64 3, i64 0 }, ptr %a38 + %t39 = call i32 @finch_str_eq(ptr %a37, ptr %a38) + %t40 = icmp ne i32 %t39, 0 + br label %logic.rend5944 +logic.rend5944: + br label %logic.end5941 +logic.end5941: + %t41 = phi i1 [ false, %logic.from5939 ], [ %t40, %logic.rend5944 ] + br label %logic.from5945 +logic.from5945: + br i1 %t41, label %logic.rhs5946, label %logic.end5947 +logic.rhs5946: + %t42 = load ptr, ptr %a1 + %t43 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t44 = load { ptr, i64, i64 }, ptr %t43 + %t45 = extractvalue { ptr, i64, i64 } %t44, 1 + %t46 = icmp uge i64 0, %t45 + br i1 %t46, label %range5948, label %inrange5949 +range5948: + call void @finch_panic_index(ptr @.str.3910, i64 3253, i64 0, i64 %t45) + unreachable +inrange5949: + %t47 = extractvalue { ptr, i64, i64 } %t44, 0 + %t48 = getelementptr inbounds %S.ast.Node, ptr %t47, i64 0 + %t49 = getelementptr inbounds %S.ast.Node, ptr %t48, i32 0, i32 1 + %t50 = load { ptr, i64, i64 }, ptr %t49 + %t51 = call i64 @finch.gen.lookup(ptr %t42, { ptr, i64, i64 } %t50) + %t52 = icmp slt i64 %t51, 0 + br label %logic.rend5950 +logic.rend5950: + br label %logic.end5947 +logic.end5947: + %t53 = phi i1 [ false, %logic.from5945 ], [ %t52, %logic.rend5950 ] + br label %logic.from5951 +logic.from5951: + br i1 %t53, label %logic.rhs5952, label %logic.end5953 +logic.rhs5952: + %t54 = load ptr, ptr %a1 + %t55 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t56 = load { ptr, i64, i64 }, ptr %t55 + %t57 = extractvalue { ptr, i64, i64 } %t56, 1 + %t58 = icmp uge i64 0, %t57 + br i1 %t58, label %range5954, label %inrange5955 +range5954: + call void @finch_panic_index(ptr @.str.3911, i64 3253, i64 0, i64 %t57) + unreachable +inrange5955: + %t59 = extractvalue { ptr, i64, i64 } %t56, 0 + %t60 = getelementptr inbounds %S.ast.Node, ptr %t59, i64 0 + %t61 = getelementptr inbounds %S.ast.Node, ptr %t60, i32 0, i32 1 + %t62 = load { ptr, i64, i64 }, ptr %t61 + %t63 = call i1 @finch.gen.imports(ptr %t54, { ptr, i64, i64 } %t62) + br label %logic.rend5956 +logic.rend5956: + br label %logic.end5953 +logic.end5953: + %t64 = phi i1 [ false, %logic.from5951 ], [ %t63, %logic.rend5956 ] + br i1 %t64, label %then5957, label %endif5959 +then5957: + %t65 = load ptr, ptr %a1 + %t66 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t67 = load { ptr, i64, i64 }, ptr %t66 + %t68 = extractvalue { ptr, i64, i64 } %t67, 1 + %t69 = icmp uge i64 0, %t68 + br i1 %t69, label %range5960, label %inrange5961 +range5960: + call void @finch_panic_index(ptr @.str.3912, i64 3254, i64 0, i64 %t68) + unreachable +inrange5961: + %t70 = extractvalue { ptr, i64, i64 } %t67, 0 + %t71 = getelementptr inbounds %S.ast.Node, ptr %t70, i64 0 + %t72 = getelementptr inbounds %S.ast.Node, ptr %t71, i32 0, i32 1 + %t73 = load { ptr, i64, i64 }, ptr %t72 + %t74 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t75 = load { ptr, i64, i64 }, ptr %t74 + %t76 = call i64 @finch.gen.findEnum(ptr %t65, { ptr, i64, i64 } %t73, { ptr, i64, i64 } %t75) + ret i64 %t76 +endif5959: + ret i64 -1 +} + +define internal %S.gen.Val @finch.gen.enumValue(ptr %p0, %S.ast.Node %p1, i64 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i64, align 16 + %a14 = alloca %S.gen.EnumDef, align 16 + %a15 = alloca %S.gen.EnumDef, align 16 + %a17 = alloca %S.gen.EnumDef, align 16 + %a22 = alloca i64, align 16 + %a25 = alloca i64, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca i64, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i64 %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic5962, label %ok5963 +panic5962: + call void @finch_panic(ptr @.str.3913, i64 3261, ptr @.str.3914) + unreachable +ok5963: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 20 + %t7 = load i64, ptr %a3 + %t8 = load { ptr, i64, i64 }, ptr %t6 + %t9 = extractvalue { ptr, i64, i64 } %t8, 1 + %t10 = icmp uge i64 %t7, %t9 + br i1 %t10, label %range5964, label %inrange5965 +range5964: + call void @finch_panic_index(ptr @.str.3915, i64 3261, i64 %t7, i64 %t9) + unreachable +inrange5965: + %t11 = extractvalue { ptr, i64, i64 } %t8, 0 + %t12 = getelementptr inbounds %S.gen.EnumDef, ptr %t11, i64 %t7 + %t13 = load %S.gen.EnumDef, ptr %t12 + store %S.gen.EnumDef %t13, ptr %a14 + call void @finch.copy.S_gen_EnumDef(ptr %a15, ptr %a14) + %t16 = load %S.gen.EnumDef, ptr %a15 + store %S.gen.EnumDef %t16, ptr %a17 + %t18 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 2 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i32 0, i32 1 + %t20 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store i64 -1, ptr %a22 + %t23 = load i64, ptr %t19 + %t24 = load ptr, ptr %t18 + store i64 0, ptr %a25 + br label %find.cond5966 +find.cond5966: + %t26 = load i64, ptr %a25 + %t27 = icmp slt i64 %t26, %t23 + br i1 %t27, label %find.body5967, label %find.end5970 +find.body5967: + %t28 = getelementptr inbounds { ptr, i64, i64 }, ptr %t24, i64 %t26 + %t29 = load { ptr, i64, i64 }, ptr %t28 + store { ptr, i64, i64 } %t29, ptr %a30 + store { ptr, i64, i64 } %t21, ptr %a31 + %t32 = call i32 @finch_str_eq(ptr %a30, ptr %a31) + %t33 = icmp ne i32 %t32, 0 + br i1 %t33, label %find.hit5968, label %find.next5969 +find.hit5968: + store i64 %t26, ptr %a22 + br label %find.end5970 +find.next5969: + %t34 = add i64 %t26, 1 + store i64 %t34, ptr %a25 + br label %find.cond5966 +find.end5970: + %t35 = load i64, ptr %a22 + store i64 %t35, ptr %a36 + %t37 = load i64, ptr %a36 + %t38 = icmp slt i64 %t37, 0 + br i1 %t38, label %then5971, label %endif5973 +then5971: + %t39 = load ptr, ptr %a1 + %t40 = load %S.ast.Node, ptr %a2 + %t41 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 1 + %t42 = load { ptr, i64, i64 }, ptr %t41 + store { ptr, i64, i64 } { ptr @.str.3916, i64 9, i64 0 }, ptr %a44 + store { ptr, i64, i64 } %t42, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + store { ptr, i64, i64 } %t46, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.3917, i64 17, i64 0 }, ptr %a49 + call void @finch_str_concat(ptr %a47, ptr %a48, ptr %a49) + %t50 = load { ptr, i64, i64 }, ptr %a47 + %t51 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t52 = load { ptr, i64, i64 }, ptr %t51 + store { ptr, i64, i64 } %t50, ptr %a54 + store { ptr, i64, i64 } %t52, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t56, ptr %a58 + store { ptr, i64, i64 } { ptr @.str.3918, i64 11, i64 0 }, ptr %a59 + call void @finch_str_concat(ptr %a57, ptr %a58, ptr %a59) + %t60 = load { ptr, i64, i64 }, ptr %a57 + %t61 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 2 + %t62 = getelementptr inbounds { ptr, i64, i64 }, ptr %t61, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.3919, i64 2, i64 0 }, ptr %a63 + call void @finch_str_join(ptr %a64, ptr %t61, ptr %a63) + %t65 = load { ptr, i64, i64 }, ptr %a64 + store { ptr, i64, i64 } %t60, ptr %a67 + store { ptr, i64, i64 } %t65, ptr %a68 + call void @finch_str_concat(ptr %a66, ptr %a67, ptr %a68) + %t69 = load { ptr, i64, i64 }, ptr %a66 + store { ptr, i64, i64 } %t69, ptr %a71 + store { ptr, i64, i64 } { ptr @.str.3920, i64 1, i64 0 }, ptr %a72 + call void @finch_str_concat(ptr %a70, ptr %a71, ptr %a72) + %t73 = load { ptr, i64, i64 }, ptr %a70 + call void @finch.gen.fail(ptr %t39, %S.ast.Node %t40, { ptr, i64, i64 } %t73) + br label %endif5973 +endif5973: + %t74 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 3 + %t75 = load i64, ptr %a36 + %t76 = load { ptr, i64, i64 }, ptr %t74 + %t77 = extractvalue { ptr, i64, i64 } %t76, 1 + %t78 = icmp uge i64 %t75, %t77 + br i1 %t78, label %range5974, label %inrange5975 +range5974: + call void @finch_panic_index(ptr @.str.3921, i64 3266, i64 %t75, i64 %t77) + unreachable +inrange5975: + %t79 = extractvalue { ptr, i64, i64 } %t76, 0 + %t80 = getelementptr inbounds i64, ptr %t79, i64 %t75 + %t81 = load i64, ptr %t80 + call void @finch_str_from_int(ptr %a82, i64 %t81) + %t83 = load { ptr, i64, i64 }, ptr %a82 + %t84 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t83, 0 + %t85 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.3922, i64 4, i64 0 }, 0 + %t86 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 1 + %t87 = load { ptr, i64, i64 }, ptr %t86 + store { ptr, i64, i64 } %t87, ptr %a88 + call void @finch_str_copy(ptr %a89, ptr %a88) + %t90 = load { ptr, i64, i64 }, ptr %a89 + %t91 = insertvalue %S.ast.Type %t85, { ptr, i64, i64 } %t90, 2 + %t92 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 0 + %t93 = load { ptr, i64, i64 }, ptr %t92 + store { ptr, i64, i64 } %t93, ptr %a94 + call void @finch_str_copy(ptr %a95, ptr %a94) + %t96 = load { ptr, i64, i64 }, ptr %a95 + %t97 = insertvalue %S.ast.Type %t91, { ptr, i64, i64 } %t96, 3 + %t98 = insertvalue %S.gen.Val %t84, %S.ast.Type %t97, 1 + ret %S.gen.Val %t98 +} + +define internal %S.gen.Ref @finch.gen.member(ptr %p0, %S.ast.Node %p1, i1 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i1, align 16 + %a13 = alloca i64, align 16 + %a35 = alloca %S.gen.Ref, align 16 + %a39 = alloca %S.ast.Type, align 16 + %a40 = alloca %S.ast.Type, align 16 + %a42 = alloca %S.ast.Type, align 16 + %a48 = alloca %S.ast.Type, align 16 + %a49 = alloca %S.ast.Type, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca %S.ast.Type, align 16 + %a108 = alloca %S.ast.Type, align 16 + %a110 = alloca %S.ast.Type, align 16 + %a111 = alloca i1, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca i64, align 16 + %a137 = alloca i64, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca %S.ast.Type, align 16 + %a166 = alloca %S.ast.Type, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca %S.ast.Type, align 16 + %a196 = alloca %S.ast.Type, align 16 + %a201 = alloca %S.ast.Type, align 16 + %a202 = alloca %S.ast.Type, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a360 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a378 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a384 = alloca { ptr, i64, i64 }, align 16 + %a385 = alloca { ptr, i64, i64 }, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a398 = alloca { ptr, i64, i64 }, align 16 + %a399 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a410 = alloca { ptr, i64, i64 }, align 16 + %a411 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a423 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a438 = alloca { ptr, i64, i64 }, align 16 + %a439 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a443 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a458 = alloca { ptr, i64, i64 }, align 16 + %a459 = alloca { ptr, i64, i64 }, align 16 + %a461 = alloca { ptr, i64, i64 }, align 16 + %a462 = alloca { ptr, i64, i64 }, align 16 + %a463 = alloca { ptr, i64, i64 }, align 16 + %a468 = alloca { ptr, i64, i64 }, align 16 + %a469 = alloca { ptr, i64, i64 }, align 16 + %a470 = alloca { ptr, i64, i64 }, align 16 + %a472 = alloca { ptr, i64, i64 }, align 16 + %a473 = alloca { ptr, i64, i64 }, align 16 + %a474 = alloca { ptr, i64, i64 }, align 16 + %a483 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca { ptr, i64, i64 }, align 16 + %a492 = alloca { ptr, i64, i64 }, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a497 = alloca { ptr, i64, i64 }, align 16 + %a498 = alloca { ptr, i64, i64 }, align 16 + %a499 = alloca { ptr, i64, i64 }, align 16 + %a501 = alloca { ptr, i64, i64 }, align 16 + %a502 = alloca { ptr, i64, i64 }, align 16 + %a503 = alloca { ptr, i64, i64 }, align 16 + %a520 = alloca %S.gen.StructDef, align 16 + %a521 = alloca %S.gen.StructDef, align 16 + %a523 = alloca %S.gen.StructDef, align 16 + %a528 = alloca i64, align 16 + %a531 = alloca i64, align 16 + %a536 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a542 = alloca i64, align 16 + %a549 = alloca { ptr, i64, i64 }, align 16 + %a550 = alloca { ptr, i64, i64 }, align 16 + %a551 = alloca { ptr, i64, i64 }, align 16 + %a553 = alloca { ptr, i64, i64 }, align 16 + %a554 = alloca { ptr, i64, i64 }, align 16 + %a555 = alloca { ptr, i64, i64 }, align 16 + %a559 = alloca { ptr, i64, i64 }, align 16 + %a560 = alloca { ptr, i64, i64 }, align 16 + %a561 = alloca { ptr, i64, i64 }, align 16 + %a563 = alloca { ptr, i64, i64 }, align 16 + %a564 = alloca { ptr, i64, i64 }, align 16 + %a565 = alloca { ptr, i64, i64 }, align 16 + %a569 = alloca { ptr, i64, i64 }, align 16 + %a570 = alloca { ptr, i64, i64 }, align 16 + %a572 = alloca { ptr, i64, i64 }, align 16 + %a573 = alloca { ptr, i64, i64 }, align 16 + %a574 = alloca { ptr, i64, i64 }, align 16 + %a576 = alloca { ptr, i64, i64 }, align 16 + %a577 = alloca { ptr, i64, i64 }, align 16 + %a578 = alloca { ptr, i64, i64 }, align 16 + %a588 = alloca %S.ast.Type, align 16 + %a589 = alloca %S.ast.Type, align 16 + %a591 = alloca %S.ast.Type, align 16 + %a598 = alloca { ptr, i64, i64 }, align 16 + %a599 = alloca { ptr, i64, i64 }, align 16 + %a600 = alloca { ptr, i64, i64 }, align 16 + %a602 = alloca { ptr, i64, i64 }, align 16 + %a603 = alloca { ptr, i64, i64 }, align 16 + %a604 = alloca { ptr, i64, i64 }, align 16 + %a609 = alloca { ptr, i64, i64 }, align 16 + %a610 = alloca { ptr, i64, i64 }, align 16 + %a611 = alloca { ptr, i64, i64 }, align 16 + %a613 = alloca { ptr, i64, i64 }, align 16 + %a614 = alloca { ptr, i64, i64 }, align 16 + %a615 = alloca { ptr, i64, i64 }, align 16 + %a625 = alloca { ptr, i64, i64 }, align 16 + %a627 = alloca { ptr, i64, i64 }, align 16 + %a628 = alloca { ptr, i64, i64 }, align 16 + %a629 = alloca { ptr, i64, i64 }, align 16 + %a632 = alloca { ptr, i64, i64 }, align 16 + %a635 = alloca { ptr, i64, i64 }, align 16 + %a636 = alloca { ptr, i64, i64 }, align 16 + %a640 = alloca %S.ast.Type, align 16 + %a641 = alloca %S.ast.Type, align 16 + %a649 = alloca { ptr, i64, i64 }, align 16 + %a650 = alloca { ptr, i64, i64 }, align 16 + %a651 = alloca { ptr, i64, i64 }, align 16 + %a653 = alloca { ptr, i64, i64 }, align 16 + %a654 = alloca { ptr, i64, i64 }, align 16 + %a655 = alloca { ptr, i64, i64 }, align 16 + %a660 = alloca { ptr, i64, i64 }, align 16 + %a661 = alloca { ptr, i64, i64 }, align 16 + %a662 = alloca { ptr, i64, i64 }, align 16 + %a664 = alloca { ptr, i64, i64 }, align 16 + %a665 = alloca { ptr, i64, i64 }, align 16 + %a666 = alloca { ptr, i64, i64 }, align 16 + %a676 = alloca { ptr, i64, i64 }, align 16 + %a678 = alloca { ptr, i64, i64 }, align 16 + %a679 = alloca { ptr, i64, i64 }, align 16 + %a680 = alloca { ptr, i64, i64 }, align 16 + %a683 = alloca { ptr, i64, i64 }, align 16 + %a685 = alloca { ptr, i64, i64 }, align 16 + %a686 = alloca { ptr, i64, i64 }, align 16 + %a690 = alloca %S.ast.Type, align 16 + %a691 = alloca %S.ast.Type, align 16 + %a694 = alloca %S.gen.Val, align 16 + %a708 = alloca %S.ast.Type, align 16 + %a709 = alloca %S.ast.Type, align 16 + %a715 = alloca %S.gen.Val, align 16 + %a716 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i1 %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = icmp uge i64 0, %t7 + br i1 %t8, label %range5976, label %inrange5977 +range5976: + call void @finch_panic_index(ptr @.str.3923, i64 3270, i64 0, i64 %t7) + unreachable +inrange5977: + %t9 = extractvalue { ptr, i64, i64 } %t6, 0 + %t10 = getelementptr inbounds %S.ast.Node, ptr %t9, i64 0 + %t11 = load %S.ast.Node, ptr %t10 + %t12 = call i64 @finch.gen.enumNamed(ptr %t4, %S.ast.Node %t11) + store i64 %t12, ptr %a13 + %t14 = load i64, ptr %a13 + %t15 = icmp sge i64 %t14, 0 + br i1 %t15, label %then5978, label %endif5980 +then5978: + %t16 = load i1, ptr %a3 + br i1 %t16, label %then5981, label %endif5983 +then5981: + %t17 = load ptr, ptr %a1 + %t18 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t17, %S.ast.Node %t18, { ptr, i64, i64 } { ptr @.str.3924, i64 37, i64 0 }) + br label %endif5983 +endif5983: + %t19 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t20 = load ptr, ptr %a1 + %t21 = load %S.ast.Node, ptr %a2 + %t22 = load i64, ptr %a13 + %t23 = call %S.gen.Val @finch.gen.enumValue(ptr %t20, %S.ast.Node %t21, i64 %t22) + %t24 = insertvalue %S.gen.Ref %t19, %S.gen.Val %t23, 2 + ret %S.gen.Ref %t24 +endif5980: + %t25 = load ptr, ptr %a1 + %t26 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t27 = load { ptr, i64, i64 }, ptr %t26 + %t28 = extractvalue { ptr, i64, i64 } %t27, 1 + %t29 = icmp uge i64 0, %t28 + br i1 %t29, label %range5984, label %inrange5985 +range5984: + call void @finch_panic_index(ptr @.str.3925, i64 3277, i64 0, i64 %t28) + unreachable +inrange5985: + %t30 = extractvalue { ptr, i64, i64 } %t27, 0 + %t31 = getelementptr inbounds %S.ast.Node, ptr %t30, i64 0 + %t32 = load %S.ast.Node, ptr %t31 + %t33 = load i1, ptr %a3 + %t34 = call %S.gen.Ref @finch.gen.ref(ptr %t25, %S.ast.Node %t32, i1 %t33) + store %S.gen.Ref %t34, ptr %a35 + %t36 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t37 = getelementptr inbounds %S.gen.Val, ptr %t36, i32 0, i32 1 + %t38 = load %S.ast.Type, ptr %t37 + store %S.ast.Type %t38, ptr %a39 + call void @finch.copy.S_ast_Type(ptr %a40, ptr %a39) + %t41 = load %S.ast.Type, ptr %a40 + store %S.ast.Type %t41, ptr %a42 + %t43 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 0 + %t44 = load i1, ptr %t43 + br i1 %t44, label %then5986, label %endif5988 +then5986: + %t45 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 1 + %t46 = getelementptr inbounds %S.gen.Place, ptr %t45, i32 0, i32 1 + %t47 = load %S.ast.Type, ptr %t46 + store %S.ast.Type %t47, ptr %a48 + call void @finch.copy.S_ast_Type(ptr %a49, ptr %a48) + %t50 = load %S.ast.Type, ptr %a49 + store %S.ast.Type %t50, ptr %a42 + br label %endif5988 +endif5988: + %t51 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t52 = load { ptr, i64, i64 }, ptr %t51 + store { ptr, i64, i64 } %t52, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.3926, i64 3, i64 0 }, ptr %a54 + %t55 = call i32 @finch_str_eq(ptr %a53, ptr %a54) + %t56 = icmp ne i32 %t55, 0 + br i1 %t56, label %then5989, label %endif5991 +then5989: + %t57 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t58 = getelementptr inbounds %S.gen.Val, ptr %t57, i32 0, i32 0 + %t59 = load { ptr, i64, i64 }, ptr %t58 + store { ptr, i64, i64 } %t59, ptr %a60 + call void @finch_str_copy(ptr %a61, ptr %a60) + %t62 = load { ptr, i64, i64 }, ptr %a61 + store { ptr, i64, i64 } %t62, ptr %a63 + %t64 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 0 + %t65 = load i1, ptr %t64 + br i1 %t65, label %then5992, label %endif5994 +then5992: + %t66 = load ptr, ptr %a1 + %t67 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 1 + %t68 = getelementptr inbounds %S.gen.Place, ptr %t67, i32 0, i32 0 + %t69 = load { ptr, i64, i64 }, ptr %t68 + %t70 = call { ptr, i64, i64 } @finch.gen.load(ptr %t66, { ptr, i64, i64 } { ptr @.str.3927, i64 3, i64 0 }, { ptr, i64, i64 } %t69) + store { ptr, i64, i64 } %t70, ptr %a63 + br label %endif5994 +endif5994: + %t71 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 1 + %t72 = getelementptr inbounds { ptr, i64, i64 }, ptr %t71, i32 0, i32 1 + %t73 = load i64, ptr %t72 + %t74 = icmp eq i64 %t73, 0 + br i1 %t74, label %then5995, label %endif5997 +then5995: + %t75 = load ptr, ptr %a1 + %t76 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t75, %S.ast.Node %t76, { ptr, i64, i64 } { ptr @.str.3928, i64 57, i64 0 }) + br label %endif5997 +endif5997: + %t77 = load ptr, ptr %a1 + %t78 = load ptr, ptr %a1 + %t79 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.3929, i64 12, i64 0 }, ptr %a81 + store { ptr, i64, i64 } %t79, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t83, ptr %a85 + store { ptr, i64, i64 } { ptr @.str.3930, i64 6, i64 0 }, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + %t88 = call { ptr, i64, i64 } @finch.gen.op(ptr %t78, { ptr, i64, i64 } %t87) + %t89 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t90 = load { ptr, i64, i64 }, ptr %t89 + store { ptr, i64, i64 } { ptr @.str.3931, i64 6, i64 0 }, ptr %a92 + store { ptr, i64, i64 } %t90, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + store { ptr, i64, i64 } %t94, ptr %a96 + store { ptr, i64, i64 } { ptr @.str.3932, i64 18, i64 0 }, ptr %a97 + call void @finch_str_concat(ptr %a95, ptr %a96, ptr %a97) + %t98 = load { ptr, i64, i64 }, ptr %a95 + %t99 = load %S.ast.Node, ptr %a2 + call void @finch.gen.panicIf(ptr %t77, { ptr, i64, i64 } %t88, { ptr, i64, i64 } %t98, %S.ast.Node %t99) + %t100 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 1 + %t101 = load { ptr, i64, i64 }, ptr %t100 + %t102 = extractvalue { ptr, i64, i64 } %t101, 1 + %t103 = icmp uge i64 0, %t102 + br i1 %t103, label %range5998, label %inrange5999 +range5998: + call void @finch_panic_index(ptr @.str.3933, i64 3291, i64 0, i64 %t102) + unreachable +inrange5999: + %t104 = extractvalue { ptr, i64, i64 } %t101, 0 + %t105 = getelementptr inbounds %S.ast.Type, ptr %t104, i64 0 + %t106 = load %S.ast.Type, ptr %t105 + store %S.ast.Type %t106, ptr %a107 + call void @finch.copy.S_ast_Type(ptr %a108, ptr %a107) + %t109 = load %S.ast.Type, ptr %a108 + store %S.ast.Type %t109, ptr %a110 + store i1 false, ptr %a111 + %t112 = getelementptr inbounds %S.ast.Type, ptr %a110, i32 0, i32 0 + %t113 = load { ptr, i64, i64 }, ptr %t112 + store { ptr, i64, i64 } %t113, ptr %a114 + store { ptr, i64, i64 } { ptr @.str.3934, i64 6, i64 0 }, ptr %a115 + %t116 = call i32 @finch_str_eq(ptr %a114, ptr %a115) + %t117 = icmp ne i32 %t116, 0 + br i1 %t117, label %then6000, label %endif6002 +then6000: + %t118 = load ptr, ptr %a1 + %t119 = icmp eq ptr %t118, null + br i1 %t119, label %panic6003, label %ok6004 +panic6003: + call void @finch_panic(ptr @.str.3935, i64 3294, ptr @.str.3936) + unreachable +ok6004: + %t120 = getelementptr inbounds %S.gen.Gen, ptr %t118, i32 0, i32 15 + %t121 = load ptr, ptr %a1 + %t122 = getelementptr inbounds %S.ast.Type, ptr %a110, i32 0, i32 3 + %t123 = load { ptr, i64, i64 }, ptr %t122 + %t124 = getelementptr inbounds %S.ast.Type, ptr %a110, i32 0, i32 2 + %t125 = load { ptr, i64, i64 }, ptr %t124 + %t126 = call i64 @finch.gen.findStruct(ptr %t121, { ptr, i64, i64 } %t123, { ptr, i64, i64 } %t125) + %t127 = load { ptr, i64, i64 }, ptr %t120 + %t128 = extractvalue { ptr, i64, i64 } %t127, 1 + %t129 = icmp uge i64 %t126, %t128 + br i1 %t129, label %range6005, label %inrange6006 +range6005: + call void @finch_panic_index(ptr @.str.3937, i64 3294, i64 %t126, i64 %t128) + unreachable +inrange6006: + %t130 = extractvalue { ptr, i64, i64 } %t127, 0 + %t131 = getelementptr inbounds %S.gen.StructDef, ptr %t130, i64 %t126 + %t132 = getelementptr inbounds %S.gen.StructDef, ptr %t131, i32 0, i32 11 + %t133 = getelementptr inbounds { ptr, i64, i64 }, ptr %t132, i32 0, i32 1 + store i64 -1, ptr %a134 + %t135 = load i64, ptr %t133 + %t136 = load ptr, ptr %t132 + store i64 0, ptr %a137 + br label %find.cond6007 +find.cond6007: + %t138 = load i64, ptr %a137 + %t139 = icmp slt i64 %t138, %t135 + br i1 %t139, label %find.body6008, label %find.end6011 +find.body6008: + %t140 = getelementptr inbounds { ptr, i64, i64 }, ptr %t136, i64 %t138 + %t141 = load { ptr, i64, i64 }, ptr %t140 + store { ptr, i64, i64 } %t141, ptr %a142 + store { ptr, i64, i64 } { ptr @.str.3938, i64 5, i64 0 }, ptr %a143 + %t144 = call i32 @finch_str_eq(ptr %a142, ptr %a143) + %t145 = icmp ne i32 %t144, 0 + br i1 %t145, label %find.hit6009, label %find.next6010 +find.hit6009: + store i64 %t138, ptr %a134 + br label %find.end6011 +find.next6010: + %t146 = add i64 %t138, 1 + store i64 %t146, ptr %a137 + br label %find.cond6007 +find.end6011: + %t147 = load i64, ptr %a134 + %t148 = icmp sge i64 %t147, 0 + store i1 %t148, ptr %a111 + br label %endif6002 +endif6002: + %t149 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t150 = load { ptr, i64, i64 }, ptr %t149 + store { ptr, i64, i64 } %t150, ptr %a151 + store { ptr, i64, i64 } { ptr @.str.3939, i64 5, i64 0 }, ptr %a152 + %t153 = call i32 @finch_str_eq(ptr %a151, ptr %a152) + %t154 = icmp ne i32 %t153, 0 + br label %logic.from6012 +logic.from6012: + br i1 %t154, label %logic.rhs6013, label %logic.end6014 +logic.rhs6013: + %t155 = load i1, ptr %a111 + %t156 = xor i1 %t155, true + br label %logic.rend6015 +logic.rend6015: + br label %logic.end6014 +logic.end6014: + %t157 = phi i1 [ false, %logic.from6012 ], [ %t156, %logic.rend6015 ] + br i1 %t157, label %then6016, label %endif6018 +then6016: + %t158 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t159 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t159, ptr %a160 + call void @finch_str_copy(ptr %a161, ptr %a160) + %t162 = load { ptr, i64, i64 }, ptr %a161 + %t163 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t162, 0 + %t164 = load %S.ast.Type, ptr %a110 + store %S.ast.Type %t164, ptr %a165 + call void @finch.copy.S_ast_Type(ptr %a166, ptr %a165) + %t167 = load %S.ast.Type, ptr %a166 + %t168 = insertvalue %S.gen.Place %t163, %S.ast.Type %t167, 1 + %t169 = insertvalue %S.gen.Ref %t158, %S.gen.Place %t168, 1 + ret %S.gen.Ref %t169 +endif6018: + %t170 = getelementptr inbounds %S.ast.Type, ptr %a110, i32 0, i32 0 + %t171 = load { ptr, i64, i64 }, ptr %t170 + store { ptr, i64, i64 } %t171, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.3940, i64 6, i64 0 }, ptr %a173 + %t174 = call i32 @finch_str_eq(ptr %a172, ptr %a173) + %t175 = icmp eq i32 %t174, 0 + br i1 %t175, label %then6019, label %endif6021 +then6019: + %t176 = load ptr, ptr %a1 + %t177 = load %S.ast.Node, ptr %a2 + %t178 = load %S.ast.Type, ptr %a42 + %t179 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t178) + store { ptr, i64, i64 } { ptr @.str.3941, i64 2, i64 0 }, ptr %a181 + store { ptr, i64, i64 } %t179, ptr %a182 + call void @finch_str_concat(ptr %a180, ptr %a181, ptr %a182) + %t183 = load { ptr, i64, i64 }, ptr %a180 + store { ptr, i64, i64 } %t183, ptr %a185 + store { ptr, i64, i64 } { ptr @.str.3942, i64 43, i64 0 }, ptr %a186 + call void @finch_str_concat(ptr %a184, ptr %a185, ptr %a186) + %t187 = load { ptr, i64, i64 }, ptr %a184 + call void @finch.gen.fail(ptr %t176, %S.ast.Node %t177, { ptr, i64, i64 } %t187) + br label %endif6021 +endif6021: + %t188 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t189 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t189, ptr %a190 + call void @finch_str_copy(ptr %a191, ptr %a190) + %t192 = load { ptr, i64, i64 }, ptr %a191 + %t193 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t192, 0 + %t194 = load %S.ast.Type, ptr %a110 + store %S.ast.Type %t194, ptr %a195 + call void @finch.copy.S_ast_Type(ptr %a196, ptr %a195) + %t197 = load %S.ast.Type, ptr %a196 + %t198 = insertvalue %S.gen.Place %t193, %S.ast.Type %t197, 1 + %t199 = insertvalue %S.gen.Ref %t188, %S.gen.Place %t198, 1 + store %S.gen.Ref %t199, ptr %a35 + %t200 = load %S.ast.Type, ptr %a110 + store %S.ast.Type %t200, ptr %a201 + call void @finch.copy.S_ast_Type(ptr %a202, ptr %a201) + %t203 = load %S.ast.Type, ptr %a202 + store %S.ast.Type %t203, ptr %a42 + br label %endif5991 +endif5991: + %t204 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t205 = load { ptr, i64, i64 }, ptr %t204 + store { ptr, i64, i64 } %t205, ptr %a206 + store { ptr, i64, i64 } { ptr @.str.3943, i64 5, i64 0 }, ptr %a207 + %t208 = call i32 @finch_str_eq(ptr %a206, ptr %a207) + %t209 = icmp ne i32 %t208, 0 + br i1 %t209, label %then6022, label %endif6024 +then6022: + %t210 = load i1, ptr %a3 + br i1 %t210, label %then6025, label %endif6027 +then6025: + %t211 = load ptr, ptr %a1 + %t212 = load %S.ast.Node, ptr %a2 + %t213 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t214 = load { ptr, i64, i64 }, ptr %t213 + store { ptr, i64, i64 } { ptr @.str.3944, i64 1, i64 0 }, ptr %a216 + store { ptr, i64, i64 } %t214, ptr %a217 + call void @finch_str_concat(ptr %a215, ptr %a216, ptr %a217) + %t218 = load { ptr, i64, i64 }, ptr %a215 + store { ptr, i64, i64 } %t218, ptr %a220 + store { ptr, i64, i64 } { ptr @.str.3945, i64 26, i64 0 }, ptr %a221 + call void @finch_str_concat(ptr %a219, ptr %a220, ptr %a221) + %t222 = load { ptr, i64, i64 }, ptr %a219 + call void @finch.gen.fail(ptr %t211, %S.ast.Node %t212, { ptr, i64, i64 } %t222) + br label %endif6027 +endif6027: + %t223 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t224 = load { ptr, i64, i64 }, ptr %t223 + store { ptr, i64, i64 } %t224, ptr %a225 + store { ptr, i64, i64 } { ptr @.str.3946, i64 3, i64 0 }, ptr %a226 + %t227 = call i32 @finch_str_eq(ptr %a225, ptr %a226) + %t228 = icmp ne i32 %t227, 0 + br i1 %t228, label %then6028, label %endif6030 +then6028: + %t229 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t230 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 4 + %t231 = load i64, ptr %t230 + call void @finch_str_from_int(ptr %a232, i64 %t231) + %t233 = load { ptr, i64, i64 }, ptr %a232 + %t234 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t233, 0 + %t235 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3947, i64 3, i64 0 }) + %t236 = insertvalue %S.gen.Val %t234, %S.ast.Type %t235, 1 + %t237 = insertvalue %S.gen.Val %t236, i1 true, 3 + %t238 = insertvalue %S.gen.Ref %t229, %S.gen.Val %t237, 2 + ret %S.gen.Ref %t238 +endif6030: + %t239 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t240 = load { ptr, i64, i64 }, ptr %t239 + store { ptr, i64, i64 } %t240, ptr %a241 + store { ptr, i64, i64 } { ptr @.str.3948, i64 3, i64 0 }, ptr %a242 + %t243 = call i32 @finch_str_eq(ptr %a241, ptr %a242) + %t244 = icmp eq i32 %t243, 0 + br i1 %t244, label %then6031, label %endif6033 +then6031: + %t245 = load ptr, ptr %a1 + %t246 = load %S.ast.Node, ptr %a2 + %t247 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t248 = load { ptr, i64, i64 }, ptr %t247 + store { ptr, i64, i64 } { ptr @.str.3949, i64 34, i64 0 }, ptr %a250 + store { ptr, i64, i64 } %t248, ptr %a251 + call void @finch_str_concat(ptr %a249, ptr %a250, ptr %a251) + %t252 = load { ptr, i64, i64 }, ptr %a249 + store { ptr, i64, i64 } %t252, ptr %a254 + store { ptr, i64, i64 } { ptr @.str.3950, i64 1, i64 0 }, ptr %a255 + call void @finch_str_concat(ptr %a253, ptr %a254, ptr %a255) + %t256 = load { ptr, i64, i64 }, ptr %a253 + call void @finch.gen.fail(ptr %t245, %S.ast.Node %t246, { ptr, i64, i64 } %t256) + br label %endif6033 +endif6033: + %t257 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 0 + %t258 = load i1, ptr %t257 + %t259 = xor i1 %t258, true + br i1 %t259, label %then6034, label %endif6036 +then6034: + %t260 = load ptr, ptr %a1 + %t261 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t260, %S.ast.Node %t261, { ptr, i64, i64 } { ptr @.str.3951, i64 48, i64 0 }) + br label %endif6036 +endif6036: + %t262 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t263 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 1 + %t264 = getelementptr inbounds %S.gen.Place, ptr %t263, i32 0, i32 0 + %t265 = load { ptr, i64, i64 }, ptr %t264 + store { ptr, i64, i64 } %t265, ptr %a266 + call void @finch_str_copy(ptr %a267, ptr %a266) + %t268 = load { ptr, i64, i64 }, ptr %a267 + %t269 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t268, 0 + %t270 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 1 + %t271 = load { ptr, i64, i64 }, ptr %t270 + %t272 = extractvalue { ptr, i64, i64 } %t271, 1 + %t273 = icmp uge i64 0, %t272 + br i1 %t273, label %range6037, label %inrange6038 +range6037: + call void @finch_panic_index(ptr @.str.3952, i64 3318, i64 0, i64 %t272) + unreachable +inrange6038: + %t274 = extractvalue { ptr, i64, i64 } %t271, 0 + %t275 = getelementptr inbounds %S.ast.Type, ptr %t274, i64 0 + %t276 = load %S.ast.Type, ptr %t275 + %t277 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t276) + %t278 = insertvalue %S.gen.Val %t269, %S.ast.Type %t277, 1 + %t279 = insertvalue %S.gen.Ref %t262, %S.gen.Val %t278, 2 + ret %S.gen.Ref %t279 +endif6024: + %t280 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t281 = load { ptr, i64, i64 }, ptr %t280 + store { ptr, i64, i64 } %t281, ptr %a282 + store { ptr, i64, i64 } { ptr @.str.3953, i64 5, i64 0 }, ptr %a283 + %t284 = call i32 @finch_str_eq(ptr %a282, ptr %a283) + %t285 = icmp ne i32 %t284, 0 + br label %logic.from6039 +logic.from6039: + br i1 %t285, label %logic.end6041, label %logic.rhs6040 +logic.rhs6040: + %t286 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t287 = load { ptr, i64, i64 }, ptr %t286 + store { ptr, i64, i64 } %t287, ptr %a288 + store { ptr, i64, i64 } { ptr @.str.3954, i64 3, i64 0 }, ptr %a289 + %t290 = call i32 @finch_str_eq(ptr %a288, ptr %a289) + %t291 = icmp ne i32 %t290, 0 + br label %logic.rend6042 +logic.rend6042: + br label %logic.end6041 +logic.end6041: + %t292 = phi i1 [ true, %logic.from6039 ], [ %t291, %logic.rend6042 ] + br label %logic.from6043 +logic.from6043: + br i1 %t292, label %logic.rhs6044, label %logic.end6045 +logic.rhs6044: + %t293 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t294 = load { ptr, i64, i64 }, ptr %t293 + store { ptr, i64, i64 } %t294, ptr %a295 + store { ptr, i64, i64 } { ptr @.str.3955, i64 3, i64 0 }, ptr %a296 + %t297 = call i32 @finch_str_eq(ptr %a295, ptr %a296) + %t298 = icmp ne i32 %t297, 0 + br label %logic.rend6046 +logic.rend6046: + br label %logic.end6045 +logic.end6045: + %t299 = phi i1 [ false, %logic.from6043 ], [ %t298, %logic.rend6046 ] + br i1 %t299, label %then6047, label %endif6049 +then6047: + %t300 = load i1, ptr %a3 + br i1 %t300, label %then6050, label %endif6052 +then6050: + %t301 = load ptr, ptr %a1 + %t302 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t301, %S.ast.Node %t302, { ptr, i64, i64 } { ptr @.str.3956, i64 30, i64 0 }) + br label %endif6052 +endif6052: + %t303 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 0 + %t304 = load i1, ptr %t303 + %t305 = xor i1 %t304, true + br label %logic.from6053 +logic.from6053: + br i1 %t305, label %logic.rhs6054, label %logic.end6055 +logic.rhs6054: + %t306 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t307 = getelementptr inbounds %S.gen.Val, ptr %t306, i32 0, i32 2 + %t308 = load i1, ptr %t307 + br label %logic.rend6056 +logic.rend6056: + br label %logic.end6055 +logic.end6055: + %t309 = phi i1 [ false, %logic.from6053 ], [ %t308, %logic.rend6056 ] + br label %logic.from6057 +logic.from6057: + br i1 %t309, label %logic.rhs6058, label %logic.end6059 +logic.rhs6058: + %t310 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t311 = getelementptr inbounds %S.gen.Val, ptr %t310, i32 0, i32 0 + %t312 = load { ptr, i64, i64 }, ptr %t311 + store { ptr, i64, i64 } %t312, ptr %a313 + store { ptr, i64, i64 } { ptr @.str.3958, i64 1, i64 0 }, ptr %a315 + %t316 = call i32 @finch_str_starts(ptr %a313, ptr %a315) + %t317 = icmp ne i32 %t316, 0 + br label %logic.rend6060 +logic.rend6060: + br label %logic.end6059 +logic.end6059: + %t318 = phi i1 [ false, %logic.from6057 ], [ %t317, %logic.rend6060 ] + br i1 %t318, label %then6061, label %endif6063 +then6061: + %t319 = load ptr, ptr %a1 + %t320 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t319, %S.ast.Node %t320, { ptr, i64, i64 } { ptr @.str.3959, i64 53, i64 0 }) + br label %endif6063 +endif6063: + %t321 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t322 = getelementptr inbounds %S.gen.Val, ptr %t321, i32 0, i32 0 + %t323 = load { ptr, i64, i64 }, ptr %t322 + store { ptr, i64, i64 } %t323, ptr %a324 + call void @finch_str_copy(ptr %a325, ptr %a324) + %t326 = load { ptr, i64, i64 }, ptr %a325 + store { ptr, i64, i64 } %t326, ptr %a327 + %t328 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 0 + %t329 = load i1, ptr %t328 + br i1 %t329, label %then6064, label %endif6066 +then6064: + %t330 = load ptr, ptr %a1 + %t331 = load ptr, ptr %a1 + %t332 = load %S.ast.Type, ptr %a42 + %t333 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t331, %S.ast.Type %t332) + %t334 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 1 + %t335 = getelementptr inbounds %S.gen.Place, ptr %t334, i32 0, i32 0 + %t336 = load { ptr, i64, i64 }, ptr %t335 + %t337 = call { ptr, i64, i64 } @finch.gen.load(ptr %t330, { ptr, i64, i64 } %t333, { ptr, i64, i64 } %t336) + store { ptr, i64, i64 } %t337, ptr %a327 + br label %endif6066 +endif6066: + %t338 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t339 = load { ptr, i64, i64 }, ptr %t338 + store { ptr, i64, i64 } %t339, ptr %a340 + store { ptr, i64, i64 } { ptr @.str.3960, i64 3, i64 0 }, ptr %a341 + %t342 = call i32 @finch_str_eq(ptr %a340, ptr %a341) + %t343 = icmp ne i32 %t342, 0 + br i1 %t343, label %then6067, label %endif6069 +then6067: + %t344 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t345 = load ptr, ptr %a1 + %t346 = load { ptr, i64, i64 }, ptr %a327 + %t347 = call { ptr, i64, i64 } @finch.gen.cstr(ptr %t345, { ptr, i64, i64 } %t346) + %t348 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t347, 0 + %t349 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3961, i64 4, i64 0 }) + %t350 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t349) + %t351 = insertvalue %S.gen.Val %t348, %S.ast.Type %t350, 1 + %t352 = insertvalue %S.gen.Ref %t344, %S.gen.Val %t351, 2 + ret %S.gen.Ref %t352 +endif6069: + %t353 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t354 = load ptr, ptr %a1 + %t355 = load { ptr, i64, i64 }, ptr %a327 + store { ptr, i64, i64 } { ptr @.str.3962, i64 31, i64 0 }, ptr %a357 + store { ptr, i64, i64 } %t355, ptr %a358 + call void @finch_str_concat(ptr %a356, ptr %a357, ptr %a358) + %t359 = load { ptr, i64, i64 }, ptr %a356 + store { ptr, i64, i64 } %t359, ptr %a361 + store { ptr, i64, i64 } { ptr @.str.3963, i64 3, i64 0 }, ptr %a362 + call void @finch_str_concat(ptr %a360, ptr %a361, ptr %a362) + %t363 = load { ptr, i64, i64 }, ptr %a360 + %t364 = call { ptr, i64, i64 } @finch.gen.op(ptr %t354, { ptr, i64, i64 } %t363) + %t365 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t364, 0 + %t366 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 1 + %t367 = load { ptr, i64, i64 }, ptr %t366 + %t368 = extractvalue { ptr, i64, i64 } %t367, 1 + %t369 = icmp uge i64 0, %t368 + br i1 %t369, label %range6070, label %inrange6071 +range6070: + call void @finch_panic_index(ptr @.str.3964, i64 3336, i64 0, i64 %t368) + unreachable +inrange6071: + %t370 = extractvalue { ptr, i64, i64 } %t367, 0 + %t371 = getelementptr inbounds %S.ast.Type, ptr %t370, i64 0 + %t372 = load %S.ast.Type, ptr %t371 + %t373 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t372) + %t374 = insertvalue %S.gen.Val %t365, %S.ast.Type %t373, 1 + %t375 = insertvalue %S.gen.Ref %t353, %S.gen.Val %t374, 2 + ret %S.gen.Ref %t375 +endif6049: + %t376 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t377 = load { ptr, i64, i64 }, ptr %t376 + store { ptr, i64, i64 } %t377, ptr %a378 + store { ptr, i64, i64 } { ptr @.str.3965, i64 5, i64 0 }, ptr %a379 + %t380 = call i32 @finch_str_eq(ptr %a378, ptr %a379) + %t381 = icmp ne i32 %t380, 0 + br label %logic.from6072 +logic.from6072: + br i1 %t381, label %logic.end6074, label %logic.rhs6073 +logic.rhs6073: + %t382 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t383 = load { ptr, i64, i64 }, ptr %t382 + store { ptr, i64, i64 } %t383, ptr %a384 + store { ptr, i64, i64 } { ptr @.str.3966, i64 3, i64 0 }, ptr %a385 + %t386 = call i32 @finch_str_eq(ptr %a384, ptr %a385) + %t387 = icmp ne i32 %t386, 0 + br label %logic.rend6075 +logic.rend6075: + br label %logic.end6074 +logic.end6074: + %t388 = phi i1 [ true, %logic.from6072 ], [ %t387, %logic.rend6075 ] + br label %logic.from6076 +logic.from6076: + br i1 %t388, label %logic.end6078, label %logic.rhs6077 +logic.rhs6077: + %t389 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t390 = load { ptr, i64, i64 }, ptr %t389 + store { ptr, i64, i64 } %t390, ptr %a391 + store { ptr, i64, i64 } { ptr @.str.3967, i64 3, i64 0 }, ptr %a392 + %t393 = call i32 @finch_str_eq(ptr %a391, ptr %a392) + %t394 = icmp ne i32 %t393, 0 + br label %logic.rend6079 +logic.rend6079: + br label %logic.end6078 +logic.end6078: + %t395 = phi i1 [ true, %logic.from6076 ], [ %t394, %logic.rend6079 ] + br i1 %t395, label %then6080, label %endif6082 +then6080: + %t396 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t397 = load { ptr, i64, i64 }, ptr %t396 + store { ptr, i64, i64 } %t397, ptr %a398 + store { ptr, i64, i64 } { ptr @.str.3968, i64 3, i64 0 }, ptr %a399 + %t400 = call i32 @finch_str_eq(ptr %a398, ptr %a399) + %t401 = icmp eq i32 %t400, 0 + br i1 %t401, label %then6083, label %endif6085 +then6083: + %t402 = load ptr, ptr %a1 + %t403 = load %S.ast.Node, ptr %a2 + %t404 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t405 = load { ptr, i64, i64 }, ptr %t404 + store { ptr, i64, i64 } { ptr @.str.3969, i64 37, i64 0 }, ptr %a407 + store { ptr, i64, i64 } %t405, ptr %a408 + call void @finch_str_concat(ptr %a406, ptr %a407, ptr %a408) + %t409 = load { ptr, i64, i64 }, ptr %a406 + store { ptr, i64, i64 } %t409, ptr %a411 + store { ptr, i64, i64 } { ptr @.str.3970, i64 1, i64 0 }, ptr %a412 + call void @finch_str_concat(ptr %a410, ptr %a411, ptr %a412) + %t413 = load { ptr, i64, i64 }, ptr %a410 + call void @finch.gen.fail(ptr %t402, %S.ast.Node %t403, { ptr, i64, i64 } %t413) + br label %endif6085 +endif6085: + %t414 = load i1, ptr %a3 + br i1 %t414, label %then6086, label %endif6088 +then6086: + %t415 = load ptr, ptr %a1 + %t416 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t415, %S.ast.Node %t416, { ptr, i64, i64 } { ptr @.str.3971, i64 48, i64 0 }) + br label %endif6088 +endif6088: + %t417 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 0 + %t418 = load i1, ptr %t417 + br i1 %t418, label %then6089, label %endif6091 +then6089: + %t419 = load ptr, ptr %a1 + %t420 = load ptr, ptr %a1 + %t421 = load %S.ast.Type, ptr %a42 + %t422 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t420, %S.ast.Type %t421) + store { ptr, i64, i64 } { ptr @.str.3972, i64 23, i64 0 }, ptr %a424 + store { ptr, i64, i64 } %t422, ptr %a425 + call void @finch_str_concat(ptr %a423, ptr %a424, ptr %a425) + %t426 = load { ptr, i64, i64 }, ptr %a423 + store { ptr, i64, i64 } %t426, ptr %a428 + store { ptr, i64, i64 } { ptr @.str.3973, i64 6, i64 0 }, ptr %a429 + call void @finch_str_concat(ptr %a427, ptr %a428, ptr %a429) + %t430 = load { ptr, i64, i64 }, ptr %a427 + %t431 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 1 + %t432 = getelementptr inbounds %S.gen.Place, ptr %t431, i32 0, i32 0 + %t433 = load { ptr, i64, i64 }, ptr %t432 + store { ptr, i64, i64 } %t430, ptr %a435 + store { ptr, i64, i64 } %t433, ptr %a436 + call void @finch_str_concat(ptr %a434, ptr %a435, ptr %a436) + %t437 = load { ptr, i64, i64 }, ptr %a434 + store { ptr, i64, i64 } %t437, ptr %a439 + store { ptr, i64, i64 } { ptr @.str.3974, i64 14, i64 0 }, ptr %a440 + call void @finch_str_concat(ptr %a438, ptr %a439, ptr %a440) + %t441 = load { ptr, i64, i64 }, ptr %a438 + %t442 = call { ptr, i64, i64 } @finch.gen.op(ptr %t419, { ptr, i64, i64 } %t441) + store { ptr, i64, i64 } %t442, ptr %a443 + %t444 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t445 = load ptr, ptr %a1 + %t446 = load { ptr, i64, i64 }, ptr %a443 + %t447 = call { ptr, i64, i64 } @finch.gen.load(ptr %t445, { ptr, i64, i64 } { ptr @.str.3975, i64 3, i64 0 }, { ptr, i64, i64 } %t446) + %t448 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t447, 0 + %t449 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3976, i64 3, i64 0 }) + %t450 = insertvalue %S.gen.Val %t448, %S.ast.Type %t449, 1 + %t451 = insertvalue %S.gen.Ref %t444, %S.gen.Val %t450, 2 + ret %S.gen.Ref %t451 +endif6091: + %t452 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t453 = load ptr, ptr %a1 + %t454 = load ptr, ptr %a1 + %t455 = load %S.ast.Type, ptr %a42 + %t456 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t454, %S.ast.Type %t455) + store { ptr, i64, i64 } { ptr @.str.3977, i64 13, i64 0 }, ptr %a458 + store { ptr, i64, i64 } %t456, ptr %a459 + call void @finch_str_concat(ptr %a457, ptr %a458, ptr %a459) + %t460 = load { ptr, i64, i64 }, ptr %a457 + store { ptr, i64, i64 } %t460, ptr %a462 + store { ptr, i64, i64 } { ptr @.str.3978, i64 1, i64 0 }, ptr %a463 + call void @finch_str_concat(ptr %a461, ptr %a462, ptr %a463) + %t464 = load { ptr, i64, i64 }, ptr %a461 + %t465 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t466 = getelementptr inbounds %S.gen.Val, ptr %t465, i32 0, i32 0 + %t467 = load { ptr, i64, i64 }, ptr %t466 + store { ptr, i64, i64 } %t464, ptr %a469 + store { ptr, i64, i64 } %t467, ptr %a470 + call void @finch_str_concat(ptr %a468, ptr %a469, ptr %a470) + %t471 = load { ptr, i64, i64 }, ptr %a468 + store { ptr, i64, i64 } %t471, ptr %a473 + store { ptr, i64, i64 } { ptr @.str.3979, i64 3, i64 0 }, ptr %a474 + call void @finch_str_concat(ptr %a472, ptr %a473, ptr %a474) + %t475 = load { ptr, i64, i64 }, ptr %a472 + %t476 = call { ptr, i64, i64 } @finch.gen.op(ptr %t453, { ptr, i64, i64 } %t475) + %t477 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t476, 0 + %t478 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.3980, i64 3, i64 0 }) + %t479 = insertvalue %S.gen.Val %t477, %S.ast.Type %t478, 1 + %t480 = insertvalue %S.gen.Ref %t452, %S.gen.Val %t479, 2 + ret %S.gen.Ref %t480 +endif6082: + %t481 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 0 + %t482 = load { ptr, i64, i64 }, ptr %t481 + store { ptr, i64, i64 } %t482, ptr %a483 + store { ptr, i64, i64 } { ptr @.str.3981, i64 6, i64 0 }, ptr %a484 + %t485 = call i32 @finch_str_eq(ptr %a483, ptr %a484) + %t486 = icmp eq i32 %t485, 0 + br i1 %t486, label %then6092, label %endif6094 +then6092: + %t487 = load ptr, ptr %a1 + %t488 = load %S.ast.Node, ptr %a2 + %t489 = load %S.ast.Type, ptr %a42 + %t490 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t489) + store { ptr, i64, i64 } %t490, ptr %a492 + store { ptr, i64, i64 } { ptr @.str.3982, i64 21, i64 0 }, ptr %a493 + call void @finch_str_concat(ptr %a491, ptr %a492, ptr %a493) + %t494 = load { ptr, i64, i64 }, ptr %a491 + %t495 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t496 = load { ptr, i64, i64 }, ptr %t495 + store { ptr, i64, i64 } %t494, ptr %a498 + store { ptr, i64, i64 } %t496, ptr %a499 + call void @finch_str_concat(ptr %a497, ptr %a498, ptr %a499) + %t500 = load { ptr, i64, i64 }, ptr %a497 + store { ptr, i64, i64 } %t500, ptr %a502 + store { ptr, i64, i64 } { ptr @.str.3983, i64 2, i64 0 }, ptr %a503 + call void @finch_str_concat(ptr %a501, ptr %a502, ptr %a503) + %t504 = load { ptr, i64, i64 }, ptr %a501 + call void @finch.gen.fail(ptr %t487, %S.ast.Node %t488, { ptr, i64, i64 } %t504) + br label %endif6094 +endif6094: + %t505 = load ptr, ptr %a1 + %t506 = icmp eq ptr %t505, null + br i1 %t506, label %panic6095, label %ok6096 +panic6095: + call void @finch_panic(ptr @.str.3984, i64 3354, ptr @.str.3985) + unreachable +ok6096: + %t507 = getelementptr inbounds %S.gen.Gen, ptr %t505, i32 0, i32 15 + %t508 = load ptr, ptr %a1 + %t509 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 3 + %t510 = load { ptr, i64, i64 }, ptr %t509 + %t511 = getelementptr inbounds %S.ast.Type, ptr %a42, i32 0, i32 2 + %t512 = load { ptr, i64, i64 }, ptr %t511 + %t513 = call i64 @finch.gen.findStruct(ptr %t508, { ptr, i64, i64 } %t510, { ptr, i64, i64 } %t512) + %t514 = load { ptr, i64, i64 }, ptr %t507 + %t515 = extractvalue { ptr, i64, i64 } %t514, 1 + %t516 = icmp uge i64 %t513, %t515 + br i1 %t516, label %range6097, label %inrange6098 +range6097: + call void @finch_panic_index(ptr @.str.3986, i64 3354, i64 %t513, i64 %t515) + unreachable +inrange6098: + %t517 = extractvalue { ptr, i64, i64 } %t514, 0 + %t518 = getelementptr inbounds %S.gen.StructDef, ptr %t517, i64 %t513 + %t519 = load %S.gen.StructDef, ptr %t518 + store %S.gen.StructDef %t519, ptr %a520 + call void @finch.copy.S_gen_StructDef(ptr %a521, ptr %a520) + %t522 = load %S.gen.StructDef, ptr %a521 + store %S.gen.StructDef %t522, ptr %a523 + %t524 = getelementptr inbounds %S.gen.StructDef, ptr %a523, i32 0, i32 11 + %t525 = getelementptr inbounds { ptr, i64, i64 }, ptr %t524, i32 0, i32 1 + %t526 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t527 = load { ptr, i64, i64 }, ptr %t526 + store i64 -1, ptr %a528 + %t529 = load i64, ptr %t525 + %t530 = load ptr, ptr %t524 + store i64 0, ptr %a531 + br label %find.cond6099 +find.cond6099: + %t532 = load i64, ptr %a531 + %t533 = icmp slt i64 %t532, %t529 + br i1 %t533, label %find.body6100, label %find.end6103 +find.body6100: + %t534 = getelementptr inbounds { ptr, i64, i64 }, ptr %t530, i64 %t532 + %t535 = load { ptr, i64, i64 }, ptr %t534 + store { ptr, i64, i64 } %t535, ptr %a536 + store { ptr, i64, i64 } %t527, ptr %a537 + %t538 = call i32 @finch_str_eq(ptr %a536, ptr %a537) + %t539 = icmp ne i32 %t538, 0 + br i1 %t539, label %find.hit6101, label %find.next6102 +find.hit6101: + store i64 %t532, ptr %a528 + br label %find.end6103 +find.next6102: + %t540 = add i64 %t532, 1 + store i64 %t540, ptr %a531 + br label %find.cond6099 +find.end6103: + %t541 = load i64, ptr %a528 + store i64 %t541, ptr %a542 + %t543 = load i64, ptr %a542 + %t544 = icmp slt i64 %t543, 0 + br i1 %t544, label %then6104, label %endif6106 +then6104: + %t545 = load ptr, ptr %a1 + %t546 = load %S.ast.Node, ptr %a2 + %t547 = load %S.ast.Type, ptr %a42 + %t548 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t547) + store { ptr, i64, i64 } { ptr @.str.3987, i64 11, i64 0 }, ptr %a550 + store { ptr, i64, i64 } %t548, ptr %a551 + call void @finch_str_concat(ptr %a549, ptr %a550, ptr %a551) + %t552 = load { ptr, i64, i64 }, ptr %a549 + store { ptr, i64, i64 } %t552, ptr %a554 + store { ptr, i64, i64 } { ptr @.str.3988, i64 15, i64 0 }, ptr %a555 + call void @finch_str_concat(ptr %a553, ptr %a554, ptr %a555) + %t556 = load { ptr, i64, i64 }, ptr %a553 + %t557 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t558 = load { ptr, i64, i64 }, ptr %t557 + store { ptr, i64, i64 } %t556, ptr %a560 + store { ptr, i64, i64 } %t558, ptr %a561 + call void @finch_str_concat(ptr %a559, ptr %a560, ptr %a561) + %t562 = load { ptr, i64, i64 }, ptr %a559 + store { ptr, i64, i64 } %t562, ptr %a564 + store { ptr, i64, i64 } { ptr @.str.3989, i64 11, i64 0 }, ptr %a565 + call void @finch_str_concat(ptr %a563, ptr %a564, ptr %a565) + %t566 = load { ptr, i64, i64 }, ptr %a563 + %t567 = getelementptr inbounds %S.gen.StructDef, ptr %a523, i32 0, i32 11 + %t568 = getelementptr inbounds { ptr, i64, i64 }, ptr %t567, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.3990, i64 2, i64 0 }, ptr %a569 + call void @finch_str_join(ptr %a570, ptr %t567, ptr %a569) + %t571 = load { ptr, i64, i64 }, ptr %a570 + store { ptr, i64, i64 } %t566, ptr %a573 + store { ptr, i64, i64 } %t571, ptr %a574 + call void @finch_str_concat(ptr %a572, ptr %a573, ptr %a574) + %t575 = load { ptr, i64, i64 }, ptr %a572 + store { ptr, i64, i64 } %t575, ptr %a577 + store { ptr, i64, i64 } { ptr @.str.3991, i64 1, i64 0 }, ptr %a578 + call void @finch_str_concat(ptr %a576, ptr %a577, ptr %a578) + %t579 = load { ptr, i64, i64 }, ptr %a576 + call void @finch.gen.fail(ptr %t545, %S.ast.Node %t546, { ptr, i64, i64 } %t579) + br label %endif6106 +endif6106: + %t580 = getelementptr inbounds %S.gen.StructDef, ptr %a523, i32 0, i32 12 + %t581 = load i64, ptr %a542 + %t582 = load { ptr, i64, i64 }, ptr %t580 + %t583 = extractvalue { ptr, i64, i64 } %t582, 1 + %t584 = icmp uge i64 %t581, %t583 + br i1 %t584, label %range6107, label %inrange6108 +range6107: + call void @finch_panic_index(ptr @.str.3992, i64 3359, i64 %t581, i64 %t583) + unreachable +inrange6108: + %t585 = extractvalue { ptr, i64, i64 } %t582, 0 + %t586 = getelementptr inbounds %S.ast.Type, ptr %t585, i64 %t581 + %t587 = load %S.ast.Type, ptr %t586 + store %S.ast.Type %t587, ptr %a588 + call void @finch.copy.S_ast_Type(ptr %a589, ptr %a588) + %t590 = load %S.ast.Type, ptr %a589 + store %S.ast.Type %t590, ptr %a591 + %t592 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 0 + %t593 = load i1, ptr %t592 + br i1 %t593, label %then6109, label %endif6111 +then6109: + %t594 = load ptr, ptr %a1 + %t595 = load ptr, ptr %a1 + %t596 = load %S.ast.Type, ptr %a42 + %t597 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t595, %S.ast.Type %t596) + store { ptr, i64, i64 } { ptr @.str.3993, i64 23, i64 0 }, ptr %a599 + store { ptr, i64, i64 } %t597, ptr %a600 + call void @finch_str_concat(ptr %a598, ptr %a599, ptr %a600) + %t601 = load { ptr, i64, i64 }, ptr %a598 + store { ptr, i64, i64 } %t601, ptr %a603 + store { ptr, i64, i64 } { ptr @.str.3994, i64 6, i64 0 }, ptr %a604 + call void @finch_str_concat(ptr %a602, ptr %a603, ptr %a604) + %t605 = load { ptr, i64, i64 }, ptr %a602 + %t606 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 1 + %t607 = getelementptr inbounds %S.gen.Place, ptr %t606, i32 0, i32 0 + %t608 = load { ptr, i64, i64 }, ptr %t607 + store { ptr, i64, i64 } %t605, ptr %a610 + store { ptr, i64, i64 } %t608, ptr %a611 + call void @finch_str_concat(ptr %a609, ptr %a610, ptr %a611) + %t612 = load { ptr, i64, i64 }, ptr %a609 + store { ptr, i64, i64 } %t612, ptr %a614 + store { ptr, i64, i64 } { ptr @.str.3995, i64 13, i64 0 }, ptr %a615 + call void @finch_str_concat(ptr %a613, ptr %a614, ptr %a615) + %t616 = load { ptr, i64, i64 }, ptr %a613 + %t617 = getelementptr inbounds %S.gen.StructDef, ptr %a523, i32 0, i32 3 + %t618 = load i64, ptr %a542 + %t619 = load { ptr, i64, i64 }, ptr %t617 + %t620 = extractvalue { ptr, i64, i64 } %t619, 1 + %t621 = icmp uge i64 %t618, %t620 + br i1 %t621, label %range6112, label %inrange6113 +range6112: + call void @finch_panic_index(ptr @.str.3996, i64 3361, i64 %t618, i64 %t620) + unreachable +inrange6113: + %t622 = extractvalue { ptr, i64, i64 } %t619, 0 + %t623 = getelementptr inbounds i64, ptr %t622, i64 %t618 + %t624 = load i64, ptr %t623 + call void @finch_str_from_int(ptr %a625, i64 %t624) + %t626 = load { ptr, i64, i64 }, ptr %a625 + store { ptr, i64, i64 } %t616, ptr %a628 + store { ptr, i64, i64 } %t626, ptr %a629 + call void @finch_str_concat(ptr %a627, ptr %a628, ptr %a629) + %t630 = load { ptr, i64, i64 }, ptr %a627 + %t631 = call { ptr, i64, i64 } @finch.gen.op(ptr %t594, { ptr, i64, i64 } %t630) + store { ptr, i64, i64 } %t631, ptr %a632 + %t633 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t634 = load { ptr, i64, i64 }, ptr %a632 + store { ptr, i64, i64 } %t634, ptr %a635 + call void @finch_str_copy(ptr %a636, ptr %a635) + %t637 = load { ptr, i64, i64 }, ptr %a636 + %t638 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t637, 0 + %t639 = load %S.ast.Type, ptr %a591 + store %S.ast.Type %t639, ptr %a640 + call void @finch.copy.S_ast_Type(ptr %a641, ptr %a640) + %t642 = load %S.ast.Type, ptr %a641 + %t643 = insertvalue %S.gen.Place %t638, %S.ast.Type %t642, 1 + %t644 = insertvalue %S.gen.Ref %t633, %S.gen.Place %t643, 1 + ret %S.gen.Ref %t644 +endif6111: + %t645 = load ptr, ptr %a1 + %t646 = load ptr, ptr %a1 + %t647 = load %S.ast.Type, ptr %a42 + %t648 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t646, %S.ast.Type %t647) + store { ptr, i64, i64 } { ptr @.str.3997, i64 13, i64 0 }, ptr %a650 + store { ptr, i64, i64 } %t648, ptr %a651 + call void @finch_str_concat(ptr %a649, ptr %a650, ptr %a651) + %t652 = load { ptr, i64, i64 }, ptr %a649 + store { ptr, i64, i64 } %t652, ptr %a654 + store { ptr, i64, i64 } { ptr @.str.3998, i64 1, i64 0 }, ptr %a655 + call void @finch_str_concat(ptr %a653, ptr %a654, ptr %a655) + %t656 = load { ptr, i64, i64 }, ptr %a653 + %t657 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t658 = getelementptr inbounds %S.gen.Val, ptr %t657, i32 0, i32 0 + %t659 = load { ptr, i64, i64 }, ptr %t658 + store { ptr, i64, i64 } %t656, ptr %a661 + store { ptr, i64, i64 } %t659, ptr %a662 + call void @finch_str_concat(ptr %a660, ptr %a661, ptr %a662) + %t663 = load { ptr, i64, i64 }, ptr %a660 + store { ptr, i64, i64 } %t663, ptr %a665 + store { ptr, i64, i64 } { ptr @.str.3999, i64 2, i64 0 }, ptr %a666 + call void @finch_str_concat(ptr %a664, ptr %a665, ptr %a666) + %t667 = load { ptr, i64, i64 }, ptr %a664 + %t668 = getelementptr inbounds %S.gen.StructDef, ptr %a523, i32 0, i32 3 + %t669 = load i64, ptr %a542 + %t670 = load { ptr, i64, i64 }, ptr %t668 + %t671 = extractvalue { ptr, i64, i64 } %t670, 1 + %t672 = icmp uge i64 %t669, %t671 + br i1 %t672, label %range6114, label %inrange6115 +range6114: + call void @finch_panic_index(ptr @.str.4000, i64 3364, i64 %t669, i64 %t671) + unreachable +inrange6115: + %t673 = extractvalue { ptr, i64, i64 } %t670, 0 + %t674 = getelementptr inbounds i64, ptr %t673, i64 %t669 + %t675 = load i64, ptr %t674 + call void @finch_str_from_int(ptr %a676, i64 %t675) + %t677 = load { ptr, i64, i64 }, ptr %a676 + store { ptr, i64, i64 } %t667, ptr %a679 + store { ptr, i64, i64 } %t677, ptr %a680 + call void @finch_str_concat(ptr %a678, ptr %a679, ptr %a680) + %t681 = load { ptr, i64, i64 }, ptr %a678 + %t682 = call { ptr, i64, i64 } @finch.gen.op(ptr %t645, { ptr, i64, i64 } %t681) + store { ptr, i64, i64 } %t682, ptr %a683 + %t684 = load { ptr, i64, i64 }, ptr %a683 + store { ptr, i64, i64 } %t684, ptr %a685 + call void @finch_str_copy(ptr %a686, ptr %a685) + %t687 = load { ptr, i64, i64 }, ptr %a686 + %t688 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t687, 0 + %t689 = load %S.ast.Type, ptr %a591 + store %S.ast.Type %t689, ptr %a690 + call void @finch.copy.S_ast_Type(ptr %a691, ptr %a690) + %t692 = load %S.ast.Type, ptr %a691 + %t693 = insertvalue %S.gen.Val %t688, %S.ast.Type %t692, 1 + store %S.gen.Val %t693, ptr %a694 + %t695 = load ptr, ptr %a1 + %t696 = load %S.ast.Type, ptr %a591 + %t697 = call i1 @finch.gen.owning(ptr %t695, %S.ast.Type %t696) + br label %logic.from6116 +logic.from6116: + br i1 %t697, label %logic.rhs6117, label %logic.end6118 +logic.rhs6117: + %t698 = getelementptr inbounds %S.gen.Ref, ptr %a35, i32 0, i32 2 + %t699 = getelementptr inbounds %S.gen.Val, ptr %t698, i32 0, i32 2 + %t700 = load i1, ptr %t699 + br label %logic.rend6119 +logic.rend6119: + br label %logic.end6118 +logic.end6118: + %t701 = phi i1 [ false, %logic.from6116 ], [ %t700, %logic.rend6119 ] + br i1 %t701, label %then6120, label %endif6122 +then6120: + %t702 = load ptr, ptr %a1 + %t703 = load { ptr, i64, i64 }, ptr %a683 + %t704 = load %S.ast.Type, ptr %a591 + %t705 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t702, { ptr, i64, i64 } %t703, %S.ast.Type %t704) + %t706 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t705, 0 + %t707 = load %S.ast.Type, ptr %a591 + store %S.ast.Type %t707, ptr %a708 + call void @finch.copy.S_ast_Type(ptr %a709, ptr %a708) + %t710 = load %S.ast.Type, ptr %a709 + %t711 = insertvalue %S.gen.Val %t706, %S.ast.Type %t710, 1 + %t712 = insertvalue %S.gen.Val %t711, i1 true, 2 + store %S.gen.Val %t712, ptr %a694 + br label %endif6122 +endif6122: + %t713 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t714 = load %S.gen.Val, ptr %a694 + store %S.gen.Val %t714, ptr %a715 + call void @finch.copy.S_gen_Val(ptr %a716, ptr %a715) + %t717 = load %S.gen.Val, ptr %a716 + %t718 = insertvalue %S.gen.Ref %t713, %S.gen.Val %t717, 2 + ret %S.gen.Ref %t718 +} + +define internal %S.gen.Ref @finch.gen.index(ptr %p0, %S.ast.Node %p1, i1 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i1, align 16 + %a14 = alloca %S.gen.Ref, align 16 + %a18 = alloca %S.ast.Type, align 16 + %a19 = alloca %S.ast.Type, align 16 + %a21 = alloca %S.ast.Type, align 16 + %a27 = alloca %S.ast.Type, align 16 + %a28 = alloca %S.ast.Type, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca %S.ast.Type, align 16 + %a134 = alloca %S.ast.Type, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca %S.ast.Type, align 16 + %a172 = alloca %S.ast.Type, align 16 + %a174 = alloca %S.ast.Type, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca %S.ast.Type, align 16 + %a206 = alloca %S.ast.Type, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca %S.ast.Type, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca %S.ast.Type, align 16 + %a247 = alloca %S.ast.Type, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a270 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a308 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a330 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a335 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a339 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a348 = alloca { ptr, i64, i64 }, align 16 + %a349 = alloca { ptr, i64, i64 }, align 16 + %a353 = alloca %S.ast.Type, align 16 + %a354 = alloca %S.ast.Type, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca %S.ast.Type, align 16 + %a372 = alloca %S.ast.Type, align 16 + %a375 = alloca %S.gen.Val, align 16 + %a389 = alloca %S.ast.Type, align 16 + %a390 = alloca %S.ast.Type, align 16 + %a396 = alloca %S.gen.Val, align 16 + %a397 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i1 %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = icmp uge i64 0, %t7 + br i1 %t8, label %range6123, label %inrange6124 +range6123: + call void @finch_panic_index(ptr @.str.4001, i64 3373, i64 0, i64 %t7) + unreachable +inrange6124: + %t9 = extractvalue { ptr, i64, i64 } %t6, 0 + %t10 = getelementptr inbounds %S.ast.Node, ptr %t9, i64 0 + %t11 = load %S.ast.Node, ptr %t10 + %t12 = load i1, ptr %a3 + %t13 = call %S.gen.Ref @finch.gen.ref(ptr %t4, %S.ast.Node %t11, i1 %t12) + store %S.gen.Ref %t13, ptr %a14 + %t15 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 2 + %t16 = getelementptr inbounds %S.gen.Val, ptr %t15, i32 0, i32 1 + %t17 = load %S.ast.Type, ptr %t16 + store %S.ast.Type %t17, ptr %a18 + call void @finch.copy.S_ast_Type(ptr %a19, ptr %a18) + %t20 = load %S.ast.Type, ptr %a19 + store %S.ast.Type %t20, ptr %a21 + %t22 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 0 + %t23 = load i1, ptr %t22 + br i1 %t23, label %then6125, label %endif6127 +then6125: + %t24 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 1 + %t25 = getelementptr inbounds %S.gen.Place, ptr %t24, i32 0, i32 1 + %t26 = load %S.ast.Type, ptr %t25 + store %S.ast.Type %t26, ptr %a27 + call void @finch.copy.S_ast_Type(ptr %a28, ptr %a27) + %t29 = load %S.ast.Type, ptr %a28 + store %S.ast.Type %t29, ptr %a21 + br label %endif6127 +endif6127: + %t30 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 0 + %t31 = load { ptr, i64, i64 }, ptr %t30 + store { ptr, i64, i64 } %t31, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.4002, i64 3, i64 0 }, ptr %a33 + %t34 = call i32 @finch_str_eq(ptr %a32, ptr %a33) + %t35 = icmp ne i32 %t34, 0 + br i1 %t35, label %then6128, label %endif6130 +then6128: + %t36 = load ptr, ptr %a1 + %t37 = load %S.ast.Node, ptr %a2 + %t38 = load %S.gen.Ref, ptr %a14 + %t39 = load %S.ast.Type, ptr %a21 + %t40 = load i1, ptr %a3 + %t41 = call %S.gen.Ref @finch.gen.mapIndex(ptr %t36, %S.ast.Node %t37, %S.gen.Ref %t38, %S.ast.Type %t39, i1 %t40) + ret %S.gen.Ref %t41 +endif6130: + %t42 = load ptr, ptr %a1 + %t43 = load ptr, ptr %a1 + %t44 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t45 = load { ptr, i64, i64 }, ptr %t44 + %t46 = extractvalue { ptr, i64, i64 } %t45, 1 + %t47 = icmp uge i64 1, %t46 + br i1 %t47, label %range6131, label %inrange6132 +range6131: + call void @finch_panic_index(ptr @.str.4003, i64 3381, i64 1, i64 %t46) + unreachable +inrange6132: + %t48 = extractvalue { ptr, i64, i64 } %t45, 0 + %t49 = getelementptr inbounds %S.ast.Node, ptr %t48, i64 1 + %t50 = load %S.ast.Node, ptr %t49 + %t51 = call %S.gen.Val @finch.gen.expr(ptr %t43, %S.ast.Node %t50) + %t52 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4004, i64 3, i64 0 }) + %t53 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t54 = load { ptr, i64, i64 }, ptr %t53 + %t55 = extractvalue { ptr, i64, i64 } %t54, 1 + %t56 = icmp uge i64 1, %t55 + br i1 %t56, label %range6133, label %inrange6134 +range6133: + call void @finch_panic_index(ptr @.str.4005, i64 3381, i64 1, i64 %t55) + unreachable +inrange6134: + %t57 = extractvalue { ptr, i64, i64 } %t54, 0 + %t58 = getelementptr inbounds %S.ast.Node, ptr %t57, i64 1 + %t59 = load %S.ast.Node, ptr %t58 + %t60 = call %S.gen.Val @finch.gen.coerce(ptr %t42, %S.gen.Val %t51, %S.ast.Type %t52, %S.ast.Node %t59, { ptr, i64, i64 } { ptr @.str.4006, i64 8, i64 0 }) + %t61 = extractvalue %S.gen.Val %t60, 0 + store { ptr, i64, i64 } %t61, ptr %a62 + call void @finch_str_copy(ptr %a63, ptr %a62) + %t64 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t64, ptr %a65 + %t66 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 0 + %t67 = load { ptr, i64, i64 }, ptr %t66 + store { ptr, i64, i64 } %t67, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.4007, i64 5, i64 0 }, ptr %a69 + %t70 = call i32 @finch_str_eq(ptr %a68, ptr %a69) + %t71 = icmp ne i32 %t70, 0 + br i1 %t71, label %then6135, label %endif6137 +then6135: + store { ptr, i64, i64 } { ptr @.str.4008, i64 0, i64 0 }, ptr %a72 + %t73 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 0 + %t74 = load i1, ptr %t73 + br i1 %t74, label %then6138, label %else6139 +then6138: + %t75 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 1 + %t76 = getelementptr inbounds %S.gen.Place, ptr %t75, i32 0, i32 0 + %t77 = load { ptr, i64, i64 }, ptr %t76 + store { ptr, i64, i64 } %t77, ptr %a78 + call void @finch_str_copy(ptr %a79, ptr %a78) + %t80 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } %t80, ptr %a72 + br label %endif6140 +else6139: + %t81 = load ptr, ptr %a1 + %t82 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 2 + %t83 = load %S.gen.Val, ptr %t82 + %t84 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t81, %S.gen.Val %t83) + store { ptr, i64, i64 } %t84, ptr %a72 + br label %endif6140 +endif6140: + %t85 = load ptr, ptr %a1 + %t86 = load { ptr, i64, i64 }, ptr %a65 + %t87 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 4 + %t88 = load i64, ptr %t87 + call void @finch_str_from_int(ptr %a89, i64 %t88) + %t90 = load { ptr, i64, i64 }, ptr %a89 + %t91 = load %S.ast.Node, ptr %a2 + call void @finch.gen.boundsCheck(ptr %t85, { ptr, i64, i64 } %t86, { ptr, i64, i64 } %t90, %S.ast.Node %t91) + %t92 = load ptr, ptr %a1 + %t93 = load ptr, ptr %a1 + %t94 = load %S.ast.Type, ptr %a21 + %t95 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t93, %S.ast.Type %t94) + store { ptr, i64, i64 } { ptr @.str.4009, i64 23, i64 0 }, ptr %a97 + store { ptr, i64, i64 } %t95, ptr %a98 + call void @finch_str_concat(ptr %a96, ptr %a97, ptr %a98) + %t99 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t99, ptr %a101 + store { ptr, i64, i64 } { ptr @.str.4010, i64 6, i64 0 }, ptr %a102 + call void @finch_str_concat(ptr %a100, ptr %a101, ptr %a102) + %t103 = load { ptr, i64, i64 }, ptr %a100 + %t104 = load { ptr, i64, i64 }, ptr %a72 + store { ptr, i64, i64 } %t103, ptr %a106 + store { ptr, i64, i64 } %t104, ptr %a107 + call void @finch_str_concat(ptr %a105, ptr %a106, ptr %a107) + %t108 = load { ptr, i64, i64 }, ptr %a105 + store { ptr, i64, i64 } %t108, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.4011, i64 13, i64 0 }, ptr %a111 + call void @finch_str_concat(ptr %a109, ptr %a110, ptr %a111) + %t112 = load { ptr, i64, i64 }, ptr %a109 + %t113 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t112, ptr %a115 + store { ptr, i64, i64 } %t113, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + %t118 = call { ptr, i64, i64 } @finch.gen.op(ptr %t92, { ptr, i64, i64 } %t117) + store { ptr, i64, i64 } %t118, ptr %a119 + %t120 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t121 = load { ptr, i64, i64 }, ptr %a119 + store { ptr, i64, i64 } %t121, ptr %a122 + call void @finch_str_copy(ptr %a123, ptr %a122) + %t124 = load { ptr, i64, i64 }, ptr %a123 + %t125 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t124, 0 + %t126 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 1 + %t127 = load { ptr, i64, i64 }, ptr %t126 + %t128 = extractvalue { ptr, i64, i64 } %t127, 1 + %t129 = icmp uge i64 0, %t128 + br i1 %t129, label %range6141, label %inrange6142 +range6141: + call void @finch_panic_index(ptr @.str.4012, i64 3391, i64 0, i64 %t128) + unreachable +inrange6142: + %t130 = extractvalue { ptr, i64, i64 } %t127, 0 + %t131 = getelementptr inbounds %S.ast.Type, ptr %t130, i64 0 + %t132 = load %S.ast.Type, ptr %t131 + store %S.ast.Type %t132, ptr %a133 + call void @finch.copy.S_ast_Type(ptr %a134, ptr %a133) + %t135 = load %S.ast.Type, ptr %a134 + %t136 = insertvalue %S.gen.Place %t125, %S.ast.Type %t135, 1 + %t137 = insertvalue %S.gen.Ref %t120, %S.gen.Place %t136, 1 + ret %S.gen.Ref %t137 +endif6137: + %t138 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 0 + %t139 = load { ptr, i64, i64 }, ptr %t138 + store { ptr, i64, i64 } %t139, ptr %a140 + store { ptr, i64, i64 } { ptr @.str.4013, i64 3, i64 0 }, ptr %a141 + %t142 = call i32 @finch_str_eq(ptr %a140, ptr %a141) + %t143 = icmp ne i32 %t142, 0 + br i1 %t143, label %then6143, label %endif6145 +then6143: + %t144 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 1 + %t145 = getelementptr inbounds { ptr, i64, i64 }, ptr %t144, i32 0, i32 1 + %t146 = load i64, ptr %t145 + %t147 = icmp eq i64 %t146, 0 + br i1 %t147, label %then6146, label %endif6148 +then6146: + %t148 = load ptr, ptr %a1 + %t149 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t148, %S.ast.Node %t149, { ptr, i64, i64 } { ptr @.str.4014, i64 57, i64 0 }) + br label %endif6148 +endif6148: + %t150 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 2 + %t151 = getelementptr inbounds %S.gen.Val, ptr %t150, i32 0, i32 0 + %t152 = load { ptr, i64, i64 }, ptr %t151 + store { ptr, i64, i64 } %t152, ptr %a153 + call void @finch_str_copy(ptr %a154, ptr %a153) + %t155 = load { ptr, i64, i64 }, ptr %a154 + store { ptr, i64, i64 } %t155, ptr %a156 + %t157 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 0 + %t158 = load i1, ptr %t157 + br i1 %t158, label %then6149, label %endif6151 +then6149: + %t159 = load ptr, ptr %a1 + %t160 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 1 + %t161 = getelementptr inbounds %S.gen.Place, ptr %t160, i32 0, i32 0 + %t162 = load { ptr, i64, i64 }, ptr %t161 + %t163 = call { ptr, i64, i64 } @finch.gen.load(ptr %t159, { ptr, i64, i64 } { ptr @.str.4015, i64 3, i64 0 }, { ptr, i64, i64 } %t162) + store { ptr, i64, i64 } %t163, ptr %a156 + br label %endif6151 +endif6151: + %t164 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 1 + %t165 = load { ptr, i64, i64 }, ptr %t164 + %t166 = extractvalue { ptr, i64, i64 } %t165, 1 + %t167 = icmp uge i64 0, %t166 + br i1 %t167, label %range6152, label %inrange6153 +range6152: + call void @finch_panic_index(ptr @.str.4016, i64 3401, i64 0, i64 %t166) + unreachable +inrange6153: + %t168 = extractvalue { ptr, i64, i64 } %t165, 0 + %t169 = getelementptr inbounds %S.ast.Type, ptr %t168, i64 0 + %t170 = load %S.ast.Type, ptr %t169 + store %S.ast.Type %t170, ptr %a171 + call void @finch.copy.S_ast_Type(ptr %a172, ptr %a171) + %t173 = load %S.ast.Type, ptr %a172 + store %S.ast.Type %t173, ptr %a174 + %t175 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t176 = load ptr, ptr %a1 + %t177 = load ptr, ptr %a1 + %t178 = load %S.ast.Type, ptr %a174 + %t179 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t177, %S.ast.Type %t178) + store { ptr, i64, i64 } { ptr @.str.4017, i64 23, i64 0 }, ptr %a181 + store { ptr, i64, i64 } %t179, ptr %a182 + call void @finch_str_concat(ptr %a180, ptr %a181, ptr %a182) + %t183 = load { ptr, i64, i64 }, ptr %a180 + store { ptr, i64, i64 } %t183, ptr %a185 + store { ptr, i64, i64 } { ptr @.str.4018, i64 6, i64 0 }, ptr %a186 + call void @finch_str_concat(ptr %a184, ptr %a185, ptr %a186) + %t187 = load { ptr, i64, i64 }, ptr %a184 + %t188 = load { ptr, i64, i64 }, ptr %a156 + store { ptr, i64, i64 } %t187, ptr %a190 + store { ptr, i64, i64 } %t188, ptr %a191 + call void @finch_str_concat(ptr %a189, ptr %a190, ptr %a191) + %t192 = load { ptr, i64, i64 }, ptr %a189 + store { ptr, i64, i64 } %t192, ptr %a194 + store { ptr, i64, i64 } { ptr @.str.4019, i64 6, i64 0 }, ptr %a195 + call void @finch_str_concat(ptr %a193, ptr %a194, ptr %a195) + %t196 = load { ptr, i64, i64 }, ptr %a193 + %t197 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t196, ptr %a199 + store { ptr, i64, i64 } %t197, ptr %a200 + call void @finch_str_concat(ptr %a198, ptr %a199, ptr %a200) + %t201 = load { ptr, i64, i64 }, ptr %a198 + %t202 = call { ptr, i64, i64 } @finch.gen.op(ptr %t176, { ptr, i64, i64 } %t201) + %t203 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t202, 0 + %t204 = load %S.ast.Type, ptr %a174 + store %S.ast.Type %t204, ptr %a205 + call void @finch.copy.S_ast_Type(ptr %a206, ptr %a205) + %t207 = load %S.ast.Type, ptr %a206 + %t208 = insertvalue %S.gen.Place %t203, %S.ast.Type %t207, 1 + %t209 = insertvalue %S.gen.Ref %t175, %S.gen.Place %t208, 1 + ret %S.gen.Ref %t209 +endif6145: + %t210 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 0 + %t211 = load { ptr, i64, i64 }, ptr %t210 + store { ptr, i64, i64 } %t211, ptr %a212 + store { ptr, i64, i64 } { ptr @.str.4020, i64 5, i64 0 }, ptr %a213 + %t214 = call i32 @finch_str_eq(ptr %a212, ptr %a213) + %t215 = icmp eq i32 %t214, 0 + br label %logic.from6154 +logic.from6154: + br i1 %t215, label %logic.rhs6155, label %logic.end6156 +logic.rhs6155: + %t216 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 0 + %t217 = load { ptr, i64, i64 }, ptr %t216 + store { ptr, i64, i64 } %t217, ptr %a218 + store { ptr, i64, i64 } { ptr @.str.4021, i64 3, i64 0 }, ptr %a219 + %t220 = call i32 @finch_str_eq(ptr %a218, ptr %a219) + %t221 = icmp eq i32 %t220, 0 + br label %logic.rend6157 +logic.rend6157: + br label %logic.end6156 +logic.end6156: + %t222 = phi i1 [ false, %logic.from6154 ], [ %t221, %logic.rend6157 ] + br i1 %t222, label %then6158, label %endif6160 +then6158: + %t223 = load ptr, ptr %a1 + %t224 = load %S.ast.Node, ptr %a2 + %t225 = load %S.ast.Type, ptr %a21 + %t226 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t225) + store { ptr, i64, i64 } { ptr @.str.4022, i64 46, i64 0 }, ptr %a228 + store { ptr, i64, i64 } %t226, ptr %a229 + call void @finch_str_concat(ptr %a227, ptr %a228, ptr %a229) + %t230 = load { ptr, i64, i64 }, ptr %a227 + call void @finch.gen.fail(ptr %t223, %S.ast.Node %t224, { ptr, i64, i64 } %t230) + br label %endif6160 +endif6160: + %t231 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4023, i64 4, i64 0 }) + store %S.ast.Type %t231, ptr %a232 + %t233 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 0 + %t234 = load { ptr, i64, i64 }, ptr %t233 + store { ptr, i64, i64 } %t234, ptr %a235 + store { ptr, i64, i64 } { ptr @.str.4024, i64 5, i64 0 }, ptr %a236 + %t237 = call i32 @finch_str_eq(ptr %a235, ptr %a236) + %t238 = icmp ne i32 %t237, 0 + br i1 %t238, label %then6161, label %endif6163 +then6161: + %t239 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 1 + %t240 = load { ptr, i64, i64 }, ptr %t239 + %t241 = extractvalue { ptr, i64, i64 } %t240, 1 + %t242 = icmp uge i64 0, %t241 + br i1 %t242, label %range6164, label %inrange6165 +range6164: + call void @finch_panic_index(ptr @.str.4025, i64 3409, i64 0, i64 %t241) + unreachable +inrange6165: + %t243 = extractvalue { ptr, i64, i64 } %t240, 0 + %t244 = getelementptr inbounds %S.ast.Type, ptr %t243, i64 0 + %t245 = load %S.ast.Type, ptr %t244 + store %S.ast.Type %t245, ptr %a246 + call void @finch.copy.S_ast_Type(ptr %a247, ptr %a246) + %t248 = load %S.ast.Type, ptr %a247 + store %S.ast.Type %t248, ptr %a232 + br label %endif6163 +endif6163: + %t249 = getelementptr inbounds %S.ast.Type, ptr %a21, i32 0, i32 0 + %t250 = load { ptr, i64, i64 }, ptr %t249 + store { ptr, i64, i64 } %t250, ptr %a251 + store { ptr, i64, i64 } { ptr @.str.4026, i64 3, i64 0 }, ptr %a252 + %t253 = call i32 @finch_str_eq(ptr %a251, ptr %a252) + %t254 = icmp ne i32 %t253, 0 + br label %logic.from6166 +logic.from6166: + br i1 %t254, label %logic.rhs6167, label %logic.end6168 +logic.rhs6167: + %t255 = load i1, ptr %a3 + br label %logic.rend6169 +logic.rend6169: + br label %logic.end6168 +logic.end6168: + %t256 = phi i1 [ false, %logic.from6166 ], [ %t255, %logic.rend6169 ] + br i1 %t256, label %then6170, label %endif6172 +then6170: + %t257 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 0 + %t258 = load i1, ptr %t257 + %t259 = xor i1 %t258, true + br i1 %t259, label %then6173, label %endif6175 +then6173: + %t260 = load ptr, ptr %a1 + %t261 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t260, %S.ast.Node %t261, { ptr, i64, i64 } { ptr @.str.4027, i64 44, i64 0 }) + br label %endif6175 +endif6175: + %t262 = load ptr, ptr %a1 + %t263 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 1 + %t264 = getelementptr inbounds %S.gen.Place, ptr %t263, i32 0, i32 0 + %t265 = load { ptr, i64, i64 }, ptr %t264 + store { ptr, i64, i64 } { ptr @.str.4028, i64 29, i64 0 }, ptr %a267 + store { ptr, i64, i64 } %t265, ptr %a268 + call void @finch_str_concat(ptr %a266, ptr %a267, ptr %a268) + %t269 = load { ptr, i64, i64 }, ptr %a266 + store { ptr, i64, i64 } %t269, ptr %a271 + store { ptr, i64, i64 } { ptr @.str.4029, i64 1, i64 0 }, ptr %a272 + call void @finch_str_concat(ptr %a270, ptr %a271, ptr %a272) + %t273 = load { ptr, i64, i64 }, ptr %a270 + call void @finch.gen.emit(ptr %t262, { ptr, i64, i64 } %t273) + br label %endif6172 +endif6172: + %t274 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 2 + %t275 = getelementptr inbounds %S.gen.Val, ptr %t274, i32 0, i32 0 + %t276 = load { ptr, i64, i64 }, ptr %t275 + store { ptr, i64, i64 } %t276, ptr %a277 + call void @finch_str_copy(ptr %a278, ptr %a277) + %t279 = load { ptr, i64, i64 }, ptr %a278 + store { ptr, i64, i64 } %t279, ptr %a280 + %t281 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 0 + %t282 = load i1, ptr %t281 + br i1 %t282, label %then6176, label %endif6178 +then6176: + %t283 = load ptr, ptr %a1 + %t284 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 1 + %t285 = getelementptr inbounds %S.gen.Place, ptr %t284, i32 0, i32 0 + %t286 = load { ptr, i64, i64 }, ptr %t285 + %t287 = call { ptr, i64, i64 } @finch.gen.load(ptr %t283, { ptr, i64, i64 } { ptr @.str.4030, i64 17, i64 0 }, { ptr, i64, i64 } %t286) + store { ptr, i64, i64 } %t287, ptr %a280 + br label %endif6178 +endif6178: + %t288 = load ptr, ptr %a1 + %t289 = load { ptr, i64, i64 }, ptr %a280 + store { ptr, i64, i64 } { ptr @.str.4031, i64 31, i64 0 }, ptr %a291 + store { ptr, i64, i64 } %t289, ptr %a292 + call void @finch_str_concat(ptr %a290, ptr %a291, ptr %a292) + %t293 = load { ptr, i64, i64 }, ptr %a290 + store { ptr, i64, i64 } %t293, ptr %a295 + store { ptr, i64, i64 } { ptr @.str.4032, i64 3, i64 0 }, ptr %a296 + call void @finch_str_concat(ptr %a294, ptr %a295, ptr %a296) + %t297 = load { ptr, i64, i64 }, ptr %a294 + %t298 = call { ptr, i64, i64 } @finch.gen.op(ptr %t288, { ptr, i64, i64 } %t297) + store { ptr, i64, i64 } %t298, ptr %a299 + %t300 = load ptr, ptr %a1 + %t301 = load { ptr, i64, i64 }, ptr %a65 + %t302 = load { ptr, i64, i64 }, ptr %a299 + %t303 = load %S.ast.Node, ptr %a2 + call void @finch.gen.boundsCheck(ptr %t300, { ptr, i64, i64 } %t301, { ptr, i64, i64 } %t302, %S.ast.Node %t303) + %t304 = load ptr, ptr %a1 + %t305 = load { ptr, i64, i64 }, ptr %a280 + store { ptr, i64, i64 } { ptr @.str.4033, i64 31, i64 0 }, ptr %a307 + store { ptr, i64, i64 } %t305, ptr %a308 + call void @finch_str_concat(ptr %a306, ptr %a307, ptr %a308) + %t309 = load { ptr, i64, i64 }, ptr %a306 + store { ptr, i64, i64 } %t309, ptr %a311 + store { ptr, i64, i64 } { ptr @.str.4034, i64 3, i64 0 }, ptr %a312 + call void @finch_str_concat(ptr %a310, ptr %a311, ptr %a312) + %t313 = load { ptr, i64, i64 }, ptr %a310 + %t314 = call { ptr, i64, i64 } @finch.gen.op(ptr %t304, { ptr, i64, i64 } %t313) + store { ptr, i64, i64 } %t314, ptr %a315 + %t316 = load ptr, ptr %a1 + %t317 = load ptr, ptr %a1 + %t318 = load %S.ast.Type, ptr %a232 + %t319 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t317, %S.ast.Type %t318) + store { ptr, i64, i64 } { ptr @.str.4035, i64 23, i64 0 }, ptr %a321 + store { ptr, i64, i64 } %t319, ptr %a322 + call void @finch_str_concat(ptr %a320, ptr %a321, ptr %a322) + %t323 = load { ptr, i64, i64 }, ptr %a320 + store { ptr, i64, i64 } %t323, ptr %a325 + store { ptr, i64, i64 } { ptr @.str.4036, i64 6, i64 0 }, ptr %a326 + call void @finch_str_concat(ptr %a324, ptr %a325, ptr %a326) + %t327 = load { ptr, i64, i64 }, ptr %a324 + %t328 = load { ptr, i64, i64 }, ptr %a315 + store { ptr, i64, i64 } %t327, ptr %a330 + store { ptr, i64, i64 } %t328, ptr %a331 + call void @finch_str_concat(ptr %a329, ptr %a330, ptr %a331) + %t332 = load { ptr, i64, i64 }, ptr %a329 + store { ptr, i64, i64 } %t332, ptr %a334 + store { ptr, i64, i64 } { ptr @.str.4037, i64 6, i64 0 }, ptr %a335 + call void @finch_str_concat(ptr %a333, ptr %a334, ptr %a335) + %t336 = load { ptr, i64, i64 }, ptr %a333 + %t337 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } %t336, ptr %a339 + store { ptr, i64, i64 } %t337, ptr %a340 + call void @finch_str_concat(ptr %a338, ptr %a339, ptr %a340) + %t341 = load { ptr, i64, i64 }, ptr %a338 + %t342 = call { ptr, i64, i64 } @finch.gen.op(ptr %t316, { ptr, i64, i64 } %t341) + store { ptr, i64, i64 } %t342, ptr %a343 + %t344 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 0 + %t345 = load i1, ptr %t344 + br i1 %t345, label %then6179, label %endif6181 +then6179: + %t346 = insertvalue %S.gen.Ref zeroinitializer, i1 true, 0 + %t347 = load { ptr, i64, i64 }, ptr %a343 + store { ptr, i64, i64 } %t347, ptr %a348 + call void @finch_str_copy(ptr %a349, ptr %a348) + %t350 = load { ptr, i64, i64 }, ptr %a349 + %t351 = insertvalue %S.gen.Place zeroinitializer, { ptr, i64, i64 } %t350, 0 + %t352 = load %S.ast.Type, ptr %a232 + store %S.ast.Type %t352, ptr %a353 + call void @finch.copy.S_ast_Type(ptr %a354, ptr %a353) + %t355 = load %S.ast.Type, ptr %a354 + %t356 = insertvalue %S.gen.Place %t351, %S.ast.Type %t355, 1 + %t357 = insertvalue %S.gen.Ref %t346, %S.gen.Place %t356, 1 + ret %S.gen.Ref %t357 +endif6181: + %t358 = load ptr, ptr %a1 + %t359 = load ptr, ptr %a1 + %t360 = load %S.ast.Type, ptr %a232 + %t361 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t359, %S.ast.Type %t360) + %t362 = load { ptr, i64, i64 }, ptr %a343 + %t363 = call { ptr, i64, i64 } @finch.gen.load(ptr %t358, { ptr, i64, i64 } %t361, { ptr, i64, i64 } %t362) + store { ptr, i64, i64 } %t363, ptr %a364 + %t365 = load { ptr, i64, i64 }, ptr %a364 + store { ptr, i64, i64 } %t365, ptr %a366 + call void @finch_str_copy(ptr %a367, ptr %a366) + %t368 = load { ptr, i64, i64 }, ptr %a367 + %t369 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t368, 0 + %t370 = load %S.ast.Type, ptr %a232 + store %S.ast.Type %t370, ptr %a371 + call void @finch.copy.S_ast_Type(ptr %a372, ptr %a371) + %t373 = load %S.ast.Type, ptr %a372 + %t374 = insertvalue %S.gen.Val %t369, %S.ast.Type %t373, 1 + store %S.gen.Val %t374, ptr %a375 + %t376 = load ptr, ptr %a1 + %t377 = load %S.ast.Type, ptr %a232 + %t378 = call i1 @finch.gen.owning(ptr %t376, %S.ast.Type %t377) + br label %logic.from6182 +logic.from6182: + br i1 %t378, label %logic.rhs6183, label %logic.end6184 +logic.rhs6183: + %t379 = getelementptr inbounds %S.gen.Ref, ptr %a14, i32 0, i32 2 + %t380 = getelementptr inbounds %S.gen.Val, ptr %t379, i32 0, i32 2 + %t381 = load i1, ptr %t380 + br label %logic.rend6185 +logic.rend6185: + br label %logic.end6184 +logic.end6184: + %t382 = phi i1 [ false, %logic.from6182 ], [ %t381, %logic.rend6185 ] + br i1 %t382, label %then6186, label %endif6188 +then6186: + %t383 = load ptr, ptr %a1 + %t384 = load { ptr, i64, i64 }, ptr %a364 + %t385 = load %S.ast.Type, ptr %a232 + %t386 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t383, { ptr, i64, i64 } %t384, %S.ast.Type %t385) + %t387 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t386, 0 + %t388 = load %S.ast.Type, ptr %a232 + store %S.ast.Type %t388, ptr %a389 + call void @finch.copy.S_ast_Type(ptr %a390, ptr %a389) + %t391 = load %S.ast.Type, ptr %a390 + %t392 = insertvalue %S.gen.Val %t387, %S.ast.Type %t391, 1 + %t393 = insertvalue %S.gen.Val %t392, i1 true, 2 + store %S.gen.Val %t393, ptr %a375 + br label %endif6188 +endif6188: + %t394 = insertvalue %S.gen.Ref zeroinitializer, i1 false, 0 + %t395 = load %S.gen.Val, ptr %a375 + store %S.gen.Val %t395, ptr %a396 + call void @finch.copy.S_gen_Val(ptr %a397, ptr %a396) + %t398 = load %S.gen.Val, ptr %a397 + %t399 = insertvalue %S.gen.Ref %t394, %S.gen.Val %t398, 2 + ret %S.gen.Ref %t399 +} + +define internal void @finch.gen.checkArgs(ptr %p0, %S.ast.Node %p1, i64 %p2, i64 %p3, { ptr, i64, i64 } %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i64, align 16 + %a4 = alloca i64, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca i64, align 16 + %a13 = alloca i64, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i64 %p2, ptr %a3 + store i64 %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t6, i32 0, i32 1 + %t8 = load i64, ptr %t7 + %t9 = load i64, ptr %a3 + %t10 = sub i64 %t8, %t9 + store i64 %t10, ptr %a11 + %t12 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 10 + store i64 0, ptr %a13 + br label %each.cond6189 +each.cond6189: + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t12, i32 0, i32 1 + %t15 = load i64, ptr %t14 + %t16 = load i64, ptr %a13 + %t17 = icmp slt i64 %t16, %t15 + br i1 %t17, label %each.body6190, label %each.end6192 +each.body6190: + %t18 = load ptr, ptr %t12 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i64 %t16 + %t20 = load { ptr, i64, i64 }, ptr %t19 + store { ptr, i64, i64 } %t20, ptr %a21 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %a21, i32 0, i32 1 + %t23 = load i64, ptr %t22 + %t24 = icmp sgt i64 %t23, 0 + br i1 %t24, label %then6193, label %endif6195 +then6193: + %t25 = load ptr, ptr %a1 + %t26 = load %S.ast.Node, ptr %a2 + %t27 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.4038, i64 17, i64 0 }, ptr %a29 + store { ptr, i64, i64 } %t27, ptr %a30 + call void @finch_str_concat(ptr %a28, ptr %a29, ptr %a30) + %t31 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } %t31, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.4039, i64 36, i64 0 }, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + call void @finch.gen.fail(ptr %t25, %S.ast.Node %t26, { ptr, i64, i64 } %t35) + br label %endif6195 +endif6195: + br label %each.step6191 +each.step6191: + %t36 = load i64, ptr %a13 + %t37 = add i64 %t36, 1 + store i64 %t37, ptr %a13 + br label %each.cond6189 +each.end6192: + %t38 = load i64, ptr %a11 + %t39 = load i64, ptr %a4 + %t40 = icmp ne i64 %t38, %t39 + br i1 %t40, label %then6196, label %endif6198 +then6196: + %t41 = load ptr, ptr %a1 + %t42 = load %S.ast.Node, ptr %a2 + %t43 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.4040, i64 1, i64 0 }, ptr %a45 + store { ptr, i64, i64 } %t43, ptr %a46 + call void @finch_str_concat(ptr %a44, ptr %a45, ptr %a46) + %t47 = load { ptr, i64, i64 }, ptr %a44 + store { ptr, i64, i64 } %t47, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.4041, i64 8, i64 0 }, ptr %a50 + call void @finch_str_concat(ptr %a48, ptr %a49, ptr %a50) + %t51 = load { ptr, i64, i64 }, ptr %a48 + %t52 = load i64, ptr %a4 + call void @finch_str_from_int(ptr %a53, i64 %t52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t51, ptr %a56 + store { ptr, i64, i64 } %t54, ptr %a57 + call void @finch_str_concat(ptr %a55, ptr %a56, ptr %a57) + %t58 = load { ptr, i64, i64 }, ptr %a55 + store { ptr, i64, i64 } %t58, ptr %a60 + store { ptr, i64, i64 } { ptr @.str.4042, i64 22, i64 0 }, ptr %a61 + call void @finch_str_concat(ptr %a59, ptr %a60, ptr %a61) + %t62 = load { ptr, i64, i64 }, ptr %a59 + %t63 = load i64, ptr %a11 + call void @finch_str_from_int(ptr %a64, i64 %t63) + %t65 = load { ptr, i64, i64 }, ptr %a64 + store { ptr, i64, i64 } %t62, ptr %a67 + store { ptr, i64, i64 } %t65, ptr %a68 + call void @finch_str_concat(ptr %a66, ptr %a67, ptr %a68) + %t69 = load { ptr, i64, i64 }, ptr %a66 + call void @finch.gen.fail(ptr %t41, %S.ast.Node %t42, { ptr, i64, i64 } %t69) + br label %endif6198 +endif6198: + ret void +} + +define internal %S.gen.Val @finch.gen.strArg(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = load ptr, ptr %a1 + %t6 = load %S.ast.Node, ptr %a2 + %t7 = call %S.gen.Val @finch.gen.expr(ptr %t5, %S.ast.Node %t6) + %t8 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4043, i64 3, i64 0 }) + %t9 = load %S.ast.Node, ptr %a2 + %t10 = load { ptr, i64, i64 }, ptr %a3 + %t11 = call %S.gen.Val @finch.gen.coerce(ptr %t4, %S.gen.Val %t7, %S.ast.Type %t8, %S.ast.Node %t9, { ptr, i64, i64 } %t10) + ret %S.gen.Val %t11 +} + +define internal { ptr, i64, i64 } @finch.gen.strOut(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + store ptr %p0, ptr %a1 + %t2 = load ptr, ptr %a1 + %t3 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t2, { ptr, i64, i64 } { ptr @.str.4044, i64 17, i64 0 }) + ret { ptr, i64, i64 } %t3 +} + +define internal { ptr, i64, i64 } @finch.gen.numType({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca i64, align 16 + %a36 = alloca i64, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.4045, i64 3, i64 0 }, ptr %a4 + %t5 = call i32 @finch_str_eq(ptr %a3, ptr %a4) + %t6 = icmp ne i32 %t5, 0 + br i1 %t6, label %then6199, label %endif6201 +then6199: + ret { ptr, i64, i64 } { ptr @.str.4046, i64 3, i64 0 } +endif6201: + %t7 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.4047, i64 3, i64 0 }, ptr %a9 + %t10 = call i32 @finch_str_eq(ptr %a8, ptr %a9) + %t11 = icmp ne i32 %t10, 0 + br i1 %t11, label %then6202, label %endif6204 +then6202: + ret { ptr, i64, i64 } { ptr @.str.4048, i64 5, i64 0 } +endif6204: + %t12 = mul i64 13, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t13 = call ptr @finch_alloc(i64 %t12) + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 0 + store { ptr, i64, i64 } { ptr @.str.4049, i64 3, i64 0 }, ptr %t14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 1 + store { ptr, i64, i64 } { ptr @.str.4050, i64 5, i64 0 }, ptr %t15 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 2 + store { ptr, i64, i64 } { ptr @.str.4051, i64 4, i64 0 }, ptr %t16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 3 + store { ptr, i64, i64 } { ptr @.str.4052, i64 4, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 4 + store { ptr, i64, i64 } { ptr @.str.4053, i64 2, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 5 + store { ptr, i64, i64 } { ptr @.str.4054, i64 3, i64 0 }, ptr %t19 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 6 + store { ptr, i64, i64 } { ptr @.str.4055, i64 3, i64 0 }, ptr %t20 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 7 + store { ptr, i64, i64 } { ptr @.str.4056, i64 2, i64 0 }, ptr %t21 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 8 + store { ptr, i64, i64 } { ptr @.str.4057, i64 3, i64 0 }, ptr %t22 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 9 + store { ptr, i64, i64 } { ptr @.str.4058, i64 3, i64 0 }, ptr %t23 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 10 + store { ptr, i64, i64 } { ptr @.str.4059, i64 3, i64 0 }, ptr %t24 + %t25 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 11 + store { ptr, i64, i64 } { ptr @.str.4060, i64 3, i64 0 }, ptr %t25 + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %t13, i64 12 + store { ptr, i64, i64 } { ptr @.str.4061, i64 3, i64 0 }, ptr %t26 + %t27 = insertvalue { ptr, i64, i64 } undef, ptr %t13, 0 + %t28 = insertvalue { ptr, i64, i64 } %t27, i64 13, 1 + %t29 = insertvalue { ptr, i64, i64 } %t28, i64 13, 2 + store { ptr, i64, i64 } %t29, ptr %a30 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %a30, i32 0, i32 1 + %t32 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a33 + %t34 = load i64, ptr %t31 + %t35 = load ptr, ptr %a30 + store i64 0, ptr %a36 + br label %find.cond6205 +find.cond6205: + %t37 = load i64, ptr %a36 + %t38 = icmp slt i64 %t37, %t34 + br i1 %t38, label %find.body6206, label %find.end6209 +find.body6206: + %t39 = getelementptr inbounds { ptr, i64, i64 }, ptr %t35, i64 %t37 + %t40 = load { ptr, i64, i64 }, ptr %t39 + store { ptr, i64, i64 } %t40, ptr %a41 + store { ptr, i64, i64 } %t32, ptr %a42 + %t43 = call i32 @finch_str_eq(ptr %a41, ptr %a42) + %t44 = icmp ne i32 %t43, 0 + br i1 %t44, label %find.hit6207, label %find.next6208 +find.hit6207: + store i64 %t37, ptr %a33 + br label %find.end6209 +find.next6208: + %t45 = add i64 %t37, 1 + store i64 %t45, ptr %a36 + br label %find.cond6205 +find.end6209: + %t46 = load i64, ptr %a33 + %t47 = icmp sge i64 %t46, 0 + br i1 %t47, label %then6210, label %endif6212 +then6210: + %t48 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t48, ptr %a49 + call void @finch_str_copy(ptr %a50, ptr %a49) + %t51 = load { ptr, i64, i64 }, ptr %a50 + ret { ptr, i64, i64 } %t51 +endif6212: + ret { ptr, i64, i64 } { ptr @.str.4062, i64 0, i64 0 } +} + +define internal %S.gen.Val @finch.gen.convert(ptr %p0, %S.ast.Node %p1, %S.ast.Type %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a17 = alloca %S.gen.Val, align 16 + %a20 = alloca %S.ast.Type, align 16 + %a21 = alloca %S.ast.Type, align 16 + %a23 = alloca %S.ast.Type, align 16 + %a28 = alloca %S.gen.Val, align 16 + %a29 = alloca %S.gen.Val, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca %S.ast.Type, align 16 + %a125 = alloca %S.ast.Type, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca %S.ast.Type, align 16 + %a195 = alloca %S.ast.Type, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a231 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca %S.ast.Type, align 16 + %a266 = alloca %S.ast.Type, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca %S.ast.Type, align 16 + %a312 = alloca %S.ast.Type, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca %S.ast.Type, align 16 + %a333 = alloca %S.ast.Type, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a349 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca %S.ast.Type, align 16 + %a363 = alloca %S.ast.Type, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a369 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a377 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca %S.ast.Type, align 16 + %a394 = alloca %S.ast.Type, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a414 = alloca { ptr, i64, i64 }, align 16 + %a415 = alloca { ptr, i64, i64 }, align 16 + %a416 = alloca { ptr, i64, i64 }, align 16 + %a418 = alloca { ptr, i64, i64 }, align 16 + %a419 = alloca { ptr, i64, i64 }, align 16 + %a420 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + %a442 = alloca %S.ast.Type, align 16 + %a443 = alloca %S.ast.Type, align 16 + %a458 = alloca %S.ast.Type, align 16 + %a459 = alloca %S.ast.Type, align 16 + %a472 = alloca %S.ast.Type, align 16 + %a473 = alloca %S.ast.Type, align 16 + %a478 = alloca { ptr, i64, i64 }, align 16 + %a479 = alloca { ptr, i64, i64 }, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a490 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca { ptr, i64, i64 }, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a494 = alloca { ptr, i64, i64 }, align 16 + %a495 = alloca { ptr, i64, i64 }, align 16 + %a499 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca { ptr, i64, i64 }, align 16 + %a501 = alloca { ptr, i64, i64 }, align 16 + %a503 = alloca { ptr, i64, i64 }, align 16 + %a504 = alloca { ptr, i64, i64 }, align 16 + %a505 = alloca { ptr, i64, i64 }, align 16 + %a510 = alloca %S.ast.Type, align 16 + %a511 = alloca %S.ast.Type, align 16 + %a516 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a522 = alloca { ptr, i64, i64 }, align 16 + %a523 = alloca { ptr, i64, i64 }, align 16 + %a528 = alloca { ptr, i64, i64 }, align 16 + %a529 = alloca { ptr, i64, i64 }, align 16 + %a536 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a541 = alloca %S.ast.Type, align 16 + %a542 = alloca %S.ast.Type, align 16 + %a547 = alloca { ptr, i64, i64 }, align 16 + %a548 = alloca { ptr, i64, i64 }, align 16 + %a561 = alloca { ptr, i64, i64 }, align 16 + %a562 = alloca { ptr, i64, i64 }, align 16 + %a563 = alloca { ptr, i64, i64 }, align 16 + %a565 = alloca { ptr, i64, i64 }, align 16 + %a566 = alloca { ptr, i64, i64 }, align 16 + %a567 = alloca { ptr, i64, i64 }, align 16 + %a572 = alloca %S.ast.Type, align 16 + %a573 = alloca %S.ast.Type, align 16 + %a580 = alloca { ptr, i64, i64 }, align 16 + %a581 = alloca { ptr, i64, i64 }, align 16 + %a588 = alloca { ptr, i64, i64 }, align 16 + %a589 = alloca { ptr, i64, i64 }, align 16 + %a590 = alloca { ptr, i64, i64 }, align 16 + %a592 = alloca { ptr, i64, i64 }, align 16 + %a593 = alloca { ptr, i64, i64 }, align 16 + %a594 = alloca { ptr, i64, i64 }, align 16 + %a599 = alloca { ptr, i64, i64 }, align 16 + %a600 = alloca { ptr, i64, i64 }, align 16 + %a601 = alloca { ptr, i64, i64 }, align 16 + %a606 = alloca %S.ast.Type, align 16 + %a607 = alloca %S.ast.Type, align 16 + %a612 = alloca { ptr, i64, i64 }, align 16 + %a613 = alloca { ptr, i64, i64 }, align 16 + %a618 = alloca { ptr, i64, i64 }, align 16 + %a619 = alloca { ptr, i64, i64 }, align 16 + %a641 = alloca { ptr, i64, i64 }, align 16 + %a642 = alloca { ptr, i64, i64 }, align 16 + %a643 = alloca { ptr, i64, i64 }, align 16 + %a645 = alloca { ptr, i64, i64 }, align 16 + %a646 = alloca { ptr, i64, i64 }, align 16 + %a647 = alloca { ptr, i64, i64 }, align 16 + %a651 = alloca { ptr, i64, i64 }, align 16 + %a652 = alloca { ptr, i64, i64 }, align 16 + %a653 = alloca { ptr, i64, i64 }, align 16 + %a656 = alloca %S.gen.Val, align 16 + %a657 = alloca %S.gen.Val, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.ast.Type %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = load %S.ast.Node, ptr %a2 + %t6 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t7 = load { ptr, i64, i64 }, ptr %t6 + call void @finch.gen.checkArgs(ptr %t4, %S.ast.Node %t5, i64 0, i64 1, { ptr, i64, i64 } %t7) + %t8 = load ptr, ptr %a1 + %t9 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t10 = load { ptr, i64, i64 }, ptr %t9 + %t11 = extractvalue { ptr, i64, i64 } %t10, 1 + %t12 = icmp uge i64 0, %t11 + br i1 %t12, label %range6213, label %inrange6214 +range6213: + call void @finch_panic_index(ptr @.str.4063, i64 3478, i64 0, i64 %t11) + unreachable +inrange6214: + %t13 = extractvalue { ptr, i64, i64 } %t10, 0 + %t14 = getelementptr inbounds %S.ast.Node, ptr %t13, i64 0 + %t15 = load %S.ast.Node, ptr %t14 + %t16 = call %S.gen.Val @finch.gen.expr(ptr %t8, %S.ast.Node %t15) + store %S.gen.Val %t16, ptr %a17 + %t18 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 1 + %t19 = load %S.ast.Type, ptr %t18 + store %S.ast.Type %t19, ptr %a20 + call void @finch.copy.S_ast_Type(ptr %a21, ptr %a20) + %t22 = load %S.ast.Type, ptr %a21 + store %S.ast.Type %t22, ptr %a23 + %t24 = load %S.ast.Type, ptr %a23 + %t25 = load %S.ast.Type, ptr %a3 + %t26 = call i1 @finch.ast.same(%S.ast.Type %t24, %S.ast.Type %t25) + br i1 %t26, label %then6215, label %endif6217 +then6215: + %t27 = load %S.gen.Val, ptr %a17 + store %S.gen.Val %t27, ptr %a28 + call void @finch.copy.S_gen_Val(ptr %a29, ptr %a28) + %t30 = load %S.gen.Val, ptr %a29 + ret %S.gen.Val %t30 +endif6217: + %t31 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t32 = load { ptr, i64, i64 }, ptr %t31 + store { ptr, i64, i64 } %t32, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.4064, i64 3, i64 0 }, ptr %a34 + %t35 = call i32 @finch_str_eq(ptr %a33, ptr %a34) + %t36 = icmp ne i32 %t35, 0 + br label %logic.from6218 +logic.from6218: + br i1 %t36, label %logic.rhs6219, label %logic.end6220 +logic.rhs6219: + %t37 = load %S.ast.Type, ptr %a3 + %t38 = call i1 @finch.gen.isNumber(%S.ast.Type %t37) + br label %logic.rend6221 +logic.rend6221: + br label %logic.end6220 +logic.end6220: + %t39 = phi i1 [ false, %logic.from6218 ], [ %t38, %logic.rend6221 ] + br label %logic.from6222 +logic.from6222: + br i1 %t39, label %logic.rhs6223, label %logic.end6224 +logic.rhs6223: + %t40 = load ptr, ptr %a1 + %t41 = icmp eq ptr %t40, null + br i1 %t41, label %panic6225, label %ok6226 +panic6225: + call void @finch_panic(ptr @.str.4065, i64 3483, ptr @.str.4066) + unreachable +ok6226: + %t42 = getelementptr inbounds %S.gen.Gen, ptr %t40, i32 0, i32 37 + %t43 = load { ptr, i64, i64 }, ptr %t42 + %t44 = load %S.ast.Node, ptr %a2 + %t45 = call { ptr, i64, i64 } @finch.gen.nodeKey(%S.ast.Node %t44) + store { ptr, i64, i64 } %t43, ptr %a46 + store { ptr, i64, i64 } %t45, ptr %a47 + %t48 = call i32 @finch_str_eq(ptr %a46, ptr %a47) + %t49 = icmp ne i32 %t48, 0 + br label %logic.rend6227 +logic.rend6227: + br label %logic.end6224 +logic.end6224: + %t50 = phi i1 [ false, %logic.from6222 ], [ %t49, %logic.rend6227 ] + br i1 %t50, label %then6228, label %endif6230 +then6228: + %t51 = load ptr, ptr %a1 + %t52 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t51, { ptr, i64, i64 } { ptr @.str.4067, i64 17, i64 0 }) + store { ptr, i64, i64 } %t52, ptr %a53 + %t54 = load ptr, ptr %a1 + %t55 = load { ptr, i64, i64 }, ptr %a53 + call void @finch.gen.store(ptr %t54, { ptr, i64, i64 } { ptr @.str.4068, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4069, i64 15, i64 0 }, { ptr, i64, i64 } %t55) + %t56 = load %S.ast.Type, ptr %a3 + %t57 = call i1 @finch.gen.isInt(%S.ast.Type %t56) + br i1 %t57, label %then6231, label %endif6233 +then6231: + %t58 = load ptr, ptr %a1 + %t59 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t58, { ptr, i64, i64 } { ptr @.str.4070, i64 3, i64 0 }) + store { ptr, i64, i64 } %t59, ptr %a60 + %t61 = load ptr, ptr %a1 + %t62 = load { ptr, i64, i64 }, ptr %a60 + call void @finch.gen.store(ptr %t61, { ptr, i64, i64 } { ptr @.str.4071, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.4072, i64 1, i64 0 }, { ptr, i64, i64 } %t62) + %t63 = load ptr, ptr %a1 + %t64 = load ptr, ptr %a1 + %t65 = load %S.gen.Val, ptr %a17 + %t66 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t64, %S.gen.Val %t65) + store { ptr, i64, i64 } { ptr @.str.4073, i64 32, i64 0 }, ptr %a68 + store { ptr, i64, i64 } %t66, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t70, ptr %a72 + store { ptr, i64, i64 } { ptr @.str.4074, i64 6, i64 0 }, ptr %a73 + call void @finch_str_concat(ptr %a71, ptr %a72, ptr %a73) + %t74 = load { ptr, i64, i64 }, ptr %a71 + %t75 = load { ptr, i64, i64 }, ptr %a60 + store { ptr, i64, i64 } %t74, ptr %a77 + store { ptr, i64, i64 } %t75, ptr %a78 + call void @finch_str_concat(ptr %a76, ptr %a77, ptr %a78) + %t79 = load { ptr, i64, i64 }, ptr %a76 + store { ptr, i64, i64 } %t79, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.4075, i64 6, i64 0 }, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + %t84 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t83, ptr %a86 + store { ptr, i64, i64 } %t84, ptr %a87 + call void @finch_str_concat(ptr %a85, ptr %a86, ptr %a87) + %t88 = load { ptr, i64, i64 }, ptr %a85 + store { ptr, i64, i64 } %t88, ptr %a90 + store { ptr, i64, i64 } { ptr @.str.4076, i64 1, i64 0 }, ptr %a91 + call void @finch_str_concat(ptr %a89, ptr %a90, ptr %a91) + %t92 = load { ptr, i64, i64 }, ptr %a89 + %t93 = call { ptr, i64, i64 } @finch.gen.op(ptr %t63, { ptr, i64, i64 } %t92) + store { ptr, i64, i64 } %t93, ptr %a94 + %t95 = load ptr, ptr %a1 + %t96 = load { ptr, i64, i64 }, ptr %a94 + store { ptr, i64, i64 } { ptr @.str.4077, i64 12, i64 0 }, ptr %a98 + store { ptr, i64, i64 } %t96, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + store { ptr, i64, i64 } %t100, ptr %a102 + store { ptr, i64, i64 } { ptr @.str.4078, i64 3, i64 0 }, ptr %a103 + call void @finch_str_concat(ptr %a101, ptr %a102, ptr %a103) + %t104 = load { ptr, i64, i64 }, ptr %a101 + %t105 = call { ptr, i64, i64 } @finch.gen.op(ptr %t95, { ptr, i64, i64 } %t104) + %t106 = load ptr, ptr %a1 + %t107 = icmp eq ptr %t106, null + br i1 %t107, label %panic6234, label %ok6235 +panic6234: + call void @finch_panic(ptr @.str.4079, i64 3491, ptr @.str.4080) + unreachable +ok6235: + %t108 = getelementptr inbounds %S.gen.Gen, ptr %t106, i32 0, i32 38 + store { ptr, i64, i64 } %t105, ptr %t108 + %t109 = load ptr, ptr %a1 + %t110 = load { ptr, i64, i64 }, ptr %a53 + %t111 = call { ptr, i64, i64 } @finch.gen.load(ptr %t109, { ptr, i64, i64 } { ptr @.str.4081, i64 17, i64 0 }, { ptr, i64, i64 } %t110) + %t112 = load ptr, ptr %a1 + %t113 = icmp eq ptr %t112, null + br i1 %t113, label %panic6236, label %ok6237 +panic6236: + call void @finch_panic(ptr @.str.4082, i64 3492, ptr @.str.4083) + unreachable +ok6237: + %t114 = getelementptr inbounds %S.gen.Gen, ptr %t112, i32 0, i32 39 + store { ptr, i64, i64 } %t111, ptr %t114 + %t115 = load ptr, ptr %a1 + %t116 = load ptr, ptr %a1 + %t117 = load { ptr, i64, i64 }, ptr %a60 + %t118 = call { ptr, i64, i64 } @finch.gen.load(ptr %t116, { ptr, i64, i64 } { ptr @.str.4084, i64 3, i64 0 }, { ptr, i64, i64 } %t117) + %t119 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4085, i64 3, i64 0 }) + %t120 = load %S.ast.Type, ptr %a3 + %t121 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t115, { ptr, i64, i64 } %t118, %S.ast.Type %t119, %S.ast.Type %t120) + %t122 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t121, 0 + %t123 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t123, ptr %a124 + call void @finch.copy.S_ast_Type(ptr %a125, ptr %a124) + %t126 = load %S.ast.Type, ptr %a125 + %t127 = insertvalue %S.gen.Val %t122, %S.ast.Type %t126, 1 + ret %S.gen.Val %t127 +endif6233: + %t128 = load ptr, ptr %a1 + %t129 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t128, { ptr, i64, i64 } { ptr @.str.4086, i64 6, i64 0 }) + store { ptr, i64, i64 } %t129, ptr %a130 + %t131 = load ptr, ptr %a1 + %t132 = load { ptr, i64, i64 }, ptr %a130 + call void @finch.gen.store(ptr %t131, { ptr, i64, i64 } { ptr @.str.4087, i64 6, i64 0 }, { ptr, i64, i64 } { ptr @.str.4088, i64 3, i64 0 }, { ptr, i64, i64 } %t132) + %t133 = load ptr, ptr %a1 + %t134 = load ptr, ptr %a1 + %t135 = load %S.gen.Val, ptr %a17 + %t136 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t134, %S.gen.Val %t135) + store { ptr, i64, i64 } { ptr @.str.4089, i64 34, i64 0 }, ptr %a138 + store { ptr, i64, i64 } %t136, ptr %a139 + call void @finch_str_concat(ptr %a137, ptr %a138, ptr %a139) + %t140 = load { ptr, i64, i64 }, ptr %a137 + store { ptr, i64, i64 } %t140, ptr %a142 + store { ptr, i64, i64 } { ptr @.str.4090, i64 6, i64 0 }, ptr %a143 + call void @finch_str_concat(ptr %a141, ptr %a142, ptr %a143) + %t144 = load { ptr, i64, i64 }, ptr %a141 + %t145 = load { ptr, i64, i64 }, ptr %a130 + store { ptr, i64, i64 } %t144, ptr %a147 + store { ptr, i64, i64 } %t145, ptr %a148 + call void @finch_str_concat(ptr %a146, ptr %a147, ptr %a148) + %t149 = load { ptr, i64, i64 }, ptr %a146 + store { ptr, i64, i64 } %t149, ptr %a151 + store { ptr, i64, i64 } { ptr @.str.4091, i64 6, i64 0 }, ptr %a152 + call void @finch_str_concat(ptr %a150, ptr %a151, ptr %a152) + %t153 = load { ptr, i64, i64 }, ptr %a150 + %t154 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } %t153, ptr %a156 + store { ptr, i64, i64 } %t154, ptr %a157 + call void @finch_str_concat(ptr %a155, ptr %a156, ptr %a157) + %t158 = load { ptr, i64, i64 }, ptr %a155 + store { ptr, i64, i64 } %t158, ptr %a160 + store { ptr, i64, i64 } { ptr @.str.4092, i64 1, i64 0 }, ptr %a161 + call void @finch_str_concat(ptr %a159, ptr %a160, ptr %a161) + %t162 = load { ptr, i64, i64 }, ptr %a159 + %t163 = call { ptr, i64, i64 } @finch.gen.op(ptr %t133, { ptr, i64, i64 } %t162) + store { ptr, i64, i64 } %t163, ptr %a164 + %t165 = load ptr, ptr %a1 + %t166 = load { ptr, i64, i64 }, ptr %a164 + store { ptr, i64, i64 } { ptr @.str.4093, i64 12, i64 0 }, ptr %a168 + store { ptr, i64, i64 } %t166, ptr %a169 + call void @finch_str_concat(ptr %a167, ptr %a168, ptr %a169) + %t170 = load { ptr, i64, i64 }, ptr %a167 + store { ptr, i64, i64 } %t170, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4094, i64 3, i64 0 }, ptr %a173 + call void @finch_str_concat(ptr %a171, ptr %a172, ptr %a173) + %t174 = load { ptr, i64, i64 }, ptr %a171 + %t175 = call { ptr, i64, i64 } @finch.gen.op(ptr %t165, { ptr, i64, i64 } %t174) + %t176 = load ptr, ptr %a1 + %t177 = icmp eq ptr %t176, null + br i1 %t177, label %panic6238, label %ok6239 +panic6238: + call void @finch_panic(ptr @.str.4095, i64 3498, ptr @.str.4096) + unreachable +ok6239: + %t178 = getelementptr inbounds %S.gen.Gen, ptr %t176, i32 0, i32 38 + store { ptr, i64, i64 } %t175, ptr %t178 + %t179 = load ptr, ptr %a1 + %t180 = load { ptr, i64, i64 }, ptr %a53 + %t181 = call { ptr, i64, i64 } @finch.gen.load(ptr %t179, { ptr, i64, i64 } { ptr @.str.4097, i64 17, i64 0 }, { ptr, i64, i64 } %t180) + %t182 = load ptr, ptr %a1 + %t183 = icmp eq ptr %t182, null + br i1 %t183, label %panic6240, label %ok6241 +panic6240: + call void @finch_panic(ptr @.str.4098, i64 3499, ptr @.str.4099) + unreachable +ok6241: + %t184 = getelementptr inbounds %S.gen.Gen, ptr %t182, i32 0, i32 39 + store { ptr, i64, i64 } %t181, ptr %t184 + %t185 = load ptr, ptr %a1 + %t186 = load ptr, ptr %a1 + %t187 = load { ptr, i64, i64 }, ptr %a130 + %t188 = call { ptr, i64, i64 } @finch.gen.load(ptr %t186, { ptr, i64, i64 } { ptr @.str.4100, i64 6, i64 0 }, { ptr, i64, i64 } %t187) + %t189 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4101, i64 5, i64 0 }) + %t190 = load %S.ast.Type, ptr %a3 + %t191 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t185, { ptr, i64, i64 } %t188, %S.ast.Type %t189, %S.ast.Type %t190) + %t192 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t191, 0 + %t193 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t193, ptr %a194 + call void @finch.copy.S_ast_Type(ptr %a195, ptr %a194) + %t196 = load %S.ast.Type, ptr %a195 + %t197 = insertvalue %S.gen.Val %t192, %S.ast.Type %t196, 1 + ret %S.gen.Val %t197 +endif6230: + %t198 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t199 = load { ptr, i64, i64 }, ptr %t198 + store { ptr, i64, i64 } %t199, ptr %a200 + store { ptr, i64, i64 } { ptr @.str.4102, i64 3, i64 0 }, ptr %a201 + %t202 = call i32 @finch_str_eq(ptr %a200, ptr %a201) + %t203 = icmp ne i32 %t202, 0 + br label %logic.from6242 +logic.from6242: + br i1 %t203, label %logic.rhs6243, label %logic.end6244 +logic.rhs6243: + %t204 = load %S.ast.Type, ptr %a3 + %t205 = call i1 @finch.gen.isNumber(%S.ast.Type %t204) + br label %logic.rend6245 +logic.rend6245: + br label %logic.end6244 +logic.end6244: + %t206 = phi i1 [ false, %logic.from6242 ], [ %t205, %logic.rend6245 ] + br i1 %t206, label %then6246, label %endif6248 +then6246: + %t207 = load ptr, ptr %a1 + %t208 = load ptr, ptr %a1 + %t209 = icmp eq ptr %t208, null + br i1 %t209, label %panic6249, label %ok6250 +panic6249: + call void @finch_panic(ptr @.str.4103, i64 3503, ptr @.str.4104) + unreachable +ok6250: + %t210 = getelementptr inbounds %S.gen.Gen, ptr %t208, i32 0, i32 1 + %t211 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t212 = load i64, ptr %t211 + %t213 = load { ptr, i64, i64 }, ptr %t210 + %t214 = extractvalue { ptr, i64, i64 } %t213, 1 + %t215 = icmp uge i64 %t212, %t214 + br i1 %t215, label %range6251, label %inrange6252 +range6251: + call void @finch_panic_index(ptr @.str.4105, i64 3503, i64 %t212, i64 %t214) + unreachable +inrange6252: + %t216 = extractvalue { ptr, i64, i64 } %t213, 0 + %t217 = getelementptr inbounds { ptr, i64, i64 }, ptr %t216, i64 %t212 + %t218 = load { ptr, i64, i64 }, ptr %t217 + %t219 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t207, { ptr, i64, i64 } %t218) + store { ptr, i64, i64 } %t219, ptr %a220 + %t221 = load %S.ast.Type, ptr %a3 + %t222 = call i1 @finch.gen.isInt(%S.ast.Type %t221) + br i1 %t222, label %then6253, label %endif6255 +then6253: + %t223 = load ptr, ptr %a1 + %t224 = load ptr, ptr %a1 + %t225 = load %S.gen.Val, ptr %a17 + %t226 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t224, %S.gen.Val %t225) + store { ptr, i64, i64 } { ptr @.str.4106, i64 31, i64 0 }, ptr %a228 + store { ptr, i64, i64 } %t226, ptr %a229 + call void @finch_str_concat(ptr %a227, ptr %a228, ptr %a229) + %t230 = load { ptr, i64, i64 }, ptr %a227 + store { ptr, i64, i64 } %t230, ptr %a232 + store { ptr, i64, i64 } { ptr @.str.4107, i64 6, i64 0 }, ptr %a233 + call void @finch_str_concat(ptr %a231, ptr %a232, ptr %a233) + %t234 = load { ptr, i64, i64 }, ptr %a231 + %t235 = load { ptr, i64, i64 }, ptr %a220 + store { ptr, i64, i64 } %t234, ptr %a237 + store { ptr, i64, i64 } %t235, ptr %a238 + call void @finch_str_concat(ptr %a236, ptr %a237, ptr %a238) + %t239 = load { ptr, i64, i64 }, ptr %a236 + store { ptr, i64, i64 } %t239, ptr %a241 + store { ptr, i64, i64 } { ptr @.str.4108, i64 6, i64 0 }, ptr %a242 + call void @finch_str_concat(ptr %a240, ptr %a241, ptr %a242) + %t243 = load { ptr, i64, i64 }, ptr %a240 + %t244 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t245 = load i64, ptr %t244 + call void @finch_str_from_int(ptr %a246, i64 %t245) + %t247 = load { ptr, i64, i64 }, ptr %a246 + store { ptr, i64, i64 } %t243, ptr %a249 + store { ptr, i64, i64 } %t247, ptr %a250 + call void @finch_str_concat(ptr %a248, ptr %a249, ptr %a250) + %t251 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t251, ptr %a253 + store { ptr, i64, i64 } { ptr @.str.4109, i64 1, i64 0 }, ptr %a254 + call void @finch_str_concat(ptr %a252, ptr %a253, ptr %a254) + %t255 = load { ptr, i64, i64 }, ptr %a252 + %t256 = call { ptr, i64, i64 } @finch.gen.op(ptr %t223, { ptr, i64, i64 } %t255) + store { ptr, i64, i64 } %t256, ptr %a257 + %t258 = load ptr, ptr %a1 + %t259 = load { ptr, i64, i64 }, ptr %a257 + %t260 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4110, i64 3, i64 0 }) + %t261 = load %S.ast.Type, ptr %a3 + %t262 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t258, { ptr, i64, i64 } %t259, %S.ast.Type %t260, %S.ast.Type %t261) + %t263 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t262, 0 + %t264 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t264, ptr %a265 + call void @finch.copy.S_ast_Type(ptr %a266, ptr %a265) + %t267 = load %S.ast.Type, ptr %a266 + %t268 = insertvalue %S.gen.Val %t263, %S.ast.Type %t267, 1 + ret %S.gen.Val %t268 +endif6255: + %t269 = load ptr, ptr %a1 + %t270 = load ptr, ptr %a1 + %t271 = load %S.gen.Val, ptr %a17 + %t272 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t270, %S.gen.Val %t271) + store { ptr, i64, i64 } { ptr @.str.4111, i64 36, i64 0 }, ptr %a274 + store { ptr, i64, i64 } %t272, ptr %a275 + call void @finch_str_concat(ptr %a273, ptr %a274, ptr %a275) + %t276 = load { ptr, i64, i64 }, ptr %a273 + store { ptr, i64, i64 } %t276, ptr %a278 + store { ptr, i64, i64 } { ptr @.str.4112, i64 6, i64 0 }, ptr %a279 + call void @finch_str_concat(ptr %a277, ptr %a278, ptr %a279) + %t280 = load { ptr, i64, i64 }, ptr %a277 + %t281 = load { ptr, i64, i64 }, ptr %a220 + store { ptr, i64, i64 } %t280, ptr %a283 + store { ptr, i64, i64 } %t281, ptr %a284 + call void @finch_str_concat(ptr %a282, ptr %a283, ptr %a284) + %t285 = load { ptr, i64, i64 }, ptr %a282 + store { ptr, i64, i64 } %t285, ptr %a287 + store { ptr, i64, i64 } { ptr @.str.4113, i64 6, i64 0 }, ptr %a288 + call void @finch_str_concat(ptr %a286, ptr %a287, ptr %a288) + %t289 = load { ptr, i64, i64 }, ptr %a286 + %t290 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t291 = load i64, ptr %t290 + call void @finch_str_from_int(ptr %a292, i64 %t291) + %t293 = load { ptr, i64, i64 }, ptr %a292 + store { ptr, i64, i64 } %t289, ptr %a295 + store { ptr, i64, i64 } %t293, ptr %a296 + call void @finch_str_concat(ptr %a294, ptr %a295, ptr %a296) + %t297 = load { ptr, i64, i64 }, ptr %a294 + store { ptr, i64, i64 } %t297, ptr %a299 + store { ptr, i64, i64 } { ptr @.str.4114, i64 1, i64 0 }, ptr %a300 + call void @finch_str_concat(ptr %a298, ptr %a299, ptr %a300) + %t301 = load { ptr, i64, i64 }, ptr %a298 + %t302 = call { ptr, i64, i64 } @finch.gen.op(ptr %t269, { ptr, i64, i64 } %t301) + store { ptr, i64, i64 } %t302, ptr %a303 + %t304 = load ptr, ptr %a1 + %t305 = load { ptr, i64, i64 }, ptr %a303 + %t306 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4115, i64 5, i64 0 }) + %t307 = load %S.ast.Type, ptr %a3 + %t308 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t304, { ptr, i64, i64 } %t305, %S.ast.Type %t306, %S.ast.Type %t307) + %t309 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t308, 0 + %t310 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t310, ptr %a311 + call void @finch.copy.S_ast_Type(ptr %a312, ptr %a311) + %t313 = load %S.ast.Type, ptr %a312 + %t314 = insertvalue %S.gen.Val %t309, %S.ast.Type %t313, 1 + ret %S.gen.Val %t314 +endif6248: + %t315 = load %S.ast.Type, ptr %a3 + %t316 = call i1 @finch.gen.isInt(%S.ast.Type %t315) + br label %logic.from6256 +logic.from6256: + br i1 %t316, label %logic.rhs6257, label %logic.end6258 +logic.rhs6257: + %t317 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t318 = load { ptr, i64, i64 }, ptr %t317 + store { ptr, i64, i64 } %t318, ptr %a319 + store { ptr, i64, i64 } { ptr @.str.4116, i64 4, i64 0 }, ptr %a320 + %t321 = call i32 @finch_str_eq(ptr %a319, ptr %a320) + %t322 = icmp ne i32 %t321, 0 + br label %logic.rend6259 +logic.rend6259: + br label %logic.end6258 +logic.end6258: + %t323 = phi i1 [ false, %logic.from6256 ], [ %t322, %logic.rend6259 ] + br i1 %t323, label %then6260, label %endif6262 +then6260: + %t324 = load ptr, ptr %a1 + %t325 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t326 = load { ptr, i64, i64 }, ptr %t325 + %t327 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4117, i64 3, i64 0 }) + %t328 = load %S.ast.Type, ptr %a3 + %t329 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t324, { ptr, i64, i64 } %t326, %S.ast.Type %t327, %S.ast.Type %t328) + %t330 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t329, 0 + %t331 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t331, ptr %a332 + call void @finch.copy.S_ast_Type(ptr %a333, ptr %a332) + %t334 = load %S.ast.Type, ptr %a333 + %t335 = insertvalue %S.gen.Val %t330, %S.ast.Type %t334, 1 + ret %S.gen.Val %t335 +endif6262: + %t336 = load %S.ast.Type, ptr %a3 + %t337 = call i1 @finch.gen.isInt(%S.ast.Type %t336) + br label %logic.from6263 +logic.from6263: + br i1 %t337, label %logic.end6265, label %logic.rhs6264 +logic.rhs6264: + %t338 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t339 = load { ptr, i64, i64 }, ptr %t338 + store { ptr, i64, i64 } %t339, ptr %a340 + store { ptr, i64, i64 } { ptr @.str.4118, i64 4, i64 0 }, ptr %a341 + %t342 = call i32 @finch_str_eq(ptr %a340, ptr %a341) + %t343 = icmp ne i32 %t342, 0 + br label %logic.rend6266 +logic.rend6266: + br label %logic.end6265 +logic.end6265: + %t344 = phi i1 [ true, %logic.from6263 ], [ %t343, %logic.rend6266 ] + br i1 %t344, label %then6267, label %endif6269 +then6267: + %t345 = load %S.ast.Type, ptr %a23 + %t346 = call i1 @finch.gen.isInt(%S.ast.Type %t345) + br label %logic.from6270 +logic.from6270: + br i1 %t346, label %logic.end6272, label %logic.rhs6271 +logic.rhs6271: + %t347 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t348 = load { ptr, i64, i64 }, ptr %t347 + store { ptr, i64, i64 } %t348, ptr %a349 + store { ptr, i64, i64 } { ptr @.str.4119, i64 4, i64 0 }, ptr %a350 + %t351 = call i32 @finch_str_eq(ptr %a349, ptr %a350) + %t352 = icmp ne i32 %t351, 0 + br label %logic.rend6273 +logic.rend6273: + br label %logic.end6272 +logic.end6272: + %t353 = phi i1 [ true, %logic.from6270 ], [ %t352, %logic.rend6273 ] + br i1 %t353, label %then6274, label %endif6276 +then6274: + %t354 = load ptr, ptr %a1 + %t355 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t356 = load { ptr, i64, i64 }, ptr %t355 + %t357 = load %S.ast.Type, ptr %a23 + %t358 = load %S.ast.Type, ptr %a3 + %t359 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t354, { ptr, i64, i64 } %t356, %S.ast.Type %t357, %S.ast.Type %t358) + %t360 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t359, 0 + %t361 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t361, ptr %a362 + call void @finch.copy.S_ast_Type(ptr %a363, ptr %a362) + %t364 = load %S.ast.Type, ptr %a363 + %t365 = insertvalue %S.gen.Val %t360, %S.ast.Type %t364, 1 + ret %S.gen.Val %t365 +endif6276: + %t366 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t367 = load { ptr, i64, i64 }, ptr %t366 + store { ptr, i64, i64 } %t367, ptr %a368 + store { ptr, i64, i64 } { ptr @.str.4120, i64 4, i64 0 }, ptr %a369 + %t370 = call i32 @finch_str_eq(ptr %a368, ptr %a369) + %t371 = icmp ne i32 %t370, 0 + br i1 %t371, label %then6277, label %endif6279 +then6277: + %t372 = load ptr, ptr %a1 + %t373 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t374 = load { ptr, i64, i64 }, ptr %t373 + store { ptr, i64, i64 } { ptr @.str.4121, i64 8, i64 0 }, ptr %a376 + store { ptr, i64, i64 } %t374, ptr %a377 + call void @finch_str_concat(ptr %a375, ptr %a376, ptr %a377) + %t378 = load { ptr, i64, i64 }, ptr %a375 + store { ptr, i64, i64 } %t378, ptr %a380 + store { ptr, i64, i64 } { ptr @.str.4122, i64 4, i64 0 }, ptr %a381 + call void @finch_str_concat(ptr %a379, ptr %a380, ptr %a381) + %t382 = load { ptr, i64, i64 }, ptr %a379 + %t383 = load ptr, ptr %a1 + %t384 = load %S.ast.Type, ptr %a3 + %t385 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t383, %S.ast.Type %t384) + store { ptr, i64, i64 } %t382, ptr %a387 + store { ptr, i64, i64 } %t385, ptr %a388 + call void @finch_str_concat(ptr %a386, ptr %a387, ptr %a388) + %t389 = load { ptr, i64, i64 }, ptr %a386 + %t390 = call { ptr, i64, i64 } @finch.gen.op(ptr %t372, { ptr, i64, i64 } %t389) + %t391 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t390, 0 + %t392 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t392, ptr %a393 + call void @finch.copy.S_ast_Type(ptr %a394, ptr %a393) + %t395 = load %S.ast.Type, ptr %a394 + %t396 = insertvalue %S.gen.Val %t391, %S.ast.Type %t395, 1 + ret %S.gen.Val %t396 +endif6279: + %t397 = load %S.ast.Type, ptr %a23 + %t398 = call i1 @finch.gen.isFloat(%S.ast.Type %t397) + br label %logic.from6280 +logic.from6280: + br i1 %t398, label %logic.rhs6281, label %logic.end6282 +logic.rhs6281: + %t399 = load %S.ast.Type, ptr %a3 + %t400 = call i1 @finch.gen.isInt(%S.ast.Type %t399) + br label %logic.rend6283 +logic.rend6283: + br label %logic.end6282 +logic.end6282: + %t401 = phi i1 [ false, %logic.from6280 ], [ %t400, %logic.rend6283 ] + br i1 %t401, label %then6284, label %endif6286 +then6284: + store { ptr, i64, i64 } { ptr @.str.4123, i64 6, i64 0 }, ptr %a402 + %t403 = load %S.ast.Type, ptr %a3 + %t404 = call i1 @finch.gen.isSigned(%S.ast.Type %t403) + br i1 %t404, label %then6287, label %endif6289 +then6287: + store { ptr, i64, i64 } { ptr @.str.4124, i64 6, i64 0 }, ptr %a402 + br label %endif6289 +endif6289: + %t405 = load ptr, ptr %a1 + %t406 = load { ptr, i64, i64 }, ptr %a402 + store { ptr, i64, i64 } %t406, ptr %a408 + store { ptr, i64, i64 } { ptr @.str.4125, i64 1, i64 0 }, ptr %a409 + call void @finch_str_concat(ptr %a407, ptr %a408, ptr %a409) + %t410 = load { ptr, i64, i64 }, ptr %a407 + %t411 = load ptr, ptr %a1 + %t412 = load %S.ast.Type, ptr %a23 + %t413 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t411, %S.ast.Type %t412) + store { ptr, i64, i64 } %t410, ptr %a415 + store { ptr, i64, i64 } %t413, ptr %a416 + call void @finch_str_concat(ptr %a414, ptr %a415, ptr %a416) + %t417 = load { ptr, i64, i64 }, ptr %a414 + store { ptr, i64, i64 } %t417, ptr %a419 + store { ptr, i64, i64 } { ptr @.str.4126, i64 1, i64 0 }, ptr %a420 + call void @finch_str_concat(ptr %a418, ptr %a419, ptr %a420) + %t421 = load { ptr, i64, i64 }, ptr %a418 + %t422 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t423 = load { ptr, i64, i64 }, ptr %t422 + store { ptr, i64, i64 } %t421, ptr %a425 + store { ptr, i64, i64 } %t423, ptr %a426 + call void @finch_str_concat(ptr %a424, ptr %a425, ptr %a426) + %t427 = load { ptr, i64, i64 }, ptr %a424 + store { ptr, i64, i64 } %t427, ptr %a429 + store { ptr, i64, i64 } { ptr @.str.4127, i64 4, i64 0 }, ptr %a430 + call void @finch_str_concat(ptr %a428, ptr %a429, ptr %a430) + %t431 = load { ptr, i64, i64 }, ptr %a428 + %t432 = load ptr, ptr %a1 + %t433 = load %S.ast.Type, ptr %a3 + %t434 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t432, %S.ast.Type %t433) + store { ptr, i64, i64 } %t431, ptr %a436 + store { ptr, i64, i64 } %t434, ptr %a437 + call void @finch_str_concat(ptr %a435, ptr %a436, ptr %a437) + %t438 = load { ptr, i64, i64 }, ptr %a435 + %t439 = call { ptr, i64, i64 } @finch.gen.op(ptr %t405, { ptr, i64, i64 } %t438) + %t440 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t439, 0 + %t441 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t441, ptr %a442 + call void @finch.copy.S_ast_Type(ptr %a443, ptr %a442) + %t444 = load %S.ast.Type, ptr %a443 + %t445 = insertvalue %S.gen.Val %t440, %S.ast.Type %t444, 1 + ret %S.gen.Val %t445 +endif6286: + br label %endif6269 +endif6269: + %t446 = load %S.ast.Type, ptr %a3 + %t447 = call i1 @finch.gen.isFloat(%S.ast.Type %t446) + br i1 %t447, label %then6290, label %endif6292 +then6290: + %t448 = load %S.ast.Type, ptr %a23 + %t449 = call i1 @finch.gen.isInt(%S.ast.Type %t448) + br i1 %t449, label %then6293, label %endif6295 +then6293: + %t450 = load ptr, ptr %a1 + %t451 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t452 = load { ptr, i64, i64 }, ptr %t451 + %t453 = load %S.ast.Type, ptr %a23 + %t454 = load %S.ast.Type, ptr %a3 + %t455 = call { ptr, i64, i64 } @finch.gen.intToFloat(ptr %t450, { ptr, i64, i64 } %t452, %S.ast.Type %t453, %S.ast.Type %t454) + %t456 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t455, 0 + %t457 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t457, ptr %a458 + call void @finch.copy.S_ast_Type(ptr %a459, ptr %a458) + %t460 = load %S.ast.Type, ptr %a459 + %t461 = insertvalue %S.gen.Val %t456, %S.ast.Type %t460, 1 + ret %S.gen.Val %t461 +endif6295: + %t462 = load %S.ast.Type, ptr %a23 + %t463 = call i1 @finch.gen.isFloat(%S.ast.Type %t462) + br i1 %t463, label %then6296, label %endif6298 +then6296: + %t464 = load ptr, ptr %a1 + %t465 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t466 = load { ptr, i64, i64 }, ptr %t465 + %t467 = load %S.ast.Type, ptr %a23 + %t468 = load %S.ast.Type, ptr %a3 + %t469 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t464, { ptr, i64, i64 } %t466, %S.ast.Type %t467, %S.ast.Type %t468) + %t470 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t469, 0 + %t471 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t471, ptr %a472 + call void @finch.copy.S_ast_Type(ptr %a473, ptr %a472) + %t474 = load %S.ast.Type, ptr %a473 + %t475 = insertvalue %S.gen.Val %t470, %S.ast.Type %t474, 1 + ret %S.gen.Val %t475 +endif6298: + br label %endif6292 +endif6292: + %t476 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t477 = load { ptr, i64, i64 }, ptr %t476 + store { ptr, i64, i64 } %t477, ptr %a478 + store { ptr, i64, i64 } { ptr @.str.4128, i64 4, i64 0 }, ptr %a479 + %t480 = call i32 @finch_str_eq(ptr %a478, ptr %a479) + %t481 = icmp ne i32 %t480, 0 + br label %logic.from6299 +logic.from6299: + br i1 %t481, label %logic.rhs6300, label %logic.end6301 +logic.rhs6300: + %t482 = load %S.ast.Type, ptr %a23 + %t483 = call i1 @finch.gen.isInt(%S.ast.Type %t482) + br label %logic.rend6302 +logic.rend6302: + br label %logic.end6301 +logic.end6301: + %t484 = phi i1 [ false, %logic.from6299 ], [ %t483, %logic.rend6302 ] + br i1 %t484, label %then6303, label %endif6305 +then6303: + %t485 = load ptr, ptr %a1 + %t486 = load ptr, ptr %a1 + %t487 = load %S.ast.Type, ptr %a23 + %t488 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t486, %S.ast.Type %t487) + store { ptr, i64, i64 } { ptr @.str.4129, i64 8, i64 0 }, ptr %a490 + store { ptr, i64, i64 } %t488, ptr %a491 + call void @finch_str_concat(ptr %a489, ptr %a490, ptr %a491) + %t492 = load { ptr, i64, i64 }, ptr %a489 + store { ptr, i64, i64 } %t492, ptr %a494 + store { ptr, i64, i64 } { ptr @.str.4130, i64 1, i64 0 }, ptr %a495 + call void @finch_str_concat(ptr %a493, ptr %a494, ptr %a495) + %t496 = load { ptr, i64, i64 }, ptr %a493 + %t497 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t498 = load { ptr, i64, i64 }, ptr %t497 + store { ptr, i64, i64 } %t496, ptr %a500 + store { ptr, i64, i64 } %t498, ptr %a501 + call void @finch_str_concat(ptr %a499, ptr %a500, ptr %a501) + %t502 = load { ptr, i64, i64 }, ptr %a499 + store { ptr, i64, i64 } %t502, ptr %a504 + store { ptr, i64, i64 } { ptr @.str.4131, i64 3, i64 0 }, ptr %a505 + call void @finch_str_concat(ptr %a503, ptr %a504, ptr %a505) + %t506 = load { ptr, i64, i64 }, ptr %a503 + %t507 = call { ptr, i64, i64 } @finch.gen.op(ptr %t485, { ptr, i64, i64 } %t506) + %t508 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t507, 0 + %t509 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t509, ptr %a510 + call void @finch.copy.S_ast_Type(ptr %a511, ptr %a510) + %t512 = load %S.ast.Type, ptr %a511 + %t513 = insertvalue %S.gen.Val %t508, %S.ast.Type %t512, 1 + ret %S.gen.Val %t513 +endif6305: + %t514 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t515 = load { ptr, i64, i64 }, ptr %t514 + store { ptr, i64, i64 } %t515, ptr %a516 + store { ptr, i64, i64 } { ptr @.str.4132, i64 3, i64 0 }, ptr %a517 + %t518 = call i32 @finch_str_eq(ptr %a516, ptr %a517) + %t519 = icmp ne i32 %t518, 0 + br label %logic.from6306 +logic.from6306: + br i1 %t519, label %logic.rhs6307, label %logic.end6308 +logic.rhs6307: + %t520 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t521 = load { ptr, i64, i64 }, ptr %t520 + store { ptr, i64, i64 } %t521, ptr %a522 + store { ptr, i64, i64 } { ptr @.str.4133, i64 3, i64 0 }, ptr %a523 + %t524 = call i32 @finch_str_eq(ptr %a522, ptr %a523) + %t525 = icmp ne i32 %t524, 0 + br label %logic.from6309 +logic.from6309: + br i1 %t525, label %logic.end6311, label %logic.rhs6310 +logic.rhs6310: + %t526 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t527 = load { ptr, i64, i64 }, ptr %t526 + store { ptr, i64, i64 } %t527, ptr %a528 + store { ptr, i64, i64 } { ptr @.str.4134, i64 4, i64 0 }, ptr %a529 + %t530 = call i32 @finch_str_eq(ptr %a528, ptr %a529) + %t531 = icmp ne i32 %t530, 0 + br label %logic.rend6312 +logic.rend6312: + br label %logic.end6311 +logic.end6311: + %t532 = phi i1 [ true, %logic.from6309 ], [ %t531, %logic.rend6312 ] + br label %logic.rend6313 +logic.rend6313: + br label %logic.end6308 +logic.end6308: + %t533 = phi i1 [ false, %logic.from6306 ], [ %t532, %logic.rend6313 ] + br i1 %t533, label %then6314, label %endif6316 +then6314: + %t534 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t535 = load { ptr, i64, i64 }, ptr %t534 + store { ptr, i64, i64 } %t535, ptr %a536 + call void @finch_str_copy(ptr %a537, ptr %a536) + %t538 = load { ptr, i64, i64 }, ptr %a537 + %t539 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t538, 0 + %t540 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t540, ptr %a541 + call void @finch.copy.S_ast_Type(ptr %a542, ptr %a541) + %t543 = load %S.ast.Type, ptr %a542 + %t544 = insertvalue %S.gen.Val %t539, %S.ast.Type %t543, 1 + ret %S.gen.Val %t544 +endif6316: + %t545 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t546 = load { ptr, i64, i64 }, ptr %t545 + store { ptr, i64, i64 } %t546, ptr %a547 + store { ptr, i64, i64 } { ptr @.str.4135, i64 3, i64 0 }, ptr %a548 + %t549 = call i32 @finch_str_eq(ptr %a547, ptr %a548) + %t550 = icmp ne i32 %t549, 0 + br label %logic.from6317 +logic.from6317: + br i1 %t550, label %logic.rhs6318, label %logic.end6319 +logic.rhs6318: + %t551 = load %S.ast.Type, ptr %a23 + %t552 = call i1 @finch.gen.isInt(%S.ast.Type %t551) + br label %logic.rend6320 +logic.rend6320: + br label %logic.end6319 +logic.end6319: + %t553 = phi i1 [ false, %logic.from6317 ], [ %t552, %logic.rend6320 ] + br i1 %t553, label %then6321, label %endif6323 +then6321: + %t554 = load ptr, ptr %a1 + %t555 = load ptr, ptr %a1 + %t556 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t557 = load { ptr, i64, i64 }, ptr %t556 + %t558 = load %S.ast.Type, ptr %a23 + %t559 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4137, i64 3, i64 0 }) + %t560 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t555, { ptr, i64, i64 } %t557, %S.ast.Type %t558, %S.ast.Type %t559) + store { ptr, i64, i64 } { ptr @.str.4136, i64 13, i64 0 }, ptr %a562 + store { ptr, i64, i64 } %t560, ptr %a563 + call void @finch_str_concat(ptr %a561, ptr %a562, ptr %a563) + %t564 = load { ptr, i64, i64 }, ptr %a561 + store { ptr, i64, i64 } %t564, ptr %a566 + store { ptr, i64, i64 } { ptr @.str.4138, i64 7, i64 0 }, ptr %a567 + call void @finch_str_concat(ptr %a565, ptr %a566, ptr %a567) + %t568 = load { ptr, i64, i64 }, ptr %a565 + %t569 = call { ptr, i64, i64 } @finch.gen.op(ptr %t554, { ptr, i64, i64 } %t568) + %t570 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t569, 0 + %t571 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t571, ptr %a572 + call void @finch.copy.S_ast_Type(ptr %a573, ptr %a572) + %t574 = load %S.ast.Type, ptr %a573 + %t575 = insertvalue %S.gen.Val %t570, %S.ast.Type %t574, 1 + ret %S.gen.Val %t575 +endif6323: + %t576 = load %S.ast.Type, ptr %a3 + %t577 = call i1 @finch.gen.isInt(%S.ast.Type %t576) + br label %logic.from6324 +logic.from6324: + br i1 %t577, label %logic.rhs6325, label %logic.end6326 +logic.rhs6325: + %t578 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t579 = load { ptr, i64, i64 }, ptr %t578 + store { ptr, i64, i64 } %t579, ptr %a580 + store { ptr, i64, i64 } { ptr @.str.4139, i64 3, i64 0 }, ptr %a581 + %t582 = call i32 @finch_str_eq(ptr %a580, ptr %a581) + %t583 = icmp ne i32 %t582, 0 + br label %logic.rend6327 +logic.rend6327: + br label %logic.end6326 +logic.end6326: + %t584 = phi i1 [ false, %logic.from6324 ], [ %t583, %logic.rend6327 ] + br i1 %t584, label %then6328, label %endif6330 +then6328: + %t585 = load ptr, ptr %a1 + %t586 = getelementptr inbounds %S.gen.Val, ptr %a17, i32 0, i32 0 + %t587 = load { ptr, i64, i64 }, ptr %t586 + store { ptr, i64, i64 } { ptr @.str.4140, i64 13, i64 0 }, ptr %a589 + store { ptr, i64, i64 } %t587, ptr %a590 + call void @finch_str_concat(ptr %a588, ptr %a589, ptr %a590) + %t591 = load { ptr, i64, i64 }, ptr %a588 + store { ptr, i64, i64 } %t591, ptr %a593 + store { ptr, i64, i64 } { ptr @.str.4141, i64 4, i64 0 }, ptr %a594 + call void @finch_str_concat(ptr %a592, ptr %a593, ptr %a594) + %t595 = load { ptr, i64, i64 }, ptr %a592 + %t596 = load ptr, ptr %a1 + %t597 = load %S.ast.Type, ptr %a3 + %t598 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t596, %S.ast.Type %t597) + store { ptr, i64, i64 } %t595, ptr %a600 + store { ptr, i64, i64 } %t598, ptr %a601 + call void @finch_str_concat(ptr %a599, ptr %a600, ptr %a601) + %t602 = load { ptr, i64, i64 }, ptr %a599 + %t603 = call { ptr, i64, i64 } @finch.gen.op(ptr %t585, { ptr, i64, i64 } %t602) + %t604 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t603, 0 + %t605 = load %S.ast.Type, ptr %a3 + store %S.ast.Type %t605, ptr %a606 + call void @finch.copy.S_ast_Type(ptr %a607, ptr %a606) + %t608 = load %S.ast.Type, ptr %a607 + %t609 = insertvalue %S.gen.Val %t604, %S.ast.Type %t608, 1 + ret %S.gen.Val %t609 +endif6330: + %t610 = getelementptr inbounds %S.ast.Type, ptr %a3, i32 0, i32 0 + %t611 = load { ptr, i64, i64 }, ptr %t610 + store { ptr, i64, i64 } %t611, ptr %a612 + store { ptr, i64, i64 } { ptr @.str.4142, i64 3, i64 0 }, ptr %a613 + %t614 = call i32 @finch_str_eq(ptr %a612, ptr %a613) + %t615 = icmp ne i32 %t614, 0 + br label %logic.from6331 +logic.from6331: + br i1 %t615, label %logic.rhs6332, label %logic.end6333 +logic.rhs6332: + %t616 = getelementptr inbounds %S.ast.Type, ptr %a23, i32 0, i32 0 + %t617 = load { ptr, i64, i64 }, ptr %t616 + store { ptr, i64, i64 } %t617, ptr %a618 + store { ptr, i64, i64 } { ptr @.str.4143, i64 3, i64 0 }, ptr %a619 + %t620 = call i32 @finch_str_eq(ptr %a618, ptr %a619) + %t621 = icmp ne i32 %t620, 0 + br label %logic.rend6334 +logic.rend6334: + br label %logic.end6333 +logic.end6333: + %t622 = phi i1 [ false, %logic.from6331 ], [ %t621, %logic.rend6334 ] + br i1 %t622, label %then6335, label %endif6337 +then6335: + %t623 = load ptr, ptr %a1 + %t624 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t625 = load { ptr, i64, i64 }, ptr %t624 + %t626 = extractvalue { ptr, i64, i64 } %t625, 1 + %t627 = icmp uge i64 0, %t626 + br i1 %t627, label %range6338, label %inrange6339 +range6338: + call void @finch_panic_index(ptr @.str.4144, i64 3550, i64 0, i64 %t626) + unreachable +inrange6339: + %t628 = extractvalue { ptr, i64, i64 } %t625, 0 + %t629 = getelementptr inbounds %S.ast.Node, ptr %t628, i64 0 + %t630 = load %S.ast.Node, ptr %t629 + call void @finch.gen.fail(ptr %t623, %S.ast.Node %t630, { ptr, i64, i64 } { ptr @.str.4145, i64 70, i64 0 }) + br label %endif6337 +endif6337: + %t631 = load ptr, ptr %a1 + %t632 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t633 = load { ptr, i64, i64 }, ptr %t632 + %t634 = extractvalue { ptr, i64, i64 } %t633, 1 + %t635 = icmp uge i64 0, %t634 + br i1 %t635, label %range6340, label %inrange6341 +range6340: + call void @finch_panic_index(ptr @.str.4146, i64 3552, i64 0, i64 %t634) + unreachable +inrange6341: + %t636 = extractvalue { ptr, i64, i64 } %t633, 0 + %t637 = getelementptr inbounds %S.ast.Node, ptr %t636, i64 0 + %t638 = load %S.ast.Node, ptr %t637 + %t639 = load %S.ast.Type, ptr %a23 + %t640 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t639) + store { ptr, i64, i64 } { ptr @.str.4147, i64 11, i64 0 }, ptr %a642 + store { ptr, i64, i64 } %t640, ptr %a643 + call void @finch_str_concat(ptr %a641, ptr %a642, ptr %a643) + %t644 = load { ptr, i64, i64 }, ptr %a641 + store { ptr, i64, i64 } %t644, ptr %a646 + store { ptr, i64, i64 } { ptr @.str.4148, i64 6, i64 0 }, ptr %a647 + call void @finch_str_concat(ptr %a645, ptr %a646, ptr %a647) + %t648 = load { ptr, i64, i64 }, ptr %a645 + %t649 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t650 = load { ptr, i64, i64 }, ptr %t649 + store { ptr, i64, i64 } %t648, ptr %a652 + store { ptr, i64, i64 } %t650, ptr %a653 + call void @finch_str_concat(ptr %a651, ptr %a652, ptr %a653) + %t654 = load { ptr, i64, i64 }, ptr %a651 + call void @finch.gen.fail(ptr %t631, %S.ast.Node %t638, { ptr, i64, i64 } %t654) + %t655 = load %S.gen.Val, ptr %a17 + store %S.gen.Val %t655, ptr %a656 + call void @finch.copy.S_gen_Val(ptr %a657, ptr %a656) + %t658 = load %S.gen.Val, ptr %a657 + ret %S.gen.Val %t658 +} + +define internal i64 @finch.gen.sizeBytes(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.4149, i64 6, i64 0 }, ptr %a6 + %t7 = call i32 @finch_str_eq(ptr %a5, ptr %a6) + %t8 = icmp ne i32 %t7, 0 + br i1 %t8, label %then6342, label %endif6344 +then6342: + %t9 = load ptr, ptr %a1 + %t10 = icmp eq ptr %t9, null + br i1 %t10, label %panic6345, label %ok6346 +panic6345: + call void @finch_panic(ptr @.str.4150, i64 3585, ptr @.str.4151) + unreachable +ok6346: + %t11 = getelementptr inbounds %S.gen.Gen, ptr %t9, i32 0, i32 15 + %t12 = load ptr, ptr %a1 + %t13 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t14 = load { ptr, i64, i64 }, ptr %t13 + %t15 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t16 = load { ptr, i64, i64 }, ptr %t15 + %t17 = call i64 @finch.gen.findStruct(ptr %t12, { ptr, i64, i64 } %t14, { ptr, i64, i64 } %t16) + %t18 = load { ptr, i64, i64 }, ptr %t11 + %t19 = extractvalue { ptr, i64, i64 } %t18, 1 + %t20 = icmp uge i64 %t17, %t19 + br i1 %t20, label %range6347, label %inrange6348 +range6347: + call void @finch_panic_index(ptr @.str.4152, i64 3585, i64 %t17, i64 %t19) + unreachable +inrange6348: + %t21 = extractvalue { ptr, i64, i64 } %t18, 0 + %t22 = getelementptr inbounds %S.gen.StructDef, ptr %t21, i64 %t17 + %t23 = getelementptr inbounds %S.gen.StructDef, ptr %t22, i32 0, i32 9 + %t24 = load i64, ptr %t23 + ret i64 %t24 +endif6344: + %t25 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t26 = load { ptr, i64, i64 }, ptr %t25 + store { ptr, i64, i64 } %t26, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.4153, i64 5, i64 0 }, ptr %a28 + %t29 = call i32 @finch_str_eq(ptr %a27, ptr %a28) + %t30 = icmp ne i32 %t29, 0 + br i1 %t30, label %then6349, label %endif6351 +then6349: + %t31 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t32 = load i64, ptr %t31 + %t33 = load ptr, ptr %a1 + %t34 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t35 = load { ptr, i64, i64 }, ptr %t34 + %t36 = extractvalue { ptr, i64, i64 } %t35, 1 + %t37 = icmp uge i64 0, %t36 + br i1 %t37, label %range6352, label %inrange6353 +range6352: + call void @finch_panic_index(ptr @.str.4154, i64 3588, i64 0, i64 %t36) + unreachable +inrange6353: + %t38 = extractvalue { ptr, i64, i64 } %t35, 0 + %t39 = getelementptr inbounds %S.ast.Type, ptr %t38, i64 0 + %t40 = load %S.ast.Type, ptr %t39 + %t41 = call i64 @finch.gen.sizeBytes(ptr %t33, %S.ast.Type %t40) + %t42 = mul i64 %t32, %t41 + ret i64 %t42 +endif6351: + %t43 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t44 = load { ptr, i64, i64 }, ptr %t43 + store { ptr, i64, i64 } %t44, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.4155, i64 3, i64 0 }, ptr %a46 + %t47 = call i32 @finch_str_eq(ptr %a45, ptr %a46) + %t48 = icmp ne i32 %t47, 0 + br label %logic.from6354 +logic.from6354: + br i1 %t48, label %logic.end6356, label %logic.rhs6355 +logic.rhs6355: + %t49 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t50 = load { ptr, i64, i64 }, ptr %t49 + store { ptr, i64, i64 } %t50, ptr %a51 + store { ptr, i64, i64 } { ptr @.str.4156, i64 3, i64 0 }, ptr %a52 + %t53 = call i32 @finch_str_eq(ptr %a51, ptr %a52) + %t54 = icmp ne i32 %t53, 0 + br label %logic.rend6357 +logic.rend6357: + br label %logic.end6356 +logic.end6356: + %t55 = phi i1 [ true, %logic.from6354 ], [ %t54, %logic.rend6357 ] + br i1 %t55, label %then6358, label %endif6360 +then6358: + ret i64 8 +endif6360: + %t56 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t57 = load { ptr, i64, i64 }, ptr %t56 + store { ptr, i64, i64 } %t57, ptr %a58 + store { ptr, i64, i64 } { ptr @.str.4157, i64 5, i64 0 }, ptr %a59 + %t60 = call i32 @finch_str_eq(ptr %a58, ptr %a59) + %t61 = icmp ne i32 %t60, 0 + br i1 %t61, label %then6361, label %endif6363 +then6361: + ret i64 8 +endif6363: + %t62 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t63 = load { ptr, i64, i64 }, ptr %t62 + store { ptr, i64, i64 } %t63, ptr %a64 + store { ptr, i64, i64 } { ptr @.str.4158, i64 3, i64 0 }, ptr %a65 + %t66 = call i32 @finch_str_eq(ptr %a64, ptr %a65) + %t67 = icmp ne i32 %t66, 0 + br i1 %t67, label %then6364, label %endif6366 +then6364: + ret i64 4 +endif6366: + %t68 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t69 = load { ptr, i64, i64 }, ptr %t68 + store { ptr, i64, i64 } %t69, ptr %a70 + store { ptr, i64, i64 } { ptr @.str.4159, i64 4, i64 0 }, ptr %a71 + %t72 = call i32 @finch_str_eq(ptr %a70, ptr %a71) + %t73 = icmp ne i32 %t72, 0 + br i1 %t73, label %then6367, label %endif6369 +then6367: + ret i64 1 +endif6369: + %t74 = load %S.ast.Type, ptr %a2 + %t75 = call i64 @finch.gen.bitsOf(%S.ast.Type %t74) + %t76 = sdiv i64 %t75, 8 + ret i64 %t76 +} + +define internal void @finch.copy.arr_S_gen_Leaf(ptr %dst, ptr %src) { +entry: + + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.gen.Leaf, ptr null, i32 1) to i64)) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.leavesOf(ptr %p0, %S.ast.Type %p1, i64 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a3 = alloca i64, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca %S.gen.StructDef, align 16 + %a27 = alloca %S.gen.StructDef, align 16 + %a29 = alloca %S.gen.StructDef, align 16 + %a33 = alloca i64, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca i64, align 16 + %a65 = alloca %S.gen.Leaf, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca i64, align 16 + %a94 = alloca i64, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca i64, align 16 + %a120 = alloca %S.gen.Leaf, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + store i64 %p2, ptr %a3 + store { ptr, i64, i64 } zeroinitializer, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t6 = load { ptr, i64, i64 }, ptr %t5 + store { ptr, i64, i64 } %t6, ptr %a7 + store { ptr, i64, i64 } { ptr @.str.4160, i64 6, i64 0 }, ptr %a8 + %t9 = call i32 @finch_str_eq(ptr %a7, ptr %a8) + %t10 = icmp ne i32 %t9, 0 + br i1 %t10, label %then6370, label %else6371 +then6370: + %t11 = load ptr, ptr %a1 + %t12 = icmp eq ptr %t11, null + br i1 %t12, label %panic6373, label %ok6374 +panic6373: + call void @finch_panic(ptr @.str.4161, i64 3609, ptr @.str.4162) + unreachable +ok6374: + %t13 = getelementptr inbounds %S.gen.Gen, ptr %t11, i32 0, i32 15 + %t14 = load ptr, ptr %a1 + %t15 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t16 = load { ptr, i64, i64 }, ptr %t15 + %t17 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t18 = load { ptr, i64, i64 }, ptr %t17 + %t19 = call i64 @finch.gen.findStruct(ptr %t14, { ptr, i64, i64 } %t16, { ptr, i64, i64 } %t18) + %t20 = load { ptr, i64, i64 }, ptr %t13 + %t21 = extractvalue { ptr, i64, i64 } %t20, 1 + %t22 = icmp uge i64 %t19, %t21 + br i1 %t22, label %range6375, label %inrange6376 +range6375: + call void @finch_panic_index(ptr @.str.4163, i64 3609, i64 %t19, i64 %t21) + unreachable +inrange6376: + %t23 = extractvalue { ptr, i64, i64 } %t20, 0 + %t24 = getelementptr inbounds %S.gen.StructDef, ptr %t23, i64 %t19 + %t25 = load %S.gen.StructDef, ptr %t24 + store %S.gen.StructDef %t25, ptr %a26 + call void @finch.copy.S_gen_StructDef(ptr %a27, ptr %a26) + %t28 = load %S.gen.StructDef, ptr %a27 + store %S.gen.StructDef %t28, ptr %a29 + %t30 = getelementptr inbounds %S.gen.StructDef, ptr %a29, i32 0, i32 12 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t30, i32 0, i32 1 + %t32 = load i64, ptr %t31 + store i64 0, ptr %a33 + br label %for.cond6377 +for.cond6377: + %t34 = load i64, ptr %a33 + %t35 = icmp slt i64 %t34, %t32 + br i1 %t35, label %for.body6378, label %for.end6380 +for.body6378: + %t36 = load ptr, ptr %a1 + %t37 = getelementptr inbounds %S.gen.StructDef, ptr %a29, i32 0, i32 12 + %t38 = load i64, ptr %a33 + %t39 = load { ptr, i64, i64 }, ptr %t37 + %t40 = extractvalue { ptr, i64, i64 } %t39, 1 + %t41 = icmp uge i64 %t38, %t40 + br i1 %t41, label %range6381, label %inrange6382 +range6381: + call void @finch_panic_index(ptr @.str.4164, i64 3611, i64 %t38, i64 %t40) + unreachable +inrange6382: + %t42 = extractvalue { ptr, i64, i64 } %t39, 0 + %t43 = getelementptr inbounds %S.ast.Type, ptr %t42, i64 %t38 + %t44 = load %S.ast.Type, ptr %t43 + %t45 = load i64, ptr %a3 + %t46 = getelementptr inbounds %S.gen.StructDef, ptr %a29, i32 0, i32 4 + %t47 = load i64, ptr %a33 + %t48 = load { ptr, i64, i64 }, ptr %t46 + %t49 = extractvalue { ptr, i64, i64 } %t48, 1 + %t50 = icmp uge i64 %t47, %t49 + br i1 %t50, label %range6383, label %inrange6384 +range6383: + call void @finch_panic_index(ptr @.str.4165, i64 3611, i64 %t47, i64 %t49) + unreachable +inrange6384: + %t51 = extractvalue { ptr, i64, i64 } %t48, 0 + %t52 = getelementptr inbounds i64, ptr %t51, i64 %t47 + %t53 = load i64, ptr %t52 + %t54 = add i64 %t45, %t53 + %t55 = call { ptr, i64, i64 } @finch.gen.leavesOf(ptr %t36, %S.ast.Type %t44, i64 %t54) + store { ptr, i64, i64 } %t55, ptr %a56 + store i64 0, ptr %a57 + br label %each.cond6385 +each.cond6385: + %t58 = getelementptr inbounds { ptr, i64, i64 }, ptr %a56, i32 0, i32 1 + %t59 = load i64, ptr %t58 + %t60 = load i64, ptr %a57 + %t61 = icmp slt i64 %t60, %t59 + br i1 %t61, label %each.body6386, label %each.end6388 +each.body6386: + %t62 = load ptr, ptr %a56 + %t63 = getelementptr inbounds %S.gen.Leaf, ptr %t62, i64 %t60 + %t64 = load %S.gen.Leaf, ptr %t63 + store %S.gen.Leaf %t64, ptr %a65 + %t66 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t67 = load %S.gen.Leaf, ptr %a65 + %t68 = load i64, ptr %t66 + %t69 = add i64 %t68, 1 + call void @finch_arr_reserve(ptr %a4, i64 %t69, i64 ptrtoint (ptr getelementptr (%S.gen.Leaf, ptr null, i32 1) to i64)) + %t70 = load ptr, ptr %a4 + %t71 = getelementptr inbounds %S.gen.Leaf, ptr %t70, i64 %t68 + store %S.gen.Leaf %t67, ptr %t71 + store i64 %t69, ptr %t66 + br label %each.step6387 +each.step6387: + %t72 = load i64, ptr %a57 + %t73 = add i64 %t72, 1 + store i64 %t73, ptr %a57 + br label %each.cond6385 +each.end6388: + br label %for.step6379 +for.step6379: + %t74 = load i64, ptr %a33 + %t75 = add i64 %t74, 1 + store i64 %t75, ptr %a33 + br label %for.cond6377 +for.end6380: + br label %endif6372 +else6371: + %t76 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t77 = load { ptr, i64, i64 }, ptr %t76 + store { ptr, i64, i64 } %t77, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.4166, i64 5, i64 0 }, ptr %a79 + %t80 = call i32 @finch_str_eq(ptr %a78, ptr %a79) + %t81 = icmp ne i32 %t80, 0 + br i1 %t81, label %then6389, label %else6390 +then6389: + %t82 = load ptr, ptr %a1 + %t83 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t84 = load { ptr, i64, i64 }, ptr %t83 + %t85 = extractvalue { ptr, i64, i64 } %t84, 1 + %t86 = icmp uge i64 0, %t85 + br i1 %t86, label %range6392, label %inrange6393 +range6392: + call void @finch_panic_index(ptr @.str.4167, i64 3616, i64 0, i64 %t85) + unreachable +inrange6393: + %t87 = extractvalue { ptr, i64, i64 } %t84, 0 + %t88 = getelementptr inbounds %S.ast.Type, ptr %t87, i64 0 + %t89 = load %S.ast.Type, ptr %t88 + %t90 = call i64 @finch.gen.sizeBytes(ptr %t82, %S.ast.Type %t89) + store i64 %t90, ptr %a91 + %t92 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 4 + %t93 = load i64, ptr %t92 + store i64 0, ptr %a94 + br label %for.cond6394 +for.cond6394: + %t95 = load i64, ptr %a94 + %t96 = icmp slt i64 %t95, %t93 + br i1 %t96, label %for.body6395, label %for.end6397 +for.body6395: + %t97 = load ptr, ptr %a1 + %t98 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 1 + %t99 = load { ptr, i64, i64 }, ptr %t98 + %t100 = extractvalue { ptr, i64, i64 } %t99, 1 + %t101 = icmp uge i64 0, %t100 + br i1 %t101, label %range6398, label %inrange6399 +range6398: + call void @finch_panic_index(ptr @.str.4168, i64 3618, i64 0, i64 %t100) + unreachable +inrange6399: + %t102 = extractvalue { ptr, i64, i64 } %t99, 0 + %t103 = getelementptr inbounds %S.ast.Type, ptr %t102, i64 0 + %t104 = load %S.ast.Type, ptr %t103 + %t105 = load i64, ptr %a3 + %t106 = load i64, ptr %a94 + %t107 = load i64, ptr %a91 + %t108 = mul i64 %t106, %t107 + %t109 = add i64 %t105, %t108 + %t110 = call { ptr, i64, i64 } @finch.gen.leavesOf(ptr %t97, %S.ast.Type %t104, i64 %t109) + store { ptr, i64, i64 } %t110, ptr %a111 + store i64 0, ptr %a112 + br label %each.cond6400 +each.cond6400: + %t113 = getelementptr inbounds { ptr, i64, i64 }, ptr %a111, i32 0, i32 1 + %t114 = load i64, ptr %t113 + %t115 = load i64, ptr %a112 + %t116 = icmp slt i64 %t115, %t114 + br i1 %t116, label %each.body6401, label %each.end6403 +each.body6401: + %t117 = load ptr, ptr %a111 + %t118 = getelementptr inbounds %S.gen.Leaf, ptr %t117, i64 %t115 + %t119 = load %S.gen.Leaf, ptr %t118 + store %S.gen.Leaf %t119, ptr %a120 + %t121 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t122 = load %S.gen.Leaf, ptr %a120 + %t123 = load i64, ptr %t121 + %t124 = add i64 %t123, 1 + call void @finch_arr_reserve(ptr %a4, i64 %t124, i64 ptrtoint (ptr getelementptr (%S.gen.Leaf, ptr null, i32 1) to i64)) + %t125 = load ptr, ptr %a4 + %t126 = getelementptr inbounds %S.gen.Leaf, ptr %t125, i64 %t123 + store %S.gen.Leaf %t122, ptr %t126 + store i64 %t124, ptr %t121 + br label %each.step6402 +each.step6402: + %t127 = load i64, ptr %a112 + %t128 = add i64 %t127, 1 + store i64 %t128, ptr %a112 + br label %each.cond6400 +each.end6403: + br label %for.step6396 +for.step6396: + %t129 = load i64, ptr %a94 + %t130 = add i64 %t129, 1 + store i64 %t130, ptr %a94 + br label %for.cond6394 +for.end6397: + br label %endif6391 +else6390: + %t131 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t132 = load i64, ptr %a3 + %t133 = insertvalue %S.gen.Leaf zeroinitializer, i64 %t132, 0 + %t134 = load ptr, ptr %a1 + %t135 = load %S.ast.Type, ptr %a2 + %t136 = call i64 @finch.gen.sizeBytes(ptr %t134, %S.ast.Type %t135) + %t137 = insertvalue %S.gen.Leaf %t133, i64 %t136, 1 + %t138 = load %S.ast.Type, ptr %a2 + %t139 = call i1 @finch.gen.isFloat(%S.ast.Type %t138) + %t140 = insertvalue %S.gen.Leaf %t137, i1 %t139, 2 + %t141 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t142 = load { ptr, i64, i64 }, ptr %t141 + store { ptr, i64, i64 } %t142, ptr %a143 + store { ptr, i64, i64 } { ptr @.str.4169, i64 5, i64 0 }, ptr %a144 + %t145 = call i32 @finch_str_eq(ptr %a143, ptr %a144) + %t146 = icmp ne i32 %t145, 0 + %t147 = insertvalue %S.gen.Leaf %t140, i1 %t146, 3 + %t148 = load i64, ptr %t131 + %t149 = add i64 %t148, 1 + call void @finch_arr_reserve(ptr %a4, i64 %t149, i64 ptrtoint (ptr getelementptr (%S.gen.Leaf, ptr null, i32 1) to i64)) + %t150 = load ptr, ptr %a4 + %t151 = getelementptr inbounds %S.gen.Leaf, ptr %t150, i64 %t148 + store %S.gen.Leaf %t147, ptr %t151 + store i64 %t149, ptr %t131 + br label %endif6391 +endif6391: + br label %endif6372 +endif6372: + %t152 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t152, ptr %a153 + call void @finch.copy.arr_S_gen_Leaf(ptr %a154, ptr %a153) + %t155 = load { ptr, i64, i64 }, ptr %a154 + ret { ptr, i64, i64 } %t155 +} + +define internal void @finch.copy.S_gen_Abi(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Abi, ptr %src + store %S.gen.Abi %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Abi, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Abi, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Abi, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Abi, ptr %src, i32 0, i32 1 + call void @finch.copy.arr_str(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.Abi, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.Abi, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + ret void +} + +define internal %S.gen.Abi @finch.gen.classifyArm64(ptr %p0, %S.ast.Type %p1, %S.gen.Abi %p2, i64 %p3, i64 %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.gen.Abi, align 16 + %a4 = alloca i64, align 16 + %a5 = alloca i64, align 16 + %a7 = alloca %S.gen.Abi, align 16 + %a8 = alloca %S.gen.Abi, align 16 + %a10 = alloca %S.gen.Abi, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca i1, align 16 + %a23 = alloca i64, align 16 + %a31 = alloca %S.gen.Leaf, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca i64, align 16 + %a94 = alloca %S.gen.Leaf, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca %S.gen.Abi, align 16 + %a121 = alloca %S.gen.Abi, align 16 + %a127 = alloca %S.gen.Abi, align 16 + %a128 = alloca %S.gen.Abi, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca %S.gen.Abi, align 16 + %a166 = alloca %S.gen.Abi, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + store %S.gen.Abi %p2, ptr %a3 + store i64 %p3, ptr %a4 + store i64 %p4, ptr %a5 + %t6 = load %S.gen.Abi, ptr %a3 + store %S.gen.Abi %t6, ptr %a7 + call void @finch.copy.S_gen_Abi(ptr %a8, ptr %a7) + %t9 = load %S.gen.Abi, ptr %a8 + store %S.gen.Abi %t9, ptr %a10 + %t11 = load ptr, ptr %a1 + %t12 = load %S.ast.Type, ptr %a2 + %t13 = call { ptr, i64, i64 } @finch.gen.leavesOf(ptr %t11, %S.ast.Type %t12, i64 0) + store { ptr, i64, i64 } %t13, ptr %a14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t16 = load i64, ptr %t15 + %t17 = icmp sgt i64 %t16, 0 + br label %logic.from6404 +logic.from6404: + br i1 %t17, label %logic.rhs6405, label %logic.end6406 +logic.rhs6405: + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t19 = load i64, ptr %t18 + %t20 = icmp sle i64 %t19, 4 + br label %logic.rend6407 +logic.rend6407: + br label %logic.end6406 +logic.end6406: + %t21 = phi i1 [ false, %logic.from6404 ], [ %t20, %logic.rend6407 ] + store i1 %t21, ptr %a22 + store i64 0, ptr %a23 + br label %each.cond6408 +each.cond6408: + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t25 = load i64, ptr %t24 + %t26 = load i64, ptr %a23 + %t27 = icmp slt i64 %t26, %t25 + br i1 %t27, label %each.body6409, label %each.end6411 +each.body6409: + %t28 = load ptr, ptr %a14 + %t29 = getelementptr inbounds %S.gen.Leaf, ptr %t28, i64 %t26 + %t30 = load %S.gen.Leaf, ptr %t29 + store %S.gen.Leaf %t30, ptr %a31 + %t32 = getelementptr inbounds %S.gen.Leaf, ptr %a31, i32 0, i32 2 + %t33 = load i1, ptr %t32 + %t34 = xor i1 %t33, true + br label %logic.from6412 +logic.from6412: + br i1 %t34, label %logic.end6414, label %logic.rhs6413 +logic.rhs6413: + %t35 = getelementptr inbounds %S.gen.Leaf, ptr %a31, i32 0, i32 3 + %t36 = load i1, ptr %t35 + %t37 = load { ptr, i64, i64 }, ptr %a14 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 0, %t38 + br i1 %t39, label %range6415, label %inrange6416 +range6415: + call void @finch_panic_index(ptr @.str.4170, i64 3635, i64 0, i64 %t38) + unreachable +inrange6416: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds %S.gen.Leaf, ptr %t40, i64 0 + %t42 = getelementptr inbounds %S.gen.Leaf, ptr %t41, i32 0, i32 3 + %t43 = load i1, ptr %t42 + %t44 = icmp ne i1 %t36, %t43 + br label %logic.rend6417 +logic.rend6417: + br label %logic.end6414 +logic.end6414: + %t45 = phi i1 [ true, %logic.from6412 ], [ %t44, %logic.rend6417 ] + br i1 %t45, label %then6418, label %endif6420 +then6418: + store i1 false, ptr %a22 + br label %endif6420 +endif6420: + br label %each.step6410 +each.step6410: + %t46 = load i64, ptr %a23 + %t47 = add i64 %t46, 1 + store i64 %t47, ptr %a23 + br label %each.cond6408 +each.end6411: + %t48 = load i1, ptr %a22 + br i1 %t48, label %then6421, label %endif6423 +then6421: + store { ptr, i64, i64 } { ptr @.str.4171, i64 5, i64 0 }, ptr %a49 + %t50 = load { ptr, i64, i64 }, ptr %a14 + %t51 = extractvalue { ptr, i64, i64 } %t50, 1 + %t52 = icmp uge i64 0, %t51 + br i1 %t52, label %range6424, label %inrange6425 +range6424: + call void @finch_panic_index(ptr @.str.4172, i64 3641, i64 0, i64 %t51) + unreachable +inrange6425: + %t53 = extractvalue { ptr, i64, i64 } %t50, 0 + %t54 = getelementptr inbounds %S.gen.Leaf, ptr %t53, i64 0 + %t55 = getelementptr inbounds %S.gen.Leaf, ptr %t54, i32 0, i32 3 + %t56 = load i1, ptr %t55 + br i1 %t56, label %then6426, label %endif6428 +then6426: + store { ptr, i64, i64 } { ptr @.str.4173, i64 6, i64 0 }, ptr %a49 + br label %endif6428 +endif6428: + %t57 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4174, i64 6, i64 0 }, ptr %t57 + %t58 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 1 + %t59 = getelementptr inbounds { ptr, i64, i64 }, ptr %t58, i32 0, i32 1 + %t60 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t61 = load i64, ptr %t60 + call void @finch_str_from_int(ptr %a62, i64 %t61) + %t63 = load { ptr, i64, i64 }, ptr %a62 + store { ptr, i64, i64 } { ptr @.str.4175, i64 1, i64 0 }, ptr %a65 + store { ptr, i64, i64 } %t63, ptr %a66 + call void @finch_str_concat(ptr %a64, ptr %a65, ptr %a66) + %t67 = load { ptr, i64, i64 }, ptr %a64 + store { ptr, i64, i64 } %t67, ptr %a69 + store { ptr, i64, i64 } { ptr @.str.4176, i64 3, i64 0 }, ptr %a70 + call void @finch_str_concat(ptr %a68, ptr %a69, ptr %a70) + %t71 = load { ptr, i64, i64 }, ptr %a68 + %t72 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t71, ptr %a74 + store { ptr, i64, i64 } %t72, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + store { ptr, i64, i64 } %t76, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.4177, i64 1, i64 0 }, ptr %a79 + call void @finch_str_concat(ptr %a77, ptr %a78, ptr %a79) + %t80 = load { ptr, i64, i64 }, ptr %a77 + %t81 = load i64, ptr %t59 + %t82 = add i64 %t81, 1 + call void @finch_arr_reserve(ptr %t58, i64 %t82, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t83 = load ptr, ptr %t58 + %t84 = getelementptr inbounds { ptr, i64, i64 }, ptr %t83, i64 %t81 + store { ptr, i64, i64 } %t80, ptr %t84 + store i64 %t82, ptr %t59 + store { ptr, i64, i64 } zeroinitializer, ptr %a85 + store i64 0, ptr %a86 + br label %each.cond6429 +each.cond6429: + %t87 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t88 = load i64, ptr %t87 + %t89 = load i64, ptr %a86 + %t90 = icmp slt i64 %t89, %t88 + br i1 %t90, label %each.body6430, label %each.end6432 +each.body6430: + %t91 = load ptr, ptr %a14 + %t92 = getelementptr inbounds %S.gen.Leaf, ptr %t91, i64 %t89 + %t93 = load %S.gen.Leaf, ptr %t92 + store %S.gen.Leaf %t93, ptr %a94 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %a85, i32 0, i32 1 + %t96 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t96, ptr %a97 + call void @finch_str_copy(ptr %a98, ptr %a97) + %t99 = load { ptr, i64, i64 }, ptr %a98 + %t100 = load i64, ptr %t95 + %t101 = add i64 %t100, 1 + call void @finch_arr_reserve(ptr %a85, i64 %t101, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t102 = load ptr, ptr %a85 + %t103 = getelementptr inbounds { ptr, i64, i64 }, ptr %t102, i64 %t100 + store { ptr, i64, i64 } %t99, ptr %t103 + store i64 %t101, ptr %t95 + br label %each.step6431 +each.step6431: + %t104 = load i64, ptr %a86 + %t105 = add i64 %t104, 1 + store i64 %t105, ptr %a86 + br label %each.cond6429 +each.end6432: + %t106 = getelementptr inbounds { ptr, i64, i64 }, ptr %a85, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4179, i64 2, i64 0 }, ptr %a107 + call void @finch_str_join(ptr %a108, ptr %a85, ptr %a107) + %t109 = load { ptr, i64, i64 }, ptr %a108 + store { ptr, i64, i64 } { ptr @.str.4178, i64 2, i64 0 }, ptr %a111 + store { ptr, i64, i64 } %t109, ptr %a112 + call void @finch_str_concat(ptr %a110, ptr %a111, ptr %a112) + %t113 = load { ptr, i64, i64 }, ptr %a110 + store { ptr, i64, i64 } %t113, ptr %a115 + store { ptr, i64, i64 } { ptr @.str.4180, i64 2, i64 0 }, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + %t118 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 2 + store { ptr, i64, i64 } %t117, ptr %t118 + %t119 = load %S.gen.Abi, ptr %a10 + store %S.gen.Abi %t119, ptr %a120 + call void @finch.copy.S_gen_Abi(ptr %a121, ptr %a120) + %t122 = load %S.gen.Abi, ptr %a121 + ret %S.gen.Abi %t122 +endif6423: + %t123 = load i64, ptr %a4 + %t124 = icmp sgt i64 %t123, 16 + br i1 %t124, label %then6433, label %endif6435 +then6433: + %t125 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4181, i64 8, i64 0 }, ptr %t125 + %t126 = load %S.gen.Abi, ptr %a10 + store %S.gen.Abi %t126, ptr %a127 + call void @finch.copy.S_gen_Abi(ptr %a128, ptr %a127) + %t129 = load %S.gen.Abi, ptr %a128 + ret %S.gen.Abi %t129 +endif6435: + %t130 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4182, i64 6, i64 0 }, ptr %t130 + %t131 = load i64, ptr %a5 + %t132 = icmp sge i64 %t131, 16 + br i1 %t132, label %then6436, label %else6437 +then6436: + %t133 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 1 + %t134 = getelementptr inbounds { ptr, i64, i64 }, ptr %t133, i32 0, i32 1 + %t135 = load i64, ptr %t134 + %t136 = add i64 %t135, 1 + call void @finch_arr_reserve(ptr %t133, i64 %t136, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t137 = load ptr, ptr %t133 + %t138 = getelementptr inbounds { ptr, i64, i64 }, ptr %t137, i64 %t135 + store { ptr, i64, i64 } { ptr @.str.4183, i64 4, i64 0 }, ptr %t138 + store i64 %t136, ptr %t134 + %t139 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 2 + store { ptr, i64, i64 } { ptr @.str.4184, i64 4, i64 0 }, ptr %t139 + br label %endif6438 +else6437: + %t140 = load i64, ptr %a4 + %t141 = icmp sle i64 %t140, 8 + br i1 %t141, label %then6439, label %else6440 +then6439: + %t142 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 1 + %t143 = getelementptr inbounds { ptr, i64, i64 }, ptr %t142, i32 0, i32 1 + %t144 = load i64, ptr %t143 + %t145 = add i64 %t144, 1 + call void @finch_arr_reserve(ptr %t142, i64 %t145, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t146 = load ptr, ptr %t142 + %t147 = getelementptr inbounds { ptr, i64, i64 }, ptr %t146, i64 %t144 + store { ptr, i64, i64 } { ptr @.str.4185, i64 3, i64 0 }, ptr %t147 + store i64 %t145, ptr %t143 + %t148 = load i64, ptr %a4 + %t149 = mul i64 %t148, 8 + call void @finch_str_from_int(ptr %a150, i64 %t149) + %t151 = load { ptr, i64, i64 }, ptr %a150 + store { ptr, i64, i64 } { ptr @.str.4186, i64 1, i64 0 }, ptr %a153 + store { ptr, i64, i64 } %t151, ptr %a154 + call void @finch_str_concat(ptr %a152, ptr %a153, ptr %a154) + %t155 = load { ptr, i64, i64 }, ptr %a152 + %t156 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 2 + store { ptr, i64, i64 } %t155, ptr %t156 + br label %endif6441 +else6440: + %t157 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 1 + %t158 = getelementptr inbounds { ptr, i64, i64 }, ptr %t157, i32 0, i32 1 + %t159 = load i64, ptr %t158 + %t160 = add i64 %t159, 1 + call void @finch_arr_reserve(ptr %t157, i64 %t160, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t161 = load ptr, ptr %t157 + %t162 = getelementptr inbounds { ptr, i64, i64 }, ptr %t161, i64 %t159 + store { ptr, i64, i64 } { ptr @.str.4187, i64 9, i64 0 }, ptr %t162 + store i64 %t160, ptr %t158 + %t163 = getelementptr inbounds %S.gen.Abi, ptr %a10, i32 0, i32 2 + store { ptr, i64, i64 } { ptr @.str.4188, i64 9, i64 0 }, ptr %t163 + br label %endif6441 +endif6441: + br label %endif6438 +endif6438: + %t164 = load %S.gen.Abi, ptr %a10 + store %S.gen.Abi %t164, ptr %a165 + call void @finch.copy.S_gen_Abi(ptr %a166, ptr %a165) + %t167 = load %S.gen.Abi, ptr %a166 + ret %S.gen.Abi %t167 +} + +define internal %S.gen.Abi @finch.gen.classify(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.gen.Abi, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca %S.gen.Abi, align 16 + %a13 = alloca %S.gen.Abi, align 16 + %a30 = alloca %S.gen.StructDef, align 16 + %a31 = alloca %S.gen.StructDef, align 16 + %a33 = alloca %S.gen.StructDef, align 16 + %a36 = alloca i64, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca %S.gen.Abi, align 16 + %a101 = alloca %S.gen.Abi, align 16 + %a110 = alloca %S.gen.Abi, align 16 + %a111 = alloca %S.gen.Abi, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca i64, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca i64, align 16 + %a145 = alloca %S.gen.Leaf, align 16 + %a148 = alloca i64, align 16 + %a159 = alloca %S.gen.Abi, align 16 + %a160 = alloca %S.gen.Abi, align 16 + %a165 = alloca i64, align 16 + %a202 = alloca i64, align 16 + %a209 = alloca i64, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca %S.gen.Abi, align 16 + %a294 = alloca %S.gen.Abi, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = insertvalue %S.gen.Abi zeroinitializer, { ptr, i64, i64 } { ptr @.str.4189, i64 6, i64 0 }, 0 + store %S.gen.Abi %t3, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t6 = load { ptr, i64, i64 }, ptr %t5 + store { ptr, i64, i64 } %t6, ptr %a7 + store { ptr, i64, i64 } { ptr @.str.4190, i64 6, i64 0 }, ptr %a8 + %t9 = call i32 @finch_str_eq(ptr %a7, ptr %a8) + %t10 = icmp eq i32 %t9, 0 + br i1 %t10, label %then6442, label %endif6444 +then6442: + %t11 = load %S.gen.Abi, ptr %a4 + store %S.gen.Abi %t11, ptr %a12 + call void @finch.copy.S_gen_Abi(ptr %a13, ptr %a12) + %t14 = load %S.gen.Abi, ptr %a13 + ret %S.gen.Abi %t14 +endif6444: + %t15 = load ptr, ptr %a1 + %t16 = icmp eq ptr %t15, null + br i1 %t16, label %panic6445, label %ok6446 +panic6445: + call void @finch_panic(ptr @.str.4191, i64 3676, ptr @.str.4192) + unreachable +ok6446: + %t17 = getelementptr inbounds %S.gen.Gen, ptr %t15, i32 0, i32 15 + %t18 = load ptr, ptr %a1 + %t19 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 3 + %t20 = load { ptr, i64, i64 }, ptr %t19 + %t21 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 2 + %t22 = load { ptr, i64, i64 }, ptr %t21 + %t23 = call i64 @finch.gen.findStruct(ptr %t18, { ptr, i64, i64 } %t20, { ptr, i64, i64 } %t22) + %t24 = load { ptr, i64, i64 }, ptr %t17 + %t25 = extractvalue { ptr, i64, i64 } %t24, 1 + %t26 = icmp uge i64 %t23, %t25 + br i1 %t26, label %range6447, label %inrange6448 +range6447: + call void @finch_panic_index(ptr @.str.4193, i64 3676, i64 %t23, i64 %t25) + unreachable +inrange6448: + %t27 = extractvalue { ptr, i64, i64 } %t24, 0 + %t28 = getelementptr inbounds %S.gen.StructDef, ptr %t27, i64 %t23 + %t29 = load %S.gen.StructDef, ptr %t28 + store %S.gen.StructDef %t29, ptr %a30 + call void @finch.copy.S_gen_StructDef(ptr %a31, ptr %a30) + %t32 = load %S.gen.StructDef, ptr %a31 + store %S.gen.StructDef %t32, ptr %a33 + %t34 = getelementptr inbounds %S.gen.StructDef, ptr %a33, i32 0, i32 9 + %t35 = load i64, ptr %t34 + store i64 %t35, ptr %a36 + %t37 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 3 + store i64 8, ptr %t37 + %t38 = getelementptr inbounds %S.gen.StructDef, ptr %a33, i32 0, i32 10 + %t39 = load i64, ptr %t38 + %t40 = icmp sgt i64 %t39, 8 + br i1 %t40, label %then6449, label %endif6451 +then6449: + %t41 = getelementptr inbounds %S.gen.StructDef, ptr %a33, i32 0, i32 10 + %t42 = load i64, ptr %t41 + %t43 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 3 + store i64 %t42, ptr %t43 + br label %endif6451 +endif6451: + %t44 = load ptr, ptr %a1 + %t45 = icmp eq ptr %t44, null + br i1 %t45, label %panic6452, label %ok6453 +panic6452: + call void @finch_panic(ptr @.str.4194, i64 3682, ptr @.str.4195) + unreachable +ok6453: + %t46 = getelementptr inbounds %S.gen.Gen, ptr %t44, i32 0, i32 27 + %t47 = getelementptr inbounds %S.platform.Target, ptr %t46, i32 0, i32 4 + %t48 = load i1, ptr %t47 + br i1 %t48, label %then6454, label %endif6456 +then6454: + %t49 = load ptr, ptr %a1 + %t50 = load %S.ast.Type, ptr %a2 + %t51 = load %S.gen.Abi, ptr %a4 + %t52 = load i64, ptr %a36 + %t53 = getelementptr inbounds %S.gen.StructDef, ptr %a33, i32 0, i32 10 + %t54 = load i64, ptr %t53 + %t55 = call %S.gen.Abi @finch.gen.classifyArm64(ptr %t49, %S.ast.Type %t50, %S.gen.Abi %t51, i64 %t52, i64 %t54) + ret %S.gen.Abi %t55 +endif6456: + %t56 = load ptr, ptr %a1 + %t57 = icmp eq ptr %t56, null + br i1 %t57, label %panic6457, label %ok6458 +panic6457: + call void @finch_panic(ptr @.str.4196, i64 3685, ptr @.str.4197) + unreachable +ok6458: + %t58 = getelementptr inbounds %S.gen.Gen, ptr %t56, i32 0, i32 27 + %t59 = getelementptr inbounds %S.platform.Target, ptr %t58, i32 0, i32 1 + %t60 = load i1, ptr %t59 + br i1 %t60, label %then6459, label %endif6461 +then6459: + %t61 = load i64, ptr %a36 + %t62 = icmp eq i64 %t61, 1 + br label %logic.from6462 +logic.from6462: + br i1 %t62, label %logic.end6464, label %logic.rhs6463 +logic.rhs6463: + %t63 = load i64, ptr %a36 + %t64 = icmp eq i64 %t63, 2 + br label %logic.rend6465 +logic.rend6465: + br label %logic.end6464 +logic.end6464: + %t65 = phi i1 [ true, %logic.from6462 ], [ %t64, %logic.rend6465 ] + br label %logic.from6466 +logic.from6466: + br i1 %t65, label %logic.end6468, label %logic.rhs6467 +logic.rhs6467: + %t66 = load i64, ptr %a36 + %t67 = icmp eq i64 %t66, 4 + br label %logic.rend6469 +logic.rend6469: + br label %logic.end6468 +logic.end6468: + %t68 = phi i1 [ true, %logic.from6466 ], [ %t67, %logic.rend6469 ] + br label %logic.from6470 +logic.from6470: + br i1 %t68, label %logic.end6472, label %logic.rhs6471 +logic.rhs6471: + %t69 = load i64, ptr %a36 + %t70 = icmp eq i64 %t69, 8 + br label %logic.rend6473 +logic.rend6473: + br label %logic.end6472 +logic.end6472: + %t71 = phi i1 [ true, %logic.from6470 ], [ %t70, %logic.rend6473 ] + br i1 %t71, label %then6474, label %else6475 +then6474: + %t72 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4198, i64 6, i64 0 }, ptr %t72 + %t73 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t74 = getelementptr inbounds { ptr, i64, i64 }, ptr %t73, i32 0, i32 1 + %t75 = load i64, ptr %a36 + %t76 = mul i64 %t75, 8 + call void @finch_str_from_int(ptr %a77, i64 %t76) + %t78 = load { ptr, i64, i64 }, ptr %a77 + store { ptr, i64, i64 } { ptr @.str.4199, i64 1, i64 0 }, ptr %a80 + store { ptr, i64, i64 } %t78, ptr %a81 + call void @finch_str_concat(ptr %a79, ptr %a80, ptr %a81) + %t82 = load { ptr, i64, i64 }, ptr %a79 + %t83 = load i64, ptr %t74 + %t84 = add i64 %t83, 1 + call void @finch_arr_reserve(ptr %t73, i64 %t84, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t85 = load ptr, ptr %t73 + %t86 = getelementptr inbounds { ptr, i64, i64 }, ptr %t85, i64 %t83 + store { ptr, i64, i64 } %t82, ptr %t86 + store i64 %t84, ptr %t74 + %t87 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t88 = load { ptr, i64, i64 }, ptr %t87 + %t89 = extractvalue { ptr, i64, i64 } %t88, 1 + %t90 = icmp uge i64 0, %t89 + br i1 %t90, label %range6477, label %inrange6478 +range6477: + call void @finch_panic_index(ptr @.str.4200, i64 3691, i64 0, i64 %t89) + unreachable +inrange6478: + %t91 = extractvalue { ptr, i64, i64 } %t88, 0 + %t92 = getelementptr inbounds { ptr, i64, i64 }, ptr %t91, i64 0 + %t93 = load { ptr, i64, i64 }, ptr %t92 + %t94 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } %t93, ptr %a95 + call void @finch_str_copy(ptr %a96, ptr %a95) + %t97 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t97, ptr %t94 + br label %endif6476 +else6475: + %t98 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4201, i64 8, i64 0 }, ptr %t98 + br label %endif6476 +endif6476: + %t99 = load %S.gen.Abi, ptr %a4 + store %S.gen.Abi %t99, ptr %a100 + call void @finch.copy.S_gen_Abi(ptr %a101, ptr %a100) + %t102 = load %S.gen.Abi, ptr %a101 + ret %S.gen.Abi %t102 +endif6461: + %t103 = load i64, ptr %a36 + %t104 = icmp sgt i64 %t103, 16 + br label %logic.from6479 +logic.from6479: + br i1 %t104, label %logic.end6481, label %logic.rhs6480 +logic.rhs6480: + %t105 = load i64, ptr %a36 + %t106 = icmp eq i64 %t105, 0 + br label %logic.rend6482 +logic.rend6482: + br label %logic.end6481 +logic.end6481: + %t107 = phi i1 [ true, %logic.from6479 ], [ %t106, %logic.rend6482 ] + br i1 %t107, label %then6483, label %endif6485 +then6483: + %t108 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4202, i64 6, i64 0 }, ptr %t108 + %t109 = load %S.gen.Abi, ptr %a4 + store %S.gen.Abi %t109, ptr %a110 + call void @finch.copy.S_gen_Abi(ptr %a111, ptr %a110) + %t112 = load %S.gen.Abi, ptr %a111 + ret %S.gen.Abi %t112 +endif6485: + %t113 = load ptr, ptr %a1 + %t114 = load %S.ast.Type, ptr %a2 + %t115 = call { ptr, i64, i64 } @finch.gen.leavesOf(ptr %t113, %S.ast.Type %t114, i64 0) + store { ptr, i64, i64 } %t115, ptr %a116 + %t117 = load i64, ptr %a36 + %t118 = add i64 %t117, 7 + %t119 = sdiv i64 %t118, 8 + store i64 %t119, ptr %a120 + %t121 = mul i64 2, ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64) + %t122 = call ptr @finch_alloc(i64 %t121) + %t123 = getelementptr inbounds i64, ptr %t122, i64 0 + store i64 0, ptr %t123 + %t124 = getelementptr inbounds i64, ptr %t122, i64 1 + store i64 0, ptr %t124 + %t125 = insertvalue { ptr, i64, i64 } undef, ptr %t122, 0 + %t126 = insertvalue { ptr, i64, i64 } %t125, i64 2, 1 + %t127 = insertvalue { ptr, i64, i64 } %t126, i64 2, 2 + store { ptr, i64, i64 } %t127, ptr %a128 + %t129 = mul i64 2, ptrtoint (ptr getelementptr (i1, ptr null, i32 1) to i64) + %t130 = call ptr @finch_alloc(i64 %t129) + %t131 = getelementptr inbounds i1, ptr %t130, i64 0 + store i1 false, ptr %t131 + %t132 = getelementptr inbounds i1, ptr %t130, i64 1 + store i1 false, ptr %t132 + %t133 = insertvalue { ptr, i64, i64 } undef, ptr %t130, 0 + %t134 = insertvalue { ptr, i64, i64 } %t133, i64 2, 1 + %t135 = insertvalue { ptr, i64, i64 } %t134, i64 2, 2 + store { ptr, i64, i64 } %t135, ptr %a136 + store i64 0, ptr %a137 + br label %each.cond6486 +each.cond6486: + %t138 = getelementptr inbounds { ptr, i64, i64 }, ptr %a116, i32 0, i32 1 + %t139 = load i64, ptr %t138 + %t140 = load i64, ptr %a137 + %t141 = icmp slt i64 %t140, %t139 + br i1 %t141, label %each.body6487, label %each.end6489 +each.body6487: + %t142 = load ptr, ptr %a116 + %t143 = getelementptr inbounds %S.gen.Leaf, ptr %t142, i64 %t140 + %t144 = load %S.gen.Leaf, ptr %t143 + store %S.gen.Leaf %t144, ptr %a145 + %t146 = getelementptr inbounds %S.gen.Leaf, ptr %a145, i32 0, i32 1 + %t147 = load i64, ptr %t146 + store i64 %t147, ptr %a148 + %t149 = load i64, ptr %a148 + %t150 = icmp sgt i64 %t149, 8 + br i1 %t150, label %then6490, label %endif6492 +then6490: + store i64 8, ptr %a148 + br label %endif6492 +endif6492: + %t151 = getelementptr inbounds %S.gen.Leaf, ptr %a145, i32 0, i32 0 + %t152 = load i64, ptr %t151 + %t153 = load i64, ptr %a148 + %t154 = icmp eq i64 %t153, 0 + br i1 %t154, label %panic6493, label %ok6494 +panic6493: + call void @finch_panic(ptr @.str.4203, i64 3710, ptr @.str.4204) + unreachable +ok6494: + %t155 = srem i64 %t152, %t153 + %t156 = icmp ne i64 %t155, 0 + br i1 %t156, label %then6495, label %endif6497 +then6495: + %t157 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4205, i64 6, i64 0 }, ptr %t157 + %t158 = load %S.gen.Abi, ptr %a4 + store %S.gen.Abi %t158, ptr %a159 + call void @finch.copy.S_gen_Abi(ptr %a160, ptr %a159) + %t161 = load %S.gen.Abi, ptr %a160 + ret %S.gen.Abi %t161 +endif6497: + %t162 = getelementptr inbounds %S.gen.Leaf, ptr %a145, i32 0, i32 0 + %t163 = load i64, ptr %t162 + %t164 = sdiv i64 %t163, 8 + store i64 %t164, ptr %a165 + %t166 = load i64, ptr %a165 + %t167 = load { ptr, i64, i64 }, ptr %a128 + %t168 = extractvalue { ptr, i64, i64 } %t167, 1 + %t169 = icmp uge i64 %t166, %t168 + br i1 %t169, label %range6498, label %inrange6499 +range6498: + call void @finch_panic_index(ptr @.str.4206, i64 3715, i64 %t166, i64 %t168) + unreachable +inrange6499: + %t170 = extractvalue { ptr, i64, i64 } %t167, 0 + %t171 = getelementptr inbounds i64, ptr %t170, i64 %t166 + %t172 = load i64, ptr %t171 + %t173 = icmp eq i64 %t172, 1 + br label %logic.from6500 +logic.from6500: + br i1 %t173, label %logic.end6502, label %logic.rhs6501 +logic.rhs6501: + %t174 = getelementptr inbounds %S.gen.Leaf, ptr %a145, i32 0, i32 2 + %t175 = load i1, ptr %t174 + %t176 = xor i1 %t175, true + br label %logic.rend6503 +logic.rend6503: + br label %logic.end6502 +logic.end6502: + %t177 = phi i1 [ true, %logic.from6500 ], [ %t176, %logic.rend6503 ] + br i1 %t177, label %then6504, label %else6505 +then6504: + %t178 = load i64, ptr %a165 + %t179 = load { ptr, i64, i64 }, ptr %a128 + %t180 = extractvalue { ptr, i64, i64 } %t179, 1 + %t181 = icmp uge i64 %t178, %t180 + br i1 %t181, label %range6507, label %inrange6508 +range6507: + call void @finch_panic_index(ptr @.str.4207, i64 3716, i64 %t178, i64 %t180) + unreachable +inrange6508: + %t182 = extractvalue { ptr, i64, i64 } %t179, 0 + %t183 = getelementptr inbounds i64, ptr %t182, i64 %t178 + store i64 1, ptr %t183 + br label %endif6506 +else6505: + %t184 = load i64, ptr %a165 + %t185 = load { ptr, i64, i64 }, ptr %a128 + %t186 = extractvalue { ptr, i64, i64 } %t185, 1 + %t187 = icmp uge i64 %t184, %t186 + br i1 %t187, label %range6509, label %inrange6510 +range6509: + call void @finch_panic_index(ptr @.str.4208, i64 3718, i64 %t184, i64 %t186) + unreachable +inrange6510: + %t188 = extractvalue { ptr, i64, i64 } %t185, 0 + %t189 = getelementptr inbounds i64, ptr %t188, i64 %t184 + store i64 2, ptr %t189 + br label %endif6506 +endif6506: + %t190 = getelementptr inbounds %S.gen.Leaf, ptr %a145, i32 0, i32 3 + %t191 = load i1, ptr %t190 + br i1 %t191, label %then6511, label %endif6513 +then6511: + %t192 = load i64, ptr %a165 + %t193 = load { ptr, i64, i64 }, ptr %a136 + %t194 = extractvalue { ptr, i64, i64 } %t193, 1 + %t195 = icmp uge i64 %t192, %t194 + br i1 %t195, label %range6514, label %inrange6515 +range6514: + call void @finch_panic_index(ptr @.str.4209, i64 3721, i64 %t192, i64 %t194) + unreachable +inrange6515: + %t196 = extractvalue { ptr, i64, i64 } %t193, 0 + %t197 = getelementptr inbounds i1, ptr %t196, i64 %t192 + store i1 true, ptr %t197 + br label %endif6513 +endif6513: + br label %each.step6488 +each.step6488: + %t198 = load i64, ptr %a137 + %t199 = add i64 %t198, 1 + store i64 %t199, ptr %a137 + br label %each.cond6486 +each.end6489: + %t200 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4210, i64 6, i64 0 }, ptr %t200 + %t201 = load i64, ptr %a120 + store i64 0, ptr %a202 + br label %for.cond6516 +for.cond6516: + %t203 = load i64, ptr %a202 + %t204 = icmp slt i64 %t203, %t201 + br i1 %t204, label %for.body6517, label %for.end6519 +for.body6517: + %t205 = load i64, ptr %a36 + %t206 = load i64, ptr %a202 + %t207 = mul i64 8, %t206 + %t208 = sub i64 %t205, %t207 + store i64 %t208, ptr %a209 + %t210 = load i64, ptr %a209 + %t211 = icmp sgt i64 %t210, 8 + br i1 %t211, label %then6520, label %endif6522 +then6520: + store i64 8, ptr %a209 + br label %endif6522 +endif6522: + %t212 = load i64, ptr %a202 + %t213 = load { ptr, i64, i64 }, ptr %a128 + %t214 = extractvalue { ptr, i64, i64 } %t213, 1 + %t215 = icmp uge i64 %t212, %t214 + br i1 %t215, label %range6523, label %inrange6524 +range6523: + call void @finch_panic_index(ptr @.str.4211, i64 3730, i64 %t212, i64 %t214) + unreachable +inrange6524: + %t216 = extractvalue { ptr, i64, i64 } %t213, 0 + %t217 = getelementptr inbounds i64, ptr %t216, i64 %t212 + %t218 = load i64, ptr %t217 + %t219 = icmp eq i64 %t218, 2 + br i1 %t219, label %then6525, label %else6526 +then6525: + %t220 = load i64, ptr %a202 + %t221 = load { ptr, i64, i64 }, ptr %a136 + %t222 = extractvalue { ptr, i64, i64 } %t221, 1 + %t223 = icmp uge i64 %t220, %t222 + br i1 %t223, label %range6528, label %inrange6529 +range6528: + call void @finch_panic_index(ptr @.str.4212, i64 3731, i64 %t220, i64 %t222) + unreachable +inrange6529: + %t224 = extractvalue { ptr, i64, i64 } %t221, 0 + %t225 = getelementptr inbounds i1, ptr %t224, i64 %t220 + %t226 = load i1, ptr %t225 + br i1 %t226, label %then6530, label %else6531 +then6530: + %t227 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t228 = getelementptr inbounds { ptr, i64, i64 }, ptr %t227, i32 0, i32 1 + %t229 = load i64, ptr %t228 + %t230 = add i64 %t229, 1 + call void @finch_arr_reserve(ptr %t227, i64 %t230, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t231 = load ptr, ptr %t227 + %t232 = getelementptr inbounds { ptr, i64, i64 }, ptr %t231, i64 %t229 + store { ptr, i64, i64 } { ptr @.str.4213, i64 6, i64 0 }, ptr %t232 + store i64 %t230, ptr %t228 + br label %endif6532 +else6531: + %t233 = load i64, ptr %a209 + %t234 = icmp sgt i64 %t233, 4 + br i1 %t234, label %then6533, label %else6534 +then6533: + %t235 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t236 = getelementptr inbounds { ptr, i64, i64 }, ptr %t235, i32 0, i32 1 + %t237 = load i64, ptr %t236 + %t238 = add i64 %t237, 1 + call void @finch_arr_reserve(ptr %t235, i64 %t238, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t239 = load ptr, ptr %t235 + %t240 = getelementptr inbounds { ptr, i64, i64 }, ptr %t239, i64 %t237 + store { ptr, i64, i64 } { ptr @.str.4214, i64 11, i64 0 }, ptr %t240 + store i64 %t238, ptr %t236 + br label %endif6535 +else6534: + %t241 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t242 = getelementptr inbounds { ptr, i64, i64 }, ptr %t241, i32 0, i32 1 + %t243 = load i64, ptr %t242 + %t244 = add i64 %t243, 1 + call void @finch_arr_reserve(ptr %t241, i64 %t244, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t245 = load ptr, ptr %t241 + %t246 = getelementptr inbounds { ptr, i64, i64 }, ptr %t245, i64 %t243 + store { ptr, i64, i64 } { ptr @.str.4215, i64 5, i64 0 }, ptr %t246 + store i64 %t244, ptr %t242 + br label %endif6535 +endif6535: + br label %endif6532 +endif6532: + br label %endif6527 +else6526: + %t247 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t248 = getelementptr inbounds { ptr, i64, i64 }, ptr %t247, i32 0, i32 1 + %t249 = load i64, ptr %a209 + %t250 = mul i64 %t249, 8 + call void @finch_str_from_int(ptr %a251, i64 %t250) + %t252 = load { ptr, i64, i64 }, ptr %a251 + store { ptr, i64, i64 } { ptr @.str.4216, i64 1, i64 0 }, ptr %a254 + store { ptr, i64, i64 } %t252, ptr %a255 + call void @finch_str_concat(ptr %a253, ptr %a254, ptr %a255) + %t256 = load { ptr, i64, i64 }, ptr %a253 + %t257 = load i64, ptr %t248 + %t258 = add i64 %t257, 1 + call void @finch_arr_reserve(ptr %t247, i64 %t258, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t259 = load ptr, ptr %t247 + %t260 = getelementptr inbounds { ptr, i64, i64 }, ptr %t259, i64 %t257 + store { ptr, i64, i64 } %t256, ptr %t260 + store i64 %t258, ptr %t248 + br label %endif6527 +endif6527: + br label %for.step6518 +for.step6518: + %t261 = load i64, ptr %a202 + %t262 = add i64 %t261, 1 + store i64 %t262, ptr %a202 + br label %for.cond6516 +for.end6519: + %t263 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t264 = getelementptr inbounds { ptr, i64, i64 }, ptr %t263, i32 0, i32 1 + %t265 = load i64, ptr %t264 + %t266 = icmp eq i64 %t265, 1 + br i1 %t266, label %then6536, label %else6537 +then6536: + %t267 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t268 = load { ptr, i64, i64 }, ptr %t267 + %t269 = extractvalue { ptr, i64, i64 } %t268, 1 + %t270 = icmp uge i64 0, %t269 + br i1 %t270, label %range6539, label %inrange6540 +range6539: + call void @finch_panic_index(ptr @.str.4217, i64 3743, i64 0, i64 %t269) + unreachable +inrange6540: + %t271 = extractvalue { ptr, i64, i64 } %t268, 0 + %t272 = getelementptr inbounds { ptr, i64, i64 }, ptr %t271, i64 0 + %t273 = load { ptr, i64, i64 }, ptr %t272 + %t274 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } %t273, ptr %a275 + call void @finch_str_copy(ptr %a276, ptr %a275) + %t277 = load { ptr, i64, i64 }, ptr %a276 + store { ptr, i64, i64 } %t277, ptr %t274 + br label %endif6538 +else6537: + %t278 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 1 + %t279 = getelementptr inbounds { ptr, i64, i64 }, ptr %t278, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4219, i64 2, i64 0 }, ptr %a280 + call void @finch_str_join(ptr %a281, ptr %t278, ptr %a280) + %t282 = load { ptr, i64, i64 }, ptr %a281 + store { ptr, i64, i64 } { ptr @.str.4218, i64 2, i64 0 }, ptr %a284 + store { ptr, i64, i64 } %t282, ptr %a285 + call void @finch_str_concat(ptr %a283, ptr %a284, ptr %a285) + %t286 = load { ptr, i64, i64 }, ptr %a283 + store { ptr, i64, i64 } %t286, ptr %a288 + store { ptr, i64, i64 } { ptr @.str.4220, i64 2, i64 0 }, ptr %a289 + call void @finch_str_concat(ptr %a287, ptr %a288, ptr %a289) + %t290 = load { ptr, i64, i64 }, ptr %a287 + %t291 = getelementptr inbounds %S.gen.Abi, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } %t290, ptr %t291 + br label %endif6538 +endif6538: + %t292 = load %S.gen.Abi, ptr %a4 + store %S.gen.Abi %t292, ptr %a293 + call void @finch.copy.S_gen_Abi(ptr %a294, ptr %a293) + %t295 = load %S.gen.Abi, ptr %a294 + ret %S.gen.Abi %t295 +} + +define internal void @finch.copy.arr_S_gen_Abi(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.gen.Abi, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond6592 +n.cond6592: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body6593, label %n.end6594 +n.body6593: + %t8 = getelementptr inbounds %S.gen.Abi, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.gen.Abi, ptr %t2, i64 %t6 + call void @finch.copy.S_gen_Abi(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond6592 +n.end6594: + ret void +} + +define internal void @finch.copy.S_gen_Plan(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.gen.Plan, ptr %src + store %S.gen.Plan %t1, ptr %dst + %t2 = getelementptr inbounds %S.gen.Plan, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.gen.Plan, ptr %src, i32 0, i32 0 + call void @finch.copy.S_gen_Abi(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.gen.Plan, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.gen.Plan, ptr %src, i32 0, i32 1 + call void @finch.copy.arr_S_gen_Abi(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.gen.Plan, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.gen.Plan, ptr %src, i32 0, i32 2 + call void @finch_str_copy(ptr %t6, ptr %t7) + ret void +} + +define internal %S.gen.Plan @finch.gen.makePlan(ptr %p0, %S.ast.Type %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.gen.Plan, align 16 + %a5 = alloca i64, align 16 + %a6 = alloca i64, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca i64, align 16 + %a64 = alloca %S.ast.Type, align 16 + %a68 = alloca %S.gen.Abi, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca i64, align 16 + %a76 = alloca i64, align 16 + %a78 = alloca i64, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca %S.gen.Abi, align 16 + %a141 = alloca %S.gen.Abi, align 16 + %a150 = alloca %S.gen.Plan, align 16 + %a151 = alloca %S.gen.Plan, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.gen.Plan zeroinitializer, ptr %a4 + store i64 6, ptr %a5 + store i64 8, ptr %a6 + %t7 = load ptr, ptr %a1 + %t8 = load %S.ast.Type, ptr %a2 + %t9 = call %S.gen.Abi @finch.gen.classify(ptr %t7, %S.ast.Type %t8) + %t10 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 0 + store %S.gen.Abi %t9, ptr %t10 + %t11 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } { ptr @.str.4221, i64 4, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t13 = load { ptr, i64, i64 }, ptr %t12 + store { ptr, i64, i64 } %t13, ptr %a14 + store { ptr, i64, i64 } { ptr @.str.4222, i64 4, i64 0 }, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp eq i32 %t16, 0 + br i1 %t17, label %then6541, label %endif6543 +then6541: + %t18 = load ptr, ptr %a1 + %t19 = load %S.ast.Type, ptr %a2 + %t20 = call { ptr, i64, i64 } @finch.gen.cLL(ptr %t18, %S.ast.Type %t19) + %t21 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } %t20, ptr %t21 + br label %endif6543 +endif6543: + %t22 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 0 + %t23 = getelementptr inbounds %S.gen.Abi, ptr %t22, i32 0, i32 0 + %t24 = load { ptr, i64, i64 }, ptr %t23 + store { ptr, i64, i64 } %t24, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.4223, i64 8, i64 0 }, ptr %a26 + %t27 = call i32 @finch_str_eq(ptr %a25, ptr %a26) + %t28 = icmp ne i32 %t27, 0 + br i1 %t28, label %then6544, label %endif6546 +then6544: + %t29 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 0 + %t30 = getelementptr inbounds %S.gen.Abi, ptr %t29, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4224, i64 6, i64 0 }, ptr %t30 + br label %endif6546 +endif6546: + %t31 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 0 + %t32 = getelementptr inbounds %S.gen.Abi, ptr %t31, i32 0, i32 0 + %t33 = load { ptr, i64, i64 }, ptr %t32 + store { ptr, i64, i64 } %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.4225, i64 6, i64 0 }, ptr %a35 + %t36 = call i32 @finch_str_eq(ptr %a34, ptr %a35) + %t37 = icmp ne i32 %t36, 0 + br i1 %t37, label %then6547, label %else6548 +then6547: + %t38 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 3 + store i1 true, ptr %t38 + %t39 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } { ptr @.str.4226, i64 4, i64 0 }, ptr %t39 + %t40 = load i64, ptr %a5 + %t41 = sub i64 %t40, 1 + store i64 %t41, ptr %a5 + br label %endif6549 +else6548: + %t42 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 0 + %t43 = getelementptr inbounds %S.gen.Abi, ptr %t42, i32 0, i32 0 + %t44 = load { ptr, i64, i64 }, ptr %t43 + store { ptr, i64, i64 } %t44, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.4227, i64 6, i64 0 }, ptr %a46 + %t47 = call i32 @finch_str_eq(ptr %a45, ptr %a46) + %t48 = icmp ne i32 %t47, 0 + br i1 %t48, label %then6550, label %endif6552 +then6550: + %t49 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 0 + %t50 = getelementptr inbounds %S.gen.Abi, ptr %t49, i32 0, i32 2 + %t51 = load { ptr, i64, i64 }, ptr %t50 + %t52 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 2 + store { ptr, i64, i64 } %t51, ptr %a53 + call void @finch_str_copy(ptr %a54, ptr %a53) + %t55 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t55, ptr %t52 + br label %endif6552 +endif6552: + br label %endif6549 +endif6549: + store i64 0, ptr %a56 + br label %each.cond6553 +each.cond6553: + %t57 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t58 = load i64, ptr %t57 + %t59 = load i64, ptr %a56 + %t60 = icmp slt i64 %t59, %t58 + br i1 %t60, label %each.body6554, label %each.end6556 +each.body6554: + %t61 = load ptr, ptr %a3 + %t62 = getelementptr inbounds %S.ast.Type, ptr %t61, i64 %t59 + %t63 = load %S.ast.Type, ptr %t62 + store %S.ast.Type %t63, ptr %a64 + %t65 = load ptr, ptr %a1 + %t66 = load %S.ast.Type, ptr %a64 + %t67 = call %S.gen.Abi @finch.gen.classify(ptr %t65, %S.ast.Type %t66) + store %S.gen.Abi %t67, ptr %a68 + %t69 = getelementptr inbounds %S.gen.Abi, ptr %a68, i32 0, i32 0 + %t70 = load { ptr, i64, i64 }, ptr %t69 + store { ptr, i64, i64 } %t70, ptr %a71 + store { ptr, i64, i64 } { ptr @.str.4228, i64 6, i64 0 }, ptr %a72 + %t73 = call i32 @finch_str_eq(ptr %a71, ptr %a72) + %t74 = icmp ne i32 %t73, 0 + br i1 %t74, label %then6557, label %else6558 +then6557: + store i64 0, ptr %a75 + store i64 0, ptr %a76 + %t77 = getelementptr inbounds %S.gen.Abi, ptr %a68, i32 0, i32 1 + store i64 0, ptr %a78 + br label %each.cond6560 +each.cond6560: + %t79 = getelementptr inbounds { ptr, i64, i64 }, ptr %t77, i32 0, i32 1 + %t80 = load i64, ptr %t79 + %t81 = load i64, ptr %a78 + %t82 = icmp slt i64 %t81, %t80 + br i1 %t82, label %each.body6561, label %each.end6563 +each.body6561: + %t83 = load ptr, ptr %t77 + %t84 = getelementptr inbounds { ptr, i64, i64 }, ptr %t83, i64 %t81 + %t85 = load { ptr, i64, i64 }, ptr %t84 + store { ptr, i64, i64 } %t85, ptr %a86 + %t87 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t87, ptr %a88 + store { ptr, i64, i64 } { ptr @.str.4230, i64 1, i64 0 }, ptr %a90 + %t91 = call i32 @finch_str_starts(ptr %a88, ptr %a90) + %t92 = icmp ne i32 %t91, 0 + br i1 %t92, label %then6564, label %else6565 +then6564: + %t93 = load i64, ptr %a75 + %t94 = add i64 %t93, 1 + store i64 %t94, ptr %a75 + br label %endif6566 +else6565: + %t95 = load i64, ptr %a76 + %t96 = add i64 %t95, 1 + store i64 %t96, ptr %a76 + br label %endif6566 +endif6566: + br label %each.step6562 +each.step6562: + %t97 = load i64, ptr %a78 + %t98 = add i64 %t97, 1 + store i64 %t98, ptr %a78 + br label %each.cond6560 +each.end6563: + %t99 = load ptr, ptr %a1 + %t100 = icmp eq ptr %t99, null + br i1 %t100, label %panic6567, label %ok6568 +panic6567: + call void @finch_panic(ptr @.str.4231, i64 3783, ptr @.str.4232) + unreachable +ok6568: + %t101 = getelementptr inbounds %S.gen.Gen, ptr %t99, i32 0, i32 27 + %t102 = getelementptr inbounds %S.platform.Target, ptr %t101, i32 0, i32 1 + %t103 = load i1, ptr %t102 + br label %logic.from6569 +logic.from6569: + br i1 %t103, label %logic.end6571, label %logic.rhs6570 +logic.rhs6570: + %t104 = load ptr, ptr %a1 + %t105 = icmp eq ptr %t104, null + br i1 %t105, label %panic6572, label %ok6573 +panic6572: + call void @finch_panic(ptr @.str.4233, i64 3783, ptr @.str.4234) + unreachable +ok6573: + %t106 = getelementptr inbounds %S.gen.Gen, ptr %t104, i32 0, i32 27 + %t107 = getelementptr inbounds %S.platform.Target, ptr %t106, i32 0, i32 4 + %t108 = load i1, ptr %t107 + br label %logic.rend6574 +logic.rend6574: + br label %logic.end6571 +logic.end6571: + %t109 = phi i1 [ true, %logic.from6569 ], [ %t108, %logic.rend6574 ] + br label %logic.from6575 +logic.from6575: + br i1 %t109, label %logic.end6577, label %logic.rhs6576 +logic.rhs6576: + %t110 = load i64, ptr %a75 + %t111 = load i64, ptr %a5 + %t112 = icmp sle i64 %t110, %t111 + br label %logic.from6578 +logic.from6578: + br i1 %t112, label %logic.rhs6579, label %logic.end6580 +logic.rhs6579: + %t113 = load i64, ptr %a76 + %t114 = load i64, ptr %a6 + %t115 = icmp sle i64 %t113, %t114 + br label %logic.rend6581 +logic.rend6581: + br label %logic.end6580 +logic.end6580: + %t116 = phi i1 [ false, %logic.from6578 ], [ %t115, %logic.rend6581 ] + br label %logic.rend6582 +logic.rend6582: + br label %logic.end6577 +logic.end6577: + %t117 = phi i1 [ true, %logic.from6575 ], [ %t116, %logic.rend6582 ] + br i1 %t117, label %then6583, label %else6584 +then6583: + %t118 = load i64, ptr %a75 + %t119 = load i64, ptr %a5 + %t120 = sub i64 %t119, %t118 + store i64 %t120, ptr %a5 + %t121 = load i64, ptr %a76 + %t122 = load i64, ptr %a6 + %t123 = sub i64 %t122, %t121 + store i64 %t123, ptr %a6 + br label %endif6585 +else6584: + %t124 = getelementptr inbounds %S.gen.Abi, ptr %a68, i32 0, i32 0 + store { ptr, i64, i64 } { ptr @.str.4235, i64 6, i64 0 }, ptr %t124 + br label %endif6585 +endif6585: + br label %endif6559 +else6558: + %t125 = getelementptr inbounds %S.gen.Abi, ptr %a68, i32 0, i32 0 + %t126 = load { ptr, i64, i64 }, ptr %t125 + store { ptr, i64, i64 } %t126, ptr %a127 + store { ptr, i64, i64 } { ptr @.str.4236, i64 6, i64 0 }, ptr %a128 + %t129 = call i32 @finch_str_eq(ptr %a127, ptr %a128) + %t130 = icmp ne i32 %t129, 0 + br i1 %t130, label %then6586, label %endif6588 +then6586: + %t131 = load %S.ast.Type, ptr %a64 + %t132 = call i1 @finch.gen.isFloat(%S.ast.Type %t131) + br i1 %t132, label %then6589, label %else6590 +then6589: + %t133 = load i64, ptr %a6 + %t134 = sub i64 %t133, 1 + store i64 %t134, ptr %a6 + br label %endif6591 +else6590: + %t135 = load i64, ptr %a5 + %t136 = sub i64 %t135, 1 + store i64 %t136, ptr %a5 + br label %endif6591 +endif6591: + br label %endif6588 +endif6588: + br label %endif6559 +endif6559: + %t137 = getelementptr inbounds %S.gen.Plan, ptr %a4, i32 0, i32 1 + %t138 = getelementptr inbounds { ptr, i64, i64 }, ptr %t137, i32 0, i32 1 + %t139 = load %S.gen.Abi, ptr %a68 + store %S.gen.Abi %t139, ptr %a140 + call void @finch.copy.S_gen_Abi(ptr %a141, ptr %a140) + %t142 = load %S.gen.Abi, ptr %a141 + %t143 = load i64, ptr %t138 + %t144 = add i64 %t143, 1 + call void @finch_arr_reserve(ptr %t137, i64 %t144, i64 ptrtoint (ptr getelementptr (%S.gen.Abi, ptr null, i32 1) to i64)) + %t145 = load ptr, ptr %t137 + %t146 = getelementptr inbounds %S.gen.Abi, ptr %t145, i64 %t143 + store %S.gen.Abi %t142, ptr %t146 + store i64 %t144, ptr %t138 + br label %each.step6555 +each.step6555: + %t147 = load i64, ptr %a56 + %t148 = add i64 %t147, 1 + store i64 %t148, ptr %a56 + br label %each.cond6553 +each.end6556: + %t149 = load %S.gen.Plan, ptr %a4 + store %S.gen.Plan %t149, ptr %a150 + call void @finch.copy.S_gen_Plan(ptr %a151, ptr %a150) + %t152 = load %S.gen.Plan, ptr %a151 + ret %S.gen.Plan %t152 +} + +define internal void @finch.gen.checkByValue(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3, { ptr, i64, i64 } %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca %S.gen.StructDef, align 16 + %a28 = alloca %S.gen.StructDef, align 16 + %a30 = alloca %S.gen.StructDef, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + %t6 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 0 + %t7 = load { ptr, i64, i64 }, ptr %t6 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.4237, i64 6, i64 0 }, ptr %a9 + %t10 = call i32 @finch_str_eq(ptr %a8, ptr %a9) + %t11 = icmp eq i32 %t10, 0 + br i1 %t11, label %then6595, label %endif6597 +then6595: + ret void +endif6597: + %t12 = load ptr, ptr %a1 + %t13 = icmp eq ptr %t12, null + br i1 %t13, label %panic6598, label %ok6599 +panic6598: + call void @finch_panic(ptr @.str.4238, i64 3805, ptr @.str.4239) + unreachable +ok6599: + %t14 = getelementptr inbounds %S.gen.Gen, ptr %t12, i32 0, i32 15 + %t15 = load ptr, ptr %a1 + %t16 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 3 + %t17 = load { ptr, i64, i64 }, ptr %t16 + %t18 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 2 + %t19 = load { ptr, i64, i64 }, ptr %t18 + %t20 = call i64 @finch.gen.findStruct(ptr %t15, { ptr, i64, i64 } %t17, { ptr, i64, i64 } %t19) + %t21 = load { ptr, i64, i64 }, ptr %t14 + %t22 = extractvalue { ptr, i64, i64 } %t21, 1 + %t23 = icmp uge i64 %t20, %t22 + br i1 %t23, label %range6600, label %inrange6601 +range6600: + call void @finch_panic_index(ptr @.str.4240, i64 3805, i64 %t20, i64 %t22) + unreachable +inrange6601: + %t24 = extractvalue { ptr, i64, i64 } %t21, 0 + %t25 = getelementptr inbounds %S.gen.StructDef, ptr %t24, i64 %t20 + %t26 = load %S.gen.StructDef, ptr %t25 + store %S.gen.StructDef %t26, ptr %a27 + call void @finch.copy.S_gen_StructDef(ptr %a28, ptr %a27) + %t29 = load %S.gen.StructDef, ptr %a28 + store %S.gen.StructDef %t29, ptr %a30 + %t31 = getelementptr inbounds %S.gen.StructDef, ptr %a30, i32 0, i32 2 + %t32 = load i1, ptr %t31 + %t33 = xor i1 %t32, true + br i1 %t33, label %then6602, label %endif6604 +then6602: + %t34 = load ptr, ptr %a1 + %t35 = load %S.ast.Node, ptr %a2 + %t36 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.4241, i64 16, i64 0 }, ptr %a38 + store { ptr, i64, i64 } %t36, ptr %a39 + call void @finch_str_concat(ptr %a37, ptr %a38, ptr %a39) + %t40 = load { ptr, i64, i64 }, ptr %a37 + store { ptr, i64, i64 } %t40, ptr %a42 + store { ptr, i64, i64 } { ptr @.str.4242, i64 2, i64 0 }, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + %t45 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t44, ptr %a47 + store { ptr, i64, i64 } %t45, ptr %a48 + call void @finch_str_concat(ptr %a46, ptr %a47, ptr %a48) + %t49 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t49, ptr %a51 + store { ptr, i64, i64 } { ptr @.str.4243, i64 18, i64 0 }, ptr %a52 + call void @finch_str_concat(ptr %a50, ptr %a51, ptr %a52) + %t53 = load { ptr, i64, i64 }, ptr %a50 + %t54 = load %S.ast.Type, ptr %a4 + %t55 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t54) + store { ptr, i64, i64 } %t53, ptr %a57 + store { ptr, i64, i64 } %t55, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t59, ptr %a61 + store { ptr, i64, i64 } { ptr @.str.4244, i64 20, i64 0 }, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + call void @finch.gen.fail(ptr %t34, %S.ast.Node %t35, { ptr, i64, i64 } %t63) + br label %endif6604 +endif6604: + %t64 = getelementptr inbounds %S.gen.StructDef, ptr %a30, i32 0, i32 8 + %t65 = getelementptr inbounds { ptr, i64, i64 }, ptr %t64, i32 0, i32 1 + %t66 = load i64, ptr %t65 + %t67 = icmp sgt i64 %t66, 0 + br i1 %t67, label %then6605, label %endif6607 +then6605: + %t68 = load ptr, ptr %a1 + %t69 = load %S.ast.Node, ptr %a2 + %t70 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.4245, i64 16, i64 0 }, ptr %a72 + store { ptr, i64, i64 } %t70, ptr %a73 + call void @finch_str_concat(ptr %a71, ptr %a72, ptr %a73) + %t74 = load { ptr, i64, i64 }, ptr %a71 + store { ptr, i64, i64 } %t74, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.4246, i64 2, i64 0 }, ptr %a77 + call void @finch_str_concat(ptr %a75, ptr %a76, ptr %a77) + %t78 = load { ptr, i64, i64 }, ptr %a75 + %t79 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t78, ptr %a81 + store { ptr, i64, i64 } %t79, ptr %a82 + call void @finch_str_concat(ptr %a80, ptr %a81, ptr %a82) + %t83 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t83, ptr %a85 + store { ptr, i64, i64 } { ptr @.str.4247, i64 12, i64 0 }, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + %t88 = load %S.ast.Type, ptr %a4 + %t89 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t88) + store { ptr, i64, i64 } %t87, ptr %a91 + store { ptr, i64, i64 } %t89, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + store { ptr, i64, i64 } %t93, ptr %a95 + store { ptr, i64, i64 } { ptr @.str.4248, i64 40, i64 0 }, ptr %a96 + call void @finch_str_concat(ptr %a94, ptr %a95, ptr %a96) + %t97 = load { ptr, i64, i64 }, ptr %a94 + %t98 = getelementptr inbounds %S.gen.StructDef, ptr %a30, i32 0, i32 8 + %t99 = load { ptr, i64, i64 }, ptr %t98 + store { ptr, i64, i64 } %t97, ptr %a101 + store { ptr, i64, i64 } %t99, ptr %a102 + call void @finch_str_concat(ptr %a100, ptr %a101, ptr %a102) + %t103 = load { ptr, i64, i64 }, ptr %a100 + call void @finch.gen.fail(ptr %t68, %S.ast.Node %t69, { ptr, i64, i64 } %t103) + br label %endif6607 +endif6607: + ret void +} + +define internal i1 @finch.gen.cPlain(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = load %S.ast.Type, ptr %a1 + %t3 = call i1 @finch.gen.isNumber(%S.ast.Type %t2) + br label %logic.from6608 +logic.from6608: + br i1 %t3, label %logic.end6610, label %logic.rhs6609 +logic.rhs6609: + %t4 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.4249, i64 4, i64 0 }, ptr %a7 + %t8 = call i32 @finch_str_eq(ptr %a6, ptr %a7) + %t9 = icmp ne i32 %t8, 0 + br label %logic.rend6611 +logic.rend6611: + br label %logic.end6610 +logic.end6610: + %t10 = phi i1 [ true, %logic.from6608 ], [ %t9, %logic.rend6611 ] + br label %logic.from6612 +logic.from6612: + br i1 %t10, label %logic.end6614, label %logic.rhs6613 +logic.rhs6613: + %t11 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t12 = load { ptr, i64, i64 }, ptr %t11 + store { ptr, i64, i64 } %t12, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.4250, i64 4, i64 0 }, ptr %a14 + %t15 = call i32 @finch_str_eq(ptr %a13, ptr %a14) + %t16 = icmp ne i32 %t15, 0 + br label %logic.rend6615 +logic.rend6615: + br label %logic.end6614 +logic.end6614: + %t17 = phi i1 [ true, %logic.from6612 ], [ %t16, %logic.rend6615 ] + br label %logic.from6616 +logic.from6616: + br i1 %t17, label %logic.end6618, label %logic.rhs6617 +logic.rhs6617: + %t18 = getelementptr inbounds %S.ast.Type, ptr %a1, i32 0, i32 0 + %t19 = load { ptr, i64, i64 }, ptr %t18 + store { ptr, i64, i64 } %t19, ptr %a20 + store { ptr, i64, i64 } { ptr @.str.4251, i64 3, i64 0 }, ptr %a21 + %t22 = call i32 @finch_str_eq(ptr %a20, ptr %a21) + %t23 = icmp ne i32 %t22, 0 + br label %logic.rend6619 +logic.rend6619: + br label %logic.end6618 +logic.end6618: + %t24 = phi i1 [ true, %logic.from6616 ], [ %t23, %logic.rend6619 ] + ret i1 %t24 +} + +define internal void @finch.gen.checkExport(ptr %p0, %S.ast.Node %p1, %S.gen.FnSig %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.gen.FnSig, align 16 + %a23 = alloca i64, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca i64, align 16 + %a100 = alloca %S.gen.FnSig, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.gen.FnSig %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 2 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i32 0, i32 1 + %t6 = load i64, ptr %t5 + %t7 = icmp sgt i64 %t6, 0 + br i1 %t7, label %then6620, label %endif6622 +then6620: + %t8 = load ptr, ptr %a1 + %t9 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t8, %S.ast.Node %t9, { ptr, i64, i64 } { ptr @.str.4252, i64 59, i64 0 }) + br label %endif6622 +endif6622: + %t10 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 7 + %t11 = load i1, ptr %t10 + br i1 %t11, label %then6623, label %endif6625 +then6623: + %t12 = load ptr, ptr %a1 + %t13 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t12, %S.ast.Node %t13, { ptr, i64, i64 } { ptr @.str.4253, i64 74, i64 0 }) + br label %endif6625 +endif6625: + %t14 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 3 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t14, i32 0, i32 1 + %t16 = load i64, ptr %t15 + %t17 = icmp sgt i64 %t16, 0 + br i1 %t17, label %then6626, label %endif6628 +then6626: + %t18 = load ptr, ptr %a1 + %t19 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t18, %S.ast.Node %t19, { ptr, i64, i64 } { ptr @.str.4254, i64 29, i64 0 }) + br label %endif6628 +endif6628: + %t20 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 13 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t20, i32 0, i32 1 + %t22 = load i64, ptr %t21 + store i64 0, ptr %a23 + br label %for.cond6629 +for.cond6629: + %t24 = load i64, ptr %a23 + %t25 = icmp slt i64 %t24, %t22 + br i1 %t25, label %for.body6630, label %for.end6632 +for.body6630: + %t26 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 13 + %t27 = load i64, ptr %a23 + %t28 = load { ptr, i64, i64 }, ptr %t26 + %t29 = extractvalue { ptr, i64, i64 } %t28, 1 + %t30 = icmp uge i64 %t27, %t29 + br i1 %t30, label %range6633, label %inrange6634 +range6633: + call void @finch_panic_index(ptr @.str.4255, i64 3830, i64 %t27, i64 %t29) + unreachable +inrange6634: + %t31 = extractvalue { ptr, i64, i64 } %t28, 0 + %t32 = getelementptr inbounds %S.ast.Type, ptr %t31, i64 %t27 + %t33 = load %S.ast.Type, ptr %t32 + %t34 = call i1 @finch.gen.cPlain(%S.ast.Type %t33) + %t35 = xor i1 %t34, true + br i1 %t35, label %then6635, label %endif6637 +then6635: + %t36 = load ptr, ptr %a1 + %t37 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t38 = load i64, ptr %a23 + %t39 = load { ptr, i64, i64 }, ptr %t37 + %t40 = extractvalue { ptr, i64, i64 } %t39, 1 + %t41 = icmp uge i64 %t38, %t40 + br i1 %t41, label %range6638, label %inrange6639 +range6638: + call void @finch_panic_index(ptr @.str.4256, i64 3831, i64 %t38, i64 %t40) + unreachable +inrange6639: + %t42 = extractvalue { ptr, i64, i64 } %t39, 0 + %t43 = getelementptr inbounds %S.ast.Node, ptr %t42, i64 %t38 + %t44 = load %S.ast.Node, ptr %t43 + %t45 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 13 + %t46 = load i64, ptr %a23 + %t47 = load { ptr, i64, i64 }, ptr %t45 + %t48 = extractvalue { ptr, i64, i64 } %t47, 1 + %t49 = icmp uge i64 %t46, %t48 + br i1 %t49, label %range6640, label %inrange6641 +range6640: + call void @finch_panic_index(ptr @.str.4258, i64 3831, i64 %t46, i64 %t48) + unreachable +inrange6641: + %t50 = extractvalue { ptr, i64, i64 } %t47, 0 + %t51 = getelementptr inbounds %S.ast.Type, ptr %t50, i64 %t46 + %t52 = load %S.ast.Type, ptr %t51 + %t53 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t52) + store { ptr, i64, i64 } { ptr @.str.4257, i64 66, i64 0 }, ptr %a55 + store { ptr, i64, i64 } %t53, ptr %a56 + call void @finch_str_concat(ptr %a54, ptr %a55, ptr %a56) + %t57 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t57, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.4259, i64 50, i64 0 }, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + call void @finch.gen.fail(ptr %t36, %S.ast.Node %t44, { ptr, i64, i64 } %t61) + br label %endif6637 +endif6637: + br label %for.step6631 +for.step6631: + %t62 = load i64, ptr %a23 + %t63 = add i64 %t62, 1 + store i64 %t63, ptr %a23 + br label %for.cond6629 +for.end6632: + %t64 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 12 + %t65 = getelementptr inbounds %S.ast.Type, ptr %t64, i32 0, i32 0 + %t66 = load { ptr, i64, i64 }, ptr %t65 + store { ptr, i64, i64 } %t66, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.4260, i64 4, i64 0 }, ptr %a68 + %t69 = call i32 @finch_str_eq(ptr %a67, ptr %a68) + %t70 = icmp eq i32 %t69, 0 + br label %logic.from6642 +logic.from6642: + br i1 %t70, label %logic.rhs6643, label %logic.end6644 +logic.rhs6643: + %t71 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 12 + %t72 = load %S.ast.Type, ptr %t71 + %t73 = call i1 @finch.gen.cPlain(%S.ast.Type %t72) + %t74 = xor i1 %t73, true + br label %logic.rend6645 +logic.rend6645: + br label %logic.end6644 +logic.end6644: + %t75 = phi i1 [ false, %logic.from6642 ], [ %t74, %logic.rend6645 ] + br i1 %t75, label %then6646, label %endif6648 +then6646: + %t76 = load ptr, ptr %a1 + %t77 = load %S.ast.Node, ptr %a2 + %t78 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 12 + %t79 = load %S.ast.Type, ptr %t78 + %t80 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t79) + store { ptr, i64, i64 } { ptr @.str.4261, i64 69, i64 0 }, ptr %a82 + store { ptr, i64, i64 } %t80, ptr %a83 + call void @finch_str_concat(ptr %a81, ptr %a82, ptr %a83) + %t84 = load { ptr, i64, i64 }, ptr %a81 + store { ptr, i64, i64 } %t84, ptr %a86 + store { ptr, i64, i64 } { ptr @.str.4262, i64 1, i64 0 }, ptr %a87 + call void @finch_str_concat(ptr %a85, ptr %a86, ptr %a87) + %t88 = load { ptr, i64, i64 }, ptr %a85 + call void @finch.gen.fail(ptr %t76, %S.ast.Node %t77, { ptr, i64, i64 } %t88) + br label %endif6648 +endif6648: + %t89 = load ptr, ptr %a1 + %t90 = icmp eq ptr %t89, null + br i1 %t90, label %panic6649, label %ok6650 +panic6649: + call void @finch_panic(ptr @.str.4263, i64 3837, ptr @.str.4264) + unreachable +ok6650: + %t91 = getelementptr inbounds %S.gen.Gen, ptr %t89, i32 0, i32 14 + store i64 0, ptr %a92 + br label %each.cond6651 +each.cond6651: + %t93 = getelementptr inbounds { ptr, i64, i64 }, ptr %t91, i32 0, i32 1 + %t94 = load i64, ptr %t93 + %t95 = load i64, ptr %a92 + %t96 = icmp slt i64 %t95, %t94 + br i1 %t96, label %each.body6652, label %each.end6654 +each.body6652: + %t97 = load ptr, ptr %t91 + %t98 = getelementptr inbounds %S.gen.FnSig, ptr %t97, i64 %t95 + %t99 = load %S.gen.FnSig, ptr %t98 + store %S.gen.FnSig %t99, ptr %a100 + %t101 = getelementptr inbounds %S.gen.FnSig, ptr %a100, i32 0, i32 5 + %t102 = load i1, ptr %t101 + br label %logic.from6655 +logic.from6655: + br i1 %t102, label %logic.rhs6656, label %logic.end6657 +logic.rhs6656: + %t103 = getelementptr inbounds %S.gen.FnSig, ptr %a100, i32 0, i32 1 + %t104 = load { ptr, i64, i64 }, ptr %t103 + %t105 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 1 + %t106 = load { ptr, i64, i64 }, ptr %t105 + store { ptr, i64, i64 } %t104, ptr %a107 + store { ptr, i64, i64 } %t106, ptr %a108 + %t109 = call i32 @finch_str_eq(ptr %a107, ptr %a108) + %t110 = icmp ne i32 %t109, 0 + br label %logic.rend6658 +logic.rend6658: + br label %logic.end6657 +logic.end6657: + %t111 = phi i1 [ false, %logic.from6655 ], [ %t110, %logic.rend6658 ] + br i1 %t111, label %then6659, label %endif6661 +then6659: + %t112 = load ptr, ptr %a1 + %t113 = load %S.ast.Node, ptr %a2 + %t114 = getelementptr inbounds %S.gen.FnSig, ptr %a3, i32 0, i32 1 + %t115 = load { ptr, i64, i64 }, ptr %t114 + store { ptr, i64, i64 } { ptr @.str.4265, i64 1, i64 0 }, ptr %a117 + store { ptr, i64, i64 } %t115, ptr %a118 + call void @finch_str_concat(ptr %a116, ptr %a117, ptr %a118) + %t119 = load { ptr, i64, i64 }, ptr %a116 + store { ptr, i64, i64 } %t119, ptr %a121 + store { ptr, i64, i64 } { ptr @.str.4266, i64 38, i64 0 }, ptr %a122 + call void @finch_str_concat(ptr %a120, ptr %a121, ptr %a122) + %t123 = load { ptr, i64, i64 }, ptr %a120 + call void @finch.gen.fail(ptr %t112, %S.ast.Node %t113, { ptr, i64, i64 } %t123) + br label %endif6661 +endif6661: + br label %each.step6653 +each.step6653: + %t124 = load i64, ptr %a92 + %t125 = add i64 %t124, 1 + store i64 %t125, ptr %a92 + br label %each.cond6651 +each.end6654: + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.exportWrapper(ptr %p0, %S.gen.FnSig %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.FnSig, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca %S.gen.Saved, align 16 + %a11 = alloca i64, align 16 + %a22 = alloca %S.ast.Type, align 16 + %a23 = alloca %S.ast.Type, align 16 + %a25 = alloca %S.ast.Type, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a259 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.gen.FnSig %p1, ptr %a2 + store { ptr, i64, i64 } zeroinitializer, ptr %a3 + store { ptr, i64, i64 } zeroinitializer, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = call %S.gen.Saved @finch.gen.beginHelper(ptr %t5) + store %S.gen.Saved %t6, ptr %a7 + %t8 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 13 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t8, i32 0, i32 1 + %t10 = load i64, ptr %t9 + store i64 0, ptr %a11 + br label %for.cond6662 +for.cond6662: + %t12 = load i64, ptr %a11 + %t13 = icmp slt i64 %t12, %t10 + br i1 %t13, label %for.body6663, label %for.end6665 +for.body6663: + %t14 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 13 + %t15 = load i64, ptr %a11 + %t16 = load { ptr, i64, i64 }, ptr %t14 + %t17 = extractvalue { ptr, i64, i64 } %t16, 1 + %t18 = icmp uge i64 %t15, %t17 + br i1 %t18, label %range6666, label %inrange6667 +range6666: + call void @finch_panic_index(ptr @.str.4267, i64 3850, i64 %t15, i64 %t17) + unreachable +inrange6667: + %t19 = extractvalue { ptr, i64, i64 } %t16, 0 + %t20 = getelementptr inbounds %S.ast.Type, ptr %t19, i64 %t15 + %t21 = load %S.ast.Type, ptr %t20 + store %S.ast.Type %t21, ptr %a22 + call void @finch.copy.S_ast_Type(ptr %a23, ptr %a22) + %t24 = load %S.ast.Type, ptr %a23 + store %S.ast.Type %t24, ptr %a25 + %t26 = getelementptr inbounds %S.ast.Type, ptr %a25, i32 0, i32 0 + %t27 = load { ptr, i64, i64 }, ptr %t26 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.4268, i64 4, i64 0 }, ptr %a29 + %t30 = call i32 @finch_str_eq(ptr %a28, ptr %a29) + %t31 = icmp ne i32 %t30, 0 + br i1 %t31, label %then6668, label %else6669 +then6668: + %t32 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t33 = load i64, ptr %a11 + call void @finch_str_from_int(ptr %a34, i64 %t33) + %t35 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.4269, i64 13, i64 0 }, ptr %a37 + store { ptr, i64, i64 } %t35, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + %t40 = load i64, ptr %t32 + %t41 = add i64 %t40, 1 + call void @finch_arr_reserve(ptr %a3, i64 %t41, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t42 = load ptr, ptr %a3 + %t43 = getelementptr inbounds { ptr, i64, i64 }, ptr %t42, i64 %t40 + store { ptr, i64, i64 } %t39, ptr %t43 + store i64 %t41, ptr %t32 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t45 = load ptr, ptr %a1 + %t46 = load i64, ptr %a11 + call void @finch_str_from_int(ptr %a47, i64 %t46) + %t48 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } { ptr @.str.4271, i64 13, i64 0 }, ptr %a50 + store { ptr, i64, i64 } %t48, ptr %a51 + call void @finch_str_concat(ptr %a49, ptr %a50, ptr %a51) + %t52 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t52, ptr %a54 + store { ptr, i64, i64 } { ptr @.str.4272, i64 3, i64 0 }, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + %t57 = call { ptr, i64, i64 } @finch.gen.op(ptr %t45, { ptr, i64, i64 } %t56) + store { ptr, i64, i64 } { ptr @.str.4270, i64 3, i64 0 }, ptr %a59 + store { ptr, i64, i64 } %t57, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + %t62 = load i64, ptr %t44 + %t63 = add i64 %t62, 1 + call void @finch_arr_reserve(ptr %a4, i64 %t63, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t64 = load ptr, ptr %a4 + %t65 = getelementptr inbounds { ptr, i64, i64 }, ptr %t64, i64 %t62 + store { ptr, i64, i64 } %t61, ptr %t65 + store i64 %t63, ptr %t44 + br label %endif6670 +else6669: + %t66 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t67 = load ptr, ptr %a1 + %t68 = load %S.ast.Type, ptr %a25 + %t69 = call { ptr, i64, i64 } @finch.gen.cLL(ptr %t67, %S.ast.Type %t68) + %t70 = load ptr, ptr %a1 + %t71 = load %S.ast.Type, ptr %a25 + %t72 = call { ptr, i64, i64 } @finch.gen.cExt(ptr %t70, %S.ast.Type %t71) + store { ptr, i64, i64 } %t69, ptr %a74 + store { ptr, i64, i64 } %t72, ptr %a75 + call void @finch_str_concat(ptr %a73, ptr %a74, ptr %a75) + %t76 = load { ptr, i64, i64 }, ptr %a73 + store { ptr, i64, i64 } %t76, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.4273, i64 3, i64 0 }, ptr %a79 + call void @finch_str_concat(ptr %a77, ptr %a78, ptr %a79) + %t80 = load { ptr, i64, i64 }, ptr %a77 + %t81 = load i64, ptr %a11 + call void @finch_str_from_int(ptr %a82, i64 %t81) + %t83 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t80, ptr %a85 + store { ptr, i64, i64 } %t83, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + %t88 = load i64, ptr %t66 + %t89 = add i64 %t88, 1 + call void @finch_arr_reserve(ptr %a3, i64 %t89, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t90 = load ptr, ptr %a3 + %t91 = getelementptr inbounds { ptr, i64, i64 }, ptr %t90, i64 %t88 + store { ptr, i64, i64 } %t87, ptr %t91 + store i64 %t89, ptr %t66 + %t92 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t93 = load ptr, ptr %a1 + %t94 = load %S.ast.Type, ptr %a25 + %t95 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t93, %S.ast.Type %t94) + store { ptr, i64, i64 } %t95, ptr %a97 + store { ptr, i64, i64 } { ptr @.str.4274, i64 3, i64 0 }, ptr %a98 + call void @finch_str_concat(ptr %a96, ptr %a97, ptr %a98) + %t99 = load { ptr, i64, i64 }, ptr %a96 + %t100 = load i64, ptr %a11 + call void @finch_str_from_int(ptr %a101, i64 %t100) + %t102 = load { ptr, i64, i64 }, ptr %a101 + store { ptr, i64, i64 } %t99, ptr %a104 + store { ptr, i64, i64 } %t102, ptr %a105 + call void @finch_str_concat(ptr %a103, ptr %a104, ptr %a105) + %t106 = load { ptr, i64, i64 }, ptr %a103 + %t107 = load i64, ptr %t92 + %t108 = add i64 %t107, 1 + call void @finch_arr_reserve(ptr %a4, i64 %t108, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t109 = load ptr, ptr %a4 + %t110 = getelementptr inbounds { ptr, i64, i64 }, ptr %t109, i64 %t107 + store { ptr, i64, i64 } %t106, ptr %t110 + store i64 %t108, ptr %t92 + br label %endif6670 +endif6670: + br label %for.step6664 +for.step6664: + %t111 = load i64, ptr %a11 + %t112 = add i64 %t111, 1 + store i64 %t112, ptr %a11 + br label %for.cond6662 +for.end6665: + %t113 = load ptr, ptr %a1 + %t114 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t115 = load %S.ast.Type, ptr %t114 + %t116 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t113, %S.ast.Type %t115) + store { ptr, i64, i64 } { ptr @.str.4275, i64 5, i64 0 }, ptr %a118 + store { ptr, i64, i64 } %t116, ptr %a119 + call void @finch_str_concat(ptr %a117, ptr %a118, ptr %a119) + %t120 = load { ptr, i64, i64 }, ptr %a117 + store { ptr, i64, i64 } %t120, ptr %a122 + store { ptr, i64, i64 } { ptr @.str.4276, i64 1, i64 0 }, ptr %a123 + call void @finch_str_concat(ptr %a121, ptr %a122, ptr %a123) + %t124 = load { ptr, i64, i64 }, ptr %a121 + %t125 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 11 + %t126 = load { ptr, i64, i64 }, ptr %t125 + store { ptr, i64, i64 } %t124, ptr %a128 + store { ptr, i64, i64 } %t126, ptr %a129 + call void @finch_str_concat(ptr %a127, ptr %a128, ptr %a129) + %t130 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t130, ptr %a132 + store { ptr, i64, i64 } { ptr @.str.4277, i64 1, i64 0 }, ptr %a133 + call void @finch_str_concat(ptr %a131, ptr %a132, ptr %a133) + %t134 = load { ptr, i64, i64 }, ptr %a131 + %t135 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4278, i64 2, i64 0 }, ptr %a136 + call void @finch_str_join(ptr %a137, ptr %a4, ptr %a136) + %t138 = load { ptr, i64, i64 }, ptr %a137 + store { ptr, i64, i64 } %t134, ptr %a140 + store { ptr, i64, i64 } %t138, ptr %a141 + call void @finch_str_concat(ptr %a139, ptr %a140, ptr %a141) + %t142 = load { ptr, i64, i64 }, ptr %a139 + store { ptr, i64, i64 } %t142, ptr %a144 + store { ptr, i64, i64 } { ptr @.str.4279, i64 1, i64 0 }, ptr %a145 + call void @finch_str_concat(ptr %a143, ptr %a144, ptr %a145) + %t146 = load { ptr, i64, i64 }, ptr %a143 + store { ptr, i64, i64 } %t146, ptr %a147 + store { ptr, i64, i64 } { ptr @.str.4280, i64 4, i64 0 }, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.4281, i64 0, i64 0 }, ptr %a149 + %t150 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t151 = getelementptr inbounds %S.ast.Type, ptr %t150, i32 0, i32 0 + %t152 = load { ptr, i64, i64 }, ptr %t151 + store { ptr, i64, i64 } %t152, ptr %a153 + store { ptr, i64, i64 } { ptr @.str.4282, i64 4, i64 0 }, ptr %a154 + %t155 = call i32 @finch_str_eq(ptr %a153, ptr %a154) + %t156 = icmp ne i32 %t155, 0 + br i1 %t156, label %then6671, label %else6672 +then6671: + %t157 = load ptr, ptr %a1 + %t158 = load { ptr, i64, i64 }, ptr %a147 + call void @finch.gen.emit(ptr %t157, { ptr, i64, i64 } %t158) + %t159 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t159, { ptr, i64, i64 } { ptr @.str.4283, i64 8, i64 0 }) + br label %endif6673 +else6672: + %t160 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t161 = getelementptr inbounds %S.ast.Type, ptr %t160, i32 0, i32 0 + %t162 = load { ptr, i64, i64 }, ptr %t161 + store { ptr, i64, i64 } %t162, ptr %a163 + store { ptr, i64, i64 } { ptr @.str.4284, i64 4, i64 0 }, ptr %a164 + %t165 = call i32 @finch_str_eq(ptr %a163, ptr %a164) + %t166 = icmp ne i32 %t165, 0 + br i1 %t166, label %then6674, label %else6675 +then6674: + store { ptr, i64, i64 } { ptr @.str.4285, i64 2, i64 0 }, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.4286, i64 8, i64 0 }, ptr %a149 + %t167 = load ptr, ptr %a1 + %t168 = load ptr, ptr %a1 + %t169 = load ptr, ptr %a1 + %t170 = load { ptr, i64, i64 }, ptr %a147 + %t171 = call { ptr, i64, i64 } @finch.gen.op(ptr %t169, { ptr, i64, i64 } %t170) + store { ptr, i64, i64 } { ptr @.str.4288, i64 8, i64 0 }, ptr %a173 + store { ptr, i64, i64 } %t171, ptr %a174 + call void @finch_str_concat(ptr %a172, ptr %a173, ptr %a174) + %t175 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } %t175, ptr %a177 + store { ptr, i64, i64 } { ptr @.str.4289, i64 6, i64 0 }, ptr %a178 + call void @finch_str_concat(ptr %a176, ptr %a177, ptr %a178) + %t179 = load { ptr, i64, i64 }, ptr %a176 + %t180 = call { ptr, i64, i64 } @finch.gen.op(ptr %t168, { ptr, i64, i64 } %t179) + store { ptr, i64, i64 } { ptr @.str.4287, i64 7, i64 0 }, ptr %a182 + store { ptr, i64, i64 } %t180, ptr %a183 + call void @finch_str_concat(ptr %a181, ptr %a182, ptr %a183) + %t184 = load { ptr, i64, i64 }, ptr %a181 + call void @finch.gen.emit(ptr %t167, { ptr, i64, i64 } %t184) + br label %endif6676 +else6675: + %t185 = load ptr, ptr %a1 + %t186 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t187 = load %S.ast.Type, ptr %t186 + %t188 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t185, %S.ast.Type %t187) + store { ptr, i64, i64 } %t188, ptr %a148 + %t189 = load ptr, ptr %a1 + %t190 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t191 = load %S.ast.Type, ptr %t190 + %t192 = call { ptr, i64, i64 } @finch.gen.cExt(ptr %t189, %S.ast.Type %t191) + store { ptr, i64, i64 } %t192, ptr %a149 + %t193 = load ptr, ptr %a1 + %t194 = load { ptr, i64, i64 }, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.4290, i64 4, i64 0 }, ptr %a196 + store { ptr, i64, i64 } %t194, ptr %a197 + call void @finch_str_concat(ptr %a195, ptr %a196, ptr %a197) + %t198 = load { ptr, i64, i64 }, ptr %a195 + store { ptr, i64, i64 } %t198, ptr %a200 + store { ptr, i64, i64 } { ptr @.str.4291, i64 1, i64 0 }, ptr %a201 + call void @finch_str_concat(ptr %a199, ptr %a200, ptr %a201) + %t202 = load { ptr, i64, i64 }, ptr %a199 + %t203 = load ptr, ptr %a1 + %t204 = load { ptr, i64, i64 }, ptr %a147 + %t205 = call { ptr, i64, i64 } @finch.gen.op(ptr %t203, { ptr, i64, i64 } %t204) + store { ptr, i64, i64 } %t202, ptr %a207 + store { ptr, i64, i64 } %t205, ptr %a208 + call void @finch_str_concat(ptr %a206, ptr %a207, ptr %a208) + %t209 = load { ptr, i64, i64 }, ptr %a206 + call void @finch.gen.emit(ptr %t193, { ptr, i64, i64 } %t209) + br label %endif6676 +endif6676: + br label %endif6673 +endif6673: + store { ptr, i64, i64 } { ptr @.str.4292, i64 0, i64 0 }, ptr %a210 + %t211 = load ptr, ptr %a1 + %t212 = icmp eq ptr %t211, null + br i1 %t212, label %panic6677, label %ok6678 +panic6677: + call void @finch_panic(ptr @.str.4293, i64 3875, ptr @.str.4294) + unreachable +ok6678: + %t213 = getelementptr inbounds %S.gen.Gen, ptr %t211, i32 0, i32 27 + %t214 = getelementptr inbounds %S.platform.Target, ptr %t213, i32 0, i32 1 + %t215 = load i1, ptr %t214 + br i1 %t215, label %then6679, label %endif6681 +then6679: + store { ptr, i64, i64 } { ptr @.str.4295, i64 10, i64 0 }, ptr %a210 + br label %endif6681 +endif6681: + %t216 = load ptr, ptr %a1 + %t217 = load %S.gen.Saved, ptr %a7 + %t218 = load { ptr, i64, i64 }, ptr %a210 + store { ptr, i64, i64 } { ptr @.str.4296, i64 6, i64 0 }, ptr %a220 + store { ptr, i64, i64 } %t218, ptr %a221 + call void @finch_str_concat(ptr %a219, ptr %a220, ptr %a221) + %t222 = load { ptr, i64, i64 }, ptr %a219 + %t223 = load { ptr, i64, i64 }, ptr %a149 + store { ptr, i64, i64 } %t222, ptr %a225 + store { ptr, i64, i64 } %t223, ptr %a226 + call void @finch_str_concat(ptr %a224, ptr %a225, ptr %a226) + %t227 = load { ptr, i64, i64 }, ptr %a224 + store { ptr, i64, i64 } %t227, ptr %a229 + store { ptr, i64, i64 } { ptr @.str.4297, i64 1, i64 0 }, ptr %a230 + call void @finch_str_concat(ptr %a228, ptr %a229, ptr %a230) + %t231 = load { ptr, i64, i64 }, ptr %a228 + %t232 = load { ptr, i64, i64 }, ptr %a148 + store { ptr, i64, i64 } %t231, ptr %a234 + store { ptr, i64, i64 } %t232, ptr %a235 + call void @finch_str_concat(ptr %a233, ptr %a234, ptr %a235) + %t236 = load { ptr, i64, i64 }, ptr %a233 + store { ptr, i64, i64 } %t236, ptr %a238 + store { ptr, i64, i64 } { ptr @.str.4298, i64 2, i64 0 }, ptr %a239 + call void @finch_str_concat(ptr %a237, ptr %a238, ptr %a239) + %t240 = load { ptr, i64, i64 }, ptr %a237 + %t241 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 1 + %t242 = load { ptr, i64, i64 }, ptr %t241 + store { ptr, i64, i64 } %t240, ptr %a244 + store { ptr, i64, i64 } %t242, ptr %a245 + call void @finch_str_concat(ptr %a243, ptr %a244, ptr %a245) + %t246 = load { ptr, i64, i64 }, ptr %a243 + store { ptr, i64, i64 } %t246, ptr %a248 + store { ptr, i64, i64 } { ptr @.str.4299, i64 1, i64 0 }, ptr %a249 + call void @finch_str_concat(ptr %a247, ptr %a248, ptr %a249) + %t250 = load { ptr, i64, i64 }, ptr %a247 + %t251 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4300, i64 2, i64 0 }, ptr %a252 + call void @finch_str_join(ptr %a253, ptr %a3, ptr %a252) + %t254 = load { ptr, i64, i64 }, ptr %a253 + store { ptr, i64, i64 } %t250, ptr %a256 + store { ptr, i64, i64 } %t254, ptr %a257 + call void @finch_str_concat(ptr %a255, ptr %a256, ptr %a257) + %t258 = load { ptr, i64, i64 }, ptr %a255 + store { ptr, i64, i64 } %t258, ptr %a260 + store { ptr, i64, i64 } { ptr @.str.4301, i64 1, i64 0 }, ptr %a261 + call void @finch_str_concat(ptr %a259, ptr %a260, ptr %a261) + %t262 = load { ptr, i64, i64 }, ptr %a259 + call void @finch.gen.endHelper(ptr %t216, %S.gen.Saved %t217, { ptr, i64, i64 } %t262) + %t263 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 1 + %t264 = load { ptr, i64, i64 }, ptr %t263 + store { ptr, i64, i64 } %t264, ptr %a265 + call void @finch_str_copy(ptr %a266, ptr %a265) + %t267 = load { ptr, i64, i64 }, ptr %a266 + ret { ptr, i64, i64 } %t267 +} + +define internal { ptr, i64, i64 } @finch.gen.cThunk(ptr %p0, i64 %p1, %S.ast.Node %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a3 = alloca %S.ast.Node, align 16 + %a14 = alloca %S.gen.FnSig, align 16 + %a15 = alloca %S.gen.FnSig, align 16 + %a17 = alloca %S.gen.FnSig, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca i64, align 16 + %a48 = alloca i64, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca i64, align 16 + %a105 = alloca %S.ast.Type, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca %S.gen.Plan, align 16 + %a265 = alloca %S.gen.Saved, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca i64, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca i64, align 16 + %a303 = alloca %S.ast.Type, align 16 + %a304 = alloca %S.ast.Type, align 16 + %a306 = alloca %S.ast.Type, align 16 + %a315 = alloca %S.gen.Abi, align 16 + %a316 = alloca %S.gen.Abi, align 16 + %a318 = alloca %S.gen.Abi, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a330 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a335 = alloca { ptr, i64, i64 }, align 16 + %a339 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a347 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca { ptr, i64, i64 }, align 16 + %a353 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a373 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a377 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + %a382 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a398 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a401 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a414 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a423 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a428 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a441 = alloca { ptr, i64, i64 }, align 16 + %a446 = alloca { ptr, i64, i64 }, align 16 + %a450 = alloca i64, align 16 + %a462 = alloca { ptr, i64, i64 }, align 16 + %a463 = alloca { ptr, i64, i64 }, align 16 + %a464 = alloca { ptr, i64, i64 }, align 16 + %a467 = alloca { ptr, i64, i64 }, align 16 + %a469 = alloca { ptr, i64, i64 }, align 16 + %a470 = alloca { ptr, i64, i64 }, align 16 + %a471 = alloca { ptr, i64, i64 }, align 16 + %a487 = alloca { ptr, i64, i64 }, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a490 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca { ptr, i64, i64 }, align 16 + %a495 = alloca { ptr, i64, i64 }, align 16 + %a496 = alloca { ptr, i64, i64 }, align 16 + %a497 = alloca { ptr, i64, i64 }, align 16 + %a499 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca { ptr, i64, i64 }, align 16 + %a501 = alloca { ptr, i64, i64 }, align 16 + %a505 = alloca { ptr, i64, i64 }, align 16 + %a507 = alloca { ptr, i64, i64 }, align 16 + %a508 = alloca { ptr, i64, i64 }, align 16 + %a509 = alloca { ptr, i64, i64 }, align 16 + %a520 = alloca { ptr, i64, i64 }, align 16 + %a521 = alloca { ptr, i64, i64 }, align 16 + %a522 = alloca { ptr, i64, i64 }, align 16 + %a530 = alloca { ptr, i64, i64 }, align 16 + %a531 = alloca { ptr, i64, i64 }, align 16 + %a532 = alloca { ptr, i64, i64 }, align 16 + %a545 = alloca { ptr, i64, i64 }, align 16 + %a546 = alloca { ptr, i64, i64 }, align 16 + %a547 = alloca { ptr, i64, i64 }, align 16 + %a549 = alloca { ptr, i64, i64 }, align 16 + %a550 = alloca { ptr, i64, i64 }, align 16 + %a551 = alloca { ptr, i64, i64 }, align 16 + %a554 = alloca { ptr, i64, i64 }, align 16 + %a556 = alloca { ptr, i64, i64 }, align 16 + %a557 = alloca { ptr, i64, i64 }, align 16 + %a558 = alloca { ptr, i64, i64 }, align 16 + %a568 = alloca { ptr, i64, i64 }, align 16 + %a569 = alloca { ptr, i64, i64 }, align 16 + %a570 = alloca { ptr, i64, i64 }, align 16 + %a573 = alloca { ptr, i64, i64 }, align 16 + %a575 = alloca { ptr, i64, i64 }, align 16 + %a576 = alloca { ptr, i64, i64 }, align 16 + %a577 = alloca { ptr, i64, i64 }, align 16 + %a591 = alloca { ptr, i64, i64 }, align 16 + %a592 = alloca { ptr, i64, i64 }, align 16 + %a593 = alloca { ptr, i64, i64 }, align 16 + %a595 = alloca { ptr, i64, i64 }, align 16 + %a596 = alloca { ptr, i64, i64 }, align 16 + %a597 = alloca { ptr, i64, i64 }, align 16 + %a601 = alloca { ptr, i64, i64 }, align 16 + %a602 = alloca { ptr, i64, i64 }, align 16 + %a603 = alloca { ptr, i64, i64 }, align 16 + %a605 = alloca { ptr, i64, i64 }, align 16 + %a606 = alloca { ptr, i64, i64 }, align 16 + %a607 = alloca { ptr, i64, i64 }, align 16 + %a610 = alloca { ptr, i64, i64 }, align 16 + %a611 = alloca { ptr, i64, i64 }, align 16 + %a613 = alloca { ptr, i64, i64 }, align 16 + %a614 = alloca { ptr, i64, i64 }, align 16 + %a615 = alloca { ptr, i64, i64 }, align 16 + %a617 = alloca { ptr, i64, i64 }, align 16 + %a618 = alloca { ptr, i64, i64 }, align 16 + %a619 = alloca { ptr, i64, i64 }, align 16 + %a621 = alloca { ptr, i64, i64 }, align 16 + %a622 = alloca { ptr, i64, i64 }, align 16 + %a626 = alloca { ptr, i64, i64 }, align 16 + %a627 = alloca { ptr, i64, i64 }, align 16 + %a648 = alloca { ptr, i64, i64 }, align 16 + %a649 = alloca { ptr, i64, i64 }, align 16 + %a654 = alloca { ptr, i64, i64 }, align 16 + %a668 = alloca { ptr, i64, i64 }, align 16 + %a669 = alloca { ptr, i64, i64 }, align 16 + %a670 = alloca { ptr, i64, i64 }, align 16 + %a672 = alloca { ptr, i64, i64 }, align 16 + %a673 = alloca { ptr, i64, i64 }, align 16 + %a674 = alloca { ptr, i64, i64 }, align 16 + %a682 = alloca { ptr, i64, i64 }, align 16 + %a683 = alloca { ptr, i64, i64 }, align 16 + %a684 = alloca { ptr, i64, i64 }, align 16 + %a695 = alloca { ptr, i64, i64 }, align 16 + %a696 = alloca { ptr, i64, i64 }, align 16 + %a697 = alloca { ptr, i64, i64 }, align 16 + %a699 = alloca { ptr, i64, i64 }, align 16 + %a700 = alloca { ptr, i64, i64 }, align 16 + %a701 = alloca { ptr, i64, i64 }, align 16 + %a706 = alloca { ptr, i64, i64 }, align 16 + %a707 = alloca { ptr, i64, i64 }, align 16 + %a708 = alloca { ptr, i64, i64 }, align 16 + %a713 = alloca { ptr, i64, i64 }, align 16 + %a714 = alloca { ptr, i64, i64 }, align 16 + %a715 = alloca { ptr, i64, i64 }, align 16 + %a717 = alloca { ptr, i64, i64 }, align 16 + %a718 = alloca { ptr, i64, i64 }, align 16 + %a719 = alloca { ptr, i64, i64 }, align 16 + %a723 = alloca { ptr, i64, i64 }, align 16 + %a724 = alloca { ptr, i64, i64 }, align 16 + %a725 = alloca { ptr, i64, i64 }, align 16 + %a727 = alloca { ptr, i64, i64 }, align 16 + %a728 = alloca { ptr, i64, i64 }, align 16 + %a729 = alloca { ptr, i64, i64 }, align 16 + %a732 = alloca { ptr, i64, i64 }, align 16 + %a733 = alloca { ptr, i64, i64 }, align 16 + %a734 = alloca { ptr, i64, i64 }, align 16 + %a736 = alloca { ptr, i64, i64 }, align 16 + %a737 = alloca { ptr, i64, i64 }, align 16 + %a738 = alloca { ptr, i64, i64 }, align 16 + %a741 = alloca { ptr, i64, i64 }, align 16 + %a742 = alloca { ptr, i64, i64 }, align 16 + %a744 = alloca { ptr, i64, i64 }, align 16 + %a745 = alloca { ptr, i64, i64 }, align 16 + %a746 = alloca { ptr, i64, i64 }, align 16 + %a748 = alloca { ptr, i64, i64 }, align 16 + %a749 = alloca { ptr, i64, i64 }, align 16 + %a750 = alloca { ptr, i64, i64 }, align 16 + %a753 = alloca { ptr, i64, i64 }, align 16 + %a754 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + store %S.ast.Node %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic6682, label %ok6683 +panic6682: + call void @finch_panic(ptr @.str.4302, i64 3884, ptr @.str.4303) + unreachable +ok6683: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 14 + %t7 = load i64, ptr %a2 + %t8 = load { ptr, i64, i64 }, ptr %t6 + %t9 = extractvalue { ptr, i64, i64 } %t8, 1 + %t10 = icmp uge i64 %t7, %t9 + br i1 %t10, label %range6684, label %inrange6685 +range6684: + call void @finch_panic_index(ptr @.str.4304, i64 3884, i64 %t7, i64 %t9) + unreachable +inrange6685: + %t11 = extractvalue { ptr, i64, i64 } %t8, 0 + %t12 = getelementptr inbounds %S.gen.FnSig, ptr %t11, i64 %t7 + %t13 = load %S.gen.FnSig, ptr %t12 + store %S.gen.FnSig %t13, ptr %a14 + call void @finch.copy.S_gen_FnSig(ptr %a15, ptr %a14) + %t16 = load %S.gen.FnSig, ptr %a15 + store %S.gen.FnSig %t16, ptr %a17 + %t18 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 0 + %t19 = load { ptr, i64, i64 }, ptr %t18 + %t20 = call { ptr, i64, i64 } @finch.gen.modName({ ptr, i64, i64 } %t19) + store { ptr, i64, i64 } { ptr @.str.4305, i64 9, i64 0 }, ptr %a22 + store { ptr, i64, i64 } %t20, ptr %a23 + call void @finch_str_concat(ptr %a21, ptr %a22, ptr %a23) + %t24 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } %t24, ptr %a26 + store { ptr, i64, i64 } { ptr @.str.4306, i64 1, i64 0 }, ptr %a27 + call void @finch_str_concat(ptr %a25, ptr %a26, ptr %a27) + %t28 = load { ptr, i64, i64 }, ptr %a25 + %t29 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 1 + %t30 = load { ptr, i64, i64 }, ptr %t29 + store { ptr, i64, i64 } %t28, ptr %a32 + store { ptr, i64, i64 } %t30, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t34, ptr %a35 + %t36 = load ptr, ptr %a1 + %t37 = icmp eq ptr %t36, null + br i1 %t37, label %panic6686, label %ok6687 +panic6686: + call void @finch_panic(ptr @.str.4307, i64 3886, ptr @.str.4308) + unreachable +ok6687: + %t38 = getelementptr inbounds %S.gen.Gen, ptr %t36, i32 0, i32 36 + %t39 = getelementptr inbounds { ptr, i64, i64 }, ptr %t38, i32 0, i32 1 + %t40 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.4309, i64 2, i64 0 }, ptr %a42 + store { ptr, i64, i64 } %t40, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + store i64 -1, ptr %a45 + %t46 = load i64, ptr %t39 + %t47 = load ptr, ptr %t38 + store i64 0, ptr %a48 + br label %find.cond6688 +find.cond6688: + %t49 = load i64, ptr %a48 + %t50 = icmp slt i64 %t49, %t46 + br i1 %t50, label %find.body6689, label %find.end6692 +find.body6689: + %t51 = getelementptr inbounds { ptr, i64, i64 }, ptr %t47, i64 %t49 + %t52 = load { ptr, i64, i64 }, ptr %t51 + store { ptr, i64, i64 } %t52, ptr %a53 + store { ptr, i64, i64 } %t44, ptr %a54 + %t55 = call i32 @finch_str_eq(ptr %a53, ptr %a54) + %t56 = icmp ne i32 %t55, 0 + br i1 %t56, label %find.hit6690, label %find.next6691 +find.hit6690: + store i64 %t49, ptr %a45 + br label %find.end6692 +find.next6691: + %t57 = add i64 %t49, 1 + store i64 %t57, ptr %a48 + br label %find.cond6688 +find.end6692: + %t58 = load i64, ptr %a45 + %t59 = icmp sge i64 %t58, 0 + br i1 %t59, label %then6693, label %endif6695 +then6693: + %t60 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t60, ptr %a61 + call void @finch_str_copy(ptr %a62, ptr %a61) + %t63 = load { ptr, i64, i64 }, ptr %a62 + ret { ptr, i64, i64 } %t63 +endif6695: + %t64 = load ptr, ptr %a1 + %t65 = icmp eq ptr %t64, null + br i1 %t65, label %panic6696, label %ok6697 +panic6696: + call void @finch_panic(ptr @.str.4310, i64 3889, ptr @.str.4311) + unreachable +ok6697: + %t66 = getelementptr inbounds %S.gen.Gen, ptr %t64, i32 0, i32 36 + %t67 = getelementptr inbounds { ptr, i64, i64 }, ptr %t66, i32 0, i32 1 + %t68 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.4312, i64 2, i64 0 }, ptr %a70 + store { ptr, i64, i64 } %t68, ptr %a71 + call void @finch_str_concat(ptr %a69, ptr %a70, ptr %a71) + %t72 = load { ptr, i64, i64 }, ptr %a69 + %t73 = load i64, ptr %t67 + %t74 = add i64 %t73, 1 + call void @finch_arr_reserve(ptr %t66, i64 %t74, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t75 = load ptr, ptr %t66 + %t76 = getelementptr inbounds { ptr, i64, i64 }, ptr %t75, i64 %t73 + store { ptr, i64, i64 } %t72, ptr %t76 + store i64 %t74, ptr %t67 + %t77 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 2 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %t77, i32 0, i32 1 + %t79 = load i64, ptr %t78 + %t80 = icmp sgt i64 %t79, 0 + br label %logic.from6698 +logic.from6698: + br i1 %t80, label %logic.end6700, label %logic.rhs6699 +logic.rhs6699: + %t81 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 9 + %t82 = load i1, ptr %t81 + br label %logic.rend6701 +logic.rend6701: + br label %logic.end6700 +logic.end6700: + %t83 = phi i1 [ true, %logic.from6698 ], [ %t82, %logic.rend6701 ] + br i1 %t83, label %then6702, label %endif6704 +then6702: + %t84 = load ptr, ptr %a1 + %t85 = load %S.ast.Node, ptr %a3 + %t86 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 1 + %t87 = load { ptr, i64, i64 }, ptr %t86 + store { ptr, i64, i64 } { ptr @.str.4313, i64 5, i64 0 }, ptr %a89 + store { ptr, i64, i64 } %t87, ptr %a90 + call void @finch_str_concat(ptr %a88, ptr %a89, ptr %a90) + %t91 = load { ptr, i64, i64 }, ptr %a88 + store { ptr, i64, i64 } %t91, ptr %a93 + store { ptr, i64, i64 } { ptr @.str.4314, i64 81, i64 0 }, ptr %a94 + call void @finch_str_concat(ptr %a92, ptr %a93, ptr %a94) + %t95 = load { ptr, i64, i64 }, ptr %a92 + call void @finch.gen.fail(ptr %t84, %S.ast.Node %t85, { ptr, i64, i64 } %t95) + br label %endif6704 +endif6704: + %t96 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 13 + store i64 0, ptr %a97 + br label %each.cond6705 +each.cond6705: + %t98 = getelementptr inbounds { ptr, i64, i64 }, ptr %t96, i32 0, i32 1 + %t99 = load i64, ptr %t98 + %t100 = load i64, ptr %a97 + %t101 = icmp slt i64 %t100, %t99 + br i1 %t101, label %each.body6706, label %each.end6708 +each.body6706: + %t102 = load ptr, ptr %t96 + %t103 = getelementptr inbounds %S.ast.Type, ptr %t102, i64 %t100 + %t104 = load %S.ast.Type, ptr %t103 + store %S.ast.Type %t104, ptr %a105 + %t106 = load %S.ast.Type, ptr %a105 + %t107 = call i1 @finch.gen.isNumber(%S.ast.Type %t106) + br label %logic.from6709 +logic.from6709: + br i1 %t107, label %logic.end6711, label %logic.rhs6710 +logic.rhs6710: + %t108 = getelementptr inbounds %S.ast.Type, ptr %a105, i32 0, i32 0 + %t109 = load { ptr, i64, i64 }, ptr %t108 + store { ptr, i64, i64 } %t109, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.4315, i64 4, i64 0 }, ptr %a111 + %t112 = call i32 @finch_str_eq(ptr %a110, ptr %a111) + %t113 = icmp ne i32 %t112, 0 + br label %logic.rend6712 +logic.rend6712: + br label %logic.end6711 +logic.end6711: + %t114 = phi i1 [ true, %logic.from6709 ], [ %t113, %logic.rend6712 ] + br label %logic.from6713 +logic.from6713: + br i1 %t114, label %logic.end6715, label %logic.rhs6714 +logic.rhs6714: + %t115 = getelementptr inbounds %S.ast.Type, ptr %a105, i32 0, i32 0 + %t116 = load { ptr, i64, i64 }, ptr %t115 + store { ptr, i64, i64 } %t116, ptr %a117 + store { ptr, i64, i64 } { ptr @.str.4316, i64 4, i64 0 }, ptr %a118 + %t119 = call i32 @finch_str_eq(ptr %a117, ptr %a118) + %t120 = icmp ne i32 %t119, 0 + br label %logic.rend6716 +logic.rend6716: + br label %logic.end6715 +logic.end6715: + %t121 = phi i1 [ true, %logic.from6713 ], [ %t120, %logic.rend6716 ] + br label %logic.from6717 +logic.from6717: + br i1 %t121, label %logic.end6719, label %logic.rhs6718 +logic.rhs6718: + %t122 = getelementptr inbounds %S.ast.Type, ptr %a105, i32 0, i32 0 + %t123 = load { ptr, i64, i64 }, ptr %t122 + store { ptr, i64, i64 } %t123, ptr %a124 + store { ptr, i64, i64 } { ptr @.str.4317, i64 3, i64 0 }, ptr %a125 + %t126 = call i32 @finch_str_eq(ptr %a124, ptr %a125) + %t127 = icmp ne i32 %t126, 0 + br label %logic.rend6720 +logic.rend6720: + br label %logic.end6719 +logic.end6719: + %t128 = phi i1 [ true, %logic.from6717 ], [ %t127, %logic.rend6720 ] + br label %logic.from6721 +logic.from6721: + br i1 %t128, label %logic.end6723, label %logic.rhs6722 +logic.rhs6722: + %t129 = getelementptr inbounds %S.ast.Type, ptr %a105, i32 0, i32 0 + %t130 = load { ptr, i64, i64 }, ptr %t129 + store { ptr, i64, i64 } %t130, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.4318, i64 6, i64 0 }, ptr %a132 + %t133 = call i32 @finch_str_eq(ptr %a131, ptr %a132) + %t134 = icmp ne i32 %t133, 0 + br label %logic.from6724 +logic.from6724: + br i1 %t134, label %logic.rhs6725, label %logic.end6726 +logic.rhs6725: + %t135 = load ptr, ptr %a1 + %t136 = icmp eq ptr %t135, null + br i1 %t136, label %panic6727, label %ok6728 +panic6727: + call void @finch_panic(ptr @.str.4319, i64 3894, ptr @.str.4320) + unreachable +ok6728: + %t137 = getelementptr inbounds %S.gen.Gen, ptr %t135, i32 0, i32 15 + %t138 = load ptr, ptr %a1 + %t139 = getelementptr inbounds %S.ast.Type, ptr %a105, i32 0, i32 3 + %t140 = load { ptr, i64, i64 }, ptr %t139 + %t141 = getelementptr inbounds %S.ast.Type, ptr %a105, i32 0, i32 2 + %t142 = load { ptr, i64, i64 }, ptr %t141 + %t143 = call i64 @finch.gen.findStruct(ptr %t138, { ptr, i64, i64 } %t140, { ptr, i64, i64 } %t142) + %t144 = load { ptr, i64, i64 }, ptr %t137 + %t145 = extractvalue { ptr, i64, i64 } %t144, 1 + %t146 = icmp uge i64 %t143, %t145 + br i1 %t146, label %range6729, label %inrange6730 +range6729: + call void @finch_panic_index(ptr @.str.4321, i64 3894, i64 %t143, i64 %t145) + unreachable +inrange6730: + %t147 = extractvalue { ptr, i64, i64 } %t144, 0 + %t148 = getelementptr inbounds %S.gen.StructDef, ptr %t147, i64 %t143 + %t149 = getelementptr inbounds %S.gen.StructDef, ptr %t148, i32 0, i32 2 + %t150 = load i1, ptr %t149 + br label %logic.rend6731 +logic.rend6731: + br label %logic.end6726 +logic.end6726: + %t151 = phi i1 [ false, %logic.from6724 ], [ %t150, %logic.rend6731 ] + br label %logic.rend6732 +logic.rend6732: + br label %logic.end6723 +logic.end6723: + %t152 = phi i1 [ true, %logic.from6721 ], [ %t151, %logic.rend6732 ] + %t153 = xor i1 %t152, true + br i1 %t153, label %then6733, label %endif6735 +then6733: + %t154 = load ptr, ptr %a1 + %t155 = load %S.ast.Node, ptr %a3 + %t156 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 1 + %t157 = load { ptr, i64, i64 }, ptr %t156 + store { ptr, i64, i64 } { ptr @.str.4322, i64 5, i64 0 }, ptr %a159 + store { ptr, i64, i64 } %t157, ptr %a160 + call void @finch_str_concat(ptr %a158, ptr %a159, ptr %a160) + %t161 = load { ptr, i64, i64 }, ptr %a158 + store { ptr, i64, i64 } %t161, ptr %a163 + store { ptr, i64, i64 } { ptr @.str.4323, i64 95, i64 0 }, ptr %a164 + call void @finch_str_concat(ptr %a162, ptr %a163, ptr %a164) + %t165 = load { ptr, i64, i64 }, ptr %a162 + %t166 = load %S.ast.Type, ptr %a105 + %t167 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t166) + store { ptr, i64, i64 } %t165, ptr %a169 + store { ptr, i64, i64 } %t167, ptr %a170 + call void @finch_str_concat(ptr %a168, ptr %a169, ptr %a170) + %t171 = load { ptr, i64, i64 }, ptr %a168 + call void @finch.gen.fail(ptr %t154, %S.ast.Node %t155, { ptr, i64, i64 } %t171) + br label %endif6735 +endif6735: + br label %each.step6707 +each.step6707: + %t172 = load i64, ptr %a97 + %t173 = add i64 %t172, 1 + store i64 %t173, ptr %a97 + br label %each.cond6705 +each.end6708: + %t174 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t175 = load %S.ast.Type, ptr %t174 + %t176 = call i1 @finch.gen.isNumber(%S.ast.Type %t175) + br label %logic.from6736 +logic.from6736: + br i1 %t176, label %logic.end6738, label %logic.rhs6737 +logic.rhs6737: + %t177 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t178 = getelementptr inbounds %S.ast.Type, ptr %t177, i32 0, i32 0 + %t179 = load { ptr, i64, i64 }, ptr %t178 + store { ptr, i64, i64 } %t179, ptr %a180 + store { ptr, i64, i64 } { ptr @.str.4324, i64 4, i64 0 }, ptr %a181 + %t182 = call i32 @finch_str_eq(ptr %a180, ptr %a181) + %t183 = icmp ne i32 %t182, 0 + br label %logic.rend6739 +logic.rend6739: + br label %logic.end6738 +logic.end6738: + %t184 = phi i1 [ true, %logic.from6736 ], [ %t183, %logic.rend6739 ] + br label %logic.from6740 +logic.from6740: + br i1 %t184, label %logic.end6742, label %logic.rhs6741 +logic.rhs6741: + %t185 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t186 = getelementptr inbounds %S.ast.Type, ptr %t185, i32 0, i32 0 + %t187 = load { ptr, i64, i64 }, ptr %t186 + store { ptr, i64, i64 } %t187, ptr %a188 + store { ptr, i64, i64 } { ptr @.str.4325, i64 4, i64 0 }, ptr %a189 + %t190 = call i32 @finch_str_eq(ptr %a188, ptr %a189) + %t191 = icmp ne i32 %t190, 0 + br label %logic.rend6743 +logic.rend6743: + br label %logic.end6742 +logic.end6742: + %t192 = phi i1 [ true, %logic.from6740 ], [ %t191, %logic.rend6743 ] + br label %logic.from6744 +logic.from6744: + br i1 %t192, label %logic.end6746, label %logic.rhs6745 +logic.rhs6745: + %t193 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t194 = getelementptr inbounds %S.ast.Type, ptr %t193, i32 0, i32 0 + %t195 = load { ptr, i64, i64 }, ptr %t194 + store { ptr, i64, i64 } %t195, ptr %a196 + store { ptr, i64, i64 } { ptr @.str.4326, i64 3, i64 0 }, ptr %a197 + %t198 = call i32 @finch_str_eq(ptr %a196, ptr %a197) + %t199 = icmp ne i32 %t198, 0 + br label %logic.rend6747 +logic.rend6747: + br label %logic.end6746 +logic.end6746: + %t200 = phi i1 [ true, %logic.from6744 ], [ %t199, %logic.rend6747 ] + br label %logic.from6748 +logic.from6748: + br i1 %t200, label %logic.end6750, label %logic.rhs6749 +logic.rhs6749: + %t201 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t202 = getelementptr inbounds %S.ast.Type, ptr %t201, i32 0, i32 0 + %t203 = load { ptr, i64, i64 }, ptr %t202 + store { ptr, i64, i64 } %t203, ptr %a204 + store { ptr, i64, i64 } { ptr @.str.4327, i64 4, i64 0 }, ptr %a205 + %t206 = call i32 @finch_str_eq(ptr %a204, ptr %a205) + %t207 = icmp ne i32 %t206, 0 + br label %logic.rend6751 +logic.rend6751: + br label %logic.end6750 +logic.end6750: + %t208 = phi i1 [ true, %logic.from6748 ], [ %t207, %logic.rend6751 ] + br label %logic.from6752 +logic.from6752: + br i1 %t208, label %logic.end6754, label %logic.rhs6753 +logic.rhs6753: + %t209 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t210 = getelementptr inbounds %S.ast.Type, ptr %t209, i32 0, i32 0 + %t211 = load { ptr, i64, i64 }, ptr %t210 + store { ptr, i64, i64 } %t211, ptr %a212 + store { ptr, i64, i64 } { ptr @.str.4328, i64 6, i64 0 }, ptr %a213 + %t214 = call i32 @finch_str_eq(ptr %a212, ptr %a213) + %t215 = icmp ne i32 %t214, 0 + br label %logic.from6755 +logic.from6755: + br i1 %t215, label %logic.rhs6756, label %logic.end6757 +logic.rhs6756: + %t216 = load ptr, ptr %a1 + %t217 = icmp eq ptr %t216, null + br i1 %t217, label %panic6758, label %ok6759 +panic6758: + call void @finch_panic(ptr @.str.4329, i64 3898, ptr @.str.4330) + unreachable +ok6759: + %t218 = getelementptr inbounds %S.gen.Gen, ptr %t216, i32 0, i32 15 + %t219 = load ptr, ptr %a1 + %t220 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t221 = getelementptr inbounds %S.ast.Type, ptr %t220, i32 0, i32 3 + %t222 = load { ptr, i64, i64 }, ptr %t221 + %t223 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t224 = getelementptr inbounds %S.ast.Type, ptr %t223, i32 0, i32 2 + %t225 = load { ptr, i64, i64 }, ptr %t224 + %t226 = call i64 @finch.gen.findStruct(ptr %t219, { ptr, i64, i64 } %t222, { ptr, i64, i64 } %t225) + %t227 = load { ptr, i64, i64 }, ptr %t218 + %t228 = extractvalue { ptr, i64, i64 } %t227, 1 + %t229 = icmp uge i64 %t226, %t228 + br i1 %t229, label %range6760, label %inrange6761 +range6760: + call void @finch_panic_index(ptr @.str.4331, i64 3898, i64 %t226, i64 %t228) + unreachable +inrange6761: + %t230 = extractvalue { ptr, i64, i64 } %t227, 0 + %t231 = getelementptr inbounds %S.gen.StructDef, ptr %t230, i64 %t226 + %t232 = getelementptr inbounds %S.gen.StructDef, ptr %t231, i32 0, i32 2 + %t233 = load i1, ptr %t232 + br label %logic.rend6762 +logic.rend6762: + br label %logic.end6757 +logic.end6757: + %t234 = phi i1 [ false, %logic.from6755 ], [ %t233, %logic.rend6762 ] + br label %logic.rend6763 +logic.rend6763: + br label %logic.end6754 +logic.end6754: + %t235 = phi i1 [ true, %logic.from6752 ], [ %t234, %logic.rend6763 ] + %t236 = xor i1 %t235, true + br i1 %t236, label %then6764, label %endif6766 +then6764: + %t237 = load ptr, ptr %a1 + %t238 = load %S.ast.Node, ptr %a3 + %t239 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 1 + %t240 = load { ptr, i64, i64 }, ptr %t239 + store { ptr, i64, i64 } { ptr @.str.4332, i64 5, i64 0 }, ptr %a242 + store { ptr, i64, i64 } %t240, ptr %a243 + call void @finch_str_concat(ptr %a241, ptr %a242, ptr %a243) + %t244 = load { ptr, i64, i64 }, ptr %a241 + store { ptr, i64, i64 } %t244, ptr %a246 + store { ptr, i64, i64 } { ptr @.str.4333, i64 38, i64 0 }, ptr %a247 + call void @finch_str_concat(ptr %a245, ptr %a246, ptr %a247) + %t248 = load { ptr, i64, i64 }, ptr %a245 + %t249 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t250 = load %S.ast.Type, ptr %t249 + %t251 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t250) + store { ptr, i64, i64 } %t248, ptr %a253 + store { ptr, i64, i64 } %t251, ptr %a254 + call void @finch_str_concat(ptr %a252, ptr %a253, ptr %a254) + %t255 = load { ptr, i64, i64 }, ptr %a252 + call void @finch.gen.fail(ptr %t237, %S.ast.Node %t238, { ptr, i64, i64 } %t255) + br label %endif6766 +endif6766: + %t256 = load ptr, ptr %a1 + %t257 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t258 = load %S.ast.Type, ptr %t257 + %t259 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 13 + %t260 = load { ptr, i64, i64 }, ptr %t259 + %t261 = call %S.gen.Plan @finch.gen.makePlan(ptr %t256, %S.ast.Type %t258, { ptr, i64, i64 } %t260) + store %S.gen.Plan %t261, ptr %a262 + %t263 = load ptr, ptr %a1 + %t264 = call %S.gen.Saved @finch.gen.beginHelper(ptr %t263) + store %S.gen.Saved %t264, ptr %a265 + store { ptr, i64, i64 } zeroinitializer, ptr %a266 + store i64 0, ptr %a267 + store { ptr, i64, i64 } { ptr @.str.4334, i64 0, i64 0 }, ptr %a268 + %t269 = getelementptr inbounds %S.gen.Plan, ptr %a262, i32 0, i32 3 + %t270 = load i1, ptr %t269 + br i1 %t270, label %then6767, label %endif6769 +then6767: + %t271 = getelementptr inbounds { ptr, i64, i64 }, ptr %a266, i32 0, i32 1 + %t272 = load ptr, ptr %a1 + %t273 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t274 = load %S.ast.Type, ptr %t273 + %t275 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t272, %S.ast.Type %t274) + store { ptr, i64, i64 } { ptr @.str.4335, i64 9, i64 0 }, ptr %a277 + store { ptr, i64, i64 } %t275, ptr %a278 + call void @finch_str_concat(ptr %a276, ptr %a277, ptr %a278) + %t279 = load { ptr, i64, i64 }, ptr %a276 + store { ptr, i64, i64 } %t279, ptr %a281 + store { ptr, i64, i64 } { ptr @.str.4336, i64 14, i64 0 }, ptr %a282 + call void @finch_str_concat(ptr %a280, ptr %a281, ptr %a282) + %t283 = load { ptr, i64, i64 }, ptr %a280 + %t284 = load i64, ptr %t271 + %t285 = add i64 %t284, 1 + call void @finch_arr_reserve(ptr %a266, i64 %t285, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t286 = load ptr, ptr %a266 + %t287 = getelementptr inbounds { ptr, i64, i64 }, ptr %t286, i64 %t284 + store { ptr, i64, i64 } %t283, ptr %t287 + store i64 %t285, ptr %t271 + store { ptr, i64, i64 } { ptr @.str.4337, i64 3, i64 0 }, ptr %a268 + store i64 1, ptr %a267 + br label %endif6769 +endif6769: + store { ptr, i64, i64 } zeroinitializer, ptr %a288 + %t289 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 13 + %t290 = getelementptr inbounds { ptr, i64, i64 }, ptr %t289, i32 0, i32 1 + %t291 = load i64, ptr %t290 + store i64 0, ptr %a292 + br label %for.cond6770 +for.cond6770: + %t293 = load i64, ptr %a292 + %t294 = icmp slt i64 %t293, %t291 + br i1 %t294, label %for.body6771, label %for.end6773 +for.body6771: + %t295 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 13 + %t296 = load i64, ptr %a292 + %t297 = load { ptr, i64, i64 }, ptr %t295 + %t298 = extractvalue { ptr, i64, i64 } %t297, 1 + %t299 = icmp uge i64 %t296, %t298 + br i1 %t299, label %range6774, label %inrange6775 +range6774: + call void @finch_panic_index(ptr @.str.4338, i64 3913, i64 %t296, i64 %t298) + unreachable +inrange6775: + %t300 = extractvalue { ptr, i64, i64 } %t297, 0 + %t301 = getelementptr inbounds %S.ast.Type, ptr %t300, i64 %t296 + %t302 = load %S.ast.Type, ptr %t301 + store %S.ast.Type %t302, ptr %a303 + call void @finch.copy.S_ast_Type(ptr %a304, ptr %a303) + %t305 = load %S.ast.Type, ptr %a304 + store %S.ast.Type %t305, ptr %a306 + %t307 = getelementptr inbounds %S.gen.Plan, ptr %a262, i32 0, i32 1 + %t308 = load i64, ptr %a292 + %t309 = load { ptr, i64, i64 }, ptr %t307 + %t310 = extractvalue { ptr, i64, i64 } %t309, 1 + %t311 = icmp uge i64 %t308, %t310 + br i1 %t311, label %range6776, label %inrange6777 +range6776: + call void @finch_panic_index(ptr @.str.4339, i64 3914, i64 %t308, i64 %t310) + unreachable +inrange6777: + %t312 = extractvalue { ptr, i64, i64 } %t309, 0 + %t313 = getelementptr inbounds %S.gen.Abi, ptr %t312, i64 %t308 + %t314 = load %S.gen.Abi, ptr %t313 + store %S.gen.Abi %t314, ptr %a315 + call void @finch.copy.S_gen_Abi(ptr %a316, ptr %a315) + %t317 = load %S.gen.Abi, ptr %a316 + store %S.gen.Abi %t317, ptr %a318 + %t319 = getelementptr inbounds %S.gen.Abi, ptr %a318, i32 0, i32 0 + %t320 = load { ptr, i64, i64 }, ptr %t319 + store { ptr, i64, i64 } %t320, ptr %a321 + store { ptr, i64, i64 } { ptr @.str.4340, i64 6, i64 0 }, ptr %a322 + %t323 = call i32 @finch_str_eq(ptr %a321, ptr %a322) + %t324 = icmp ne i32 %t323, 0 + br i1 %t324, label %then6778, label %else6779 +then6778: + %t325 = getelementptr inbounds { ptr, i64, i64 }, ptr %a266, i32 0, i32 1 + %t326 = load ptr, ptr %a1 + %t327 = load %S.ast.Type, ptr %a306 + %t328 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t326, %S.ast.Type %t327) + store { ptr, i64, i64 } { ptr @.str.4341, i64 10, i64 0 }, ptr %a330 + store { ptr, i64, i64 } %t328, ptr %a331 + call void @finch_str_concat(ptr %a329, ptr %a330, ptr %a331) + %t332 = load { ptr, i64, i64 }, ptr %a329 + store { ptr, i64, i64 } %t332, ptr %a334 + store { ptr, i64, i64 } { ptr @.str.4342, i64 8, i64 0 }, ptr %a335 + call void @finch_str_concat(ptr %a333, ptr %a334, ptr %a335) + %t336 = load { ptr, i64, i64 }, ptr %a333 + %t337 = getelementptr inbounds %S.gen.Abi, ptr %a318, i32 0, i32 3 + %t338 = load i64, ptr %t337 + call void @finch_str_from_int(ptr %a339, i64 %t338) + %t340 = load { ptr, i64, i64 }, ptr %a339 + store { ptr, i64, i64 } %t336, ptr %a342 + store { ptr, i64, i64 } %t340, ptr %a343 + call void @finch_str_concat(ptr %a341, ptr %a342, ptr %a343) + %t344 = load { ptr, i64, i64 }, ptr %a341 + store { ptr, i64, i64 } %t344, ptr %a346 + store { ptr, i64, i64 } { ptr @.str.4343, i64 3, i64 0 }, ptr %a347 + call void @finch_str_concat(ptr %a345, ptr %a346, ptr %a347) + %t348 = load { ptr, i64, i64 }, ptr %a345 + %t349 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a350, i64 %t349) + %t351 = load { ptr, i64, i64 }, ptr %a350 + store { ptr, i64, i64 } %t348, ptr %a353 + store { ptr, i64, i64 } %t351, ptr %a354 + call void @finch_str_concat(ptr %a352, ptr %a353, ptr %a354) + %t355 = load { ptr, i64, i64 }, ptr %a352 + %t356 = load i64, ptr %t325 + %t357 = add i64 %t356, 1 + call void @finch_arr_reserve(ptr %a266, i64 %t357, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t358 = load ptr, ptr %a266 + %t359 = getelementptr inbounds { ptr, i64, i64 }, ptr %t358, i64 %t356 + store { ptr, i64, i64 } %t355, ptr %t359 + store i64 %t357, ptr %t325 + %t360 = getelementptr inbounds { ptr, i64, i64 }, ptr %a288, i32 0, i32 1 + %t361 = load ptr, ptr %a1 + %t362 = load %S.ast.Type, ptr %a306 + %t363 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t361, %S.ast.Type %t362) + store { ptr, i64, i64 } %t363, ptr %a365 + store { ptr, i64, i64 } { ptr @.str.4344, i64 1, i64 0 }, ptr %a366 + call void @finch_str_concat(ptr %a364, ptr %a365, ptr %a366) + %t367 = load { ptr, i64, i64 }, ptr %a364 + %t368 = load ptr, ptr %a1 + %t369 = load ptr, ptr %a1 + %t370 = load %S.ast.Type, ptr %a306 + %t371 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t369, %S.ast.Type %t370) + %t372 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a373, i64 %t372) + %t374 = load { ptr, i64, i64 }, ptr %a373 + store { ptr, i64, i64 } { ptr @.str.4345, i64 2, i64 0 }, ptr %a376 + store { ptr, i64, i64 } %t374, ptr %a377 + call void @finch_str_concat(ptr %a375, ptr %a376, ptr %a377) + %t378 = load { ptr, i64, i64 }, ptr %a375 + %t379 = call { ptr, i64, i64 } @finch.gen.load(ptr %t368, { ptr, i64, i64 } %t371, { ptr, i64, i64 } %t378) + store { ptr, i64, i64 } %t367, ptr %a381 + store { ptr, i64, i64 } %t379, ptr %a382 + call void @finch_str_concat(ptr %a380, ptr %a381, ptr %a382) + %t383 = load { ptr, i64, i64 }, ptr %a380 + %t384 = load i64, ptr %t360 + %t385 = add i64 %t384, 1 + call void @finch_arr_reserve(ptr %a288, i64 %t385, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t386 = load ptr, ptr %a288 + %t387 = getelementptr inbounds { ptr, i64, i64 }, ptr %t386, i64 %t384 + store { ptr, i64, i64 } %t383, ptr %t387 + store i64 %t385, ptr %t360 + %t388 = load i64, ptr %a267 + %t389 = add i64 %t388, 1 + store i64 %t389, ptr %a267 + br label %endif6780 +else6779: + %t390 = getelementptr inbounds %S.gen.Abi, ptr %a318, i32 0, i32 0 + %t391 = load { ptr, i64, i64 }, ptr %t390 + store { ptr, i64, i64 } %t391, ptr %a392 + store { ptr, i64, i64 } { ptr @.str.4346, i64 8, i64 0 }, ptr %a393 + %t394 = call i32 @finch_str_eq(ptr %a392, ptr %a393) + %t395 = icmp ne i32 %t394, 0 + br i1 %t395, label %then6781, label %else6782 +then6781: + %t396 = getelementptr inbounds { ptr, i64, i64 }, ptr %a266, i32 0, i32 1 + %t397 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a398, i64 %t397) + %t399 = load { ptr, i64, i64 }, ptr %a398 + store { ptr, i64, i64 } { ptr @.str.4347, i64 6, i64 0 }, ptr %a401 + store { ptr, i64, i64 } %t399, ptr %a402 + call void @finch_str_concat(ptr %a400, ptr %a401, ptr %a402) + %t403 = load { ptr, i64, i64 }, ptr %a400 + %t404 = load i64, ptr %t396 + %t405 = add i64 %t404, 1 + call void @finch_arr_reserve(ptr %a266, i64 %t405, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t406 = load ptr, ptr %a266 + %t407 = getelementptr inbounds { ptr, i64, i64 }, ptr %t406, i64 %t404 + store { ptr, i64, i64 } %t403, ptr %t407 + store i64 %t405, ptr %t396 + %t408 = getelementptr inbounds { ptr, i64, i64 }, ptr %a288, i32 0, i32 1 + %t409 = load ptr, ptr %a1 + %t410 = load %S.ast.Type, ptr %a306 + %t411 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t409, %S.ast.Type %t410) + store { ptr, i64, i64 } %t411, ptr %a413 + store { ptr, i64, i64 } { ptr @.str.4348, i64 1, i64 0 }, ptr %a414 + call void @finch_str_concat(ptr %a412, ptr %a413, ptr %a414) + %t415 = load { ptr, i64, i64 }, ptr %a412 + %t416 = load ptr, ptr %a1 + %t417 = load ptr, ptr %a1 + %t418 = load %S.ast.Type, ptr %a306 + %t419 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t417, %S.ast.Type %t418) + %t420 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a421, i64 %t420) + %t422 = load { ptr, i64, i64 }, ptr %a421 + store { ptr, i64, i64 } { ptr @.str.4349, i64 2, i64 0 }, ptr %a424 + store { ptr, i64, i64 } %t422, ptr %a425 + call void @finch_str_concat(ptr %a423, ptr %a424, ptr %a425) + %t426 = load { ptr, i64, i64 }, ptr %a423 + %t427 = call { ptr, i64, i64 } @finch.gen.load(ptr %t416, { ptr, i64, i64 } %t419, { ptr, i64, i64 } %t426) + store { ptr, i64, i64 } %t415, ptr %a429 + store { ptr, i64, i64 } %t427, ptr %a430 + call void @finch_str_concat(ptr %a428, ptr %a429, ptr %a430) + %t431 = load { ptr, i64, i64 }, ptr %a428 + %t432 = load i64, ptr %t408 + %t433 = add i64 %t432, 1 + call void @finch_arr_reserve(ptr %a288, i64 %t433, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t434 = load ptr, ptr %a288 + %t435 = getelementptr inbounds { ptr, i64, i64 }, ptr %t434, i64 %t432 + store { ptr, i64, i64 } %t431, ptr %t435 + store i64 %t433, ptr %t408 + %t436 = load i64, ptr %a267 + %t437 = add i64 %t436, 1 + store i64 %t437, ptr %a267 + br label %endif6783 +else6782: + %t438 = getelementptr inbounds %S.gen.Abi, ptr %a318, i32 0, i32 0 + %t439 = load { ptr, i64, i64 }, ptr %t438 + store { ptr, i64, i64 } %t439, ptr %a440 + store { ptr, i64, i64 } { ptr @.str.4350, i64 6, i64 0 }, ptr %a441 + %t442 = call i32 @finch_str_eq(ptr %a440, ptr %a441) + %t443 = icmp ne i32 %t442, 0 + br i1 %t443, label %then6784, label %else6785 +then6784: + %t444 = load ptr, ptr %a1 + %t445 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t444, { ptr, i64, i64 } { ptr @.str.4351, i64 9, i64 0 }) + store { ptr, i64, i64 } %t445, ptr %a446 + %t447 = getelementptr inbounds %S.gen.Abi, ptr %a318, i32 0, i32 1 + %t448 = getelementptr inbounds { ptr, i64, i64 }, ptr %t447, i32 0, i32 1 + %t449 = load i64, ptr %t448 + store i64 0, ptr %a450 + br label %for.cond6787 +for.cond6787: + %t451 = load i64, ptr %a450 + %t452 = icmp slt i64 %t451, %t449 + br i1 %t452, label %for.body6788, label %for.end6790 +for.body6788: + %t453 = getelementptr inbounds { ptr, i64, i64 }, ptr %a266, i32 0, i32 1 + %t454 = getelementptr inbounds %S.gen.Abi, ptr %a318, i32 0, i32 1 + %t455 = load i64, ptr %a450 + %t456 = load { ptr, i64, i64 }, ptr %t454 + %t457 = extractvalue { ptr, i64, i64 } %t456, 1 + %t458 = icmp uge i64 %t455, %t457 + br i1 %t458, label %range6791, label %inrange6792 +range6791: + call void @finch_panic_index(ptr @.str.4352, i64 3926, i64 %t455, i64 %t457) + unreachable +inrange6792: + %t459 = extractvalue { ptr, i64, i64 } %t456, 0 + %t460 = getelementptr inbounds { ptr, i64, i64 }, ptr %t459, i64 %t455 + %t461 = load { ptr, i64, i64 }, ptr %t460 + store { ptr, i64, i64 } %t461, ptr %a463 + store { ptr, i64, i64 } { ptr @.str.4353, i64 3, i64 0 }, ptr %a464 + call void @finch_str_concat(ptr %a462, ptr %a463, ptr %a464) + %t465 = load { ptr, i64, i64 }, ptr %a462 + %t466 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a467, i64 %t466) + %t468 = load { ptr, i64, i64 }, ptr %a467 + store { ptr, i64, i64 } %t465, ptr %a470 + store { ptr, i64, i64 } %t468, ptr %a471 + call void @finch_str_concat(ptr %a469, ptr %a470, ptr %a471) + %t472 = load { ptr, i64, i64 }, ptr %a469 + %t473 = load i64, ptr %t453 + %t474 = add i64 %t473, 1 + call void @finch_arr_reserve(ptr %a266, i64 %t474, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t475 = load ptr, ptr %a266 + %t476 = getelementptr inbounds { ptr, i64, i64 }, ptr %t475, i64 %t473 + store { ptr, i64, i64 } %t472, ptr %t476 + store i64 %t474, ptr %t453 + %t477 = load ptr, ptr %a1 + %t478 = getelementptr inbounds %S.gen.Abi, ptr %a318, i32 0, i32 1 + %t479 = load i64, ptr %a450 + %t480 = load { ptr, i64, i64 }, ptr %t478 + %t481 = extractvalue { ptr, i64, i64 } %t480, 1 + %t482 = icmp uge i64 %t479, %t481 + br i1 %t482, label %range6793, label %inrange6794 +range6793: + call void @finch_panic_index(ptr @.str.4354, i64 3927, i64 %t479, i64 %t481) + unreachable +inrange6794: + %t483 = extractvalue { ptr, i64, i64 } %t480, 0 + %t484 = getelementptr inbounds { ptr, i64, i64 }, ptr %t483, i64 %t479 + %t485 = load { ptr, i64, i64 }, ptr %t484 + %t486 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a487, i64 %t486) + %t488 = load { ptr, i64, i64 }, ptr %a487 + store { ptr, i64, i64 } { ptr @.str.4355, i64 2, i64 0 }, ptr %a490 + store { ptr, i64, i64 } %t488, ptr %a491 + call void @finch_str_concat(ptr %a489, ptr %a490, ptr %a491) + %t492 = load { ptr, i64, i64 }, ptr %a489 + %t493 = load ptr, ptr %a1 + %t494 = load { ptr, i64, i64 }, ptr %a446 + store { ptr, i64, i64 } { ptr @.str.4356, i64 31, i64 0 }, ptr %a496 + store { ptr, i64, i64 } %t494, ptr %a497 + call void @finch_str_concat(ptr %a495, ptr %a496, ptr %a497) + %t498 = load { ptr, i64, i64 }, ptr %a495 + store { ptr, i64, i64 } %t498, ptr %a500 + store { ptr, i64, i64 } { ptr @.str.4357, i64 6, i64 0 }, ptr %a501 + call void @finch_str_concat(ptr %a499, ptr %a500, ptr %a501) + %t502 = load { ptr, i64, i64 }, ptr %a499 + %t503 = load i64, ptr %a450 + %t504 = mul i64 8, %t503 + call void @finch_str_from_int(ptr %a505, i64 %t504) + %t506 = load { ptr, i64, i64 }, ptr %a505 + store { ptr, i64, i64 } %t502, ptr %a508 + store { ptr, i64, i64 } %t506, ptr %a509 + call void @finch_str_concat(ptr %a507, ptr %a508, ptr %a509) + %t510 = load { ptr, i64, i64 }, ptr %a507 + %t511 = call { ptr, i64, i64 } @finch.gen.op(ptr %t493, { ptr, i64, i64 } %t510) + call void @finch.gen.store(ptr %t477, { ptr, i64, i64 } %t485, { ptr, i64, i64 } %t492, { ptr, i64, i64 } %t511) + %t512 = load i64, ptr %a267 + %t513 = add i64 %t512, 1 + store i64 %t513, ptr %a267 + br label %for.step6789 +for.step6789: + %t514 = load i64, ptr %a450 + %t515 = add i64 %t514, 1 + store i64 %t515, ptr %a450 + br label %for.cond6787 +for.end6790: + %t516 = getelementptr inbounds { ptr, i64, i64 }, ptr %a288, i32 0, i32 1 + %t517 = load ptr, ptr %a1 + %t518 = load %S.ast.Type, ptr %a306 + %t519 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t517, %S.ast.Type %t518) + store { ptr, i64, i64 } %t519, ptr %a521 + store { ptr, i64, i64 } { ptr @.str.4358, i64 1, i64 0 }, ptr %a522 + call void @finch_str_concat(ptr %a520, ptr %a521, ptr %a522) + %t523 = load { ptr, i64, i64 }, ptr %a520 + %t524 = load ptr, ptr %a1 + %t525 = load ptr, ptr %a1 + %t526 = load %S.ast.Type, ptr %a306 + %t527 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t525, %S.ast.Type %t526) + %t528 = load { ptr, i64, i64 }, ptr %a446 + %t529 = call { ptr, i64, i64 } @finch.gen.load(ptr %t524, { ptr, i64, i64 } %t527, { ptr, i64, i64 } %t528) + store { ptr, i64, i64 } %t523, ptr %a531 + store { ptr, i64, i64 } %t529, ptr %a532 + call void @finch_str_concat(ptr %a530, ptr %a531, ptr %a532) + %t533 = load { ptr, i64, i64 }, ptr %a530 + %t534 = load i64, ptr %t516 + %t535 = add i64 %t534, 1 + call void @finch_arr_reserve(ptr %a288, i64 %t535, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t536 = load ptr, ptr %a288 + %t537 = getelementptr inbounds { ptr, i64, i64 }, ptr %t536, i64 %t534 + store { ptr, i64, i64 } %t533, ptr %t537 + store i64 %t535, ptr %t516 + br label %endif6786 +else6785: + %t538 = getelementptr inbounds { ptr, i64, i64 }, ptr %a266, i32 0, i32 1 + %t539 = load ptr, ptr %a1 + %t540 = load %S.ast.Type, ptr %a306 + %t541 = call { ptr, i64, i64 } @finch.gen.cLL(ptr %t539, %S.ast.Type %t540) + %t542 = load ptr, ptr %a1 + %t543 = load %S.ast.Type, ptr %a306 + %t544 = call { ptr, i64, i64 } @finch.gen.cExt(ptr %t542, %S.ast.Type %t543) + store { ptr, i64, i64 } %t541, ptr %a546 + store { ptr, i64, i64 } %t544, ptr %a547 + call void @finch_str_concat(ptr %a545, ptr %a546, ptr %a547) + %t548 = load { ptr, i64, i64 }, ptr %a545 + store { ptr, i64, i64 } %t548, ptr %a550 + store { ptr, i64, i64 } { ptr @.str.4359, i64 3, i64 0 }, ptr %a551 + call void @finch_str_concat(ptr %a549, ptr %a550, ptr %a551) + %t552 = load { ptr, i64, i64 }, ptr %a549 + %t553 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a554, i64 %t553) + %t555 = load { ptr, i64, i64 }, ptr %a554 + store { ptr, i64, i64 } %t552, ptr %a557 + store { ptr, i64, i64 } %t555, ptr %a558 + call void @finch_str_concat(ptr %a556, ptr %a557, ptr %a558) + %t559 = load { ptr, i64, i64 }, ptr %a556 + %t560 = load i64, ptr %t538 + %t561 = add i64 %t560, 1 + call void @finch_arr_reserve(ptr %a266, i64 %t561, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t562 = load ptr, ptr %a266 + %t563 = getelementptr inbounds { ptr, i64, i64 }, ptr %t562, i64 %t560 + store { ptr, i64, i64 } %t559, ptr %t563 + store i64 %t561, ptr %t538 + %t564 = getelementptr inbounds { ptr, i64, i64 }, ptr %a288, i32 0, i32 1 + %t565 = load ptr, ptr %a1 + %t566 = load %S.ast.Type, ptr %a306 + %t567 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t565, %S.ast.Type %t566) + store { ptr, i64, i64 } %t567, ptr %a569 + store { ptr, i64, i64 } { ptr @.str.4360, i64 3, i64 0 }, ptr %a570 + call void @finch_str_concat(ptr %a568, ptr %a569, ptr %a570) + %t571 = load { ptr, i64, i64 }, ptr %a568 + %t572 = load i64, ptr %a267 + call void @finch_str_from_int(ptr %a573, i64 %t572) + %t574 = load { ptr, i64, i64 }, ptr %a573 + store { ptr, i64, i64 } %t571, ptr %a576 + store { ptr, i64, i64 } %t574, ptr %a577 + call void @finch_str_concat(ptr %a575, ptr %a576, ptr %a577) + %t578 = load { ptr, i64, i64 }, ptr %a575 + %t579 = load i64, ptr %t564 + %t580 = add i64 %t579, 1 + call void @finch_arr_reserve(ptr %a288, i64 %t580, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t581 = load ptr, ptr %a288 + %t582 = getelementptr inbounds { ptr, i64, i64 }, ptr %t581, i64 %t579 + store { ptr, i64, i64 } %t578, ptr %t582 + store i64 %t580, ptr %t564 + %t583 = load i64, ptr %a267 + %t584 = add i64 %t583, 1 + store i64 %t584, ptr %a267 + br label %endif6786 +endif6786: + br label %endif6783 +endif6783: + br label %endif6780 +endif6780: + br label %for.step6772 +for.step6772: + %t585 = load i64, ptr %a292 + %t586 = add i64 %t585, 1 + store i64 %t586, ptr %a292 + br label %for.cond6770 +for.end6773: + %t587 = load ptr, ptr %a1 + %t588 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t589 = load %S.ast.Type, ptr %t588 + %t590 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t587, %S.ast.Type %t589) + store { ptr, i64, i64 } { ptr @.str.4361, i64 5, i64 0 }, ptr %a592 + store { ptr, i64, i64 } %t590, ptr %a593 + call void @finch_str_concat(ptr %a591, ptr %a592, ptr %a593) + %t594 = load { ptr, i64, i64 }, ptr %a591 + store { ptr, i64, i64 } %t594, ptr %a596 + store { ptr, i64, i64 } { ptr @.str.4362, i64 1, i64 0 }, ptr %a597 + call void @finch_str_concat(ptr %a595, ptr %a596, ptr %a597) + %t598 = load { ptr, i64, i64 }, ptr %a595 + %t599 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 11 + %t600 = load { ptr, i64, i64 }, ptr %t599 + store { ptr, i64, i64 } %t598, ptr %a602 + store { ptr, i64, i64 } %t600, ptr %a603 + call void @finch_str_concat(ptr %a601, ptr %a602, ptr %a603) + %t604 = load { ptr, i64, i64 }, ptr %a601 + store { ptr, i64, i64 } %t604, ptr %a606 + store { ptr, i64, i64 } { ptr @.str.4363, i64 1, i64 0 }, ptr %a607 + call void @finch_str_concat(ptr %a605, ptr %a606, ptr %a607) + %t608 = load { ptr, i64, i64 }, ptr %a605 + %t609 = getelementptr inbounds { ptr, i64, i64 }, ptr %a288, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4364, i64 2, i64 0 }, ptr %a610 + call void @finch_str_join(ptr %a611, ptr %a288, ptr %a610) + %t612 = load { ptr, i64, i64 }, ptr %a611 + store { ptr, i64, i64 } %t608, ptr %a614 + store { ptr, i64, i64 } %t612, ptr %a615 + call void @finch_str_concat(ptr %a613, ptr %a614, ptr %a615) + %t616 = load { ptr, i64, i64 }, ptr %a613 + store { ptr, i64, i64 } %t616, ptr %a618 + store { ptr, i64, i64 } { ptr @.str.4365, i64 1, i64 0 }, ptr %a619 + call void @finch_str_concat(ptr %a617, ptr %a618, ptr %a619) + %t620 = load { ptr, i64, i64 }, ptr %a617 + store { ptr, i64, i64 } %t620, ptr %a621 + store { ptr, i64, i64 } { ptr @.str.4366, i64 0, i64 0 }, ptr %a622 + %t623 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t624 = getelementptr inbounds %S.ast.Type, ptr %t623, i32 0, i32 0 + %t625 = load { ptr, i64, i64 }, ptr %t624 + store { ptr, i64, i64 } %t625, ptr %a626 + store { ptr, i64, i64 } { ptr @.str.4367, i64 4, i64 0 }, ptr %a627 + %t628 = call i32 @finch_str_eq(ptr %a626, ptr %a627) + %t629 = icmp ne i32 %t628, 0 + br i1 %t629, label %then6795, label %else6796 +then6795: + %t630 = load ptr, ptr %a1 + %t631 = load { ptr, i64, i64 }, ptr %a621 + call void @finch.gen.emit(ptr %t630, { ptr, i64, i64 } %t631) + %t632 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t632, { ptr, i64, i64 } { ptr @.str.4368, i64 8, i64 0 }) + br label %endif6797 +else6796: + %t633 = getelementptr inbounds %S.gen.Plan, ptr %a262, i32 0, i32 3 + %t634 = load i1, ptr %t633 + br i1 %t634, label %then6798, label %else6799 +then6798: + %t635 = load ptr, ptr %a1 + %t636 = load ptr, ptr %a1 + %t637 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t638 = load %S.ast.Type, ptr %t637 + %t639 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t636, %S.ast.Type %t638) + %t640 = load ptr, ptr %a1 + %t641 = load { ptr, i64, i64 }, ptr %a621 + %t642 = call { ptr, i64, i64 } @finch.gen.op(ptr %t640, { ptr, i64, i64 } %t641) + %t643 = load { ptr, i64, i64 }, ptr %a268 + call void @finch.gen.store(ptr %t635, { ptr, i64, i64 } %t639, { ptr, i64, i64 } %t642, { ptr, i64, i64 } %t643) + %t644 = load ptr, ptr %a1 + call void @finch.gen.emit(ptr %t644, { ptr, i64, i64 } { ptr @.str.4369, i64 8, i64 0 }) + br label %endif6800 +else6799: + %t645 = getelementptr inbounds %S.gen.Plan, ptr %a262, i32 0, i32 0 + %t646 = getelementptr inbounds %S.gen.Abi, ptr %t645, i32 0, i32 0 + %t647 = load { ptr, i64, i64 }, ptr %t646 + store { ptr, i64, i64 } %t647, ptr %a648 + store { ptr, i64, i64 } { ptr @.str.4370, i64 6, i64 0 }, ptr %a649 + %t650 = call i32 @finch_str_eq(ptr %a648, ptr %a649) + %t651 = icmp ne i32 %t650, 0 + br i1 %t651, label %then6801, label %else6802 +then6801: + %t652 = load ptr, ptr %a1 + %t653 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t652, { ptr, i64, i64 } { ptr @.str.4371, i64 9, i64 0 }) + store { ptr, i64, i64 } %t653, ptr %a654 + %t655 = load ptr, ptr %a1 + %t656 = load ptr, ptr %a1 + %t657 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t658 = load %S.ast.Type, ptr %t657 + %t659 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t656, %S.ast.Type %t658) + %t660 = load ptr, ptr %a1 + %t661 = load { ptr, i64, i64 }, ptr %a621 + %t662 = call { ptr, i64, i64 } @finch.gen.op(ptr %t660, { ptr, i64, i64 } %t661) + %t663 = load { ptr, i64, i64 }, ptr %a654 + call void @finch.gen.store(ptr %t655, { ptr, i64, i64 } %t659, { ptr, i64, i64 } %t662, { ptr, i64, i64 } %t663) + %t664 = load ptr, ptr %a1 + %t665 = getelementptr inbounds %S.gen.Plan, ptr %a262, i32 0, i32 0 + %t666 = getelementptr inbounds %S.gen.Abi, ptr %t665, i32 0, i32 2 + %t667 = load { ptr, i64, i64 }, ptr %t666 + store { ptr, i64, i64 } { ptr @.str.4372, i64 4, i64 0 }, ptr %a669 + store { ptr, i64, i64 } %t667, ptr %a670 + call void @finch_str_concat(ptr %a668, ptr %a669, ptr %a670) + %t671 = load { ptr, i64, i64 }, ptr %a668 + store { ptr, i64, i64 } %t671, ptr %a673 + store { ptr, i64, i64 } { ptr @.str.4373, i64 1, i64 0 }, ptr %a674 + call void @finch_str_concat(ptr %a672, ptr %a673, ptr %a674) + %t675 = load { ptr, i64, i64 }, ptr %a672 + %t676 = load ptr, ptr %a1 + %t677 = getelementptr inbounds %S.gen.Plan, ptr %a262, i32 0, i32 0 + %t678 = getelementptr inbounds %S.gen.Abi, ptr %t677, i32 0, i32 2 + %t679 = load { ptr, i64, i64 }, ptr %t678 + %t680 = load { ptr, i64, i64 }, ptr %a654 + %t681 = call { ptr, i64, i64 } @finch.gen.load(ptr %t676, { ptr, i64, i64 } %t679, { ptr, i64, i64 } %t680) + store { ptr, i64, i64 } %t675, ptr %a683 + store { ptr, i64, i64 } %t681, ptr %a684 + call void @finch_str_concat(ptr %a682, ptr %a683, ptr %a684) + %t685 = load { ptr, i64, i64 }, ptr %a682 + call void @finch.gen.emit(ptr %t664, { ptr, i64, i64 } %t685) + br label %endif6803 +else6802: + %t686 = load ptr, ptr %a1 + %t687 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t688 = load %S.ast.Type, ptr %t687 + %t689 = call { ptr, i64, i64 } @finch.gen.cExt(ptr %t686, %S.ast.Type %t688) + store { ptr, i64, i64 } %t689, ptr %a622 + %t690 = load ptr, ptr %a1 + %t691 = load ptr, ptr %a1 + %t692 = getelementptr inbounds %S.gen.FnSig, ptr %a17, i32 0, i32 12 + %t693 = load %S.ast.Type, ptr %t692 + %t694 = call { ptr, i64, i64 } @finch.gen.cLL(ptr %t691, %S.ast.Type %t693) + store { ptr, i64, i64 } { ptr @.str.4374, i64 4, i64 0 }, ptr %a696 + store { ptr, i64, i64 } %t694, ptr %a697 + call void @finch_str_concat(ptr %a695, ptr %a696, ptr %a697) + %t698 = load { ptr, i64, i64 }, ptr %a695 + store { ptr, i64, i64 } %t698, ptr %a700 + store { ptr, i64, i64 } { ptr @.str.4375, i64 1, i64 0 }, ptr %a701 + call void @finch_str_concat(ptr %a699, ptr %a700, ptr %a701) + %t702 = load { ptr, i64, i64 }, ptr %a699 + %t703 = load ptr, ptr %a1 + %t704 = load { ptr, i64, i64 }, ptr %a621 + %t705 = call { ptr, i64, i64 } @finch.gen.op(ptr %t703, { ptr, i64, i64 } %t704) + store { ptr, i64, i64 } %t702, ptr %a707 + store { ptr, i64, i64 } %t705, ptr %a708 + call void @finch_str_concat(ptr %a706, ptr %a707, ptr %a708) + %t709 = load { ptr, i64, i64 }, ptr %a706 + call void @finch.gen.emit(ptr %t690, { ptr, i64, i64 } %t709) + br label %endif6803 +endif6803: + br label %endif6800 +endif6800: + br label %endif6797 +endif6797: + %t710 = load ptr, ptr %a1 + %t711 = load %S.gen.Saved, ptr %a265 + %t712 = load { ptr, i64, i64 }, ptr %a622 + store { ptr, i64, i64 } { ptr @.str.4376, i64 15, i64 0 }, ptr %a714 + store { ptr, i64, i64 } %t712, ptr %a715 + call void @finch_str_concat(ptr %a713, ptr %a714, ptr %a715) + %t716 = load { ptr, i64, i64 }, ptr %a713 + store { ptr, i64, i64 } %t716, ptr %a718 + store { ptr, i64, i64 } { ptr @.str.4377, i64 1, i64 0 }, ptr %a719 + call void @finch_str_concat(ptr %a717, ptr %a718, ptr %a719) + %t720 = load { ptr, i64, i64 }, ptr %a717 + %t721 = getelementptr inbounds %S.gen.Plan, ptr %a262, i32 0, i32 2 + %t722 = load { ptr, i64, i64 }, ptr %t721 + store { ptr, i64, i64 } %t720, ptr %a724 + store { ptr, i64, i64 } %t722, ptr %a725 + call void @finch_str_concat(ptr %a723, ptr %a724, ptr %a725) + %t726 = load { ptr, i64, i64 }, ptr %a723 + store { ptr, i64, i64 } %t726, ptr %a728 + store { ptr, i64, i64 } { ptr @.str.4378, i64 1, i64 0 }, ptr %a729 + call void @finch_str_concat(ptr %a727, ptr %a728, ptr %a729) + %t730 = load { ptr, i64, i64 }, ptr %a727 + %t731 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t730, ptr %a733 + store { ptr, i64, i64 } %t731, ptr %a734 + call void @finch_str_concat(ptr %a732, ptr %a733, ptr %a734) + %t735 = load { ptr, i64, i64 }, ptr %a732 + store { ptr, i64, i64 } %t735, ptr %a737 + store { ptr, i64, i64 } { ptr @.str.4379, i64 1, i64 0 }, ptr %a738 + call void @finch_str_concat(ptr %a736, ptr %a737, ptr %a738) + %t739 = load { ptr, i64, i64 }, ptr %a736 + %t740 = getelementptr inbounds { ptr, i64, i64 }, ptr %a266, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4380, i64 2, i64 0 }, ptr %a741 + call void @finch_str_join(ptr %a742, ptr %a266, ptr %a741) + %t743 = load { ptr, i64, i64 }, ptr %a742 + store { ptr, i64, i64 } %t739, ptr %a745 + store { ptr, i64, i64 } %t743, ptr %a746 + call void @finch_str_concat(ptr %a744, ptr %a745, ptr %a746) + %t747 = load { ptr, i64, i64 }, ptr %a744 + store { ptr, i64, i64 } %t747, ptr %a749 + store { ptr, i64, i64 } { ptr @.str.4381, i64 1, i64 0 }, ptr %a750 + call void @finch_str_concat(ptr %a748, ptr %a749, ptr %a750) + %t751 = load { ptr, i64, i64 }, ptr %a748 + call void @finch.gen.endHelper(ptr %t710, %S.gen.Saved %t711, { ptr, i64, i64 } %t751) + %t752 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t752, ptr %a753 + call void @finch_str_copy(ptr %a754, ptr %a753) + %t755 = load { ptr, i64, i64 }, ptr %a754 + ret { ptr, i64, i64 } %t755 +} + +define internal %S.gen.Val @finch.gen.enumFrom(ptr %p0, %S.ast.Node %p1, i64 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i64, align 16 + %a14 = alloca %S.gen.EnumDef, align 16 + %a15 = alloca %S.gen.EnumDef, align 16 + %a17 = alloca %S.gen.EnumDef, align 16 + %a31 = alloca %S.gen.Val, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca %S.ast.Type, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca i64, align 16 + %a82 = alloca i64, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca %S.ast.Type, align 16 + %a120 = alloca %S.ast.Type, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca i64, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca %S.ast.Type, align 16 + %a221 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i64 %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = icmp eq ptr %t4, null + br i1 %t5, label %panic6804, label %ok6805 +panic6804: + call void @finch_panic(ptr @.str.4382, i64 3959, ptr @.str.4383) + unreachable +ok6805: + %t6 = getelementptr inbounds %S.gen.Gen, ptr %t4, i32 0, i32 20 + %t7 = load i64, ptr %a3 + %t8 = load { ptr, i64, i64 }, ptr %t6 + %t9 = extractvalue { ptr, i64, i64 } %t8, 1 + %t10 = icmp uge i64 %t7, %t9 + br i1 %t10, label %range6806, label %inrange6807 +range6806: + call void @finch_panic_index(ptr @.str.4384, i64 3959, i64 %t7, i64 %t9) + unreachable +inrange6807: + %t11 = extractvalue { ptr, i64, i64 } %t8, 0 + %t12 = getelementptr inbounds %S.gen.EnumDef, ptr %t11, i64 %t7 + %t13 = load %S.gen.EnumDef, ptr %t12 + store %S.gen.EnumDef %t13, ptr %a14 + call void @finch.copy.S_gen_EnumDef(ptr %a15, ptr %a14) + %t16 = load %S.gen.EnumDef, ptr %a15 + store %S.gen.EnumDef %t16, ptr %a17 + %t18 = load ptr, ptr %a1 + %t19 = load %S.ast.Node, ptr %a2 + %t20 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 1 + %t21 = load { ptr, i64, i64 }, ptr %t20 + call void @finch.gen.checkArgs(ptr %t18, %S.ast.Node %t19, i64 0, i64 1, { ptr, i64, i64 } %t21) + %t22 = load ptr, ptr %a1 + %t23 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t24 = load { ptr, i64, i64 }, ptr %t23 + %t25 = extractvalue { ptr, i64, i64 } %t24, 1 + %t26 = icmp uge i64 0, %t25 + br i1 %t26, label %range6808, label %inrange6809 +range6808: + call void @finch_panic_index(ptr @.str.4385, i64 3961, i64 0, i64 %t25) + unreachable +inrange6809: + %t27 = extractvalue { ptr, i64, i64 } %t24, 0 + %t28 = getelementptr inbounds %S.ast.Node, ptr %t27, i64 0 + %t29 = load %S.ast.Node, ptr %t28 + %t30 = call %S.gen.Val @finch.gen.expr(ptr %t22, %S.ast.Node %t29) + store %S.gen.Val %t30, ptr %a31 + %t32 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 1 + %t33 = load %S.ast.Type, ptr %t32 + %t34 = call i1 @finch.gen.isInt(%S.ast.Type %t33) + %t35 = xor i1 %t34, true + br i1 %t35, label %then6810, label %endif6812 +then6810: + %t36 = load ptr, ptr %a1 + %t37 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t38 = load { ptr, i64, i64 }, ptr %t37 + %t39 = extractvalue { ptr, i64, i64 } %t38, 1 + %t40 = icmp uge i64 0, %t39 + br i1 %t40, label %range6813, label %inrange6814 +range6813: + call void @finch_panic_index(ptr @.str.4386, i64 3963, i64 0, i64 %t39) + unreachable +inrange6814: + %t41 = extractvalue { ptr, i64, i64 } %t38, 0 + %t42 = getelementptr inbounds %S.ast.Node, ptr %t41, i64 0 + %t43 = load %S.ast.Node, ptr %t42 + %t44 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 1 + %t45 = load { ptr, i64, i64 }, ptr %t44 + store { ptr, i64, i64 } %t45, ptr %a47 + store { ptr, i64, i64 } { ptr @.str.4387, i64 54, i64 0 }, ptr %a48 + call void @finch_str_concat(ptr %a46, ptr %a47, ptr %a48) + %t49 = load { ptr, i64, i64 }, ptr %a46 + %t50 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 1 + %t51 = load %S.ast.Type, ptr %t50 + %t52 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t51) + store { ptr, i64, i64 } %t49, ptr %a54 + store { ptr, i64, i64 } %t52, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + call void @finch.gen.fail(ptr %t36, %S.ast.Node %t43, { ptr, i64, i64 } %t56) + br label %endif6812 +endif6812: + %t57 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.4388, i64 4, i64 0 }, 0 + %t58 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 1 + %t59 = load { ptr, i64, i64 }, ptr %t58 + store { ptr, i64, i64 } %t59, ptr %a60 + call void @finch_str_copy(ptr %a61, ptr %a60) + %t62 = load { ptr, i64, i64 }, ptr %a61 + %t63 = insertvalue %S.ast.Type %t57, { ptr, i64, i64 } %t62, 2 + %t64 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 0 + %t65 = load { ptr, i64, i64 }, ptr %t64 + store { ptr, i64, i64 } %t65, ptr %a66 + call void @finch_str_copy(ptr %a67, ptr %a66) + %t68 = load { ptr, i64, i64 }, ptr %a67 + %t69 = insertvalue %S.ast.Type %t63, { ptr, i64, i64 } %t68, 3 + store %S.ast.Type %t69, ptr %a70 + %t71 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 3 + %t72 = load i1, ptr %t71 + br i1 %t72, label %then6815, label %endif6817 +then6815: + %t73 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 3 + %t74 = getelementptr inbounds { ptr, i64, i64 }, ptr %t73, i32 0, i32 1 + %t75 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 0 + %t76 = load { ptr, i64, i64 }, ptr %t75 + store { ptr, i64, i64 } %t76, ptr %a77 + %t78 = call i64 @finch_str_to_int(ptr %a77, ptr @.str.4389, i64 3967) + store i64 -1, ptr %a79 + %t80 = load i64, ptr %t74 + %t81 = load ptr, ptr %t73 + store i64 0, ptr %a82 + br label %find.cond6818 +find.cond6818: + %t83 = load i64, ptr %a82 + %t84 = icmp slt i64 %t83, %t80 + br i1 %t84, label %find.body6819, label %find.end6822 +find.body6819: + %t85 = getelementptr inbounds i64, ptr %t81, i64 %t83 + %t86 = load i64, ptr %t85 + %t87 = icmp eq i64 %t86, %t78 + br i1 %t87, label %find.hit6820, label %find.next6821 +find.hit6820: + store i64 %t83, ptr %a79 + br label %find.end6822 +find.next6821: + %t88 = add i64 %t83, 1 + store i64 %t88, ptr %a82 + br label %find.cond6818 +find.end6822: + %t89 = load i64, ptr %a79 + %t90 = icmp sge i64 %t89, 0 + %t91 = xor i1 %t90, true + br i1 %t91, label %then6823, label %endif6825 +then6823: + %t92 = load ptr, ptr %a1 + %t93 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t94 = load { ptr, i64, i64 }, ptr %t93 + %t95 = extractvalue { ptr, i64, i64 } %t94, 1 + %t96 = icmp uge i64 0, %t95 + br i1 %t96, label %range6826, label %inrange6827 +range6826: + call void @finch_panic_index(ptr @.str.4390, i64 3968, i64 0, i64 %t95) + unreachable +inrange6827: + %t97 = extractvalue { ptr, i64, i64 } %t94, 0 + %t98 = getelementptr inbounds %S.ast.Node, ptr %t97, i64 0 + %t99 = load %S.ast.Node, ptr %t98 + %t100 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 0 + %t101 = load { ptr, i64, i64 }, ptr %t100 + store { ptr, i64, i64 } %t101, ptr %a103 + store { ptr, i64, i64 } { ptr @.str.4391, i64 37, i64 0 }, ptr %a104 + call void @finch_str_concat(ptr %a102, ptr %a103, ptr %a104) + %t105 = load { ptr, i64, i64 }, ptr %a102 + %t106 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 1 + %t107 = load { ptr, i64, i64 }, ptr %t106 + store { ptr, i64, i64 } %t105, ptr %a109 + store { ptr, i64, i64 } %t107, ptr %a110 + call void @finch_str_concat(ptr %a108, ptr %a109, ptr %a110) + %t111 = load { ptr, i64, i64 }, ptr %a108 + call void @finch.gen.fail(ptr %t92, %S.ast.Node %t99, { ptr, i64, i64 } %t111) + br label %endif6825 +endif6825: + %t112 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 0 + %t113 = load { ptr, i64, i64 }, ptr %t112 + store { ptr, i64, i64 } %t113, ptr %a114 + call void @finch_str_copy(ptr %a115, ptr %a114) + %t116 = load { ptr, i64, i64 }, ptr %a115 + %t117 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t116, 0 + %t118 = load %S.ast.Type, ptr %a70 + store %S.ast.Type %t118, ptr %a119 + call void @finch.copy.S_ast_Type(ptr %a120, ptr %a119) + %t121 = load %S.ast.Type, ptr %a120 + %t122 = insertvalue %S.gen.Val %t117, %S.ast.Type %t121, 1 + ret %S.gen.Val %t122 +endif6817: + %t123 = load ptr, ptr %a1 + %t124 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 0 + %t125 = load { ptr, i64, i64 }, ptr %t124 + %t126 = getelementptr inbounds %S.gen.Val, ptr %a31, i32 0, i32 1 + %t127 = load %S.ast.Type, ptr %t126 + %t128 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4392, i64 3, i64 0 }) + %t129 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t123, { ptr, i64, i64 } %t125, %S.ast.Type %t127, %S.ast.Type %t128) + store { ptr, i64, i64 } %t129, ptr %a130 + store { ptr, i64, i64 } { ptr @.str.4393, i64 0, i64 0 }, ptr %a131 + %t132 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 3 + %t133 = getelementptr inbounds { ptr, i64, i64 }, ptr %t132, i32 0, i32 1 + %t134 = load i64, ptr %t133 + store i64 0, ptr %a135 + br label %for.cond6828 +for.cond6828: + %t136 = load i64, ptr %a135 + %t137 = icmp slt i64 %t136, %t134 + br i1 %t137, label %for.body6829, label %for.end6831 +for.body6829: + %t138 = load ptr, ptr %a1 + %t139 = load { ptr, i64, i64 }, ptr %a130 + store { ptr, i64, i64 } { ptr @.str.4394, i64 12, i64 0 }, ptr %a141 + store { ptr, i64, i64 } %t139, ptr %a142 + call void @finch_str_concat(ptr %a140, ptr %a141, ptr %a142) + %t143 = load { ptr, i64, i64 }, ptr %a140 + store { ptr, i64, i64 } %t143, ptr %a145 + store { ptr, i64, i64 } { ptr @.str.4395, i64 2, i64 0 }, ptr %a146 + call void @finch_str_concat(ptr %a144, ptr %a145, ptr %a146) + %t147 = load { ptr, i64, i64 }, ptr %a144 + %t148 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 3 + %t149 = load i64, ptr %a135 + %t150 = load { ptr, i64, i64 }, ptr %t148 + %t151 = extractvalue { ptr, i64, i64 } %t150, 1 + %t152 = icmp uge i64 %t149, %t151 + br i1 %t152, label %range6832, label %inrange6833 +range6832: + call void @finch_panic_index(ptr @.str.4396, i64 3975, i64 %t149, i64 %t151) + unreachable +inrange6833: + %t153 = extractvalue { ptr, i64, i64 } %t150, 0 + %t154 = getelementptr inbounds i64, ptr %t153, i64 %t149 + %t155 = load i64, ptr %t154 + call void @finch_str_from_int(ptr %a156, i64 %t155) + %t157 = load { ptr, i64, i64 }, ptr %a156 + store { ptr, i64, i64 } %t147, ptr %a159 + store { ptr, i64, i64 } %t157, ptr %a160 + call void @finch_str_concat(ptr %a158, ptr %a159, ptr %a160) + %t161 = load { ptr, i64, i64 }, ptr %a158 + %t162 = call { ptr, i64, i64 } @finch.gen.op(ptr %t138, { ptr, i64, i64 } %t161) + store { ptr, i64, i64 } %t162, ptr %a163 + %t164 = load i64, ptr %a135 + %t165 = icmp eq i64 %t164, 0 + br i1 %t165, label %then6834, label %else6835 +then6834: + %t166 = load { ptr, i64, i64 }, ptr %a163 + store { ptr, i64, i64 } %t166, ptr %a167 + call void @finch_str_copy(ptr %a168, ptr %a167) + %t169 = load { ptr, i64, i64 }, ptr %a168 + store { ptr, i64, i64 } %t169, ptr %a131 + br label %endif6836 +else6835: + %t170 = load ptr, ptr %a1 + %t171 = load { ptr, i64, i64 }, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.4397, i64 6, i64 0 }, ptr %a173 + store { ptr, i64, i64 } %t171, ptr %a174 + call void @finch_str_concat(ptr %a172, ptr %a173, ptr %a174) + %t175 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } %t175, ptr %a177 + store { ptr, i64, i64 } { ptr @.str.4398, i64 2, i64 0 }, ptr %a178 + call void @finch_str_concat(ptr %a176, ptr %a177, ptr %a178) + %t179 = load { ptr, i64, i64 }, ptr %a176 + %t180 = load { ptr, i64, i64 }, ptr %a163 + store { ptr, i64, i64 } %t179, ptr %a182 + store { ptr, i64, i64 } %t180, ptr %a183 + call void @finch_str_concat(ptr %a181, ptr %a182, ptr %a183) + %t184 = load { ptr, i64, i64 }, ptr %a181 + %t185 = call { ptr, i64, i64 } @finch.gen.op(ptr %t170, { ptr, i64, i64 } %t184) + store { ptr, i64, i64 } %t185, ptr %a131 + br label %endif6836 +endif6836: + br label %for.step6830 +for.step6830: + %t186 = load i64, ptr %a135 + %t187 = add i64 %t186, 1 + store i64 %t187, ptr %a135 + br label %for.cond6828 +for.end6831: + %t188 = load ptr, ptr %a1 + %t189 = load ptr, ptr %a1 + %t190 = load { ptr, i64, i64 }, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.4399, i64 7, i64 0 }, ptr %a192 + store { ptr, i64, i64 } %t190, ptr %a193 + call void @finch_str_concat(ptr %a191, ptr %a192, ptr %a193) + %t194 = load { ptr, i64, i64 }, ptr %a191 + store { ptr, i64, i64 } %t194, ptr %a196 + store { ptr, i64, i64 } { ptr @.str.4400, i64 6, i64 0 }, ptr %a197 + call void @finch_str_concat(ptr %a195, ptr %a196, ptr %a197) + %t198 = load { ptr, i64, i64 }, ptr %a195 + %t199 = call { ptr, i64, i64 } @finch.gen.op(ptr %t189, { ptr, i64, i64 } %t198) + %t200 = getelementptr inbounds %S.gen.EnumDef, ptr %a17, i32 0, i32 1 + %t201 = load { ptr, i64, i64 }, ptr %t200 + store { ptr, i64, i64 } { ptr @.str.4401, i64 32, i64 0 }, ptr %a203 + store { ptr, i64, i64 } %t201, ptr %a204 + call void @finch_str_concat(ptr %a202, ptr %a203, ptr %a204) + %t205 = load { ptr, i64, i64 }, ptr %a202 + %t206 = load %S.ast.Node, ptr %a2 + call void @finch.gen.panicIf(ptr %t188, { ptr, i64, i64 } %t199, { ptr, i64, i64 } %t205, %S.ast.Node %t206) + %t207 = load ptr, ptr %a1 + %t208 = load { ptr, i64, i64 }, ptr %a130 + store { ptr, i64, i64 } { ptr @.str.4402, i64 10, i64 0 }, ptr %a210 + store { ptr, i64, i64 } %t208, ptr %a211 + call void @finch_str_concat(ptr %a209, ptr %a210, ptr %a211) + %t212 = load { ptr, i64, i64 }, ptr %a209 + store { ptr, i64, i64 } %t212, ptr %a214 + store { ptr, i64, i64 } { ptr @.str.4403, i64 7, i64 0 }, ptr %a215 + call void @finch_str_concat(ptr %a213, ptr %a214, ptr %a215) + %t216 = load { ptr, i64, i64 }, ptr %a213 + %t217 = call { ptr, i64, i64 } @finch.gen.op(ptr %t207, { ptr, i64, i64 } %t216) + %t218 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t217, 0 + %t219 = load %S.ast.Type, ptr %a70 + store %S.ast.Type %t219, ptr %a220 + call void @finch.copy.S_ast_Type(ptr %a221, ptr %a220) + %t222 = load %S.ast.Type, ptr %a221 + %t223 = insertvalue %S.gen.Val %t218, %S.ast.Type %t222, 1 + ret %S.gen.Val %t223 +} + +define internal { ptr, i64, i64 } @finch.gen.cExt(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.4404, i64 4, i64 0 }, ptr %a6 + %t7 = call i32 @finch_str_eq(ptr %a5, ptr %a6) + %t8 = icmp ne i32 %t7, 0 + br label %logic.from6837 +logic.from6837: + br i1 %t8, label %logic.end6839, label %logic.rhs6838 +logic.rhs6838: + %t9 = load %S.ast.Type, ptr %a2 + %t10 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t9) + br label %logic.rend6840 +logic.rend6840: + br label %logic.end6839 +logic.end6839: + %t11 = phi i1 [ true, %logic.from6837 ], [ %t10, %logic.rend6840 ] + br i1 %t11, label %then6841, label %endif6843 +then6841: + %t12 = load %S.ast.Type, ptr %a2 + %t13 = call i64 @finch.gen.bitsOf(%S.ast.Type %t12) + %t14 = icmp slt i64 %t13, 32 + br i1 %t14, label %then6844, label %endif6846 +then6844: + ret { ptr, i64, i64 } { ptr @.str.4405, i64 8, i64 0 } +endif6846: + br label %endif6843 +endif6843: + %t15 = load %S.ast.Type, ptr %a2 + %t16 = call i1 @finch.gen.isSigned(%S.ast.Type %t15) + br label %logic.from6847 +logic.from6847: + br i1 %t16, label %logic.end6849, label %logic.rhs6848 +logic.rhs6848: + %t17 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t18 = load { ptr, i64, i64 }, ptr %t17 + store { ptr, i64, i64 } %t18, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.4406, i64 4, i64 0 }, ptr %a20 + %t21 = call i32 @finch_str_eq(ptr %a19, ptr %a20) + %t22 = icmp ne i32 %t21, 0 + br label %logic.from6850 +logic.from6850: + br i1 %t22, label %logic.rhs6851, label %logic.end6852 +logic.rhs6851: + %t23 = load ptr, ptr %a1 + %t24 = icmp eq ptr %t23, null + br i1 %t24, label %panic6853, label %ok6854 +panic6853: + call void @finch_panic(ptr @.str.4407, i64 3995, ptr @.str.4408) + unreachable +ok6854: + %t25 = getelementptr inbounds %S.gen.Gen, ptr %t23, i32 0, i32 27 + %t26 = load %S.platform.Target, ptr %t25 + %t27 = call i1 @finch.platform.charIsSigned(%S.platform.Target %t26) + br label %logic.rend6855 +logic.rend6855: + br label %logic.end6852 +logic.end6852: + %t28 = phi i1 [ false, %logic.from6850 ], [ %t27, %logic.rend6855 ] + br label %logic.rend6856 +logic.rend6856: + br label %logic.end6849 +logic.end6849: + %t29 = phi i1 [ true, %logic.from6847 ], [ %t28, %logic.rend6856 ] + br label %logic.from6857 +logic.from6857: + br i1 %t29, label %logic.rhs6858, label %logic.end6859 +logic.rhs6858: + %t30 = load %S.ast.Type, ptr %a2 + %t31 = call i64 @finch.gen.bitsOf(%S.ast.Type %t30) + %t32 = icmp slt i64 %t31, 32 + br label %logic.rend6860 +logic.rend6860: + br label %logic.end6859 +logic.end6859: + %t33 = phi i1 [ false, %logic.from6857 ], [ %t32, %logic.rend6860 ] + br i1 %t33, label %then6861, label %endif6863 +then6861: + ret { ptr, i64, i64 } { ptr @.str.4409, i64 8, i64 0 } +endif6863: + %t34 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t35 = load { ptr, i64, i64 }, ptr %t34 + store { ptr, i64, i64 } %t35, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.4410, i64 4, i64 0 }, ptr %a37 + %t38 = call i32 @finch_str_eq(ptr %a36, ptr %a37) + %t39 = icmp ne i32 %t38, 0 + br label %logic.from6864 +logic.from6864: + br i1 %t39, label %logic.rhs6865, label %logic.end6866 +logic.rhs6865: + %t40 = load %S.ast.Type, ptr %a2 + %t41 = call i64 @finch.gen.bitsOf(%S.ast.Type %t40) + %t42 = icmp slt i64 %t41, 32 + br label %logic.rend6867 +logic.rend6867: + br label %logic.end6866 +logic.end6866: + %t43 = phi i1 [ false, %logic.from6864 ], [ %t42, %logic.rend6867 ] + br i1 %t43, label %then6868, label %endif6870 +then6868: + ret { ptr, i64, i64 } { ptr @.str.4411, i64 8, i64 0 } +endif6870: + ret { ptr, i64, i64 } { ptr @.str.4412, i64 0, i64 0 } +} + +define internal { ptr, i64, i64 } @finch.gen.cLL(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.4413, i64 3, i64 0 }, ptr %a6 + %t7 = call i32 @finch_str_eq(ptr %a5, ptr %a6) + %t8 = icmp ne i32 %t7, 0 + br i1 %t8, label %then6871, label %endif6873 +then6871: + ret { ptr, i64, i64 } { ptr @.str.4414, i64 3, i64 0 } +endif6873: + %t9 = load ptr, ptr %a1 + %t10 = load %S.ast.Type, ptr %a2 + %t11 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t9, %S.ast.Type %t10) + ret { ptr, i64, i64 } %t11 +} + +define internal %S.gen.Val @finch.gen.callC(ptr %p0, %S.ast.Node %p1, %S.cimport.CFunc %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca %S.cimport.CFunc, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca i64, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca %S.ast.Type, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca i64, align 16 + %a127 = alloca %S.ast.Type, align 16 + %a132 = alloca %S.ast.Type, align 16 + %a140 = alloca %S.ast.Type, align 16 + %a141 = alloca %S.ast.Type, align 16 + %a153 = alloca %S.gen.Plan, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca i64, align 16 + %a219 = alloca %S.ast.Type, align 16 + %a220 = alloca %S.ast.Type, align 16 + %a222 = alloca %S.ast.Type, align 16 + %a231 = alloca %S.gen.Abi, align 16 + %a232 = alloca %S.gen.Abi, align 16 + %a234 = alloca %S.gen.Abi, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a270 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca %S.gen.Val, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a302 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a308 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca i64, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a410 = alloca { ptr, i64, i64 }, align 16 + %a411 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a416 = alloca { ptr, i64, i64 }, align 16 + %a418 = alloca { ptr, i64, i64 }, align 16 + %a419 = alloca { ptr, i64, i64 }, align 16 + %a420 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a450 = alloca { ptr, i64, i64 }, align 16 + %a451 = alloca { ptr, i64, i64 }, align 16 + %a452 = alloca { ptr, i64, i64 }, align 16 + %a455 = alloca { ptr, i64, i64 }, align 16 + %a456 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a472 = alloca { ptr, i64, i64 }, align 16 + %a473 = alloca { ptr, i64, i64 }, align 16 + %a474 = alloca { ptr, i64, i64 }, align 16 + %a482 = alloca { ptr, i64, i64 }, align 16 + %a483 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca { ptr, i64, i64 }, align 16 + %a492 = alloca { ptr, i64, i64 }, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a506 = alloca { ptr, i64, i64 }, align 16 + %a507 = alloca { ptr, i64, i64 }, align 16 + %a508 = alloca { ptr, i64, i64 }, align 16 + %a510 = alloca { ptr, i64, i64 }, align 16 + %a511 = alloca { ptr, i64, i64 }, align 16 + %a512 = alloca { ptr, i64, i64 }, align 16 + %a516 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a518 = alloca { ptr, i64, i64 }, align 16 + %a534 = alloca %S.gen.Val, align 16 + %a537 = alloca %S.ast.Type, align 16 + %a538 = alloca %S.ast.Type, align 16 + %a540 = alloca %S.ast.Type, align 16 + %a543 = alloca { ptr, i64, i64 }, align 16 + %a544 = alloca { ptr, i64, i64 }, align 16 + %a558 = alloca { ptr, i64, i64 }, align 16 + %a559 = alloca { ptr, i64, i64 }, align 16 + %a564 = alloca { ptr, i64, i64 }, align 16 + %a565 = alloca { ptr, i64, i64 }, align 16 + %a580 = alloca { ptr, i64, i64 }, align 16 + %a581 = alloca { ptr, i64, i64 }, align 16 + %a583 = alloca { ptr, i64, i64 }, align 16 + %a586 = alloca { ptr, i64, i64 }, align 16 + %a587 = alloca { ptr, i64, i64 }, align 16 + %a598 = alloca { ptr, i64, i64 }, align 16 + %a599 = alloca { ptr, i64, i64 }, align 16 + %a608 = alloca { ptr, i64, i64 }, align 16 + %a609 = alloca { ptr, i64, i64 }, align 16 + %a615 = alloca { ptr, i64, i64 }, align 16 + %a616 = alloca { ptr, i64, i64 }, align 16 + %a617 = alloca { ptr, i64, i64 }, align 16 + %a619 = alloca { ptr, i64, i64 }, align 16 + %a620 = alloca { ptr, i64, i64 }, align 16 + %a621 = alloca { ptr, i64, i64 }, align 16 + %a629 = alloca { ptr, i64, i64 }, align 16 + %a630 = alloca { ptr, i64, i64 }, align 16 + %a648 = alloca { ptr, i64, i64 }, align 16 + %a649 = alloca { ptr, i64, i64 }, align 16 + %a650 = alloca { ptr, i64, i64 }, align 16 + %a653 = alloca { ptr, i64, i64 }, align 16 + %a654 = alloca { ptr, i64, i64 }, align 16 + %a655 = alloca { ptr, i64, i64 }, align 16 + %a665 = alloca { ptr, i64, i64 }, align 16 + %a666 = alloca { ptr, i64, i64 }, align 16 + %a668 = alloca { ptr, i64, i64 }, align 16 + %a669 = alloca { ptr, i64, i64 }, align 16 + %a673 = alloca { ptr, i64, i64 }, align 16 + %a674 = alloca { ptr, i64, i64 }, align 16 + %a680 = alloca { ptr, i64, i64 }, align 16 + %a692 = alloca { ptr, i64, i64 }, align 16 + %a693 = alloca { ptr, i64, i64 }, align 16 + %a694 = alloca { ptr, i64, i64 }, align 16 + %a696 = alloca i64, align 16 + %a699 = alloca i64, align 16 + %a704 = alloca { ptr, i64, i64 }, align 16 + %a705 = alloca { ptr, i64, i64 }, align 16 + %a718 = alloca { ptr, i64, i64 }, align 16 + %a719 = alloca { ptr, i64, i64 }, align 16 + %a720 = alloca { ptr, i64, i64 }, align 16 + %a735 = alloca { ptr, i64, i64 }, align 16 + %a736 = alloca { ptr, i64, i64 }, align 16 + %a737 = alloca { ptr, i64, i64 }, align 16 + %a739 = alloca { ptr, i64, i64 }, align 16 + %a740 = alloca { ptr, i64, i64 }, align 16 + %a741 = alloca { ptr, i64, i64 }, align 16 + %a744 = alloca { ptr, i64, i64 }, align 16 + %a745 = alloca { ptr, i64, i64 }, align 16 + %a746 = alloca { ptr, i64, i64 }, align 16 + %a748 = alloca { ptr, i64, i64 }, align 16 + %a749 = alloca { ptr, i64, i64 }, align 16 + %a750 = alloca { ptr, i64, i64 }, align 16 + %a754 = alloca { ptr, i64, i64 }, align 16 + %a755 = alloca { ptr, i64, i64 }, align 16 + %a756 = alloca { ptr, i64, i64 }, align 16 + %a758 = alloca { ptr, i64, i64 }, align 16 + %a759 = alloca { ptr, i64, i64 }, align 16 + %a760 = alloca { ptr, i64, i64 }, align 16 + %a763 = alloca { ptr, i64, i64 }, align 16 + %a764 = alloca { ptr, i64, i64 }, align 16 + %a766 = alloca { ptr, i64, i64 }, align 16 + %a767 = alloca { ptr, i64, i64 }, align 16 + %a768 = alloca { ptr, i64, i64 }, align 16 + %a771 = alloca { ptr, i64, i64 }, align 16 + %a772 = alloca { ptr, i64, i64 }, align 16 + %a773 = alloca { ptr, i64, i64 }, align 16 + %a775 = alloca { ptr, i64, i64 }, align 16 + %a776 = alloca { ptr, i64, i64 }, align 16 + %a777 = alloca { ptr, i64, i64 }, align 16 + %a783 = alloca { ptr, i64, i64 }, align 16 + %a787 = alloca { ptr, i64, i64 }, align 16 + %a788 = alloca { ptr, i64, i64 }, align 16 + %a790 = alloca { ptr, i64, i64 }, align 16 + %a791 = alloca { ptr, i64, i64 }, align 16 + %a792 = alloca { ptr, i64, i64 }, align 16 + %a795 = alloca { ptr, i64, i64 }, align 16 + %a796 = alloca { ptr, i64, i64 }, align 16 + %a797 = alloca { ptr, i64, i64 }, align 16 + %a799 = alloca { ptr, i64, i64 }, align 16 + %a800 = alloca { ptr, i64, i64 }, align 16 + %a801 = alloca { ptr, i64, i64 }, align 16 + %a804 = alloca { ptr, i64, i64 }, align 16 + %a805 = alloca { ptr, i64, i64 }, align 16 + %a806 = alloca { ptr, i64, i64 }, align 16 + %a808 = alloca { ptr, i64, i64 }, align 16 + %a809 = alloca { ptr, i64, i64 }, align 16 + %a810 = alloca { ptr, i64, i64 }, align 16 + %a813 = alloca { ptr, i64, i64 }, align 16 + %a814 = alloca { ptr, i64, i64 }, align 16 + %a815 = alloca { ptr, i64, i64 }, align 16 + %a818 = alloca { ptr, i64, i64 }, align 16 + %a819 = alloca { ptr, i64, i64 }, align 16 + %a820 = alloca { ptr, i64, i64 }, align 16 + %a822 = alloca { ptr, i64, i64 }, align 16 + %a823 = alloca { ptr, i64, i64 }, align 16 + %a824 = alloca { ptr, i64, i64 }, align 16 + %a828 = alloca { ptr, i64, i64 }, align 16 + %a829 = alloca { ptr, i64, i64 }, align 16 + %a830 = alloca { ptr, i64, i64 }, align 16 + %a832 = alloca { ptr, i64, i64 }, align 16 + %a833 = alloca { ptr, i64, i64 }, align 16 + %a834 = alloca { ptr, i64, i64 }, align 16 + %a837 = alloca { ptr, i64, i64 }, align 16 + %a838 = alloca { ptr, i64, i64 }, align 16 + %a840 = alloca { ptr, i64, i64 }, align 16 + %a841 = alloca { ptr, i64, i64 }, align 16 + %a842 = alloca { ptr, i64, i64 }, align 16 + %a844 = alloca { ptr, i64, i64 }, align 16 + %a845 = alloca { ptr, i64, i64 }, align 16 + %a846 = alloca { ptr, i64, i64 }, align 16 + %a848 = alloca { ptr, i64, i64 }, align 16 + %a851 = alloca { ptr, i64, i64 }, align 16 + %a852 = alloca { ptr, i64, i64 }, align 16 + %a858 = alloca %S.ast.Type, align 16 + %a859 = alloca %S.ast.Type, align 16 + %a874 = alloca %S.ast.Type, align 16 + %a875 = alloca %S.ast.Type, align 16 + %a881 = alloca { ptr, i64, i64 }, align 16 + %a885 = alloca { ptr, i64, i64 }, align 16 + %a886 = alloca { ptr, i64, i64 }, align 16 + %a891 = alloca { ptr, i64, i64 }, align 16 + %a906 = alloca %S.ast.Type, align 16 + %a907 = alloca %S.ast.Type, align 16 + %a912 = alloca { ptr, i64, i64 }, align 16 + %a913 = alloca { ptr, i64, i64 }, align 16 + %a918 = alloca { ptr, i64, i64 }, align 16 + %a923 = alloca { ptr, i64, i64 }, align 16 + %a924 = alloca { ptr, i64, i64 }, align 16 + %a925 = alloca { ptr, i64, i64 }, align 16 + %a927 = alloca { ptr, i64, i64 }, align 16 + %a928 = alloca { ptr, i64, i64 }, align 16 + %a929 = alloca { ptr, i64, i64 }, align 16 + %a932 = alloca { ptr, i64, i64 }, align 16 + %a933 = alloca { ptr, i64, i64 }, align 16 + %a934 = alloca { ptr, i64, i64 }, align 16 + %a936 = alloca { ptr, i64, i64 }, align 16 + %a937 = alloca { ptr, i64, i64 }, align 16 + %a938 = alloca { ptr, i64, i64 }, align 16 + %a945 = alloca %S.ast.Type, align 16 + %a946 = alloca %S.ast.Type, align 16 + %a950 = alloca { ptr, i64, i64 }, align 16 + %a951 = alloca { ptr, i64, i64 }, align 16 + %a955 = alloca %S.ast.Type, align 16 + %a956 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store %S.cimport.CFunc %p2, ptr %a3 + %t4 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 5 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t4, i32 0, i32 1 + %t6 = load i64, ptr %t5 + %t7 = icmp sgt i64 %t6, 0 + br i1 %t7, label %then6874, label %endif6876 +then6874: + %t8 = load ptr, ptr %a1 + %t9 = load %S.ast.Node, ptr %a2 + %t10 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t11 = load { ptr, i64, i64 }, ptr %t10 + store { ptr, i64, i64 } { ptr @.str.4415, i64 16, i64 0 }, ptr %a13 + store { ptr, i64, i64 } %t11, ptr %a14 + call void @finch_str_concat(ptr %a12, ptr %a13, ptr %a14) + %t15 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t15, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.4416, i64 35, i64 0 }, ptr %a18 + call void @finch_str_concat(ptr %a16, ptr %a17, ptr %a18) + %t19 = load { ptr, i64, i64 }, ptr %a16 + %t20 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 5 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t19, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + call void @finch.gen.fail(ptr %t8, %S.ast.Node %t9, { ptr, i64, i64 } %t25) + br label %endif6876 +endif6876: + %t26 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %t26, i32 0, i32 1 + %t28 = load i64, ptr %t27 + store i64 %t28, ptr %a29 + %t30 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 4 + %t31 = load i1, ptr %t30 + br i1 %t31, label %then6877, label %else6878 +then6877: + %t32 = load i64, ptr %a29 + %t33 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 3 + %t34 = getelementptr inbounds { ptr, i64, i64 }, ptr %t33, i32 0, i32 1 + %t35 = load i64, ptr %t34 + %t36 = icmp slt i64 %t32, %t35 + br i1 %t36, label %then6880, label %endif6882 +then6880: + %t37 = load ptr, ptr %a1 + %t38 = load %S.ast.Node, ptr %a2 + %t39 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t40 = load { ptr, i64, i64 }, ptr %t39 + store { ptr, i64, i64 } { ptr @.str.4417, i64 1, i64 0 }, ptr %a42 + store { ptr, i64, i64 } %t40, ptr %a43 + call void @finch_str_concat(ptr %a41, ptr %a42, ptr %a43) + %t44 = load { ptr, i64, i64 }, ptr %a41 + store { ptr, i64, i64 } %t44, ptr %a46 + store { ptr, i64, i64 } { ptr @.str.4418, i64 17, i64 0 }, ptr %a47 + call void @finch_str_concat(ptr %a45, ptr %a46, ptr %a47) + %t48 = load { ptr, i64, i64 }, ptr %a45 + %t49 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 3 + %t50 = getelementptr inbounds { ptr, i64, i64 }, ptr %t49, i32 0, i32 1 + %t51 = load i64, ptr %t50 + call void @finch_str_from_int(ptr %a52, i64 %t51) + %t53 = load { ptr, i64, i64 }, ptr %a52 + store { ptr, i64, i64 } %t48, ptr %a55 + store { ptr, i64, i64 } %t53, ptr %a56 + call void @finch_str_concat(ptr %a54, ptr %a55, ptr %a56) + %t57 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t57, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.4419, i64 22, i64 0 }, ptr %a60 + call void @finch_str_concat(ptr %a58, ptr %a59, ptr %a60) + %t61 = load { ptr, i64, i64 }, ptr %a58 + %t62 = load i64, ptr %a29 + call void @finch_str_from_int(ptr %a63, i64 %t62) + %t64 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t61, ptr %a66 + store { ptr, i64, i64 } %t64, ptr %a67 + call void @finch_str_concat(ptr %a65, ptr %a66, ptr %a67) + %t68 = load { ptr, i64, i64 }, ptr %a65 + call void @finch.gen.fail(ptr %t37, %S.ast.Node %t38, { ptr, i64, i64 } %t68) + br label %endif6882 +endif6882: + br label %endif6879 +else6878: + %t69 = load i64, ptr %a29 + %t70 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 3 + %t71 = getelementptr inbounds { ptr, i64, i64 }, ptr %t70, i32 0, i32 1 + %t72 = load i64, ptr %t71 + %t73 = icmp ne i64 %t69, %t72 + br i1 %t73, label %then6883, label %endif6885 +then6883: + %t74 = load ptr, ptr %a1 + %t75 = load %S.ast.Node, ptr %a2 + %t76 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t77 = load { ptr, i64, i64 }, ptr %t76 + store { ptr, i64, i64 } { ptr @.str.4420, i64 1, i64 0 }, ptr %a79 + store { ptr, i64, i64 } %t77, ptr %a80 + call void @finch_str_concat(ptr %a78, ptr %a79, ptr %a80) + %t81 = load { ptr, i64, i64 }, ptr %a78 + store { ptr, i64, i64 } %t81, ptr %a83 + store { ptr, i64, i64 } { ptr @.str.4421, i64 8, i64 0 }, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + %t86 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 3 + %t87 = getelementptr inbounds { ptr, i64, i64 }, ptr %t86, i32 0, i32 1 + %t88 = load i64, ptr %t87 + call void @finch_str_from_int(ptr %a89, i64 %t88) + %t90 = load { ptr, i64, i64 }, ptr %a89 + store { ptr, i64, i64 } %t85, ptr %a92 + store { ptr, i64, i64 } %t90, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + store { ptr, i64, i64 } %t94, ptr %a96 + store { ptr, i64, i64 } { ptr @.str.4422, i64 22, i64 0 }, ptr %a97 + call void @finch_str_concat(ptr %a95, ptr %a96, ptr %a97) + %t98 = load { ptr, i64, i64 }, ptr %a95 + %t99 = load i64, ptr %a29 + call void @finch_str_from_int(ptr %a100, i64 %t99) + %t101 = load { ptr, i64, i64 }, ptr %a100 + store { ptr, i64, i64 } %t98, ptr %a103 + store { ptr, i64, i64 } %t101, ptr %a104 + call void @finch_str_concat(ptr %a102, ptr %a103, ptr %a104) + %t105 = load { ptr, i64, i64 }, ptr %a102 + call void @finch.gen.fail(ptr %t74, %S.ast.Node %t75, { ptr, i64, i64 } %t105) + br label %endif6885 +endif6885: + br label %endif6879 +endif6879: + %t106 = load ptr, ptr %a1 + %t107 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 2 + %t108 = load %S.ast.Type, ptr %t107 + %t109 = load %S.ast.Node, ptr %a2 + %t110 = call %S.ast.Type @finch.gen.resolve(ptr %t106, %S.ast.Type %t108, %S.ast.Node %t109) + store %S.ast.Type %t110, ptr %a111 + %t112 = load ptr, ptr %a1 + %t113 = load %S.ast.Node, ptr %a2 + %t114 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t115 = load { ptr, i64, i64 }, ptr %t114 + %t116 = load %S.ast.Type, ptr %a111 + call void @finch.gen.checkByValue(ptr %t112, %S.ast.Node %t113, { ptr, i64, i64 } %t115, %S.ast.Type %t116, { ptr, i64, i64 } { ptr @.str.4423, i64 7, i64 0 }) + store { ptr, i64, i64 } zeroinitializer, ptr %a117 + %t118 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 3 + store i64 0, ptr %a119 + br label %each.cond6886 +each.cond6886: + %t120 = getelementptr inbounds { ptr, i64, i64 }, ptr %t118, i32 0, i32 1 + %t121 = load i64, ptr %t120 + %t122 = load i64, ptr %a119 + %t123 = icmp slt i64 %t122, %t121 + br i1 %t123, label %each.body6887, label %each.end6889 +each.body6887: + %t124 = load ptr, ptr %t118 + %t125 = getelementptr inbounds %S.ast.Type, ptr %t124, i64 %t122 + %t126 = load %S.ast.Type, ptr %t125 + store %S.ast.Type %t126, ptr %a127 + %t128 = load ptr, ptr %a1 + %t129 = load %S.ast.Type, ptr %a127 + %t130 = load %S.ast.Node, ptr %a2 + %t131 = call %S.ast.Type @finch.gen.resolve(ptr %t128, %S.ast.Type %t129, %S.ast.Node %t130) + store %S.ast.Type %t131, ptr %a132 + %t133 = load ptr, ptr %a1 + %t134 = load %S.ast.Node, ptr %a2 + %t135 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t136 = load { ptr, i64, i64 }, ptr %t135 + %t137 = load %S.ast.Type, ptr %a132 + call void @finch.gen.checkByValue(ptr %t133, %S.ast.Node %t134, { ptr, i64, i64 } %t136, %S.ast.Type %t137, { ptr, i64, i64 } { ptr @.str.4424, i64 5, i64 0 }) + %t138 = getelementptr inbounds { ptr, i64, i64 }, ptr %a117, i32 0, i32 1 + %t139 = load %S.ast.Type, ptr %a132 + store %S.ast.Type %t139, ptr %a140 + call void @finch.copy.S_ast_Type(ptr %a141, ptr %a140) + %t142 = load %S.ast.Type, ptr %a141 + %t143 = load i64, ptr %t138 + %t144 = add i64 %t143, 1 + call void @finch_arr_reserve(ptr %a117, i64 %t144, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t145 = load ptr, ptr %a117 + %t146 = getelementptr inbounds %S.ast.Type, ptr %t145, i64 %t143 + store %S.ast.Type %t142, ptr %t146 + store i64 %t144, ptr %t138 + br label %each.step6888 +each.step6888: + %t147 = load i64, ptr %a119 + %t148 = add i64 %t147, 1 + store i64 %t148, ptr %a119 + br label %each.cond6886 +each.end6889: + %t149 = load ptr, ptr %a1 + %t150 = load %S.ast.Type, ptr %a111 + %t151 = load { ptr, i64, i64 }, ptr %a117 + %t152 = call %S.gen.Plan @finch.gen.makePlan(ptr %t149, %S.ast.Type %t150, { ptr, i64, i64 } %t151) + store %S.gen.Plan %t152, ptr %a153 + store { ptr, i64, i64 } zeroinitializer, ptr %a154 + store { ptr, i64, i64 } zeroinitializer, ptr %a155 + store { ptr, i64, i64 } { ptr @.str.4425, i64 0, i64 0 }, ptr %a156 + %t157 = getelementptr inbounds %S.gen.Plan, ptr %a153, i32 0, i32 3 + %t158 = load i1, ptr %t157 + br i1 %t158, label %then6890, label %endif6892 +then6890: + %t159 = load ptr, ptr %a1 + %t160 = load ptr, ptr %a1 + %t161 = load %S.ast.Type, ptr %a111 + %t162 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t160, %S.ast.Type %t161) + %t163 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t159, { ptr, i64, i64 } %t162) + store { ptr, i64, i64 } %t163, ptr %a156 + %t164 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + %t165 = load ptr, ptr %a1 + %t166 = load %S.ast.Type, ptr %a111 + %t167 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t165, %S.ast.Type %t166) + store { ptr, i64, i64 } { ptr @.str.4426, i64 9, i64 0 }, ptr %a169 + store { ptr, i64, i64 } %t167, ptr %a170 + call void @finch_str_concat(ptr %a168, ptr %a169, ptr %a170) + %t171 = load { ptr, i64, i64 }, ptr %a168 + store { ptr, i64, i64 } %t171, ptr %a173 + store { ptr, i64, i64 } { ptr @.str.4427, i64 10, i64 0 }, ptr %a174 + call void @finch_str_concat(ptr %a172, ptr %a173, ptr %a174) + %t175 = load { ptr, i64, i64 }, ptr %a172 + %t176 = load i64, ptr %t164 + %t177 = add i64 %t176, 1 + call void @finch_arr_reserve(ptr %a154, i64 %t177, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t178 = load ptr, ptr %a154 + %t179 = getelementptr inbounds { ptr, i64, i64 }, ptr %t178, i64 %t176 + store { ptr, i64, i64 } %t175, ptr %t179 + store i64 %t177, ptr %t164 + %t180 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + %t181 = load ptr, ptr %a1 + %t182 = load %S.ast.Type, ptr %a111 + %t183 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t181, %S.ast.Type %t182) + store { ptr, i64, i64 } { ptr @.str.4428, i64 9, i64 0 }, ptr %a185 + store { ptr, i64, i64 } %t183, ptr %a186 + call void @finch_str_concat(ptr %a184, ptr %a185, ptr %a186) + %t187 = load { ptr, i64, i64 }, ptr %a184 + store { ptr, i64, i64 } %t187, ptr %a189 + store { ptr, i64, i64 } { ptr @.str.4429, i64 11, i64 0 }, ptr %a190 + call void @finch_str_concat(ptr %a188, ptr %a189, ptr %a190) + %t191 = load { ptr, i64, i64 }, ptr %a188 + %t192 = load { ptr, i64, i64 }, ptr %a156 + store { ptr, i64, i64 } %t191, ptr %a194 + store { ptr, i64, i64 } %t192, ptr %a195 + call void @finch_str_concat(ptr %a193, ptr %a194, ptr %a195) + %t196 = load { ptr, i64, i64 }, ptr %a193 + %t197 = load i64, ptr %t180 + %t198 = add i64 %t197, 1 + call void @finch_arr_reserve(ptr %a155, i64 %t198, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t199 = load ptr, ptr %a155 + %t200 = getelementptr inbounds { ptr, i64, i64 }, ptr %t199, i64 %t197 + store { ptr, i64, i64 } %t196, ptr %t200 + store i64 %t198, ptr %t180 + br label %endif6892 +endif6892: + %t201 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t202 = getelementptr inbounds { ptr, i64, i64 }, ptr %t201, i32 0, i32 1 + %t203 = load i64, ptr %t202 + store i64 0, ptr %a204 + br label %for.cond6893 +for.cond6893: + %t205 = load i64, ptr %a204 + %t206 = icmp slt i64 %t205, %t203 + br i1 %t206, label %for.body6894, label %for.end6896 +for.body6894: + %t207 = load i64, ptr %a204 + %t208 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 3 + %t209 = getelementptr inbounds { ptr, i64, i64 }, ptr %t208, i32 0, i32 1 + %t210 = load i64, ptr %t209 + %t211 = icmp slt i64 %t207, %t210 + br i1 %t211, label %then6897, label %endif6899 +then6897: + %t212 = load i64, ptr %a204 + %t213 = load { ptr, i64, i64 }, ptr %a117 + %t214 = extractvalue { ptr, i64, i64 } %t213, 1 + %t215 = icmp uge i64 %t212, %t214 + br i1 %t215, label %range6900, label %inrange6901 +range6900: + call void @finch_panic_index(ptr @.str.4430, i64 4042, i64 %t212, i64 %t214) + unreachable +inrange6901: + %t216 = extractvalue { ptr, i64, i64 } %t213, 0 + %t217 = getelementptr inbounds %S.ast.Type, ptr %t216, i64 %t212 + %t218 = load %S.ast.Type, ptr %t217 + store %S.ast.Type %t218, ptr %a219 + call void @finch.copy.S_ast_Type(ptr %a220, ptr %a219) + %t221 = load %S.ast.Type, ptr %a220 + store %S.ast.Type %t221, ptr %a222 + %t223 = getelementptr inbounds %S.gen.Plan, ptr %a153, i32 0, i32 1 + %t224 = load i64, ptr %a204 + %t225 = load { ptr, i64, i64 }, ptr %t223 + %t226 = extractvalue { ptr, i64, i64 } %t225, 1 + %t227 = icmp uge i64 %t224, %t226 + br i1 %t227, label %range6902, label %inrange6903 +range6902: + call void @finch_panic_index(ptr @.str.4431, i64 4043, i64 %t224, i64 %t226) + unreachable +inrange6903: + %t228 = extractvalue { ptr, i64, i64 } %t225, 0 + %t229 = getelementptr inbounds %S.gen.Abi, ptr %t228, i64 %t224 + %t230 = load %S.gen.Abi, ptr %t229 + store %S.gen.Abi %t230, ptr %a231 + call void @finch.copy.S_gen_Abi(ptr %a232, ptr %a231) + %t233 = load %S.gen.Abi, ptr %a232 + store %S.gen.Abi %t233, ptr %a234 + %t235 = load ptr, ptr %a1 + %t236 = load ptr, ptr %a1 + %t237 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t238 = load i64, ptr %a204 + %t239 = load { ptr, i64, i64 }, ptr %t237 + %t240 = extractvalue { ptr, i64, i64 } %t239, 1 + %t241 = icmp uge i64 %t238, %t240 + br i1 %t241, label %range6904, label %inrange6905 +range6904: + call void @finch_panic_index(ptr @.str.4432, i64 4044, i64 %t238, i64 %t240) + unreachable +inrange6905: + %t242 = extractvalue { ptr, i64, i64 } %t239, 0 + %t243 = getelementptr inbounds %S.ast.Node, ptr %t242, i64 %t238 + %t244 = load %S.ast.Node, ptr %t243 + %t245 = load %S.ast.Type, ptr %a222 + %t246 = call %S.gen.Val @finch.gen.exprWant(ptr %t236, %S.ast.Node %t244, %S.ast.Type %t245) + %t247 = load %S.ast.Type, ptr %a222 + %t248 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t249 = load i64, ptr %a204 + %t250 = load { ptr, i64, i64 }, ptr %t248 + %t251 = extractvalue { ptr, i64, i64 } %t250, 1 + %t252 = icmp uge i64 %t249, %t251 + br i1 %t252, label %range6906, label %inrange6907 +range6906: + call void @finch_panic_index(ptr @.str.4433, i64 4044, i64 %t249, i64 %t251) + unreachable +inrange6907: + %t253 = extractvalue { ptr, i64, i64 } %t250, 0 + %t254 = getelementptr inbounds %S.ast.Node, ptr %t253, i64 %t249 + %t255 = load %S.ast.Node, ptr %t254 + %t256 = load i64, ptr %a204 + %t257 = add i64 %t256, 1 + call void @finch_str_from_int(ptr %a258, i64 %t257) + %t259 = load { ptr, i64, i64 }, ptr %a258 + store { ptr, i64, i64 } { ptr @.str.4434, i64 9, i64 0 }, ptr %a261 + store { ptr, i64, i64 } %t259, ptr %a262 + call void @finch_str_concat(ptr %a260, ptr %a261, ptr %a262) + %t263 = load { ptr, i64, i64 }, ptr %a260 + store { ptr, i64, i64 } %t263, ptr %a265 + store { ptr, i64, i64 } { ptr @.str.4435, i64 4, i64 0 }, ptr %a266 + call void @finch_str_concat(ptr %a264, ptr %a265, ptr %a266) + %t267 = load { ptr, i64, i64 }, ptr %a264 + %t268 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t269 = load { ptr, i64, i64 }, ptr %t268 + store { ptr, i64, i64 } %t267, ptr %a271 + store { ptr, i64, i64 } %t269, ptr %a272 + call void @finch_str_concat(ptr %a270, ptr %a271, ptr %a272) + %t273 = load { ptr, i64, i64 }, ptr %a270 + %t274 = call %S.gen.Val @finch.gen.coerce(ptr %t235, %S.gen.Val %t246, %S.ast.Type %t247, %S.ast.Node %t255, { ptr, i64, i64 } %t273) + store %S.gen.Val %t274, ptr %a275 + %t276 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 0 + %t277 = load { ptr, i64, i64 }, ptr %t276 + store { ptr, i64, i64 } %t277, ptr %a278 + store { ptr, i64, i64 } { ptr @.str.4436, i64 6, i64 0 }, ptr %a279 + %t280 = call i32 @finch_str_eq(ptr %a278, ptr %a279) + %t281 = icmp ne i32 %t280, 0 + br i1 %t281, label %then6908, label %else6909 +then6908: + %t282 = load ptr, ptr %a1 + %t283 = load ptr, ptr %a1 + %t284 = load %S.ast.Type, ptr %a222 + %t285 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t283, %S.ast.Type %t284) + %t286 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t282, { ptr, i64, i64 } %t285) + store { ptr, i64, i64 } %t286, ptr %a287 + %t288 = load ptr, ptr %a1 + %t289 = load ptr, ptr %a1 + %t290 = load %S.ast.Type, ptr %a222 + %t291 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t289, %S.ast.Type %t290) + %t292 = getelementptr inbounds %S.gen.Val, ptr %a275, i32 0, i32 0 + %t293 = load { ptr, i64, i64 }, ptr %t292 + %t294 = load { ptr, i64, i64 }, ptr %a287 + call void @finch.gen.store(ptr %t288, { ptr, i64, i64 } %t291, { ptr, i64, i64 } %t293, { ptr, i64, i64 } %t294) + %t295 = load ptr, ptr %a1 + %t296 = load %S.ast.Type, ptr %a222 + %t297 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t295, %S.ast.Type %t296) + store { ptr, i64, i64 } { ptr @.str.4437, i64 10, i64 0 }, ptr %a299 + store { ptr, i64, i64 } %t297, ptr %a300 + call void @finch_str_concat(ptr %a298, ptr %a299, ptr %a300) + %t301 = load { ptr, i64, i64 }, ptr %a298 + store { ptr, i64, i64 } %t301, ptr %a303 + store { ptr, i64, i64 } { ptr @.str.4438, i64 8, i64 0 }, ptr %a304 + call void @finch_str_concat(ptr %a302, ptr %a303, ptr %a304) + %t305 = load { ptr, i64, i64 }, ptr %a302 + %t306 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 3 + %t307 = load i64, ptr %t306 + call void @finch_str_from_int(ptr %a308, i64 %t307) + %t309 = load { ptr, i64, i64 }, ptr %a308 + store { ptr, i64, i64 } %t305, ptr %a311 + store { ptr, i64, i64 } %t309, ptr %a312 + call void @finch_str_concat(ptr %a310, ptr %a311, ptr %a312) + %t313 = load { ptr, i64, i64 }, ptr %a310 + store { ptr, i64, i64 } %t313, ptr %a314 + %t315 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + %t316 = load { ptr, i64, i64 }, ptr %a314 + store { ptr, i64, i64 } %t316, ptr %a317 + call void @finch_str_copy(ptr %a318, ptr %a317) + %t319 = load { ptr, i64, i64 }, ptr %a318 + %t320 = load i64, ptr %t315 + %t321 = add i64 %t320, 1 + call void @finch_arr_reserve(ptr %a154, i64 %t321, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t322 = load ptr, ptr %a154 + %t323 = getelementptr inbounds { ptr, i64, i64 }, ptr %t322, i64 %t320 + store { ptr, i64, i64 } %t319, ptr %t323 + store i64 %t321, ptr %t315 + %t324 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + %t325 = load { ptr, i64, i64 }, ptr %a314 + store { ptr, i64, i64 } %t325, ptr %a327 + store { ptr, i64, i64 } { ptr @.str.4439, i64 1, i64 0 }, ptr %a328 + call void @finch_str_concat(ptr %a326, ptr %a327, ptr %a328) + %t329 = load { ptr, i64, i64 }, ptr %a326 + %t330 = load { ptr, i64, i64 }, ptr %a287 + store { ptr, i64, i64 } %t329, ptr %a332 + store { ptr, i64, i64 } %t330, ptr %a333 + call void @finch_str_concat(ptr %a331, ptr %a332, ptr %a333) + %t334 = load { ptr, i64, i64 }, ptr %a331 + %t335 = load i64, ptr %t324 + %t336 = add i64 %t335, 1 + call void @finch_arr_reserve(ptr %a155, i64 %t336, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t337 = load ptr, ptr %a155 + %t338 = getelementptr inbounds { ptr, i64, i64 }, ptr %t337, i64 %t335 + store { ptr, i64, i64 } %t334, ptr %t338 + store i64 %t336, ptr %t324 + br label %endif6910 +else6909: + %t339 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 0 + %t340 = load { ptr, i64, i64 }, ptr %t339 + store { ptr, i64, i64 } %t340, ptr %a341 + store { ptr, i64, i64 } { ptr @.str.4440, i64 8, i64 0 }, ptr %a342 + %t343 = call i32 @finch_str_eq(ptr %a341, ptr %a342) + %t344 = icmp ne i32 %t343, 0 + br i1 %t344, label %then6911, label %else6912 +then6911: + %t345 = load ptr, ptr %a1 + %t346 = load ptr, ptr %a1 + %t347 = load %S.ast.Type, ptr %a222 + %t348 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t346, %S.ast.Type %t347) + %t349 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t345, { ptr, i64, i64 } %t348) + store { ptr, i64, i64 } %t349, ptr %a350 + %t351 = load ptr, ptr %a1 + %t352 = load ptr, ptr %a1 + %t353 = load %S.ast.Type, ptr %a222 + %t354 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t352, %S.ast.Type %t353) + %t355 = getelementptr inbounds %S.gen.Val, ptr %a275, i32 0, i32 0 + %t356 = load { ptr, i64, i64 }, ptr %t355 + %t357 = load { ptr, i64, i64 }, ptr %a350 + call void @finch.gen.store(ptr %t351, { ptr, i64, i64 } %t354, { ptr, i64, i64 } %t356, { ptr, i64, i64 } %t357) + %t358 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + %t359 = load i64, ptr %t358 + %t360 = add i64 %t359, 1 + call void @finch_arr_reserve(ptr %a154, i64 %t360, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t361 = load ptr, ptr %a154 + %t362 = getelementptr inbounds { ptr, i64, i64 }, ptr %t361, i64 %t359 + store { ptr, i64, i64 } { ptr @.str.4441, i64 3, i64 0 }, ptr %t362 + store i64 %t360, ptr %t358 + %t363 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + %t364 = load { ptr, i64, i64 }, ptr %a350 + store { ptr, i64, i64 } { ptr @.str.4442, i64 4, i64 0 }, ptr %a366 + store { ptr, i64, i64 } %t364, ptr %a367 + call void @finch_str_concat(ptr %a365, ptr %a366, ptr %a367) + %t368 = load { ptr, i64, i64 }, ptr %a365 + %t369 = load i64, ptr %t363 + %t370 = add i64 %t369, 1 + call void @finch_arr_reserve(ptr %a155, i64 %t370, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t371 = load ptr, ptr %a155 + %t372 = getelementptr inbounds { ptr, i64, i64 }, ptr %t371, i64 %t369 + store { ptr, i64, i64 } %t368, ptr %t372 + store i64 %t370, ptr %t363 + br label %endif6913 +else6912: + %t373 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 0 + %t374 = load { ptr, i64, i64 }, ptr %t373 + store { ptr, i64, i64 } %t374, ptr %a375 + store { ptr, i64, i64 } { ptr @.str.4443, i64 6, i64 0 }, ptr %a376 + %t377 = call i32 @finch_str_eq(ptr %a375, ptr %a376) + %t378 = icmp ne i32 %t377, 0 + br i1 %t378, label %then6914, label %else6915 +then6914: + %t379 = load ptr, ptr %a1 + %t380 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t379, { ptr, i64, i64 } { ptr @.str.4444, i64 9, i64 0 }) + store { ptr, i64, i64 } %t380, ptr %a381 + %t382 = load ptr, ptr %a1 + %t383 = load ptr, ptr %a1 + %t384 = load %S.ast.Type, ptr %a222 + %t385 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t383, %S.ast.Type %t384) + %t386 = getelementptr inbounds %S.gen.Val, ptr %a275, i32 0, i32 0 + %t387 = load { ptr, i64, i64 }, ptr %t386 + %t388 = load { ptr, i64, i64 }, ptr %a381 + call void @finch.gen.store(ptr %t382, { ptr, i64, i64 } %t385, { ptr, i64, i64 } %t387, { ptr, i64, i64 } %t388) + %t389 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 1 + %t390 = getelementptr inbounds { ptr, i64, i64 }, ptr %t389, i32 0, i32 1 + %t391 = load i64, ptr %t390 + store i64 0, ptr %a392 + br label %for.cond6917 +for.cond6917: + %t393 = load i64, ptr %a392 + %t394 = icmp slt i64 %t393, %t391 + br i1 %t394, label %for.body6918, label %for.end6920 +for.body6918: + %t395 = load ptr, ptr %a1 + %t396 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 1 + %t397 = load i64, ptr %a392 + %t398 = load { ptr, i64, i64 }, ptr %t396 + %t399 = extractvalue { ptr, i64, i64 } %t398, 1 + %t400 = icmp uge i64 %t397, %t399 + br i1 %t400, label %range6921, label %inrange6922 +range6921: + call void @finch_panic_index(ptr @.str.4445, i64 4060, i64 %t397, i64 %t399) + unreachable +inrange6922: + %t401 = extractvalue { ptr, i64, i64 } %t398, 0 + %t402 = getelementptr inbounds { ptr, i64, i64 }, ptr %t401, i64 %t397 + %t403 = load { ptr, i64, i64 }, ptr %t402 + %t404 = load ptr, ptr %a1 + %t405 = load { ptr, i64, i64 }, ptr %a381 + store { ptr, i64, i64 } { ptr @.str.4446, i64 31, i64 0 }, ptr %a407 + store { ptr, i64, i64 } %t405, ptr %a408 + call void @finch_str_concat(ptr %a406, ptr %a407, ptr %a408) + %t409 = load { ptr, i64, i64 }, ptr %a406 + store { ptr, i64, i64 } %t409, ptr %a411 + store { ptr, i64, i64 } { ptr @.str.4447, i64 6, i64 0 }, ptr %a412 + call void @finch_str_concat(ptr %a410, ptr %a411, ptr %a412) + %t413 = load { ptr, i64, i64 }, ptr %a410 + %t414 = load i64, ptr %a392 + %t415 = mul i64 8, %t414 + call void @finch_str_from_int(ptr %a416, i64 %t415) + %t417 = load { ptr, i64, i64 }, ptr %a416 + store { ptr, i64, i64 } %t413, ptr %a419 + store { ptr, i64, i64 } %t417, ptr %a420 + call void @finch_str_concat(ptr %a418, ptr %a419, ptr %a420) + %t421 = load { ptr, i64, i64 }, ptr %a418 + %t422 = call { ptr, i64, i64 } @finch.gen.op(ptr %t404, { ptr, i64, i64 } %t421) + %t423 = call { ptr, i64, i64 } @finch.gen.load(ptr %t395, { ptr, i64, i64 } %t403, { ptr, i64, i64 } %t422) + store { ptr, i64, i64 } %t423, ptr %a424 + %t425 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + %t426 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 1 + %t427 = load i64, ptr %a392 + %t428 = load { ptr, i64, i64 }, ptr %t426 + %t429 = extractvalue { ptr, i64, i64 } %t428, 1 + %t430 = icmp uge i64 %t427, %t429 + br i1 %t430, label %range6923, label %inrange6924 +range6923: + call void @finch_panic_index(ptr @.str.4448, i64 4061, i64 %t427, i64 %t429) + unreachable +inrange6924: + %t431 = extractvalue { ptr, i64, i64 } %t428, 0 + %t432 = getelementptr inbounds { ptr, i64, i64 }, ptr %t431, i64 %t427 + %t433 = load { ptr, i64, i64 }, ptr %t432 + store { ptr, i64, i64 } %t433, ptr %a434 + call void @finch_str_copy(ptr %a435, ptr %a434) + %t436 = load { ptr, i64, i64 }, ptr %a435 + %t437 = load i64, ptr %t425 + %t438 = add i64 %t437, 1 + call void @finch_arr_reserve(ptr %a154, i64 %t438, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t439 = load ptr, ptr %a154 + %t440 = getelementptr inbounds { ptr, i64, i64 }, ptr %t439, i64 %t437 + store { ptr, i64, i64 } %t436, ptr %t440 + store i64 %t438, ptr %t425 + %t441 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + %t442 = getelementptr inbounds %S.gen.Abi, ptr %a234, i32 0, i32 1 + %t443 = load i64, ptr %a392 + %t444 = load { ptr, i64, i64 }, ptr %t442 + %t445 = extractvalue { ptr, i64, i64 } %t444, 1 + %t446 = icmp uge i64 %t443, %t445 + br i1 %t446, label %range6925, label %inrange6926 +range6925: + call void @finch_panic_index(ptr @.str.4449, i64 4062, i64 %t443, i64 %t445) + unreachable +inrange6926: + %t447 = extractvalue { ptr, i64, i64 } %t444, 0 + %t448 = getelementptr inbounds { ptr, i64, i64 }, ptr %t447, i64 %t443 + %t449 = load { ptr, i64, i64 }, ptr %t448 + store { ptr, i64, i64 } %t449, ptr %a451 + store { ptr, i64, i64 } { ptr @.str.4450, i64 1, i64 0 }, ptr %a452 + call void @finch_str_concat(ptr %a450, ptr %a451, ptr %a452) + %t453 = load { ptr, i64, i64 }, ptr %a450 + %t454 = load { ptr, i64, i64 }, ptr %a424 + store { ptr, i64, i64 } %t453, ptr %a456 + store { ptr, i64, i64 } %t454, ptr %a457 + call void @finch_str_concat(ptr %a455, ptr %a456, ptr %a457) + %t458 = load { ptr, i64, i64 }, ptr %a455 + %t459 = load i64, ptr %t441 + %t460 = add i64 %t459, 1 + call void @finch_arr_reserve(ptr %a155, i64 %t460, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t461 = load ptr, ptr %a155 + %t462 = getelementptr inbounds { ptr, i64, i64 }, ptr %t461, i64 %t459 + store { ptr, i64, i64 } %t458, ptr %t462 + store i64 %t460, ptr %t441 + br label %for.step6919 +for.step6919: + %t463 = load i64, ptr %a392 + %t464 = add i64 %t463, 1 + store i64 %t464, ptr %a392 + br label %for.cond6917 +for.end6920: + br label %endif6916 +else6915: + %t465 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + %t466 = load ptr, ptr %a1 + %t467 = load %S.ast.Type, ptr %a222 + %t468 = call { ptr, i64, i64 } @finch.gen.cLL(ptr %t466, %S.ast.Type %t467) + %t469 = load ptr, ptr %a1 + %t470 = load %S.ast.Type, ptr %a222 + %t471 = call { ptr, i64, i64 } @finch.gen.cExt(ptr %t469, %S.ast.Type %t470) + store { ptr, i64, i64 } %t468, ptr %a473 + store { ptr, i64, i64 } %t471, ptr %a474 + call void @finch_str_concat(ptr %a472, ptr %a473, ptr %a474) + %t475 = load { ptr, i64, i64 }, ptr %a472 + %t476 = load i64, ptr %t465 + %t477 = add i64 %t476, 1 + call void @finch_arr_reserve(ptr %a154, i64 %t477, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t478 = load ptr, ptr %a154 + %t479 = getelementptr inbounds { ptr, i64, i64 }, ptr %t478, i64 %t476 + store { ptr, i64, i64 } %t475, ptr %t479 + store i64 %t477, ptr %t465 + %t480 = getelementptr inbounds %S.ast.Type, ptr %a222, i32 0, i32 0 + %t481 = load { ptr, i64, i64 }, ptr %t480 + store { ptr, i64, i64 } %t481, ptr %a482 + store { ptr, i64, i64 } { ptr @.str.4451, i64 3, i64 0 }, ptr %a483 + %t484 = call i32 @finch_str_eq(ptr %a482, ptr %a483) + %t485 = icmp ne i32 %t484, 0 + br i1 %t485, label %then6927, label %else6928 +then6927: + %t486 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + %t487 = load ptr, ptr %a1 + %t488 = getelementptr inbounds %S.gen.Val, ptr %a275, i32 0, i32 0 + %t489 = load { ptr, i64, i64 }, ptr %t488 + %t490 = call { ptr, i64, i64 } @finch.gen.cstr(ptr %t487, { ptr, i64, i64 } %t489) + store { ptr, i64, i64 } { ptr @.str.4452, i64 4, i64 0 }, ptr %a492 + store { ptr, i64, i64 } %t490, ptr %a493 + call void @finch_str_concat(ptr %a491, ptr %a492, ptr %a493) + %t494 = load { ptr, i64, i64 }, ptr %a491 + %t495 = load i64, ptr %t486 + %t496 = add i64 %t495, 1 + call void @finch_arr_reserve(ptr %a155, i64 %t496, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t497 = load ptr, ptr %a155 + %t498 = getelementptr inbounds { ptr, i64, i64 }, ptr %t497, i64 %t495 + store { ptr, i64, i64 } %t494, ptr %t498 + store i64 %t496, ptr %t486 + br label %endif6929 +else6928: + %t499 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + %t500 = load ptr, ptr %a1 + %t501 = load %S.ast.Type, ptr %a222 + %t502 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t500, %S.ast.Type %t501) + %t503 = load ptr, ptr %a1 + %t504 = load %S.ast.Type, ptr %a222 + %t505 = call { ptr, i64, i64 } @finch.gen.cExt(ptr %t503, %S.ast.Type %t504) + store { ptr, i64, i64 } %t502, ptr %a507 + store { ptr, i64, i64 } %t505, ptr %a508 + call void @finch_str_concat(ptr %a506, ptr %a507, ptr %a508) + %t509 = load { ptr, i64, i64 }, ptr %a506 + store { ptr, i64, i64 } %t509, ptr %a511 + store { ptr, i64, i64 } { ptr @.str.4453, i64 1, i64 0 }, ptr %a512 + call void @finch_str_concat(ptr %a510, ptr %a511, ptr %a512) + %t513 = load { ptr, i64, i64 }, ptr %a510 + %t514 = getelementptr inbounds %S.gen.Val, ptr %a275, i32 0, i32 0 + %t515 = load { ptr, i64, i64 }, ptr %t514 + store { ptr, i64, i64 } %t513, ptr %a517 + store { ptr, i64, i64 } %t515, ptr %a518 + call void @finch_str_concat(ptr %a516, ptr %a517, ptr %a518) + %t519 = load { ptr, i64, i64 }, ptr %a516 + %t520 = load i64, ptr %t499 + %t521 = add i64 %t520, 1 + call void @finch_arr_reserve(ptr %a155, i64 %t521, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t522 = load ptr, ptr %a155 + %t523 = getelementptr inbounds { ptr, i64, i64 }, ptr %t522, i64 %t520 + store { ptr, i64, i64 } %t519, ptr %t523 + store i64 %t521, ptr %t499 + br label %endif6929 +endif6929: + br label %endif6916 +endif6916: + br label %endif6913 +endif6913: + br label %endif6910 +endif6910: + br label %for.step6895 +endif6899: + %t524 = load ptr, ptr %a1 + %t525 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t526 = load i64, ptr %a204 + %t527 = load { ptr, i64, i64 }, ptr %t525 + %t528 = extractvalue { ptr, i64, i64 } %t527, 1 + %t529 = icmp uge i64 %t526, %t528 + br i1 %t529, label %range6930, label %inrange6931 +range6930: + call void @finch_panic_index(ptr @.str.4454, i64 4075, i64 %t526, i64 %t528) + unreachable +inrange6931: + %t530 = extractvalue { ptr, i64, i64 } %t527, 0 + %t531 = getelementptr inbounds %S.ast.Node, ptr %t530, i64 %t526 + %t532 = load %S.ast.Node, ptr %t531 + %t533 = call %S.gen.Val @finch.gen.expr(ptr %t524, %S.ast.Node %t532) + store %S.gen.Val %t533, ptr %a534 + %t535 = getelementptr inbounds %S.gen.Val, ptr %a534, i32 0, i32 1 + %t536 = load %S.ast.Type, ptr %t535 + store %S.ast.Type %t536, ptr %a537 + call void @finch.copy.S_ast_Type(ptr %a538, ptr %a537) + %t539 = load %S.ast.Type, ptr %a538 + store %S.ast.Type %t539, ptr %a540 + %t541 = getelementptr inbounds %S.ast.Type, ptr %a540, i32 0, i32 0 + %t542 = load { ptr, i64, i64 }, ptr %t541 + store { ptr, i64, i64 } %t542, ptr %a543 + store { ptr, i64, i64 } { ptr @.str.4455, i64 4, i64 0 }, ptr %a544 + %t545 = call i32 @finch_str_eq(ptr %a543, ptr %a544) + %t546 = icmp ne i32 %t545, 0 + br i1 %t546, label %then6932, label %endif6934 +then6932: + %t547 = load ptr, ptr %a1 + %t548 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t549 = load i64, ptr %a204 + %t550 = load { ptr, i64, i64 }, ptr %t548 + %t551 = extractvalue { ptr, i64, i64 } %t550, 1 + %t552 = icmp uge i64 %t549, %t551 + br i1 %t552, label %range6935, label %inrange6936 +range6935: + call void @finch_panic_index(ptr @.str.4456, i64 4078, i64 %t549, i64 %t551) + unreachable +inrange6936: + %t553 = extractvalue { ptr, i64, i64 } %t550, 0 + %t554 = getelementptr inbounds %S.ast.Node, ptr %t553, i64 %t549 + %t555 = load %S.ast.Node, ptr %t554 + call void @finch.gen.fail(ptr %t547, %S.ast.Node %t555, { ptr, i64, i64 } { ptr @.str.4457, i64 23, i64 0 }) + br label %endif6934 +endif6934: + %t556 = getelementptr inbounds %S.ast.Type, ptr %a540, i32 0, i32 0 + %t557 = load { ptr, i64, i64 }, ptr %t556 + store { ptr, i64, i64 } %t557, ptr %a558 + store { ptr, i64, i64 } { ptr @.str.4458, i64 6, i64 0 }, ptr %a559 + %t560 = call i32 @finch_str_eq(ptr %a558, ptr %a559) + %t561 = icmp ne i32 %t560, 0 + br label %logic.from6937 +logic.from6937: + br i1 %t561, label %logic.end6939, label %logic.rhs6938 +logic.rhs6938: + %t562 = getelementptr inbounds %S.ast.Type, ptr %a540, i32 0, i32 0 + %t563 = load { ptr, i64, i64 }, ptr %t562 + store { ptr, i64, i64 } %t563, ptr %a564 + store { ptr, i64, i64 } { ptr @.str.4459, i64 5, i64 0 }, ptr %a565 + %t566 = call i32 @finch_str_eq(ptr %a564, ptr %a565) + %t567 = icmp ne i32 %t566, 0 + br label %logic.rend6940 +logic.rend6940: + br label %logic.end6939 +logic.end6939: + %t568 = phi i1 [ true, %logic.from6937 ], [ %t567, %logic.rend6940 ] + br i1 %t568, label %then6941, label %endif6943 +then6941: + %t569 = load ptr, ptr %a1 + %t570 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t571 = load i64, ptr %a204 + %t572 = load { ptr, i64, i64 }, ptr %t570 + %t573 = extractvalue { ptr, i64, i64 } %t572, 1 + %t574 = icmp uge i64 %t571, %t573 + br i1 %t574, label %range6944, label %inrange6945 +range6944: + call void @finch_panic_index(ptr @.str.4460, i64 4081, i64 %t571, i64 %t573) + unreachable +inrange6945: + %t575 = extractvalue { ptr, i64, i64 } %t572, 0 + %t576 = getelementptr inbounds %S.ast.Node, ptr %t575, i64 %t571 + %t577 = load %S.ast.Node, ptr %t576 + call void @finch.gen.fail(ptr %t569, %S.ast.Node %t577, { ptr, i64, i64 } { ptr @.str.4461, i64 68, i64 0 }) + br label %endif6943 +endif6943: + %t578 = getelementptr inbounds %S.gen.Val, ptr %a534, i32 0, i32 0 + %t579 = load { ptr, i64, i64 }, ptr %t578 + store { ptr, i64, i64 } %t579, ptr %a580 + call void @finch_str_copy(ptr %a581, ptr %a580) + %t582 = load { ptr, i64, i64 }, ptr %a581 + store { ptr, i64, i64 } %t582, ptr %a583 + %t584 = getelementptr inbounds %S.ast.Type, ptr %a540, i32 0, i32 0 + %t585 = load { ptr, i64, i64 }, ptr %t584 + store { ptr, i64, i64 } %t585, ptr %a586 + store { ptr, i64, i64 } { ptr @.str.4462, i64 3, i64 0 }, ptr %a587 + %t588 = call i32 @finch_str_eq(ptr %a586, ptr %a587) + %t589 = icmp ne i32 %t588, 0 + br i1 %t589, label %then6946, label %else6947 +then6946: + %t590 = load ptr, ptr %a1 + %t591 = load { ptr, i64, i64 }, ptr %a583 + %t592 = load %S.ast.Type, ptr %a540 + %t593 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4463, i64 5, i64 0 }) + %t594 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t590, { ptr, i64, i64 } %t591, %S.ast.Type %t592, %S.ast.Type %t593) + store { ptr, i64, i64 } %t594, ptr %a583 + %t595 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4464, i64 5, i64 0 }) + store %S.ast.Type %t595, ptr %a540 + br label %endif6948 +else6947: + %t596 = getelementptr inbounds %S.ast.Type, ptr %a540, i32 0, i32 0 + %t597 = load { ptr, i64, i64 }, ptr %t596 + store { ptr, i64, i64 } %t597, ptr %a598 + store { ptr, i64, i64 } { ptr @.str.4465, i64 3, i64 0 }, ptr %a599 + %t600 = call i32 @finch_str_eq(ptr %a598, ptr %a599) + %t601 = icmp ne i32 %t600, 0 + br i1 %t601, label %then6949, label %else6950 +then6949: + %t602 = load ptr, ptr %a1 + %t603 = load { ptr, i64, i64 }, ptr %a583 + %t604 = call { ptr, i64, i64 } @finch.gen.cstr(ptr %t602, { ptr, i64, i64 } %t603) + store { ptr, i64, i64 } %t604, ptr %a583 + %t605 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4466, i64 3, i64 0 }) + store %S.ast.Type %t605, ptr %a540 + br label %endif6951 +else6950: + %t606 = getelementptr inbounds %S.ast.Type, ptr %a540, i32 0, i32 0 + %t607 = load { ptr, i64, i64 }, ptr %t606 + store { ptr, i64, i64 } %t607, ptr %a608 + store { ptr, i64, i64 } { ptr @.str.4467, i64 4, i64 0 }, ptr %a609 + %t610 = call i32 @finch_str_eq(ptr %a608, ptr %a609) + %t611 = icmp ne i32 %t610, 0 + br i1 %t611, label %then6952, label %else6953 +then6952: + %t612 = load ptr, ptr %a1 + %t613 = getelementptr inbounds %S.gen.Val, ptr %a534, i32 0, i32 0 + %t614 = load { ptr, i64, i64 }, ptr %t613 + store { ptr, i64, i64 } { ptr @.str.4468, i64 8, i64 0 }, ptr %a616 + store { ptr, i64, i64 } %t614, ptr %a617 + call void @finch_str_concat(ptr %a615, ptr %a616, ptr %a617) + %t618 = load { ptr, i64, i64 }, ptr %a615 + store { ptr, i64, i64 } %t618, ptr %a620 + store { ptr, i64, i64 } { ptr @.str.4469, i64 7, i64 0 }, ptr %a621 + call void @finch_str_concat(ptr %a619, ptr %a620, ptr %a621) + %t622 = load { ptr, i64, i64 }, ptr %a619 + %t623 = call { ptr, i64, i64 } @finch.gen.op(ptr %t612, { ptr, i64, i64 } %t622) + store { ptr, i64, i64 } %t623, ptr %a583 + %t624 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4470, i64 3, i64 0 }) + store %S.ast.Type %t624, ptr %a540 + br label %endif6954 +else6953: + %t625 = load %S.ast.Type, ptr %a540 + %t626 = call i1 @finch.gen.isInt(%S.ast.Type %t625) + br label %logic.from6955 +logic.from6955: + br i1 %t626, label %logic.end6957, label %logic.rhs6956 +logic.rhs6956: + %t627 = getelementptr inbounds %S.ast.Type, ptr %a540, i32 0, i32 0 + %t628 = load { ptr, i64, i64 }, ptr %t627 + store { ptr, i64, i64 } %t628, ptr %a629 + store { ptr, i64, i64 } { ptr @.str.4471, i64 4, i64 0 }, ptr %a630 + %t631 = call i32 @finch_str_eq(ptr %a629, ptr %a630) + %t632 = icmp ne i32 %t631, 0 + br label %logic.rend6958 +logic.rend6958: + br label %logic.end6957 +logic.end6957: + %t633 = phi i1 [ true, %logic.from6955 ], [ %t632, %logic.rend6958 ] + br label %logic.from6959 +logic.from6959: + br i1 %t633, label %logic.rhs6960, label %logic.end6961 +logic.rhs6960: + %t634 = load %S.ast.Type, ptr %a540 + %t635 = call i64 @finch.gen.bitsOf(%S.ast.Type %t634) + %t636 = icmp slt i64 %t635, 32 + br label %logic.rend6962 +logic.rend6962: + br label %logic.end6961 +logic.end6961: + %t637 = phi i1 [ false, %logic.from6959 ], [ %t636, %logic.rend6962 ] + br i1 %t637, label %then6963, label %endif6965 +then6963: + %t638 = load ptr, ptr %a1 + %t639 = load { ptr, i64, i64 }, ptr %a583 + %t640 = load %S.ast.Type, ptr %a540 + %t641 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4472, i64 3, i64 0 }) + %t642 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t638, { ptr, i64, i64 } %t639, %S.ast.Type %t640, %S.ast.Type %t641) + store { ptr, i64, i64 } %t642, ptr %a583 + %t643 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4473, i64 3, i64 0 }) + store %S.ast.Type %t643, ptr %a540 + br label %endif6965 +endif6965: + br label %endif6954 +endif6954: + br label %endif6951 +endif6951: + br label %endif6948 +endif6948: + %t644 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + %t645 = load ptr, ptr %a1 + %t646 = load %S.ast.Type, ptr %a540 + %t647 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t645, %S.ast.Type %t646) + store { ptr, i64, i64 } %t647, ptr %a649 + store { ptr, i64, i64 } { ptr @.str.4474, i64 1, i64 0 }, ptr %a650 + call void @finch_str_concat(ptr %a648, ptr %a649, ptr %a650) + %t651 = load { ptr, i64, i64 }, ptr %a648 + %t652 = load { ptr, i64, i64 }, ptr %a583 + store { ptr, i64, i64 } %t651, ptr %a654 + store { ptr, i64, i64 } %t652, ptr %a655 + call void @finch_str_concat(ptr %a653, ptr %a654, ptr %a655) + %t656 = load { ptr, i64, i64 }, ptr %a653 + %t657 = load i64, ptr %t644 + %t658 = add i64 %t657, 1 + call void @finch_arr_reserve(ptr %a155, i64 %t658, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t659 = load ptr, ptr %a155 + %t660 = getelementptr inbounds { ptr, i64, i64 }, ptr %t659, i64 %t657 + store { ptr, i64, i64 } %t656, ptr %t660 + store i64 %t658, ptr %t644 + br label %for.step6895 +for.step6895: + %t661 = load i64, ptr %a204 + %t662 = add i64 %t661, 1 + store i64 %t662, ptr %a204 + br label %for.cond6893 +for.end6896: + %t663 = getelementptr inbounds %S.gen.Plan, ptr %a153, i32 0, i32 2 + %t664 = load { ptr, i64, i64 }, ptr %t663 + store { ptr, i64, i64 } %t664, ptr %a665 + call void @finch_str_copy(ptr %a666, ptr %a665) + %t667 = load { ptr, i64, i64 }, ptr %a666 + store { ptr, i64, i64 } %t667, ptr %a668 + store { ptr, i64, i64 } { ptr @.str.4475, i64 0, i64 0 }, ptr %a669 + %t670 = getelementptr inbounds %S.gen.Plan, ptr %a153, i32 0, i32 0 + %t671 = getelementptr inbounds %S.gen.Abi, ptr %t670, i32 0, i32 0 + %t672 = load { ptr, i64, i64 }, ptr %t671 + store { ptr, i64, i64 } %t672, ptr %a673 + store { ptr, i64, i64 } { ptr @.str.4476, i64 6, i64 0 }, ptr %a674 + %t675 = call i32 @finch_str_eq(ptr %a673, ptr %a674) + %t676 = icmp ne i32 %t675, 0 + br i1 %t676, label %then6966, label %endif6968 +then6966: + %t677 = load ptr, ptr %a1 + %t678 = load %S.ast.Type, ptr %a111 + %t679 = call { ptr, i64, i64 } @finch.gen.cExt(ptr %t677, %S.ast.Type %t678) + store { ptr, i64, i64 } %t679, ptr %a669 + br label %endif6968 +endif6968: + store { ptr, i64, i64 } { ptr @.str.4477, i64 0, i64 0 }, ptr %a680 + %t681 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 4 + %t682 = load i1, ptr %t681 + br i1 %t682, label %then6969, label %endif6971 +then6969: + store { ptr, i64, i64 } { ptr @.str.4478, i64 5, i64 0 }, ptr %a680 + %t683 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + %t684 = load i64, ptr %t683 + %t685 = icmp eq i64 %t684, 0 + br i1 %t685, label %then6972, label %endif6974 +then6972: + store { ptr, i64, i64 } { ptr @.str.4479, i64 3, i64 0 }, ptr %a680 + br label %endif6974 +endif6974: + br label %endif6971 +endif6971: + %t686 = load ptr, ptr %a1 + %t687 = icmp eq ptr %t686, null + br i1 %t687, label %panic6975, label %ok6976 +panic6975: + call void @finch_panic(ptr @.str.4480, i64 4112, ptr @.str.4481) + unreachable +ok6976: + %t688 = getelementptr inbounds %S.gen.Gen, ptr %t686, i32 0, i32 36 + %t689 = getelementptr inbounds { ptr, i64, i64 }, ptr %t688, i32 0, i32 1 + %t690 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t691 = load { ptr, i64, i64 }, ptr %t690 + store { ptr, i64, i64 } { ptr @.str.4482, i64 2, i64 0 }, ptr %a693 + store { ptr, i64, i64 } %t691, ptr %a694 + call void @finch_str_concat(ptr %a692, ptr %a693, ptr %a694) + %t695 = load { ptr, i64, i64 }, ptr %a692 + store i64 -1, ptr %a696 + %t697 = load i64, ptr %t689 + %t698 = load ptr, ptr %t688 + store i64 0, ptr %a699 + br label %find.cond6977 +find.cond6977: + %t700 = load i64, ptr %a699 + %t701 = icmp slt i64 %t700, %t697 + br i1 %t701, label %find.body6978, label %find.end6981 +find.body6978: + %t702 = getelementptr inbounds { ptr, i64, i64 }, ptr %t698, i64 %t700 + %t703 = load { ptr, i64, i64 }, ptr %t702 + store { ptr, i64, i64 } %t703, ptr %a704 + store { ptr, i64, i64 } %t695, ptr %a705 + %t706 = call i32 @finch_str_eq(ptr %a704, ptr %a705) + %t707 = icmp ne i32 %t706, 0 + br i1 %t707, label %find.hit6979, label %find.next6980 +find.hit6979: + store i64 %t700, ptr %a696 + br label %find.end6981 +find.next6980: + %t708 = add i64 %t700, 1 + store i64 %t708, ptr %a699 + br label %find.cond6977 +find.end6981: + %t709 = load i64, ptr %a696 + %t710 = icmp sge i64 %t709, 0 + %t711 = xor i1 %t710, true + br i1 %t711, label %then6982, label %endif6984 +then6982: + %t712 = load ptr, ptr %a1 + %t713 = icmp eq ptr %t712, null + br i1 %t713, label %panic6985, label %ok6986 +panic6985: + call void @finch_panic(ptr @.str.4483, i64 4113, ptr @.str.4484) + unreachable +ok6986: + %t714 = getelementptr inbounds %S.gen.Gen, ptr %t712, i32 0, i32 36 + %t715 = getelementptr inbounds { ptr, i64, i64 }, ptr %t714, i32 0, i32 1 + %t716 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t717 = load { ptr, i64, i64 }, ptr %t716 + store { ptr, i64, i64 } { ptr @.str.4485, i64 2, i64 0 }, ptr %a719 + store { ptr, i64, i64 } %t717, ptr %a720 + call void @finch_str_concat(ptr %a718, ptr %a719, ptr %a720) + %t721 = load { ptr, i64, i64 }, ptr %a718 + %t722 = load i64, ptr %t715 + %t723 = add i64 %t722, 1 + call void @finch_arr_reserve(ptr %t714, i64 %t723, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t724 = load ptr, ptr %t714 + %t725 = getelementptr inbounds { ptr, i64, i64 }, ptr %t724, i64 %t722 + store { ptr, i64, i64 } %t721, ptr %t725 + store i64 %t723, ptr %t715 + %t726 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t727 = load { ptr, i64, i64 }, ptr %t726 + %t728 = call i1 @finch.gen.runtimeDeclares({ ptr, i64, i64 } %t727) + %t729 = xor i1 %t728, true + br i1 %t729, label %then6987, label %endif6989 +then6987: + %t730 = load ptr, ptr %a1 + %t731 = icmp eq ptr %t730, null + br i1 %t731, label %panic6990, label %ok6991 +panic6990: + call void @finch_panic(ptr @.str.4486, i64 4115, ptr @.str.4487) + unreachable +ok6991: + %t732 = getelementptr inbounds %S.gen.Gen, ptr %t730, i32 0, i32 2 + %t733 = getelementptr inbounds { ptr, i64, i64 }, ptr %t732, i32 0, i32 1 + %t734 = load { ptr, i64, i64 }, ptr %a669 + store { ptr, i64, i64 } { ptr @.str.4488, i64 7, i64 0 }, ptr %a736 + store { ptr, i64, i64 } %t734, ptr %a737 + call void @finch_str_concat(ptr %a735, ptr %a736, ptr %a737) + %t738 = load { ptr, i64, i64 }, ptr %a735 + store { ptr, i64, i64 } %t738, ptr %a740 + store { ptr, i64, i64 } { ptr @.str.4489, i64 1, i64 0 }, ptr %a741 + call void @finch_str_concat(ptr %a739, ptr %a740, ptr %a741) + %t742 = load { ptr, i64, i64 }, ptr %a739 + %t743 = load { ptr, i64, i64 }, ptr %a668 + store { ptr, i64, i64 } %t742, ptr %a745 + store { ptr, i64, i64 } %t743, ptr %a746 + call void @finch_str_concat(ptr %a744, ptr %a745, ptr %a746) + %t747 = load { ptr, i64, i64 }, ptr %a744 + store { ptr, i64, i64 } %t747, ptr %a749 + store { ptr, i64, i64 } { ptr @.str.4490, i64 2, i64 0 }, ptr %a750 + call void @finch_str_concat(ptr %a748, ptr %a749, ptr %a750) + %t751 = load { ptr, i64, i64 }, ptr %a748 + %t752 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t753 = load { ptr, i64, i64 }, ptr %t752 + store { ptr, i64, i64 } %t751, ptr %a755 + store { ptr, i64, i64 } %t753, ptr %a756 + call void @finch_str_concat(ptr %a754, ptr %a755, ptr %a756) + %t757 = load { ptr, i64, i64 }, ptr %a754 + store { ptr, i64, i64 } %t757, ptr %a759 + store { ptr, i64, i64 } { ptr @.str.4491, i64 1, i64 0 }, ptr %a760 + call void @finch_str_concat(ptr %a758, ptr %a759, ptr %a760) + %t761 = load { ptr, i64, i64 }, ptr %a758 + %t762 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4492, i64 2, i64 0 }, ptr %a763 + call void @finch_str_join(ptr %a764, ptr %a154, ptr %a763) + %t765 = load { ptr, i64, i64 }, ptr %a764 + store { ptr, i64, i64 } %t761, ptr %a767 + store { ptr, i64, i64 } %t765, ptr %a768 + call void @finch_str_concat(ptr %a766, ptr %a767, ptr %a768) + %t769 = load { ptr, i64, i64 }, ptr %a766 + %t770 = load { ptr, i64, i64 }, ptr %a680 + store { ptr, i64, i64 } %t769, ptr %a772 + store { ptr, i64, i64 } %t770, ptr %a773 + call void @finch_str_concat(ptr %a771, ptr %a772, ptr %a773) + %t774 = load { ptr, i64, i64 }, ptr %a771 + store { ptr, i64, i64 } %t774, ptr %a776 + store { ptr, i64, i64 } { ptr @.str.4493, i64 1, i64 0 }, ptr %a777 + call void @finch_str_concat(ptr %a775, ptr %a776, ptr %a777) + %t778 = load { ptr, i64, i64 }, ptr %a775 + %t779 = load i64, ptr %t733 + %t780 = add i64 %t779, 1 + call void @finch_arr_reserve(ptr %t732, i64 %t780, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t781 = load ptr, ptr %t732 + %t782 = getelementptr inbounds { ptr, i64, i64 }, ptr %t781, i64 %t779 + store { ptr, i64, i64 } %t778, ptr %t782 + store i64 %t780, ptr %t733 + br label %endif6989 +endif6989: + br label %endif6984 +endif6984: + store { ptr, i64, i64 } { ptr @.str.4494, i64 0, i64 0 }, ptr %a783 + %t784 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 4 + %t785 = load i1, ptr %t784 + br i1 %t785, label %then6992, label %endif6994 +then6992: + %t786 = getelementptr inbounds { ptr, i64, i64 }, ptr %a154, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4496, i64 2, i64 0 }, ptr %a787 + call void @finch_str_join(ptr %a788, ptr %a154, ptr %a787) + %t789 = load { ptr, i64, i64 }, ptr %a788 + store { ptr, i64, i64 } { ptr @.str.4495, i64 2, i64 0 }, ptr %a791 + store { ptr, i64, i64 } %t789, ptr %a792 + call void @finch_str_concat(ptr %a790, ptr %a791, ptr %a792) + %t793 = load { ptr, i64, i64 }, ptr %a790 + %t794 = load { ptr, i64, i64 }, ptr %a680 + store { ptr, i64, i64 } %t793, ptr %a796 + store { ptr, i64, i64 } %t794, ptr %a797 + call void @finch_str_concat(ptr %a795, ptr %a796, ptr %a797) + %t798 = load { ptr, i64, i64 }, ptr %a795 + store { ptr, i64, i64 } %t798, ptr %a800 + store { ptr, i64, i64 } { ptr @.str.4497, i64 1, i64 0 }, ptr %a801 + call void @finch_str_concat(ptr %a799, ptr %a800, ptr %a801) + %t802 = load { ptr, i64, i64 }, ptr %a799 + store { ptr, i64, i64 } %t802, ptr %a783 + br label %endif6994 +endif6994: + %t803 = load { ptr, i64, i64 }, ptr %a669 + store { ptr, i64, i64 } { ptr @.str.4498, i64 4, i64 0 }, ptr %a805 + store { ptr, i64, i64 } %t803, ptr %a806 + call void @finch_str_concat(ptr %a804, ptr %a805, ptr %a806) + %t807 = load { ptr, i64, i64 }, ptr %a804 + store { ptr, i64, i64 } %t807, ptr %a809 + store { ptr, i64, i64 } { ptr @.str.4499, i64 1, i64 0 }, ptr %a810 + call void @finch_str_concat(ptr %a808, ptr %a809, ptr %a810) + %t811 = load { ptr, i64, i64 }, ptr %a808 + %t812 = load { ptr, i64, i64 }, ptr %a668 + store { ptr, i64, i64 } %t811, ptr %a814 + store { ptr, i64, i64 } %t812, ptr %a815 + call void @finch_str_concat(ptr %a813, ptr %a814, ptr %a815) + %t816 = load { ptr, i64, i64 }, ptr %a813 + %t817 = load { ptr, i64, i64 }, ptr %a783 + store { ptr, i64, i64 } %t816, ptr %a819 + store { ptr, i64, i64 } %t817, ptr %a820 + call void @finch_str_concat(ptr %a818, ptr %a819, ptr %a820) + %t821 = load { ptr, i64, i64 }, ptr %a818 + store { ptr, i64, i64 } %t821, ptr %a823 + store { ptr, i64, i64 } { ptr @.str.4500, i64 2, i64 0 }, ptr %a824 + call void @finch_str_concat(ptr %a822, ptr %a823, ptr %a824) + %t825 = load { ptr, i64, i64 }, ptr %a822 + %t826 = getelementptr inbounds %S.cimport.CFunc, ptr %a3, i32 0, i32 0 + %t827 = load { ptr, i64, i64 }, ptr %t826 + store { ptr, i64, i64 } %t825, ptr %a829 + store { ptr, i64, i64 } %t827, ptr %a830 + call void @finch_str_concat(ptr %a828, ptr %a829, ptr %a830) + %t831 = load { ptr, i64, i64 }, ptr %a828 + store { ptr, i64, i64 } %t831, ptr %a833 + store { ptr, i64, i64 } { ptr @.str.4501, i64 1, i64 0 }, ptr %a834 + call void @finch_str_concat(ptr %a832, ptr %a833, ptr %a834) + %t835 = load { ptr, i64, i64 }, ptr %a832 + %t836 = getelementptr inbounds { ptr, i64, i64 }, ptr %a155, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4502, i64 2, i64 0 }, ptr %a837 + call void @finch_str_join(ptr %a838, ptr %a155, ptr %a837) + %t839 = load { ptr, i64, i64 }, ptr %a838 + store { ptr, i64, i64 } %t835, ptr %a841 + store { ptr, i64, i64 } %t839, ptr %a842 + call void @finch_str_concat(ptr %a840, ptr %a841, ptr %a842) + %t843 = load { ptr, i64, i64 }, ptr %a840 + store { ptr, i64, i64 } %t843, ptr %a845 + store { ptr, i64, i64 } { ptr @.str.4503, i64 1, i64 0 }, ptr %a846 + call void @finch_str_concat(ptr %a844, ptr %a845, ptr %a846) + %t847 = load { ptr, i64, i64 }, ptr %a844 + store { ptr, i64, i64 } %t847, ptr %a848 + %t849 = getelementptr inbounds %S.ast.Type, ptr %a111, i32 0, i32 0 + %t850 = load { ptr, i64, i64 }, ptr %t849 + store { ptr, i64, i64 } %t850, ptr %a851 + store { ptr, i64, i64 } { ptr @.str.4504, i64 4, i64 0 }, ptr %a852 + %t853 = call i32 @finch_str_eq(ptr %a851, ptr %a852) + %t854 = icmp ne i32 %t853, 0 + br i1 %t854, label %then6995, label %endif6997 +then6995: + %t855 = load ptr, ptr %a1 + %t856 = load { ptr, i64, i64 }, ptr %a848 + call void @finch.gen.emit(ptr %t855, { ptr, i64, i64 } %t856) + %t857 = load %S.ast.Type, ptr %a111 + store %S.ast.Type %t857, ptr %a858 + call void @finch.copy.S_ast_Type(ptr %a859, ptr %a858) + %t860 = load %S.ast.Type, ptr %a859 + %t861 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t860, 1 + ret %S.gen.Val %t861 +endif6997: + %t862 = getelementptr inbounds %S.gen.Plan, ptr %a153, i32 0, i32 3 + %t863 = load i1, ptr %t862 + br i1 %t863, label %then6998, label %endif7000 +then6998: + %t864 = load ptr, ptr %a1 + %t865 = load { ptr, i64, i64 }, ptr %a848 + call void @finch.gen.emit(ptr %t864, { ptr, i64, i64 } %t865) + %t866 = load ptr, ptr %a1 + %t867 = load ptr, ptr %a1 + %t868 = load %S.ast.Type, ptr %a111 + %t869 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t867, %S.ast.Type %t868) + %t870 = load { ptr, i64, i64 }, ptr %a156 + %t871 = call { ptr, i64, i64 } @finch.gen.load(ptr %t866, { ptr, i64, i64 } %t869, { ptr, i64, i64 } %t870) + %t872 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t871, 0 + %t873 = load %S.ast.Type, ptr %a111 + store %S.ast.Type %t873, ptr %a874 + call void @finch.copy.S_ast_Type(ptr %a875, ptr %a874) + %t876 = load %S.ast.Type, ptr %a875 + %t877 = insertvalue %S.gen.Val %t872, %S.ast.Type %t876, 1 + ret %S.gen.Val %t877 +endif7000: + %t878 = load ptr, ptr %a1 + %t879 = load { ptr, i64, i64 }, ptr %a848 + %t880 = call { ptr, i64, i64 } @finch.gen.op(ptr %t878, { ptr, i64, i64 } %t879) + store { ptr, i64, i64 } %t880, ptr %a881 + %t882 = getelementptr inbounds %S.gen.Plan, ptr %a153, i32 0, i32 0 + %t883 = getelementptr inbounds %S.gen.Abi, ptr %t882, i32 0, i32 0 + %t884 = load { ptr, i64, i64 }, ptr %t883 + store { ptr, i64, i64 } %t884, ptr %a885 + store { ptr, i64, i64 } { ptr @.str.4505, i64 6, i64 0 }, ptr %a886 + %t887 = call i32 @finch_str_eq(ptr %a885, ptr %a886) + %t888 = icmp ne i32 %t887, 0 + br i1 %t888, label %then7001, label %endif7003 +then7001: + %t889 = load ptr, ptr %a1 + %t890 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t889, { ptr, i64, i64 } { ptr @.str.4506, i64 9, i64 0 }) + store { ptr, i64, i64 } %t890, ptr %a891 + %t892 = load ptr, ptr %a1 + %t893 = getelementptr inbounds %S.gen.Plan, ptr %a153, i32 0, i32 0 + %t894 = getelementptr inbounds %S.gen.Abi, ptr %t893, i32 0, i32 2 + %t895 = load { ptr, i64, i64 }, ptr %t894 + %t896 = load { ptr, i64, i64 }, ptr %a881 + %t897 = load { ptr, i64, i64 }, ptr %a891 + call void @finch.gen.store(ptr %t892, { ptr, i64, i64 } %t895, { ptr, i64, i64 } %t896, { ptr, i64, i64 } %t897) + %t898 = load ptr, ptr %a1 + %t899 = load ptr, ptr %a1 + %t900 = load %S.ast.Type, ptr %a111 + %t901 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t899, %S.ast.Type %t900) + %t902 = load { ptr, i64, i64 }, ptr %a891 + %t903 = call { ptr, i64, i64 } @finch.gen.load(ptr %t898, { ptr, i64, i64 } %t901, { ptr, i64, i64 } %t902) + %t904 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t903, 0 + %t905 = load %S.ast.Type, ptr %a111 + store %S.ast.Type %t905, ptr %a906 + call void @finch.copy.S_ast_Type(ptr %a907, ptr %a906) + %t908 = load %S.ast.Type, ptr %a907 + %t909 = insertvalue %S.gen.Val %t904, %S.ast.Type %t908, 1 + ret %S.gen.Val %t909 +endif7003: + %t910 = getelementptr inbounds %S.ast.Type, ptr %a111, i32 0, i32 0 + %t911 = load { ptr, i64, i64 }, ptr %t910 + store { ptr, i64, i64 } %t911, ptr %a912 + store { ptr, i64, i64 } { ptr @.str.4507, i64 3, i64 0 }, ptr %a913 + %t914 = call i32 @finch_str_eq(ptr %a912, ptr %a913) + %t915 = icmp ne i32 %t914, 0 + br i1 %t915, label %then7004, label %endif7006 +then7004: + %t916 = load ptr, ptr %a1 + %t917 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t916) + store { ptr, i64, i64 } %t917, ptr %a918 + %t919 = load ptr, ptr %a1 + %t920 = load { ptr, i64, i64 }, ptr %a918 + call void @finch.gen.store(ptr %t919, { ptr, i64, i64 } { ptr @.str.4508, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4509, i64 15, i64 0 }, { ptr, i64, i64 } %t920) + %t921 = load ptr, ptr %a1 + %t922 = load { ptr, i64, i64 }, ptr %a918 + store { ptr, i64, i64 } { ptr @.str.4510, i64 32, i64 0 }, ptr %a924 + store { ptr, i64, i64 } %t922, ptr %a925 + call void @finch_str_concat(ptr %a923, ptr %a924, ptr %a925) + %t926 = load { ptr, i64, i64 }, ptr %a923 + store { ptr, i64, i64 } %t926, ptr %a928 + store { ptr, i64, i64 } { ptr @.str.4511, i64 6, i64 0 }, ptr %a929 + call void @finch_str_concat(ptr %a927, ptr %a928, ptr %a929) + %t930 = load { ptr, i64, i64 }, ptr %a927 + %t931 = load { ptr, i64, i64 }, ptr %a881 + store { ptr, i64, i64 } %t930, ptr %a933 + store { ptr, i64, i64 } %t931, ptr %a934 + call void @finch_str_concat(ptr %a932, ptr %a933, ptr %a934) + %t935 = load { ptr, i64, i64 }, ptr %a932 + store { ptr, i64, i64 } %t935, ptr %a937 + store { ptr, i64, i64 } { ptr @.str.4512, i64 1, i64 0 }, ptr %a938 + call void @finch_str_concat(ptr %a936, ptr %a937, ptr %a938) + %t939 = load { ptr, i64, i64 }, ptr %a936 + call void @finch.gen.emit(ptr %t921, { ptr, i64, i64 } %t939) + %t940 = load ptr, ptr %a1 + %t941 = load { ptr, i64, i64 }, ptr %a918 + %t942 = call { ptr, i64, i64 } @finch.gen.load(ptr %t940, { ptr, i64, i64 } { ptr @.str.4513, i64 17, i64 0 }, { ptr, i64, i64 } %t941) + %t943 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t942, 0 + %t944 = load %S.ast.Type, ptr %a111 + store %S.ast.Type %t944, ptr %a945 + call void @finch.copy.S_ast_Type(ptr %a946, ptr %a945) + %t947 = load %S.ast.Type, ptr %a946 + %t948 = insertvalue %S.gen.Val %t943, %S.ast.Type %t947, 1 + ret %S.gen.Val %t948 +endif7006: + %t949 = load { ptr, i64, i64 }, ptr %a881 + store { ptr, i64, i64 } %t949, ptr %a950 + call void @finch_str_copy(ptr %a951, ptr %a950) + %t952 = load { ptr, i64, i64 }, ptr %a951 + %t953 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t952, 0 + %t954 = load %S.ast.Type, ptr %a111 + store %S.ast.Type %t954, ptr %a955 + call void @finch.copy.S_ast_Type(ptr %a956, ptr %a955) + %t957 = load %S.ast.Type, ptr %a956 + %t958 = insertvalue %S.gen.Val %t953, %S.ast.Type %t957, 1 + ret %S.gen.Val %t958 +} + +define internal i1 @finch.gen.runtimeDeclares({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca i64, align 16 + %a18 = alloca i64, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = mul i64 5, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t3 = call ptr @finch_alloc(i64 %t2) + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 0 + store { ptr, i64, i64 } { ptr @.str.4514, i64 6, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 1 + store { ptr, i64, i64 } { ptr @.str.4515, i64 6, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 2 + store { ptr, i64, i64 } { ptr @.str.4516, i64 4, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 3 + store { ptr, i64, i64 } { ptr @.str.4517, i64 4, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 4 + store { ptr, i64, i64 } { ptr @.str.4518, i64 5, i64 0 }, ptr %t8 + %t9 = insertvalue { ptr, i64, i64 } undef, ptr %t3, 0 + %t10 = insertvalue { ptr, i64, i64 } %t9, i64 5, 1 + %t11 = insertvalue { ptr, i64, i64 } %t10, i64 5, 2 + store { ptr, i64, i64 } %t11, ptr %a12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %a12, i32 0, i32 1 + %t14 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a15 + %t16 = load i64, ptr %t13 + %t17 = load ptr, ptr %a12 + store i64 0, ptr %a18 + br label %find.cond7007 +find.cond7007: + %t19 = load i64, ptr %a18 + %t20 = icmp slt i64 %t19, %t16 + br i1 %t20, label %find.body7008, label %find.end7011 +find.body7008: + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t17, i64 %t19 + %t22 = load { ptr, i64, i64 }, ptr %t21 + store { ptr, i64, i64 } %t22, ptr %a23 + store { ptr, i64, i64 } %t14, ptr %a24 + %t25 = call i32 @finch_str_eq(ptr %a23, ptr %a24) + %t26 = icmp ne i32 %t25, 0 + br i1 %t26, label %find.hit7009, label %find.next7010 +find.hit7009: + store i64 %t19, ptr %a15 + br label %find.end7011 +find.next7010: + %t27 = add i64 %t19, 1 + store i64 %t27, ptr %a18 + br label %find.cond7007 +find.end7011: + %t28 = load i64, ptr %a15 + %t29 = icmp sge i64 %t28, 0 + ret i1 %t29 +} + +define internal { ptr, i64, i64 } @finch.gen.headerHint({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca i64, align 16 + %a65 = alloca i64, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca i64, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = mul i64 23, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t3 = call ptr @finch_alloc(i64 %t2) + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 0 + store { ptr, i64, i64 } { ptr @.str.4519, i64 6, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 1 + store { ptr, i64, i64 } { ptr @.str.4520, i64 4, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 2 + store { ptr, i64, i64 } { ptr @.str.4521, i64 7, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 3 + store { ptr, i64, i64 } { ptr @.str.4522, i64 5, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 4 + store { ptr, i64, i64 } { ptr @.str.4523, i64 5, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 5 + store { ptr, i64, i64 } { ptr @.str.4524, i64 7, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 6 + store { ptr, i64, i64 } { ptr @.str.4525, i64 4, i64 0 }, ptr %t10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 7 + store { ptr, i64, i64 } { ptr @.str.4526, i64 3, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 8 + store { ptr, i64, i64 } { ptr @.str.4527, i64 3, i64 0 }, ptr %t12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 9 + store { ptr, i64, i64 } { ptr @.str.4528, i64 3, i64 0 }, ptr %t13 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 10 + store { ptr, i64, i64 } { ptr @.str.4529, i64 5, i64 0 }, ptr %t14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 11 + store { ptr, i64, i64 } { ptr @.str.4530, i64 4, i64 0 }, ptr %t15 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 12 + store { ptr, i64, i64 } { ptr @.str.4531, i64 6, i64 0 }, ptr %t16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 13 + store { ptr, i64, i64 } { ptr @.str.4532, i64 4, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 14 + store { ptr, i64, i64 } { ptr @.str.4533, i64 5, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 15 + store { ptr, i64, i64 } { ptr @.str.4534, i64 3, i64 0 }, ptr %t19 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 16 + store { ptr, i64, i64 } { ptr @.str.4535, i64 4, i64 0 }, ptr %t20 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 17 + store { ptr, i64, i64 } { ptr @.str.4536, i64 6, i64 0 }, ptr %t21 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 18 + store { ptr, i64, i64 } { ptr @.str.4537, i64 6, i64 0 }, ptr %t22 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 19 + store { ptr, i64, i64 } { ptr @.str.4538, i64 6, i64 0 }, ptr %t23 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 20 + store { ptr, i64, i64 } { ptr @.str.4539, i64 4, i64 0 }, ptr %t24 + %t25 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 21 + store { ptr, i64, i64 } { ptr @.str.4540, i64 5, i64 0 }, ptr %t25 + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %t3, i64 22 + store { ptr, i64, i64 } { ptr @.str.4541, i64 6, i64 0 }, ptr %t26 + %t27 = insertvalue { ptr, i64, i64 } undef, ptr %t3, 0 + %t28 = insertvalue { ptr, i64, i64 } %t27, i64 23, 1 + %t29 = insertvalue { ptr, i64, i64 } %t28, i64 23, 2 + store { ptr, i64, i64 } %t29, ptr %a30 + %t31 = mul i64 23, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t32 = call ptr @finch_alloc(i64 %t31) + %t33 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 0 + store { ptr, i64, i64 } { ptr @.str.4542, i64 7, i64 0 }, ptr %t33 + %t34 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 1 + store { ptr, i64, i64 } { ptr @.str.4543, i64 7, i64 0 }, ptr %t34 + %t35 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 2 + store { ptr, i64, i64 } { ptr @.str.4544, i64 7, i64 0 }, ptr %t35 + %t36 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 3 + store { ptr, i64, i64 } { ptr @.str.4545, i64 7, i64 0 }, ptr %t36 + %t37 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 4 + store { ptr, i64, i64 } { ptr @.str.4546, i64 7, i64 0 }, ptr %t37 + %t38 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 5 + store { ptr, i64, i64 } { ptr @.str.4547, i64 7, i64 0 }, ptr %t38 + %t39 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 6 + store { ptr, i64, i64 } { ptr @.str.4548, i64 6, i64 0 }, ptr %t39 + %t40 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 7 + store { ptr, i64, i64 } { ptr @.str.4549, i64 6, i64 0 }, ptr %t40 + %t41 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 8 + store { ptr, i64, i64 } { ptr @.str.4550, i64 6, i64 0 }, ptr %t41 + %t42 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 9 + store { ptr, i64, i64 } { ptr @.str.4551, i64 6, i64 0 }, ptr %t42 + %t43 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 10 + store { ptr, i64, i64 } { ptr @.str.4552, i64 6, i64 0 }, ptr %t43 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 11 + store { ptr, i64, i64 } { ptr @.str.4553, i64 6, i64 0 }, ptr %t44 + %t45 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 12 + store { ptr, i64, i64 } { ptr @.str.4554, i64 8, i64 0 }, ptr %t45 + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 13 + store { ptr, i64, i64 } { ptr @.str.4555, i64 8, i64 0 }, ptr %t46 + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 14 + store { ptr, i64, i64 } { ptr @.str.4556, i64 8, i64 0 }, ptr %t47 + %t48 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 15 + store { ptr, i64, i64 } { ptr @.str.4557, i64 8, i64 0 }, ptr %t48 + %t49 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 16 + store { ptr, i64, i64 } { ptr @.str.4558, i64 8, i64 0 }, ptr %t49 + %t50 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 17 + store { ptr, i64, i64 } { ptr @.str.4559, i64 8, i64 0 }, ptr %t50 + %t51 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 18 + store { ptr, i64, i64 } { ptr @.str.4560, i64 8, i64 0 }, ptr %t51 + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 19 + store { ptr, i64, i64 } { ptr @.str.4561, i64 8, i64 0 }, ptr %t52 + %t53 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 20 + store { ptr, i64, i64 } { ptr @.str.4562, i64 6, i64 0 }, ptr %t53 + %t54 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 21 + store { ptr, i64, i64 } { ptr @.str.4563, i64 8, i64 0 }, ptr %t54 + %t55 = getelementptr inbounds { ptr, i64, i64 }, ptr %t32, i64 22 + store { ptr, i64, i64 } { ptr @.str.4564, i64 8, i64 0 }, ptr %t55 + %t56 = insertvalue { ptr, i64, i64 } undef, ptr %t32, 0 + %t57 = insertvalue { ptr, i64, i64 } %t56, i64 23, 1 + %t58 = insertvalue { ptr, i64, i64 } %t57, i64 23, 2 + store { ptr, i64, i64 } %t58, ptr %a59 + %t60 = getelementptr inbounds { ptr, i64, i64 }, ptr %a30, i32 0, i32 1 + %t61 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a62 + %t63 = load i64, ptr %t60 + %t64 = load ptr, ptr %a30 + store i64 0, ptr %a65 + br label %find.cond7012 +find.cond7012: + %t66 = load i64, ptr %a65 + %t67 = icmp slt i64 %t66, %t63 + br i1 %t67, label %find.body7013, label %find.end7016 +find.body7013: + %t68 = getelementptr inbounds { ptr, i64, i64 }, ptr %t64, i64 %t66 + %t69 = load { ptr, i64, i64 }, ptr %t68 + store { ptr, i64, i64 } %t69, ptr %a70 + store { ptr, i64, i64 } %t61, ptr %a71 + %t72 = call i32 @finch_str_eq(ptr %a70, ptr %a71) + %t73 = icmp ne i32 %t72, 0 + br i1 %t73, label %find.hit7014, label %find.next7015 +find.hit7014: + store i64 %t66, ptr %a62 + br label %find.end7016 +find.next7015: + %t74 = add i64 %t66, 1 + store i64 %t74, ptr %a65 + br label %find.cond7012 +find.end7016: + %t75 = load i64, ptr %a62 + store i64 %t75, ptr %a76 + %t77 = load i64, ptr %a76 + %t78 = icmp slt i64 %t77, 0 + br i1 %t78, label %then7017, label %endif7019 +then7017: + ret { ptr, i64, i64 } { ptr @.str.4565, i64 0, i64 0 } +endif7019: + %t79 = load i64, ptr %a76 + %t80 = load { ptr, i64, i64 }, ptr %a59 + %t81 = extractvalue { ptr, i64, i64 } %t80, 1 + %t82 = icmp uge i64 %t79, %t81 + br i1 %t82, label %range7020, label %inrange7021 +range7020: + call void @finch_panic_index(ptr @.str.4567, i64 4161, i64 %t79, i64 %t81) + unreachable +inrange7021: + %t83 = extractvalue { ptr, i64, i64 } %t80, 0 + %t84 = getelementptr inbounds { ptr, i64, i64 }, ptr %t83, i64 %t79 + %t85 = load { ptr, i64, i64 }, ptr %t84 + store { ptr, i64, i64 } { ptr @.str.4566, i64 28, i64 0 }, ptr %a87 + store { ptr, i64, i64 } %t85, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t89, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.4568, i64 14, i64 0 }, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + ret { ptr, i64, i64 } %t93 +} + +define internal %S.gen.Val @finch.gen.call(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca i64, align 16 + %a37 = alloca %S.gen.Val, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca %S.ast.Node, align 16 + %a83 = alloca %S.ast.Node, align 16 + %a85 = alloca %S.ast.Node, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca i64, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca %S.gen.Place, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca %S.gen.Val, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca %S.ast.Type, align 16 + %a195 = alloca %S.ast.Type, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a301 = alloca { ptr, i64, i64 }, align 16 + %a302 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a309 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a330 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a339 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a347 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a355 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a359 = alloca { ptr, i64, i64 }, align 16 + %a360 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a369 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a373 = alloca { ptr, i64, i64 }, align 16 + %a374 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a399 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a410 = alloca { ptr, i64, i64 }, align 16 + %a411 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a414 = alloca { ptr, i64, i64 }, align 16 + %a415 = alloca { ptr, i64, i64 }, align 16 + %a420 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a422 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a434 = alloca { ptr, i64, i64 }, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a441 = alloca { ptr, i64, i64 }, align 16 + %a446 = alloca { ptr, i64, i64 }, align 16 + %a447 = alloca { ptr, i64, i64 }, align 16 + %a452 = alloca { ptr, i64, i64 }, align 16 + %a453 = alloca { ptr, i64, i64 }, align 16 + %a458 = alloca { ptr, i64, i64 }, align 16 + %a459 = alloca { ptr, i64, i64 }, align 16 + %a482 = alloca { ptr, i64, i64 }, align 16 + %a483 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca { ptr, i64, i64 }, align 16 + %a486 = alloca { ptr, i64, i64 }, align 16 + %a487 = alloca { ptr, i64, i64 }, align 16 + %a488 = alloca { ptr, i64, i64 }, align 16 + %a499 = alloca { ptr, i64, i64 }, align 16 + %a509 = alloca { ptr, i64, i64 }, align 16 + %a510 = alloca { ptr, i64, i64 }, align 16 + %a514 = alloca { ptr, i64, i64 }, align 16 + %a515 = alloca { ptr, i64, i64 }, align 16 + %a533 = alloca { ptr, i64, i64 }, align 16 + %a535 = alloca { ptr, i64, i64 }, align 16 + %a536 = alloca { ptr, i64, i64 }, align 16 + %a541 = alloca { ptr, i64, i64 }, align 16 + %a542 = alloca { ptr, i64, i64 }, align 16 + %a543 = alloca { ptr, i64, i64 }, align 16 + %a545 = alloca { ptr, i64, i64 }, align 16 + %a546 = alloca { ptr, i64, i64 }, align 16 + %a547 = alloca { ptr, i64, i64 }, align 16 + %a550 = alloca { ptr, i64, i64 }, align 16 + %a553 = alloca { ptr, i64, i64 }, align 16 + %a554 = alloca { ptr, i64, i64 }, align 16 + %a555 = alloca { ptr, i64, i64 }, align 16 + %a557 = alloca { ptr, i64, i64 }, align 16 + %a558 = alloca { ptr, i64, i64 }, align 16 + %a559 = alloca { ptr, i64, i64 }, align 16 + %a567 = alloca { ptr, i64, i64 }, align 16 + %a574 = alloca { ptr, i64, i64 }, align 16 + %a575 = alloca { ptr, i64, i64 }, align 16 + %a580 = alloca { ptr, i64, i64 }, align 16 + %a587 = alloca { ptr, i64, i64 }, align 16 + %a588 = alloca { ptr, i64, i64 }, align 16 + %a589 = alloca { ptr, i64, i64 }, align 16 + %a591 = alloca { ptr, i64, i64 }, align 16 + %a592 = alloca { ptr, i64, i64 }, align 16 + %a593 = alloca { ptr, i64, i64 }, align 16 + %a596 = alloca { ptr, i64, i64 }, align 16 + %a597 = alloca { ptr, i64, i64 }, align 16 + %a598 = alloca { ptr, i64, i64 }, align 16 + %a600 = alloca { ptr, i64, i64 }, align 16 + %a601 = alloca { ptr, i64, i64 }, align 16 + %a602 = alloca { ptr, i64, i64 }, align 16 + %a605 = alloca { ptr, i64, i64 }, align 16 + %a606 = alloca { ptr, i64, i64 }, align 16 + %a607 = alloca { ptr, i64, i64 }, align 16 + %a609 = alloca { ptr, i64, i64 }, align 16 + %a610 = alloca { ptr, i64, i64 }, align 16 + %a611 = alloca { ptr, i64, i64 }, align 16 + %a614 = alloca { ptr, i64, i64 }, align 16 + %a617 = alloca { ptr, i64, i64 }, align 16 + %a618 = alloca { ptr, i64, i64 }, align 16 + %a619 = alloca { ptr, i64, i64 }, align 16 + %a621 = alloca { ptr, i64, i64 }, align 16 + %a622 = alloca { ptr, i64, i64 }, align 16 + %a623 = alloca { ptr, i64, i64 }, align 16 + %a655 = alloca { ptr, i64, i64 }, align 16 + %a658 = alloca { ptr, i64, i64 }, align 16 + %a659 = alloca { ptr, i64, i64 }, align 16 + %a660 = alloca { ptr, i64, i64 }, align 16 + %a662 = alloca { ptr, i64, i64 }, align 16 + %a663 = alloca { ptr, i64, i64 }, align 16 + %a664 = alloca { ptr, i64, i64 }, align 16 + %a667 = alloca { ptr, i64, i64 }, align 16 + %a668 = alloca { ptr, i64, i64 }, align 16 + %a669 = alloca { ptr, i64, i64 }, align 16 + %a671 = alloca { ptr, i64, i64 }, align 16 + %a672 = alloca { ptr, i64, i64 }, align 16 + %a673 = alloca { ptr, i64, i64 }, align 16 + %a676 = alloca { ptr, i64, i64 }, align 16 + %a677 = alloca { ptr, i64, i64 }, align 16 + %a678 = alloca { ptr, i64, i64 }, align 16 + %a680 = alloca { ptr, i64, i64 }, align 16 + %a681 = alloca { ptr, i64, i64 }, align 16 + %a682 = alloca { ptr, i64, i64 }, align 16 + %a686 = alloca { ptr, i64, i64 }, align 16 + %a688 = alloca { ptr, i64, i64 }, align 16 + %a689 = alloca { ptr, i64, i64 }, align 16 + %a690 = alloca { ptr, i64, i64 }, align 16 + %a692 = alloca { ptr, i64, i64 }, align 16 + %a693 = alloca { ptr, i64, i64 }, align 16 + %a694 = alloca { ptr, i64, i64 }, align 16 + %a704 = alloca { ptr, i64, i64 }, align 16 + %a705 = alloca { ptr, i64, i64 }, align 16 + %a722 = alloca { ptr, i64, i64 }, align 16 + %a734 = alloca { ptr, i64, i64 }, align 16 + %a741 = alloca { ptr, i64, i64 }, align 16 + %a742 = alloca { ptr, i64, i64 }, align 16 + %a747 = alloca { ptr, i64, i64 }, align 16 + %a752 = alloca { ptr, i64, i64 }, align 16 + %a753 = alloca { ptr, i64, i64 }, align 16 + %a754 = alloca { ptr, i64, i64 }, align 16 + %a756 = alloca { ptr, i64, i64 }, align 16 + %a757 = alloca { ptr, i64, i64 }, align 16 + %a758 = alloca { ptr, i64, i64 }, align 16 + %a761 = alloca { ptr, i64, i64 }, align 16 + %a762 = alloca { ptr, i64, i64 }, align 16 + %a763 = alloca { ptr, i64, i64 }, align 16 + %a765 = alloca { ptr, i64, i64 }, align 16 + %a766 = alloca { ptr, i64, i64 }, align 16 + %a767 = alloca { ptr, i64, i64 }, align 16 + %a770 = alloca { ptr, i64, i64 }, align 16 + %a771 = alloca { ptr, i64, i64 }, align 16 + %a772 = alloca { ptr, i64, i64 }, align 16 + %a774 = alloca { ptr, i64, i64 }, align 16 + %a775 = alloca { ptr, i64, i64 }, align 16 + %a776 = alloca { ptr, i64, i64 }, align 16 + %a779 = alloca { ptr, i64, i64 }, align 16 + %a782 = alloca { ptr, i64, i64 }, align 16 + %a783 = alloca { ptr, i64, i64 }, align 16 + %a784 = alloca { ptr, i64, i64 }, align 16 + %a786 = alloca { ptr, i64, i64 }, align 16 + %a787 = alloca { ptr, i64, i64 }, align 16 + %a788 = alloca { ptr, i64, i64 }, align 16 + %a804 = alloca { ptr, i64, i64 }, align 16 + %a805 = alloca { ptr, i64, i64 }, align 16 + %a806 = alloca { ptr, i64, i64 }, align 16 + %a808 = alloca { ptr, i64, i64 }, align 16 + %a809 = alloca { ptr, i64, i64 }, align 16 + %a810 = alloca { ptr, i64, i64 }, align 16 + %a813 = alloca { ptr, i64, i64 }, align 16 + %a814 = alloca { ptr, i64, i64 }, align 16 + %a815 = alloca { ptr, i64, i64 }, align 16 + %a817 = alloca { ptr, i64, i64 }, align 16 + %a818 = alloca { ptr, i64, i64 }, align 16 + %a819 = alloca { ptr, i64, i64 }, align 16 + %a822 = alloca { ptr, i64, i64 }, align 16 + %a825 = alloca { ptr, i64, i64 }, align 16 + %a826 = alloca { ptr, i64, i64 }, align 16 + %a827 = alloca { ptr, i64, i64 }, align 16 + %a829 = alloca { ptr, i64, i64 }, align 16 + %a830 = alloca { ptr, i64, i64 }, align 16 + %a831 = alloca { ptr, i64, i64 }, align 16 + %a838 = alloca { ptr, i64, i64 }, align 16 + %a839 = alloca { ptr, i64, i64 }, align 16 + %a854 = alloca %S.gen.Val, align 16 + %a857 = alloca { ptr, i64, i64 }, align 16 + %a860 = alloca { ptr, i64, i64 }, align 16 + %a861 = alloca { ptr, i64, i64 }, align 16 + %a862 = alloca { ptr, i64, i64 }, align 16 + %a864 = alloca { ptr, i64, i64 }, align 16 + %a865 = alloca { ptr, i64, i64 }, align 16 + %a866 = alloca { ptr, i64, i64 }, align 16 + %a871 = alloca { ptr, i64, i64 }, align 16 + %a872 = alloca { ptr, i64, i64 }, align 16 + %a873 = alloca { ptr, i64, i64 }, align 16 + %a875 = alloca { ptr, i64, i64 }, align 16 + %a876 = alloca { ptr, i64, i64 }, align 16 + %a877 = alloca { ptr, i64, i64 }, align 16 + %a885 = alloca { ptr, i64, i64 }, align 16 + %a886 = alloca { ptr, i64, i64 }, align 16 + %a891 = alloca { ptr, i64, i64 }, align 16 + %a896 = alloca { ptr, i64, i64 }, align 16 + %a897 = alloca { ptr, i64, i64 }, align 16 + %a898 = alloca { ptr, i64, i64 }, align 16 + %a900 = alloca { ptr, i64, i64 }, align 16 + %a901 = alloca { ptr, i64, i64 }, align 16 + %a902 = alloca { ptr, i64, i64 }, align 16 + %a905 = alloca { ptr, i64, i64 }, align 16 + %a906 = alloca { ptr, i64, i64 }, align 16 + %a907 = alloca { ptr, i64, i64 }, align 16 + %a909 = alloca { ptr, i64, i64 }, align 16 + %a910 = alloca { ptr, i64, i64 }, align 16 + %a911 = alloca { ptr, i64, i64 }, align 16 + %a914 = alloca { ptr, i64, i64 }, align 16 + %a917 = alloca { ptr, i64, i64 }, align 16 + %a918 = alloca { ptr, i64, i64 }, align 16 + %a919 = alloca { ptr, i64, i64 }, align 16 + %a921 = alloca { ptr, i64, i64 }, align 16 + %a922 = alloca { ptr, i64, i64 }, align 16 + %a923 = alloca { ptr, i64, i64 }, align 16 + %a939 = alloca { ptr, i64, i64 }, align 16 + %a940 = alloca { ptr, i64, i64 }, align 16 + %a941 = alloca { ptr, i64, i64 }, align 16 + %a943 = alloca { ptr, i64, i64 }, align 16 + %a944 = alloca { ptr, i64, i64 }, align 16 + %a945 = alloca { ptr, i64, i64 }, align 16 + %a948 = alloca { ptr, i64, i64 }, align 16 + %a951 = alloca { ptr, i64, i64 }, align 16 + %a952 = alloca { ptr, i64, i64 }, align 16 + %a953 = alloca { ptr, i64, i64 }, align 16 + %a955 = alloca { ptr, i64, i64 }, align 16 + %a956 = alloca { ptr, i64, i64 }, align 16 + %a957 = alloca { ptr, i64, i64 }, align 16 + %a964 = alloca { ptr, i64, i64 }, align 16 + %a965 = alloca { ptr, i64, i64 }, align 16 + %a980 = alloca %S.gen.Val, align 16 + %a983 = alloca { ptr, i64, i64 }, align 16 + %a986 = alloca { ptr, i64, i64 }, align 16 + %a987 = alloca { ptr, i64, i64 }, align 16 + %a988 = alloca { ptr, i64, i64 }, align 16 + %a990 = alloca { ptr, i64, i64 }, align 16 + %a991 = alloca { ptr, i64, i64 }, align 16 + %a992 = alloca { ptr, i64, i64 }, align 16 + %a997 = alloca { ptr, i64, i64 }, align 16 + %a998 = alloca { ptr, i64, i64 }, align 16 + %a999 = alloca { ptr, i64, i64 }, align 16 + %a1001 = alloca { ptr, i64, i64 }, align 16 + %a1002 = alloca { ptr, i64, i64 }, align 16 + %a1003 = alloca { ptr, i64, i64 }, align 16 + %a1007 = alloca { ptr, i64, i64 }, align 16 + %a1008 = alloca { ptr, i64, i64 }, align 16 + %a1009 = alloca { ptr, i64, i64 }, align 16 + %a1011 = alloca { ptr, i64, i64 }, align 16 + %a1012 = alloca { ptr, i64, i64 }, align 16 + %a1013 = alloca { ptr, i64, i64 }, align 16 + %a1020 = alloca { ptr, i64, i64 }, align 16 + %a1021 = alloca { ptr, i64, i64 }, align 16 + %a1046 = alloca %S.gen.Val, align 16 + %a1050 = alloca { ptr, i64, i64 }, align 16 + %a1051 = alloca { ptr, i64, i64 }, align 16 + %a1052 = alloca { ptr, i64, i64 }, align 16 + %a1054 = alloca { ptr, i64, i64 }, align 16 + %a1055 = alloca { ptr, i64, i64 }, align 16 + %a1056 = alloca { ptr, i64, i64 }, align 16 + %a1059 = alloca { ptr, i64, i64 }, align 16 + %a1062 = alloca { ptr, i64, i64 }, align 16 + %a1065 = alloca { ptr, i64, i64 }, align 16 + %a1066 = alloca { ptr, i64, i64 }, align 16 + %a1067 = alloca { ptr, i64, i64 }, align 16 + %a1069 = alloca { ptr, i64, i64 }, align 16 + %a1070 = alloca { ptr, i64, i64 }, align 16 + %a1071 = alloca { ptr, i64, i64 }, align 16 + %a1076 = alloca { ptr, i64, i64 }, align 16 + %a1077 = alloca { ptr, i64, i64 }, align 16 + %a1082 = alloca %S.gen.Val, align 16 + %a1101 = alloca { ptr, i64, i64 }, align 16 + %a1104 = alloca { ptr, i64, i64 }, align 16 + %a1105 = alloca { ptr, i64, i64 }, align 16 + %a1106 = alloca { ptr, i64, i64 }, align 16 + %a1108 = alloca { ptr, i64, i64 }, align 16 + %a1109 = alloca { ptr, i64, i64 }, align 16 + %a1110 = alloca { ptr, i64, i64 }, align 16 + %a1115 = alloca { ptr, i64, i64 }, align 16 + %a1116 = alloca { ptr, i64, i64 }, align 16 + %a1117 = alloca { ptr, i64, i64 }, align 16 + %a1119 = alloca { ptr, i64, i64 }, align 16 + %a1120 = alloca { ptr, i64, i64 }, align 16 + %a1121 = alloca { ptr, i64, i64 }, align 16 + %a1131 = alloca { ptr, i64, i64 }, align 16 + %a1132 = alloca { ptr, i64, i64 }, align 16 + %a1147 = alloca %S.gen.Val, align 16 + %a1153 = alloca { ptr, i64, i64 }, align 16 + %a1154 = alloca { ptr, i64, i64 }, align 16 + %a1155 = alloca { ptr, i64, i64 }, align 16 + %a1157 = alloca { ptr, i64, i64 }, align 16 + %a1158 = alloca { ptr, i64, i64 }, align 16 + %a1159 = alloca { ptr, i64, i64 }, align 16 + %a1162 = alloca { ptr, i64, i64 }, align 16 + %a1173 = alloca { ptr, i64, i64 }, align 16 + %a1174 = alloca { ptr, i64, i64 }, align 16 + %a1182 = alloca { ptr, i64, i64 }, align 16 + %a1183 = alloca { ptr, i64, i64 }, align 16 + %a1198 = alloca %S.gen.Val, align 16 + %a1202 = alloca { ptr, i64, i64 }, align 16 + %a1203 = alloca { ptr, i64, i64 }, align 16 + %a1217 = alloca { ptr, i64, i64 }, align 16 + %a1218 = alloca { ptr, i64, i64 }, align 16 + %a1219 = alloca { ptr, i64, i64 }, align 16 + %a1221 = alloca { ptr, i64, i64 }, align 16 + %a1222 = alloca { ptr, i64, i64 }, align 16 + %a1223 = alloca { ptr, i64, i64 }, align 16 + %a1234 = alloca i64, align 16 + %a1245 = alloca { ptr, i64, i64 }, align 16 + %a1246 = alloca { ptr, i64, i64 }, align 16 + %a1247 = alloca { ptr, i64, i64 }, align 16 + %a1249 = alloca { ptr, i64, i64 }, align 16 + %a1250 = alloca { ptr, i64, i64 }, align 16 + %a1251 = alloca { ptr, i64, i64 }, align 16 + %a1265 = alloca i64, align 16 + %a1289 = alloca { ptr, i64, i64 }, align 16 + %a1290 = alloca { ptr, i64, i64 }, align 16 + %a1291 = alloca { ptr, i64, i64 }, align 16 + %a1293 = alloca { ptr, i64, i64 }, align 16 + %a1294 = alloca { ptr, i64, i64 }, align 16 + %a1295 = alloca { ptr, i64, i64 }, align 16 + %a1298 = alloca { ptr, i64, i64 }, align 16 + %a1299 = alloca { ptr, i64, i64 }, align 16 + %a1300 = alloca { ptr, i64, i64 }, align 16 + %a1302 = alloca { ptr, i64, i64 }, align 16 + %a1303 = alloca { ptr, i64, i64 }, align 16 + %a1304 = alloca { ptr, i64, i64 }, align 16 + %a1306 = alloca { ptr, i64, i64 }, align 16 + %a1309 = alloca i64, align 16 + %a1317 = alloca %S.ast.Type, align 16 + %a1338 = alloca %S.ast.Type, align 16 + %a1359 = alloca i64, align 16 + %a1377 = alloca i64, align 16 + %a1389 = alloca { ptr, i64, i64 }, align 16 + %a1399 = alloca { ptr, i64, i64 }, align 16 + %a1402 = alloca { ptr, i64, i64 }, align 16 + %a1403 = alloca { ptr, i64, i64 }, align 16 + %a1430 = alloca { ptr, i64, i64 }, align 16 + %a1431 = alloca { ptr, i64, i64 }, align 16 + %a1432 = alloca { ptr, i64, i64 }, align 16 + %a1434 = alloca { ptr, i64, i64 }, align 16 + %a1435 = alloca { ptr, i64, i64 }, align 16 + %a1436 = alloca { ptr, i64, i64 }, align 16 + %a1441 = alloca { ptr, i64, i64 }, align 16 + %a1442 = alloca { ptr, i64, i64 }, align 16 + %a1443 = alloca { ptr, i64, i64 }, align 16 + %a1445 = alloca { ptr, i64, i64 }, align 16 + %a1446 = alloca { ptr, i64, i64 }, align 16 + %a1447 = alloca { ptr, i64, i64 }, align 16 + %a1451 = alloca { ptr, i64, i64 }, align 16 + %a1452 = alloca { ptr, i64, i64 }, align 16 + %a1453 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t4 = load { ptr, i64, i64 }, ptr %t3 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch_str_copy(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.4569, i64 5, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_eq(ptr %a10, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br i1 %t13, label %then7022, label %endif7024 +then7022: + %t14 = load ptr, ptr %a1 + %t15 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t14, %S.ast.Node %t15, { ptr, i64, i64 } { ptr @.str.4570, i64 86, i64 0 }) + br label %endif7024 +endif7024: + %t16 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t16, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.4571, i64 5, i64 0 }, ptr %a18 + %t19 = call i32 @finch_str_eq(ptr %a17, ptr %a18) + %t20 = icmp ne i32 %t19, 0 + br i1 %t20, label %then7025, label %endif7027 +then7025: + %t21 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t21, i32 0, i32 1 + %t23 = load i64, ptr %t22 + store i64 0, ptr %a24 + br label %for.cond7028 +for.cond7028: + %t25 = load i64, ptr %a24 + %t26 = icmp slt i64 %t25, %t23 + br i1 %t26, label %for.body7029, label %for.end7031 +for.body7029: + %t27 = load ptr, ptr %a1 + %t28 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t29 = load i64, ptr %a24 + %t30 = load { ptr, i64, i64 }, ptr %t28 + %t31 = extractvalue { ptr, i64, i64 } %t30, 1 + %t32 = icmp uge i64 %t29, %t31 + br i1 %t32, label %range7032, label %inrange7033 +range7032: + call void @finch_panic_index(ptr @.str.4572, i64 4171, i64 %t29, i64 %t31) + unreachable +inrange7033: + %t33 = extractvalue { ptr, i64, i64 } %t30, 0 + %t34 = getelementptr inbounds %S.ast.Node, ptr %t33, i64 %t29 + %t35 = load %S.ast.Node, ptr %t34 + %t36 = call %S.gen.Val @finch.gen.expr(ptr %t27, %S.ast.Node %t35) + store %S.gen.Val %t36, ptr %a37 + %t38 = getelementptr inbounds %S.gen.Val, ptr %a37, i32 0, i32 1 + %t39 = getelementptr inbounds %S.ast.Type, ptr %t38, i32 0, i32 0 + %t40 = load { ptr, i64, i64 }, ptr %t39 + store { ptr, i64, i64 } %t40, ptr %a41 + store { ptr, i64, i64 } { ptr @.str.4573, i64 4, i64 0 }, ptr %a42 + %t43 = call i32 @finch_str_eq(ptr %a41, ptr %a42) + %t44 = icmp ne i32 %t43, 0 + br i1 %t44, label %then7034, label %endif7036 +then7034: + %t45 = load ptr, ptr %a1 + %t46 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t47 = load i64, ptr %a24 + %t48 = load { ptr, i64, i64 }, ptr %t46 + %t49 = extractvalue { ptr, i64, i64 } %t48, 1 + %t50 = icmp uge i64 %t47, %t49 + br i1 %t50, label %range7037, label %inrange7038 +range7037: + call void @finch_panic_index(ptr @.str.4574, i64 4173, i64 %t47, i64 %t49) + unreachable +inrange7038: + %t51 = extractvalue { ptr, i64, i64 } %t48, 0 + %t52 = getelementptr inbounds %S.ast.Node, ptr %t51, i64 %t47 + %t53 = load %S.ast.Node, ptr %t52 + call void @finch.gen.fail(ptr %t45, %S.ast.Node %t53, { ptr, i64, i64 } { ptr @.str.4575, i64 53, i64 0 }) + br label %endif7036 +endif7036: + %t54 = load i64, ptr %a24 + %t55 = icmp sgt i64 %t54, 0 + br i1 %t55, label %then7039, label %endif7041 +then7039: + %t56 = load ptr, ptr %a1 + call void @finch.gen.printf(ptr %t56, { ptr, i64, i64 } { ptr @.str.4576, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.4577, i64 0, i64 0 }) + br label %endif7041 +endif7041: + %t57 = load ptr, ptr %a1 + %t58 = getelementptr inbounds %S.gen.Val, ptr %a37, i32 0, i32 0 + %t59 = load { ptr, i64, i64 }, ptr %t58 + %t60 = getelementptr inbounds %S.gen.Val, ptr %a37, i32 0, i32 1 + %t61 = load %S.ast.Type, ptr %t60 + call void @finch.gen.emitPrint(ptr %t57, { ptr, i64, i64 } %t59, %S.ast.Type %t61, i1 false) + br label %for.step7030 +for.step7030: + %t62 = load i64, ptr %a24 + %t63 = add i64 %t62, 1 + store i64 %t63, ptr %a24 + br label %for.cond7028 +for.end7031: + %t64 = load ptr, ptr %a1 + call void @finch.gen.printf(ptr %t64, { ptr, i64, i64 } { ptr @.str.4578, i64 1, i64 0 }, { ptr, i64, i64 } { ptr @.str.4579, i64 0, i64 0 }) + %t65 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4580, i64 4, i64 0 }) + %t66 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t65, 1 + ret %S.gen.Val %t66 +endif7027: + %t67 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t67, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.4581, i64 4, i64 0 }, ptr %a69 + %t70 = call i32 @finch_str_eq(ptr %a68, ptr %a69) + %t71 = icmp ne i32 %t70, 0 + br i1 %t71, label %then7042, label %endif7044 +then7042: + %t72 = load ptr, ptr %a1 + %t73 = load %S.ast.Node, ptr %a2 + %t74 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t72, %S.ast.Node %t73, i64 0, i64 1, { ptr, i64, i64 } %t74) + %t75 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t76 = load { ptr, i64, i64 }, ptr %t75 + %t77 = extractvalue { ptr, i64, i64 } %t76, 1 + %t78 = icmp uge i64 0, %t77 + br i1 %t78, label %range7045, label %inrange7046 +range7045: + call void @finch_panic_index(ptr @.str.4582, i64 4185, i64 0, i64 %t77) + unreachable +inrange7046: + %t79 = extractvalue { ptr, i64, i64 } %t76, 0 + %t80 = getelementptr inbounds %S.ast.Node, ptr %t79, i64 0 + %t81 = load %S.ast.Node, ptr %t80 + store %S.ast.Node %t81, ptr %a82 + call void @finch.copy.S_ast_Node(ptr %a83, ptr %a82) + %t84 = load %S.ast.Node, ptr %a83 + store %S.ast.Node %t84, ptr %a85 + %t86 = getelementptr inbounds %S.ast.Node, ptr %a85, i32 0, i32 0 + %t87 = load { ptr, i64, i64 }, ptr %t86 + store { ptr, i64, i64 } %t87, ptr %a88 + store { ptr, i64, i64 } { ptr @.str.4583, i64 3, i64 0 }, ptr %a89 + %t90 = call i32 @finch_str_eq(ptr %a88, ptr %a89) + %t91 = icmp ne i32 %t90, 0 + br label %logic.from7047 +logic.from7047: + br i1 %t91, label %logic.rhs7048, label %logic.end7049 +logic.rhs7048: + %t92 = load ptr, ptr %a1 + %t93 = getelementptr inbounds %S.ast.Node, ptr %a85, i32 0, i32 1 + %t94 = load { ptr, i64, i64 }, ptr %t93 + %t95 = call i64 @finch.gen.lookup(ptr %t92, { ptr, i64, i64 } %t94) + %t96 = icmp slt i64 %t95, 0 + br label %logic.rend7050 +logic.rend7050: + br label %logic.end7049 +logic.end7049: + %t97 = phi i1 [ false, %logic.from7047 ], [ %t96, %logic.rend7050 ] + br i1 %t97, label %then7051, label %endif7053 +then7051: + %t98 = load ptr, ptr %a1 + %t99 = load ptr, ptr %a1 + %t100 = icmp eq ptr %t99, null + br i1 %t100, label %panic7054, label %ok7055 +panic7054: + call void @finch_panic(ptr @.str.4584, i64 4187, ptr @.str.4585) + unreachable +ok7055: + %t101 = getelementptr inbounds %S.gen.Gen, ptr %t99, i32 0, i32 13 + %t102 = load { ptr, i64, i64 }, ptr %t101 + %t103 = getelementptr inbounds %S.ast.Node, ptr %a85, i32 0, i32 1 + %t104 = load { ptr, i64, i64 }, ptr %t103 + %t105 = call i64 @finch.gen.findFn(ptr %t98, { ptr, i64, i64 } %t102, { ptr, i64, i64 } %t104) + store i64 %t105, ptr %a106 + %t107 = load i64, ptr %a106 + %t108 = icmp sge i64 %t107, 0 + br i1 %t108, label %then7056, label %endif7058 +then7056: + %t109 = load ptr, ptr %a1 + %t110 = load i64, ptr %a106 + %t111 = load %S.ast.Node, ptr %a85 + %t112 = call { ptr, i64, i64 } @finch.gen.cThunk(ptr %t109, i64 %t110, %S.ast.Node %t111) + %t113 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t112, 0 + %t114 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4586, i64 3, i64 0 }) + %t115 = insertvalue %S.gen.Val %t113, %S.ast.Type %t114, 1 + ret %S.gen.Val %t115 +endif7058: + br label %endif7053 +endif7053: + %t116 = getelementptr inbounds %S.ast.Node, ptr %a85, i32 0, i32 0 + %t117 = load { ptr, i64, i64 }, ptr %t116 + store { ptr, i64, i64 } %t117, ptr %a118 + store { ptr, i64, i64 } { ptr @.str.4587, i64 3, i64 0 }, ptr %a119 + %t120 = call i32 @finch_str_eq(ptr %a118, ptr %a119) + %t121 = icmp eq i32 %t120, 0 + br label %logic.from7059 +logic.from7059: + br i1 %t121, label %logic.rhs7060, label %logic.end7061 +logic.rhs7060: + %t122 = getelementptr inbounds %S.ast.Node, ptr %a85, i32 0, i32 0 + %t123 = load { ptr, i64, i64 }, ptr %t122 + store { ptr, i64, i64 } %t123, ptr %a124 + store { ptr, i64, i64 } { ptr @.str.4588, i64 6, i64 0 }, ptr %a125 + %t126 = call i32 @finch_str_eq(ptr %a124, ptr %a125) + %t127 = icmp eq i32 %t126, 0 + br label %logic.rend7062 +logic.rend7062: + br label %logic.end7061 +logic.end7061: + %t128 = phi i1 [ false, %logic.from7059 ], [ %t127, %logic.rend7062 ] + br label %logic.from7063 +logic.from7063: + br i1 %t128, label %logic.rhs7064, label %logic.end7065 +logic.rhs7064: + %t129 = getelementptr inbounds %S.ast.Node, ptr %a85, i32 0, i32 0 + %t130 = load { ptr, i64, i64 }, ptr %t129 + store { ptr, i64, i64 } %t130, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.4589, i64 5, i64 0 }, ptr %a132 + %t133 = call i32 @finch_str_eq(ptr %a131, ptr %a132) + %t134 = icmp eq i32 %t133, 0 + br label %logic.rend7066 +logic.rend7066: + br label %logic.end7065 +logic.end7065: + %t135 = phi i1 [ false, %logic.from7063 ], [ %t134, %logic.rend7066 ] + br i1 %t135, label %then7067, label %endif7069 +then7067: + %t136 = load ptr, ptr %a1 + %t137 = load %S.ast.Node, ptr %a85 + call void @finch.gen.fail(ptr %t136, %S.ast.Node %t137, { ptr, i64, i64 } { ptr @.str.4590, i64 63, i64 0 }) + br label %endif7069 +endif7069: + %t138 = load ptr, ptr %a1 + %t139 = load %S.ast.Node, ptr %a85 + %t140 = call %S.gen.Place @finch.gen.place(ptr %t138, %S.ast.Node %t139, i1 true) + store %S.gen.Place %t140, ptr %a141 + %t142 = getelementptr inbounds %S.gen.Place, ptr %a141, i32 0, i32 0 + %t143 = load { ptr, i64, i64 }, ptr %t142 + store { ptr, i64, i64 } %t143, ptr %a144 + call void @finch_str_copy(ptr %a145, ptr %a144) + %t146 = load { ptr, i64, i64 }, ptr %a145 + %t147 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t146, 0 + %t148 = getelementptr inbounds %S.gen.Place, ptr %a141, i32 0, i32 1 + %t149 = load %S.ast.Type, ptr %t148 + %t150 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t149) + %t151 = insertvalue %S.gen.Val %t147, %S.ast.Type %t150, 1 + ret %S.gen.Val %t151 +endif7044: + %t152 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t152, ptr %a153 + store { ptr, i64, i64 } { ptr @.str.4591, i64 3, i64 0 }, ptr %a154 + %t155 = call i32 @finch_str_eq(ptr %a153, ptr %a154) + %t156 = icmp ne i32 %t155, 0 + br i1 %t156, label %then7070, label %endif7072 +then7070: + %t157 = load ptr, ptr %a1 + %t158 = load %S.ast.Node, ptr %a2 + %t159 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t157, %S.ast.Node %t158, i64 0, i64 1, { ptr, i64, i64 } %t159) + %t160 = load ptr, ptr %a1 + %t161 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t162 = load { ptr, i64, i64 }, ptr %t161 + %t163 = extractvalue { ptr, i64, i64 } %t162, 1 + %t164 = icmp uge i64 0, %t163 + br i1 %t164, label %range7073, label %inrange7074 +range7073: + call void @finch_panic_index(ptr @.str.4592, i64 4200, i64 0, i64 %t163) + unreachable +inrange7074: + %t165 = extractvalue { ptr, i64, i64 } %t162, 0 + %t166 = getelementptr inbounds %S.ast.Node, ptr %t165, i64 0 + %t167 = load %S.ast.Node, ptr %t166 + %t168 = call %S.gen.Val @finch.gen.expr(ptr %t160, %S.ast.Node %t167) + store %S.gen.Val %t168, ptr %a169 + %t170 = load ptr, ptr %a1 + %t171 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t170) + store { ptr, i64, i64 } %t171, ptr %a172 + %t173 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t174 = getelementptr inbounds %S.ast.Type, ptr %t173, i32 0, i32 0 + %t175 = load { ptr, i64, i64 }, ptr %t174 + store { ptr, i64, i64 } %t175, ptr %a176 + call void @finch_str_copy(ptr %a177, ptr %a176) + %t178 = load { ptr, i64, i64 }, ptr %a177 + store { ptr, i64, i64 } %t178, ptr %a179 + %t180 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t180, ptr %a181 + store { ptr, i64, i64 } { ptr @.str.4593, i64 3, i64 0 }, ptr %a182 + %t183 = call i32 @finch_str_eq(ptr %a181, ptr %a182) + %t184 = icmp ne i32 %t183, 0 + br i1 %t184, label %then7075, label %else7076 +then7075: + %t185 = load ptr, ptr %a1 + %t186 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t187 = load { ptr, i64, i64 }, ptr %t186 + %t188 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t189 = load %S.ast.Type, ptr %t188 + %t190 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t185, { ptr, i64, i64 } %t187, %S.ast.Type %t189) + %t191 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t190, 0 + %t192 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t193 = load %S.ast.Type, ptr %t192 + store %S.ast.Type %t193, ptr %a194 + call void @finch.copy.S_ast_Type(ptr %a195, ptr %a194) + %t196 = load %S.ast.Type, ptr %a195 + %t197 = insertvalue %S.gen.Val %t191, %S.ast.Type %t196, 1 + %t198 = insertvalue %S.gen.Val %t197, i1 true, 2 + ret %S.gen.Val %t198 +else7076: + %t199 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t200 = load %S.ast.Type, ptr %t199 + %t201 = call i1 @finch.gen.isSigned(%S.ast.Type %t200) + br i1 %t201, label %then7078, label %else7079 +then7078: + %t202 = load ptr, ptr %a1 + %t203 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4594, i64 34, i64 0 }, ptr %a205 + store { ptr, i64, i64 } %t203, ptr %a206 + call void @finch_str_concat(ptr %a204, ptr %a205, ptr %a206) + %t207 = load { ptr, i64, i64 }, ptr %a204 + store { ptr, i64, i64 } %t207, ptr %a209 + store { ptr, i64, i64 } { ptr @.str.4595, i64 6, i64 0 }, ptr %a210 + call void @finch_str_concat(ptr %a208, ptr %a209, ptr %a210) + %t211 = load { ptr, i64, i64 }, ptr %a208 + %t212 = load ptr, ptr %a1 + %t213 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t214 = load { ptr, i64, i64 }, ptr %t213 + %t215 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t216 = load %S.ast.Type, ptr %t215 + %t217 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4596, i64 3, i64 0 }) + %t218 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t212, { ptr, i64, i64 } %t214, %S.ast.Type %t216, %S.ast.Type %t217) + store { ptr, i64, i64 } %t211, ptr %a220 + store { ptr, i64, i64 } %t218, ptr %a221 + call void @finch_str_concat(ptr %a219, ptr %a220, ptr %a221) + %t222 = load { ptr, i64, i64 }, ptr %a219 + store { ptr, i64, i64 } %t222, ptr %a224 + store { ptr, i64, i64 } { ptr @.str.4597, i64 1, i64 0 }, ptr %a225 + call void @finch_str_concat(ptr %a223, ptr %a224, ptr %a225) + %t226 = load { ptr, i64, i64 }, ptr %a223 + call void @finch.gen.emit(ptr %t202, { ptr, i64, i64 } %t226) + br label %endif7080 +else7079: + %t227 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t228 = load %S.ast.Type, ptr %t227 + %t229 = call i1 @finch.gen.isUnsigned(%S.ast.Type %t228) + br i1 %t229, label %then7081, label %else7082 +then7081: + %t230 = load ptr, ptr %a1 + %t231 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4598, i64 35, i64 0 }, ptr %a233 + store { ptr, i64, i64 } %t231, ptr %a234 + call void @finch_str_concat(ptr %a232, ptr %a233, ptr %a234) + %t235 = load { ptr, i64, i64 }, ptr %a232 + store { ptr, i64, i64 } %t235, ptr %a237 + store { ptr, i64, i64 } { ptr @.str.4599, i64 6, i64 0 }, ptr %a238 + call void @finch_str_concat(ptr %a236, ptr %a237, ptr %a238) + %t239 = load { ptr, i64, i64 }, ptr %a236 + %t240 = load ptr, ptr %a1 + %t241 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t242 = load { ptr, i64, i64 }, ptr %t241 + %t243 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t244 = load %S.ast.Type, ptr %t243 + %t245 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4600, i64 3, i64 0 }) + %t246 = call { ptr, i64, i64 } @finch.gen.intCast(ptr %t240, { ptr, i64, i64 } %t242, %S.ast.Type %t244, %S.ast.Type %t245) + store { ptr, i64, i64 } %t239, ptr %a248 + store { ptr, i64, i64 } %t246, ptr %a249 + call void @finch_str_concat(ptr %a247, ptr %a248, ptr %a249) + %t250 = load { ptr, i64, i64 }, ptr %a247 + store { ptr, i64, i64 } %t250, ptr %a252 + store { ptr, i64, i64 } { ptr @.str.4601, i64 1, i64 0 }, ptr %a253 + call void @finch_str_concat(ptr %a251, ptr %a252, ptr %a253) + %t254 = load { ptr, i64, i64 }, ptr %a251 + call void @finch.gen.emit(ptr %t230, { ptr, i64, i64 } %t254) + br label %endif7083 +else7082: + %t255 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t256 = load %S.ast.Type, ptr %t255 + %t257 = call i1 @finch.gen.isFloat(%S.ast.Type %t256) + br i1 %t257, label %then7084, label %else7085 +then7084: + %t258 = load ptr, ptr %a1 + %t259 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4602, i64 36, i64 0 }, ptr %a261 + store { ptr, i64, i64 } %t259, ptr %a262 + call void @finch_str_concat(ptr %a260, ptr %a261, ptr %a262) + %t263 = load { ptr, i64, i64 }, ptr %a260 + store { ptr, i64, i64 } %t263, ptr %a265 + store { ptr, i64, i64 } { ptr @.str.4603, i64 9, i64 0 }, ptr %a266 + call void @finch_str_concat(ptr %a264, ptr %a265, ptr %a266) + %t267 = load { ptr, i64, i64 }, ptr %a264 + %t268 = load ptr, ptr %a1 + %t269 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t270 = load { ptr, i64, i64 }, ptr %t269 + %t271 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t272 = load %S.ast.Type, ptr %t271 + %t273 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4604, i64 5, i64 0 }) + %t274 = call { ptr, i64, i64 } @finch.gen.floatCast(ptr %t268, { ptr, i64, i64 } %t270, %S.ast.Type %t272, %S.ast.Type %t273) + store { ptr, i64, i64 } %t267, ptr %a276 + store { ptr, i64, i64 } %t274, ptr %a277 + call void @finch_str_concat(ptr %a275, ptr %a276, ptr %a277) + %t278 = load { ptr, i64, i64 }, ptr %a275 + store { ptr, i64, i64 } %t278, ptr %a280 + store { ptr, i64, i64 } { ptr @.str.4605, i64 1, i64 0 }, ptr %a281 + call void @finch_str_concat(ptr %a279, ptr %a280, ptr %a281) + %t282 = load { ptr, i64, i64 }, ptr %a279 + call void @finch.gen.emit(ptr %t258, { ptr, i64, i64 } %t282) + br label %endif7086 +else7085: + %t283 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t283, ptr %a284 + store { ptr, i64, i64 } { ptr @.str.4606, i64 4, i64 0 }, ptr %a285 + %t286 = call i32 @finch_str_eq(ptr %a284, ptr %a285) + %t287 = icmp ne i32 %t286, 0 + br i1 %t287, label %then7087, label %else7088 +then7087: + %t288 = load ptr, ptr %a1 + %t289 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4607, i64 35, i64 0 }, ptr %a291 + store { ptr, i64, i64 } %t289, ptr %a292 + call void @finch_str_concat(ptr %a290, ptr %a291, ptr %a292) + %t293 = load { ptr, i64, i64 }, ptr %a290 + store { ptr, i64, i64 } %t293, ptr %a295 + store { ptr, i64, i64 } { ptr @.str.4608, i64 13, i64 0 }, ptr %a296 + call void @finch_str_concat(ptr %a294, ptr %a295, ptr %a296) + %t297 = load { ptr, i64, i64 }, ptr %a294 + %t298 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t299 = load { ptr, i64, i64 }, ptr %t298 + store { ptr, i64, i64 } %t297, ptr %a301 + store { ptr, i64, i64 } %t299, ptr %a302 + call void @finch_str_concat(ptr %a300, ptr %a301, ptr %a302) + %t303 = load { ptr, i64, i64 }, ptr %a300 + store { ptr, i64, i64 } %t303, ptr %a305 + store { ptr, i64, i64 } { ptr @.str.4609, i64 1, i64 0 }, ptr %a306 + call void @finch_str_concat(ptr %a304, ptr %a305, ptr %a306) + %t307 = load { ptr, i64, i64 }, ptr %a304 + call void @finch.gen.emit(ptr %t288, { ptr, i64, i64 } %t307) + br label %endif7089 +else7088: + %t308 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t308, ptr %a309 + store { ptr, i64, i64 } { ptr @.str.4610, i64 4, i64 0 }, ptr %a310 + %t311 = call i32 @finch_str_eq(ptr %a309, ptr %a310) + %t312 = icmp ne i32 %t311, 0 + br i1 %t312, label %then7090, label %else7091 +then7090: + %t313 = load ptr, ptr %a1 + %t314 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t315 = load { ptr, i64, i64 }, ptr %t314 + store { ptr, i64, i64 } { ptr @.str.4611, i64 8, i64 0 }, ptr %a317 + store { ptr, i64, i64 } %t315, ptr %a318 + call void @finch_str_concat(ptr %a316, ptr %a317, ptr %a318) + %t319 = load { ptr, i64, i64 }, ptr %a316 + store { ptr, i64, i64 } %t319, ptr %a321 + store { ptr, i64, i64 } { ptr @.str.4612, i64 7, i64 0 }, ptr %a322 + call void @finch_str_concat(ptr %a320, ptr %a321, ptr %a322) + %t323 = load { ptr, i64, i64 }, ptr %a320 + %t324 = call { ptr, i64, i64 } @finch.gen.op(ptr %t313, { ptr, i64, i64 } %t323) + store { ptr, i64, i64 } %t324, ptr %a325 + %t326 = load ptr, ptr %a1 + %t327 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4613, i64 35, i64 0 }, ptr %a329 + store { ptr, i64, i64 } %t327, ptr %a330 + call void @finch_str_concat(ptr %a328, ptr %a329, ptr %a330) + %t331 = load { ptr, i64, i64 }, ptr %a328 + store { ptr, i64, i64 } %t331, ptr %a333 + store { ptr, i64, i64 } { ptr @.str.4614, i64 6, i64 0 }, ptr %a334 + call void @finch_str_concat(ptr %a332, ptr %a333, ptr %a334) + %t335 = load { ptr, i64, i64 }, ptr %a332 + %t336 = load { ptr, i64, i64 }, ptr %a325 + store { ptr, i64, i64 } %t335, ptr %a338 + store { ptr, i64, i64 } %t336, ptr %a339 + call void @finch_str_concat(ptr %a337, ptr %a338, ptr %a339) + %t340 = load { ptr, i64, i64 }, ptr %a337 + store { ptr, i64, i64 } %t340, ptr %a342 + store { ptr, i64, i64 } { ptr @.str.4615, i64 1, i64 0 }, ptr %a343 + call void @finch_str_concat(ptr %a341, ptr %a342, ptr %a343) + %t344 = load { ptr, i64, i64 }, ptr %a341 + call void @finch.gen.emit(ptr %t326, { ptr, i64, i64 } %t344) + br label %endif7092 +else7091: + %t345 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t345, ptr %a346 + store { ptr, i64, i64 } { ptr @.str.4616, i64 3, i64 0 }, ptr %a347 + %t348 = call i32 @finch_str_eq(ptr %a346, ptr %a347) + %t349 = icmp ne i32 %t348, 0 + br i1 %t349, label %then7093, label %else7094 +then7093: + %t350 = load ptr, ptr %a1 + %t351 = load { ptr, i64, i64 }, ptr %a172 + call void @finch.gen.store(ptr %t350, { ptr, i64, i64 } { ptr @.str.4617, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4618, i64 15, i64 0 }, { ptr, i64, i64 } %t351) + %t352 = load ptr, ptr %a1 + %t353 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4619, i64 32, i64 0 }, ptr %a355 + store { ptr, i64, i64 } %t353, ptr %a356 + call void @finch_str_concat(ptr %a354, ptr %a355, ptr %a356) + %t357 = load { ptr, i64, i64 }, ptr %a354 + store { ptr, i64, i64 } %t357, ptr %a359 + store { ptr, i64, i64 } { ptr @.str.4620, i64 6, i64 0 }, ptr %a360 + call void @finch_str_concat(ptr %a358, ptr %a359, ptr %a360) + %t361 = load { ptr, i64, i64 }, ptr %a358 + %t362 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t363 = load { ptr, i64, i64 }, ptr %t362 + store { ptr, i64, i64 } %t361, ptr %a365 + store { ptr, i64, i64 } %t363, ptr %a366 + call void @finch_str_concat(ptr %a364, ptr %a365, ptr %a366) + %t367 = load { ptr, i64, i64 }, ptr %a364 + store { ptr, i64, i64 } %t367, ptr %a369 + store { ptr, i64, i64 } { ptr @.str.4621, i64 1, i64 0 }, ptr %a370 + call void @finch_str_concat(ptr %a368, ptr %a369, ptr %a370) + %t371 = load { ptr, i64, i64 }, ptr %a368 + call void @finch.gen.emit(ptr %t352, { ptr, i64, i64 } %t371) + br label %endif7095 +else7094: + %t372 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t372, ptr %a373 + store { ptr, i64, i64 } { ptr @.str.4622, i64 5, i64 0 }, ptr %a374 + %t375 = call i32 @finch_str_eq(ptr %a373, ptr %a374) + %t376 = icmp ne i32 %t375, 0 + br label %logic.from7096 +logic.from7096: + br i1 %t376, label %logic.rhs7097, label %logic.end7098 +logic.rhs7097: + %t377 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t378 = getelementptr inbounds %S.ast.Type, ptr %t377, i32 0, i32 1 + %t379 = load { ptr, i64, i64 }, ptr %t378 + %t380 = extractvalue { ptr, i64, i64 } %t379, 1 + %t381 = icmp uge i64 0, %t380 + br i1 %t381, label %range7099, label %inrange7100 +range7099: + call void @finch_panic_index(ptr @.str.4623, i64 4220, i64 0, i64 %t380) + unreachable +inrange7100: + %t382 = extractvalue { ptr, i64, i64 } %t379, 0 + %t383 = getelementptr inbounds %S.ast.Type, ptr %t382, i64 0 + %t384 = getelementptr inbounds %S.ast.Type, ptr %t383, i32 0, i32 0 + %t385 = load { ptr, i64, i64 }, ptr %t384 + store { ptr, i64, i64 } %t385, ptr %a386 + store { ptr, i64, i64 } { ptr @.str.4624, i64 2, i64 0 }, ptr %a387 + %t388 = call i32 @finch_str_eq(ptr %a386, ptr %a387) + %t389 = icmp ne i32 %t388, 0 + br label %logic.from7101 +logic.from7101: + br i1 %t389, label %logic.end7103, label %logic.rhs7102 +logic.rhs7102: + %t390 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t391 = getelementptr inbounds %S.ast.Type, ptr %t390, i32 0, i32 1 + %t392 = load { ptr, i64, i64 }, ptr %t391 + %t393 = extractvalue { ptr, i64, i64 } %t392, 1 + %t394 = icmp uge i64 0, %t393 + br i1 %t394, label %range7104, label %inrange7105 +range7104: + call void @finch_panic_index(ptr @.str.4625, i64 4220, i64 0, i64 %t393) + unreachable +inrange7105: + %t395 = extractvalue { ptr, i64, i64 } %t392, 0 + %t396 = getelementptr inbounds %S.ast.Type, ptr %t395, i64 0 + %t397 = getelementptr inbounds %S.ast.Type, ptr %t396, i32 0, i32 0 + %t398 = load { ptr, i64, i64 }, ptr %t397 + store { ptr, i64, i64 } %t398, ptr %a399 + store { ptr, i64, i64 } { ptr @.str.4626, i64 4, i64 0 }, ptr %a400 + %t401 = call i32 @finch_str_eq(ptr %a399, ptr %a400) + %t402 = icmp ne i32 %t401, 0 + br label %logic.rend7106 +logic.rend7106: + br label %logic.end7103 +logic.end7103: + %t403 = phi i1 [ true, %logic.from7101 ], [ %t402, %logic.rend7106 ] + br label %logic.rend7107 +logic.rend7107: + br label %logic.end7098 +logic.end7098: + %t404 = phi i1 [ false, %logic.from7096 ], [ %t403, %logic.rend7107 ] + br i1 %t404, label %then7108, label %else7109 +then7108: + %t405 = load ptr, ptr %a1 + %t406 = load { ptr, i64, i64 }, ptr %a172 + call void @finch.gen.store(ptr %t405, { ptr, i64, i64 } { ptr @.str.4627, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4628, i64 15, i64 0 }, { ptr, i64, i64 } %t406) + %t407 = load ptr, ptr %a1 + %t408 = load { ptr, i64, i64 }, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4629, i64 36, i64 0 }, ptr %a410 + store { ptr, i64, i64 } %t408, ptr %a411 + call void @finch_str_concat(ptr %a409, ptr %a410, ptr %a411) + %t412 = load { ptr, i64, i64 }, ptr %a409 + store { ptr, i64, i64 } %t412, ptr %a414 + store { ptr, i64, i64 } { ptr @.str.4630, i64 6, i64 0 }, ptr %a415 + call void @finch_str_concat(ptr %a413, ptr %a414, ptr %a415) + %t416 = load { ptr, i64, i64 }, ptr %a413 + %t417 = load ptr, ptr %a1 + %t418 = load %S.gen.Val, ptr %a169 + %t419 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t417, %S.gen.Val %t418) + store { ptr, i64, i64 } %t416, ptr %a421 + store { ptr, i64, i64 } %t419, ptr %a422 + call void @finch_str_concat(ptr %a420, ptr %a421, ptr %a422) + %t423 = load { ptr, i64, i64 }, ptr %a420 + store { ptr, i64, i64 } %t423, ptr %a425 + store { ptr, i64, i64 } { ptr @.str.4631, i64 1, i64 0 }, ptr %a426 + call void @finch_str_concat(ptr %a424, ptr %a425, ptr %a426) + %t427 = load { ptr, i64, i64 }, ptr %a424 + call void @finch.gen.emit(ptr %t407, { ptr, i64, i64 } %t427) + br label %endif7110 +else7109: + %t428 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t428, ptr %a429 + store { ptr, i64, i64 } { ptr @.str.4632, i64 4, i64 0 }, ptr %a430 + %t431 = call i32 @finch_str_eq(ptr %a429, ptr %a430) + %t432 = icmp ne i32 %t431, 0 + br label %logic.from7111 +logic.from7111: + br i1 %t432, label %logic.end7113, label %logic.rhs7112 +logic.rhs7112: + %t433 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t433, ptr %a434 + store { ptr, i64, i64 } { ptr @.str.4633, i64 4, i64 0 }, ptr %a435 + %t436 = call i32 @finch_str_eq(ptr %a434, ptr %a435) + %t437 = icmp ne i32 %t436, 0 + br label %logic.rend7114 +logic.rend7114: + br label %logic.end7113 +logic.end7113: + %t438 = phi i1 [ true, %logic.from7111 ], [ %t437, %logic.rend7114 ] + br label %logic.from7115 +logic.from7115: + br i1 %t438, label %logic.end7117, label %logic.rhs7116 +logic.rhs7116: + %t439 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t439, ptr %a440 + store { ptr, i64, i64 } { ptr @.str.4634, i64 5, i64 0 }, ptr %a441 + %t442 = call i32 @finch_str_eq(ptr %a440, ptr %a441) + %t443 = icmp ne i32 %t442, 0 + br label %logic.rend7118 +logic.rend7118: + br label %logic.end7117 +logic.end7117: + %t444 = phi i1 [ true, %logic.from7115 ], [ %t443, %logic.rend7118 ] + br label %logic.from7119 +logic.from7119: + br i1 %t444, label %logic.end7121, label %logic.rhs7120 +logic.rhs7120: + %t445 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t445, ptr %a446 + store { ptr, i64, i64 } { ptr @.str.4635, i64 3, i64 0 }, ptr %a447 + %t448 = call i32 @finch_str_eq(ptr %a446, ptr %a447) + %t449 = icmp ne i32 %t448, 0 + br label %logic.rend7122 +logic.rend7122: + br label %logic.end7121 +logic.end7121: + %t450 = phi i1 [ true, %logic.from7119 ], [ %t449, %logic.rend7122 ] + br label %logic.from7123 +logic.from7123: + br i1 %t450, label %logic.end7125, label %logic.rhs7124 +logic.rhs7124: + %t451 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t451, ptr %a452 + store { ptr, i64, i64 } { ptr @.str.4636, i64 6, i64 0 }, ptr %a453 + %t454 = call i32 @finch_str_eq(ptr %a452, ptr %a453) + %t455 = icmp ne i32 %t454, 0 + br label %logic.rend7126 +logic.rend7126: + br label %logic.end7125 +logic.end7125: + %t456 = phi i1 [ true, %logic.from7123 ], [ %t455, %logic.rend7126 ] + br label %logic.from7127 +logic.from7127: + br i1 %t456, label %logic.end7129, label %logic.rhs7128 +logic.rhs7128: + %t457 = load { ptr, i64, i64 }, ptr %a179 + store { ptr, i64, i64 } %t457, ptr %a458 + store { ptr, i64, i64 } { ptr @.str.4637, i64 4, i64 0 }, ptr %a459 + %t460 = call i32 @finch_str_eq(ptr %a458, ptr %a459) + %t461 = icmp ne i32 %t460, 0 + br label %logic.rend7130 +logic.rend7130: + br label %logic.end7129 +logic.end7129: + %t462 = phi i1 [ true, %logic.from7127 ], [ %t461, %logic.rend7130 ] + br i1 %t462, label %then7131, label %else7132 +then7131: + %t463 = load ptr, ptr %a1 + %t464 = load { ptr, i64, i64 }, ptr %a172 + call void @finch.gen.store(ptr %t463, { ptr, i64, i64 } { ptr @.str.4638, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4639, i64 15, i64 0 }, { ptr, i64, i64 } %t464) + %t465 = load ptr, ptr %a1 + %t466 = load { ptr, i64, i64 }, ptr %a172 + %t467 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 0 + %t468 = load { ptr, i64, i64 }, ptr %t467 + %t469 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t470 = load %S.ast.Type, ptr %t469 + call void @finch.gen.emitFormat(ptr %t465, { ptr, i64, i64 } %t466, { ptr, i64, i64 } %t468, %S.ast.Type %t470, i1 false) + br label %endif7133 +else7132: + %t471 = load ptr, ptr %a1 + %t472 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t473 = load { ptr, i64, i64 }, ptr %t472 + %t474 = extractvalue { ptr, i64, i64 } %t473, 1 + %t475 = icmp uge i64 0, %t474 + br i1 %t475, label %range7134, label %inrange7135 +range7134: + call void @finch_panic_index(ptr @.str.4640, i64 4228, i64 0, i64 %t474) + unreachable +inrange7135: + %t476 = extractvalue { ptr, i64, i64 } %t473, 0 + %t477 = getelementptr inbounds %S.ast.Node, ptr %t476, i64 0 + %t478 = load %S.ast.Node, ptr %t477 + %t479 = getelementptr inbounds %S.gen.Val, ptr %a169, i32 0, i32 1 + %t480 = load %S.ast.Type, ptr %t479 + %t481 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t480) + store { ptr, i64, i64 } { ptr @.str.4641, i64 11, i64 0 }, ptr %a483 + store { ptr, i64, i64 } %t481, ptr %a484 + call void @finch_str_concat(ptr %a482, ptr %a483, ptr %a484) + %t485 = load { ptr, i64, i64 }, ptr %a482 + store { ptr, i64, i64 } %t485, ptr %a487 + store { ptr, i64, i64 } { ptr @.str.4642, i64 9, i64 0 }, ptr %a488 + call void @finch_str_concat(ptr %a486, ptr %a487, ptr %a488) + %t489 = load { ptr, i64, i64 }, ptr %a486 + call void @finch.gen.fail(ptr %t471, %S.ast.Node %t478, { ptr, i64, i64 } %t489) + br label %endif7133 +endif7133: + br label %endif7110 +endif7110: + br label %endif7095 +endif7095: + br label %endif7092 +endif7092: + br label %endif7089 +endif7089: + br label %endif7086 +endif7086: + br label %endif7083 +endif7083: + br label %endif7080 +endif7080: + br label %endif7077 +endif7077: + %t490 = load ptr, ptr %a1 + %t491 = load { ptr, i64, i64 }, ptr %a172 + %t492 = call { ptr, i64, i64 } @finch.gen.load(ptr %t490, { ptr, i64, i64 } { ptr @.str.4643, i64 17, i64 0 }, { ptr, i64, i64 } %t491) + %t493 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t492, 0 + %t494 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4644, i64 3, i64 0 }) + %t495 = insertvalue %S.gen.Val %t493, %S.ast.Type %t494, 1 + %t496 = insertvalue %S.gen.Val %t495, i1 true, 2 + ret %S.gen.Val %t496 +endif7072: + %t497 = load { ptr, i64, i64 }, ptr %a8 + %t498 = call { ptr, i64, i64 } @finch.gen.numType({ ptr, i64, i64 } %t497) + store { ptr, i64, i64 } %t498, ptr %a499 + %t500 = getelementptr inbounds { ptr, i64, i64 }, ptr %a499, i32 0, i32 1 + %t501 = load i64, ptr %t500 + %t502 = icmp sgt i64 %t501, 0 + br i1 %t502, label %then7136, label %endif7138 +then7136: + %t503 = load ptr, ptr %a1 + %t504 = load %S.ast.Node, ptr %a2 + %t505 = load { ptr, i64, i64 }, ptr %a499 + %t506 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } %t505) + %t507 = call %S.gen.Val @finch.gen.convert(ptr %t503, %S.ast.Node %t504, %S.ast.Type %t506) + ret %S.gen.Val %t507 +endif7138: + %t508 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t508, ptr %a509 + store { ptr, i64, i64 } { ptr @.str.4645, i64 9, i64 0 }, ptr %a510 + %t511 = call i32 @finch_str_eq(ptr %a509, ptr %a510) + %t512 = icmp ne i32 %t511, 0 + br label %logic.from7139 +logic.from7139: + br i1 %t512, label %logic.end7141, label %logic.rhs7140 +logic.rhs7140: + %t513 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t513, ptr %a514 + store { ptr, i64, i64 } { ptr @.str.4646, i64 11, i64 0 }, ptr %a515 + %t516 = call i32 @finch_str_eq(ptr %a514, ptr %a515) + %t517 = icmp ne i32 %t516, 0 + br label %logic.rend7142 +logic.rend7142: + br label %logic.end7141 +logic.end7141: + %t518 = phi i1 [ true, %logic.from7139 ], [ %t517, %logic.rend7142 ] + br i1 %t518, label %then7143, label %endif7145 +then7143: + %t519 = load ptr, ptr %a1 + %t520 = load %S.ast.Node, ptr %a2 + %t521 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t519, %S.ast.Node %t520, i64 0, i64 1, { ptr, i64, i64 } %t521) + %t522 = load ptr, ptr %a1 + %t523 = load ptr, ptr %a1 + %t524 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t525 = load { ptr, i64, i64 }, ptr %t524 + %t526 = extractvalue { ptr, i64, i64 } %t525, 1 + %t527 = icmp uge i64 0, %t526 + br i1 %t527, label %range7146, label %inrange7147 +range7146: + call void @finch_panic_index(ptr @.str.4647, i64 4238, i64 0, i64 %t526) + unreachable +inrange7147: + %t528 = extractvalue { ptr, i64, i64 } %t525, 0 + %t529 = getelementptr inbounds %S.ast.Node, ptr %t528, i64 0 + %t530 = load %S.ast.Node, ptr %t529 + %t531 = call %S.gen.Val @finch.gen.strArg(ptr %t523, %S.ast.Node %t530, { ptr, i64, i64 } { ptr @.str.4648, i64 13, i64 0 }) + %t532 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t522, %S.gen.Val %t531) + store { ptr, i64, i64 } %t532, ptr %a533 + %t534 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t534, ptr %a535 + store { ptr, i64, i64 } { ptr @.str.4649, i64 11, i64 0 }, ptr %a536 + %t537 = call i32 @finch_str_eq(ptr %a535, ptr %a536) + %t538 = icmp ne i32 %t537, 0 + br i1 %t538, label %then7148, label %endif7150 +then7148: + %t539 = load ptr, ptr %a1 + %t540 = load { ptr, i64, i64 }, ptr %a533 + store { ptr, i64, i64 } { ptr @.str.4650, i64 32, i64 0 }, ptr %a542 + store { ptr, i64, i64 } %t540, ptr %a543 + call void @finch_str_concat(ptr %a541, ptr %a542, ptr %a543) + %t544 = load { ptr, i64, i64 }, ptr %a541 + store { ptr, i64, i64 } %t544, ptr %a546 + store { ptr, i64, i64 } { ptr @.str.4651, i64 1, i64 0 }, ptr %a547 + call void @finch_str_concat(ptr %a545, ptr %a546, ptr %a547) + %t548 = load { ptr, i64, i64 }, ptr %a545 + %t549 = call { ptr, i64, i64 } @finch.gen.op(ptr %t539, { ptr, i64, i64 } %t548) + store { ptr, i64, i64 } %t549, ptr %a550 + %t551 = load ptr, ptr %a1 + %t552 = load { ptr, i64, i64 }, ptr %a550 + store { ptr, i64, i64 } { ptr @.str.4652, i64 12, i64 0 }, ptr %a554 + store { ptr, i64, i64 } %t552, ptr %a555 + call void @finch_str_concat(ptr %a553, ptr %a554, ptr %a555) + %t556 = load { ptr, i64, i64 }, ptr %a553 + store { ptr, i64, i64 } %t556, ptr %a558 + store { ptr, i64, i64 } { ptr @.str.4653, i64 3, i64 0 }, ptr %a559 + call void @finch_str_concat(ptr %a557, ptr %a558, ptr %a559) + %t560 = load { ptr, i64, i64 }, ptr %a557 + %t561 = call { ptr, i64, i64 } @finch.gen.op(ptr %t551, { ptr, i64, i64 } %t560) + %t562 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t561, 0 + %t563 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4654, i64 4, i64 0 }) + %t564 = insertvalue %S.gen.Val %t562, %S.ast.Type %t563, 1 + ret %S.gen.Val %t564 +endif7150: + %t565 = load ptr, ptr %a1 + %t566 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t565) + store { ptr, i64, i64 } %t566, ptr %a567 + %t568 = load ptr, ptr %a1 + %t569 = icmp eq ptr %t568, null + br i1 %t569, label %panic7151, label %ok7152 +panic7151: + call void @finch_panic(ptr @.str.4655, i64 4244, ptr @.str.4656) + unreachable +ok7152: + %t570 = getelementptr inbounds %S.gen.Gen, ptr %t568, i32 0, i32 37 + %t571 = load { ptr, i64, i64 }, ptr %t570 + %t572 = load %S.ast.Node, ptr %a2 + %t573 = call { ptr, i64, i64 } @finch.gen.nodeKey(%S.ast.Node %t572) + store { ptr, i64, i64 } %t571, ptr %a574 + store { ptr, i64, i64 } %t573, ptr %a575 + %t576 = call i32 @finch_str_eq(ptr %a574, ptr %a575) + %t577 = icmp ne i32 %t576, 0 + br i1 %t577, label %then7153, label %endif7155 +then7153: + %t578 = load ptr, ptr %a1 + %t579 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t578, { ptr, i64, i64 } { ptr @.str.4657, i64 17, i64 0 }) + store { ptr, i64, i64 } %t579, ptr %a580 + %t581 = load ptr, ptr %a1 + %t582 = load { ptr, i64, i64 }, ptr %a567 + call void @finch.gen.store(ptr %t581, { ptr, i64, i64 } { ptr @.str.4658, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4659, i64 15, i64 0 }, { ptr, i64, i64 } %t582) + %t583 = load ptr, ptr %a1 + %t584 = load { ptr, i64, i64 }, ptr %a580 + call void @finch.gen.store(ptr %t583, { ptr, i64, i64 } { ptr @.str.4660, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4661, i64 15, i64 0 }, { ptr, i64, i64 } %t584) + %t585 = load ptr, ptr %a1 + %t586 = load { ptr, i64, i64 }, ptr %a567 + store { ptr, i64, i64 } { ptr @.str.4662, i64 34, i64 0 }, ptr %a588 + store { ptr, i64, i64 } %t586, ptr %a589 + call void @finch_str_concat(ptr %a587, ptr %a588, ptr %a589) + %t590 = load { ptr, i64, i64 }, ptr %a587 + store { ptr, i64, i64 } %t590, ptr %a592 + store { ptr, i64, i64 } { ptr @.str.4663, i64 6, i64 0 }, ptr %a593 + call void @finch_str_concat(ptr %a591, ptr %a592, ptr %a593) + %t594 = load { ptr, i64, i64 }, ptr %a591 + %t595 = load { ptr, i64, i64 }, ptr %a533 + store { ptr, i64, i64 } %t594, ptr %a597 + store { ptr, i64, i64 } %t595, ptr %a598 + call void @finch_str_concat(ptr %a596, ptr %a597, ptr %a598) + %t599 = load { ptr, i64, i64 }, ptr %a596 + store { ptr, i64, i64 } %t599, ptr %a601 + store { ptr, i64, i64 } { ptr @.str.4664, i64 6, i64 0 }, ptr %a602 + call void @finch_str_concat(ptr %a600, ptr %a601, ptr %a602) + %t603 = load { ptr, i64, i64 }, ptr %a600 + %t604 = load { ptr, i64, i64 }, ptr %a580 + store { ptr, i64, i64 } %t603, ptr %a606 + store { ptr, i64, i64 } %t604, ptr %a607 + call void @finch_str_concat(ptr %a605, ptr %a606, ptr %a607) + %t608 = load { ptr, i64, i64 }, ptr %a605 + store { ptr, i64, i64 } %t608, ptr %a610 + store { ptr, i64, i64 } { ptr @.str.4665, i64 1, i64 0 }, ptr %a611 + call void @finch_str_concat(ptr %a609, ptr %a610, ptr %a611) + %t612 = load { ptr, i64, i64 }, ptr %a609 + %t613 = call { ptr, i64, i64 } @finch.gen.op(ptr %t585, { ptr, i64, i64 } %t612) + store { ptr, i64, i64 } %t613, ptr %a614 + %t615 = load ptr, ptr %a1 + %t616 = load { ptr, i64, i64 }, ptr %a614 + store { ptr, i64, i64 } { ptr @.str.4666, i64 12, i64 0 }, ptr %a618 + store { ptr, i64, i64 } %t616, ptr %a619 + call void @finch_str_concat(ptr %a617, ptr %a618, ptr %a619) + %t620 = load { ptr, i64, i64 }, ptr %a617 + store { ptr, i64, i64 } %t620, ptr %a622 + store { ptr, i64, i64 } { ptr @.str.4667, i64 3, i64 0 }, ptr %a623 + call void @finch_str_concat(ptr %a621, ptr %a622, ptr %a623) + %t624 = load { ptr, i64, i64 }, ptr %a621 + %t625 = call { ptr, i64, i64 } @finch.gen.op(ptr %t615, { ptr, i64, i64 } %t624) + %t626 = load ptr, ptr %a1 + %t627 = icmp eq ptr %t626, null + br i1 %t627, label %panic7156, label %ok7157 +panic7156: + call void @finch_panic(ptr @.str.4668, i64 4249, ptr @.str.4669) + unreachable +ok7157: + %t628 = getelementptr inbounds %S.gen.Gen, ptr %t626, i32 0, i32 38 + store { ptr, i64, i64 } %t625, ptr %t628 + %t629 = load ptr, ptr %a1 + %t630 = load { ptr, i64, i64 }, ptr %a580 + %t631 = call { ptr, i64, i64 } @finch.gen.load(ptr %t629, { ptr, i64, i64 } { ptr @.str.4670, i64 17, i64 0 }, { ptr, i64, i64 } %t630) + %t632 = load ptr, ptr %a1 + %t633 = icmp eq ptr %t632, null + br i1 %t633, label %panic7158, label %ok7159 +panic7158: + call void @finch_panic(ptr @.str.4671, i64 4250, ptr @.str.4672) + unreachable +ok7159: + %t634 = getelementptr inbounds %S.gen.Gen, ptr %t632, i32 0, i32 39 + store { ptr, i64, i64 } %t631, ptr %t634 + %t635 = load ptr, ptr %a1 + %t636 = load { ptr, i64, i64 }, ptr %a567 + %t637 = call { ptr, i64, i64 } @finch.gen.load(ptr %t635, { ptr, i64, i64 } { ptr @.str.4673, i64 17, i64 0 }, { ptr, i64, i64 } %t636) + %t638 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t637, 0 + %t639 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4674, i64 3, i64 0 }) + %t640 = insertvalue %S.gen.Val %t638, %S.ast.Type %t639, 1 + %t641 = insertvalue %S.gen.Val %t640, i1 true, 2 + ret %S.gen.Val %t641 +endif7155: + %t642 = load ptr, ptr %a1 + %t643 = load ptr, ptr %a1 + %t644 = icmp eq ptr %t643, null + br i1 %t644, label %panic7160, label %ok7161 +panic7160: + call void @finch_panic(ptr @.str.4675, i64 4253, ptr @.str.4676) + unreachable +ok7161: + %t645 = getelementptr inbounds %S.gen.Gen, ptr %t643, i32 0, i32 1 + %t646 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t647 = load i64, ptr %t646 + %t648 = load { ptr, i64, i64 }, ptr %t645 + %t649 = extractvalue { ptr, i64, i64 } %t648, 1 + %t650 = icmp uge i64 %t647, %t649 + br i1 %t650, label %range7162, label %inrange7163 +range7162: + call void @finch_panic_index(ptr @.str.4677, i64 4253, i64 %t647, i64 %t649) + unreachable +inrange7163: + %t651 = extractvalue { ptr, i64, i64 } %t648, 0 + %t652 = getelementptr inbounds { ptr, i64, i64 }, ptr %t651, i64 %t647 + %t653 = load { ptr, i64, i64 }, ptr %t652 + %t654 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t642, { ptr, i64, i64 } %t653) + store { ptr, i64, i64 } %t654, ptr %a655 + %t656 = load ptr, ptr %a1 + %t657 = load { ptr, i64, i64 }, ptr %a567 + store { ptr, i64, i64 } { ptr @.str.4678, i64 31, i64 0 }, ptr %a659 + store { ptr, i64, i64 } %t657, ptr %a660 + call void @finch_str_concat(ptr %a658, ptr %a659, ptr %a660) + %t661 = load { ptr, i64, i64 }, ptr %a658 + store { ptr, i64, i64 } %t661, ptr %a663 + store { ptr, i64, i64 } { ptr @.str.4679, i64 6, i64 0 }, ptr %a664 + call void @finch_str_concat(ptr %a662, ptr %a663, ptr %a664) + %t665 = load { ptr, i64, i64 }, ptr %a662 + %t666 = load { ptr, i64, i64 }, ptr %a533 + store { ptr, i64, i64 } %t665, ptr %a668 + store { ptr, i64, i64 } %t666, ptr %a669 + call void @finch_str_concat(ptr %a667, ptr %a668, ptr %a669) + %t670 = load { ptr, i64, i64 }, ptr %a667 + store { ptr, i64, i64 } %t670, ptr %a672 + store { ptr, i64, i64 } { ptr @.str.4680, i64 6, i64 0 }, ptr %a673 + call void @finch_str_concat(ptr %a671, ptr %a672, ptr %a673) + %t674 = load { ptr, i64, i64 }, ptr %a671 + %t675 = load { ptr, i64, i64 }, ptr %a655 + store { ptr, i64, i64 } %t674, ptr %a677 + store { ptr, i64, i64 } %t675, ptr %a678 + call void @finch_str_concat(ptr %a676, ptr %a677, ptr %a678) + %t679 = load { ptr, i64, i64 }, ptr %a676 + store { ptr, i64, i64 } %t679, ptr %a681 + store { ptr, i64, i64 } { ptr @.str.4681, i64 6, i64 0 }, ptr %a682 + call void @finch_str_concat(ptr %a680, ptr %a681, ptr %a682) + %t683 = load { ptr, i64, i64 }, ptr %a680 + %t684 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t685 = load i64, ptr %t684 + call void @finch_str_from_int(ptr %a686, i64 %t685) + %t687 = load { ptr, i64, i64 }, ptr %a686 + store { ptr, i64, i64 } %t683, ptr %a689 + store { ptr, i64, i64 } %t687, ptr %a690 + call void @finch_str_concat(ptr %a688, ptr %a689, ptr %a690) + %t691 = load { ptr, i64, i64 }, ptr %a688 + store { ptr, i64, i64 } %t691, ptr %a693 + store { ptr, i64, i64 } { ptr @.str.4682, i64 1, i64 0 }, ptr %a694 + call void @finch_str_concat(ptr %a692, ptr %a693, ptr %a694) + %t695 = load { ptr, i64, i64 }, ptr %a692 + call void @finch.gen.emit(ptr %t656, { ptr, i64, i64 } %t695) + %t696 = load ptr, ptr %a1 + %t697 = load { ptr, i64, i64 }, ptr %a567 + %t698 = call { ptr, i64, i64 } @finch.gen.load(ptr %t696, { ptr, i64, i64 } { ptr @.str.4683, i64 17, i64 0 }, { ptr, i64, i64 } %t697) + %t699 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t698, 0 + %t700 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4684, i64 3, i64 0 }) + %t701 = insertvalue %S.gen.Val %t699, %S.ast.Type %t700, 1 + %t702 = insertvalue %S.gen.Val %t701, i1 true, 2 + ret %S.gen.Val %t702 +endif7145: + %t703 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t703, ptr %a704 + store { ptr, i64, i64 } { ptr @.str.4685, i64 10, i64 0 }, ptr %a705 + %t706 = call i32 @finch_str_eq(ptr %a704, ptr %a705) + %t707 = icmp ne i32 %t706, 0 + br i1 %t707, label %then7164, label %endif7166 +then7164: + %t708 = load ptr, ptr %a1 + %t709 = load %S.ast.Node, ptr %a2 + %t710 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t708, %S.ast.Node %t709, i64 0, i64 2, { ptr, i64, i64 } %t710) + %t711 = load ptr, ptr %a1 + %t712 = load ptr, ptr %a1 + %t713 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t714 = load { ptr, i64, i64 }, ptr %t713 + %t715 = extractvalue { ptr, i64, i64 } %t714, 1 + %t716 = icmp uge i64 0, %t715 + br i1 %t716, label %range7167, label %inrange7168 +range7167: + call void @finch_panic_index(ptr @.str.4686, i64 4259, i64 0, i64 %t715) + unreachable +inrange7168: + %t717 = extractvalue { ptr, i64, i64 } %t714, 0 + %t718 = getelementptr inbounds %S.ast.Node, ptr %t717, i64 0 + %t719 = load %S.ast.Node, ptr %t718 + %t720 = call %S.gen.Val @finch.gen.strArg(ptr %t712, %S.ast.Node %t719, { ptr, i64, i64 } { ptr @.str.4687, i64 13, i64 0 }) + %t721 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t711, %S.gen.Val %t720) + store { ptr, i64, i64 } %t721, ptr %a722 + %t723 = load ptr, ptr %a1 + %t724 = load ptr, ptr %a1 + %t725 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t726 = load { ptr, i64, i64 }, ptr %t725 + %t727 = extractvalue { ptr, i64, i64 } %t726, 1 + %t728 = icmp uge i64 1, %t727 + br i1 %t728, label %range7169, label %inrange7170 +range7169: + call void @finch_panic_index(ptr @.str.4688, i64 4260, i64 1, i64 %t727) + unreachable +inrange7170: + %t729 = extractvalue { ptr, i64, i64 } %t726, 0 + %t730 = getelementptr inbounds %S.ast.Node, ptr %t729, i64 1 + %t731 = load %S.ast.Node, ptr %t730 + %t732 = call %S.gen.Val @finch.gen.strArg(ptr %t724, %S.ast.Node %t731, { ptr, i64, i64 } { ptr @.str.4689, i64 8, i64 0 }) + %t733 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t723, %S.gen.Val %t732) + store { ptr, i64, i64 } %t733, ptr %a734 + %t735 = load ptr, ptr %a1 + %t736 = icmp eq ptr %t735, null + br i1 %t736, label %panic7171, label %ok7172 +panic7171: + call void @finch_panic(ptr @.str.4690, i64 4261, ptr @.str.4691) + unreachable +ok7172: + %t737 = getelementptr inbounds %S.gen.Gen, ptr %t735, i32 0, i32 37 + %t738 = load { ptr, i64, i64 }, ptr %t737 + %t739 = load %S.ast.Node, ptr %a2 + %t740 = call { ptr, i64, i64 } @finch.gen.nodeKey(%S.ast.Node %t739) + store { ptr, i64, i64 } %t738, ptr %a741 + store { ptr, i64, i64 } %t740, ptr %a742 + %t743 = call i32 @finch_str_eq(ptr %a741, ptr %a742) + %t744 = icmp ne i32 %t743, 0 + br i1 %t744, label %then7173, label %endif7175 +then7173: + %t745 = load ptr, ptr %a1 + %t746 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t745, { ptr, i64, i64 } { ptr @.str.4692, i64 17, i64 0 }) + store { ptr, i64, i64 } %t746, ptr %a747 + %t748 = load ptr, ptr %a1 + %t749 = load { ptr, i64, i64 }, ptr %a747 + call void @finch.gen.store(ptr %t748, { ptr, i64, i64 } { ptr @.str.4693, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4694, i64 15, i64 0 }, { ptr, i64, i64 } %t749) + %t750 = load ptr, ptr %a1 + %t751 = load { ptr, i64, i64 }, ptr %a722 + store { ptr, i64, i64 } { ptr @.str.4695, i64 35, i64 0 }, ptr %a753 + store { ptr, i64, i64 } %t751, ptr %a754 + call void @finch_str_concat(ptr %a752, ptr %a753, ptr %a754) + %t755 = load { ptr, i64, i64 }, ptr %a752 + store { ptr, i64, i64 } %t755, ptr %a757 + store { ptr, i64, i64 } { ptr @.str.4696, i64 6, i64 0 }, ptr %a758 + call void @finch_str_concat(ptr %a756, ptr %a757, ptr %a758) + %t759 = load { ptr, i64, i64 }, ptr %a756 + %t760 = load { ptr, i64, i64 }, ptr %a734 + store { ptr, i64, i64 } %t759, ptr %a762 + store { ptr, i64, i64 } %t760, ptr %a763 + call void @finch_str_concat(ptr %a761, ptr %a762, ptr %a763) + %t764 = load { ptr, i64, i64 }, ptr %a761 + store { ptr, i64, i64 } %t764, ptr %a766 + store { ptr, i64, i64 } { ptr @.str.4697, i64 6, i64 0 }, ptr %a767 + call void @finch_str_concat(ptr %a765, ptr %a766, ptr %a767) + %t768 = load { ptr, i64, i64 }, ptr %a765 + %t769 = load { ptr, i64, i64 }, ptr %a747 + store { ptr, i64, i64 } %t768, ptr %a771 + store { ptr, i64, i64 } %t769, ptr %a772 + call void @finch_str_concat(ptr %a770, ptr %a771, ptr %a772) + %t773 = load { ptr, i64, i64 }, ptr %a770 + store { ptr, i64, i64 } %t773, ptr %a775 + store { ptr, i64, i64 } { ptr @.str.4698, i64 1, i64 0 }, ptr %a776 + call void @finch_str_concat(ptr %a774, ptr %a775, ptr %a776) + %t777 = load { ptr, i64, i64 }, ptr %a774 + %t778 = call { ptr, i64, i64 } @finch.gen.op(ptr %t750, { ptr, i64, i64 } %t777) + store { ptr, i64, i64 } %t778, ptr %a779 + %t780 = load ptr, ptr %a1 + %t781 = load { ptr, i64, i64 }, ptr %a779 + store { ptr, i64, i64 } { ptr @.str.4699, i64 12, i64 0 }, ptr %a783 + store { ptr, i64, i64 } %t781, ptr %a784 + call void @finch_str_concat(ptr %a782, ptr %a783, ptr %a784) + %t785 = load { ptr, i64, i64 }, ptr %a782 + store { ptr, i64, i64 } %t785, ptr %a787 + store { ptr, i64, i64 } { ptr @.str.4700, i64 3, i64 0 }, ptr %a788 + call void @finch_str_concat(ptr %a786, ptr %a787, ptr %a788) + %t789 = load { ptr, i64, i64 }, ptr %a786 + %t790 = call { ptr, i64, i64 } @finch.gen.op(ptr %t780, { ptr, i64, i64 } %t789) + %t791 = load ptr, ptr %a1 + %t792 = icmp eq ptr %t791, null + br i1 %t792, label %panic7176, label %ok7177 +panic7176: + call void @finch_panic(ptr @.str.4701, i64 4265, ptr @.str.4702) + unreachable +ok7177: + %t793 = getelementptr inbounds %S.gen.Gen, ptr %t791, i32 0, i32 38 + store { ptr, i64, i64 } %t790, ptr %t793 + %t794 = load ptr, ptr %a1 + %t795 = load { ptr, i64, i64 }, ptr %a747 + %t796 = call { ptr, i64, i64 } @finch.gen.load(ptr %t794, { ptr, i64, i64 } { ptr @.str.4703, i64 17, i64 0 }, { ptr, i64, i64 } %t795) + %t797 = load ptr, ptr %a1 + %t798 = icmp eq ptr %t797, null + br i1 %t798, label %panic7178, label %ok7179 +panic7178: + call void @finch_panic(ptr @.str.4704, i64 4266, ptr @.str.4705) + unreachable +ok7179: + %t799 = getelementptr inbounds %S.gen.Gen, ptr %t797, i32 0, i32 39 + store { ptr, i64, i64 } %t796, ptr %t799 + %t800 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4706, i64 4, i64 0 }) + %t801 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t800, 1 + ret %S.gen.Val %t801 +endif7175: + %t802 = load ptr, ptr %a1 + %t803 = load { ptr, i64, i64 }, ptr %a722 + store { ptr, i64, i64 } { ptr @.str.4707, i64 31, i64 0 }, ptr %a805 + store { ptr, i64, i64 } %t803, ptr %a806 + call void @finch_str_concat(ptr %a804, ptr %a805, ptr %a806) + %t807 = load { ptr, i64, i64 }, ptr %a804 + store { ptr, i64, i64 } %t807, ptr %a809 + store { ptr, i64, i64 } { ptr @.str.4708, i64 6, i64 0 }, ptr %a810 + call void @finch_str_concat(ptr %a808, ptr %a809, ptr %a810) + %t811 = load { ptr, i64, i64 }, ptr %a808 + %t812 = load { ptr, i64, i64 }, ptr %a734 + store { ptr, i64, i64 } %t811, ptr %a814 + store { ptr, i64, i64 } %t812, ptr %a815 + call void @finch_str_concat(ptr %a813, ptr %a814, ptr %a815) + %t816 = load { ptr, i64, i64 }, ptr %a813 + store { ptr, i64, i64 } %t816, ptr %a818 + store { ptr, i64, i64 } { ptr @.str.4709, i64 1, i64 0 }, ptr %a819 + call void @finch_str_concat(ptr %a817, ptr %a818, ptr %a819) + %t820 = load { ptr, i64, i64 }, ptr %a817 + %t821 = call { ptr, i64, i64 } @finch.gen.op(ptr %t802, { ptr, i64, i64 } %t820) + store { ptr, i64, i64 } %t821, ptr %a822 + %t823 = load ptr, ptr %a1 + %t824 = load { ptr, i64, i64 }, ptr %a822 + store { ptr, i64, i64 } { ptr @.str.4710, i64 12, i64 0 }, ptr %a826 + store { ptr, i64, i64 } %t824, ptr %a827 + call void @finch_str_concat(ptr %a825, ptr %a826, ptr %a827) + %t828 = load { ptr, i64, i64 }, ptr %a825 + store { ptr, i64, i64 } %t828, ptr %a830 + store { ptr, i64, i64 } { ptr @.str.4711, i64 3, i64 0 }, ptr %a831 + call void @finch_str_concat(ptr %a829, ptr %a830, ptr %a831) + %t832 = load { ptr, i64, i64 }, ptr %a829 + %t833 = call { ptr, i64, i64 } @finch.gen.op(ptr %t823, { ptr, i64, i64 } %t832) + %t834 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t833, 0 + %t835 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4712, i64 4, i64 0 }) + %t836 = insertvalue %S.gen.Val %t834, %S.ast.Type %t835, 1 + ret %S.gen.Val %t836 +endif7166: + %t837 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t837, ptr %a838 + store { ptr, i64, i64 } { ptr @.str.4713, i64 11, i64 0 }, ptr %a839 + %t840 = call i32 @finch_str_eq(ptr %a838, ptr %a839) + %t841 = icmp ne i32 %t840, 0 + br i1 %t841, label %then7180, label %endif7182 +then7180: + %t842 = load ptr, ptr %a1 + %t843 = load %S.ast.Node, ptr %a2 + %t844 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t842, %S.ast.Node %t843, i64 0, i64 1, { ptr, i64, i64 } %t844) + %t845 = load ptr, ptr %a1 + %t846 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t847 = load { ptr, i64, i64 }, ptr %t846 + %t848 = extractvalue { ptr, i64, i64 } %t847, 1 + %t849 = icmp uge i64 0, %t848 + br i1 %t849, label %range7183, label %inrange7184 +range7183: + call void @finch_panic_index(ptr @.str.4714, i64 4274, i64 0, i64 %t848) + unreachable +inrange7184: + %t850 = extractvalue { ptr, i64, i64 } %t847, 0 + %t851 = getelementptr inbounds %S.ast.Node, ptr %t850, i64 0 + %t852 = load %S.ast.Node, ptr %t851 + %t853 = call %S.gen.Val @finch.gen.strArg(ptr %t845, %S.ast.Node %t852, { ptr, i64, i64 } { ptr @.str.4715, i64 13, i64 0 }) + store %S.gen.Val %t853, ptr %a854 + %t855 = load ptr, ptr %a1 + %t856 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t855) + store { ptr, i64, i64 } %t856, ptr %a857 + %t858 = load ptr, ptr %a1 + %t859 = load { ptr, i64, i64 }, ptr %a857 + store { ptr, i64, i64 } { ptr @.str.4716, i64 30, i64 0 }, ptr %a861 + store { ptr, i64, i64 } %t859, ptr %a862 + call void @finch_str_concat(ptr %a860, ptr %a861, ptr %a862) + %t863 = load { ptr, i64, i64 }, ptr %a860 + store { ptr, i64, i64 } %t863, ptr %a865 + store { ptr, i64, i64 } { ptr @.str.4717, i64 6, i64 0 }, ptr %a866 + call void @finch_str_concat(ptr %a864, ptr %a865, ptr %a866) + %t867 = load { ptr, i64, i64 }, ptr %a864 + %t868 = load ptr, ptr %a1 + %t869 = load %S.gen.Val, ptr %a854 + %t870 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t868, %S.gen.Val %t869) + store { ptr, i64, i64 } %t867, ptr %a872 + store { ptr, i64, i64 } %t870, ptr %a873 + call void @finch_str_concat(ptr %a871, ptr %a872, ptr %a873) + %t874 = load { ptr, i64, i64 }, ptr %a871 + store { ptr, i64, i64 } %t874, ptr %a876 + store { ptr, i64, i64 } { ptr @.str.4718, i64 1, i64 0 }, ptr %a877 + call void @finch_str_concat(ptr %a875, ptr %a876, ptr %a877) + %t878 = load { ptr, i64, i64 }, ptr %a875 + call void @finch.gen.emit(ptr %t858, { ptr, i64, i64 } %t878) + %t879 = load ptr, ptr %a1 + %t880 = icmp eq ptr %t879, null + br i1 %t880, label %panic7185, label %ok7186 +panic7185: + call void @finch_panic(ptr @.str.4719, i64 4277, ptr @.str.4720) + unreachable +ok7186: + %t881 = getelementptr inbounds %S.gen.Gen, ptr %t879, i32 0, i32 37 + %t882 = load { ptr, i64, i64 }, ptr %t881 + %t883 = load %S.ast.Node, ptr %a2 + %t884 = call { ptr, i64, i64 } @finch.gen.nodeKey(%S.ast.Node %t883) + store { ptr, i64, i64 } %t882, ptr %a885 + store { ptr, i64, i64 } %t884, ptr %a886 + %t887 = call i32 @finch_str_eq(ptr %a885, ptr %a886) + %t888 = icmp ne i32 %t887, 0 + br i1 %t888, label %then7187, label %endif7189 +then7187: + %t889 = load ptr, ptr %a1 + %t890 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t889, { ptr, i64, i64 } { ptr @.str.4721, i64 17, i64 0 }) + store { ptr, i64, i64 } %t890, ptr %a891 + %t892 = load ptr, ptr %a1 + %t893 = load { ptr, i64, i64 }, ptr %a891 + call void @finch.gen.store(ptr %t892, { ptr, i64, i64 } { ptr @.str.4722, i64 17, i64 0 }, { ptr, i64, i64 } { ptr @.str.4723, i64 15, i64 0 }, { ptr, i64, i64 } %t893) + %t894 = load ptr, ptr %a1 + %t895 = load { ptr, i64, i64 }, ptr %a857 + store { ptr, i64, i64 } { ptr @.str.4724, i64 36, i64 0 }, ptr %a897 + store { ptr, i64, i64 } %t895, ptr %a898 + call void @finch_str_concat(ptr %a896, ptr %a897, ptr %a898) + %t899 = load { ptr, i64, i64 }, ptr %a896 + store { ptr, i64, i64 } %t899, ptr %a901 + store { ptr, i64, i64 } { ptr @.str.4725, i64 6, i64 0 }, ptr %a902 + call void @finch_str_concat(ptr %a900, ptr %a901, ptr %a902) + %t903 = load { ptr, i64, i64 }, ptr %a900 + %t904 = load { ptr, i64, i64 }, ptr %a891 + store { ptr, i64, i64 } %t903, ptr %a906 + store { ptr, i64, i64 } %t904, ptr %a907 + call void @finch_str_concat(ptr %a905, ptr %a906, ptr %a907) + %t908 = load { ptr, i64, i64 }, ptr %a905 + store { ptr, i64, i64 } %t908, ptr %a910 + store { ptr, i64, i64 } { ptr @.str.4726, i64 1, i64 0 }, ptr %a911 + call void @finch_str_concat(ptr %a909, ptr %a910, ptr %a911) + %t912 = load { ptr, i64, i64 }, ptr %a909 + %t913 = call { ptr, i64, i64 } @finch.gen.op(ptr %t894, { ptr, i64, i64 } %t912) + store { ptr, i64, i64 } %t913, ptr %a914 + %t915 = load ptr, ptr %a1 + %t916 = load { ptr, i64, i64 }, ptr %a914 + store { ptr, i64, i64 } { ptr @.str.4727, i64 12, i64 0 }, ptr %a918 + store { ptr, i64, i64 } %t916, ptr %a919 + call void @finch_str_concat(ptr %a917, ptr %a918, ptr %a919) + %t920 = load { ptr, i64, i64 }, ptr %a917 + store { ptr, i64, i64 } %t920, ptr %a922 + store { ptr, i64, i64 } { ptr @.str.4728, i64 3, i64 0 }, ptr %a923 + call void @finch_str_concat(ptr %a921, ptr %a922, ptr %a923) + %t924 = load { ptr, i64, i64 }, ptr %a921 + %t925 = call { ptr, i64, i64 } @finch.gen.op(ptr %t915, { ptr, i64, i64 } %t924) + %t926 = load ptr, ptr %a1 + %t927 = icmp eq ptr %t926, null + br i1 %t927, label %panic7190, label %ok7191 +panic7190: + call void @finch_panic(ptr @.str.4729, i64 4281, ptr @.str.4730) + unreachable +ok7191: + %t928 = getelementptr inbounds %S.gen.Gen, ptr %t926, i32 0, i32 38 + store { ptr, i64, i64 } %t925, ptr %t928 + %t929 = load ptr, ptr %a1 + %t930 = load { ptr, i64, i64 }, ptr %a891 + %t931 = call { ptr, i64, i64 } @finch.gen.load(ptr %t929, { ptr, i64, i64 } { ptr @.str.4731, i64 17, i64 0 }, { ptr, i64, i64 } %t930) + %t932 = load ptr, ptr %a1 + %t933 = icmp eq ptr %t932, null + br i1 %t933, label %panic7192, label %ok7193 +panic7192: + call void @finch_panic(ptr @.str.4732, i64 4282, ptr @.str.4733) + unreachable +ok7193: + %t934 = getelementptr inbounds %S.gen.Gen, ptr %t932, i32 0, i32 39 + store { ptr, i64, i64 } %t931, ptr %t934 + %t935 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4734, i64 4, i64 0 }) + %t936 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t935, 1 + ret %S.gen.Val %t936 +endif7189: + %t937 = load ptr, ptr %a1 + %t938 = load { ptr, i64, i64 }, ptr %a857 + store { ptr, i64, i64 } { ptr @.str.4735, i64 32, i64 0 }, ptr %a940 + store { ptr, i64, i64 } %t938, ptr %a941 + call void @finch_str_concat(ptr %a939, ptr %a940, ptr %a941) + %t942 = load { ptr, i64, i64 }, ptr %a939 + store { ptr, i64, i64 } %t942, ptr %a944 + store { ptr, i64, i64 } { ptr @.str.4736, i64 1, i64 0 }, ptr %a945 + call void @finch_str_concat(ptr %a943, ptr %a944, ptr %a945) + %t946 = load { ptr, i64, i64 }, ptr %a943 + %t947 = call { ptr, i64, i64 } @finch.gen.op(ptr %t937, { ptr, i64, i64 } %t946) + store { ptr, i64, i64 } %t947, ptr %a948 + %t949 = load ptr, ptr %a1 + %t950 = load { ptr, i64, i64 }, ptr %a948 + store { ptr, i64, i64 } { ptr @.str.4737, i64 12, i64 0 }, ptr %a952 + store { ptr, i64, i64 } %t950, ptr %a953 + call void @finch_str_concat(ptr %a951, ptr %a952, ptr %a953) + %t954 = load { ptr, i64, i64 }, ptr %a951 + store { ptr, i64, i64 } %t954, ptr %a956 + store { ptr, i64, i64 } { ptr @.str.4738, i64 3, i64 0 }, ptr %a957 + call void @finch_str_concat(ptr %a955, ptr %a956, ptr %a957) + %t958 = load { ptr, i64, i64 }, ptr %a955 + %t959 = call { ptr, i64, i64 } @finch.gen.op(ptr %t949, { ptr, i64, i64 } %t958) + %t960 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t959, 0 + %t961 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4739, i64 4, i64 0 }) + %t962 = insertvalue %S.gen.Val %t960, %S.ast.Type %t961, 1 + ret %S.gen.Val %t962 +endif7182: + %t963 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t963, ptr %a964 + store { ptr, i64, i64 } { ptr @.str.4740, i64 5, i64 0 }, ptr %a965 + %t966 = call i32 @finch_str_eq(ptr %a964, ptr %a965) + %t967 = icmp ne i32 %t966, 0 + br i1 %t967, label %then7194, label %endif7196 +then7194: + %t968 = load ptr, ptr %a1 + %t969 = load %S.ast.Node, ptr %a2 + %t970 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t968, %S.ast.Node %t969, i64 0, i64 1, { ptr, i64, i64 } %t970) + %t971 = load ptr, ptr %a1 + %t972 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t973 = load { ptr, i64, i64 }, ptr %t972 + %t974 = extractvalue { ptr, i64, i64 } %t973, 1 + %t975 = icmp uge i64 0, %t974 + br i1 %t975, label %range7197, label %inrange7198 +range7197: + call void @finch_panic_index(ptr @.str.4741, i64 4290, i64 0, i64 %t974) + unreachable +inrange7198: + %t976 = extractvalue { ptr, i64, i64 } %t973, 0 + %t977 = getelementptr inbounds %S.ast.Node, ptr %t976, i64 0 + %t978 = load %S.ast.Node, ptr %t977 + %t979 = call %S.gen.Val @finch.gen.strArg(ptr %t971, %S.ast.Node %t978, { ptr, i64, i64 } { ptr @.str.4742, i64 11, i64 0 }) + store %S.gen.Val %t979, ptr %a980 + %t981 = load ptr, ptr %a1 + %t982 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t981) + store { ptr, i64, i64 } %t982, ptr %a983 + %t984 = load ptr, ptr %a1 + %t985 = load { ptr, i64, i64 }, ptr %a983 + store { ptr, i64, i64 } { ptr @.str.4743, i64 30, i64 0 }, ptr %a987 + store { ptr, i64, i64 } %t985, ptr %a988 + call void @finch_str_concat(ptr %a986, ptr %a987, ptr %a988) + %t989 = load { ptr, i64, i64 }, ptr %a986 + store { ptr, i64, i64 } %t989, ptr %a991 + store { ptr, i64, i64 } { ptr @.str.4744, i64 6, i64 0 }, ptr %a992 + call void @finch_str_concat(ptr %a990, ptr %a991, ptr %a992) + %t993 = load { ptr, i64, i64 }, ptr %a990 + %t994 = load ptr, ptr %a1 + %t995 = load %S.gen.Val, ptr %a980 + %t996 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t994, %S.gen.Val %t995) + store { ptr, i64, i64 } %t993, ptr %a998 + store { ptr, i64, i64 } %t996, ptr %a999 + call void @finch_str_concat(ptr %a997, ptr %a998, ptr %a999) + %t1000 = load { ptr, i64, i64 }, ptr %a997 + store { ptr, i64, i64 } %t1000, ptr %a1002 + store { ptr, i64, i64 } { ptr @.str.4745, i64 1, i64 0 }, ptr %a1003 + call void @finch_str_concat(ptr %a1001, ptr %a1002, ptr %a1003) + %t1004 = load { ptr, i64, i64 }, ptr %a1001 + call void @finch.gen.emit(ptr %t984, { ptr, i64, i64 } %t1004) + %t1005 = load ptr, ptr %a1 + %t1006 = load { ptr, i64, i64 }, ptr %a983 + store { ptr, i64, i64 } { ptr @.str.4746, i64 26, i64 0 }, ptr %a1008 + store { ptr, i64, i64 } %t1006, ptr %a1009 + call void @finch_str_concat(ptr %a1007, ptr %a1008, ptr %a1009) + %t1010 = load { ptr, i64, i64 }, ptr %a1007 + store { ptr, i64, i64 } %t1010, ptr %a1012 + store { ptr, i64, i64 } { ptr @.str.4747, i64 1, i64 0 }, ptr %a1013 + call void @finch_str_concat(ptr %a1011, ptr %a1012, ptr %a1013) + %t1014 = load { ptr, i64, i64 }, ptr %a1011 + %t1015 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1005, { ptr, i64, i64 } %t1014) + %t1016 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t1015, 0 + %t1017 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4748, i64 3, i64 0 }) + %t1018 = insertvalue %S.gen.Val %t1016, %S.ast.Type %t1017, 1 + ret %S.gen.Val %t1018 +endif7196: + %t1019 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t1019, ptr %a1020 + store { ptr, i64, i64 } { ptr @.str.4749, i64 4, i64 0 }, ptr %a1021 + %t1022 = call i32 @finch_str_eq(ptr %a1020, ptr %a1021) + %t1023 = icmp ne i32 %t1022, 0 + br i1 %t1023, label %then7199, label %endif7201 +then7199: + %t1024 = load ptr, ptr %a1 + %t1025 = load %S.ast.Node, ptr %a2 + %t1026 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t1024, %S.ast.Node %t1025, i64 0, i64 1, { ptr, i64, i64 } %t1026) + %t1027 = load ptr, ptr %a1 + %t1028 = load ptr, ptr %a1 + %t1029 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1030 = load { ptr, i64, i64 }, ptr %t1029 + %t1031 = extractvalue { ptr, i64, i64 } %t1030, 1 + %t1032 = icmp uge i64 0, %t1031 + br i1 %t1032, label %range7202, label %inrange7203 +range7202: + call void @finch_panic_index(ptr @.str.4750, i64 4297, i64 0, i64 %t1031) + unreachable +inrange7203: + %t1033 = extractvalue { ptr, i64, i64 } %t1030, 0 + %t1034 = getelementptr inbounds %S.ast.Node, ptr %t1033, i64 0 + %t1035 = load %S.ast.Node, ptr %t1034 + %t1036 = call %S.gen.Val @finch.gen.expr(ptr %t1028, %S.ast.Node %t1035) + %t1037 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4751, i64 3, i64 0 }) + %t1038 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1039 = load { ptr, i64, i64 }, ptr %t1038 + %t1040 = extractvalue { ptr, i64, i64 } %t1039, 1 + %t1041 = icmp uge i64 0, %t1040 + br i1 %t1041, label %range7204, label %inrange7205 +range7204: + call void @finch_panic_index(ptr @.str.4752, i64 4297, i64 0, i64 %t1040) + unreachable +inrange7205: + %t1042 = extractvalue { ptr, i64, i64 } %t1039, 0 + %t1043 = getelementptr inbounds %S.ast.Node, ptr %t1042, i64 0 + %t1044 = load %S.ast.Node, ptr %t1043 + %t1045 = call %S.gen.Val @finch.gen.coerce(ptr %t1027, %S.gen.Val %t1036, %S.ast.Type %t1037, %S.ast.Node %t1044, { ptr, i64, i64 } { ptr @.str.4753, i64 13, i64 0 }) + store %S.gen.Val %t1045, ptr %a1046 + %t1047 = load ptr, ptr %a1 + %t1048 = getelementptr inbounds %S.gen.Val, ptr %a1046, i32 0, i32 0 + %t1049 = load { ptr, i64, i64 }, ptr %t1048 + store { ptr, i64, i64 } { ptr @.str.4754, i64 10, i64 0 }, ptr %a1051 + store { ptr, i64, i64 } %t1049, ptr %a1052 + call void @finch_str_concat(ptr %a1050, ptr %a1051, ptr %a1052) + %t1053 = load { ptr, i64, i64 }, ptr %a1050 + store { ptr, i64, i64 } %t1053, ptr %a1055 + store { ptr, i64, i64 } { ptr @.str.4755, i64 7, i64 0 }, ptr %a1056 + call void @finch_str_concat(ptr %a1054, ptr %a1055, ptr %a1056) + %t1057 = load { ptr, i64, i64 }, ptr %a1054 + %t1058 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1047, { ptr, i64, i64 } %t1057) + store { ptr, i64, i64 } %t1058, ptr %a1059 + %t1060 = load ptr, ptr %a1 + %t1061 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1060, { ptr, i64, i64 } { ptr @.str.4756, i64 26, i64 0 }) + store { ptr, i64, i64 } %t1061, ptr %a1062 + %t1063 = load ptr, ptr %a1 + %t1064 = load { ptr, i64, i64 }, ptr %a1059 + store { ptr, i64, i64 } { ptr @.str.4757, i64 20, i64 0 }, ptr %a1066 + store { ptr, i64, i64 } %t1064, ptr %a1067 + call void @finch_str_concat(ptr %a1065, ptr %a1066, ptr %a1067) + %t1068 = load { ptr, i64, i64 }, ptr %a1065 + store { ptr, i64, i64 } %t1068, ptr %a1070 + store { ptr, i64, i64 } { ptr @.str.4758, i64 1, i64 0 }, ptr %a1071 + call void @finch_str_concat(ptr %a1069, ptr %a1070, ptr %a1071) + %t1072 = load { ptr, i64, i64 }, ptr %a1069 + call void @finch.gen.emit(ptr %t1063, { ptr, i64, i64 } %t1072) + %t1073 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4759, i64 4, i64 0 }) + %t1074 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t1073, 1 + ret %S.gen.Val %t1074 +endif7201: + %t1075 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t1075, ptr %a1076 + store { ptr, i64, i64 } { ptr @.str.4760, i64 5, i64 0 }, ptr %a1077 + %t1078 = call i32 @finch_str_eq(ptr %a1076, ptr %a1077) + %t1079 = icmp ne i32 %t1078, 0 + br i1 %t1079, label %then7206, label %endif7208 +then7206: + %t1080 = load ptr, ptr %a1 + %t1081 = call %S.gen.Val @finch.gen.strConst(ptr %t1080, { ptr, i64, i64 } { ptr @.str.4761, i64 0, i64 0 }) + store %S.gen.Val %t1081, ptr %a1082 + %t1083 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1084 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1083, i32 0, i32 1 + %t1085 = load i64, ptr %t1084 + %t1086 = icmp sgt i64 %t1085, 0 + br i1 %t1086, label %then7209, label %endif7211 +then7209: + %t1087 = load ptr, ptr %a1 + %t1088 = load %S.ast.Node, ptr %a2 + %t1089 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t1087, %S.ast.Node %t1088, i64 0, i64 1, { ptr, i64, i64 } %t1089) + %t1090 = load ptr, ptr %a1 + %t1091 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1092 = load { ptr, i64, i64 }, ptr %t1091 + %t1093 = extractvalue { ptr, i64, i64 } %t1092, 1 + %t1094 = icmp uge i64 0, %t1093 + br i1 %t1094, label %range7212, label %inrange7213 +range7212: + call void @finch_panic_index(ptr @.str.4762, i64 4307, i64 0, i64 %t1093) + unreachable +inrange7213: + %t1095 = extractvalue { ptr, i64, i64 } %t1092, 0 + %t1096 = getelementptr inbounds %S.ast.Node, ptr %t1095, i64 0 + %t1097 = load %S.ast.Node, ptr %t1096 + %t1098 = call %S.gen.Val @finch.gen.strArg(ptr %t1090, %S.ast.Node %t1097, { ptr, i64, i64 } { ptr @.str.4763, i64 12, i64 0 }) + store %S.gen.Val %t1098, ptr %a1082 + br label %endif7211 +endif7211: + %t1099 = load ptr, ptr %a1 + %t1100 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t1099) + store { ptr, i64, i64 } %t1100, ptr %a1101 + %t1102 = load ptr, ptr %a1 + %t1103 = load { ptr, i64, i64 }, ptr %a1101 + store { ptr, i64, i64 } { ptr @.str.4764, i64 27, i64 0 }, ptr %a1105 + store { ptr, i64, i64 } %t1103, ptr %a1106 + call void @finch_str_concat(ptr %a1104, ptr %a1105, ptr %a1106) + %t1107 = load { ptr, i64, i64 }, ptr %a1104 + store { ptr, i64, i64 } %t1107, ptr %a1109 + store { ptr, i64, i64 } { ptr @.str.4765, i64 6, i64 0 }, ptr %a1110 + call void @finch_str_concat(ptr %a1108, ptr %a1109, ptr %a1110) + %t1111 = load { ptr, i64, i64 }, ptr %a1108 + %t1112 = load ptr, ptr %a1 + %t1113 = load %S.gen.Val, ptr %a1082 + %t1114 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t1112, %S.gen.Val %t1113) + store { ptr, i64, i64 } %t1111, ptr %a1116 + store { ptr, i64, i64 } %t1114, ptr %a1117 + call void @finch_str_concat(ptr %a1115, ptr %a1116, ptr %a1117) + %t1118 = load { ptr, i64, i64 }, ptr %a1115 + store { ptr, i64, i64 } %t1118, ptr %a1120 + store { ptr, i64, i64 } { ptr @.str.4766, i64 1, i64 0 }, ptr %a1121 + call void @finch_str_concat(ptr %a1119, ptr %a1120, ptr %a1121) + %t1122 = load { ptr, i64, i64 }, ptr %a1119 + call void @finch.gen.emit(ptr %t1102, { ptr, i64, i64 } %t1122) + %t1123 = load ptr, ptr %a1 + %t1124 = load { ptr, i64, i64 }, ptr %a1101 + %t1125 = call { ptr, i64, i64 } @finch.gen.load(ptr %t1123, { ptr, i64, i64 } { ptr @.str.4767, i64 17, i64 0 }, { ptr, i64, i64 } %t1124) + %t1126 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t1125, 0 + %t1127 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4768, i64 3, i64 0 }) + %t1128 = insertvalue %S.gen.Val %t1126, %S.ast.Type %t1127, 1 + %t1129 = insertvalue %S.gen.Val %t1128, i1 true, 2 + ret %S.gen.Val %t1129 +endif7208: + %t1130 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t1130, ptr %a1131 + store { ptr, i64, i64 } { ptr @.str.4769, i64 3, i64 0 }, ptr %a1132 + %t1133 = call i32 @finch_str_eq(ptr %a1131, ptr %a1132) + %t1134 = icmp ne i32 %t1133, 0 + br i1 %t1134, label %then7214, label %endif7216 +then7214: + %t1135 = load ptr, ptr %a1 + %t1136 = load %S.ast.Node, ptr %a2 + %t1137 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t1135, %S.ast.Node %t1136, i64 0, i64 1, { ptr, i64, i64 } %t1137) + %t1138 = load ptr, ptr %a1 + %t1139 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1140 = load { ptr, i64, i64 }, ptr %t1139 + %t1141 = extractvalue { ptr, i64, i64 } %t1140, 1 + %t1142 = icmp uge i64 0, %t1141 + br i1 %t1142, label %range7217, label %inrange7218 +range7217: + call void @finch_panic_index(ptr @.str.4770, i64 4315, i64 0, i64 %t1141) + unreachable +inrange7218: + %t1143 = extractvalue { ptr, i64, i64 } %t1140, 0 + %t1144 = getelementptr inbounds %S.ast.Node, ptr %t1143, i64 0 + %t1145 = load %S.ast.Node, ptr %t1144 + %t1146 = call %S.gen.Val @finch.gen.expr(ptr %t1138, %S.ast.Node %t1145) + store %S.gen.Val %t1146, ptr %a1147 + %t1148 = load ptr, ptr %a1 + %t1149 = load ptr, ptr %a1 + %t1150 = getelementptr inbounds %S.gen.Val, ptr %a1147, i32 0, i32 1 + %t1151 = load %S.ast.Type, ptr %t1150 + %t1152 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t1149, %S.ast.Type %t1151) + store { ptr, i64, i64 } { ptr @.str.4771, i64 26, i64 0 }, ptr %a1154 + store { ptr, i64, i64 } %t1152, ptr %a1155 + call void @finch_str_concat(ptr %a1153, ptr %a1154, ptr %a1155) + %t1156 = load { ptr, i64, i64 }, ptr %a1153 + store { ptr, i64, i64 } %t1156, ptr %a1158 + store { ptr, i64, i64 } { ptr @.str.4772, i64 1, i64 0 }, ptr %a1159 + call void @finch_str_concat(ptr %a1157, ptr %a1158, ptr %a1159) + %t1160 = load { ptr, i64, i64 }, ptr %a1157 + %t1161 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1148, { ptr, i64, i64 } %t1160) + store { ptr, i64, i64 } %t1161, ptr %a1162 + %t1163 = load ptr, ptr %a1 + %t1164 = load ptr, ptr %a1 + %t1165 = getelementptr inbounds %S.gen.Val, ptr %a1147, i32 0, i32 1 + %t1166 = load %S.ast.Type, ptr %t1165 + %t1167 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t1164, %S.ast.Type %t1166) + %t1168 = load ptr, ptr %a1 + %t1169 = load %S.gen.Val, ptr %a1147 + %t1170 = call { ptr, i64, i64 } @finch.gen.own(ptr %t1168, %S.gen.Val %t1169) + %t1171 = load { ptr, i64, i64 }, ptr %a1162 + call void @finch.gen.store(ptr %t1163, { ptr, i64, i64 } %t1167, { ptr, i64, i64 } %t1170, { ptr, i64, i64 } %t1171) + %t1172 = load { ptr, i64, i64 }, ptr %a1162 + store { ptr, i64, i64 } %t1172, ptr %a1173 + call void @finch_str_copy(ptr %a1174, ptr %a1173) + %t1175 = load { ptr, i64, i64 }, ptr %a1174 + %t1176 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t1175, 0 + %t1177 = getelementptr inbounds %S.gen.Val, ptr %a1147, i32 0, i32 1 + %t1178 = load %S.ast.Type, ptr %t1177 + %t1179 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t1178) + %t1180 = insertvalue %S.gen.Val %t1176, %S.ast.Type %t1179, 1 + ret %S.gen.Val %t1180 +endif7216: + %t1181 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t1181, ptr %a1182 + store { ptr, i64, i64 } { ptr @.str.4773, i64 4, i64 0 }, ptr %a1183 + %t1184 = call i32 @finch_str_eq(ptr %a1182, ptr %a1183) + %t1185 = icmp ne i32 %t1184, 0 + br i1 %t1185, label %then7219, label %endif7221 +then7219: + %t1186 = load ptr, ptr %a1 + %t1187 = load %S.ast.Node, ptr %a2 + %t1188 = load { ptr, i64, i64 }, ptr %a8 + call void @finch.gen.checkArgs(ptr %t1186, %S.ast.Node %t1187, i64 0, i64 1, { ptr, i64, i64 } %t1188) + %t1189 = load ptr, ptr %a1 + %t1190 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1191 = load { ptr, i64, i64 }, ptr %t1190 + %t1192 = extractvalue { ptr, i64, i64 } %t1191, 1 + %t1193 = icmp uge i64 0, %t1192 + br i1 %t1193, label %range7222, label %inrange7223 +range7222: + call void @finch_panic_index(ptr @.str.4774, i64 4322, i64 0, i64 %t1192) + unreachable +inrange7223: + %t1194 = extractvalue { ptr, i64, i64 } %t1191, 0 + %t1195 = getelementptr inbounds %S.ast.Node, ptr %t1194, i64 0 + %t1196 = load %S.ast.Node, ptr %t1195 + %t1197 = call %S.gen.Val @finch.gen.expr(ptr %t1189, %S.ast.Node %t1196) + store %S.gen.Val %t1197, ptr %a1198 + %t1199 = getelementptr inbounds %S.gen.Val, ptr %a1198, i32 0, i32 1 + %t1200 = getelementptr inbounds %S.ast.Type, ptr %t1199, i32 0, i32 0 + %t1201 = load { ptr, i64, i64 }, ptr %t1200 + store { ptr, i64, i64 } %t1201, ptr %a1202 + store { ptr, i64, i64 } { ptr @.str.4775, i64 3, i64 0 }, ptr %a1203 + %t1204 = call i32 @finch_str_eq(ptr %a1202, ptr %a1203) + %t1205 = icmp eq i32 %t1204, 0 + br i1 %t1205, label %then7224, label %endif7226 +then7224: + %t1206 = load ptr, ptr %a1 + %t1207 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1208 = load { ptr, i64, i64 }, ptr %t1207 + %t1209 = extractvalue { ptr, i64, i64 } %t1208, 1 + %t1210 = icmp uge i64 0, %t1209 + br i1 %t1210, label %range7227, label %inrange7228 +range7227: + call void @finch_panic_index(ptr @.str.4776, i64 4324, i64 0, i64 %t1209) + unreachable +inrange7228: + %t1211 = extractvalue { ptr, i64, i64 } %t1208, 0 + %t1212 = getelementptr inbounds %S.ast.Node, ptr %t1211, i64 0 + %t1213 = load %S.ast.Node, ptr %t1212 + call void @finch.gen.fail(ptr %t1206, %S.ast.Node %t1213, { ptr, i64, i64 } { ptr @.str.4777, i64 119, i64 0 }) + br label %endif7226 +endif7226: + %t1214 = load ptr, ptr %a1 + %t1215 = getelementptr inbounds %S.gen.Val, ptr %a1198, i32 0, i32 0 + %t1216 = load { ptr, i64, i64 }, ptr %t1215 + store { ptr, i64, i64 } { ptr @.str.4778, i64 20, i64 0 }, ptr %a1218 + store { ptr, i64, i64 } %t1216, ptr %a1219 + call void @finch_str_concat(ptr %a1217, ptr %a1218, ptr %a1219) + %t1220 = load { ptr, i64, i64 }, ptr %a1217 + store { ptr, i64, i64 } %t1220, ptr %a1222 + store { ptr, i64, i64 } { ptr @.str.4779, i64 1, i64 0 }, ptr %a1223 + call void @finch_str_concat(ptr %a1221, ptr %a1222, ptr %a1223) + %t1224 = load { ptr, i64, i64 }, ptr %a1221 + call void @finch.gen.emit(ptr %t1214, { ptr, i64, i64 } %t1224) + %t1225 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.4780, i64 4, i64 0 }) + %t1226 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t1225, 1 + ret %S.gen.Val %t1226 +endif7221: + %t1227 = load ptr, ptr %a1 + %t1228 = load ptr, ptr %a1 + %t1229 = icmp eq ptr %t1228, null + br i1 %t1229, label %panic7229, label %ok7230 +panic7229: + call void @finch_panic(ptr @.str.4781, i64 4329, ptr @.str.4782) + unreachable +ok7230: + %t1230 = getelementptr inbounds %S.gen.Gen, ptr %t1228, i32 0, i32 13 + %t1231 = load { ptr, i64, i64 }, ptr %t1230 + %t1232 = load { ptr, i64, i64 }, ptr %a8 + %t1233 = call i64 @finch.gen.findFn(ptr %t1227, { ptr, i64, i64 } %t1231, { ptr, i64, i64 } %t1232) + store i64 %t1233, ptr %a1234 + %t1235 = load i64, ptr %a1234 + %t1236 = icmp sge i64 %t1235, 0 + br i1 %t1236, label %then7231, label %endif7233 +then7231: + %t1237 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t1238 = getelementptr inbounds %S.ast.Type, ptr %t1237, i32 0, i32 1 + %t1239 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1238, i32 0, i32 1 + %t1240 = load i64, ptr %t1239 + %t1241 = icmp sgt i64 %t1240, 0 + br i1 %t1241, label %then7234, label %endif7236 +then7234: + %t1242 = load ptr, ptr %a1 + %t1243 = load %S.ast.Node, ptr %a2 + %t1244 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.4783, i64 1, i64 0 }, ptr %a1246 + store { ptr, i64, i64 } %t1244, ptr %a1247 + call void @finch_str_concat(ptr %a1245, ptr %a1246, ptr %a1247) + %t1248 = load { ptr, i64, i64 }, ptr %a1245 + store { ptr, i64, i64 } %t1248, ptr %a1250 + store { ptr, i64, i64 } { ptr @.str.4784, i64 47, i64 0 }, ptr %a1251 + call void @finch_str_concat(ptr %a1249, ptr %a1250, ptr %a1251) + %t1252 = load { ptr, i64, i64 }, ptr %a1249 + call void @finch.gen.fail(ptr %t1242, %S.ast.Node %t1243, { ptr, i64, i64 } %t1252) + br label %endif7236 +endif7236: + %t1253 = load ptr, ptr %a1 + %t1254 = load i64, ptr %a1234 + %t1255 = load %S.ast.Node, ptr %a2 + %t1256 = load { ptr, i64, i64 }, ptr %a8 + %t1257 = call %S.gen.Val @finch.gen.callFn(ptr %t1253, i64 %t1254, %S.ast.Node %t1255, i64 0, { ptr, i64, i64 } %t1256, { ptr, i64, i64 } { ptr @.str.4785, i64 0, i64 0 }, { ptr, i64, i64 } { ptr @.str.4786, i64 0, i64 0 }) + ret %S.gen.Val %t1257 +endif7233: + %t1258 = load ptr, ptr %a1 + %t1259 = load ptr, ptr %a1 + %t1260 = icmp eq ptr %t1259, null + br i1 %t1260, label %panic7237, label %ok7238 +panic7237: + call void @finch_panic(ptr @.str.4787, i64 4336, ptr @.str.4788) + unreachable +ok7238: + %t1261 = getelementptr inbounds %S.gen.Gen, ptr %t1259, i32 0, i32 13 + %t1262 = load { ptr, i64, i64 }, ptr %t1261 + %t1263 = load { ptr, i64, i64 }, ptr %a8 + %t1264 = call i64 @finch.gen.findTemplate(ptr %t1258, { ptr, i64, i64 } %t1262, { ptr, i64, i64 } %t1263, { ptr, i64, i64 } { ptr @.str.4789, i64 0, i64 0 }, i1 false) + store i64 %t1264, ptr %a1265 + %t1266 = load i64, ptr %a1265 + %t1267 = icmp sge i64 %t1266, 0 + br i1 %t1267, label %then7239, label %endif7241 +then7239: + %t1268 = load ptr, ptr %a1 + %t1269 = load %S.ast.Node, ptr %a2 + %t1270 = load i64, ptr %a1265 + %t1271 = load { ptr, i64, i64 }, ptr %a8 + %t1272 = call %S.gen.Val @finch.gen.genericCall(ptr %t1268, %S.ast.Node %t1269, i64 %t1270, i64 0, { ptr, i64, i64 } %t1271) + ret %S.gen.Val %t1272 +endif7241: + %t1273 = load ptr, ptr %a1 + %t1274 = load ptr, ptr %a1 + %t1275 = icmp eq ptr %t1274, null + br i1 %t1275, label %panic7242, label %ok7243 +panic7242: + call void @finch_panic(ptr @.str.4790, i64 4340, ptr @.str.4791) + unreachable +ok7243: + %t1276 = getelementptr inbounds %S.gen.Gen, ptr %t1274, i32 0, i32 13 + %t1277 = load { ptr, i64, i64 }, ptr %t1276 + %t1278 = load { ptr, i64, i64 }, ptr %a8 + %t1279 = call i64 @finch.gen.findTemplate(ptr %t1273, { ptr, i64, i64 } %t1277, { ptr, i64, i64 } %t1278, { ptr, i64, i64 } { ptr @.str.4792, i64 0, i64 0 }, i1 true) + %t1280 = icmp sge i64 %t1279, 0 + br i1 %t1280, label %then7244, label %endif7246 +then7244: + %t1281 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t1282 = getelementptr inbounds %S.ast.Type, ptr %t1281, i32 0, i32 1 + %t1283 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1282, i32 0, i32 1 + %t1284 = load i64, ptr %t1283 + %t1285 = icmp eq i64 %t1284, 0 + br i1 %t1285, label %then7247, label %endif7249 +then7247: + %t1286 = load ptr, ptr %a1 + %t1287 = load %S.ast.Node, ptr %a2 + %t1288 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.4793, i64 1, i64 0 }, ptr %a1290 + store { ptr, i64, i64 } %t1288, ptr %a1291 + call void @finch_str_concat(ptr %a1289, ptr %a1290, ptr %a1291) + %t1292 = load { ptr, i64, i64 }, ptr %a1289 + store { ptr, i64, i64 } %t1292, ptr %a1294 + store { ptr, i64, i64 } { ptr @.str.4794, i64 42, i64 0 }, ptr %a1295 + call void @finch_str_concat(ptr %a1293, ptr %a1294, ptr %a1295) + %t1296 = load { ptr, i64, i64 }, ptr %a1293 + %t1297 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t1296, ptr %a1299 + store { ptr, i64, i64 } %t1297, ptr %a1300 + call void @finch_str_concat(ptr %a1298, ptr %a1299, ptr %a1300) + %t1301 = load { ptr, i64, i64 }, ptr %a1298 + store { ptr, i64, i64 } %t1301, ptr %a1303 + store { ptr, i64, i64 } { ptr @.str.4795, i64 10, i64 0 }, ptr %a1304 + call void @finch_str_concat(ptr %a1302, ptr %a1303, ptr %a1304) + %t1305 = load { ptr, i64, i64 }, ptr %a1302 + call void @finch.gen.fail(ptr %t1286, %S.ast.Node %t1287, { ptr, i64, i64 } %t1305) + br label %endif7249 +endif7249: + store { ptr, i64, i64 } zeroinitializer, ptr %a1306 + %t1307 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 5 + %t1308 = getelementptr inbounds %S.ast.Type, ptr %t1307, i32 0, i32 1 + store i64 0, ptr %a1309 + br label %each.cond7250 +each.cond7250: + %t1310 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1308, i32 0, i32 1 + %t1311 = load i64, ptr %t1310 + %t1312 = load i64, ptr %a1309 + %t1313 = icmp slt i64 %t1312, %t1311 + br i1 %t1313, label %each.body7251, label %each.end7253 +each.body7251: + %t1314 = load ptr, ptr %t1308 + %t1315 = getelementptr inbounds %S.ast.Type, ptr %t1314, i64 %t1312 + %t1316 = load %S.ast.Type, ptr %t1315 + store %S.ast.Type %t1316, ptr %a1317 + %t1318 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1306, i32 0, i32 1 + %t1319 = load ptr, ptr %a1 + %t1320 = load %S.ast.Type, ptr %a1317 + %t1321 = load %S.ast.Node, ptr %a2 + %t1322 = call %S.ast.Type @finch.gen.resolve(ptr %t1319, %S.ast.Type %t1320, %S.ast.Node %t1321) + %t1323 = load i64, ptr %t1318 + %t1324 = add i64 %t1323, 1 + call void @finch_arr_reserve(ptr %a1306, i64 %t1324, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t1325 = load ptr, ptr %a1306 + %t1326 = getelementptr inbounds %S.ast.Type, ptr %t1325, i64 %t1323 + store %S.ast.Type %t1322, ptr %t1326 + store i64 %t1324, ptr %t1318 + br label %each.step7252 +each.step7252: + %t1327 = load i64, ptr %a1309 + %t1328 = add i64 %t1327, 1 + store i64 %t1328, ptr %a1309 + br label %each.cond7250 +each.end7253: + %t1329 = load ptr, ptr %a1 + %t1330 = load ptr, ptr %a1 + %t1331 = icmp eq ptr %t1330, null + br i1 %t1331, label %panic7254, label %ok7255 +panic7254: + call void @finch_panic(ptr @.str.4796, i64 4349, ptr @.str.4797) + unreachable +ok7255: + %t1332 = getelementptr inbounds %S.gen.Gen, ptr %t1330, i32 0, i32 13 + %t1333 = load { ptr, i64, i64 }, ptr %t1332 + %t1334 = load { ptr, i64, i64 }, ptr %a8 + %t1335 = load { ptr, i64, i64 }, ptr %a1306 + %t1336 = load %S.ast.Node, ptr %a2 + %t1337 = call %S.ast.Type @finch.gen.instStruct(ptr %t1329, { ptr, i64, i64 } %t1333, { ptr, i64, i64 } %t1334, { ptr, i64, i64 } %t1335, %S.ast.Node %t1336) + store %S.ast.Type %t1337, ptr %a1338 + %t1339 = load ptr, ptr %a1 + %t1340 = load ptr, ptr %a1 + %t1341 = getelementptr inbounds %S.ast.Type, ptr %a1338, i32 0, i32 3 + %t1342 = load { ptr, i64, i64 }, ptr %t1341 + %t1343 = getelementptr inbounds %S.ast.Type, ptr %a1338, i32 0, i32 2 + %t1344 = load { ptr, i64, i64 }, ptr %t1343 + %t1345 = call i64 @finch.gen.findStruct(ptr %t1340, { ptr, i64, i64 } %t1342, { ptr, i64, i64 } %t1344) + %t1346 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1347 = load { ptr, i64, i64 }, ptr %t1346 + %t1348 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 10 + %t1349 = load { ptr, i64, i64 }, ptr %t1348 + %t1350 = load %S.ast.Node, ptr %a2 + %t1351 = call %S.gen.Val @finch.gen.construct(ptr %t1339, i64 %t1345, { ptr, i64, i64 } %t1347, { ptr, i64, i64 } %t1349, %S.ast.Node %t1350) + ret %S.gen.Val %t1351 +endif7246: + %t1352 = load ptr, ptr %a1 + %t1353 = load ptr, ptr %a1 + %t1354 = icmp eq ptr %t1353, null + br i1 %t1354, label %panic7256, label %ok7257 +panic7256: + call void @finch_panic(ptr @.str.4798, i64 4352, ptr @.str.4799) + unreachable +ok7257: + %t1355 = getelementptr inbounds %S.gen.Gen, ptr %t1353, i32 0, i32 13 + %t1356 = load { ptr, i64, i64 }, ptr %t1355 + %t1357 = load { ptr, i64, i64 }, ptr %a8 + %t1358 = call i64 @finch.gen.findStruct(ptr %t1352, { ptr, i64, i64 } %t1356, { ptr, i64, i64 } %t1357) + store i64 %t1358, ptr %a1359 + %t1360 = load i64, ptr %a1359 + %t1361 = icmp sge i64 %t1360, 0 + br i1 %t1361, label %then7258, label %endif7260 +then7258: + %t1362 = load ptr, ptr %a1 + %t1363 = load i64, ptr %a1359 + %t1364 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1365 = load { ptr, i64, i64 }, ptr %t1364 + %t1366 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 10 + %t1367 = load { ptr, i64, i64 }, ptr %t1366 + %t1368 = load %S.ast.Node, ptr %a2 + %t1369 = call %S.gen.Val @finch.gen.construct(ptr %t1362, i64 %t1363, { ptr, i64, i64 } %t1365, { ptr, i64, i64 } %t1367, %S.ast.Node %t1368) + ret %S.gen.Val %t1369 +endif7260: + %t1370 = load ptr, ptr %a1 + %t1371 = load ptr, ptr %a1 + %t1372 = icmp eq ptr %t1371, null + br i1 %t1372, label %panic7261, label %ok7262 +panic7261: + call void @finch_panic(ptr @.str.4800, i64 4356, ptr @.str.4801) + unreachable +ok7262: + %t1373 = getelementptr inbounds %S.gen.Gen, ptr %t1371, i32 0, i32 13 + %t1374 = load { ptr, i64, i64 }, ptr %t1373 + %t1375 = load { ptr, i64, i64 }, ptr %a8 + %t1376 = call i64 @finch.gen.findEnum(ptr %t1370, { ptr, i64, i64 } %t1374, { ptr, i64, i64 } %t1375) + store i64 %t1376, ptr %a1377 + %t1378 = load i64, ptr %a1377 + %t1379 = icmp sge i64 %t1378, 0 + br i1 %t1379, label %then7263, label %endif7265 +then7263: + %t1380 = load ptr, ptr %a1 + %t1381 = load %S.ast.Node, ptr %a2 + %t1382 = load i64, ptr %a1377 + %t1383 = call %S.gen.Val @finch.gen.enumFrom(ptr %t1380, %S.ast.Node %t1381, i64 %t1382) + ret %S.gen.Val %t1383 +endif7265: + %t1384 = load ptr, ptr %a1 + %t1385 = icmp eq ptr %t1384, null + br i1 %t1385, label %panic7266, label %ok7267 +panic7266: + call void @finch_panic(ptr @.str.4802, i64 4360, ptr @.str.4803) + unreachable +ok7267: + %t1386 = getelementptr inbounds %S.gen.Gen, ptr %t1384, i32 0, i32 24 + %t1387 = getelementptr inbounds %S.cimport.CImports, ptr %t1386, i32 0, i32 0 + %t1388 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t1388, ptr %a1389 + %t1390 = call i64 @finch_map_find(ptr %t1387, ptr %a1389, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t1391 = icmp sge i64 %t1390, 0 + br i1 %t1391, label %then7268, label %endif7270 +then7268: + %t1392 = load ptr, ptr %a1 + %t1393 = load %S.ast.Node, ptr %a2 + %t1394 = load ptr, ptr %a1 + %t1395 = icmp eq ptr %t1394, null + br i1 %t1395, label %panic7271, label %ok7272 +panic7271: + call void @finch_panic(ptr @.str.4804, i64 4361, ptr @.str.4805) + unreachable +ok7272: + %t1396 = getelementptr inbounds %S.gen.Gen, ptr %t1394, i32 0, i32 24 + %t1397 = getelementptr inbounds %S.cimport.CImports, ptr %t1396, i32 0, i32 0 + %t1398 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t1398, ptr %a1399 + %t1400 = call i64 @finch_map_find(ptr %t1397, ptr %a1399, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t1401 = icmp slt i64 %t1400, 0 + br i1 %t1401, label %map.missing7273, label %map.found7274 +map.missing7273: + store { ptr, i64, i64 } zeroinitializer, ptr %a1402 + store { ptr, i64, i64 } %t1398, ptr %a1403 + call void @finch_buf_str(ptr %a1402, ptr %a1403, i32 1) + call void @finch_map_missing(ptr @.str.4806, i64 4361, ptr %a1402) + unreachable +map.found7274: + %t1404 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t1397, i32 0, i32 0 + %t1405 = load ptr, ptr %t1404 + %t1406 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t1405, i64 %t1400 + %t1407 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t1406, i32 0, i32 2 + %t1408 = load %S.cimport.CFunc, ptr %t1407 + %t1409 = call %S.gen.Val @finch.gen.callC(ptr %t1392, %S.ast.Node %t1393, %S.cimport.CFunc %t1408) + ret %S.gen.Val %t1409 +endif7270: + %t1410 = load ptr, ptr %a1 + %t1411 = load { ptr, i64, i64 }, ptr %a8 + %t1412 = call i64 @finch.gen.findStruct(ptr %t1410, { ptr, i64, i64 } { ptr @.str.4807, i64 1, i64 0 }, { ptr, i64, i64 } %t1411) + store i64 %t1412, ptr %a1359 + %t1413 = load i64, ptr %a1359 + %t1414 = icmp sge i64 %t1413, 0 + br i1 %t1414, label %then7275, label %endif7277 +then7275: + %t1415 = load ptr, ptr %a1 + %t1416 = load i64, ptr %a1359 + %t1417 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1418 = load { ptr, i64, i64 }, ptr %t1417 + %t1419 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 10 + %t1420 = load { ptr, i64, i64 }, ptr %t1419 + %t1421 = load %S.ast.Node, ptr %a2 + %t1422 = call %S.gen.Val @finch.gen.construct(ptr %t1415, i64 %t1416, { ptr, i64, i64 } %t1418, { ptr, i64, i64 } %t1420, %S.ast.Node %t1421) + ret %S.gen.Val %t1422 +endif7277: + %t1423 = load ptr, ptr %a1 + %t1424 = load { ptr, i64, i64 }, ptr %a8 + %t1425 = call i64 @finch.gen.lookup(ptr %t1423, { ptr, i64, i64 } %t1424) + %t1426 = icmp sge i64 %t1425, 0 + br i1 %t1426, label %then7278, label %endif7280 +then7278: + %t1427 = load ptr, ptr %a1 + %t1428 = load %S.ast.Node, ptr %a2 + %t1429 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.4808, i64 1, i64 0 }, ptr %a1431 + store { ptr, i64, i64 } %t1429, ptr %a1432 + call void @finch_str_concat(ptr %a1430, ptr %a1431, ptr %a1432) + %t1433 = load { ptr, i64, i64 }, ptr %a1430 + store { ptr, i64, i64 } %t1433, ptr %a1435 + store { ptr, i64, i64 } { ptr @.str.4809, i64 31, i64 0 }, ptr %a1436 + call void @finch_str_concat(ptr %a1434, ptr %a1435, ptr %a1436) + %t1437 = load { ptr, i64, i64 }, ptr %a1434 + call void @finch.gen.fail(ptr %t1427, %S.ast.Node %t1428, { ptr, i64, i64 } %t1437) + br label %endif7280 +endif7280: + %t1438 = load ptr, ptr %a1 + %t1439 = load %S.ast.Node, ptr %a2 + %t1440 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.4810, i64 28, i64 0 }, ptr %a1442 + store { ptr, i64, i64 } %t1440, ptr %a1443 + call void @finch_str_concat(ptr %a1441, ptr %a1442, ptr %a1443) + %t1444 = load { ptr, i64, i64 }, ptr %a1441 + store { ptr, i64, i64 } %t1444, ptr %a1446 + store { ptr, i64, i64 } { ptr @.str.4811, i64 1, i64 0 }, ptr %a1447 + call void @finch_str_concat(ptr %a1445, ptr %a1446, ptr %a1447) + %t1448 = load { ptr, i64, i64 }, ptr %a1445 + %t1449 = load { ptr, i64, i64 }, ptr %a8 + %t1450 = call { ptr, i64, i64 } @finch.gen.headerHint({ ptr, i64, i64 } %t1449) + store { ptr, i64, i64 } %t1448, ptr %a1452 + store { ptr, i64, i64 } %t1450, ptr %a1453 + call void @finch_str_concat(ptr %a1451, ptr %a1452, ptr %a1453) + %t1454 = load { ptr, i64, i64 }, ptr %a1451 + call void @finch.gen.fail(ptr %t1438, %S.ast.Node %t1439, { ptr, i64, i64 } %t1454) + ret %S.gen.Val zeroinitializer +} + +define internal %S.gen.Val @finch.gen.callFn(ptr %p0, i64 %p1, %S.ast.Node %p2, i64 %p3, { ptr, i64, i64 } %p4, { ptr, i64, i64 } %p5, { ptr, i64, i64 } %p6) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a3 = alloca %S.ast.Node, align 16 + %a4 = alloca i64, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca %S.gen.FnSig, align 16 + %a19 = alloca %S.gen.FnSig, align 16 + %a21 = alloca %S.gen.FnSig, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca i64, align 16 + %a73 = alloca %S.ast.Node, align 16 + %a74 = alloca %S.ast.Node, align 16 + %a76 = alloca %S.ast.Node, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca %S.gen.Val, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca %S.ast.Type, align 16 + %a152 = alloca %S.ast.Type, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + store %S.ast.Node %p2, ptr %a3 + store i64 %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + store { ptr, i64, i64 } %p5, ptr %a6 + store { ptr, i64, i64 } %p6, ptr %a7 + %t8 = load ptr, ptr %a1 + %t9 = icmp eq ptr %t8, null + br i1 %t9, label %panic7281, label %ok7282 +panic7281: + call void @finch_panic(ptr @.str.4812, i64 4375, ptr @.str.4813) + unreachable +ok7282: + %t10 = getelementptr inbounds %S.gen.Gen, ptr %t8, i32 0, i32 14 + %t11 = load i64, ptr %a2 + %t12 = load { ptr, i64, i64 }, ptr %t10 + %t13 = extractvalue { ptr, i64, i64 } %t12, 1 + %t14 = icmp uge i64 %t11, %t13 + br i1 %t14, label %range7283, label %inrange7284 +range7283: + call void @finch_panic_index(ptr @.str.4814, i64 4375, i64 %t11, i64 %t13) + unreachable +inrange7284: + %t15 = extractvalue { ptr, i64, i64 } %t12, 0 + %t16 = getelementptr inbounds %S.gen.FnSig, ptr %t15, i64 %t11 + %t17 = load %S.gen.FnSig, ptr %t16 + store %S.gen.FnSig %t17, ptr %a18 + call void @finch.copy.S_gen_FnSig(ptr %a19, ptr %a18) + %t20 = load %S.gen.FnSig, ptr %a19 + store %S.gen.FnSig %t20, ptr %a21 + %t22 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 0 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load i64, ptr %t23 + %t25 = icmp eq i64 %t24, 0 + br label %logic.from7285 +logic.from7285: + br i1 %t25, label %logic.rhs7286, label %logic.end7287 +logic.rhs7286: + %t26 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 1 + %t27 = load { ptr, i64, i64 }, ptr %t26 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.4815, i64 4, i64 0 }, ptr %a29 + %t30 = call i32 @finch_str_eq(ptr %a28, ptr %a29) + %t31 = icmp ne i32 %t30, 0 + br label %logic.rend7288 +logic.rend7288: + br label %logic.end7287 +logic.end7287: + %t32 = phi i1 [ false, %logic.from7285 ], [ %t31, %logic.rend7288 ] + br i1 %t32, label %then7289, label %endif7291 +then7289: + %t33 = load ptr, ptr %a1 + %t34 = load %S.ast.Node, ptr %a3 + call void @finch.gen.fail(ptr %t33, %S.ast.Node %t34, { ptr, i64, i64 } { ptr @.str.4816, i64 52, i64 0 }) + br label %endif7291 +endif7291: + %t35 = load ptr, ptr %a1 + %t36 = load %S.ast.Node, ptr %a3 + %t37 = load i64, ptr %a4 + %t38 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 13 + %t39 = getelementptr inbounds { ptr, i64, i64 }, ptr %t38, i32 0, i32 1 + %t40 = load i64, ptr %t39 + %t41 = load { ptr, i64, i64 }, ptr %a5 + call void @finch.gen.checkArgs(ptr %t35, %S.ast.Node %t36, i64 %t37, i64 %t40, { ptr, i64, i64 } %t41) + store { ptr, i64, i64 } zeroinitializer, ptr %a42 + %t43 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 2 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i32 0, i32 1 + %t45 = load i64, ptr %t44 + %t46 = icmp sgt i64 %t45, 0 + br i1 %t46, label %then7292, label %endif7294 +then7292: + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %a42, i32 0, i32 1 + %t48 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.4817, i64 4, i64 0 }, ptr %a50 + store { ptr, i64, i64 } %t48, ptr %a51 + call void @finch_str_concat(ptr %a49, ptr %a50, ptr %a51) + %t52 = load { ptr, i64, i64 }, ptr %a49 + %t53 = load i64, ptr %t47 + %t54 = add i64 %t53, 1 + call void @finch_arr_reserve(ptr %a42, i64 %t54, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t55 = load ptr, ptr %a42 + %t56 = getelementptr inbounds { ptr, i64, i64 }, ptr %t55, i64 %t53 + store { ptr, i64, i64 } %t52, ptr %t56 + store i64 %t54, ptr %t47 + br label %endif7294 +endif7294: + %t57 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 13 + %t58 = getelementptr inbounds { ptr, i64, i64 }, ptr %t57, i32 0, i32 1 + %t59 = load i64, ptr %t58 + store i64 0, ptr %a60 + br label %for.cond7295 +for.cond7295: + %t61 = load i64, ptr %a60 + %t62 = icmp slt i64 %t61, %t59 + br i1 %t62, label %for.body7296, label %for.end7298 +for.body7296: + %t63 = getelementptr inbounds %S.ast.Node, ptr %a3, i32 0, i32 9 + %t64 = load i64, ptr %a4 + %t65 = load i64, ptr %a60 + %t66 = add i64 %t64, %t65 + %t67 = load { ptr, i64, i64 }, ptr %t63 + %t68 = extractvalue { ptr, i64, i64 } %t67, 1 + %t69 = icmp uge i64 %t66, %t68 + br i1 %t69, label %range7299, label %inrange7300 +range7299: + call void @finch_panic_index(ptr @.str.4818, i64 4385, i64 %t66, i64 %t68) + unreachable +inrange7300: + %t70 = extractvalue { ptr, i64, i64 } %t67, 0 + %t71 = getelementptr inbounds %S.ast.Node, ptr %t70, i64 %t66 + %t72 = load %S.ast.Node, ptr %t71 + store %S.ast.Node %t72, ptr %a73 + call void @finch.copy.S_ast_Node(ptr %a74, ptr %a73) + %t75 = load %S.ast.Node, ptr %a74 + store %S.ast.Node %t75, ptr %a76 + %t77 = load ptr, ptr %a1 + %t78 = load ptr, ptr %a1 + %t79 = load %S.ast.Node, ptr %a76 + %t80 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 13 + %t81 = load i64, ptr %a60 + %t82 = load { ptr, i64, i64 }, ptr %t80 + %t83 = extractvalue { ptr, i64, i64 } %t82, 1 + %t84 = icmp uge i64 %t81, %t83 + br i1 %t84, label %range7301, label %inrange7302 +range7301: + call void @finch_panic_index(ptr @.str.4819, i64 4386, i64 %t81, i64 %t83) + unreachable +inrange7302: + %t85 = extractvalue { ptr, i64, i64 } %t82, 0 + %t86 = getelementptr inbounds %S.ast.Type, ptr %t85, i64 %t81 + %t87 = load %S.ast.Type, ptr %t86 + %t88 = call %S.gen.Val @finch.gen.exprWant(ptr %t78, %S.ast.Node %t79, %S.ast.Type %t87) + %t89 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 13 + %t90 = load i64, ptr %a60 + %t91 = load { ptr, i64, i64 }, ptr %t89 + %t92 = extractvalue { ptr, i64, i64 } %t91, 1 + %t93 = icmp uge i64 %t90, %t92 + br i1 %t93, label %range7303, label %inrange7304 +range7303: + call void @finch_panic_index(ptr @.str.4820, i64 4386, i64 %t90, i64 %t92) + unreachable +inrange7304: + %t94 = extractvalue { ptr, i64, i64 } %t91, 0 + %t95 = getelementptr inbounds %S.ast.Type, ptr %t94, i64 %t90 + %t96 = load %S.ast.Type, ptr %t95 + %t97 = load %S.ast.Node, ptr %a76 + %t98 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 14 + %t99 = load i64, ptr %a60 + %t100 = load { ptr, i64, i64 }, ptr %t98 + %t101 = extractvalue { ptr, i64, i64 } %t100, 1 + %t102 = icmp uge i64 %t99, %t101 + br i1 %t102, label %range7305, label %inrange7306 +range7305: + call void @finch_panic_index(ptr @.str.4822, i64 4386, i64 %t99, i64 %t101) + unreachable +inrange7306: + %t103 = extractvalue { ptr, i64, i64 } %t100, 0 + %t104 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 %t99 + %t105 = load { ptr, i64, i64 }, ptr %t104 + store { ptr, i64, i64 } { ptr @.str.4821, i64 10, i64 0 }, ptr %a107 + store { ptr, i64, i64 } %t105, ptr %a108 + call void @finch_str_concat(ptr %a106, ptr %a107, ptr %a108) + %t109 = load { ptr, i64, i64 }, ptr %a106 + store { ptr, i64, i64 } %t109, ptr %a111 + store { ptr, i64, i64 } { ptr @.str.4823, i64 1, i64 0 }, ptr %a112 + call void @finch_str_concat(ptr %a110, ptr %a111, ptr %a112) + %t113 = load { ptr, i64, i64 }, ptr %a110 + %t114 = call %S.gen.Val @finch.gen.coerce(ptr %t77, %S.gen.Val %t88, %S.ast.Type %t96, %S.ast.Node %t97, { ptr, i64, i64 } %t113) + store %S.gen.Val %t114, ptr %a115 + %t116 = load ptr, ptr %a1 + %t117 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 13 + %t118 = load i64, ptr %a60 + %t119 = load { ptr, i64, i64 }, ptr %t117 + %t120 = extractvalue { ptr, i64, i64 } %t119, 1 + %t121 = icmp uge i64 %t118, %t120 + br i1 %t121, label %range7307, label %inrange7308 +range7307: + call void @finch_panic_index(ptr @.str.4824, i64 4388, i64 %t118, i64 %t120) + unreachable +inrange7308: + %t122 = extractvalue { ptr, i64, i64 } %t119, 0 + %t123 = getelementptr inbounds %S.ast.Type, ptr %t122, i64 %t118 + %t124 = load %S.ast.Type, ptr %t123 + %t125 = call i1 @finch.gen.owning(ptr %t116, %S.ast.Type %t124) + br label %logic.from7309 +logic.from7309: + br i1 %t125, label %logic.rhs7310, label %logic.end7311 +logic.rhs7310: + %t126 = getelementptr inbounds %S.gen.Val, ptr %a115, i32 0, i32 2 + %t127 = load i1, ptr %t126 + %t128 = xor i1 %t127, true + br label %logic.rend7312 +logic.rend7312: + br label %logic.end7311 +logic.end7311: + %t129 = phi i1 [ false, %logic.from7309 ], [ %t128, %logic.rend7312 ] + br label %logic.from7313 +logic.from7313: + br i1 %t129, label %logic.rhs7314, label %logic.end7315 +logic.rhs7314: + %t130 = getelementptr inbounds { ptr, i64, i64 }, ptr %a7, i32 0, i32 1 + %t131 = load i64, ptr %t130 + %t132 = icmp sgt i64 %t131, 0 + br label %logic.rend7316 +logic.rend7316: + br label %logic.end7315 +logic.end7315: + %t133 = phi i1 [ false, %logic.from7313 ], [ %t132, %logic.rend7316 ] + br label %logic.from7317 +logic.from7317: + br i1 %t133, label %logic.rhs7318, label %logic.end7319 +logic.rhs7318: + %t134 = load %S.ast.Node, ptr %a76 + %t135 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t134) + %t136 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t135, ptr %a137 + store { ptr, i64, i64 } %t136, ptr %a138 + %t139 = call i32 @finch_str_eq(ptr %a137, ptr %a138) + %t140 = icmp ne i32 %t139, 0 + br label %logic.rend7320 +logic.rend7320: + br label %logic.end7319 +logic.end7319: + %t141 = phi i1 [ false, %logic.from7317 ], [ %t140, %logic.rend7320 ] + br i1 %t141, label %then7321, label %endif7323 +then7321: + %t142 = load ptr, ptr %a1 + %t143 = getelementptr inbounds %S.gen.Val, ptr %a115, i32 0, i32 0 + %t144 = load { ptr, i64, i64 }, ptr %t143 + %t145 = getelementptr inbounds %S.gen.Val, ptr %a115, i32 0, i32 1 + %t146 = load %S.ast.Type, ptr %t145 + %t147 = call { ptr, i64, i64 } @finch.gen.copyValue(ptr %t142, { ptr, i64, i64 } %t144, %S.ast.Type %t146) + %t148 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t147, 0 + %t149 = getelementptr inbounds %S.gen.Val, ptr %a115, i32 0, i32 1 + %t150 = load %S.ast.Type, ptr %t149 + store %S.ast.Type %t150, ptr %a151 + call void @finch.copy.S_ast_Type(ptr %a152, ptr %a151) + %t153 = load %S.ast.Type, ptr %a152 + %t154 = insertvalue %S.gen.Val %t148, %S.ast.Type %t153, 1 + %t155 = insertvalue %S.gen.Val %t154, i1 true, 2 + store %S.gen.Val %t155, ptr %a115 + br label %endif7323 +endif7323: + %t156 = getelementptr inbounds { ptr, i64, i64 }, ptr %a42, i32 0, i32 1 + %t157 = load ptr, ptr %a1 + %t158 = getelementptr inbounds %S.gen.FnSig, ptr %a21, i32 0, i32 13 + %t159 = load i64, ptr %a60 + %t160 = load { ptr, i64, i64 }, ptr %t158 + %t161 = extractvalue { ptr, i64, i64 } %t160, 1 + %t162 = icmp uge i64 %t159, %t161 + br i1 %t162, label %range7324, label %inrange7325 +range7324: + call void @finch_panic_index(ptr @.str.4825, i64 4391, i64 %t159, i64 %t161) + unreachable +inrange7325: + %t163 = extractvalue { ptr, i64, i64 } %t160, 0 + %t164 = getelementptr inbounds %S.ast.Type, ptr %t163, i64 %t159 + %t165 = load %S.ast.Type, ptr %t164 + %t166 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t157, %S.ast.Type %t165) + store { ptr, i64, i64 } %t166, ptr %a168 + store { ptr, i64, i64 } { ptr @.str.4826, i64 1, i64 0 }, ptr %a169 + call void @finch_str_concat(ptr %a167, ptr %a168, ptr %a169) + %t170 = load { ptr, i64, i64 }, ptr %a167 + %t171 = getelementptr inbounds %S.gen.Val, ptr %a115, i32 0, i32 0 + %t172 = load { ptr, i64, i64 }, ptr %t171 + store { ptr, i64, i64 } %t170, ptr %a174 + store { ptr, i64, i64 } %t172, ptr %a175 + call void @finch_str_concat(ptr %a173, ptr %a174, ptr %a175) + %t176 = load { ptr, i64, i64 }, ptr %a173 + %t177 = load i64, ptr %t156 + %t178 = add i64 %t177, 1 + call void @finch_arr_reserve(ptr %a42, i64 %t178, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t179 = load ptr, ptr %a42 + %t180 = getelementptr inbounds { ptr, i64, i64 }, ptr %t179, i64 %t177 + store { ptr, i64, i64 } %t176, ptr %t180 + store i64 %t178, ptr %t156 + br label %for.step7297 +for.step7297: + %t181 = load i64, ptr %a60 + %t182 = add i64 %t181, 1 + store i64 %t182, ptr %a60 + br label %for.cond7295 +for.end7298: + %t183 = load ptr, ptr %a1 + %t184 = load %S.gen.FnSig, ptr %a21 + %t185 = load %S.ast.Node, ptr %a3 + %t186 = load { ptr, i64, i64 }, ptr %a42 + %t187 = load { ptr, i64, i64 }, ptr %a5 + %t188 = call %S.gen.Val @finch.gen.emitCall(ptr %t183, %S.gen.FnSig %t184, %S.ast.Node %t185, { ptr, i64, i64 } %t186, { ptr, i64, i64 } %t187) + ret %S.gen.Val %t188 +} + +define internal %S.gen.Val @finch.gen.emitCall(ptr %p0, %S.gen.FnSig %p1, %S.ast.Node %p2, { ptr, i64, i64 } %p3, { ptr, i64, i64 } %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.gen.FnSig, align 16 + %a3 = alloca %S.ast.Node, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca %S.ast.Type, align 16 + %a169 = alloca %S.ast.Type, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca %S.ast.Type, align 16 + %a198 = alloca %S.ast.Type, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca %S.ast.Type, align 16 + %a218 = alloca %S.ast.Type, align 16 + %a227 = alloca %S.ast.Type, align 16 + %a228 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store %S.gen.FnSig %p1, ptr %a2 + store %S.ast.Node %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + %t6 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 9 + %t7 = load i1, ptr %t6 + br label %logic.from7326 +logic.from7326: + br i1 %t7, label %logic.rhs7327, label %logic.end7328 +logic.rhs7327: + %t8 = load ptr, ptr %a1 + %t9 = icmp eq ptr %t8, null + br i1 %t9, label %panic7329, label %ok7330 +panic7329: + call void @finch_panic(ptr @.str.4827, i64 4398, ptr @.str.4828) + unreachable +ok7330: + %t10 = getelementptr inbounds %S.gen.Gen, ptr %t8, i32 0, i32 37 + %t11 = load { ptr, i64, i64 }, ptr %t10 + %t12 = load %S.ast.Node, ptr %a3 + %t13 = call { ptr, i64, i64 } @finch.gen.nodeKey(%S.ast.Node %t12) + store { ptr, i64, i64 } %t11, ptr %a14 + store { ptr, i64, i64 } %t13, ptr %a15 + %t16 = call i32 @finch_str_eq(ptr %a14, ptr %a15) + %t17 = icmp eq i32 %t16, 0 + br label %logic.rend7331 +logic.rend7331: + br label %logic.end7328 +logic.end7328: + %t18 = phi i1 [ false, %logic.from7326 ], [ %t17, %logic.rend7331 ] + br i1 %t18, label %then7332, label %endif7334 +then7332: + %t19 = load ptr, ptr %a1 + %t20 = load %S.ast.Node, ptr %a3 + %t21 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.4829, i64 1, i64 0 }, ptr %a23 + store { ptr, i64, i64 } %t21, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.4830, i64 39, i64 0 }, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + %t30 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t29, ptr %a32 + store { ptr, i64, i64 } %t30, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t34, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.4831, i64 19, i64 0 }, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + %t39 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t38, ptr %a41 + store { ptr, i64, i64 } %t39, ptr %a42 + call void @finch_str_concat(ptr %a40, ptr %a41, ptr %a42) + %t43 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t43, ptr %a45 + store { ptr, i64, i64 } { ptr @.str.4832, i64 27, i64 0 }, ptr %a46 + call void @finch_str_concat(ptr %a44, ptr %a45, ptr %a46) + %t47 = load { ptr, i64, i64 }, ptr %a44 + %t48 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t47, ptr %a50 + store { ptr, i64, i64 } %t48, ptr %a51 + call void @finch_str_concat(ptr %a49, ptr %a50, ptr %a51) + %t52 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t52, ptr %a54 + store { ptr, i64, i64 } { ptr @.str.4833, i64 5, i64 0 }, ptr %a55 + call void @finch_str_concat(ptr %a53, ptr %a54, ptr %a55) + %t56 = load { ptr, i64, i64 }, ptr %a53 + call void @finch.gen.fail(ptr %t19, %S.ast.Node %t20, { ptr, i64, i64 } %t56) + br label %endif7334 +endif7334: + %t57 = load ptr, ptr %a1 + %t58 = load %S.gen.FnSig, ptr %a2 + %t59 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t57, %S.gen.FnSig %t58) + store { ptr, i64, i64 } { ptr @.str.4834, i64 5, i64 0 }, ptr %a61 + store { ptr, i64, i64 } %t59, ptr %a62 + call void @finch_str_concat(ptr %a60, ptr %a61, ptr %a62) + %t63 = load { ptr, i64, i64 }, ptr %a60 + store { ptr, i64, i64 } %t63, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.4835, i64 1, i64 0 }, ptr %a66 + call void @finch_str_concat(ptr %a64, ptr %a65, ptr %a66) + %t67 = load { ptr, i64, i64 }, ptr %a64 + %t68 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 11 + %t69 = load { ptr, i64, i64 }, ptr %t68 + store { ptr, i64, i64 } %t67, ptr %a71 + store { ptr, i64, i64 } %t69, ptr %a72 + call void @finch_str_concat(ptr %a70, ptr %a71, ptr %a72) + %t73 = load { ptr, i64, i64 }, ptr %a70 + store { ptr, i64, i64 } %t73, ptr %a75 + store { ptr, i64, i64 } { ptr @.str.4836, i64 1, i64 0 }, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4837, i64 2, i64 0 }, ptr %a79 + call void @finch_str_join(ptr %a80, ptr %a4, ptr %a79) + %t81 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t77, ptr %a83 + store { ptr, i64, i64 } %t81, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } %t85, ptr %a87 + store { ptr, i64, i64 } { ptr @.str.4838, i64 1, i64 0 }, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t89, ptr %a90 + %t91 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 9 + %t92 = load i1, ptr %t91 + br i1 %t92, label %then7335, label %endif7337 +then7335: + %t93 = load ptr, ptr %a1 + %t94 = load { ptr, i64, i64 }, ptr %a90 + %t95 = call { ptr, i64, i64 } @finch.gen.op(ptr %t93, { ptr, i64, i64 } %t94) + store { ptr, i64, i64 } %t95, ptr %a96 + %t97 = load ptr, ptr %a1 + %t98 = load ptr, ptr %a1 + %t99 = load %S.gen.FnSig, ptr %a2 + %t100 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t98, %S.gen.FnSig %t99) + store { ptr, i64, i64 } { ptr @.str.4839, i64 13, i64 0 }, ptr %a102 + store { ptr, i64, i64 } %t100, ptr %a103 + call void @finch_str_concat(ptr %a101, ptr %a102, ptr %a103) + %t104 = load { ptr, i64, i64 }, ptr %a101 + store { ptr, i64, i64 } %t104, ptr %a106 + store { ptr, i64, i64 } { ptr @.str.4840, i64 1, i64 0 }, ptr %a107 + call void @finch_str_concat(ptr %a105, ptr %a106, ptr %a107) + %t108 = load { ptr, i64, i64 }, ptr %a105 + %t109 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t108, ptr %a111 + store { ptr, i64, i64 } %t109, ptr %a112 + call void @finch_str_concat(ptr %a110, ptr %a111, ptr %a112) + %t113 = load { ptr, i64, i64 }, ptr %a110 + store { ptr, i64, i64 } %t113, ptr %a115 + store { ptr, i64, i64 } { ptr @.str.4841, i64 3, i64 0 }, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + %t118 = call { ptr, i64, i64 } @finch.gen.op(ptr %t97, { ptr, i64, i64 } %t117) + store { ptr, i64, i64 } %t118, ptr %a119 + %t120 = load ptr, ptr %a1 + %t121 = load { ptr, i64, i64 }, ptr %a119 + store { ptr, i64, i64 } { ptr @.str.4842, i64 7, i64 0 }, ptr %a123 + store { ptr, i64, i64 } %t121, ptr %a124 + call void @finch_str_concat(ptr %a122, ptr %a123, ptr %a124) + %t125 = load { ptr, i64, i64 }, ptr %a122 + store { ptr, i64, i64 } %t125, ptr %a127 + store { ptr, i64, i64 } { ptr @.str.4843, i64 6, i64 0 }, ptr %a128 + call void @finch_str_concat(ptr %a126, ptr %a127, ptr %a128) + %t129 = load { ptr, i64, i64 }, ptr %a126 + %t130 = call { ptr, i64, i64 } @finch.gen.op(ptr %t120, { ptr, i64, i64 } %t129) + %t131 = load ptr, ptr %a1 + %t132 = icmp eq ptr %t131, null + br i1 %t132, label %panic7338, label %ok7339 +panic7338: + call void @finch_panic(ptr @.str.4844, i64 4405, ptr @.str.4845) + unreachable +ok7339: + %t133 = getelementptr inbounds %S.gen.Gen, ptr %t131, i32 0, i32 38 + store { ptr, i64, i64 } %t130, ptr %t133 + %t134 = load ptr, ptr %a1 + %t135 = load ptr, ptr %a1 + %t136 = load %S.gen.FnSig, ptr %a2 + %t137 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t135, %S.gen.FnSig %t136) + store { ptr, i64, i64 } { ptr @.str.4846, i64 13, i64 0 }, ptr %a139 + store { ptr, i64, i64 } %t137, ptr %a140 + call void @finch_str_concat(ptr %a138, ptr %a139, ptr %a140) + %t141 = load { ptr, i64, i64 }, ptr %a138 + store { ptr, i64, i64 } %t141, ptr %a143 + store { ptr, i64, i64 } { ptr @.str.4847, i64 1, i64 0 }, ptr %a144 + call void @finch_str_concat(ptr %a142, ptr %a143, ptr %a144) + %t145 = load { ptr, i64, i64 }, ptr %a142 + %t146 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t145, ptr %a148 + store { ptr, i64, i64 } %t146, ptr %a149 + call void @finch_str_concat(ptr %a147, ptr %a148, ptr %a149) + %t150 = load { ptr, i64, i64 }, ptr %a147 + store { ptr, i64, i64 } %t150, ptr %a152 + store { ptr, i64, i64 } { ptr @.str.4848, i64 3, i64 0 }, ptr %a153 + call void @finch_str_concat(ptr %a151, ptr %a152, ptr %a153) + %t154 = load { ptr, i64, i64 }, ptr %a151 + %t155 = call { ptr, i64, i64 } @finch.gen.op(ptr %t134, { ptr, i64, i64 } %t154) + %t156 = load ptr, ptr %a1 + %t157 = icmp eq ptr %t156, null + br i1 %t157, label %panic7340, label %ok7341 +panic7340: + call void @finch_panic(ptr @.str.4849, i64 4406, ptr @.str.4850) + unreachable +ok7341: + %t158 = getelementptr inbounds %S.gen.Gen, ptr %t156, i32 0, i32 39 + store { ptr, i64, i64 } %t155, ptr %t158 + %t159 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t160 = getelementptr inbounds %S.ast.Type, ptr %t159, i32 0, i32 0 + %t161 = load { ptr, i64, i64 }, ptr %t160 + store { ptr, i64, i64 } %t161, ptr %a162 + store { ptr, i64, i64 } { ptr @.str.4851, i64 4, i64 0 }, ptr %a163 + %t164 = call i32 @finch_str_eq(ptr %a162, ptr %a163) + %t165 = icmp ne i32 %t164, 0 + br i1 %t165, label %then7342, label %endif7344 +then7342: + %t166 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t167 = load %S.ast.Type, ptr %t166 + store %S.ast.Type %t167, ptr %a168 + call void @finch.copy.S_ast_Type(ptr %a169, ptr %a168) + %t170 = load %S.ast.Type, ptr %a169 + %t171 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t170, 1 + ret %S.gen.Val %t171 +endif7344: + %t172 = load ptr, ptr %a1 + %t173 = load ptr, ptr %a1 + %t174 = load %S.gen.FnSig, ptr %a2 + %t175 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t173, %S.gen.FnSig %t174) + store { ptr, i64, i64 } { ptr @.str.4852, i64 13, i64 0 }, ptr %a177 + store { ptr, i64, i64 } %t175, ptr %a178 + call void @finch_str_concat(ptr %a176, ptr %a177, ptr %a178) + %t179 = load { ptr, i64, i64 }, ptr %a176 + store { ptr, i64, i64 } %t179, ptr %a181 + store { ptr, i64, i64 } { ptr @.str.4853, i64 1, i64 0 }, ptr %a182 + call void @finch_str_concat(ptr %a180, ptr %a181, ptr %a182) + %t183 = load { ptr, i64, i64 }, ptr %a180 + %t184 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t183, ptr %a186 + store { ptr, i64, i64 } %t184, ptr %a187 + call void @finch_str_concat(ptr %a185, ptr %a186, ptr %a187) + %t188 = load { ptr, i64, i64 }, ptr %a185 + store { ptr, i64, i64 } %t188, ptr %a190 + store { ptr, i64, i64 } { ptr @.str.4854, i64 3, i64 0 }, ptr %a191 + call void @finch_str_concat(ptr %a189, ptr %a190, ptr %a191) + %t192 = load { ptr, i64, i64 }, ptr %a189 + %t193 = call { ptr, i64, i64 } @finch.gen.op(ptr %t172, { ptr, i64, i64 } %t192) + %t194 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t193, 0 + %t195 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t196 = load %S.ast.Type, ptr %t195 + store %S.ast.Type %t196, ptr %a197 + call void @finch.copy.S_ast_Type(ptr %a198, ptr %a197) + %t199 = load %S.ast.Type, ptr %a198 + %t200 = insertvalue %S.gen.Val %t194, %S.ast.Type %t199, 1 + %t201 = load ptr, ptr %a1 + %t202 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t203 = load %S.ast.Type, ptr %t202 + %t204 = call i1 @finch.gen.owning(ptr %t201, %S.ast.Type %t203) + %t205 = insertvalue %S.gen.Val %t200, i1 %t204, 2 + ret %S.gen.Val %t205 +endif7337: + %t206 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t207 = getelementptr inbounds %S.ast.Type, ptr %t206, i32 0, i32 0 + %t208 = load { ptr, i64, i64 }, ptr %t207 + store { ptr, i64, i64 } %t208, ptr %a209 + store { ptr, i64, i64 } { ptr @.str.4855, i64 4, i64 0 }, ptr %a210 + %t211 = call i32 @finch_str_eq(ptr %a209, ptr %a210) + %t212 = icmp ne i32 %t211, 0 + br i1 %t212, label %then7345, label %endif7347 +then7345: + %t213 = load ptr, ptr %a1 + %t214 = load { ptr, i64, i64 }, ptr %a90 + call void @finch.gen.emit(ptr %t213, { ptr, i64, i64 } %t214) + %t215 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t216 = load %S.ast.Type, ptr %t215 + store %S.ast.Type %t216, ptr %a217 + call void @finch.copy.S_ast_Type(ptr %a218, ptr %a217) + %t219 = load %S.ast.Type, ptr %a218 + %t220 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t219, 1 + ret %S.gen.Val %t220 +endif7347: + %t221 = load ptr, ptr %a1 + %t222 = load { ptr, i64, i64 }, ptr %a90 + %t223 = call { ptr, i64, i64 } @finch.gen.op(ptr %t221, { ptr, i64, i64 } %t222) + %t224 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t223, 0 + %t225 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t226 = load %S.ast.Type, ptr %t225 + store %S.ast.Type %t226, ptr %a227 + call void @finch.copy.S_ast_Type(ptr %a228, ptr %a227) + %t229 = load %S.ast.Type, ptr %a228 + %t230 = insertvalue %S.gen.Val %t224, %S.ast.Type %t229, 1 + %t231 = load ptr, ptr %a1 + %t232 = getelementptr inbounds %S.gen.FnSig, ptr %a2, i32 0, i32 12 + %t233 = load %S.ast.Type, ptr %t232 + %t234 = call i1 @finch.gen.owning(ptr %t231, %S.ast.Type %t233) + %t235 = insertvalue %S.gen.Val %t230, i1 %t234, 2 + ret %S.gen.Val %t235 +} + +define internal %S.gen.Val @finch.gen.construct(ptr %p0, i64 %p1, { ptr, i64, i64 } %p2, { ptr, i64, i64 } %p3, %S.ast.Node %p4) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca i64, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca %S.ast.Node, align 16 + %a16 = alloca %S.gen.StructDef, align 16 + %a17 = alloca %S.gen.StructDef, align 16 + %a19 = alloca %S.gen.StructDef, align 16 + %a20 = alloca %S.ast.Node, align 16 + %a43 = alloca %S.ast.Node, align 16 + %a44 = alloca %S.ast.Node, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca %S.ast.Type, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca i1, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca i64, align 16 + %a93 = alloca i64, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca i64, align 16 + %a185 = alloca i64, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca i64, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca i64, align 16 + %a283 = alloca %S.ast.Type, align 16 + %a284 = alloca %S.ast.Type, align 16 + %a286 = alloca %S.ast.Type, align 16 + %a287 = alloca %S.gen.Val, align 16 + %a335 = alloca { ptr, i64, i64 }, align 16 + %a336 = alloca { ptr, i64, i64 }, align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a339 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a372 = alloca { ptr, i64, i64 }, align 16 + %a374 = alloca { ptr, i64, i64 }, align 16 + %a379 = alloca { ptr, i64, i64 }, align 16 + %a380 = alloca { ptr, i64, i64 }, align 16 + %a382 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a396 = alloca { ptr, i64, i64 }, align 16 + %a397 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a405 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a422 = alloca { ptr, i64, i64 }, align 16 + %a465 = alloca { ptr, i64, i64 }, align 16 + %a466 = alloca { ptr, i64, i64 }, align 16 + %a467 = alloca { ptr, i64, i64 }, align 16 + %a469 = alloca { ptr, i64, i64 }, align 16 + %a470 = alloca { ptr, i64, i64 }, align 16 + %a471 = alloca { ptr, i64, i64 }, align 16 + %a478 = alloca { ptr, i64, i64 }, align 16 + %a479 = alloca { ptr, i64, i64 }, align 16 + %a485 = alloca { ptr, i64, i64 }, align 16 + %a486 = alloca { ptr, i64, i64 }, align 16 + %a492 = alloca { ptr, i64, i64 }, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a499 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca { ptr, i64, i64 }, align 16 + %a504 = alloca { ptr, i64, i64 }, align 16 + %a505 = alloca { ptr, i64, i64 }, align 16 + %a506 = alloca { ptr, i64, i64 }, align 16 + %a508 = alloca { ptr, i64, i64 }, align 16 + %a509 = alloca { ptr, i64, i64 }, align 16 + %a510 = alloca { ptr, i64, i64 }, align 16 + %a513 = alloca { ptr, i64, i64 }, align 16 + %a514 = alloca { ptr, i64, i64 }, align 16 + %a515 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a518 = alloca { ptr, i64, i64 }, align 16 + %a519 = alloca { ptr, i64, i64 }, align 16 + %a524 = alloca { ptr, i64, i64 }, align 16 + %a525 = alloca { ptr, i64, i64 }, align 16 + %a526 = alloca { ptr, i64, i64 }, align 16 + %a528 = alloca { ptr, i64, i64 }, align 16 + %a529 = alloca { ptr, i64, i64 }, align 16 + %a530 = alloca { ptr, i64, i64 }, align 16 + %a535 = alloca { ptr, i64, i64 }, align 16 + %a536 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a539 = alloca { ptr, i64, i64 }, align 16 + %a540 = alloca { ptr, i64, i64 }, align 16 + %a541 = alloca { ptr, i64, i64 }, align 16 + %a551 = alloca { ptr, i64, i64 }, align 16 + %a553 = alloca { ptr, i64, i64 }, align 16 + %a554 = alloca { ptr, i64, i64 }, align 16 + %a555 = alloca { ptr, i64, i64 }, align 16 + %a561 = alloca { ptr, i64, i64 }, align 16 + %a562 = alloca { ptr, i64, i64 }, align 16 + %a566 = alloca %S.ast.Type, align 16 + %a567 = alloca %S.ast.Type, align 16 + store ptr %p0, ptr %a1 + store i64 %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store { ptr, i64, i64 } %p3, ptr %a4 + store %S.ast.Node %p4, ptr %a5 + %t6 = load ptr, ptr %a1 + %t7 = icmp eq ptr %t6, null + br i1 %t7, label %panic7348, label %ok7349 +panic7348: + call void @finch_panic(ptr @.str.4856, i64 4420, ptr @.str.4857) + unreachable +ok7349: + %t8 = getelementptr inbounds %S.gen.Gen, ptr %t6, i32 0, i32 15 + %t9 = load i64, ptr %a2 + %t10 = load { ptr, i64, i64 }, ptr %t8 + %t11 = extractvalue { ptr, i64, i64 } %t10, 1 + %t12 = icmp uge i64 %t9, %t11 + br i1 %t12, label %range7350, label %inrange7351 +range7350: + call void @finch_panic_index(ptr @.str.4858, i64 4420, i64 %t9, i64 %t11) + unreachable +inrange7351: + %t13 = extractvalue { ptr, i64, i64 } %t10, 0 + %t14 = getelementptr inbounds %S.gen.StructDef, ptr %t13, i64 %t9 + %t15 = load %S.gen.StructDef, ptr %t14 + store %S.gen.StructDef %t15, ptr %a16 + call void @finch.copy.S_gen_StructDef(ptr %a17, ptr %a16) + %t18 = load %S.gen.StructDef, ptr %a17 + store %S.gen.StructDef %t18, ptr %a19 + store %S.ast.Node zeroinitializer, ptr %a20 + %t21 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 2 + %t22 = load i1, ptr %t21 + %t23 = xor i1 %t22, true + br i1 %t23, label %then7352, label %endif7354 +then7352: + %t24 = load ptr, ptr %a1 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic7355, label %ok7356 +panic7355: + call void @finch_panic(ptr @.str.4859, i64 4423, ptr @.str.4860) + unreachable +ok7356: + %t26 = getelementptr inbounds %S.gen.Gen, ptr %t24, i32 0, i32 0 + %t27 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 13 + %t28 = load i64, ptr %t27 + %t29 = load { ptr, i64, i64 }, ptr %t26 + %t30 = extractvalue { ptr, i64, i64 } %t29, 1 + %t31 = icmp uge i64 %t28, %t30 + br i1 %t31, label %range7357, label %inrange7358 +range7357: + call void @finch_panic_index(ptr @.str.4861, i64 4423, i64 %t28, i64 %t30) + unreachable +inrange7358: + %t32 = extractvalue { ptr, i64, i64 } %t29, 0 + %t33 = getelementptr inbounds %S.ast.Program, ptr %t32, i64 %t28 + %t34 = getelementptr inbounds %S.ast.Program, ptr %t33, i32 0, i32 6 + %t35 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 14 + %t36 = load i64, ptr %t35 + %t37 = load { ptr, i64, i64 }, ptr %t34 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 %t36, %t38 + br i1 %t39, label %range7359, label %inrange7360 +range7359: + call void @finch_panic_index(ptr @.str.4862, i64 4423, i64 %t36, i64 %t38) + unreachable +inrange7360: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds %S.ast.Node, ptr %t40, i64 %t36 + %t42 = load %S.ast.Node, ptr %t41 + store %S.ast.Node %t42, ptr %a43 + call void @finch.copy.S_ast_Node(ptr %a44, ptr %a43) + %t45 = load %S.ast.Node, ptr %a44 + store %S.ast.Node %t45, ptr %a20 + br label %endif7354 +endif7354: + %t46 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.4863, i64 6, i64 0 }, 0 + %t47 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 1 + %t48 = load { ptr, i64, i64 }, ptr %t47 + store { ptr, i64, i64 } %t48, ptr %a49 + call void @finch_str_copy(ptr %a50, ptr %a49) + %t51 = load { ptr, i64, i64 }, ptr %a50 + %t52 = insertvalue %S.ast.Type %t46, { ptr, i64, i64 } %t51, 2 + %t53 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 0 + %t54 = load { ptr, i64, i64 }, ptr %t53 + store { ptr, i64, i64 } %t54, ptr %a55 + call void @finch_str_copy(ptr %a56, ptr %a55) + %t57 = load { ptr, i64, i64 }, ptr %a56 + %t58 = insertvalue %S.ast.Type %t52, { ptr, i64, i64 } %t57, 3 + store %S.ast.Type %t58, ptr %a59 + %t60 = load ptr, ptr %a1 + %t61 = load %S.ast.Type, ptr %a59 + %t62 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t60, %S.ast.Type %t61) + store { ptr, i64, i64 } %t62, ptr %a63 + %t64 = getelementptr inbounds { ptr, i64, i64 }, ptr %a4, i32 0, i32 1 + %t65 = load i64, ptr %t64 + %t66 = icmp sgt i64 %t65, 0 + br label %logic.from7361 +logic.from7361: + br i1 %t66, label %logic.rhs7362, label %logic.end7363 +logic.rhs7362: + %t67 = load { ptr, i64, i64 }, ptr %a4 + %t68 = extractvalue { ptr, i64, i64 } %t67, 1 + %t69 = icmp uge i64 0, %t68 + br i1 %t69, label %range7364, label %inrange7365 +range7364: + call void @finch_panic_index(ptr @.str.4864, i64 4427, i64 0, i64 %t68) + unreachable +inrange7365: + %t70 = extractvalue { ptr, i64, i64 } %t67, 0 + %t71 = getelementptr inbounds { ptr, i64, i64 }, ptr %t70, i64 0 + %t72 = getelementptr inbounds { ptr, i64, i64 }, ptr %t71, i32 0, i32 1 + %t73 = load i64, ptr %t72 + %t74 = icmp sgt i64 %t73, 0 + br label %logic.rend7366 +logic.rend7366: + br label %logic.end7363 +logic.end7363: + %t75 = phi i1 [ false, %logic.from7361 ], [ %t74, %logic.rend7366 ] + store i1 %t75, ptr %a76 + store { ptr, i64, i64 } zeroinitializer, ptr %a77 + %t78 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 11 + %t79 = getelementptr inbounds { ptr, i64, i64 }, ptr %t78, i32 0, i32 1 + %t80 = load i64, ptr %t79 + store i64 0, ptr %a81 + br label %for.cond7367 +for.cond7367: + %t82 = load i64, ptr %a81 + %t83 = icmp slt i64 %t82, %t80 + br i1 %t83, label %for.body7368, label %for.end7370 +for.body7368: + %t84 = getelementptr inbounds { ptr, i64, i64 }, ptr %a77, i32 0, i32 1 + %t85 = load i64, ptr %t84 + %t86 = add i64 %t85, 1 + call void @finch_arr_reserve(ptr %a77, i64 %t86, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t87 = load ptr, ptr %a77 + %t88 = getelementptr inbounds i64, ptr %t87, i64 %t85 + store i64 -1, ptr %t88 + store i64 %t86, ptr %t84 + br label %for.step7369 +for.step7369: + %t89 = load i64, ptr %a81 + %t90 = add i64 %t89, 1 + store i64 %t90, ptr %a81 + br label %for.cond7367 +for.end7370: + %t91 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t92 = load i64, ptr %t91 + store i64 0, ptr %a93 + br label %for.cond7371 +for.cond7371: + %t94 = load i64, ptr %a93 + %t95 = icmp slt i64 %t94, %t92 + br i1 %t95, label %for.body7372, label %for.end7374 +for.body7372: + %t96 = load i64, ptr %a93 + %t97 = load { ptr, i64, i64 }, ptr %a4 + %t98 = extractvalue { ptr, i64, i64 } %t97, 1 + %t99 = icmp uge i64 %t96, %t98 + br i1 %t99, label %range7375, label %inrange7376 +range7375: + call void @finch_panic_index(ptr @.str.4865, i64 4433, i64 %t96, i64 %t98) + unreachable +inrange7376: + %t100 = extractvalue { ptr, i64, i64 } %t97, 0 + %t101 = getelementptr inbounds { ptr, i64, i64 }, ptr %t100, i64 %t96 + %t102 = getelementptr inbounds { ptr, i64, i64 }, ptr %t101, i32 0, i32 1 + %t103 = load i64, ptr %t102 + %t104 = icmp sgt i64 %t103, 0 + %t105 = load i1, ptr %a76 + %t106 = icmp ne i1 %t104, %t105 + br i1 %t106, label %then7377, label %endif7379 +then7377: + %t107 = load ptr, ptr %a1 + %t108 = load i64, ptr %a93 + %t109 = load { ptr, i64, i64 }, ptr %a3 + %t110 = extractvalue { ptr, i64, i64 } %t109, 1 + %t111 = icmp uge i64 %t108, %t110 + br i1 %t111, label %range7380, label %inrange7381 +range7380: + call void @finch_panic_index(ptr @.str.4866, i64 4434, i64 %t108, i64 %t110) + unreachable +inrange7381: + %t112 = extractvalue { ptr, i64, i64 } %t109, 0 + %t113 = getelementptr inbounds %S.ast.Node, ptr %t112, i64 %t108 + %t114 = load %S.ast.Node, ptr %t113 + call void @finch.gen.fail(ptr %t107, %S.ast.Node %t114, { ptr, i64, i64 } { ptr @.str.4867, i64 69, i64 0 }) + br label %endif7379 +endif7379: + %t115 = load i1, ptr %a76 + %t116 = xor i1 %t115, true + br i1 %t116, label %then7382, label %endif7384 +then7382: + %t117 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t118 = load i64, ptr %t117 + %t119 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 11 + %t120 = getelementptr inbounds { ptr, i64, i64 }, ptr %t119, i32 0, i32 1 + %t121 = load i64, ptr %t120 + %t122 = icmp ne i64 %t118, %t121 + br i1 %t122, label %then7385, label %endif7387 +then7385: + %t123 = load ptr, ptr %a1 + %t124 = load %S.ast.Node, ptr %a5 + %t125 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 1 + %t126 = load { ptr, i64, i64 }, ptr %t125 + store { ptr, i64, i64 } %t126, ptr %a128 + store { ptr, i64, i64 } { ptr @.str.4868, i64 5, i64 0 }, ptr %a129 + call void @finch_str_concat(ptr %a127, ptr %a128, ptr %a129) + %t130 = load { ptr, i64, i64 }, ptr %a127 + %t131 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 11 + %t132 = getelementptr inbounds { ptr, i64, i64 }, ptr %t131, i32 0, i32 1 + %t133 = load i64, ptr %t132 + call void @finch_str_from_int(ptr %a134, i64 %t133) + %t135 = load { ptr, i64, i64 }, ptr %a134 + store { ptr, i64, i64 } %t130, ptr %a137 + store { ptr, i64, i64 } %t135, ptr %a138 + call void @finch_str_concat(ptr %a136, ptr %a137, ptr %a138) + %t139 = load { ptr, i64, i64 }, ptr %a136 + store { ptr, i64, i64 } %t139, ptr %a141 + store { ptr, i64, i64 } { ptr @.str.4869, i64 17, i64 0 }, ptr %a142 + call void @finch_str_concat(ptr %a140, ptr %a141, ptr %a142) + %t143 = load { ptr, i64, i64 }, ptr %a140 + %t144 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t145 = load i64, ptr %t144 + call void @finch_str_from_int(ptr %a146, i64 %t145) + %t147 = load { ptr, i64, i64 }, ptr %a146 + store { ptr, i64, i64 } %t143, ptr %a149 + store { ptr, i64, i64 } %t147, ptr %a150 + call void @finch_str_concat(ptr %a148, ptr %a149, ptr %a150) + %t151 = load { ptr, i64, i64 }, ptr %a148 + store { ptr, i64, i64 } %t151, ptr %a153 + store { ptr, i64, i64 } { ptr @.str.4870, i64 23, i64 0 }, ptr %a154 + call void @finch_str_concat(ptr %a152, ptr %a153, ptr %a154) + %t155 = load { ptr, i64, i64 }, ptr %a152 + %t156 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 1 + %t157 = load { ptr, i64, i64 }, ptr %t156 + store { ptr, i64, i64 } %t155, ptr %a159 + store { ptr, i64, i64 } %t157, ptr %a160 + call void @finch_str_concat(ptr %a158, ptr %a159, ptr %a160) + %t161 = load { ptr, i64, i64 }, ptr %a158 + store { ptr, i64, i64 } %t161, ptr %a163 + store { ptr, i64, i64 } { ptr @.str.4871, i64 15, i64 0 }, ptr %a164 + call void @finch_str_concat(ptr %a162, ptr %a163, ptr %a164) + %t165 = load { ptr, i64, i64 }, ptr %a162 + call void @finch.gen.fail(ptr %t123, %S.ast.Node %t124, { ptr, i64, i64 } %t165) + br label %endif7387 +endif7387: + %t166 = load i64, ptr %a93 + %t167 = load i64, ptr %a93 + %t168 = load { ptr, i64, i64 }, ptr %a77 + %t169 = extractvalue { ptr, i64, i64 } %t168, 1 + %t170 = icmp uge i64 %t167, %t169 + br i1 %t170, label %range7388, label %inrange7389 +range7388: + call void @finch_panic_index(ptr @.str.4872, i64 4440, i64 %t167, i64 %t169) + unreachable +inrange7389: + %t171 = extractvalue { ptr, i64, i64 } %t168, 0 + %t172 = getelementptr inbounds i64, ptr %t171, i64 %t167 + store i64 %t166, ptr %t172 + br label %for.step7373 +endif7384: + %t173 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 11 + %t174 = getelementptr inbounds { ptr, i64, i64 }, ptr %t173, i32 0, i32 1 + %t175 = load i64, ptr %a93 + %t176 = load { ptr, i64, i64 }, ptr %a4 + %t177 = extractvalue { ptr, i64, i64 } %t176, 1 + %t178 = icmp uge i64 %t175, %t177 + br i1 %t178, label %range7390, label %inrange7391 +range7390: + call void @finch_panic_index(ptr @.str.4873, i64 4443, i64 %t175, i64 %t177) + unreachable +inrange7391: + %t179 = extractvalue { ptr, i64, i64 } %t176, 0 + %t180 = getelementptr inbounds { ptr, i64, i64 }, ptr %t179, i64 %t175 + %t181 = load { ptr, i64, i64 }, ptr %t180 + store i64 -1, ptr %a182 + %t183 = load i64, ptr %t174 + %t184 = load ptr, ptr %t173 + store i64 0, ptr %a185 + br label %find.cond7392 +find.cond7392: + %t186 = load i64, ptr %a185 + %t187 = icmp slt i64 %t186, %t183 + br i1 %t187, label %find.body7393, label %find.end7396 +find.body7393: + %t188 = getelementptr inbounds { ptr, i64, i64 }, ptr %t184, i64 %t186 + %t189 = load { ptr, i64, i64 }, ptr %t188 + store { ptr, i64, i64 } %t189, ptr %a190 + store { ptr, i64, i64 } %t181, ptr %a191 + %t192 = call i32 @finch_str_eq(ptr %a190, ptr %a191) + %t193 = icmp ne i32 %t192, 0 + br i1 %t193, label %find.hit7394, label %find.next7395 +find.hit7394: + store i64 %t186, ptr %a182 + br label %find.end7396 +find.next7395: + %t194 = add i64 %t186, 1 + store i64 %t194, ptr %a185 + br label %find.cond7392 +find.end7396: + %t195 = load i64, ptr %a182 + store i64 %t195, ptr %a196 + %t197 = load i64, ptr %a196 + %t198 = icmp slt i64 %t197, 0 + br i1 %t198, label %then7397, label %endif7399 +then7397: + %t199 = load ptr, ptr %a1 + %t200 = load i64, ptr %a93 + %t201 = load { ptr, i64, i64 }, ptr %a3 + %t202 = extractvalue { ptr, i64, i64 } %t201, 1 + %t203 = icmp uge i64 %t200, %t202 + br i1 %t203, label %range7400, label %inrange7401 +range7400: + call void @finch_panic_index(ptr @.str.4874, i64 4445, i64 %t200, i64 %t202) + unreachable +inrange7401: + %t204 = extractvalue { ptr, i64, i64 } %t201, 0 + %t205 = getelementptr inbounds %S.ast.Node, ptr %t204, i64 %t200 + %t206 = load %S.ast.Node, ptr %t205 + %t207 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 1 + %t208 = load { ptr, i64, i64 }, ptr %t207 + store { ptr, i64, i64 } %t208, ptr %a210 + store { ptr, i64, i64 } { ptr @.str.4875, i64 15, i64 0 }, ptr %a211 + call void @finch_str_concat(ptr %a209, ptr %a210, ptr %a211) + %t212 = load { ptr, i64, i64 }, ptr %a209 + %t213 = load i64, ptr %a93 + %t214 = load { ptr, i64, i64 }, ptr %a4 + %t215 = extractvalue { ptr, i64, i64 } %t214, 1 + %t216 = icmp uge i64 %t213, %t215 + br i1 %t216, label %range7402, label %inrange7403 +range7402: + call void @finch_panic_index(ptr @.str.4876, i64 4445, i64 %t213, i64 %t215) + unreachable +inrange7403: + %t217 = extractvalue { ptr, i64, i64 } %t214, 0 + %t218 = getelementptr inbounds { ptr, i64, i64 }, ptr %t217, i64 %t213 + %t219 = load { ptr, i64, i64 }, ptr %t218 + store { ptr, i64, i64 } %t212, ptr %a221 + store { ptr, i64, i64 } %t219, ptr %a222 + call void @finch_str_concat(ptr %a220, ptr %a221, ptr %a222) + %t223 = load { ptr, i64, i64 }, ptr %a220 + store { ptr, i64, i64 } %t223, ptr %a225 + store { ptr, i64, i64 } { ptr @.str.4877, i64 1, i64 0 }, ptr %a226 + call void @finch_str_concat(ptr %a224, ptr %a225, ptr %a226) + %t227 = load { ptr, i64, i64 }, ptr %a224 + call void @finch.gen.fail(ptr %t199, %S.ast.Node %t206, { ptr, i64, i64 } %t227) + br label %endif7399 +endif7399: + %t228 = load i64, ptr %a196 + %t229 = load { ptr, i64, i64 }, ptr %a77 + %t230 = extractvalue { ptr, i64, i64 } %t229, 1 + %t231 = icmp uge i64 %t228, %t230 + br i1 %t231, label %range7404, label %inrange7405 +range7404: + call void @finch_panic_index(ptr @.str.4878, i64 4447, i64 %t228, i64 %t230) + unreachable +inrange7405: + %t232 = extractvalue { ptr, i64, i64 } %t229, 0 + %t233 = getelementptr inbounds i64, ptr %t232, i64 %t228 + %t234 = load i64, ptr %t233 + %t235 = icmp sge i64 %t234, 0 + br i1 %t235, label %then7406, label %endif7408 +then7406: + %t236 = load ptr, ptr %a1 + %t237 = load i64, ptr %a93 + %t238 = load { ptr, i64, i64 }, ptr %a3 + %t239 = extractvalue { ptr, i64, i64 } %t238, 1 + %t240 = icmp uge i64 %t237, %t239 + br i1 %t240, label %range7409, label %inrange7410 +range7409: + call void @finch_panic_index(ptr @.str.4879, i64 4448, i64 %t237, i64 %t239) + unreachable +inrange7410: + %t241 = extractvalue { ptr, i64, i64 } %t238, 0 + %t242 = getelementptr inbounds %S.ast.Node, ptr %t241, i64 %t237 + %t243 = load %S.ast.Node, ptr %t242 + %t244 = load i64, ptr %a93 + %t245 = load { ptr, i64, i64 }, ptr %a4 + %t246 = extractvalue { ptr, i64, i64 } %t245, 1 + %t247 = icmp uge i64 %t244, %t246 + br i1 %t247, label %range7411, label %inrange7412 +range7411: + call void @finch_panic_index(ptr @.str.4881, i64 4448, i64 %t244, i64 %t246) + unreachable +inrange7412: + %t248 = extractvalue { ptr, i64, i64 } %t245, 0 + %t249 = getelementptr inbounds { ptr, i64, i64 }, ptr %t248, i64 %t244 + %t250 = load { ptr, i64, i64 }, ptr %t249 + store { ptr, i64, i64 } { ptr @.str.4880, i64 11, i64 0 }, ptr %a252 + store { ptr, i64, i64 } %t250, ptr %a253 + call void @finch_str_concat(ptr %a251, ptr %a252, ptr %a253) + %t254 = load { ptr, i64, i64 }, ptr %a251 + store { ptr, i64, i64 } %t254, ptr %a256 + store { ptr, i64, i64 } { ptr @.str.4882, i64 16, i64 0 }, ptr %a257 + call void @finch_str_concat(ptr %a255, ptr %a256, ptr %a257) + %t258 = load { ptr, i64, i64 }, ptr %a255 + call void @finch.gen.fail(ptr %t236, %S.ast.Node %t243, { ptr, i64, i64 } %t258) + br label %endif7408 +endif7408: + %t259 = load i64, ptr %a93 + %t260 = load i64, ptr %a196 + %t261 = load { ptr, i64, i64 }, ptr %a77 + %t262 = extractvalue { ptr, i64, i64 } %t261, 1 + %t263 = icmp uge i64 %t260, %t262 + br i1 %t263, label %range7413, label %inrange7414 +range7413: + call void @finch_panic_index(ptr @.str.4883, i64 4450, i64 %t260, i64 %t262) + unreachable +inrange7414: + %t264 = extractvalue { ptr, i64, i64 } %t261, 0 + %t265 = getelementptr inbounds i64, ptr %t264, i64 %t260 + store i64 %t259, ptr %t265 + br label %for.step7373 +for.step7373: + %t266 = load i64, ptr %a93 + %t267 = add i64 %t266, 1 + store i64 %t267, ptr %a93 + br label %for.cond7371 +for.end7374: + store { ptr, i64, i64 } { ptr @.str.4884, i64 15, i64 0 }, ptr %a268 + %t269 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 11 + %t270 = getelementptr inbounds { ptr, i64, i64 }, ptr %t269, i32 0, i32 1 + %t271 = load i64, ptr %t270 + store i64 0, ptr %a272 + br label %for.cond7415 +for.cond7415: + %t273 = load i64, ptr %a272 + %t274 = icmp slt i64 %t273, %t271 + br i1 %t274, label %for.body7416, label %for.end7418 +for.body7416: + %t275 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 12 + %t276 = load i64, ptr %a272 + %t277 = load { ptr, i64, i64 }, ptr %t275 + %t278 = extractvalue { ptr, i64, i64 } %t277, 1 + %t279 = icmp uge i64 %t276, %t278 + br i1 %t279, label %range7419, label %inrange7420 +range7419: + call void @finch_panic_index(ptr @.str.4885, i64 4454, i64 %t276, i64 %t278) + unreachable +inrange7420: + %t280 = extractvalue { ptr, i64, i64 } %t277, 0 + %t281 = getelementptr inbounds %S.ast.Type, ptr %t280, i64 %t276 + %t282 = load %S.ast.Type, ptr %t281 + store %S.ast.Type %t282, ptr %a283 + call void @finch.copy.S_ast_Type(ptr %a284, ptr %a283) + %t285 = load %S.ast.Type, ptr %a284 + store %S.ast.Type %t285, ptr %a286 + store %S.gen.Val zeroinitializer, ptr %a287 + %t288 = load i64, ptr %a272 + %t289 = load { ptr, i64, i64 }, ptr %a77 + %t290 = extractvalue { ptr, i64, i64 } %t289, 1 + %t291 = icmp uge i64 %t288, %t290 + br i1 %t291, label %range7421, label %inrange7422 +range7421: + call void @finch_panic_index(ptr @.str.4886, i64 4456, i64 %t288, i64 %t290) + unreachable +inrange7422: + %t292 = extractvalue { ptr, i64, i64 } %t289, 0 + %t293 = getelementptr inbounds i64, ptr %t292, i64 %t288 + %t294 = load i64, ptr %t293 + %t295 = icmp sge i64 %t294, 0 + br i1 %t295, label %then7423, label %else7424 +then7423: + %t296 = load ptr, ptr %a1 + %t297 = load ptr, ptr %a1 + %t298 = load i64, ptr %a272 + %t299 = load { ptr, i64, i64 }, ptr %a77 + %t300 = extractvalue { ptr, i64, i64 } %t299, 1 + %t301 = icmp uge i64 %t298, %t300 + br i1 %t301, label %range7426, label %inrange7427 +range7426: + call void @finch_panic_index(ptr @.str.4887, i64 4457, i64 %t298, i64 %t300) + unreachable +inrange7427: + %t302 = extractvalue { ptr, i64, i64 } %t299, 0 + %t303 = getelementptr inbounds i64, ptr %t302, i64 %t298 + %t304 = load i64, ptr %t303 + %t305 = load { ptr, i64, i64 }, ptr %a3 + %t306 = extractvalue { ptr, i64, i64 } %t305, 1 + %t307 = icmp uge i64 %t304, %t306 + br i1 %t307, label %range7428, label %inrange7429 +range7428: + call void @finch_panic_index(ptr @.str.4888, i64 4457, i64 %t304, i64 %t306) + unreachable +inrange7429: + %t308 = extractvalue { ptr, i64, i64 } %t305, 0 + %t309 = getelementptr inbounds %S.ast.Node, ptr %t308, i64 %t304 + %t310 = load %S.ast.Node, ptr %t309 + %t311 = load %S.ast.Type, ptr %a286 + %t312 = call %S.gen.Val @finch.gen.exprWant(ptr %t297, %S.ast.Node %t310, %S.ast.Type %t311) + %t313 = load %S.ast.Type, ptr %a286 + %t314 = load i64, ptr %a272 + %t315 = load { ptr, i64, i64 }, ptr %a77 + %t316 = extractvalue { ptr, i64, i64 } %t315, 1 + %t317 = icmp uge i64 %t314, %t316 + br i1 %t317, label %range7430, label %inrange7431 +range7430: + call void @finch_panic_index(ptr @.str.4889, i64 4457, i64 %t314, i64 %t316) + unreachable +inrange7431: + %t318 = extractvalue { ptr, i64, i64 } %t315, 0 + %t319 = getelementptr inbounds i64, ptr %t318, i64 %t314 + %t320 = load i64, ptr %t319 + %t321 = load { ptr, i64, i64 }, ptr %a3 + %t322 = extractvalue { ptr, i64, i64 } %t321, 1 + %t323 = icmp uge i64 %t320, %t322 + br i1 %t323, label %range7432, label %inrange7433 +range7432: + call void @finch_panic_index(ptr @.str.4890, i64 4457, i64 %t320, i64 %t322) + unreachable +inrange7433: + %t324 = extractvalue { ptr, i64, i64 } %t321, 0 + %t325 = getelementptr inbounds %S.ast.Node, ptr %t324, i64 %t320 + %t326 = load %S.ast.Node, ptr %t325 + %t327 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 11 + %t328 = load i64, ptr %a272 + %t329 = load { ptr, i64, i64 }, ptr %t327 + %t330 = extractvalue { ptr, i64, i64 } %t329, 1 + %t331 = icmp uge i64 %t328, %t330 + br i1 %t331, label %range7434, label %inrange7435 +range7434: + call void @finch_panic_index(ptr @.str.4892, i64 4457, i64 %t328, i64 %t330) + unreachable +inrange7435: + %t332 = extractvalue { ptr, i64, i64 } %t329, 0 + %t333 = getelementptr inbounds { ptr, i64, i64 }, ptr %t332, i64 %t328 + %t334 = load { ptr, i64, i64 }, ptr %t333 + store { ptr, i64, i64 } { ptr @.str.4891, i64 11, i64 0 }, ptr %a336 + store { ptr, i64, i64 } %t334, ptr %a337 + call void @finch_str_concat(ptr %a335, ptr %a336, ptr %a337) + %t338 = load { ptr, i64, i64 }, ptr %a335 + store { ptr, i64, i64 } %t338, ptr %a340 + store { ptr, i64, i64 } { ptr @.str.4893, i64 1, i64 0 }, ptr %a341 + call void @finch_str_concat(ptr %a339, ptr %a340, ptr %a341) + %t342 = load { ptr, i64, i64 }, ptr %a339 + %t343 = call %S.gen.Val @finch.gen.coerce(ptr %t296, %S.gen.Val %t312, %S.ast.Type %t313, %S.ast.Node %t326, { ptr, i64, i64 } %t342) + store %S.gen.Val %t343, ptr %a287 + br label %endif7425 +else7424: + %t344 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 2 + %t345 = load i1, ptr %t344 + %t346 = xor i1 %t345, true + br label %logic.from7436 +logic.from7436: + br i1 %t346, label %logic.rhs7437, label %logic.end7438 +logic.rhs7437: + %t347 = getelementptr inbounds %S.ast.Node, ptr %a20, i32 0, i32 9 + %t348 = load i64, ptr %a272 + %t349 = load { ptr, i64, i64 }, ptr %t347 + %t350 = extractvalue { ptr, i64, i64 } %t349, 1 + %t351 = icmp uge i64 %t348, %t350 + br i1 %t351, label %range7439, label %inrange7440 +range7439: + call void @finch_panic_index(ptr @.str.4894, i64 4458, i64 %t348, i64 %t350) + unreachable +inrange7440: + %t352 = extractvalue { ptr, i64, i64 } %t349, 0 + %t353 = getelementptr inbounds %S.ast.Node, ptr %t352, i64 %t348 + %t354 = getelementptr inbounds %S.ast.Node, ptr %t353, i32 0, i32 9 + %t355 = getelementptr inbounds { ptr, i64, i64 }, ptr %t354, i32 0, i32 1 + %t356 = load i64, ptr %t355 + %t357 = icmp sgt i64 %t356, 0 + br label %logic.rend7441 +logic.rend7441: + br label %logic.end7438 +logic.end7438: + %t358 = phi i1 [ false, %logic.from7436 ], [ %t357, %logic.rend7441 ] + br i1 %t358, label %then7442, label %else7443 +then7442: + %t359 = load ptr, ptr %a1 + %t360 = icmp eq ptr %t359, null + br i1 %t360, label %panic7445, label %ok7446 +panic7445: + call void @finch_panic(ptr @.str.4895, i64 4460, ptr @.str.4896) + unreachable +ok7446: + %t361 = getelementptr inbounds %S.gen.Gen, ptr %t359, i32 0, i32 10 + %t362 = load { ptr, i64, i64 }, ptr %t361 + store { ptr, i64, i64 } %t362, ptr %a363 + call void @finch.copy.arr_S_gen_Scope(ptr %a364, ptr %a363) + %t365 = load { ptr, i64, i64 }, ptr %a364 + store { ptr, i64, i64 } %t365, ptr %a366 + %t367 = load ptr, ptr %a1 + %t368 = icmp eq ptr %t367, null + br i1 %t368, label %panic7447, label %ok7448 +panic7447: + call void @finch_panic(ptr @.str.4897, i64 4461, ptr @.str.4898) + unreachable +ok7448: + %t369 = getelementptr inbounds %S.gen.Gen, ptr %t367, i32 0, i32 13 + %t370 = load { ptr, i64, i64 }, ptr %t369 + store { ptr, i64, i64 } %t370, ptr %a371 + call void @finch_str_copy(ptr %a372, ptr %a371) + %t373 = load { ptr, i64, i64 }, ptr %a372 + store { ptr, i64, i64 } %t373, ptr %a374 + %t375 = load ptr, ptr %a1 + %t376 = icmp eq ptr %t375, null + br i1 %t376, label %panic7449, label %ok7450 +panic7449: + call void @finch_panic(ptr @.str.4899, i64 4462, ptr @.str.4900) + unreachable +ok7450: + %t377 = getelementptr inbounds %S.gen.Gen, ptr %t375, i32 0, i32 17 + %t378 = load { ptr, i64, i64 }, ptr %t377 + store { ptr, i64, i64 } %t378, ptr %a379 + call void @finch.copy.arr_str(ptr %a380, ptr %a379) + %t381 = load { ptr, i64, i64 }, ptr %a380 + store { ptr, i64, i64 } %t381, ptr %a382 + %t383 = load ptr, ptr %a1 + %t384 = icmp eq ptr %t383, null + br i1 %t384, label %panic7451, label %ok7452 +panic7451: + call void @finch_panic(ptr @.str.4901, i64 4463, ptr @.str.4902) + unreachable +ok7452: + %t385 = getelementptr inbounds %S.gen.Gen, ptr %t383, i32 0, i32 18 + %t386 = load { ptr, i64, i64 }, ptr %t385 + store { ptr, i64, i64 } %t386, ptr %a387 + call void @finch.copy.arr_S_ast_Type(ptr %a388, ptr %a387) + %t389 = load { ptr, i64, i64 }, ptr %a388 + store { ptr, i64, i64 } %t389, ptr %a390 + %t391 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 6 + %t392 = load { ptr, i64, i64 }, ptr %t391 + %t393 = load ptr, ptr %a1 + %t394 = icmp eq ptr %t393, null + br i1 %t394, label %panic7453, label %ok7454 +panic7453: + call void @finch_panic(ptr @.str.4903, i64 4464, ptr @.str.4904) + unreachable +ok7454: + %t395 = getelementptr inbounds %S.gen.Gen, ptr %t393, i32 0, i32 17 + store { ptr, i64, i64 } %t392, ptr %a396 + call void @finch.copy.arr_str(ptr %a397, ptr %a396) + %t398 = load { ptr, i64, i64 }, ptr %a397 + store { ptr, i64, i64 } %t398, ptr %t395 + %t399 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 7 + %t400 = load { ptr, i64, i64 }, ptr %t399 + %t401 = load ptr, ptr %a1 + %t402 = icmp eq ptr %t401, null + br i1 %t402, label %panic7455, label %ok7456 +panic7455: + call void @finch_panic(ptr @.str.4905, i64 4465, ptr @.str.4906) + unreachable +ok7456: + %t403 = getelementptr inbounds %S.gen.Gen, ptr %t401, i32 0, i32 18 + store { ptr, i64, i64 } %t400, ptr %a404 + call void @finch.copy.arr_S_ast_Type(ptr %a405, ptr %a404) + %t406 = load { ptr, i64, i64 }, ptr %a405 + store { ptr, i64, i64 } %t406, ptr %t403 + store { ptr, i64, i64 } zeroinitializer, ptr %a407 + %t408 = load { ptr, i64, i64 }, ptr %a407 + %t409 = load ptr, ptr %a1 + %t410 = icmp eq ptr %t409, null + br i1 %t410, label %panic7457, label %ok7458 +panic7457: + call void @finch_panic(ptr @.str.4907, i64 4467, ptr @.str.4908) + unreachable +ok7458: + %t411 = getelementptr inbounds %S.gen.Gen, ptr %t409, i32 0, i32 10 + store { ptr, i64, i64 } %t408, ptr %a412 + call void @finch.copy.arr_S_gen_Scope(ptr %a413, ptr %a412) + %t414 = load { ptr, i64, i64 }, ptr %a413 + store { ptr, i64, i64 } %t414, ptr %t411 + %t415 = load ptr, ptr %a1 + call void @finch.gen.pushScope(ptr %t415) + %t416 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 0 + %t417 = load { ptr, i64, i64 }, ptr %t416 + %t418 = load ptr, ptr %a1 + %t419 = icmp eq ptr %t418, null + br i1 %t419, label %panic7459, label %ok7460 +panic7459: + call void @finch_panic(ptr @.str.4909, i64 4469, ptr @.str.4910) + unreachable +ok7460: + %t420 = getelementptr inbounds %S.gen.Gen, ptr %t418, i32 0, i32 13 + store { ptr, i64, i64 } %t417, ptr %a421 + call void @finch_str_copy(ptr %a422, ptr %a421) + %t423 = load { ptr, i64, i64 }, ptr %a422 + store { ptr, i64, i64 } %t423, ptr %t420 + %t424 = load ptr, ptr %a1 + %t425 = load ptr, ptr %a1 + %t426 = getelementptr inbounds %S.ast.Node, ptr %a20, i32 0, i32 9 + %t427 = load i64, ptr %a272 + %t428 = load { ptr, i64, i64 }, ptr %t426 + %t429 = extractvalue { ptr, i64, i64 } %t428, 1 + %t430 = icmp uge i64 %t427, %t429 + br i1 %t430, label %range7461, label %inrange7462 +range7461: + call void @finch_panic_index(ptr @.str.4911, i64 4470, i64 %t427, i64 %t429) + unreachable +inrange7462: + %t431 = extractvalue { ptr, i64, i64 } %t428, 0 + %t432 = getelementptr inbounds %S.ast.Node, ptr %t431, i64 %t427 + %t433 = getelementptr inbounds %S.ast.Node, ptr %t432, i32 0, i32 9 + %t434 = load { ptr, i64, i64 }, ptr %t433 + %t435 = extractvalue { ptr, i64, i64 } %t434, 1 + %t436 = icmp uge i64 0, %t435 + br i1 %t436, label %range7463, label %inrange7464 +range7463: + call void @finch_panic_index(ptr @.str.4912, i64 4470, i64 0, i64 %t435) + unreachable +inrange7464: + %t437 = extractvalue { ptr, i64, i64 } %t434, 0 + %t438 = getelementptr inbounds %S.ast.Node, ptr %t437, i64 0 + %t439 = load %S.ast.Node, ptr %t438 + %t440 = load %S.ast.Type, ptr %a286 + %t441 = call %S.gen.Val @finch.gen.exprWant(ptr %t425, %S.ast.Node %t439, %S.ast.Type %t440) + %t442 = load %S.ast.Type, ptr %a286 + %t443 = getelementptr inbounds %S.ast.Node, ptr %a20, i32 0, i32 9 + %t444 = load i64, ptr %a272 + %t445 = load { ptr, i64, i64 }, ptr %t443 + %t446 = extractvalue { ptr, i64, i64 } %t445, 1 + %t447 = icmp uge i64 %t444, %t446 + br i1 %t447, label %range7465, label %inrange7466 +range7465: + call void @finch_panic_index(ptr @.str.4913, i64 4470, i64 %t444, i64 %t446) + unreachable +inrange7466: + %t448 = extractvalue { ptr, i64, i64 } %t445, 0 + %t449 = getelementptr inbounds %S.ast.Node, ptr %t448, i64 %t444 + %t450 = getelementptr inbounds %S.ast.Node, ptr %t449, i32 0, i32 9 + %t451 = load { ptr, i64, i64 }, ptr %t450 + %t452 = extractvalue { ptr, i64, i64 } %t451, 1 + %t453 = icmp uge i64 0, %t452 + br i1 %t453, label %range7467, label %inrange7468 +range7467: + call void @finch_panic_index(ptr @.str.4914, i64 4470, i64 0, i64 %t452) + unreachable +inrange7468: + %t454 = extractvalue { ptr, i64, i64 } %t451, 0 + %t455 = getelementptr inbounds %S.ast.Node, ptr %t454, i64 0 + %t456 = load %S.ast.Node, ptr %t455 + %t457 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 11 + %t458 = load i64, ptr %a272 + %t459 = load { ptr, i64, i64 }, ptr %t457 + %t460 = extractvalue { ptr, i64, i64 } %t459, 1 + %t461 = icmp uge i64 %t458, %t460 + br i1 %t461, label %range7469, label %inrange7470 +range7469: + call void @finch_panic_index(ptr @.str.4916, i64 4470, i64 %t458, i64 %t460) + unreachable +inrange7470: + %t462 = extractvalue { ptr, i64, i64 } %t459, 0 + %t463 = getelementptr inbounds { ptr, i64, i64 }, ptr %t462, i64 %t458 + %t464 = load { ptr, i64, i64 }, ptr %t463 + store { ptr, i64, i64 } { ptr @.str.4915, i64 16, i64 0 }, ptr %a466 + store { ptr, i64, i64 } %t464, ptr %a467 + call void @finch_str_concat(ptr %a465, ptr %a466, ptr %a467) + %t468 = load { ptr, i64, i64 }, ptr %a465 + store { ptr, i64, i64 } %t468, ptr %a470 + store { ptr, i64, i64 } { ptr @.str.4917, i64 1, i64 0 }, ptr %a471 + call void @finch_str_concat(ptr %a469, ptr %a470, ptr %a471) + %t472 = load { ptr, i64, i64 }, ptr %a469 + %t473 = call %S.gen.Val @finch.gen.coerce(ptr %t424, %S.gen.Val %t441, %S.ast.Type %t442, %S.ast.Node %t456, { ptr, i64, i64 } %t472) + store %S.gen.Val %t473, ptr %a287 + %t474 = load { ptr, i64, i64 }, ptr %a374 + %t475 = load ptr, ptr %a1 + %t476 = icmp eq ptr %t475, null + br i1 %t476, label %panic7471, label %ok7472 +panic7471: + call void @finch_panic(ptr @.str.4918, i64 4471, ptr @.str.4919) + unreachable +ok7472: + %t477 = getelementptr inbounds %S.gen.Gen, ptr %t475, i32 0, i32 13 + store { ptr, i64, i64 } %t474, ptr %a478 + call void @finch_str_copy(ptr %a479, ptr %a478) + %t480 = load { ptr, i64, i64 }, ptr %a479 + store { ptr, i64, i64 } %t480, ptr %t477 + %t481 = load { ptr, i64, i64 }, ptr %a382 + %t482 = load ptr, ptr %a1 + %t483 = icmp eq ptr %t482, null + br i1 %t483, label %panic7473, label %ok7474 +panic7473: + call void @finch_panic(ptr @.str.4920, i64 4472, ptr @.str.4921) + unreachable +ok7474: + %t484 = getelementptr inbounds %S.gen.Gen, ptr %t482, i32 0, i32 17 + store { ptr, i64, i64 } %t481, ptr %a485 + call void @finch.copy.arr_str(ptr %a486, ptr %a485) + %t487 = load { ptr, i64, i64 }, ptr %a486 + store { ptr, i64, i64 } %t487, ptr %t484 + %t488 = load { ptr, i64, i64 }, ptr %a390 + %t489 = load ptr, ptr %a1 + %t490 = icmp eq ptr %t489, null + br i1 %t490, label %panic7475, label %ok7476 +panic7475: + call void @finch_panic(ptr @.str.4922, i64 4473, ptr @.str.4923) + unreachable +ok7476: + %t491 = getelementptr inbounds %S.gen.Gen, ptr %t489, i32 0, i32 18 + store { ptr, i64, i64 } %t488, ptr %a492 + call void @finch.copy.arr_S_ast_Type(ptr %a493, ptr %a492) + %t494 = load { ptr, i64, i64 }, ptr %a493 + store { ptr, i64, i64 } %t494, ptr %t491 + %t495 = load { ptr, i64, i64 }, ptr %a366 + %t496 = load ptr, ptr %a1 + %t497 = icmp eq ptr %t496, null + br i1 %t497, label %panic7477, label %ok7478 +panic7477: + call void @finch_panic(ptr @.str.4924, i64 4474, ptr @.str.4925) + unreachable +ok7478: + %t498 = getelementptr inbounds %S.gen.Gen, ptr %t496, i32 0, i32 10 + store { ptr, i64, i64 } %t495, ptr %a499 + call void @finch.copy.arr_S_gen_Scope(ptr %a500, ptr %a499) + %t501 = load { ptr, i64, i64 }, ptr %a500 + store { ptr, i64, i64 } %t501, ptr %t498 + br label %endif7444 +else7443: + br label %for.step7417 +endif7444: + br label %endif7425 +endif7425: + %t502 = load ptr, ptr %a1 + %t503 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } { ptr @.str.4926, i64 12, i64 0 }, ptr %a505 + store { ptr, i64, i64 } %t503, ptr %a506 + call void @finch_str_concat(ptr %a504, ptr %a505, ptr %a506) + %t507 = load { ptr, i64, i64 }, ptr %a504 + store { ptr, i64, i64 } %t507, ptr %a509 + store { ptr, i64, i64 } { ptr @.str.4927, i64 1, i64 0 }, ptr %a510 + call void @finch_str_concat(ptr %a508, ptr %a509, ptr %a510) + %t511 = load { ptr, i64, i64 }, ptr %a508 + %t512 = load { ptr, i64, i64 }, ptr %a268 + store { ptr, i64, i64 } %t511, ptr %a514 + store { ptr, i64, i64 } %t512, ptr %a515 + call void @finch_str_concat(ptr %a513, ptr %a514, ptr %a515) + %t516 = load { ptr, i64, i64 }, ptr %a513 + store { ptr, i64, i64 } %t516, ptr %a518 + store { ptr, i64, i64 } { ptr @.str.4928, i64 2, i64 0 }, ptr %a519 + call void @finch_str_concat(ptr %a517, ptr %a518, ptr %a519) + %t520 = load { ptr, i64, i64 }, ptr %a517 + %t521 = load ptr, ptr %a1 + %t522 = load %S.ast.Type, ptr %a286 + %t523 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t521, %S.ast.Type %t522) + store { ptr, i64, i64 } %t520, ptr %a525 + store { ptr, i64, i64 } %t523, ptr %a526 + call void @finch_str_concat(ptr %a524, ptr %a525, ptr %a526) + %t527 = load { ptr, i64, i64 }, ptr %a524 + store { ptr, i64, i64 } %t527, ptr %a529 + store { ptr, i64, i64 } { ptr @.str.4929, i64 1, i64 0 }, ptr %a530 + call void @finch_str_concat(ptr %a528, ptr %a529, ptr %a530) + %t531 = load { ptr, i64, i64 }, ptr %a528 + %t532 = load ptr, ptr %a1 + %t533 = load %S.gen.Val, ptr %a287 + %t534 = call { ptr, i64, i64 } @finch.gen.own(ptr %t532, %S.gen.Val %t533) + store { ptr, i64, i64 } %t531, ptr %a536 + store { ptr, i64, i64 } %t534, ptr %a537 + call void @finch_str_concat(ptr %a535, ptr %a536, ptr %a537) + %t538 = load { ptr, i64, i64 }, ptr %a535 + store { ptr, i64, i64 } %t538, ptr %a540 + store { ptr, i64, i64 } { ptr @.str.4930, i64 2, i64 0 }, ptr %a541 + call void @finch_str_concat(ptr %a539, ptr %a540, ptr %a541) + %t542 = load { ptr, i64, i64 }, ptr %a539 + %t543 = getelementptr inbounds %S.gen.StructDef, ptr %a19, i32 0, i32 3 + %t544 = load i64, ptr %a272 + %t545 = load { ptr, i64, i64 }, ptr %t543 + %t546 = extractvalue { ptr, i64, i64 } %t545, 1 + %t547 = icmp uge i64 %t544, %t546 + br i1 %t547, label %range7479, label %inrange7480 +range7479: + call void @finch_panic_index(ptr @.str.4931, i64 4478, i64 %t544, i64 %t546) + unreachable +inrange7480: + %t548 = extractvalue { ptr, i64, i64 } %t545, 0 + %t549 = getelementptr inbounds i64, ptr %t548, i64 %t544 + %t550 = load i64, ptr %t549 + call void @finch_str_from_int(ptr %a551, i64 %t550) + %t552 = load { ptr, i64, i64 }, ptr %a551 + store { ptr, i64, i64 } %t542, ptr %a554 + store { ptr, i64, i64 } %t552, ptr %a555 + call void @finch_str_concat(ptr %a553, ptr %a554, ptr %a555) + %t556 = load { ptr, i64, i64 }, ptr %a553 + %t557 = call { ptr, i64, i64 } @finch.gen.op(ptr %t502, { ptr, i64, i64 } %t556) + store { ptr, i64, i64 } %t557, ptr %a268 + br label %for.step7417 +for.step7417: + %t558 = load i64, ptr %a272 + %t559 = add i64 %t558, 1 + store i64 %t559, ptr %a272 + br label %for.cond7415 +for.end7418: + %t560 = load { ptr, i64, i64 }, ptr %a268 + store { ptr, i64, i64 } %t560, ptr %a561 + call void @finch_str_copy(ptr %a562, ptr %a561) + %t563 = load { ptr, i64, i64 }, ptr %a562 + %t564 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t563, 0 + %t565 = load %S.ast.Type, ptr %a59 + store %S.ast.Type %t565, ptr %a566 + call void @finch.copy.S_ast_Type(ptr %a567, ptr %a566) + %t568 = load %S.ast.Type, ptr %a567 + %t569 = insertvalue %S.gen.Val %t564, %S.ast.Type %t568, 1 + %t570 = load ptr, ptr %a1 + %t571 = load %S.ast.Type, ptr %a59 + %t572 = call i1 @finch.gen.owning(ptr %t570, %S.ast.Type %t571) + %t573 = insertvalue %S.gen.Val %t569, i1 %t572, 2 + ret %S.gen.Val %t573 +} + +define internal %S.gen.Val @finch.gen.method(ptr %p0, %S.ast.Node %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a10 = alloca %S.ast.Node, align 16 + %a11 = alloca %S.ast.Node, align 16 + %a13 = alloca %S.ast.Node, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca i64, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca i64, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca i64, align 16 + %a119 = alloca i64, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca i64, align 16 + %a138 = alloca %S.ast.Node, align 16 + %a139 = alloca %S.ast.Node, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca i64, align 16 + %a197 = alloca i64, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca %S.gen.Ref, align 16 + %a214 = alloca %S.ast.Type, align 16 + %a215 = alloca %S.ast.Type, align 16 + %a217 = alloca %S.ast.Type, align 16 + %a223 = alloca %S.ast.Type, align 16 + %a224 = alloca %S.ast.Type, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca i64, align 16 + %a247 = alloca i64, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca %S.gen.Val, align 16 + %a285 = alloca %S.gen.Val, align 16 + %a287 = alloca %S.gen.Val, align 16 + %a297 = alloca %S.ast.Type, align 16 + %a298 = alloca %S.ast.Type, align 16 + %a309 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca i64, align 16 + %a328 = alloca i64, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a344 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca %S.ast.Type, align 16 + %a359 = alloca %S.ast.Type, align 16 + %a361 = alloca %S.ast.Type, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a382 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a405 = alloca { ptr, i64, i64 }, align 16 + %a406 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a410 = alloca { ptr, i64, i64 }, align 16 + %a415 = alloca { ptr, i64, i64 }, align 16 + %a416 = alloca { ptr, i64, i64 }, align 16 + %a417 = alloca { ptr, i64, i64 }, align 16 + %a419 = alloca { ptr, i64, i64 }, align 16 + %a420 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca %S.ast.Type, align 16 + %a432 = alloca %S.ast.Type, align 16 + %a435 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a441 = alloca { ptr, i64, i64 }, align 16 + %a446 = alloca { ptr, i64, i64 }, align 16 + %a447 = alloca { ptr, i64, i64 }, align 16 + %a456 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a465 = alloca { ptr, i64, i64 }, align 16 + %a466 = alloca { ptr, i64, i64 }, align 16 + %a471 = alloca { ptr, i64, i64 }, align 16 + %a472 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca i64, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a490 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca i64, align 16 + %a531 = alloca i64, align 16 + %a552 = alloca { ptr, i64, i64 }, align 16 + %a556 = alloca i64, align 16 + %a564 = alloca %S.gen.FnSig, align 16 + %a569 = alloca { ptr, i64, i64 }, align 16 + %a570 = alloca { ptr, i64, i64 }, align 16 + %a577 = alloca { ptr, i64, i64 }, align 16 + %a578 = alloca { ptr, i64, i64 }, align 16 + %a585 = alloca { ptr, i64, i64 }, align 16 + %a586 = alloca { ptr, i64, i64 }, align 16 + %a601 = alloca { ptr, i64, i64 }, align 16 + %a602 = alloca { ptr, i64, i64 }, align 16 + %a603 = alloca { ptr, i64, i64 }, align 16 + %a605 = alloca { ptr, i64, i64 }, align 16 + %a606 = alloca { ptr, i64, i64 }, align 16 + %a607 = alloca { ptr, i64, i64 }, align 16 + %a611 = alloca { ptr, i64, i64 }, align 16 + %a612 = alloca { ptr, i64, i64 }, align 16 + %a613 = alloca { ptr, i64, i64 }, align 16 + %a615 = alloca { ptr, i64, i64 }, align 16 + %a616 = alloca { ptr, i64, i64 }, align 16 + %a617 = alloca { ptr, i64, i64 }, align 16 + %a621 = alloca { ptr, i64, i64 }, align 16 + %a622 = alloca { ptr, i64, i64 }, align 16 + %a623 = alloca { ptr, i64, i64 }, align 16 + %a625 = alloca { ptr, i64, i64 }, align 16 + %a626 = alloca { ptr, i64, i64 }, align 16 + %a627 = alloca { ptr, i64, i64 }, align 16 + %a631 = alloca { ptr, i64, i64 }, align 16 + %a632 = alloca { ptr, i64, i64 }, align 16 + %a633 = alloca { ptr, i64, i64 }, align 16 + %a635 = alloca { ptr, i64, i64 }, align 16 + %a636 = alloca { ptr, i64, i64 }, align 16 + %a637 = alloca { ptr, i64, i64 }, align 16 + %a643 = alloca { ptr, i64, i64 }, align 16 + %a644 = alloca { ptr, i64, i64 }, align 16 + %a645 = alloca { ptr, i64, i64 }, align 16 + %a647 = alloca { ptr, i64, i64 }, align 16 + %a648 = alloca { ptr, i64, i64 }, align 16 + %a649 = alloca { ptr, i64, i64 }, align 16 + %a653 = alloca { ptr, i64, i64 }, align 16 + %a654 = alloca { ptr, i64, i64 }, align 16 + %a655 = alloca { ptr, i64, i64 }, align 16 + %a657 = alloca { ptr, i64, i64 }, align 16 + %a658 = alloca { ptr, i64, i64 }, align 16 + %a659 = alloca { ptr, i64, i64 }, align 16 + %a663 = alloca { ptr, i64, i64 }, align 16 + %a664 = alloca { ptr, i64, i64 }, align 16 + %a665 = alloca { ptr, i64, i64 }, align 16 + %a667 = alloca { ptr, i64, i64 }, align 16 + %a668 = alloca { ptr, i64, i64 }, align 16 + %a669 = alloca { ptr, i64, i64 }, align 16 + %a672 = alloca { ptr, i64, i64 }, align 16 + %a673 = alloca { ptr, i64, i64 }, align 16 + %a675 = alloca { ptr, i64, i64 }, align 16 + %a676 = alloca { ptr, i64, i64 }, align 16 + %a677 = alloca { ptr, i64, i64 }, align 16 + %a679 = alloca { ptr, i64, i64 }, align 16 + %a680 = alloca { ptr, i64, i64 }, align 16 + %a681 = alloca { ptr, i64, i64 }, align 16 + %a696 = alloca { ptr, i64, i64 }, align 16 + %a697 = alloca { ptr, i64, i64 }, align 16 + %a702 = alloca { ptr, i64, i64 }, align 16 + %a703 = alloca { ptr, i64, i64 }, align 16 + %a715 = alloca { ptr, i64, i64 }, align 16 + %a716 = alloca { ptr, i64, i64 }, align 16 + %a717 = alloca { ptr, i64, i64 }, align 16 + %a721 = alloca { ptr, i64, i64 }, align 16 + %a722 = alloca { ptr, i64, i64 }, align 16 + %a723 = alloca { ptr, i64, i64 }, align 16 + %a725 = alloca { ptr, i64, i64 }, align 16 + %a726 = alloca { ptr, i64, i64 }, align 16 + %a727 = alloca { ptr, i64, i64 }, align 16 + %a731 = alloca { ptr, i64, i64 }, align 16 + %a738 = alloca i64, align 16 + %a749 = alloca { ptr, i64, i64 }, align 16 + %a750 = alloca { ptr, i64, i64 }, align 16 + %a751 = alloca { ptr, i64, i64 }, align 16 + %a753 = alloca { ptr, i64, i64 }, align 16 + %a754 = alloca { ptr, i64, i64 }, align 16 + %a755 = alloca { ptr, i64, i64 }, align 16 + %a762 = alloca { ptr, i64, i64 }, align 16 + %a763 = alloca { ptr, i64, i64 }, align 16 + %a764 = alloca { ptr, i64, i64 }, align 16 + %a768 = alloca { ptr, i64, i64 }, align 16 + %a769 = alloca { ptr, i64, i64 }, align 16 + %a770 = alloca { ptr, i64, i64 }, align 16 + %a780 = alloca { ptr, i64, i64 }, align 16 + %a781 = alloca { ptr, i64, i64 }, align 16 + %a782 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + %t3 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t4 = load { ptr, i64, i64 }, ptr %t3 + %t5 = extractvalue { ptr, i64, i64 } %t4, 1 + %t6 = icmp uge i64 0, %t5 + br i1 %t6, label %range7481, label %inrange7482 +range7481: + call void @finch_panic_index(ptr @.str.4932, i64 4486, i64 0, i64 %t5) + unreachable +inrange7482: + %t7 = extractvalue { ptr, i64, i64 } %t4, 0 + %t8 = getelementptr inbounds %S.ast.Node, ptr %t7, i64 0 + %t9 = load %S.ast.Node, ptr %t8 + store %S.ast.Node %t9, ptr %a10 + call void @finch.copy.S_ast_Node(ptr %a11, ptr %a10) + %t12 = load %S.ast.Node, ptr %a11 + store %S.ast.Node %t12, ptr %a13 + %t14 = getelementptr inbounds %S.ast.Node, ptr %a13, i32 0, i32 0 + %t15 = load { ptr, i64, i64 }, ptr %t14 + store { ptr, i64, i64 } %t15, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.4933, i64 3, i64 0 }, ptr %a17 + %t18 = call i32 @finch_str_eq(ptr %a16, ptr %a17) + %t19 = icmp ne i32 %t18, 0 + br label %logic.from7483 +logic.from7483: + br i1 %t19, label %logic.rhs7484, label %logic.end7485 +logic.rhs7484: + %t20 = load ptr, ptr %a1 + %t21 = getelementptr inbounds %S.ast.Node, ptr %a13, i32 0, i32 1 + %t22 = load { ptr, i64, i64 }, ptr %t21 + %t23 = call i64 @finch.gen.lookup(ptr %t20, { ptr, i64, i64 } %t22) + %t24 = icmp slt i64 %t23, 0 + br label %logic.rend7486 +logic.rend7486: + br label %logic.end7485 +logic.end7485: + %t25 = phi i1 [ false, %logic.from7483 ], [ %t24, %logic.rend7486 ] + br i1 %t25, label %then7487, label %endif7489 +then7487: + %t26 = getelementptr inbounds %S.ast.Node, ptr %a13, i32 0, i32 1 + %t27 = load { ptr, i64, i64 }, ptr %t26 + store { ptr, i64, i64 } %t27, ptr %a28 + call void @finch_str_copy(ptr %a29, ptr %a28) + %t30 = load { ptr, i64, i64 }, ptr %a29 + store { ptr, i64, i64 } %t30, ptr %a31 + %t32 = load ptr, ptr %a1 + %t33 = load { ptr, i64, i64 }, ptr %a31 + %t34 = call i1 @finch.gen.imports(ptr %t32, { ptr, i64, i64 } %t33) + %t35 = xor i1 %t34, true + br i1 %t35, label %then7490, label %endif7492 +then7490: + %t36 = load ptr, ptr %a1 + %t37 = load %S.ast.Node, ptr %a13 + %t38 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } { ptr @.str.4934, i64 38, i64 0 }, ptr %a40 + store { ptr, i64, i64 } %t38, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + store { ptr, i64, i64 } %t42, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.4935, i64 32, i64 0 }, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + %t47 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t46, ptr %a49 + store { ptr, i64, i64 } %t47, ptr %a50 + call void @finch_str_concat(ptr %a48, ptr %a49, ptr %a50) + %t51 = load { ptr, i64, i64 }, ptr %a48 + store { ptr, i64, i64 } %t51, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.4936, i64 13, i64 0 }, ptr %a54 + call void @finch_str_concat(ptr %a52, ptr %a53, ptr %a54) + %t55 = load { ptr, i64, i64 }, ptr %a52 + call void @finch.gen.fail(ptr %t36, %S.ast.Node %t37, { ptr, i64, i64 } %t55) + br label %endif7492 +endif7492: + %t56 = load ptr, ptr %a1 + %t57 = load { ptr, i64, i64 }, ptr %a31 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t59 = load { ptr, i64, i64 }, ptr %t58 + %t60 = call i64 @finch.gen.findFn(ptr %t56, { ptr, i64, i64 } %t57, { ptr, i64, i64 } %t59) + store i64 %t60, ptr %a61 + %t62 = load i64, ptr %a61 + %t63 = icmp sge i64 %t62, 0 + br i1 %t63, label %then7493, label %endif7495 +then7493: + %t64 = load ptr, ptr %a1 + %t65 = load i64, ptr %a61 + %t66 = load %S.ast.Node, ptr %a2 + %t67 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t67, ptr %a69 + store { ptr, i64, i64 } { ptr @.str.4937, i64 1, i64 0 }, ptr %a70 + call void @finch_str_concat(ptr %a68, ptr %a69, ptr %a70) + %t71 = load { ptr, i64, i64 }, ptr %a68 + %t72 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t73 = load { ptr, i64, i64 }, ptr %t72 + store { ptr, i64, i64 } %t71, ptr %a75 + store { ptr, i64, i64 } %t73, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + %t78 = call %S.gen.Val @finch.gen.callFn(ptr %t64, i64 %t65, %S.ast.Node %t66, i64 1, { ptr, i64, i64 } %t77, { ptr, i64, i64 } { ptr @.str.4938, i64 0, i64 0 }, { ptr, i64, i64 } { ptr @.str.4939, i64 0, i64 0 }) + ret %S.gen.Val %t78 +endif7495: + %t79 = load ptr, ptr %a1 + %t80 = load { ptr, i64, i64 }, ptr %a31 + %t81 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t82 = load { ptr, i64, i64 }, ptr %t81 + %t83 = call i64 @finch.gen.findTemplate(ptr %t79, { ptr, i64, i64 } %t80, { ptr, i64, i64 } %t82, { ptr, i64, i64 } { ptr @.str.4940, i64 0, i64 0 }, i1 false) + store i64 %t83, ptr %a84 + %t85 = load i64, ptr %a84 + %t86 = icmp sge i64 %t85, 0 + br i1 %t86, label %then7496, label %endif7498 +then7496: + %t87 = load ptr, ptr %a1 + %t88 = load %S.ast.Node, ptr %a2 + %t89 = load i64, ptr %a84 + %t90 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } %t90, ptr %a92 + store { ptr, i64, i64 } { ptr @.str.4941, i64 1, i64 0 }, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + %t95 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t96 = load { ptr, i64, i64 }, ptr %t95 + store { ptr, i64, i64 } %t94, ptr %a98 + store { ptr, i64, i64 } %t96, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + %t101 = call %S.gen.Val @finch.gen.genericCall(ptr %t87, %S.ast.Node %t88, i64 %t89, i64 1, { ptr, i64, i64 } %t100) + ret %S.gen.Val %t101 +endif7498: + %t102 = load ptr, ptr %a1 + %t103 = load { ptr, i64, i64 }, ptr %a31 + %t104 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t105 = load { ptr, i64, i64 }, ptr %t104 + %t106 = call i64 @finch.gen.findEnum(ptr %t102, { ptr, i64, i64 } %t103, { ptr, i64, i64 } %t105) + store i64 %t106, ptr %a107 + %t108 = load i64, ptr %a107 + %t109 = icmp sge i64 %t108, 0 + br i1 %t109, label %then7499, label %endif7501 +then7499: + %t110 = load ptr, ptr %a1 + %t111 = load %S.ast.Node, ptr %a2 + %t112 = load i64, ptr %a107 + %t113 = call %S.gen.Val @finch.gen.enumFrom(ptr %t110, %S.ast.Node %t111, i64 %t112) + ret %S.gen.Val %t113 +endif7501: + %t114 = load ptr, ptr %a1 + %t115 = load { ptr, i64, i64 }, ptr %a31 + %t116 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t117 = load { ptr, i64, i64 }, ptr %t116 + %t118 = call i64 @finch.gen.findStruct(ptr %t114, { ptr, i64, i64 } %t115, { ptr, i64, i64 } %t117) + store i64 %t118, ptr %a119 + %t120 = load i64, ptr %a119 + %t121 = icmp sge i64 %t120, 0 + br i1 %t121, label %then7502, label %endif7504 +then7502: + store { ptr, i64, i64 } zeroinitializer, ptr %a122 + %t123 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t124 = getelementptr inbounds { ptr, i64, i64 }, ptr %t123, i32 0, i32 1 + %t125 = load i64, ptr %t124 + store i64 1, ptr %a126 + br label %for.cond7505 +for.cond7505: + %t127 = load i64, ptr %a126 + %t128 = icmp slt i64 %t127, %t125 + br i1 %t128, label %for.body7506, label %for.end7508 +for.body7506: + %t129 = getelementptr inbounds { ptr, i64, i64 }, ptr %a122, i32 0, i32 1 + %t130 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t131 = load i64, ptr %a126 + %t132 = load { ptr, i64, i64 }, ptr %t130 + %t133 = extractvalue { ptr, i64, i64 } %t132, 1 + %t134 = icmp uge i64 %t131, %t133 + br i1 %t134, label %range7509, label %inrange7510 +range7509: + call void @finch_panic_index(ptr @.str.4942, i64 4508, i64 %t131, i64 %t133) + unreachable +inrange7510: + %t135 = extractvalue { ptr, i64, i64 } %t132, 0 + %t136 = getelementptr inbounds %S.ast.Node, ptr %t135, i64 %t131 + %t137 = load %S.ast.Node, ptr %t136 + store %S.ast.Node %t137, ptr %a138 + call void @finch.copy.S_ast_Node(ptr %a139, ptr %a138) + %t140 = load %S.ast.Node, ptr %a139 + %t141 = load i64, ptr %t129 + %t142 = add i64 %t141, 1 + call void @finch_arr_reserve(ptr %a122, i64 %t142, i64 ptrtoint (ptr getelementptr (%S.ast.Node, ptr null, i32 1) to i64)) + %t143 = load ptr, ptr %a122 + %t144 = getelementptr inbounds %S.ast.Node, ptr %t143, i64 %t141 + store %S.ast.Node %t140, ptr %t144 + store i64 %t142, ptr %t129 + br label %for.step7507 +for.step7507: + %t145 = load i64, ptr %a126 + %t146 = add i64 %t145, 1 + store i64 %t146, ptr %a126 + br label %for.cond7505 +for.end7508: + %t147 = load ptr, ptr %a1 + %t148 = load i64, ptr %a119 + %t149 = load { ptr, i64, i64 }, ptr %a122 + %t150 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 10 + %t151 = load { ptr, i64, i64 }, ptr %t150 + %t152 = load %S.ast.Node, ptr %a2 + %t153 = call %S.gen.Val @finch.gen.construct(ptr %t147, i64 %t148, { ptr, i64, i64 } %t149, { ptr, i64, i64 } %t151, %S.ast.Node %t152) + ret %S.gen.Val %t153 +endif7504: + %t154 = load ptr, ptr %a1 + %t155 = load %S.ast.Node, ptr %a2 + %t156 = load { ptr, i64, i64 }, ptr %a31 + store { ptr, i64, i64 } { ptr @.str.4943, i64 12, i64 0 }, ptr %a158 + store { ptr, i64, i64 } %t156, ptr %a159 + call void @finch_str_concat(ptr %a157, ptr %a158, ptr %a159) + %t160 = load { ptr, i64, i64 }, ptr %a157 + store { ptr, i64, i64 } %t160, ptr %a162 + store { ptr, i64, i64 } { ptr @.str.4944, i64 35, i64 0 }, ptr %a163 + call void @finch_str_concat(ptr %a161, ptr %a162, ptr %a163) + %t164 = load { ptr, i64, i64 }, ptr %a161 + %t165 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t166 = load { ptr, i64, i64 }, ptr %t165 + store { ptr, i64, i64 } %t164, ptr %a168 + store { ptr, i64, i64 } %t166, ptr %a169 + call void @finch_str_concat(ptr %a167, ptr %a168, ptr %a169) + %t170 = load { ptr, i64, i64 }, ptr %a167 + store { ptr, i64, i64 } %t170, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.4945, i64 1, i64 0 }, ptr %a173 + call void @finch_str_concat(ptr %a171, ptr %a172, ptr %a173) + %t174 = load { ptr, i64, i64 }, ptr %a171 + call void @finch.gen.fail(ptr %t154, %S.ast.Node %t155, { ptr, i64, i64 } %t174) + br label %endif7489 +endif7489: + %t175 = mul i64 8, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t176 = call ptr @finch_alloc(i64 %t175) + %t177 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 0 + store { ptr, i64, i64 } { ptr @.str.4946, i64 4, i64 0 }, ptr %t177 + %t178 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 1 + store { ptr, i64, i64 } { ptr @.str.4947, i64 3, i64 0 }, ptr %t178 + %t179 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 2 + store { ptr, i64, i64 } { ptr @.str.4948, i64 6, i64 0 }, ptr %t179 + %t180 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 3 + store { ptr, i64, i64 } { ptr @.str.4949, i64 6, i64 0 }, ptr %t180 + %t181 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 4 + store { ptr, i64, i64 } { ptr @.str.4950, i64 5, i64 0 }, ptr %t181 + %t182 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 5 + store { ptr, i64, i64 } { ptr @.str.4951, i64 6, i64 0 }, ptr %t182 + %t183 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 6 + store { ptr, i64, i64 } { ptr @.str.4952, i64 4, i64 0 }, ptr %t183 + %t184 = getelementptr inbounds { ptr, i64, i64 }, ptr %t176, i64 7 + store { ptr, i64, i64 } { ptr @.str.4953, i64 7, i64 0 }, ptr %t184 + %t185 = insertvalue { ptr, i64, i64 } undef, ptr %t176, 0 + %t186 = insertvalue { ptr, i64, i64 } %t185, i64 8, 1 + %t187 = insertvalue { ptr, i64, i64 } %t186, i64 8, 2 + store { ptr, i64, i64 } %t187, ptr %a188 + %t189 = load ptr, ptr %a1 + %t190 = load %S.ast.Node, ptr %a13 + %t191 = getelementptr inbounds { ptr, i64, i64 }, ptr %a188, i32 0, i32 1 + %t192 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t193 = load { ptr, i64, i64 }, ptr %t192 + store i64 -1, ptr %a194 + %t195 = load i64, ptr %t191 + %t196 = load ptr, ptr %a188 + store i64 0, ptr %a197 + br label %find.cond7511 +find.cond7511: + %t198 = load i64, ptr %a197 + %t199 = icmp slt i64 %t198, %t195 + br i1 %t199, label %find.body7512, label %find.end7515 +find.body7512: + %t200 = getelementptr inbounds { ptr, i64, i64 }, ptr %t196, i64 %t198 + %t201 = load { ptr, i64, i64 }, ptr %t200 + store { ptr, i64, i64 } %t201, ptr %a202 + store { ptr, i64, i64 } %t193, ptr %a203 + %t204 = call i32 @finch_str_eq(ptr %a202, ptr %a203) + %t205 = icmp ne i32 %t204, 0 + br i1 %t205, label %find.hit7513, label %find.next7514 +find.hit7513: + store i64 %t198, ptr %a194 + br label %find.end7515 +find.next7514: + %t206 = add i64 %t198, 1 + store i64 %t206, ptr %a197 + br label %find.cond7511 +find.end7515: + %t207 = load i64, ptr %a194 + %t208 = icmp sge i64 %t207, 0 + %t209 = call %S.gen.Ref @finch.gen.ref(ptr %t189, %S.ast.Node %t190, i1 %t208) + store %S.gen.Ref %t209, ptr %a210 + %t211 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 2 + %t212 = getelementptr inbounds %S.gen.Val, ptr %t211, i32 0, i32 1 + %t213 = load %S.ast.Type, ptr %t212 + store %S.ast.Type %t213, ptr %a214 + call void @finch.copy.S_ast_Type(ptr %a215, ptr %a214) + %t216 = load %S.ast.Type, ptr %a215 + store %S.ast.Type %t216, ptr %a217 + %t218 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 0 + %t219 = load i1, ptr %t218 + br i1 %t219, label %then7516, label %endif7518 +then7516: + %t220 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 1 + %t221 = getelementptr inbounds %S.gen.Place, ptr %t220, i32 0, i32 1 + %t222 = load %S.ast.Type, ptr %t221 + store %S.ast.Type %t222, ptr %a223 + call void @finch.copy.S_ast_Type(ptr %a224, ptr %a223) + %t225 = load %S.ast.Type, ptr %a224 + store %S.ast.Type %t225, ptr %a217 + br label %endif7518 +endif7518: + %t226 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t227 = load { ptr, i64, i64 }, ptr %t226 + store { ptr, i64, i64 } %t227, ptr %a228 + store { ptr, i64, i64 } { ptr @.str.4954, i64 5, i64 0 }, ptr %a229 + %t230 = call i32 @finch_str_eq(ptr %a228, ptr %a229) + %t231 = icmp ne i32 %t230, 0 + br i1 %t231, label %then7519, label %endif7521 +then7519: + store { ptr, i64, i64 } { ptr @.str.4955, i64 0, i64 0 }, ptr %a232 + %t233 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 0 + %t234 = load i1, ptr %t233 + br i1 %t234, label %then7522, label %else7523 +then7522: + %t235 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 1 + %t236 = getelementptr inbounds %S.gen.Place, ptr %t235, i32 0, i32 0 + %t237 = load { ptr, i64, i64 }, ptr %t236 + store { ptr, i64, i64 } %t237, ptr %a238 + call void @finch_str_copy(ptr %a239, ptr %a238) + %t240 = load { ptr, i64, i64 }, ptr %a239 + store { ptr, i64, i64 } %t240, ptr %a232 + br label %endif7524 +else7523: + %t241 = getelementptr inbounds { ptr, i64, i64 }, ptr %a188, i32 0, i32 1 + %t242 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t243 = load { ptr, i64, i64 }, ptr %t242 + store i64 -1, ptr %a244 + %t245 = load i64, ptr %t241 + %t246 = load ptr, ptr %a188 + store i64 0, ptr %a247 + br label %find.cond7525 +find.cond7525: + %t248 = load i64, ptr %a247 + %t249 = icmp slt i64 %t248, %t245 + br i1 %t249, label %find.body7526, label %find.end7529 +find.body7526: + %t250 = getelementptr inbounds { ptr, i64, i64 }, ptr %t246, i64 %t248 + %t251 = load { ptr, i64, i64 }, ptr %t250 + store { ptr, i64, i64 } %t251, ptr %a252 + store { ptr, i64, i64 } %t243, ptr %a253 + %t254 = call i32 @finch_str_eq(ptr %a252, ptr %a253) + %t255 = icmp ne i32 %t254, 0 + br i1 %t255, label %find.hit7527, label %find.next7528 +find.hit7527: + store i64 %t248, ptr %a244 + br label %find.end7529 +find.next7528: + %t256 = add i64 %t248, 1 + store i64 %t256, ptr %a247 + br label %find.cond7525 +find.end7529: + %t257 = load i64, ptr %a244 + %t258 = icmp sge i64 %t257, 0 + br i1 %t258, label %then7530, label %endif7532 +then7530: + %t259 = load ptr, ptr %a1 + %t260 = load %S.ast.Node, ptr %a2 + %t261 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t262 = load { ptr, i64, i64 }, ptr %t261 + store { ptr, i64, i64 } %t262, ptr %a264 + store { ptr, i64, i64 } { ptr @.str.4956, i64 63, i64 0 }, ptr %a265 + call void @finch_str_concat(ptr %a263, ptr %a264, ptr %a265) + %t266 = load { ptr, i64, i64 }, ptr %a263 + call void @finch.gen.fail(ptr %t259, %S.ast.Node %t260, { ptr, i64, i64 } %t266) + br label %endif7532 +endif7532: + %t267 = load ptr, ptr %a1 + %t268 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 2 + %t269 = load %S.gen.Val, ptr %t268 + %t270 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t267, %S.gen.Val %t269) + store { ptr, i64, i64 } %t270, ptr %a232 + br label %endif7524 +endif7524: + %t271 = load ptr, ptr %a1 + %t272 = load %S.ast.Node, ptr %a2 + %t273 = load { ptr, i64, i64 }, ptr %a232 + %t274 = load %S.ast.Type, ptr %a217 + %t275 = call %S.gen.Val @finch.gen.arrayMethod(ptr %t271, %S.ast.Node %t272, { ptr, i64, i64 } %t273, %S.ast.Type %t274) + ret %S.gen.Val %t275 +endif7521: + %t276 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t277 = load { ptr, i64, i64 }, ptr %t276 + store { ptr, i64, i64 } %t277, ptr %a278 + store { ptr, i64, i64 } { ptr @.str.4957, i64 3, i64 0 }, ptr %a279 + %t280 = call i32 @finch_str_eq(ptr %a278, ptr %a279) + %t281 = icmp ne i32 %t280, 0 + br i1 %t281, label %then7533, label %endif7535 +then7533: + %t282 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 2 + %t283 = load %S.gen.Val, ptr %t282 + store %S.gen.Val %t283, ptr %a284 + call void @finch.copy.S_gen_Val(ptr %a285, ptr %a284) + %t286 = load %S.gen.Val, ptr %a285 + store %S.gen.Val %t286, ptr %a287 + %t288 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 0 + %t289 = load i1, ptr %t288 + br i1 %t289, label %then7536, label %endif7538 +then7536: + %t290 = load ptr, ptr %a1 + %t291 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 1 + %t292 = getelementptr inbounds %S.gen.Place, ptr %t291, i32 0, i32 0 + %t293 = load { ptr, i64, i64 }, ptr %t292 + %t294 = call { ptr, i64, i64 } @finch.gen.load(ptr %t290, { ptr, i64, i64 } { ptr @.str.4958, i64 17, i64 0 }, { ptr, i64, i64 } %t293) + %t295 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t294, 0 + %t296 = load %S.ast.Type, ptr %a217 + store %S.ast.Type %t296, ptr %a297 + call void @finch.copy.S_ast_Type(ptr %a298, ptr %a297) + %t299 = load %S.ast.Type, ptr %a298 + %t300 = insertvalue %S.gen.Val %t295, %S.ast.Type %t299, 1 + store %S.gen.Val %t300, ptr %a287 + br label %endif7538 +endif7538: + %t301 = load ptr, ptr %a1 + %t302 = load %S.ast.Node, ptr %a2 + %t303 = load ptr, ptr %a1 + %t304 = load %S.gen.Val, ptr %a287 + %t305 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t303, %S.gen.Val %t304) + %t306 = call %S.gen.Val @finch.gen.strMethod(ptr %t301, %S.ast.Node %t302, { ptr, i64, i64 } %t305) + ret %S.gen.Val %t306 +endif7535: + %t307 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t308 = load { ptr, i64, i64 }, ptr %t307 + store { ptr, i64, i64 } %t308, ptr %a309 + store { ptr, i64, i64 } { ptr @.str.4959, i64 3, i64 0 }, ptr %a310 + %t311 = call i32 @finch_str_eq(ptr %a309, ptr %a310) + %t312 = icmp ne i32 %t311, 0 + br i1 %t312, label %then7539, label %endif7541 +then7539: + store { ptr, i64, i64 } { ptr @.str.4960, i64 0, i64 0 }, ptr %a313 + %t314 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 0 + %t315 = load i1, ptr %t314 + br i1 %t315, label %then7542, label %else7543 +then7542: + %t316 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 1 + %t317 = getelementptr inbounds %S.gen.Place, ptr %t316, i32 0, i32 0 + %t318 = load { ptr, i64, i64 }, ptr %t317 + store { ptr, i64, i64 } %t318, ptr %a319 + call void @finch_str_copy(ptr %a320, ptr %a319) + %t321 = load { ptr, i64, i64 }, ptr %a320 + store { ptr, i64, i64 } %t321, ptr %a313 + br label %endif7544 +else7543: + %t322 = getelementptr inbounds { ptr, i64, i64 }, ptr %a188, i32 0, i32 1 + %t323 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t324 = load { ptr, i64, i64 }, ptr %t323 + store i64 -1, ptr %a325 + %t326 = load i64, ptr %t322 + %t327 = load ptr, ptr %a188 + store i64 0, ptr %a328 + br label %find.cond7545 +find.cond7545: + %t329 = load i64, ptr %a328 + %t330 = icmp slt i64 %t329, %t326 + br i1 %t330, label %find.body7546, label %find.end7549 +find.body7546: + %t331 = getelementptr inbounds { ptr, i64, i64 }, ptr %t327, i64 %t329 + %t332 = load { ptr, i64, i64 }, ptr %t331 + store { ptr, i64, i64 } %t332, ptr %a333 + store { ptr, i64, i64 } %t324, ptr %a334 + %t335 = call i32 @finch_str_eq(ptr %a333, ptr %a334) + %t336 = icmp ne i32 %t335, 0 + br i1 %t336, label %find.hit7547, label %find.next7548 +find.hit7547: + store i64 %t329, ptr %a325 + br label %find.end7549 +find.next7548: + %t337 = add i64 %t329, 1 + store i64 %t337, ptr %a328 + br label %find.cond7545 +find.end7549: + %t338 = load i64, ptr %a325 + %t339 = icmp sge i64 %t338, 0 + br i1 %t339, label %then7550, label %endif7552 +then7550: + %t340 = load ptr, ptr %a1 + %t341 = load %S.ast.Node, ptr %a2 + %t342 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t343 = load { ptr, i64, i64 }, ptr %t342 + store { ptr, i64, i64 } %t343, ptr %a345 + store { ptr, i64, i64 } { ptr @.str.4961, i64 61, i64 0 }, ptr %a346 + call void @finch_str_concat(ptr %a344, ptr %a345, ptr %a346) + %t347 = load { ptr, i64, i64 }, ptr %a344 + call void @finch.gen.fail(ptr %t340, %S.ast.Node %t341, { ptr, i64, i64 } %t347) + br label %endif7552 +endif7552: + %t348 = load ptr, ptr %a1 + %t349 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 2 + %t350 = load %S.gen.Val, ptr %t349 + %t351 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t348, %S.gen.Val %t350) + store { ptr, i64, i64 } %t351, ptr %a313 + br label %endif7544 +endif7544: + %t352 = load ptr, ptr %a1 + %t353 = load %S.ast.Node, ptr %a2 + %t354 = load { ptr, i64, i64 }, ptr %a313 + %t355 = load %S.ast.Type, ptr %a217 + %t356 = call %S.gen.Val @finch.gen.mapMethod(ptr %t352, %S.ast.Node %t353, { ptr, i64, i64 } %t354, %S.ast.Type %t355) + ret %S.gen.Val %t356 +endif7541: + %t357 = load %S.ast.Type, ptr %a217 + store %S.ast.Type %t357, ptr %a358 + call void @finch.copy.S_ast_Type(ptr %a359, ptr %a358) + %t360 = load %S.ast.Type, ptr %a359 + store %S.ast.Type %t360, ptr %a361 + store { ptr, i64, i64 } { ptr @.str.4962, i64 0, i64 0 }, ptr %a362 + %t363 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t364 = load { ptr, i64, i64 }, ptr %t363 + store { ptr, i64, i64 } %t364, ptr %a365 + store { ptr, i64, i64 } { ptr @.str.4963, i64 3, i64 0 }, ptr %a366 + %t367 = call i32 @finch_str_eq(ptr %a365, ptr %a366) + %t368 = icmp ne i32 %t367, 0 + br label %logic.from7553 +logic.from7553: + br i1 %t368, label %logic.rhs7554, label %logic.end7555 +logic.rhs7554: + %t369 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 1 + %t370 = getelementptr inbounds { ptr, i64, i64 }, ptr %t369, i32 0, i32 1 + %t371 = load i64, ptr %t370 + %t372 = icmp sgt i64 %t371, 0 + br label %logic.rend7556 +logic.rend7556: + br label %logic.end7555 +logic.end7555: + %t373 = phi i1 [ false, %logic.from7553 ], [ %t372, %logic.rend7556 ] + br label %logic.from7557 +logic.from7557: + br i1 %t373, label %logic.rhs7558, label %logic.end7559 +logic.rhs7558: + %t374 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 1 + %t375 = load { ptr, i64, i64 }, ptr %t374 + %t376 = extractvalue { ptr, i64, i64 } %t375, 1 + %t377 = icmp uge i64 0, %t376 + br i1 %t377, label %range7560, label %inrange7561 +range7560: + call void @finch_panic_index(ptr @.str.4964, i64 4553, i64 0, i64 %t376) + unreachable +inrange7561: + %t378 = extractvalue { ptr, i64, i64 } %t375, 0 + %t379 = getelementptr inbounds %S.ast.Type, ptr %t378, i64 0 + %t380 = getelementptr inbounds %S.ast.Type, ptr %t379, i32 0, i32 0 + %t381 = load { ptr, i64, i64 }, ptr %t380 + store { ptr, i64, i64 } %t381, ptr %a382 + store { ptr, i64, i64 } { ptr @.str.4965, i64 6, i64 0 }, ptr %a383 + %t384 = call i32 @finch_str_eq(ptr %a382, ptr %a383) + %t385 = icmp ne i32 %t384, 0 + br label %logic.rend7562 +logic.rend7562: + br label %logic.end7559 +logic.end7559: + %t386 = phi i1 [ false, %logic.from7557 ], [ %t385, %logic.rend7562 ] + br i1 %t386, label %then7563, label %else7564 +then7563: + %t387 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 2 + %t388 = getelementptr inbounds %S.gen.Val, ptr %t387, i32 0, i32 0 + %t389 = load { ptr, i64, i64 }, ptr %t388 + store { ptr, i64, i64 } %t389, ptr %a390 + call void @finch_str_copy(ptr %a391, ptr %a390) + %t392 = load { ptr, i64, i64 }, ptr %a391 + store { ptr, i64, i64 } %t392, ptr %a393 + %t394 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 0 + %t395 = load i1, ptr %t394 + br i1 %t395, label %then7566, label %endif7568 +then7566: + %t396 = load ptr, ptr %a1 + %t397 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 1 + %t398 = getelementptr inbounds %S.gen.Place, ptr %t397, i32 0, i32 0 + %t399 = load { ptr, i64, i64 }, ptr %t398 + %t400 = call { ptr, i64, i64 } @finch.gen.load(ptr %t396, { ptr, i64, i64 } { ptr @.str.4966, i64 3, i64 0 }, { ptr, i64, i64 } %t399) + store { ptr, i64, i64 } %t400, ptr %a393 + br label %endif7568 +endif7568: + %t401 = load ptr, ptr %a1 + %t402 = load ptr, ptr %a1 + %t403 = load { ptr, i64, i64 }, ptr %a393 + store { ptr, i64, i64 } { ptr @.str.4967, i64 12, i64 0 }, ptr %a405 + store { ptr, i64, i64 } %t403, ptr %a406 + call void @finch_str_concat(ptr %a404, ptr %a405, ptr %a406) + %t407 = load { ptr, i64, i64 }, ptr %a404 + store { ptr, i64, i64 } %t407, ptr %a409 + store { ptr, i64, i64 } { ptr @.str.4968, i64 6, i64 0 }, ptr %a410 + call void @finch_str_concat(ptr %a408, ptr %a409, ptr %a410) + %t411 = load { ptr, i64, i64 }, ptr %a408 + %t412 = call { ptr, i64, i64 } @finch.gen.op(ptr %t402, { ptr, i64, i64 } %t411) + %t413 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t414 = load { ptr, i64, i64 }, ptr %t413 + store { ptr, i64, i64 } { ptr @.str.4969, i64 8, i64 0 }, ptr %a416 + store { ptr, i64, i64 } %t414, ptr %a417 + call void @finch_str_concat(ptr %a415, ptr %a416, ptr %a417) + %t418 = load { ptr, i64, i64 }, ptr %a415 + store { ptr, i64, i64 } %t418, ptr %a420 + store { ptr, i64, i64 } { ptr @.str.4970, i64 20, i64 0 }, ptr %a421 + call void @finch_str_concat(ptr %a419, ptr %a420, ptr %a421) + %t422 = load { ptr, i64, i64 }, ptr %a419 + %t423 = load %S.ast.Node, ptr %a2 + call void @finch.gen.panicIf(ptr %t401, { ptr, i64, i64 } %t412, { ptr, i64, i64 } %t422, %S.ast.Node %t423) + %t424 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 1 + %t425 = load { ptr, i64, i64 }, ptr %t424 + %t426 = extractvalue { ptr, i64, i64 } %t425, 1 + %t427 = icmp uge i64 0, %t426 + br i1 %t427, label %range7569, label %inrange7570 +range7569: + call void @finch_panic_index(ptr @.str.4971, i64 4559, i64 0, i64 %t426) + unreachable +inrange7570: + %t428 = extractvalue { ptr, i64, i64 } %t425, 0 + %t429 = getelementptr inbounds %S.ast.Type, ptr %t428, i64 0 + %t430 = load %S.ast.Type, ptr %t429 + store %S.ast.Type %t430, ptr %a431 + call void @finch.copy.S_ast_Type(ptr %a432, ptr %a431) + %t433 = load %S.ast.Type, ptr %a432 + store %S.ast.Type %t433, ptr %a361 + %t434 = load { ptr, i64, i64 }, ptr %a393 + store { ptr, i64, i64 } %t434, ptr %a435 + call void @finch_str_copy(ptr %a436, ptr %a435) + %t437 = load { ptr, i64, i64 }, ptr %a436 + store { ptr, i64, i64 } %t437, ptr %a362 + br label %endif7565 +else7564: + %t438 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t439 = load { ptr, i64, i64 }, ptr %t438 + store { ptr, i64, i64 } %t439, ptr %a440 + store { ptr, i64, i64 } { ptr @.str.4972, i64 6, i64 0 }, ptr %a441 + %t442 = call i32 @finch_str_eq(ptr %a440, ptr %a441) + %t443 = icmp ne i32 %t442, 0 + br label %logic.from7571 +logic.from7571: + br i1 %t443, label %logic.end7573, label %logic.rhs7572 +logic.rhs7572: + %t444 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t445 = load { ptr, i64, i64 }, ptr %t444 + store { ptr, i64, i64 } %t445, ptr %a446 + store { ptr, i64, i64 } { ptr @.str.4973, i64 4, i64 0 }, ptr %a447 + %t448 = call i32 @finch_str_eq(ptr %a446, ptr %a447) + %t449 = icmp ne i32 %t448, 0 + br label %logic.rend7574 +logic.rend7574: + br label %logic.end7573 +logic.end7573: + %t450 = phi i1 [ true, %logic.from7571 ], [ %t449, %logic.rend7574 ] + br i1 %t450, label %then7575, label %endif7577 +then7575: + %t451 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 0 + %t452 = load i1, ptr %t451 + br i1 %t452, label %then7578, label %else7579 +then7578: + %t453 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 1 + %t454 = getelementptr inbounds %S.gen.Place, ptr %t453, i32 0, i32 0 + %t455 = load { ptr, i64, i64 }, ptr %t454 + store { ptr, i64, i64 } %t455, ptr %a456 + call void @finch_str_copy(ptr %a457, ptr %a456) + %t458 = load { ptr, i64, i64 }, ptr %a457 + store { ptr, i64, i64 } %t458, ptr %a362 + br label %endif7580 +else7579: + %t459 = load ptr, ptr %a1 + %t460 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 2 + %t461 = load %S.gen.Val, ptr %t460 + %t462 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t459, %S.gen.Val %t461) + store { ptr, i64, i64 } %t462, ptr %a362 + br label %endif7580 +endif7580: + br label %endif7577 +endif7577: + br label %endif7565 +endif7565: + %t463 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 0 + %t464 = load { ptr, i64, i64 }, ptr %t463 + store { ptr, i64, i64 } %t464, ptr %a465 + store { ptr, i64, i64 } { ptr @.str.4974, i64 6, i64 0 }, ptr %a466 + %t467 = call i32 @finch_str_eq(ptr %a465, ptr %a466) + %t468 = icmp ne i32 %t467, 0 + br label %logic.from7581 +logic.from7581: + br i1 %t468, label %logic.end7583, label %logic.rhs7582 +logic.rhs7582: + %t469 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 0 + %t470 = load { ptr, i64, i64 }, ptr %t469 + store { ptr, i64, i64 } %t470, ptr %a471 + store { ptr, i64, i64 } { ptr @.str.4975, i64 4, i64 0 }, ptr %a472 + %t473 = call i32 @finch_str_eq(ptr %a471, ptr %a472) + %t474 = icmp ne i32 %t473, 0 + br label %logic.rend7584 +logic.rend7584: + br label %logic.end7583 +logic.end7583: + %t475 = phi i1 [ true, %logic.from7581 ], [ %t474, %logic.rend7584 ] + br i1 %t475, label %then7585, label %endif7587 +then7585: + %t476 = load ptr, ptr %a1 + %t477 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 3 + %t478 = load { ptr, i64, i64 }, ptr %t477 + %t479 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 2 + %t480 = load { ptr, i64, i64 }, ptr %t479 + %t481 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t482 = load { ptr, i64, i64 }, ptr %t481 + %t483 = call i64 @finch.gen.findMethod(ptr %t476, { ptr, i64, i64 } %t478, { ptr, i64, i64 } %t480, { ptr, i64, i64 } %t482) + store i64 %t483, ptr %a484 + %t485 = load i64, ptr %a484 + %t486 = icmp slt i64 %t485, 0 + br label %logic.from7588 +logic.from7588: + br i1 %t486, label %logic.rhs7589, label %logic.end7590 +logic.rhs7589: + %t487 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 0 + %t488 = load { ptr, i64, i64 }, ptr %t487 + store { ptr, i64, i64 } %t488, ptr %a489 + store { ptr, i64, i64 } { ptr @.str.4976, i64 6, i64 0 }, ptr %a490 + %t491 = call i32 @finch_str_eq(ptr %a489, ptr %a490) + %t492 = icmp ne i32 %t491, 0 + br label %logic.rend7591 +logic.rend7591: + br label %logic.end7590 +logic.end7590: + %t493 = phi i1 [ false, %logic.from7588 ], [ %t492, %logic.rend7591 ] + br i1 %t493, label %then7592, label %endif7594 +then7592: + %t494 = load ptr, ptr %a1 + %t495 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 3 + %t496 = load { ptr, i64, i64 }, ptr %t495 + %t497 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 2 + %t498 = load { ptr, i64, i64 }, ptr %t497 + %t499 = call i64 @finch.gen.findStruct(ptr %t494, { ptr, i64, i64 } %t496, { ptr, i64, i64 } %t498) + store i64 %t499, ptr %a500 + %t501 = load ptr, ptr %a1 + %t502 = icmp eq ptr %t501, null + br i1 %t502, label %panic7595, label %ok7596 +panic7595: + call void @finch_panic(ptr @.str.4977, i64 4572, ptr @.str.4978) + unreachable +ok7596: + %t503 = getelementptr inbounds %S.gen.Gen, ptr %t501, i32 0, i32 15 + %t504 = load i64, ptr %a500 + %t505 = load { ptr, i64, i64 }, ptr %t503 + %t506 = extractvalue { ptr, i64, i64 } %t505, 1 + %t507 = icmp uge i64 %t504, %t506 + br i1 %t507, label %range7597, label %inrange7598 +range7597: + call void @finch_panic_index(ptr @.str.4979, i64 4572, i64 %t504, i64 %t506) + unreachable +inrange7598: + %t508 = extractvalue { ptr, i64, i64 } %t505, 0 + %t509 = getelementptr inbounds %S.gen.StructDef, ptr %t508, i64 %t504 + %t510 = getelementptr inbounds %S.gen.StructDef, ptr %t509, i32 0, i32 5 + %t511 = getelementptr inbounds { ptr, i64, i64 }, ptr %t510, i32 0, i32 1 + %t512 = load i64, ptr %t511 + %t513 = icmp sgt i64 %t512, 0 + br i1 %t513, label %then7599, label %endif7601 +then7599: + %t514 = load ptr, ptr %a1 + %t515 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 3 + %t516 = load { ptr, i64, i64 }, ptr %t515 + %t517 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t518 = load { ptr, i64, i64 }, ptr %t517 + %t519 = load ptr, ptr %a1 + %t520 = icmp eq ptr %t519, null + br i1 %t520, label %panic7602, label %ok7603 +panic7602: + call void @finch_panic(ptr @.str.4980, i64 4573, ptr @.str.4981) + unreachable +ok7603: + %t521 = getelementptr inbounds %S.gen.Gen, ptr %t519, i32 0, i32 15 + %t522 = load i64, ptr %a500 + %t523 = load { ptr, i64, i64 }, ptr %t521 + %t524 = extractvalue { ptr, i64, i64 } %t523, 1 + %t525 = icmp uge i64 %t522, %t524 + br i1 %t525, label %range7604, label %inrange7605 +range7604: + call void @finch_panic_index(ptr @.str.4982, i64 4573, i64 %t522, i64 %t524) + unreachable +inrange7605: + %t526 = extractvalue { ptr, i64, i64 } %t523, 0 + %t527 = getelementptr inbounds %S.gen.StructDef, ptr %t526, i64 %t522 + %t528 = getelementptr inbounds %S.gen.StructDef, ptr %t527, i32 0, i32 5 + %t529 = load { ptr, i64, i64 }, ptr %t528 + %t530 = call i64 @finch.gen.findTemplate(ptr %t514, { ptr, i64, i64 } %t516, { ptr, i64, i64 } %t518, { ptr, i64, i64 } %t529, i1 false) + store i64 %t530, ptr %a531 + %t532 = load i64, ptr %a531 + %t533 = icmp sge i64 %t532, 0 + br i1 %t533, label %then7606, label %endif7608 +then7606: + %t534 = load ptr, ptr %a1 + %t535 = load i64, ptr %a531 + %t536 = load ptr, ptr %a1 + %t537 = icmp eq ptr %t536, null + br i1 %t537, label %panic7609, label %ok7610 +panic7609: + call void @finch_panic(ptr @.str.4983, i64 4575, ptr @.str.4984) + unreachable +ok7610: + %t538 = getelementptr inbounds %S.gen.Gen, ptr %t536, i32 0, i32 15 + %t539 = load i64, ptr %a500 + %t540 = load { ptr, i64, i64 }, ptr %t538 + %t541 = extractvalue { ptr, i64, i64 } %t540, 1 + %t542 = icmp uge i64 %t539, %t541 + br i1 %t542, label %range7611, label %inrange7612 +range7611: + call void @finch_panic_index(ptr @.str.4985, i64 4575, i64 %t539, i64 %t541) + unreachable +inrange7612: + %t543 = extractvalue { ptr, i64, i64 } %t540, 0 + %t544 = getelementptr inbounds %S.gen.StructDef, ptr %t543, i64 %t539 + %t545 = getelementptr inbounds %S.gen.StructDef, ptr %t544, i32 0, i32 7 + %t546 = load { ptr, i64, i64 }, ptr %t545 + %t547 = load %S.ast.Type, ptr %a361 + %t548 = load %S.ast.Node, ptr %a2 + %t549 = call i64 @finch.gen.instFn(ptr %t534, i64 %t535, { ptr, i64, i64 } %t546, %S.ast.Type %t547, %S.ast.Node %t548) + store i64 %t549, ptr %a484 + br label %endif7608 +endif7608: + br label %endif7601 +endif7601: + br label %endif7594 +endif7594: + %t550 = load i64, ptr %a484 + %t551 = icmp slt i64 %t550, 0 + br i1 %t551, label %then7613, label %endif7615 +then7613: + store { ptr, i64, i64 } zeroinitializer, ptr %a552 + %t553 = load ptr, ptr %a1 + %t554 = icmp eq ptr %t553, null + br i1 %t554, label %panic7616, label %ok7617 +panic7616: + call void @finch_panic(ptr @.str.4986, i64 4581, ptr @.str.4987) + unreachable +ok7617: + %t555 = getelementptr inbounds %S.gen.Gen, ptr %t553, i32 0, i32 14 + store i64 0, ptr %a556 + br label %each.cond7618 +each.cond7618: + %t557 = getelementptr inbounds { ptr, i64, i64 }, ptr %t555, i32 0, i32 1 + %t558 = load i64, ptr %t557 + %t559 = load i64, ptr %a556 + %t560 = icmp slt i64 %t559, %t558 + br i1 %t560, label %each.body7619, label %each.end7621 +each.body7619: + %t561 = load ptr, ptr %t555 + %t562 = getelementptr inbounds %S.gen.FnSig, ptr %t561, i64 %t559 + %t563 = load %S.gen.FnSig, ptr %t562 + store %S.gen.FnSig %t563, ptr %a564 + %t565 = getelementptr inbounds %S.gen.FnSig, ptr %a564, i32 0, i32 2 + %t566 = load { ptr, i64, i64 }, ptr %t565 + %t567 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 2 + %t568 = load { ptr, i64, i64 }, ptr %t567 + store { ptr, i64, i64 } %t566, ptr %a569 + store { ptr, i64, i64 } %t568, ptr %a570 + %t571 = call i32 @finch_str_eq(ptr %a569, ptr %a570) + %t572 = icmp ne i32 %t571, 0 + br label %logic.from7622 +logic.from7622: + br i1 %t572, label %logic.rhs7623, label %logic.end7624 +logic.rhs7623: + %t573 = getelementptr inbounds %S.gen.FnSig, ptr %a564, i32 0, i32 3 + %t574 = load { ptr, i64, i64 }, ptr %t573 + %t575 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 3 + %t576 = load { ptr, i64, i64 }, ptr %t575 + store { ptr, i64, i64 } %t574, ptr %a577 + store { ptr, i64, i64 } %t576, ptr %a578 + %t579 = call i32 @finch_str_eq(ptr %a577, ptr %a578) + %t580 = icmp ne i32 %t579, 0 + br label %logic.rend7625 +logic.rend7625: + br label %logic.end7624 +logic.end7624: + %t581 = phi i1 [ false, %logic.from7622 ], [ %t580, %logic.rend7625 ] + br i1 %t581, label %then7626, label %endif7628 +then7626: + %t582 = getelementptr inbounds { ptr, i64, i64 }, ptr %a552, i32 0, i32 1 + %t583 = getelementptr inbounds %S.gen.FnSig, ptr %a564, i32 0, i32 1 + %t584 = load { ptr, i64, i64 }, ptr %t583 + store { ptr, i64, i64 } %t584, ptr %a585 + call void @finch_str_copy(ptr %a586, ptr %a585) + %t587 = load { ptr, i64, i64 }, ptr %a586 + %t588 = load i64, ptr %t582 + %t589 = add i64 %t588, 1 + call void @finch_arr_reserve(ptr %a552, i64 %t589, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t590 = load ptr, ptr %a552 + %t591 = getelementptr inbounds { ptr, i64, i64 }, ptr %t590, i64 %t588 + store { ptr, i64, i64 } %t587, ptr %t591 + store i64 %t589, ptr %t582 + br label %endif7628 +endif7628: + br label %each.step7620 +each.step7620: + %t592 = load i64, ptr %a556 + %t593 = add i64 %t592, 1 + store i64 %t593, ptr %a556 + br label %each.cond7618 +each.end7621: + %t594 = getelementptr inbounds { ptr, i64, i64 }, ptr %a552, i32 0, i32 1 + %t595 = load i64, ptr %t594 + %t596 = icmp eq i64 %t595, 0 + br i1 %t596, label %then7629, label %endif7631 +then7629: + %t597 = load ptr, ptr %a1 + %t598 = load %S.ast.Node, ptr %a2 + %t599 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 0 + %t600 = load { ptr, i64, i64 }, ptr %t599 + store { ptr, i64, i64 } { ptr @.str.4988, i64 4, i64 0 }, ptr %a602 + store { ptr, i64, i64 } %t600, ptr %a603 + call void @finch_str_concat(ptr %a601, ptr %a602, ptr %a603) + %t604 = load { ptr, i64, i64 }, ptr %a601 + store { ptr, i64, i64 } %t604, ptr %a606 + store { ptr, i64, i64 } { ptr @.str.4989, i64 1, i64 0 }, ptr %a607 + call void @finch_str_concat(ptr %a605, ptr %a606, ptr %a607) + %t608 = load { ptr, i64, i64 }, ptr %a605 + %t609 = load %S.ast.Type, ptr %a361 + %t610 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t609) + store { ptr, i64, i64 } %t608, ptr %a612 + store { ptr, i64, i64 } %t610, ptr %a613 + call void @finch_str_concat(ptr %a611, ptr %a612, ptr %a613) + %t614 = load { ptr, i64, i64 }, ptr %a611 + store { ptr, i64, i64 } %t614, ptr %a616 + store { ptr, i64, i64 } { ptr @.str.4990, i64 34, i64 0 }, ptr %a617 + call void @finch_str_concat(ptr %a615, ptr %a616, ptr %a617) + %t618 = load { ptr, i64, i64 }, ptr %a615 + %t619 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 2 + %t620 = load { ptr, i64, i64 }, ptr %t619 + store { ptr, i64, i64 } %t618, ptr %a622 + store { ptr, i64, i64 } %t620, ptr %a623 + call void @finch_str_concat(ptr %a621, ptr %a622, ptr %a623) + %t624 = load { ptr, i64, i64 }, ptr %a621 + store { ptr, i64, i64 } %t624, ptr %a626 + store { ptr, i64, i64 } { ptr @.str.4991, i64 1, i64 0 }, ptr %a627 + call void @finch_str_concat(ptr %a625, ptr %a626, ptr %a627) + %t628 = load { ptr, i64, i64 }, ptr %a625 + %t629 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t630 = load { ptr, i64, i64 }, ptr %t629 + store { ptr, i64, i64 } %t628, ptr %a632 + store { ptr, i64, i64 } %t630, ptr %a633 + call void @finch_str_concat(ptr %a631, ptr %a632, ptr %a633) + %t634 = load { ptr, i64, i64 }, ptr %a631 + store { ptr, i64, i64 } %t634, ptr %a636 + store { ptr, i64, i64 } { ptr @.str.4992, i64 13, i64 0 }, ptr %a637 + call void @finch_str_concat(ptr %a635, ptr %a636, ptr %a637) + %t638 = load { ptr, i64, i64 }, ptr %a635 + call void @finch.gen.fail(ptr %t597, %S.ast.Node %t598, { ptr, i64, i64 } %t638) + br label %endif7631 +endif7631: + %t639 = load ptr, ptr %a1 + %t640 = load %S.ast.Node, ptr %a2 + %t641 = getelementptr inbounds %S.ast.Type, ptr %a361, i32 0, i32 0 + %t642 = load { ptr, i64, i64 }, ptr %t641 + store { ptr, i64, i64 } { ptr @.str.4993, i64 4, i64 0 }, ptr %a644 + store { ptr, i64, i64 } %t642, ptr %a645 + call void @finch_str_concat(ptr %a643, ptr %a644, ptr %a645) + %t646 = load { ptr, i64, i64 }, ptr %a643 + store { ptr, i64, i64 } %t646, ptr %a648 + store { ptr, i64, i64 } { ptr @.str.4994, i64 1, i64 0 }, ptr %a649 + call void @finch_str_concat(ptr %a647, ptr %a648, ptr %a649) + %t650 = load { ptr, i64, i64 }, ptr %a647 + %t651 = load %S.ast.Type, ptr %a361 + %t652 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t651) + store { ptr, i64, i64 } %t650, ptr %a654 + store { ptr, i64, i64 } %t652, ptr %a655 + call void @finch_str_concat(ptr %a653, ptr %a654, ptr %a655) + %t656 = load { ptr, i64, i64 }, ptr %a653 + store { ptr, i64, i64 } %t656, ptr %a658 + store { ptr, i64, i64 } { ptr @.str.4995, i64 16, i64 0 }, ptr %a659 + call void @finch_str_concat(ptr %a657, ptr %a658, ptr %a659) + %t660 = load { ptr, i64, i64 }, ptr %a657 + %t661 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t662 = load { ptr, i64, i64 }, ptr %t661 + store { ptr, i64, i64 } %t660, ptr %a664 + store { ptr, i64, i64 } %t662, ptr %a665 + call void @finch_str_concat(ptr %a663, ptr %a664, ptr %a665) + %t666 = load { ptr, i64, i64 }, ptr %a663 + store { ptr, i64, i64 } %t666, ptr %a668 + store { ptr, i64, i64 } { ptr @.str.4996, i64 11, i64 0 }, ptr %a669 + call void @finch_str_concat(ptr %a667, ptr %a668, ptr %a669) + %t670 = load { ptr, i64, i64 }, ptr %a667 + %t671 = getelementptr inbounds { ptr, i64, i64 }, ptr %a552, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.4997, i64 2, i64 0 }, ptr %a672 + call void @finch_str_join(ptr %a673, ptr %a552, ptr %a672) + %t674 = load { ptr, i64, i64 }, ptr %a673 + store { ptr, i64, i64 } %t670, ptr %a676 + store { ptr, i64, i64 } %t674, ptr %a677 + call void @finch_str_concat(ptr %a675, ptr %a676, ptr %a677) + %t678 = load { ptr, i64, i64 }, ptr %a675 + store { ptr, i64, i64 } %t678, ptr %a680 + store { ptr, i64, i64 } { ptr @.str.4998, i64 1, i64 0 }, ptr %a681 + call void @finch_str_concat(ptr %a679, ptr %a680, ptr %a681) + %t682 = load { ptr, i64, i64 }, ptr %a679 + call void @finch.gen.fail(ptr %t639, %S.ast.Node %t640, { ptr, i64, i64 } %t682) + br label %endif7615 +endif7615: + %t683 = load ptr, ptr %a1 + %t684 = icmp eq ptr %t683, null + br i1 %t684, label %panic7632, label %ok7633 +panic7632: + call void @finch_panic(ptr @.str.4999, i64 4592, ptr @.str.5000) + unreachable +ok7633: + %t685 = getelementptr inbounds %S.gen.Gen, ptr %t683, i32 0, i32 14 + %t686 = load i64, ptr %a484 + %t687 = load { ptr, i64, i64 }, ptr %t685 + %t688 = extractvalue { ptr, i64, i64 } %t687, 1 + %t689 = icmp uge i64 %t686, %t688 + br i1 %t689, label %range7634, label %inrange7635 +range7634: + call void @finch_panic_index(ptr @.str.5001, i64 4592, i64 %t686, i64 %t688) + unreachable +inrange7635: + %t690 = extractvalue { ptr, i64, i64 } %t687, 0 + %t691 = getelementptr inbounds %S.gen.FnSig, ptr %t690, i64 %t686 + %t692 = getelementptr inbounds %S.gen.FnSig, ptr %t691, i32 0, i32 10 + %t693 = load i1, ptr %t692 + br label %logic.from7636 +logic.from7636: + br i1 %t693, label %logic.rhs7637, label %logic.end7638 +logic.rhs7637: + %t694 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t695 = load { ptr, i64, i64 }, ptr %t694 + store { ptr, i64, i64 } %t695, ptr %a696 + store { ptr, i64, i64 } { ptr @.str.5002, i64 6, i64 0 }, ptr %a697 + %t698 = call i32 @finch_str_eq(ptr %a696, ptr %a697) + %t699 = icmp ne i32 %t698, 0 + br label %logic.from7639 +logic.from7639: + br i1 %t699, label %logic.end7641, label %logic.rhs7640 +logic.rhs7640: + %t700 = getelementptr inbounds %S.ast.Type, ptr %a217, i32 0, i32 0 + %t701 = load { ptr, i64, i64 }, ptr %t700 + store { ptr, i64, i64 } %t701, ptr %a702 + store { ptr, i64, i64 } { ptr @.str.5003, i64 4, i64 0 }, ptr %a703 + %t704 = call i32 @finch_str_eq(ptr %a702, ptr %a703) + %t705 = icmp ne i32 %t704, 0 + br label %logic.rend7642 +logic.rend7642: + br label %logic.end7641 +logic.end7641: + %t706 = phi i1 [ true, %logic.from7639 ], [ %t705, %logic.rend7642 ] + br label %logic.rend7643 +logic.rend7643: + br label %logic.end7638 +logic.end7638: + %t707 = phi i1 [ false, %logic.from7636 ], [ %t706, %logic.rend7643 ] + br i1 %t707, label %then7644, label %endif7646 +then7644: + %t708 = getelementptr inbounds %S.gen.Ref, ptr %a210, i32 0, i32 0 + %t709 = load i1, ptr %t708 + %t710 = xor i1 %t709, true + br i1 %t710, label %then7647, label %endif7649 +then7647: + %t711 = load ptr, ptr %a1 + %t712 = load %S.ast.Node, ptr %a2 + %t713 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t714 = load { ptr, i64, i64 }, ptr %t713 + store { ptr, i64, i64 } %t714, ptr %a716 + store { ptr, i64, i64 } { ptr @.str.5004, i64 28, i64 0 }, ptr %a717 + call void @finch_str_concat(ptr %a715, ptr %a716, ptr %a717) + %t718 = load { ptr, i64, i64 }, ptr %a715 + %t719 = load %S.ast.Type, ptr %a361 + %t720 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t719) + store { ptr, i64, i64 } %t718, ptr %a722 + store { ptr, i64, i64 } %t720, ptr %a723 + call void @finch_str_concat(ptr %a721, ptr %a722, ptr %a723) + %t724 = load { ptr, i64, i64 }, ptr %a721 + store { ptr, i64, i64 } %t724, ptr %a726 + store { ptr, i64, i64 } { ptr @.str.5005, i64 30, i64 0 }, ptr %a727 + call void @finch_str_concat(ptr %a725, ptr %a726, ptr %a727) + %t728 = load { ptr, i64, i64 }, ptr %a725 + call void @finch.gen.fail(ptr %t711, %S.ast.Node %t712, { ptr, i64, i64 } %t728) + br label %endif7649 +endif7649: + %t729 = load %S.ast.Node, ptr %a13 + %t730 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t729) + store { ptr, i64, i64 } %t730, ptr %a731 + %t732 = getelementptr inbounds { ptr, i64, i64 }, ptr %a731, i32 0, i32 1 + %t733 = load i64, ptr %t732 + %t734 = icmp sgt i64 %t733, 0 + br i1 %t734, label %then7650, label %endif7652 +then7650: + %t735 = load ptr, ptr %a1 + %t736 = load { ptr, i64, i64 }, ptr %a731 + %t737 = call i64 @finch.gen.lookup(ptr %t735, { ptr, i64, i64 } %t736) + store i64 %t737, ptr %a738 + %t739 = load i64, ptr %a738 + %t740 = icmp sge i64 %t739, 0 + br label %logic.from7653 +logic.from7653: + br i1 %t740, label %logic.rhs7654, label %logic.end7655 +logic.rhs7654: + %t741 = load ptr, ptr %a1 + %t742 = load i64, ptr %a738 + %t743 = call %S.gen.Var @finch.gen.varAt(ptr %t741, i64 %t742) + %t744 = extractvalue %S.gen.Var %t743, 3 + br label %logic.rend7656 +logic.rend7656: + br label %logic.end7655 +logic.end7655: + %t745 = phi i1 [ false, %logic.from7653 ], [ %t744, %logic.rend7656 ] + br i1 %t745, label %then7657, label %endif7659 +then7657: + %t746 = load ptr, ptr %a1 + %t747 = load %S.ast.Node, ptr %a2 + %t748 = load { ptr, i64, i64 }, ptr %a731 + store { ptr, i64, i64 } { ptr @.str.5006, i64 19, i64 0 }, ptr %a750 + store { ptr, i64, i64 } %t748, ptr %a751 + call void @finch_str_concat(ptr %a749, ptr %a750, ptr %a751) + %t752 = load { ptr, i64, i64 }, ptr %a749 + store { ptr, i64, i64 } %t752, ptr %a754 + store { ptr, i64, i64 } { ptr @.str.5007, i64 18, i64 0 }, ptr %a755 + call void @finch_str_concat(ptr %a753, ptr %a754, ptr %a755) + %t756 = load { ptr, i64, i64 }, ptr %a753 + call void @finch.gen.fail(ptr %t746, %S.ast.Node %t747, { ptr, i64, i64 } %t756) + br label %endif7659 +endif7659: + br label %endif7652 +endif7652: + br label %endif7646 +endif7646: + %t757 = load ptr, ptr %a1 + %t758 = load i64, ptr %a484 + %t759 = load %S.ast.Node, ptr %a2 + %t760 = load %S.ast.Type, ptr %a361 + %t761 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t760) + store { ptr, i64, i64 } %t761, ptr %a763 + store { ptr, i64, i64 } { ptr @.str.5008, i64 1, i64 0 }, ptr %a764 + call void @finch_str_concat(ptr %a762, ptr %a763, ptr %a764) + %t765 = load { ptr, i64, i64 }, ptr %a762 + %t766 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t767 = load { ptr, i64, i64 }, ptr %t766 + store { ptr, i64, i64 } %t765, ptr %a769 + store { ptr, i64, i64 } %t767, ptr %a770 + call void @finch_str_concat(ptr %a768, ptr %a769, ptr %a770) + %t771 = load { ptr, i64, i64 }, ptr %a768 + %t772 = load { ptr, i64, i64 }, ptr %a362 + %t773 = load %S.ast.Node, ptr %a13 + %t774 = call { ptr, i64, i64 } @finch.gen.rootVar(%S.ast.Node %t773) + %t775 = call %S.gen.Val @finch.gen.callFn(ptr %t757, i64 %t758, %S.ast.Node %t759, i64 1, { ptr, i64, i64 } %t771, { ptr, i64, i64 } %t772, { ptr, i64, i64 } %t774) + ret %S.gen.Val %t775 +endif7587: + %t776 = load ptr, ptr %a1 + %t777 = load %S.ast.Node, ptr %a2 + %t778 = load %S.ast.Type, ptr %a217 + %t779 = call { ptr, i64, i64 } @finch.ast.show(%S.ast.Type %t778) + store { ptr, i64, i64 } %t779, ptr %a781 + store { ptr, i64, i64 } { ptr @.str.5009, i64 15, i64 0 }, ptr %a782 + call void @finch_str_concat(ptr %a780, ptr %a781, ptr %a782) + %t783 = load { ptr, i64, i64 }, ptr %a780 + call void @finch.gen.fail(ptr %t776, %S.ast.Node %t777, { ptr, i64, i64 } %t783) + ret %S.gen.Val zeroinitializer +} + +define internal void @finch.gen.need(ptr %p0, %S.ast.Node %p1, i64 %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca i64, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store i64 %p2, ptr %a3 + %t4 = load ptr, ptr %a1 + %t5 = load %S.ast.Node, ptr %a2 + %t6 = load i64, ptr %a3 + %t7 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t8 = load { ptr, i64, i64 }, ptr %t7 + call void @finch.gen.checkArgs(ptr %t4, %S.ast.Node %t5, i64 1, i64 %t6, { ptr, i64, i64 } %t8) + ret void +} + +define internal %S.gen.Val @finch.gen.arrayMethod(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2, %S.ast.Type %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca %S.ast.Type, align 16 + %a12 = alloca %S.ast.Type, align 16 + %a13 = alloca %S.ast.Type, align 16 + %a15 = alloca %S.ast.Type, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a143 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca %S.ast.Type, align 16 + %a230 = alloca %S.ast.Type, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a281 = alloca %S.gen.Val, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a302 = alloca { ptr, i64, i64 }, align 16 + %a305 = alloca { ptr, i64, i64 }, align 16 + %a308 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a330 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a335 = alloca { ptr, i64, i64 }, align 16 + %a336 = alloca { ptr, i64, i64 }, align 16 + %a339 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a351 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a355 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a359 = alloca { ptr, i64, i64 }, align 16 + %a360 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a364 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a369 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca %S.ast.Type, align 16 + %a377 = alloca %S.ast.Type, align 16 + %a380 = alloca %S.gen.Val, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a411 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca { ptr, i64, i64 }, align 16 + %a432 = alloca { ptr, i64, i64 }, align 16 + %a439 = alloca { ptr, i64, i64 }, align 16 + %a440 = alloca { ptr, i64, i64 }, align 16 + %a441 = alloca { ptr, i64, i64 }, align 16 + %a443 = alloca { ptr, i64, i64 }, align 16 + %a444 = alloca { ptr, i64, i64 }, align 16 + %a445 = alloca { ptr, i64, i64 }, align 16 + %a452 = alloca { ptr, i64, i64 }, align 16 + %a453 = alloca { ptr, i64, i64 }, align 16 + %a460 = alloca { ptr, i64, i64 }, align 16 + %a461 = alloca { ptr, i64, i64 }, align 16 + %a477 = alloca { ptr, i64, i64 }, align 16 + %a480 = alloca { ptr, i64, i64 }, align 16 + %a483 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca { ptr, i64, i64 }, align 16 + %a485 = alloca { ptr, i64, i64 }, align 16 + %a487 = alloca { ptr, i64, i64 }, align 16 + %a488 = alloca { ptr, i64, i64 }, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a492 = alloca { ptr, i64, i64 }, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a494 = alloca { ptr, i64, i64 }, align 16 + %a496 = alloca { ptr, i64, i64 }, align 16 + %a497 = alloca { ptr, i64, i64 }, align 16 + %a498 = alloca { ptr, i64, i64 }, align 16 + %a501 = alloca { ptr, i64, i64 }, align 16 + %a502 = alloca { ptr, i64, i64 }, align 16 + %a503 = alloca { ptr, i64, i64 }, align 16 + %a505 = alloca { ptr, i64, i64 }, align 16 + %a506 = alloca { ptr, i64, i64 }, align 16 + %a507 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a518 = alloca { ptr, i64, i64 }, align 16 + %a543 = alloca { ptr, i64, i64 }, align 16 + %a544 = alloca { ptr, i64, i64 }, align 16 + %a546 = alloca { ptr, i64, i64 }, align 16 + %a569 = alloca { ptr, i64, i64 }, align 16 + %a583 = alloca { ptr, i64, i64 }, align 16 + %a586 = alloca { ptr, i64, i64 }, align 16 + %a587 = alloca { ptr, i64, i64 }, align 16 + %a588 = alloca { ptr, i64, i64 }, align 16 + %a590 = alloca { ptr, i64, i64 }, align 16 + %a591 = alloca { ptr, i64, i64 }, align 16 + %a592 = alloca { ptr, i64, i64 }, align 16 + %a595 = alloca { ptr, i64, i64 }, align 16 + %a596 = alloca { ptr, i64, i64 }, align 16 + %a597 = alloca { ptr, i64, i64 }, align 16 + %a599 = alloca { ptr, i64, i64 }, align 16 + %a600 = alloca { ptr, i64, i64 }, align 16 + %a601 = alloca { ptr, i64, i64 }, align 16 + %a606 = alloca { ptr, i64, i64 }, align 16 + %a607 = alloca { ptr, i64, i64 }, align 16 + %a608 = alloca { ptr, i64, i64 }, align 16 + %a610 = alloca { ptr, i64, i64 }, align 16 + %a611 = alloca { ptr, i64, i64 }, align 16 + %a612 = alloca { ptr, i64, i64 }, align 16 + %a615 = alloca { ptr, i64, i64 }, align 16 + %a616 = alloca { ptr, i64, i64 }, align 16 + %a617 = alloca { ptr, i64, i64 }, align 16 + %a619 = alloca { ptr, i64, i64 }, align 16 + %a620 = alloca { ptr, i64, i64 }, align 16 + %a621 = alloca { ptr, i64, i64 }, align 16 + %a625 = alloca { ptr, i64, i64 }, align 16 + %a627 = alloca { ptr, i64, i64 }, align 16 + %a628 = alloca { ptr, i64, i64 }, align 16 + %a629 = alloca { ptr, i64, i64 }, align 16 + %a631 = alloca { ptr, i64, i64 }, align 16 + %a632 = alloca { ptr, i64, i64 }, align 16 + %a633 = alloca { ptr, i64, i64 }, align 16 + %a638 = alloca { ptr, i64, i64 }, align 16 + %a644 = alloca { ptr, i64, i64 }, align 16 + %a645 = alloca { ptr, i64, i64 }, align 16 + %a646 = alloca { ptr, i64, i64 }, align 16 + %a648 = alloca { ptr, i64, i64 }, align 16 + %a649 = alloca { ptr, i64, i64 }, align 16 + %a650 = alloca { ptr, i64, i64 }, align 16 + %a653 = alloca { ptr, i64, i64 }, align 16 + %a654 = alloca { ptr, i64, i64 }, align 16 + %a655 = alloca { ptr, i64, i64 }, align 16 + %a657 = alloca { ptr, i64, i64 }, align 16 + %a658 = alloca { ptr, i64, i64 }, align 16 + %a659 = alloca { ptr, i64, i64 }, align 16 + %a662 = alloca { ptr, i64, i64 }, align 16 + %a663 = alloca { ptr, i64, i64 }, align 16 + %a664 = alloca { ptr, i64, i64 }, align 16 + %a670 = alloca { ptr, i64, i64 }, align 16 + %a671 = alloca { ptr, i64, i64 }, align 16 + %a696 = alloca { ptr, i64, i64 }, align 16 + %a697 = alloca { ptr, i64, i64 }, align 16 + %a699 = alloca { ptr, i64, i64 }, align 16 + %a709 = alloca { ptr, i64, i64 }, align 16 + %a714 = alloca { ptr, i64, i64 }, align 16 + %a715 = alloca { ptr, i64, i64 }, align 16 + %a716 = alloca { ptr, i64, i64 }, align 16 + %a718 = alloca { ptr, i64, i64 }, align 16 + %a719 = alloca { ptr, i64, i64 }, align 16 + %a720 = alloca { ptr, i64, i64 }, align 16 + %a723 = alloca { ptr, i64, i64 }, align 16 + %a724 = alloca { ptr, i64, i64 }, align 16 + %a725 = alloca { ptr, i64, i64 }, align 16 + %a727 = alloca { ptr, i64, i64 }, align 16 + %a728 = alloca { ptr, i64, i64 }, align 16 + %a729 = alloca { ptr, i64, i64 }, align 16 + %a732 = alloca { ptr, i64, i64 }, align 16 + %a733 = alloca { ptr, i64, i64 }, align 16 + %a734 = alloca { ptr, i64, i64 }, align 16 + %a738 = alloca { ptr, i64, i64 }, align 16 + %a741 = alloca { ptr, i64, i64 }, align 16 + %a742 = alloca { ptr, i64, i64 }, align 16 + %a743 = alloca { ptr, i64, i64 }, align 16 + %a745 = alloca { ptr, i64, i64 }, align 16 + %a746 = alloca { ptr, i64, i64 }, align 16 + %a747 = alloca { ptr, i64, i64 }, align 16 + %a750 = alloca { ptr, i64, i64 }, align 16 + %a751 = alloca { ptr, i64, i64 }, align 16 + %a752 = alloca { ptr, i64, i64 }, align 16 + %a754 = alloca { ptr, i64, i64 }, align 16 + %a755 = alloca { ptr, i64, i64 }, align 16 + %a756 = alloca { ptr, i64, i64 }, align 16 + %a761 = alloca { ptr, i64, i64 }, align 16 + %a762 = alloca { ptr, i64, i64 }, align 16 + %a763 = alloca { ptr, i64, i64 }, align 16 + %a765 = alloca { ptr, i64, i64 }, align 16 + %a766 = alloca { ptr, i64, i64 }, align 16 + %a767 = alloca { ptr, i64, i64 }, align 16 + %a770 = alloca { ptr, i64, i64 }, align 16 + %a771 = alloca { ptr, i64, i64 }, align 16 + %a775 = alloca %S.ast.Type, align 16 + %a776 = alloca %S.ast.Type, align 16 + %a784 = alloca { ptr, i64, i64 }, align 16 + %a785 = alloca { ptr, i64, i64 }, align 16 + %a810 = alloca { ptr, i64, i64 }, align 16 + %a811 = alloca { ptr, i64, i64 }, align 16 + %a813 = alloca { ptr, i64, i64 }, align 16 + %a816 = alloca { ptr, i64, i64 }, align 16 + %a817 = alloca { ptr, i64, i64 }, align 16 + %a818 = alloca { ptr, i64, i64 }, align 16 + %a820 = alloca { ptr, i64, i64 }, align 16 + %a821 = alloca { ptr, i64, i64 }, align 16 + %a822 = alloca { ptr, i64, i64 }, align 16 + %a825 = alloca { ptr, i64, i64 }, align 16 + %a826 = alloca { ptr, i64, i64 }, align 16 + %a827 = alloca { ptr, i64, i64 }, align 16 + %a829 = alloca { ptr, i64, i64 }, align 16 + %a830 = alloca { ptr, i64, i64 }, align 16 + %a831 = alloca { ptr, i64, i64 }, align 16 + %a836 = alloca { ptr, i64, i64 }, align 16 + %a837 = alloca { ptr, i64, i64 }, align 16 + %a838 = alloca { ptr, i64, i64 }, align 16 + %a840 = alloca { ptr, i64, i64 }, align 16 + %a841 = alloca { ptr, i64, i64 }, align 16 + %a842 = alloca { ptr, i64, i64 }, align 16 + %a847 = alloca { ptr, i64, i64 }, align 16 + %a848 = alloca { ptr, i64, i64 }, align 16 + %a856 = alloca { ptr, i64, i64 }, align 16 + %a860 = alloca { ptr, i64, i64 }, align 16 + %a863 = alloca { ptr, i64, i64 }, align 16 + %a864 = alloca { ptr, i64, i64 }, align 16 + %a865 = alloca { ptr, i64, i64 }, align 16 + %a867 = alloca { ptr, i64, i64 }, align 16 + %a868 = alloca { ptr, i64, i64 }, align 16 + %a869 = alloca { ptr, i64, i64 }, align 16 + %a872 = alloca { ptr, i64, i64 }, align 16 + %a876 = alloca { ptr, i64, i64 }, align 16 + %a879 = alloca { ptr, i64, i64 }, align 16 + %a880 = alloca { ptr, i64, i64 }, align 16 + %a881 = alloca { ptr, i64, i64 }, align 16 + %a883 = alloca { ptr, i64, i64 }, align 16 + %a884 = alloca { ptr, i64, i64 }, align 16 + %a885 = alloca { ptr, i64, i64 }, align 16 + %a888 = alloca { ptr, i64, i64 }, align 16 + %a889 = alloca { ptr, i64, i64 }, align 16 + %a890 = alloca { ptr, i64, i64 }, align 16 + %a892 = alloca { ptr, i64, i64 }, align 16 + %a893 = alloca { ptr, i64, i64 }, align 16 + %a894 = alloca { ptr, i64, i64 }, align 16 + %a902 = alloca { ptr, i64, i64 }, align 16 + %a903 = alloca { ptr, i64, i64 }, align 16 + %a904 = alloca { ptr, i64, i64 }, align 16 + %a907 = alloca { ptr, i64, i64 }, align 16 + %a911 = alloca { ptr, i64, i64 }, align 16 + %a912 = alloca { ptr, i64, i64 }, align 16 + %a913 = alloca { ptr, i64, i64 }, align 16 + %a915 = alloca { ptr, i64, i64 }, align 16 + %a916 = alloca { ptr, i64, i64 }, align 16 + %a917 = alloca { ptr, i64, i64 }, align 16 + %a920 = alloca { ptr, i64, i64 }, align 16 + %a921 = alloca { ptr, i64, i64 }, align 16 + %a922 = alloca { ptr, i64, i64 }, align 16 + %a924 = alloca { ptr, i64, i64 }, align 16 + %a925 = alloca { ptr, i64, i64 }, align 16 + %a926 = alloca { ptr, i64, i64 }, align 16 + %a934 = alloca { ptr, i64, i64 }, align 16 + %a935 = alloca { ptr, i64, i64 }, align 16 + %a936 = alloca { ptr, i64, i64 }, align 16 + %a939 = alloca { ptr, i64, i64 }, align 16 + %a942 = alloca { ptr, i64, i64 }, align 16 + %a943 = alloca { ptr, i64, i64 }, align 16 + %a944 = alloca { ptr, i64, i64 }, align 16 + %a946 = alloca { ptr, i64, i64 }, align 16 + %a947 = alloca { ptr, i64, i64 }, align 16 + %a948 = alloca { ptr, i64, i64 }, align 16 + %a951 = alloca { ptr, i64, i64 }, align 16 + %a952 = alloca { ptr, i64, i64 }, align 16 + %a953 = alloca { ptr, i64, i64 }, align 16 + %a955 = alloca { ptr, i64, i64 }, align 16 + %a956 = alloca { ptr, i64, i64 }, align 16 + %a957 = alloca { ptr, i64, i64 }, align 16 + %a960 = alloca { ptr, i64, i64 }, align 16 + %a961 = alloca { ptr, i64, i64 }, align 16 + %a962 = alloca { ptr, i64, i64 }, align 16 + %a965 = alloca { ptr, i64, i64 }, align 16 + %a970 = alloca { ptr, i64, i64 }, align 16 + %a975 = alloca { ptr, i64, i64 }, align 16 + %a989 = alloca { ptr, i64, i64 }, align 16 + %a990 = alloca { ptr, i64, i64 }, align 16 + %a1015 = alloca { ptr, i64, i64 }, align 16 + %a1016 = alloca { ptr, i64, i64 }, align 16 + %a1018 = alloca { ptr, i64, i64 }, align 16 + %a1039 = alloca { ptr, i64, i64 }, align 16 + %a1040 = alloca { ptr, i64, i64 }, align 16 + %a1042 = alloca { ptr, i64, i64 }, align 16 + %a1046 = alloca { ptr, i64, i64 }, align 16 + %a1049 = alloca { ptr, i64, i64 }, align 16 + %a1050 = alloca { ptr, i64, i64 }, align 16 + %a1051 = alloca { ptr, i64, i64 }, align 16 + %a1053 = alloca { ptr, i64, i64 }, align 16 + %a1054 = alloca { ptr, i64, i64 }, align 16 + %a1055 = alloca { ptr, i64, i64 }, align 16 + %a1058 = alloca { ptr, i64, i64 }, align 16 + %a1061 = alloca { ptr, i64, i64 }, align 16 + %a1062 = alloca { ptr, i64, i64 }, align 16 + %a1063 = alloca { ptr, i64, i64 }, align 16 + %a1065 = alloca { ptr, i64, i64 }, align 16 + %a1066 = alloca { ptr, i64, i64 }, align 16 + %a1067 = alloca { ptr, i64, i64 }, align 16 + %a1070 = alloca { ptr, i64, i64 }, align 16 + %a1071 = alloca { ptr, i64, i64 }, align 16 + %a1072 = alloca { ptr, i64, i64 }, align 16 + %a1075 = alloca { ptr, i64, i64 }, align 16 + %a1078 = alloca { ptr, i64, i64 }, align 16 + %a1079 = alloca { ptr, i64, i64 }, align 16 + %a1080 = alloca { ptr, i64, i64 }, align 16 + %a1082 = alloca { ptr, i64, i64 }, align 16 + %a1083 = alloca { ptr, i64, i64 }, align 16 + %a1084 = alloca { ptr, i64, i64 }, align 16 + %a1087 = alloca { ptr, i64, i64 }, align 16 + %a1088 = alloca { ptr, i64, i64 }, align 16 + %a1089 = alloca { ptr, i64, i64 }, align 16 + %a1092 = alloca { ptr, i64, i64 }, align 16 + %a1097 = alloca { ptr, i64, i64 }, align 16 + %a1098 = alloca { ptr, i64, i64 }, align 16 + %a1099 = alloca { ptr, i64, i64 }, align 16 + %a1101 = alloca { ptr, i64, i64 }, align 16 + %a1102 = alloca { ptr, i64, i64 }, align 16 + %a1103 = alloca { ptr, i64, i64 }, align 16 + %a1106 = alloca { ptr, i64, i64 }, align 16 + %a1107 = alloca { ptr, i64, i64 }, align 16 + %a1108 = alloca { ptr, i64, i64 }, align 16 + %a1111 = alloca { ptr, i64, i64 }, align 16 + %a1112 = alloca { ptr, i64, i64 }, align 16 + %a1113 = alloca { ptr, i64, i64 }, align 16 + %a1115 = alloca { ptr, i64, i64 }, align 16 + %a1116 = alloca { ptr, i64, i64 }, align 16 + %a1117 = alloca { ptr, i64, i64 }, align 16 + %a1120 = alloca { ptr, i64, i64 }, align 16 + %a1121 = alloca { ptr, i64, i64 }, align 16 + %a1122 = alloca { ptr, i64, i64 }, align 16 + %a1128 = alloca { ptr, i64, i64 }, align 16 + %a1129 = alloca { ptr, i64, i64 }, align 16 + %a1130 = alloca { ptr, i64, i64 }, align 16 + %a1132 = alloca { ptr, i64, i64 }, align 16 + %a1133 = alloca { ptr, i64, i64 }, align 16 + %a1134 = alloca { ptr, i64, i64 }, align 16 + %a1137 = alloca { ptr, i64, i64 }, align 16 + %a1138 = alloca { ptr, i64, i64 }, align 16 + %a1139 = alloca { ptr, i64, i64 }, align 16 + %a1142 = alloca { ptr, i64, i64 }, align 16 + %a1145 = alloca { ptr, i64, i64 }, align 16 + %a1148 = alloca { ptr, i64, i64 }, align 16 + %a1149 = alloca { ptr, i64, i64 }, align 16 + %a1150 = alloca { ptr, i64, i64 }, align 16 + %a1152 = alloca { ptr, i64, i64 }, align 16 + %a1153 = alloca { ptr, i64, i64 }, align 16 + %a1154 = alloca { ptr, i64, i64 }, align 16 + %a1157 = alloca { ptr, i64, i64 }, align 16 + %a1158 = alloca { ptr, i64, i64 }, align 16 + %a1159 = alloca { ptr, i64, i64 }, align 16 + %a1161 = alloca { ptr, i64, i64 }, align 16 + %a1162 = alloca { ptr, i64, i64 }, align 16 + %a1163 = alloca { ptr, i64, i64 }, align 16 + %a1168 = alloca { ptr, i64, i64 }, align 16 + %a1169 = alloca { ptr, i64, i64 }, align 16 + %a1170 = alloca { ptr, i64, i64 }, align 16 + %a1172 = alloca { ptr, i64, i64 }, align 16 + %a1173 = alloca { ptr, i64, i64 }, align 16 + %a1174 = alloca { ptr, i64, i64 }, align 16 + %a1179 = alloca { ptr, i64, i64 }, align 16 + %a1183 = alloca { ptr, i64, i64 }, align 16 + %a1187 = alloca { ptr, i64, i64 }, align 16 + %a1190 = alloca { ptr, i64, i64 }, align 16 + %a1191 = alloca { ptr, i64, i64 }, align 16 + %a1192 = alloca { ptr, i64, i64 }, align 16 + %a1194 = alloca { ptr, i64, i64 }, align 16 + %a1195 = alloca { ptr, i64, i64 }, align 16 + %a1196 = alloca { ptr, i64, i64 }, align 16 + %a1199 = alloca { ptr, i64, i64 }, align 16 + %a1200 = alloca { ptr, i64, i64 }, align 16 + %a1201 = alloca { ptr, i64, i64 }, align 16 + %a1203 = alloca { ptr, i64, i64 }, align 16 + %a1204 = alloca { ptr, i64, i64 }, align 16 + %a1205 = alloca { ptr, i64, i64 }, align 16 + %a1213 = alloca { ptr, i64, i64 }, align 16 + %a1214 = alloca { ptr, i64, i64 }, align 16 + %a1215 = alloca { ptr, i64, i64 }, align 16 + %a1218 = alloca { ptr, i64, i64 }, align 16 + %a1221 = alloca { ptr, i64, i64 }, align 16 + %a1222 = alloca { ptr, i64, i64 }, align 16 + %a1223 = alloca { ptr, i64, i64 }, align 16 + %a1225 = alloca { ptr, i64, i64 }, align 16 + %a1226 = alloca { ptr, i64, i64 }, align 16 + %a1227 = alloca { ptr, i64, i64 }, align 16 + %a1230 = alloca { ptr, i64, i64 }, align 16 + %a1231 = alloca { ptr, i64, i64 }, align 16 + %a1232 = alloca { ptr, i64, i64 }, align 16 + %a1234 = alloca { ptr, i64, i64 }, align 16 + %a1235 = alloca { ptr, i64, i64 }, align 16 + %a1236 = alloca { ptr, i64, i64 }, align 16 + %a1240 = alloca { ptr, i64, i64 }, align 16 + %a1241 = alloca { ptr, i64, i64 }, align 16 + %a1242 = alloca { ptr, i64, i64 }, align 16 + %a1244 = alloca { ptr, i64, i64 }, align 16 + %a1245 = alloca { ptr, i64, i64 }, align 16 + %a1246 = alloca { ptr, i64, i64 }, align 16 + %a1254 = alloca { ptr, i64, i64 }, align 16 + %a1255 = alloca { ptr, i64, i64 }, align 16 + %a1256 = alloca { ptr, i64, i64 }, align 16 + %a1259 = alloca { ptr, i64, i64 }, align 16 + %a1260 = alloca { ptr, i64, i64 }, align 16 + %a1261 = alloca { ptr, i64, i64 }, align 16 + %a1264 = alloca { ptr, i64, i64 }, align 16 + %a1276 = alloca %S.ast.Type, align 16 + %a1277 = alloca %S.ast.Type, align 16 + %a1282 = alloca { ptr, i64, i64 }, align 16 + %a1283 = alloca { ptr, i64, i64 }, align 16 + %a1290 = alloca { ptr, i64, i64 }, align 16 + %a1291 = alloca { ptr, i64, i64 }, align 16 + %a1293 = alloca { ptr, i64, i64 }, align 16 + %a1298 = alloca { ptr, i64, i64 }, align 16 + %a1299 = alloca { ptr, i64, i64 }, align 16 + %a1304 = alloca { ptr, i64, i64 }, align 16 + %a1305 = alloca { ptr, i64, i64 }, align 16 + %a1314 = alloca { ptr, i64, i64 }, align 16 + %a1318 = alloca { ptr, i64, i64 }, align 16 + %a1322 = alloca { ptr, i64, i64 }, align 16 + %a1325 = alloca { ptr, i64, i64 }, align 16 + %a1326 = alloca { ptr, i64, i64 }, align 16 + %a1327 = alloca { ptr, i64, i64 }, align 16 + %a1329 = alloca { ptr, i64, i64 }, align 16 + %a1330 = alloca { ptr, i64, i64 }, align 16 + %a1331 = alloca { ptr, i64, i64 }, align 16 + %a1334 = alloca { ptr, i64, i64 }, align 16 + %a1335 = alloca { ptr, i64, i64 }, align 16 + %a1336 = alloca { ptr, i64, i64 }, align 16 + %a1338 = alloca { ptr, i64, i64 }, align 16 + %a1339 = alloca { ptr, i64, i64 }, align 16 + %a1340 = alloca { ptr, i64, i64 }, align 16 + %a1345 = alloca { ptr, i64, i64 }, align 16 + %a1346 = alloca { ptr, i64, i64 }, align 16 + %a1347 = alloca { ptr, i64, i64 }, align 16 + %a1349 = alloca { ptr, i64, i64 }, align 16 + %a1350 = alloca { ptr, i64, i64 }, align 16 + %a1351 = alloca { ptr, i64, i64 }, align 16 + %a1354 = alloca { ptr, i64, i64 }, align 16 + %a1355 = alloca { ptr, i64, i64 }, align 16 + %a1356 = alloca { ptr, i64, i64 }, align 16 + %a1358 = alloca { ptr, i64, i64 }, align 16 + %a1359 = alloca { ptr, i64, i64 }, align 16 + %a1360 = alloca { ptr, i64, i64 }, align 16 + %a1367 = alloca { ptr, i64, i64 }, align 16 + %a1368 = alloca { ptr, i64, i64 }, align 16 + %a1369 = alloca { ptr, i64, i64 }, align 16 + %a1371 = alloca { ptr, i64, i64 }, align 16 + %a1372 = alloca { ptr, i64, i64 }, align 16 + %a1373 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store %S.ast.Type %p3, ptr %a4 + %t5 = getelementptr inbounds %S.ast.Type, ptr %a4, i32 0, i32 1 + %t6 = load { ptr, i64, i64 }, ptr %t5 + %t7 = extractvalue { ptr, i64, i64 } %t6, 1 + %t8 = icmp uge i64 0, %t7 + br i1 %t8, label %range7660, label %inrange7661 +range7660: + call void @finch_panic_index(ptr @.str.5010, i64 4615, i64 0, i64 %t7) + unreachable +inrange7661: + %t9 = extractvalue { ptr, i64, i64 } %t6, 0 + %t10 = getelementptr inbounds %S.ast.Type, ptr %t9, i64 0 + %t11 = load %S.ast.Type, ptr %t10 + store %S.ast.Type %t11, ptr %a12 + call void @finch.copy.S_ast_Type(ptr %a13, ptr %a12) + %t14 = load %S.ast.Type, ptr %a13 + store %S.ast.Type %t14, ptr %a15 + %t16 = load ptr, ptr %a1 + %t17 = load %S.ast.Type, ptr %a15 + %t18 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t16, %S.ast.Type %t17) + store { ptr, i64, i64 } %t18, ptr %a19 + %t20 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t21 = load { ptr, i64, i64 }, ptr %t20 + store { ptr, i64, i64 } %t21, ptr %a22 + call void @finch_str_copy(ptr %a23, ptr %a22) + %t24 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t24, ptr %a25 + %t26 = load ptr, ptr %a1 + %t27 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5011, i64 46, i64 0 }, ptr %a29 + store { ptr, i64, i64 } %t27, ptr %a30 + call void @finch_str_concat(ptr %a28, ptr %a29, ptr %a30) + %t31 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } %t31, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.5012, i64 14, i64 0 }, ptr %a34 + call void @finch_str_concat(ptr %a32, ptr %a33, ptr %a34) + %t35 = load { ptr, i64, i64 }, ptr %a32 + %t36 = call { ptr, i64, i64 } @finch.gen.op(ptr %t26, { ptr, i64, i64 } %t35) + store { ptr, i64, i64 } %t36, ptr %a37 + %t38 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t38, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.5013, i64 4, i64 0 }, ptr %a40 + %t41 = call i32 @finch_str_eq(ptr %a39, ptr %a40) + %t42 = icmp ne i32 %t41, 0 + br i1 %t42, label %then7662, label %endif7664 +then7662: + %t43 = load ptr, ptr %a1 + %t44 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t43, %S.ast.Node %t44, i64 1) + %t45 = load ptr, ptr %a1 + %t46 = load ptr, ptr %a1 + %t47 = load ptr, ptr %a1 + %t48 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t49 = load { ptr, i64, i64 }, ptr %t48 + %t50 = extractvalue { ptr, i64, i64 } %t49, 1 + %t51 = icmp uge i64 1, %t50 + br i1 %t51, label %range7665, label %inrange7666 +range7665: + call void @finch_panic_index(ptr @.str.5014, i64 4621, i64 1, i64 %t50) + unreachable +inrange7666: + %t52 = extractvalue { ptr, i64, i64 } %t49, 0 + %t53 = getelementptr inbounds %S.ast.Node, ptr %t52, i64 1 + %t54 = load %S.ast.Node, ptr %t53 + %t55 = load %S.ast.Type, ptr %a15 + %t56 = call %S.gen.Val @finch.gen.exprWant(ptr %t47, %S.ast.Node %t54, %S.ast.Type %t55) + %t57 = load %S.ast.Type, ptr %a15 + %t58 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t59 = load { ptr, i64, i64 }, ptr %t58 + %t60 = extractvalue { ptr, i64, i64 } %t59, 1 + %t61 = icmp uge i64 1, %t60 + br i1 %t61, label %range7667, label %inrange7668 +range7667: + call void @finch_panic_index(ptr @.str.5015, i64 4621, i64 1, i64 %t60) + unreachable +inrange7668: + %t62 = extractvalue { ptr, i64, i64 } %t59, 0 + %t63 = getelementptr inbounds %S.ast.Node, ptr %t62, i64 1 + %t64 = load %S.ast.Node, ptr %t63 + %t65 = call %S.gen.Val @finch.gen.coerce(ptr %t46, %S.gen.Val %t56, %S.ast.Type %t57, %S.ast.Node %t64, { ptr, i64, i64 } { ptr @.str.5016, i64 11, i64 0 }) + %t66 = call { ptr, i64, i64 } @finch.gen.own(ptr %t45, %S.gen.Val %t65) + store { ptr, i64, i64 } %t66, ptr %a67 + %t68 = load ptr, ptr %a1 + %t69 = load { ptr, i64, i64 }, ptr %a37 + %t70 = call { ptr, i64, i64 } @finch.gen.load(ptr %t68, { ptr, i64, i64 } { ptr @.str.5017, i64 3, i64 0 }, { ptr, i64, i64 } %t69) + store { ptr, i64, i64 } %t70, ptr %a71 + %t72 = load ptr, ptr %a1 + %t73 = load { ptr, i64, i64 }, ptr %a71 + store { ptr, i64, i64 } { ptr @.str.5018, i64 8, i64 0 }, ptr %a75 + store { ptr, i64, i64 } %t73, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t77, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.5019, i64 3, i64 0 }, ptr %a80 + call void @finch_str_concat(ptr %a78, ptr %a79, ptr %a80) + %t81 = load { ptr, i64, i64 }, ptr %a78 + %t82 = call { ptr, i64, i64 } @finch.gen.op(ptr %t72, { ptr, i64, i64 } %t81) + store { ptr, i64, i64 } %t82, ptr %a83 + %t84 = load ptr, ptr %a1 + %t85 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5020, i64 33, i64 0 }, ptr %a87 + store { ptr, i64, i64 } %t85, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t89, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.5021, i64 6, i64 0 }, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + %t94 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t93, ptr %a96 + store { ptr, i64, i64 } %t94, ptr %a97 + call void @finch_str_concat(ptr %a95, ptr %a96, ptr %a97) + %t98 = load { ptr, i64, i64 }, ptr %a95 + store { ptr, i64, i64 } %t98, ptr %a100 + store { ptr, i64, i64 } { ptr @.str.5022, i64 6, i64 0 }, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + %t103 = load ptr, ptr %a1 + %t104 = load %S.ast.Type, ptr %a15 + %t105 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t103, %S.ast.Type %t104) + store { ptr, i64, i64 } %t102, ptr %a107 + store { ptr, i64, i64 } %t105, ptr %a108 + call void @finch_str_concat(ptr %a106, ptr %a107, ptr %a108) + %t109 = load { ptr, i64, i64 }, ptr %a106 + store { ptr, i64, i64 } %t109, ptr %a111 + store { ptr, i64, i64 } { ptr @.str.5023, i64 1, i64 0 }, ptr %a112 + call void @finch_str_concat(ptr %a110, ptr %a111, ptr %a112) + %t113 = load { ptr, i64, i64 }, ptr %a110 + call void @finch.gen.emit(ptr %t84, { ptr, i64, i64 } %t113) + %t114 = load ptr, ptr %a1 + %t115 = load { ptr, i64, i64 }, ptr %a3 + %t116 = call { ptr, i64, i64 } @finch.gen.load(ptr %t114, { ptr, i64, i64 } { ptr @.str.5024, i64 3, i64 0 }, { ptr, i64, i64 } %t115) + store { ptr, i64, i64 } %t116, ptr %a117 + %t118 = load ptr, ptr %a1 + %t119 = load { ptr, i64, i64 }, ptr %a19 + %t120 = load { ptr, i64, i64 }, ptr %a67 + %t121 = load ptr, ptr %a1 + %t122 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5025, i64 23, i64 0 }, ptr %a124 + store { ptr, i64, i64 } %t122, ptr %a125 + call void @finch_str_concat(ptr %a123, ptr %a124, ptr %a125) + %t126 = load { ptr, i64, i64 }, ptr %a123 + store { ptr, i64, i64 } %t126, ptr %a128 + store { ptr, i64, i64 } { ptr @.str.5026, i64 6, i64 0 }, ptr %a129 + call void @finch_str_concat(ptr %a127, ptr %a128, ptr %a129) + %t130 = load { ptr, i64, i64 }, ptr %a127 + %t131 = load { ptr, i64, i64 }, ptr %a117 + store { ptr, i64, i64 } %t130, ptr %a133 + store { ptr, i64, i64 } %t131, ptr %a134 + call void @finch_str_concat(ptr %a132, ptr %a133, ptr %a134) + %t135 = load { ptr, i64, i64 }, ptr %a132 + store { ptr, i64, i64 } %t135, ptr %a137 + store { ptr, i64, i64 } { ptr @.str.5027, i64 6, i64 0 }, ptr %a138 + call void @finch_str_concat(ptr %a136, ptr %a137, ptr %a138) + %t139 = load { ptr, i64, i64 }, ptr %a136 + %t140 = load { ptr, i64, i64 }, ptr %a71 + store { ptr, i64, i64 } %t139, ptr %a142 + store { ptr, i64, i64 } %t140, ptr %a143 + call void @finch_str_concat(ptr %a141, ptr %a142, ptr %a143) + %t144 = load { ptr, i64, i64 }, ptr %a141 + %t145 = call { ptr, i64, i64 } @finch.gen.op(ptr %t121, { ptr, i64, i64 } %t144) + call void @finch.gen.store(ptr %t118, { ptr, i64, i64 } %t119, { ptr, i64, i64 } %t120, { ptr, i64, i64 } %t145) + %t146 = load ptr, ptr %a1 + %t147 = load { ptr, i64, i64 }, ptr %a83 + %t148 = load { ptr, i64, i64 }, ptr %a37 + call void @finch.gen.store(ptr %t146, { ptr, i64, i64 } { ptr @.str.5028, i64 3, i64 0 }, { ptr, i64, i64 } %t147, { ptr, i64, i64 } %t148) + %t149 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5029, i64 4, i64 0 }) + %t150 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t149, 1 + ret %S.gen.Val %t150 +endif7664: + %t151 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t151, ptr %a152 + store { ptr, i64, i64 } { ptr @.str.5030, i64 3, i64 0 }, ptr %a153 + %t154 = call i32 @finch_str_eq(ptr %a152, ptr %a153) + %t155 = icmp ne i32 %t154, 0 + br i1 %t155, label %then7669, label %endif7671 +then7669: + %t156 = load ptr, ptr %a1 + %t157 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t156, %S.ast.Node %t157, i64 0) + %t158 = load ptr, ptr %a1 + %t159 = load { ptr, i64, i64 }, ptr %a37 + %t160 = call { ptr, i64, i64 } @finch.gen.load(ptr %t158, { ptr, i64, i64 } { ptr @.str.5031, i64 3, i64 0 }, { ptr, i64, i64 } %t159) + store { ptr, i64, i64 } %t160, ptr %a161 + %t162 = load ptr, ptr %a1 + %t163 = load ptr, ptr %a1 + %t164 = load { ptr, i64, i64 }, ptr %a161 + store { ptr, i64, i64 } { ptr @.str.5032, i64 12, i64 0 }, ptr %a166 + store { ptr, i64, i64 } %t164, ptr %a167 + call void @finch_str_concat(ptr %a165, ptr %a166, ptr %a167) + %t168 = load { ptr, i64, i64 }, ptr %a165 + store { ptr, i64, i64 } %t168, ptr %a170 + store { ptr, i64, i64 } { ptr @.str.5033, i64 3, i64 0 }, ptr %a171 + call void @finch_str_concat(ptr %a169, ptr %a170, ptr %a171) + %t172 = load { ptr, i64, i64 }, ptr %a169 + %t173 = call { ptr, i64, i64 } @finch.gen.op(ptr %t163, { ptr, i64, i64 } %t172) + %t174 = load %S.ast.Node, ptr %a2 + call void @finch.gen.panicIf(ptr %t162, { ptr, i64, i64 } %t173, { ptr, i64, i64 } { ptr @.str.5034, i64 23, i64 0 }, %S.ast.Node %t174) + %t175 = load ptr, ptr %a1 + %t176 = load { ptr, i64, i64 }, ptr %a161 + store { ptr, i64, i64 } { ptr @.str.5035, i64 8, i64 0 }, ptr %a178 + store { ptr, i64, i64 } %t176, ptr %a179 + call void @finch_str_concat(ptr %a177, ptr %a178, ptr %a179) + %t180 = load { ptr, i64, i64 }, ptr %a177 + store { ptr, i64, i64 } %t180, ptr %a182 + store { ptr, i64, i64 } { ptr @.str.5036, i64 3, i64 0 }, ptr %a183 + call void @finch_str_concat(ptr %a181, ptr %a182, ptr %a183) + %t184 = load { ptr, i64, i64 }, ptr %a181 + %t185 = call { ptr, i64, i64 } @finch.gen.op(ptr %t175, { ptr, i64, i64 } %t184) + store { ptr, i64, i64 } %t185, ptr %a186 + %t187 = load ptr, ptr %a1 + %t188 = load { ptr, i64, i64 }, ptr %a3 + %t189 = call { ptr, i64, i64 } @finch.gen.load(ptr %t187, { ptr, i64, i64 } { ptr @.str.5037, i64 3, i64 0 }, { ptr, i64, i64 } %t188) + store { ptr, i64, i64 } %t189, ptr %a190 + %t191 = load ptr, ptr %a1 + %t192 = load { ptr, i64, i64 }, ptr %a19 + %t193 = load ptr, ptr %a1 + %t194 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5038, i64 23, i64 0 }, ptr %a196 + store { ptr, i64, i64 } %t194, ptr %a197 + call void @finch_str_concat(ptr %a195, ptr %a196, ptr %a197) + %t198 = load { ptr, i64, i64 }, ptr %a195 + store { ptr, i64, i64 } %t198, ptr %a200 + store { ptr, i64, i64 } { ptr @.str.5039, i64 6, i64 0 }, ptr %a201 + call void @finch_str_concat(ptr %a199, ptr %a200, ptr %a201) + %t202 = load { ptr, i64, i64 }, ptr %a199 + %t203 = load { ptr, i64, i64 }, ptr %a190 + store { ptr, i64, i64 } %t202, ptr %a205 + store { ptr, i64, i64 } %t203, ptr %a206 + call void @finch_str_concat(ptr %a204, ptr %a205, ptr %a206) + %t207 = load { ptr, i64, i64 }, ptr %a204 + store { ptr, i64, i64 } %t207, ptr %a209 + store { ptr, i64, i64 } { ptr @.str.5040, i64 6, i64 0 }, ptr %a210 + call void @finch_str_concat(ptr %a208, ptr %a209, ptr %a210) + %t211 = load { ptr, i64, i64 }, ptr %a208 + %t212 = load { ptr, i64, i64 }, ptr %a186 + store { ptr, i64, i64 } %t211, ptr %a214 + store { ptr, i64, i64 } %t212, ptr %a215 + call void @finch_str_concat(ptr %a213, ptr %a214, ptr %a215) + %t216 = load { ptr, i64, i64 }, ptr %a213 + %t217 = call { ptr, i64, i64 } @finch.gen.op(ptr %t193, { ptr, i64, i64 } %t216) + %t218 = call { ptr, i64, i64 } @finch.gen.load(ptr %t191, { ptr, i64, i64 } %t192, { ptr, i64, i64 } %t217) + store { ptr, i64, i64 } %t218, ptr %a219 + %t220 = load ptr, ptr %a1 + %t221 = load { ptr, i64, i64 }, ptr %a186 + %t222 = load { ptr, i64, i64 }, ptr %a37 + call void @finch.gen.store(ptr %t220, { ptr, i64, i64 } { ptr @.str.5041, i64 3, i64 0 }, { ptr, i64, i64 } %t221, { ptr, i64, i64 } %t222) + %t223 = load { ptr, i64, i64 }, ptr %a219 + store { ptr, i64, i64 } %t223, ptr %a224 + call void @finch_str_copy(ptr %a225, ptr %a224) + %t226 = load { ptr, i64, i64 }, ptr %a225 + %t227 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t226, 0 + %t228 = load %S.ast.Type, ptr %a15 + store %S.ast.Type %t228, ptr %a229 + call void @finch.copy.S_ast_Type(ptr %a230, ptr %a229) + %t231 = load %S.ast.Type, ptr %a230 + %t232 = insertvalue %S.gen.Val %t227, %S.ast.Type %t231, 1 + %t233 = load ptr, ptr %a1 + %t234 = load %S.ast.Type, ptr %a15 + %t235 = call i1 @finch.gen.owning(ptr %t233, %S.ast.Type %t234) + %t236 = insertvalue %S.gen.Val %t232, i1 %t235, 2 + ret %S.gen.Val %t236 +endif7671: + %t237 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t237, ptr %a238 + store { ptr, i64, i64 } { ptr @.str.5042, i64 5, i64 0 }, ptr %a239 + %t240 = call i32 @finch_str_eq(ptr %a238, ptr %a239) + %t241 = icmp ne i32 %t240, 0 + br i1 %t241, label %then7672, label %endif7674 +then7672: + %t242 = load ptr, ptr %a1 + %t243 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t242, %S.ast.Node %t243, i64 0) + %t244 = load ptr, ptr %a1 + %t245 = load { ptr, i64, i64 }, ptr %a37 + call void @finch.gen.store(ptr %t244, { ptr, i64, i64 } { ptr @.str.5043, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.5044, i64 1, i64 0 }, { ptr, i64, i64 } %t245) + %t246 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5045, i64 4, i64 0 }) + %t247 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t246, 1 + ret %S.gen.Val %t247 +endif7674: + %t248 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t248, ptr %a249 + store { ptr, i64, i64 } { ptr @.str.5046, i64 4, i64 0 }, ptr %a250 + %t251 = call i32 @finch_str_eq(ptr %a249, ptr %a250) + %t252 = icmp ne i32 %t251, 0 + br label %logic.from7675 +logic.from7675: + br i1 %t252, label %logic.end7677, label %logic.rhs7676 +logic.rhs7676: + %t253 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t253, ptr %a254 + store { ptr, i64, i64 } { ptr @.str.5047, i64 8, i64 0 }, ptr %a255 + %t256 = call i32 @finch_str_eq(ptr %a254, ptr %a255) + %t257 = icmp ne i32 %t256, 0 + br label %logic.rend7678 +logic.rend7678: + br label %logic.end7677 +logic.end7677: + %t258 = phi i1 [ true, %logic.from7675 ], [ %t257, %logic.rend7678 ] + br i1 %t258, label %then7679, label %endif7681 +then7679: + %t259 = load ptr, ptr %a1 + %t260 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t259, %S.ast.Node %t260, i64 1) + %t261 = load ptr, ptr %a1 + %t262 = load ptr, ptr %a1 + %t263 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t264 = load { ptr, i64, i64 }, ptr %t263 + %t265 = extractvalue { ptr, i64, i64 } %t264, 1 + %t266 = icmp uge i64 1, %t265 + br i1 %t266, label %range7682, label %inrange7683 +range7682: + call void @finch_panic_index(ptr @.str.5048, i64 4647, i64 1, i64 %t265) + unreachable +inrange7683: + %t267 = extractvalue { ptr, i64, i64 } %t264, 0 + %t268 = getelementptr inbounds %S.ast.Node, ptr %t267, i64 1 + %t269 = load %S.ast.Node, ptr %t268 + %t270 = load %S.ast.Type, ptr %a15 + %t271 = call %S.gen.Val @finch.gen.exprWant(ptr %t262, %S.ast.Node %t269, %S.ast.Type %t270) + %t272 = load %S.ast.Type, ptr %a15 + %t273 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t274 = load { ptr, i64, i64 }, ptr %t273 + %t275 = extractvalue { ptr, i64, i64 } %t274, 1 + %t276 = icmp uge i64 1, %t275 + br i1 %t276, label %range7684, label %inrange7685 +range7684: + call void @finch_panic_index(ptr @.str.5049, i64 4647, i64 1, i64 %t275) + unreachable +inrange7685: + %t277 = extractvalue { ptr, i64, i64 } %t274, 0 + %t278 = getelementptr inbounds %S.ast.Node, ptr %t277, i64 1 + %t279 = load %S.ast.Node, ptr %t278 + %t280 = call %S.gen.Val @finch.gen.coerce(ptr %t261, %S.gen.Val %t271, %S.ast.Type %t272, %S.ast.Node %t279, { ptr, i64, i64 } { ptr @.str.5050, i64 21, i64 0 }) + store %S.gen.Val %t280, ptr %a281 + %t282 = load ptr, ptr %a1 + %t283 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t282, { ptr, i64, i64 } { ptr @.str.5051, i64 3, i64 0 }) + store { ptr, i64, i64 } %t283, ptr %a284 + %t285 = load ptr, ptr %a1 + %t286 = load { ptr, i64, i64 }, ptr %a284 + call void @finch.gen.store(ptr %t285, { ptr, i64, i64 } { ptr @.str.5052, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.5053, i64 2, i64 0 }, { ptr, i64, i64 } %t286) + %t287 = load ptr, ptr %a1 + %t288 = load { ptr, i64, i64 }, ptr %a37 + %t289 = call { ptr, i64, i64 } @finch.gen.load(ptr %t287, { ptr, i64, i64 } { ptr @.str.5054, i64 3, i64 0 }, { ptr, i64, i64 } %t288) + store { ptr, i64, i64 } %t289, ptr %a290 + %t291 = load ptr, ptr %a1 + %t292 = load { ptr, i64, i64 }, ptr %a3 + %t293 = call { ptr, i64, i64 } @finch.gen.load(ptr %t291, { ptr, i64, i64 } { ptr @.str.5055, i64 3, i64 0 }, { ptr, i64, i64 } %t292) + store { ptr, i64, i64 } %t293, ptr %a294 + %t295 = load ptr, ptr %a1 + %t296 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t295, { ptr, i64, i64 } { ptr @.str.5056, i64 3, i64 0 }) + store { ptr, i64, i64 } %t296, ptr %a297 + %t298 = load ptr, ptr %a1 + %t299 = load { ptr, i64, i64 }, ptr %a297 + call void @finch.gen.store(ptr %t298, { ptr, i64, i64 } { ptr @.str.5057, i64 3, i64 0 }, { ptr, i64, i64 } { ptr @.str.5058, i64 1, i64 0 }, { ptr, i64, i64 } %t299) + %t300 = load ptr, ptr %a1 + %t301 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t300, { ptr, i64, i64 } { ptr @.str.5059, i64 9, i64 0 }) + store { ptr, i64, i64 } %t301, ptr %a302 + %t303 = load ptr, ptr %a1 + %t304 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t303, { ptr, i64, i64 } { ptr @.str.5060, i64 9, i64 0 }) + store { ptr, i64, i64 } %t304, ptr %a305 + %t306 = load ptr, ptr %a1 + %t307 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t306, { ptr, i64, i64 } { ptr @.str.5061, i64 8, i64 0 }) + store { ptr, i64, i64 } %t307, ptr %a308 + %t309 = load ptr, ptr %a1 + %t310 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t309, { ptr, i64, i64 } { ptr @.str.5062, i64 9, i64 0 }) + store { ptr, i64, i64 } %t310, ptr %a311 + %t312 = load ptr, ptr %a1 + %t313 = call { ptr, i64, i64 } @finch.gen.newLabel(ptr %t312, { ptr, i64, i64 } { ptr @.str.5063, i64 8, i64 0 }) + store { ptr, i64, i64 } %t313, ptr %a314 + %t315 = load ptr, ptr %a1 + %t316 = load { ptr, i64, i64 }, ptr %a302 + call void @finch.gen.br(ptr %t315, { ptr, i64, i64 } %t316) + %t317 = load ptr, ptr %a1 + %t318 = load { ptr, i64, i64 }, ptr %a302 + call void @finch.gen.label(ptr %t317, { ptr, i64, i64 } %t318) + %t319 = load ptr, ptr %a1 + %t320 = load { ptr, i64, i64 }, ptr %a297 + %t321 = call { ptr, i64, i64 } @finch.gen.load(ptr %t319, { ptr, i64, i64 } { ptr @.str.5064, i64 3, i64 0 }, { ptr, i64, i64 } %t320) + store { ptr, i64, i64 } %t321, ptr %a322 + %t323 = load ptr, ptr %a1 + %t324 = load { ptr, i64, i64 }, ptr %a322 + store { ptr, i64, i64 } { ptr @.str.5065, i64 13, i64 0 }, ptr %a326 + store { ptr, i64, i64 } %t324, ptr %a327 + call void @finch_str_concat(ptr %a325, ptr %a326, ptr %a327) + %t328 = load { ptr, i64, i64 }, ptr %a325 + store { ptr, i64, i64 } %t328, ptr %a330 + store { ptr, i64, i64 } { ptr @.str.5066, i64 2, i64 0 }, ptr %a331 + call void @finch_str_concat(ptr %a329, ptr %a330, ptr %a331) + %t332 = load { ptr, i64, i64 }, ptr %a329 + %t333 = load { ptr, i64, i64 }, ptr %a290 + store { ptr, i64, i64 } %t332, ptr %a335 + store { ptr, i64, i64 } %t333, ptr %a336 + call void @finch_str_concat(ptr %a334, ptr %a335, ptr %a336) + %t337 = load { ptr, i64, i64 }, ptr %a334 + %t338 = call { ptr, i64, i64 } @finch.gen.op(ptr %t323, { ptr, i64, i64 } %t337) + store { ptr, i64, i64 } %t338, ptr %a339 + %t340 = load ptr, ptr %a1 + %t341 = load { ptr, i64, i64 }, ptr %a339 + %t342 = load { ptr, i64, i64 }, ptr %a305 + %t343 = load { ptr, i64, i64 }, ptr %a314 + call void @finch.gen.condBr(ptr %t340, { ptr, i64, i64 } %t341, { ptr, i64, i64 } %t342, { ptr, i64, i64 } %t343) + %t344 = load ptr, ptr %a1 + %t345 = load { ptr, i64, i64 }, ptr %a305 + call void @finch.gen.label(ptr %t344, { ptr, i64, i64 } %t345) + %t346 = load ptr, ptr %a1 + %t347 = load { ptr, i64, i64 }, ptr %a19 + %t348 = load ptr, ptr %a1 + %t349 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5067, i64 23, i64 0 }, ptr %a351 + store { ptr, i64, i64 } %t349, ptr %a352 + call void @finch_str_concat(ptr %a350, ptr %a351, ptr %a352) + %t353 = load { ptr, i64, i64 }, ptr %a350 + store { ptr, i64, i64 } %t353, ptr %a355 + store { ptr, i64, i64 } { ptr @.str.5068, i64 6, i64 0 }, ptr %a356 + call void @finch_str_concat(ptr %a354, ptr %a355, ptr %a356) + %t357 = load { ptr, i64, i64 }, ptr %a354 + %t358 = load { ptr, i64, i64 }, ptr %a294 + store { ptr, i64, i64 } %t357, ptr %a360 + store { ptr, i64, i64 } %t358, ptr %a361 + call void @finch_str_concat(ptr %a359, ptr %a360, ptr %a361) + %t362 = load { ptr, i64, i64 }, ptr %a359 + store { ptr, i64, i64 } %t362, ptr %a364 + store { ptr, i64, i64 } { ptr @.str.5069, i64 6, i64 0 }, ptr %a365 + call void @finch_str_concat(ptr %a363, ptr %a364, ptr %a365) + %t366 = load { ptr, i64, i64 }, ptr %a363 + %t367 = load { ptr, i64, i64 }, ptr %a322 + store { ptr, i64, i64 } %t366, ptr %a369 + store { ptr, i64, i64 } %t367, ptr %a370 + call void @finch_str_concat(ptr %a368, ptr %a369, ptr %a370) + %t371 = load { ptr, i64, i64 }, ptr %a368 + %t372 = call { ptr, i64, i64 } @finch.gen.op(ptr %t348, { ptr, i64, i64 } %t371) + %t373 = call { ptr, i64, i64 } @finch.gen.load(ptr %t346, { ptr, i64, i64 } %t347, { ptr, i64, i64 } %t372) + %t374 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t373, 0 + %t375 = load %S.ast.Type, ptr %a15 + store %S.ast.Type %t375, ptr %a376 + call void @finch.copy.S_ast_Type(ptr %a377, ptr %a376) + %t378 = load %S.ast.Type, ptr %a377 + %t379 = insertvalue %S.gen.Val %t374, %S.ast.Type %t378, 1 + store %S.gen.Val %t379, ptr %a380 + %t381 = load ptr, ptr %a1 + %t382 = load %S.gen.Val, ptr %a380 + %t383 = load %S.gen.Val, ptr %a281 + %t384 = load %S.ast.Node, ptr %a2 + %t385 = call %S.gen.Val @finch.gen.compare(ptr %t381, { ptr, i64, i64 } { ptr @.str.5070, i64 2, i64 0 }, %S.gen.Val %t382, %S.gen.Val %t383, %S.ast.Node %t384) + %t386 = extractvalue %S.gen.Val %t385, 0 + store { ptr, i64, i64 } %t386, ptr %a387 + call void @finch_str_copy(ptr %a388, ptr %a387) + %t389 = load { ptr, i64, i64 }, ptr %a388 + store { ptr, i64, i64 } %t389, ptr %a390 + %t391 = load ptr, ptr %a1 + %t392 = load { ptr, i64, i64 }, ptr %a390 + %t393 = load { ptr, i64, i64 }, ptr %a308 + %t394 = load { ptr, i64, i64 }, ptr %a311 + call void @finch.gen.condBr(ptr %t391, { ptr, i64, i64 } %t392, { ptr, i64, i64 } %t393, { ptr, i64, i64 } %t394) + %t395 = load ptr, ptr %a1 + %t396 = load { ptr, i64, i64 }, ptr %a308 + call void @finch.gen.label(ptr %t395, { ptr, i64, i64 } %t396) + %t397 = load ptr, ptr %a1 + %t398 = load { ptr, i64, i64 }, ptr %a322 + %t399 = load { ptr, i64, i64 }, ptr %a284 + call void @finch.gen.store(ptr %t397, { ptr, i64, i64 } { ptr @.str.5071, i64 3, i64 0 }, { ptr, i64, i64 } %t398, { ptr, i64, i64 } %t399) + %t400 = load ptr, ptr %a1 + %t401 = load { ptr, i64, i64 }, ptr %a314 + call void @finch.gen.br(ptr %t400, { ptr, i64, i64 } %t401) + %t402 = load ptr, ptr %a1 + %t403 = load { ptr, i64, i64 }, ptr %a311 + call void @finch.gen.label(ptr %t402, { ptr, i64, i64 } %t403) + %t404 = load ptr, ptr %a1 + %t405 = load ptr, ptr %a1 + %t406 = load { ptr, i64, i64 }, ptr %a322 + store { ptr, i64, i64 } { ptr @.str.5073, i64 8, i64 0 }, ptr %a408 + store { ptr, i64, i64 } %t406, ptr %a409 + call void @finch_str_concat(ptr %a407, ptr %a408, ptr %a409) + %t410 = load { ptr, i64, i64 }, ptr %a407 + store { ptr, i64, i64 } %t410, ptr %a412 + store { ptr, i64, i64 } { ptr @.str.5074, i64 3, i64 0 }, ptr %a413 + call void @finch_str_concat(ptr %a411, ptr %a412, ptr %a413) + %t414 = load { ptr, i64, i64 }, ptr %a411 + %t415 = call { ptr, i64, i64 } @finch.gen.op(ptr %t405, { ptr, i64, i64 } %t414) + %t416 = load { ptr, i64, i64 }, ptr %a297 + call void @finch.gen.store(ptr %t404, { ptr, i64, i64 } { ptr @.str.5072, i64 3, i64 0 }, { ptr, i64, i64 } %t415, { ptr, i64, i64 } %t416) + %t417 = load ptr, ptr %a1 + %t418 = load { ptr, i64, i64 }, ptr %a302 + call void @finch.gen.br(ptr %t417, { ptr, i64, i64 } %t418) + %t419 = load ptr, ptr %a1 + %t420 = load { ptr, i64, i64 }, ptr %a314 + call void @finch.gen.label(ptr %t419, { ptr, i64, i64 } %t420) + %t421 = load ptr, ptr %a1 + %t422 = load { ptr, i64, i64 }, ptr %a284 + %t423 = call { ptr, i64, i64 } @finch.gen.load(ptr %t421, { ptr, i64, i64 } { ptr @.str.5075, i64 3, i64 0 }, { ptr, i64, i64 } %t422) + store { ptr, i64, i64 } %t423, ptr %a424 + %t425 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t425, ptr %a426 + store { ptr, i64, i64 } { ptr @.str.5076, i64 4, i64 0 }, ptr %a427 + %t428 = call i32 @finch_str_eq(ptr %a426, ptr %a427) + %t429 = icmp ne i32 %t428, 0 + br i1 %t429, label %then7686, label %endif7688 +then7686: + %t430 = load { ptr, i64, i64 }, ptr %a424 + store { ptr, i64, i64 } %t430, ptr %a431 + call void @finch_str_copy(ptr %a432, ptr %a431) + %t433 = load { ptr, i64, i64 }, ptr %a432 + %t434 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t433, 0 + %t435 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5077, i64 3, i64 0 }) + %t436 = insertvalue %S.gen.Val %t434, %S.ast.Type %t435, 1 + ret %S.gen.Val %t436 +endif7688: + %t437 = load ptr, ptr %a1 + %t438 = load { ptr, i64, i64 }, ptr %a424 + store { ptr, i64, i64 } { ptr @.str.5078, i64 13, i64 0 }, ptr %a440 + store { ptr, i64, i64 } %t438, ptr %a441 + call void @finch_str_concat(ptr %a439, ptr %a440, ptr %a441) + %t442 = load { ptr, i64, i64 }, ptr %a439 + store { ptr, i64, i64 } %t442, ptr %a444 + store { ptr, i64, i64 } { ptr @.str.5079, i64 3, i64 0 }, ptr %a445 + call void @finch_str_concat(ptr %a443, ptr %a444, ptr %a445) + %t446 = load { ptr, i64, i64 }, ptr %a443 + %t447 = call { ptr, i64, i64 } @finch.gen.op(ptr %t437, { ptr, i64, i64 } %t446) + %t448 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t447, 0 + %t449 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5080, i64 4, i64 0 }) + %t450 = insertvalue %S.gen.Val %t448, %S.ast.Type %t449, 1 + ret %S.gen.Val %t450 +endif7681: + %t451 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t451, ptr %a452 + store { ptr, i64, i64 } { ptr @.str.5081, i64 4, i64 0 }, ptr %a453 + %t454 = call i32 @finch_str_eq(ptr %a452, ptr %a453) + %t455 = icmp ne i32 %t454, 0 + br i1 %t455, label %then7689, label %endif7691 +then7689: + %t456 = load ptr, ptr %a1 + %t457 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t456, %S.ast.Node %t457, i64 1) + %t458 = getelementptr inbounds %S.ast.Type, ptr %a15, i32 0, i32 0 + %t459 = load { ptr, i64, i64 }, ptr %t458 + store { ptr, i64, i64 } %t459, ptr %a460 + store { ptr, i64, i64 } { ptr @.str.5082, i64 3, i64 0 }, ptr %a461 + %t462 = call i32 @finch_str_eq(ptr %a460, ptr %a461) + %t463 = icmp eq i32 %t462, 0 + br i1 %t463, label %then7692, label %endif7694 +then7692: + %t464 = load ptr, ptr %a1 + %t465 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t464, %S.ast.Node %t465, { ptr, i64, i64 } { ptr @.str.5083, i64 31, i64 0 }) + br label %endif7694 +endif7694: + %t466 = load ptr, ptr %a1 + %t467 = load ptr, ptr %a1 + %t468 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t469 = load { ptr, i64, i64 }, ptr %t468 + %t470 = extractvalue { ptr, i64, i64 } %t469, 1 + %t471 = icmp uge i64 1, %t470 + br i1 %t471, label %range7695, label %inrange7696 +range7695: + call void @finch_panic_index(ptr @.str.5084, i64 4686, i64 1, i64 %t470) + unreachable +inrange7696: + %t472 = extractvalue { ptr, i64, i64 } %t469, 0 + %t473 = getelementptr inbounds %S.ast.Node, ptr %t472, i64 1 + %t474 = load %S.ast.Node, ptr %t473 + %t475 = call %S.gen.Val @finch.gen.strArg(ptr %t467, %S.ast.Node %t474, { ptr, i64, i64 } { ptr @.str.5085, i64 13, i64 0 }) + %t476 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t466, %S.gen.Val %t475) + store { ptr, i64, i64 } %t476, ptr %a477 + %t478 = load ptr, ptr %a1 + %t479 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t478) + store { ptr, i64, i64 } %t479, ptr %a480 + %t481 = load ptr, ptr %a1 + %t482 = load { ptr, i64, i64 }, ptr %a480 + store { ptr, i64, i64 } { ptr @.str.5086, i64 30, i64 0 }, ptr %a484 + store { ptr, i64, i64 } %t482, ptr %a485 + call void @finch_str_concat(ptr %a483, ptr %a484, ptr %a485) + %t486 = load { ptr, i64, i64 }, ptr %a483 + store { ptr, i64, i64 } %t486, ptr %a488 + store { ptr, i64, i64 } { ptr @.str.5087, i64 6, i64 0 }, ptr %a489 + call void @finch_str_concat(ptr %a487, ptr %a488, ptr %a489) + %t490 = load { ptr, i64, i64 }, ptr %a487 + %t491 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t490, ptr %a493 + store { ptr, i64, i64 } %t491, ptr %a494 + call void @finch_str_concat(ptr %a492, ptr %a493, ptr %a494) + %t495 = load { ptr, i64, i64 }, ptr %a492 + store { ptr, i64, i64 } %t495, ptr %a497 + store { ptr, i64, i64 } { ptr @.str.5088, i64 6, i64 0 }, ptr %a498 + call void @finch_str_concat(ptr %a496, ptr %a497, ptr %a498) + %t499 = load { ptr, i64, i64 }, ptr %a496 + %t500 = load { ptr, i64, i64 }, ptr %a477 + store { ptr, i64, i64 } %t499, ptr %a502 + store { ptr, i64, i64 } %t500, ptr %a503 + call void @finch_str_concat(ptr %a501, ptr %a502, ptr %a503) + %t504 = load { ptr, i64, i64 }, ptr %a501 + store { ptr, i64, i64 } %t504, ptr %a506 + store { ptr, i64, i64 } { ptr @.str.5089, i64 1, i64 0 }, ptr %a507 + call void @finch_str_concat(ptr %a505, ptr %a506, ptr %a507) + %t508 = load { ptr, i64, i64 }, ptr %a505 + call void @finch.gen.emit(ptr %t481, { ptr, i64, i64 } %t508) + %t509 = load ptr, ptr %a1 + %t510 = load { ptr, i64, i64 }, ptr %a480 + %t511 = call { ptr, i64, i64 } @finch.gen.load(ptr %t509, { ptr, i64, i64 } { ptr @.str.5090, i64 17, i64 0 }, { ptr, i64, i64 } %t510) + %t512 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t511, 0 + %t513 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5091, i64 3, i64 0 }) + %t514 = insertvalue %S.gen.Val %t512, %S.ast.Type %t513, 1 + %t515 = insertvalue %S.gen.Val %t514, i1 true, 2 + ret %S.gen.Val %t515 +endif7691: + %t516 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t516, ptr %a517 + store { ptr, i64, i64 } { ptr @.str.5092, i64 6, i64 0 }, ptr %a518 + %t519 = call i32 @finch_str_eq(ptr %a517, ptr %a518) + %t520 = icmp ne i32 %t519, 0 + br i1 %t520, label %then7697, label %endif7699 +then7697: + %t521 = load ptr, ptr %a1 + %t522 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t521, %S.ast.Node %t522, i64 2) + %t523 = load ptr, ptr %a1 + %t524 = load ptr, ptr %a1 + %t525 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t526 = load { ptr, i64, i64 }, ptr %t525 + %t527 = extractvalue { ptr, i64, i64 } %t526, 1 + %t528 = icmp uge i64 1, %t527 + br i1 %t528, label %range7700, label %inrange7701 +range7700: + call void @finch_panic_index(ptr @.str.5093, i64 4693, i64 1, i64 %t527) + unreachable +inrange7701: + %t529 = extractvalue { ptr, i64, i64 } %t526, 0 + %t530 = getelementptr inbounds %S.ast.Node, ptr %t529, i64 1 + %t531 = load %S.ast.Node, ptr %t530 + %t532 = call %S.gen.Val @finch.gen.expr(ptr %t524, %S.ast.Node %t531) + %t533 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5094, i64 3, i64 0 }) + %t534 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t535 = load { ptr, i64, i64 }, ptr %t534 + %t536 = extractvalue { ptr, i64, i64 } %t535, 1 + %t537 = icmp uge i64 1, %t536 + br i1 %t537, label %range7702, label %inrange7703 +range7702: + call void @finch_panic_index(ptr @.str.5095, i64 4693, i64 1, i64 %t536) + unreachable +inrange7703: + %t538 = extractvalue { ptr, i64, i64 } %t535, 0 + %t539 = getelementptr inbounds %S.ast.Node, ptr %t538, i64 1 + %t540 = load %S.ast.Node, ptr %t539 + %t541 = call %S.gen.Val @finch.gen.coerce(ptr %t523, %S.gen.Val %t532, %S.ast.Type %t533, %S.ast.Node %t540, { ptr, i64, i64 } { ptr @.str.5096, i64 12, i64 0 }) + %t542 = extractvalue %S.gen.Val %t541, 0 + store { ptr, i64, i64 } %t542, ptr %a543 + call void @finch_str_copy(ptr %a544, ptr %a543) + %t545 = load { ptr, i64, i64 }, ptr %a544 + store { ptr, i64, i64 } %t545, ptr %a546 + %t547 = load ptr, ptr %a1 + %t548 = load ptr, ptr %a1 + %t549 = load ptr, ptr %a1 + %t550 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t551 = load { ptr, i64, i64 }, ptr %t550 + %t552 = extractvalue { ptr, i64, i64 } %t551, 1 + %t553 = icmp uge i64 2, %t552 + br i1 %t553, label %range7704, label %inrange7705 +range7704: + call void @finch_panic_index(ptr @.str.5097, i64 4694, i64 2, i64 %t552) + unreachable +inrange7705: + %t554 = extractvalue { ptr, i64, i64 } %t551, 0 + %t555 = getelementptr inbounds %S.ast.Node, ptr %t554, i64 2 + %t556 = load %S.ast.Node, ptr %t555 + %t557 = load %S.ast.Type, ptr %a15 + %t558 = call %S.gen.Val @finch.gen.exprWant(ptr %t549, %S.ast.Node %t556, %S.ast.Type %t557) + %t559 = load %S.ast.Type, ptr %a15 + %t560 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t561 = load { ptr, i64, i64 }, ptr %t560 + %t562 = extractvalue { ptr, i64, i64 } %t561, 1 + %t563 = icmp uge i64 2, %t562 + br i1 %t563, label %range7706, label %inrange7707 +range7706: + call void @finch_panic_index(ptr @.str.5098, i64 4694, i64 2, i64 %t562) + unreachable +inrange7707: + %t564 = extractvalue { ptr, i64, i64 } %t561, 0 + %t565 = getelementptr inbounds %S.ast.Node, ptr %t564, i64 2 + %t566 = load %S.ast.Node, ptr %t565 + %t567 = call %S.gen.Val @finch.gen.coerce(ptr %t548, %S.gen.Val %t558, %S.ast.Type %t559, %S.ast.Node %t566, { ptr, i64, i64 } { ptr @.str.5099, i64 11, i64 0 }) + %t568 = call { ptr, i64, i64 } @finch.gen.own(ptr %t547, %S.gen.Val %t567) + store { ptr, i64, i64 } %t568, ptr %a569 + %t570 = load ptr, ptr %a1 + %t571 = load ptr, ptr %a1 + %t572 = icmp eq ptr %t571, null + br i1 %t572, label %panic7708, label %ok7709 +panic7708: + call void @finch_panic(ptr @.str.5100, i64 4695, ptr @.str.5101) + unreachable +ok7709: + %t573 = getelementptr inbounds %S.gen.Gen, ptr %t571, i32 0, i32 1 + %t574 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t575 = load i64, ptr %t574 + %t576 = load { ptr, i64, i64 }, ptr %t573 + %t577 = extractvalue { ptr, i64, i64 } %t576, 1 + %t578 = icmp uge i64 %t575, %t577 + br i1 %t578, label %range7710, label %inrange7711 +range7710: + call void @finch_panic_index(ptr @.str.5102, i64 4695, i64 %t575, i64 %t577) + unreachable +inrange7711: + %t579 = extractvalue { ptr, i64, i64 } %t576, 0 + %t580 = getelementptr inbounds { ptr, i64, i64 }, ptr %t579, i64 %t575 + %t581 = load { ptr, i64, i64 }, ptr %t580 + %t582 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t570, { ptr, i64, i64 } %t581) + store { ptr, i64, i64 } %t582, ptr %a583 + %t584 = load ptr, ptr %a1 + %t585 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5103, i64 36, i64 0 }, ptr %a587 + store { ptr, i64, i64 } %t585, ptr %a588 + call void @finch_str_concat(ptr %a586, ptr %a587, ptr %a588) + %t589 = load { ptr, i64, i64 }, ptr %a586 + store { ptr, i64, i64 } %t589, ptr %a591 + store { ptr, i64, i64 } { ptr @.str.5104, i64 6, i64 0 }, ptr %a592 + call void @finch_str_concat(ptr %a590, ptr %a591, ptr %a592) + %t593 = load { ptr, i64, i64 }, ptr %a590 + %t594 = load { ptr, i64, i64 }, ptr %a546 + store { ptr, i64, i64 } %t593, ptr %a596 + store { ptr, i64, i64 } %t594, ptr %a597 + call void @finch_str_concat(ptr %a595, ptr %a596, ptr %a597) + %t598 = load { ptr, i64, i64 }, ptr %a595 + store { ptr, i64, i64 } %t598, ptr %a600 + store { ptr, i64, i64 } { ptr @.str.5105, i64 6, i64 0 }, ptr %a601 + call void @finch_str_concat(ptr %a599, ptr %a600, ptr %a601) + %t602 = load { ptr, i64, i64 }, ptr %a599 + %t603 = load ptr, ptr %a1 + %t604 = load %S.ast.Type, ptr %a15 + %t605 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t603, %S.ast.Type %t604) + store { ptr, i64, i64 } %t602, ptr %a607 + store { ptr, i64, i64 } %t605, ptr %a608 + call void @finch_str_concat(ptr %a606, ptr %a607, ptr %a608) + %t609 = load { ptr, i64, i64 }, ptr %a606 + store { ptr, i64, i64 } %t609, ptr %a611 + store { ptr, i64, i64 } { ptr @.str.5106, i64 6, i64 0 }, ptr %a612 + call void @finch_str_concat(ptr %a610, ptr %a611, ptr %a612) + %t613 = load { ptr, i64, i64 }, ptr %a610 + %t614 = load { ptr, i64, i64 }, ptr %a583 + store { ptr, i64, i64 } %t613, ptr %a616 + store { ptr, i64, i64 } %t614, ptr %a617 + call void @finch_str_concat(ptr %a615, ptr %a616, ptr %a617) + %t618 = load { ptr, i64, i64 }, ptr %a615 + store { ptr, i64, i64 } %t618, ptr %a620 + store { ptr, i64, i64 } { ptr @.str.5107, i64 6, i64 0 }, ptr %a621 + call void @finch_str_concat(ptr %a619, ptr %a620, ptr %a621) + %t622 = load { ptr, i64, i64 }, ptr %a619 + %t623 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t624 = load i64, ptr %t623 + call void @finch_str_from_int(ptr %a625, i64 %t624) + %t626 = load { ptr, i64, i64 }, ptr %a625 + store { ptr, i64, i64 } %t622, ptr %a628 + store { ptr, i64, i64 } %t626, ptr %a629 + call void @finch_str_concat(ptr %a627, ptr %a628, ptr %a629) + %t630 = load { ptr, i64, i64 }, ptr %a627 + store { ptr, i64, i64 } %t630, ptr %a632 + store { ptr, i64, i64 } { ptr @.str.5108, i64 1, i64 0 }, ptr %a633 + call void @finch_str_concat(ptr %a631, ptr %a632, ptr %a633) + %t634 = load { ptr, i64, i64 }, ptr %a631 + call void @finch.gen.emit(ptr %t584, { ptr, i64, i64 } %t634) + %t635 = load ptr, ptr %a1 + %t636 = load { ptr, i64, i64 }, ptr %a3 + %t637 = call { ptr, i64, i64 } @finch.gen.load(ptr %t635, { ptr, i64, i64 } { ptr @.str.5109, i64 3, i64 0 }, { ptr, i64, i64 } %t636) + store { ptr, i64, i64 } %t637, ptr %a638 + %t639 = load ptr, ptr %a1 + %t640 = load { ptr, i64, i64 }, ptr %a19 + %t641 = load { ptr, i64, i64 }, ptr %a569 + %t642 = load ptr, ptr %a1 + %t643 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5110, i64 23, i64 0 }, ptr %a645 + store { ptr, i64, i64 } %t643, ptr %a646 + call void @finch_str_concat(ptr %a644, ptr %a645, ptr %a646) + %t647 = load { ptr, i64, i64 }, ptr %a644 + store { ptr, i64, i64 } %t647, ptr %a649 + store { ptr, i64, i64 } { ptr @.str.5111, i64 6, i64 0 }, ptr %a650 + call void @finch_str_concat(ptr %a648, ptr %a649, ptr %a650) + %t651 = load { ptr, i64, i64 }, ptr %a648 + %t652 = load { ptr, i64, i64 }, ptr %a638 + store { ptr, i64, i64 } %t651, ptr %a654 + store { ptr, i64, i64 } %t652, ptr %a655 + call void @finch_str_concat(ptr %a653, ptr %a654, ptr %a655) + %t656 = load { ptr, i64, i64 }, ptr %a653 + store { ptr, i64, i64 } %t656, ptr %a658 + store { ptr, i64, i64 } { ptr @.str.5112, i64 6, i64 0 }, ptr %a659 + call void @finch_str_concat(ptr %a657, ptr %a658, ptr %a659) + %t660 = load { ptr, i64, i64 }, ptr %a657 + %t661 = load { ptr, i64, i64 }, ptr %a546 + store { ptr, i64, i64 } %t660, ptr %a663 + store { ptr, i64, i64 } %t661, ptr %a664 + call void @finch_str_concat(ptr %a662, ptr %a663, ptr %a664) + %t665 = load { ptr, i64, i64 }, ptr %a662 + %t666 = call { ptr, i64, i64 } @finch.gen.op(ptr %t642, { ptr, i64, i64 } %t665) + call void @finch.gen.store(ptr %t639, { ptr, i64, i64 } %t640, { ptr, i64, i64 } %t641, { ptr, i64, i64 } %t666) + %t667 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5113, i64 4, i64 0 }) + %t668 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t667, 1 + ret %S.gen.Val %t668 +endif7699: + %t669 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t669, ptr %a670 + store { ptr, i64, i64 } { ptr @.str.5114, i64 6, i64 0 }, ptr %a671 + %t672 = call i32 @finch_str_eq(ptr %a670, ptr %a671) + %t673 = icmp ne i32 %t672, 0 + br i1 %t673, label %then7712, label %endif7714 +then7712: + %t674 = load ptr, ptr %a1 + %t675 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t674, %S.ast.Node %t675, i64 1) + %t676 = load ptr, ptr %a1 + %t677 = load ptr, ptr %a1 + %t678 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t679 = load { ptr, i64, i64 }, ptr %t678 + %t680 = extractvalue { ptr, i64, i64 } %t679, 1 + %t681 = icmp uge i64 1, %t680 + br i1 %t681, label %range7715, label %inrange7716 +range7715: + call void @finch_panic_index(ptr @.str.5115, i64 4703, i64 1, i64 %t680) + unreachable +inrange7716: + %t682 = extractvalue { ptr, i64, i64 } %t679, 0 + %t683 = getelementptr inbounds %S.ast.Node, ptr %t682, i64 1 + %t684 = load %S.ast.Node, ptr %t683 + %t685 = call %S.gen.Val @finch.gen.expr(ptr %t677, %S.ast.Node %t684) + %t686 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5116, i64 3, i64 0 }) + %t687 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t688 = load { ptr, i64, i64 }, ptr %t687 + %t689 = extractvalue { ptr, i64, i64 } %t688, 1 + %t690 = icmp uge i64 1, %t689 + br i1 %t690, label %range7717, label %inrange7718 +range7717: + call void @finch_panic_index(ptr @.str.5117, i64 4703, i64 1, i64 %t689) + unreachable +inrange7718: + %t691 = extractvalue { ptr, i64, i64 } %t688, 0 + %t692 = getelementptr inbounds %S.ast.Node, ptr %t691, i64 1 + %t693 = load %S.ast.Node, ptr %t692 + %t694 = call %S.gen.Val @finch.gen.coerce(ptr %t676, %S.gen.Val %t685, %S.ast.Type %t686, %S.ast.Node %t693, { ptr, i64, i64 } { ptr @.str.5118, i64 12, i64 0 }) + %t695 = extractvalue %S.gen.Val %t694, 0 + store { ptr, i64, i64 } %t695, ptr %a696 + call void @finch_str_copy(ptr %a697, ptr %a696) + %t698 = load { ptr, i64, i64 }, ptr %a697 + store { ptr, i64, i64 } %t698, ptr %a699 + %t700 = load ptr, ptr %a1 + %t701 = load { ptr, i64, i64 }, ptr %a699 + %t702 = load ptr, ptr %a1 + %t703 = load { ptr, i64, i64 }, ptr %a37 + %t704 = call { ptr, i64, i64 } @finch.gen.load(ptr %t702, { ptr, i64, i64 } { ptr @.str.5119, i64 3, i64 0 }, { ptr, i64, i64 } %t703) + %t705 = load %S.ast.Node, ptr %a2 + call void @finch.gen.boundsCheck(ptr %t700, { ptr, i64, i64 } %t701, { ptr, i64, i64 } %t704, %S.ast.Node %t705) + %t706 = load ptr, ptr %a1 + %t707 = load { ptr, i64, i64 }, ptr %a3 + %t708 = call { ptr, i64, i64 } @finch.gen.load(ptr %t706, { ptr, i64, i64 } { ptr @.str.5120, i64 3, i64 0 }, { ptr, i64, i64 } %t707) + store { ptr, i64, i64 } %t708, ptr %a709 + %t710 = load ptr, ptr %a1 + %t711 = load { ptr, i64, i64 }, ptr %a19 + %t712 = load ptr, ptr %a1 + %t713 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5121, i64 23, i64 0 }, ptr %a715 + store { ptr, i64, i64 } %t713, ptr %a716 + call void @finch_str_concat(ptr %a714, ptr %a715, ptr %a716) + %t717 = load { ptr, i64, i64 }, ptr %a714 + store { ptr, i64, i64 } %t717, ptr %a719 + store { ptr, i64, i64 } { ptr @.str.5122, i64 6, i64 0 }, ptr %a720 + call void @finch_str_concat(ptr %a718, ptr %a719, ptr %a720) + %t721 = load { ptr, i64, i64 }, ptr %a718 + %t722 = load { ptr, i64, i64 }, ptr %a709 + store { ptr, i64, i64 } %t721, ptr %a724 + store { ptr, i64, i64 } %t722, ptr %a725 + call void @finch_str_concat(ptr %a723, ptr %a724, ptr %a725) + %t726 = load { ptr, i64, i64 }, ptr %a723 + store { ptr, i64, i64 } %t726, ptr %a728 + store { ptr, i64, i64 } { ptr @.str.5123, i64 6, i64 0 }, ptr %a729 + call void @finch_str_concat(ptr %a727, ptr %a728, ptr %a729) + %t730 = load { ptr, i64, i64 }, ptr %a727 + %t731 = load { ptr, i64, i64 }, ptr %a699 + store { ptr, i64, i64 } %t730, ptr %a733 + store { ptr, i64, i64 } %t731, ptr %a734 + call void @finch_str_concat(ptr %a732, ptr %a733, ptr %a734) + %t735 = load { ptr, i64, i64 }, ptr %a732 + %t736 = call { ptr, i64, i64 } @finch.gen.op(ptr %t712, { ptr, i64, i64 } %t735) + %t737 = call { ptr, i64, i64 } @finch.gen.load(ptr %t710, { ptr, i64, i64 } %t711, { ptr, i64, i64 } %t736) + store { ptr, i64, i64 } %t737, ptr %a738 + %t739 = load ptr, ptr %a1 + %t740 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5124, i64 36, i64 0 }, ptr %a742 + store { ptr, i64, i64 } %t740, ptr %a743 + call void @finch_str_concat(ptr %a741, ptr %a742, ptr %a743) + %t744 = load { ptr, i64, i64 }, ptr %a741 + store { ptr, i64, i64 } %t744, ptr %a746 + store { ptr, i64, i64 } { ptr @.str.5125, i64 6, i64 0 }, ptr %a747 + call void @finch_str_concat(ptr %a745, ptr %a746, ptr %a747) + %t748 = load { ptr, i64, i64 }, ptr %a745 + %t749 = load { ptr, i64, i64 }, ptr %a699 + store { ptr, i64, i64 } %t748, ptr %a751 + store { ptr, i64, i64 } %t749, ptr %a752 + call void @finch_str_concat(ptr %a750, ptr %a751, ptr %a752) + %t753 = load { ptr, i64, i64 }, ptr %a750 + store { ptr, i64, i64 } %t753, ptr %a755 + store { ptr, i64, i64 } { ptr @.str.5126, i64 6, i64 0 }, ptr %a756 + call void @finch_str_concat(ptr %a754, ptr %a755, ptr %a756) + %t757 = load { ptr, i64, i64 }, ptr %a754 + %t758 = load ptr, ptr %a1 + %t759 = load %S.ast.Type, ptr %a15 + %t760 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t758, %S.ast.Type %t759) + store { ptr, i64, i64 } %t757, ptr %a762 + store { ptr, i64, i64 } %t760, ptr %a763 + call void @finch_str_concat(ptr %a761, ptr %a762, ptr %a763) + %t764 = load { ptr, i64, i64 }, ptr %a761 + store { ptr, i64, i64 } %t764, ptr %a766 + store { ptr, i64, i64 } { ptr @.str.5127, i64 1, i64 0 }, ptr %a767 + call void @finch_str_concat(ptr %a765, ptr %a766, ptr %a767) + %t768 = load { ptr, i64, i64 }, ptr %a765 + call void @finch.gen.emit(ptr %t739, { ptr, i64, i64 } %t768) + %t769 = load { ptr, i64, i64 }, ptr %a738 + store { ptr, i64, i64 } %t769, ptr %a770 + call void @finch_str_copy(ptr %a771, ptr %a770) + %t772 = load { ptr, i64, i64 }, ptr %a771 + %t773 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t772, 0 + %t774 = load %S.ast.Type, ptr %a15 + store %S.ast.Type %t774, ptr %a775 + call void @finch.copy.S_ast_Type(ptr %a776, ptr %a775) + %t777 = load %S.ast.Type, ptr %a776 + %t778 = insertvalue %S.gen.Val %t773, %S.ast.Type %t777, 1 + %t779 = load ptr, ptr %a1 + %t780 = load %S.ast.Type, ptr %a15 + %t781 = call i1 @finch.gen.owning(ptr %t779, %S.ast.Type %t780) + %t782 = insertvalue %S.gen.Val %t778, i1 %t781, 2 + ret %S.gen.Val %t782 +endif7714: + %t783 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t783, ptr %a784 + store { ptr, i64, i64 } { ptr @.str.5128, i64 6, i64 0 }, ptr %a785 + %t786 = call i32 @finch_str_eq(ptr %a784, ptr %a785) + %t787 = icmp ne i32 %t786, 0 + br i1 %t787, label %then7719, label %endif7721 +then7719: + %t788 = load ptr, ptr %a1 + %t789 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t788, %S.ast.Node %t789, i64 1) + %t790 = load ptr, ptr %a1 + %t791 = load ptr, ptr %a1 + %t792 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t793 = load { ptr, i64, i64 }, ptr %t792 + %t794 = extractvalue { ptr, i64, i64 } %t793, 1 + %t795 = icmp uge i64 1, %t794 + br i1 %t795, label %range7722, label %inrange7723 +range7722: + call void @finch_panic_index(ptr @.str.5129, i64 4712, i64 1, i64 %t794) + unreachable +inrange7723: + %t796 = extractvalue { ptr, i64, i64 } %t793, 0 + %t797 = getelementptr inbounds %S.ast.Node, ptr %t796, i64 1 + %t798 = load %S.ast.Node, ptr %t797 + %t799 = call %S.gen.Val @finch.gen.expr(ptr %t791, %S.ast.Node %t798) + %t800 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5130, i64 3, i64 0 }) + %t801 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t802 = load { ptr, i64, i64 }, ptr %t801 + %t803 = extractvalue { ptr, i64, i64 } %t802, 1 + %t804 = icmp uge i64 1, %t803 + br i1 %t804, label %range7724, label %inrange7725 +range7724: + call void @finch_panic_index(ptr @.str.5131, i64 4712, i64 1, i64 %t803) + unreachable +inrange7725: + %t805 = extractvalue { ptr, i64, i64 } %t802, 0 + %t806 = getelementptr inbounds %S.ast.Node, ptr %t805, i64 1 + %t807 = load %S.ast.Node, ptr %t806 + %t808 = call %S.gen.Val @finch.gen.coerce(ptr %t790, %S.gen.Val %t799, %S.ast.Type %t800, %S.ast.Node %t807, { ptr, i64, i64 } { ptr @.str.5132, i64 14, i64 0 }) + %t809 = extractvalue %S.gen.Val %t808, 0 + store { ptr, i64, i64 } %t809, ptr %a810 + call void @finch_str_copy(ptr %a811, ptr %a810) + %t812 = load { ptr, i64, i64 }, ptr %a811 + store { ptr, i64, i64 } %t812, ptr %a813 + %t814 = load ptr, ptr %a1 + %t815 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5133, i64 32, i64 0 }, ptr %a817 + store { ptr, i64, i64 } %t815, ptr %a818 + call void @finch_str_concat(ptr %a816, ptr %a817, ptr %a818) + %t819 = load { ptr, i64, i64 }, ptr %a816 + store { ptr, i64, i64 } %t819, ptr %a821 + store { ptr, i64, i64 } { ptr @.str.5134, i64 6, i64 0 }, ptr %a822 + call void @finch_str_concat(ptr %a820, ptr %a821, ptr %a822) + %t823 = load { ptr, i64, i64 }, ptr %a820 + %t824 = load { ptr, i64, i64 }, ptr %a813 + store { ptr, i64, i64 } %t823, ptr %a826 + store { ptr, i64, i64 } %t824, ptr %a827 + call void @finch_str_concat(ptr %a825, ptr %a826, ptr %a827) + %t828 = load { ptr, i64, i64 }, ptr %a825 + store { ptr, i64, i64 } %t828, ptr %a830 + store { ptr, i64, i64 } { ptr @.str.5135, i64 6, i64 0 }, ptr %a831 + call void @finch_str_concat(ptr %a829, ptr %a830, ptr %a831) + %t832 = load { ptr, i64, i64 }, ptr %a829 + %t833 = load ptr, ptr %a1 + %t834 = load %S.ast.Type, ptr %a15 + %t835 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t833, %S.ast.Type %t834) + store { ptr, i64, i64 } %t832, ptr %a837 + store { ptr, i64, i64 } %t835, ptr %a838 + call void @finch_str_concat(ptr %a836, ptr %a837, ptr %a838) + %t839 = load { ptr, i64, i64 }, ptr %a836 + store { ptr, i64, i64 } %t839, ptr %a841 + store { ptr, i64, i64 } { ptr @.str.5136, i64 1, i64 0 }, ptr %a842 + call void @finch_str_concat(ptr %a840, ptr %a841, ptr %a842) + %t843 = load { ptr, i64, i64 }, ptr %a840 + call void @finch.gen.emit(ptr %t814, { ptr, i64, i64 } %t843) + %t844 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5137, i64 4, i64 0 }) + %t845 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t844, 1 + ret %S.gen.Val %t845 +endif7721: + %t846 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t846, ptr %a847 + store { ptr, i64, i64 } { ptr @.str.5138, i64 7, i64 0 }, ptr %a848 + %t849 = call i32 @finch_str_eq(ptr %a847, ptr %a848) + %t850 = icmp ne i32 %t849, 0 + br i1 %t850, label %then7726, label %endif7728 +then7726: + %t851 = load ptr, ptr %a1 + %t852 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t851, %S.ast.Node %t852, i64 0) + %t853 = load ptr, ptr %a1 + %t854 = load { ptr, i64, i64 }, ptr %a37 + %t855 = call { ptr, i64, i64 } @finch.gen.load(ptr %t853, { ptr, i64, i64 } { ptr @.str.5139, i64 3, i64 0 }, { ptr, i64, i64 } %t854) + store { ptr, i64, i64 } %t855, ptr %a856 + %t857 = load ptr, ptr %a1 + %t858 = load { ptr, i64, i64 }, ptr %a3 + %t859 = call { ptr, i64, i64 } @finch.gen.load(ptr %t857, { ptr, i64, i64 } { ptr @.str.5140, i64 3, i64 0 }, { ptr, i64, i64 } %t858) + store { ptr, i64, i64 } %t859, ptr %a860 + %t861 = load ptr, ptr %a1 + %t862 = load { ptr, i64, i64 }, ptr %a856 + store { ptr, i64, i64 } { ptr @.str.5141, i64 9, i64 0 }, ptr %a864 + store { ptr, i64, i64 } %t862, ptr %a865 + call void @finch_str_concat(ptr %a863, ptr %a864, ptr %a865) + %t866 = load { ptr, i64, i64 }, ptr %a863 + store { ptr, i64, i64 } %t866, ptr %a868 + store { ptr, i64, i64 } { ptr @.str.5142, i64 3, i64 0 }, ptr %a869 + call void @finch_str_concat(ptr %a867, ptr %a868, ptr %a869) + %t870 = load { ptr, i64, i64 }, ptr %a867 + %t871 = call { ptr, i64, i64 } @finch.gen.op(ptr %t861, { ptr, i64, i64 } %t870) + store { ptr, i64, i64 } %t871, ptr %a872 + %t873 = load ptr, ptr %a1 + %t874 = load { ptr, i64, i64 }, ptr %a872 + %t875 = call { ptr, i64, i64 } @finch.gen.loopStart(ptr %t873, { ptr, i64, i64 } %t874) + store { ptr, i64, i64 } %t875, ptr %a876 + %t877 = load ptr, ptr %a1 + %t878 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5143, i64 23, i64 0 }, ptr %a880 + store { ptr, i64, i64 } %t878, ptr %a881 + call void @finch_str_concat(ptr %a879, ptr %a880, ptr %a881) + %t882 = load { ptr, i64, i64 }, ptr %a879 + store { ptr, i64, i64 } %t882, ptr %a884 + store { ptr, i64, i64 } { ptr @.str.5144, i64 6, i64 0 }, ptr %a885 + call void @finch_str_concat(ptr %a883, ptr %a884, ptr %a885) + %t886 = load { ptr, i64, i64 }, ptr %a883 + %t887 = load { ptr, i64, i64 }, ptr %a860 + store { ptr, i64, i64 } %t886, ptr %a889 + store { ptr, i64, i64 } %t887, ptr %a890 + call void @finch_str_concat(ptr %a888, ptr %a889, ptr %a890) + %t891 = load { ptr, i64, i64 }, ptr %a888 + store { ptr, i64, i64 } %t891, ptr %a893 + store { ptr, i64, i64 } { ptr @.str.5145, i64 6, i64 0 }, ptr %a894 + call void @finch_str_concat(ptr %a892, ptr %a893, ptr %a894) + %t895 = load { ptr, i64, i64 }, ptr %a892 + %t896 = load { ptr, i64, i64 }, ptr %a876 + %t897 = extractvalue { ptr, i64, i64 } %t896, 1 + %t898 = icmp uge i64 3, %t897 + br i1 %t898, label %range7729, label %inrange7730 +range7729: + call void @finch_panic_index(ptr @.str.5146, i64 4722, i64 3, i64 %t897) + unreachable +inrange7730: + %t899 = extractvalue { ptr, i64, i64 } %t896, 0 + %t900 = getelementptr inbounds { ptr, i64, i64 }, ptr %t899, i64 3 + %t901 = load { ptr, i64, i64 }, ptr %t900 + store { ptr, i64, i64 } %t895, ptr %a903 + store { ptr, i64, i64 } %t901, ptr %a904 + call void @finch_str_concat(ptr %a902, ptr %a903, ptr %a904) + %t905 = load { ptr, i64, i64 }, ptr %a902 + %t906 = call { ptr, i64, i64 } @finch.gen.op(ptr %t877, { ptr, i64, i64 } %t905) + store { ptr, i64, i64 } %t906, ptr %a907 + %t908 = load ptr, ptr %a1 + %t909 = load ptr, ptr %a1 + %t910 = load { ptr, i64, i64 }, ptr %a856 + store { ptr, i64, i64 } { ptr @.str.5148, i64 8, i64 0 }, ptr %a912 + store { ptr, i64, i64 } %t910, ptr %a913 + call void @finch_str_concat(ptr %a911, ptr %a912, ptr %a913) + %t914 = load { ptr, i64, i64 }, ptr %a911 + store { ptr, i64, i64 } %t914, ptr %a916 + store { ptr, i64, i64 } { ptr @.str.5149, i64 3, i64 0 }, ptr %a917 + call void @finch_str_concat(ptr %a915, ptr %a916, ptr %a917) + %t918 = load { ptr, i64, i64 }, ptr %a915 + %t919 = call { ptr, i64, i64 } @finch.gen.op(ptr %t909, { ptr, i64, i64 } %t918) + store { ptr, i64, i64 } { ptr @.str.5147, i64 8, i64 0 }, ptr %a921 + store { ptr, i64, i64 } %t919, ptr %a922 + call void @finch_str_concat(ptr %a920, ptr %a921, ptr %a922) + %t923 = load { ptr, i64, i64 }, ptr %a920 + store { ptr, i64, i64 } %t923, ptr %a925 + store { ptr, i64, i64 } { ptr @.str.5150, i64 2, i64 0 }, ptr %a926 + call void @finch_str_concat(ptr %a924, ptr %a925, ptr %a926) + %t927 = load { ptr, i64, i64 }, ptr %a924 + %t928 = load { ptr, i64, i64 }, ptr %a876 + %t929 = extractvalue { ptr, i64, i64 } %t928, 1 + %t930 = icmp uge i64 3, %t929 + br i1 %t930, label %range7731, label %inrange7732 +range7731: + call void @finch_panic_index(ptr @.str.5151, i64 4723, i64 3, i64 %t929) + unreachable +inrange7732: + %t931 = extractvalue { ptr, i64, i64 } %t928, 0 + %t932 = getelementptr inbounds { ptr, i64, i64 }, ptr %t931, i64 3 + %t933 = load { ptr, i64, i64 }, ptr %t932 + store { ptr, i64, i64 } %t927, ptr %a935 + store { ptr, i64, i64 } %t933, ptr %a936 + call void @finch_str_concat(ptr %a934, ptr %a935, ptr %a936) + %t937 = load { ptr, i64, i64 }, ptr %a934 + %t938 = call { ptr, i64, i64 } @finch.gen.op(ptr %t908, { ptr, i64, i64 } %t937) + store { ptr, i64, i64 } %t938, ptr %a939 + %t940 = load ptr, ptr %a1 + %t941 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5152, i64 23, i64 0 }, ptr %a943 + store { ptr, i64, i64 } %t941, ptr %a944 + call void @finch_str_concat(ptr %a942, ptr %a943, ptr %a944) + %t945 = load { ptr, i64, i64 }, ptr %a942 + store { ptr, i64, i64 } %t945, ptr %a947 + store { ptr, i64, i64 } { ptr @.str.5153, i64 6, i64 0 }, ptr %a948 + call void @finch_str_concat(ptr %a946, ptr %a947, ptr %a948) + %t949 = load { ptr, i64, i64 }, ptr %a946 + %t950 = load { ptr, i64, i64 }, ptr %a860 + store { ptr, i64, i64 } %t949, ptr %a952 + store { ptr, i64, i64 } %t950, ptr %a953 + call void @finch_str_concat(ptr %a951, ptr %a952, ptr %a953) + %t954 = load { ptr, i64, i64 }, ptr %a951 + store { ptr, i64, i64 } %t954, ptr %a956 + store { ptr, i64, i64 } { ptr @.str.5154, i64 6, i64 0 }, ptr %a957 + call void @finch_str_concat(ptr %a955, ptr %a956, ptr %a957) + %t958 = load { ptr, i64, i64 }, ptr %a955 + %t959 = load { ptr, i64, i64 }, ptr %a939 + store { ptr, i64, i64 } %t958, ptr %a961 + store { ptr, i64, i64 } %t959, ptr %a962 + call void @finch_str_concat(ptr %a960, ptr %a961, ptr %a962) + %t963 = load { ptr, i64, i64 }, ptr %a960 + %t964 = call { ptr, i64, i64 } @finch.gen.op(ptr %t940, { ptr, i64, i64 } %t963) + store { ptr, i64, i64 } %t964, ptr %a965 + %t966 = load ptr, ptr %a1 + %t967 = load { ptr, i64, i64 }, ptr %a19 + %t968 = load { ptr, i64, i64 }, ptr %a907 + %t969 = call { ptr, i64, i64 } @finch.gen.load(ptr %t966, { ptr, i64, i64 } %t967, { ptr, i64, i64 } %t968) + store { ptr, i64, i64 } %t969, ptr %a970 + %t971 = load ptr, ptr %a1 + %t972 = load { ptr, i64, i64 }, ptr %a19 + %t973 = load { ptr, i64, i64 }, ptr %a965 + %t974 = call { ptr, i64, i64 } @finch.gen.load(ptr %t971, { ptr, i64, i64 } %t972, { ptr, i64, i64 } %t973) + store { ptr, i64, i64 } %t974, ptr %a975 + %t976 = load ptr, ptr %a1 + %t977 = load { ptr, i64, i64 }, ptr %a19 + %t978 = load { ptr, i64, i64 }, ptr %a975 + %t979 = load { ptr, i64, i64 }, ptr %a907 + call void @finch.gen.store(ptr %t976, { ptr, i64, i64 } %t977, { ptr, i64, i64 } %t978, { ptr, i64, i64 } %t979) + %t980 = load ptr, ptr %a1 + %t981 = load { ptr, i64, i64 }, ptr %a19 + %t982 = load { ptr, i64, i64 }, ptr %a970 + %t983 = load { ptr, i64, i64 }, ptr %a965 + call void @finch.gen.store(ptr %t980, { ptr, i64, i64 } %t981, { ptr, i64, i64 } %t982, { ptr, i64, i64 } %t983) + %t984 = load ptr, ptr %a1 + %t985 = load { ptr, i64, i64 }, ptr %a876 + call void @finch.gen.loopEnd(ptr %t984, { ptr, i64, i64 } %t985) + %t986 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5155, i64 4, i64 0 }) + %t987 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t986, 1 + ret %S.gen.Val %t987 +endif7728: + %t988 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t988, ptr %a989 + store { ptr, i64, i64 } { ptr @.str.5156, i64 5, i64 0 }, ptr %a990 + %t991 = call i32 @finch_str_eq(ptr %a989, ptr %a990) + %t992 = icmp ne i32 %t991, 0 + br i1 %t992, label %then7733, label %endif7735 +then7733: + %t993 = load ptr, ptr %a1 + %t994 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t993, %S.ast.Node %t994, i64 2) + %t995 = load ptr, ptr %a1 + %t996 = load ptr, ptr %a1 + %t997 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t998 = load { ptr, i64, i64 }, ptr %t997 + %t999 = extractvalue { ptr, i64, i64 } %t998, 1 + %t1000 = icmp uge i64 1, %t999 + br i1 %t1000, label %range7736, label %inrange7737 +range7736: + call void @finch_panic_index(ptr @.str.5157, i64 4734, i64 1, i64 %t999) + unreachable +inrange7737: + %t1001 = extractvalue { ptr, i64, i64 } %t998, 0 + %t1002 = getelementptr inbounds %S.ast.Node, ptr %t1001, i64 1 + %t1003 = load %S.ast.Node, ptr %t1002 + %t1004 = call %S.gen.Val @finch.gen.expr(ptr %t996, %S.ast.Node %t1003) + %t1005 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5158, i64 3, i64 0 }) + %t1006 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1007 = load { ptr, i64, i64 }, ptr %t1006 + %t1008 = extractvalue { ptr, i64, i64 } %t1007, 1 + %t1009 = icmp uge i64 1, %t1008 + br i1 %t1009, label %range7738, label %inrange7739 +range7738: + call void @finch_panic_index(ptr @.str.5159, i64 4734, i64 1, i64 %t1008) + unreachable +inrange7739: + %t1010 = extractvalue { ptr, i64, i64 } %t1007, 0 + %t1011 = getelementptr inbounds %S.ast.Node, ptr %t1010, i64 1 + %t1012 = load %S.ast.Node, ptr %t1011 + %t1013 = call %S.gen.Val @finch.gen.coerce(ptr %t995, %S.gen.Val %t1004, %S.ast.Type %t1005, %S.ast.Node %t1012, { ptr, i64, i64 } { ptr @.str.5160, i64 9, i64 0 }) + %t1014 = extractvalue %S.gen.Val %t1013, 0 + store { ptr, i64, i64 } %t1014, ptr %a1015 + call void @finch_str_copy(ptr %a1016, ptr %a1015) + %t1017 = load { ptr, i64, i64 }, ptr %a1016 + store { ptr, i64, i64 } %t1017, ptr %a1018 + %t1019 = load ptr, ptr %a1 + %t1020 = load ptr, ptr %a1 + %t1021 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1022 = load { ptr, i64, i64 }, ptr %t1021 + %t1023 = extractvalue { ptr, i64, i64 } %t1022, 1 + %t1024 = icmp uge i64 2, %t1023 + br i1 %t1024, label %range7740, label %inrange7741 +range7740: + call void @finch_panic_index(ptr @.str.5161, i64 4735, i64 2, i64 %t1023) + unreachable +inrange7741: + %t1025 = extractvalue { ptr, i64, i64 } %t1022, 0 + %t1026 = getelementptr inbounds %S.ast.Node, ptr %t1025, i64 2 + %t1027 = load %S.ast.Node, ptr %t1026 + %t1028 = call %S.gen.Val @finch.gen.expr(ptr %t1020, %S.ast.Node %t1027) + %t1029 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5162, i64 3, i64 0 }) + %t1030 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t1031 = load { ptr, i64, i64 }, ptr %t1030 + %t1032 = extractvalue { ptr, i64, i64 } %t1031, 1 + %t1033 = icmp uge i64 2, %t1032 + br i1 %t1033, label %range7742, label %inrange7743 +range7742: + call void @finch_panic_index(ptr @.str.5163, i64 4735, i64 2, i64 %t1032) + unreachable +inrange7743: + %t1034 = extractvalue { ptr, i64, i64 } %t1031, 0 + %t1035 = getelementptr inbounds %S.ast.Node, ptr %t1034, i64 2 + %t1036 = load %S.ast.Node, ptr %t1035 + %t1037 = call %S.gen.Val @finch.gen.coerce(ptr %t1019, %S.gen.Val %t1028, %S.ast.Type %t1029, %S.ast.Node %t1036, { ptr, i64, i64 } { ptr @.str.5164, i64 7, i64 0 }) + %t1038 = extractvalue %S.gen.Val %t1037, 0 + store { ptr, i64, i64 } %t1038, ptr %a1039 + call void @finch_str_copy(ptr %a1040, ptr %a1039) + %t1041 = load { ptr, i64, i64 }, ptr %a1040 + store { ptr, i64, i64 } %t1041, ptr %a1042 + %t1043 = load ptr, ptr %a1 + %t1044 = load { ptr, i64, i64 }, ptr %a37 + %t1045 = call { ptr, i64, i64 } @finch.gen.load(ptr %t1043, { ptr, i64, i64 } { ptr @.str.5165, i64 3, i64 0 }, { ptr, i64, i64 } %t1044) + store { ptr, i64, i64 } %t1045, ptr %a1046 + %t1047 = load ptr, ptr %a1 + %t1048 = load { ptr, i64, i64 }, ptr %a1018 + store { ptr, i64, i64 } { ptr @.str.5166, i64 13, i64 0 }, ptr %a1050 + store { ptr, i64, i64 } %t1048, ptr %a1051 + call void @finch_str_concat(ptr %a1049, ptr %a1050, ptr %a1051) + %t1052 = load { ptr, i64, i64 }, ptr %a1049 + store { ptr, i64, i64 } %t1052, ptr %a1054 + store { ptr, i64, i64 } { ptr @.str.5167, i64 3, i64 0 }, ptr %a1055 + call void @finch_str_concat(ptr %a1053, ptr %a1054, ptr %a1055) + %t1056 = load { ptr, i64, i64 }, ptr %a1053 + %t1057 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1047, { ptr, i64, i64 } %t1056) + store { ptr, i64, i64 } %t1057, ptr %a1058 + %t1059 = load ptr, ptr %a1 + %t1060 = load { ptr, i64, i64 }, ptr %a1042 + store { ptr, i64, i64 } { ptr @.str.5168, i64 13, i64 0 }, ptr %a1062 + store { ptr, i64, i64 } %t1060, ptr %a1063 + call void @finch_str_concat(ptr %a1061, ptr %a1062, ptr %a1063) + %t1064 = load { ptr, i64, i64 }, ptr %a1061 + store { ptr, i64, i64 } %t1064, ptr %a1066 + store { ptr, i64, i64 } { ptr @.str.5169, i64 2, i64 0 }, ptr %a1067 + call void @finch_str_concat(ptr %a1065, ptr %a1066, ptr %a1067) + %t1068 = load { ptr, i64, i64 }, ptr %a1065 + %t1069 = load { ptr, i64, i64 }, ptr %a1046 + store { ptr, i64, i64 } %t1068, ptr %a1071 + store { ptr, i64, i64 } %t1069, ptr %a1072 + call void @finch_str_concat(ptr %a1070, ptr %a1071, ptr %a1072) + %t1073 = load { ptr, i64, i64 }, ptr %a1070 + %t1074 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1059, { ptr, i64, i64 } %t1073) + store { ptr, i64, i64 } %t1074, ptr %a1075 + %t1076 = load ptr, ptr %a1 + %t1077 = load { ptr, i64, i64 }, ptr %a1018 + store { ptr, i64, i64 } { ptr @.str.5170, i64 13, i64 0 }, ptr %a1079 + store { ptr, i64, i64 } %t1077, ptr %a1080 + call void @finch_str_concat(ptr %a1078, ptr %a1079, ptr %a1080) + %t1081 = load { ptr, i64, i64 }, ptr %a1078 + store { ptr, i64, i64 } %t1081, ptr %a1083 + store { ptr, i64, i64 } { ptr @.str.5171, i64 2, i64 0 }, ptr %a1084 + call void @finch_str_concat(ptr %a1082, ptr %a1083, ptr %a1084) + %t1085 = load { ptr, i64, i64 }, ptr %a1082 + %t1086 = load { ptr, i64, i64 }, ptr %a1042 + store { ptr, i64, i64 } %t1085, ptr %a1088 + store { ptr, i64, i64 } %t1086, ptr %a1089 + call void @finch_str_concat(ptr %a1087, ptr %a1088, ptr %a1089) + %t1090 = load { ptr, i64, i64 }, ptr %a1087 + %t1091 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1076, { ptr, i64, i64 } %t1090) + store { ptr, i64, i64 } %t1091, ptr %a1092 + %t1093 = load ptr, ptr %a1 + %t1094 = load ptr, ptr %a1 + %t1095 = load ptr, ptr %a1 + %t1096 = load { ptr, i64, i64 }, ptr %a1058 + store { ptr, i64, i64 } { ptr @.str.5173, i64 6, i64 0 }, ptr %a1098 + store { ptr, i64, i64 } %t1096, ptr %a1099 + call void @finch_str_concat(ptr %a1097, ptr %a1098, ptr %a1099) + %t1100 = load { ptr, i64, i64 }, ptr %a1097 + store { ptr, i64, i64 } %t1100, ptr %a1102 + store { ptr, i64, i64 } { ptr @.str.5174, i64 2, i64 0 }, ptr %a1103 + call void @finch_str_concat(ptr %a1101, ptr %a1102, ptr %a1103) + %t1104 = load { ptr, i64, i64 }, ptr %a1101 + %t1105 = load { ptr, i64, i64 }, ptr %a1075 + store { ptr, i64, i64 } %t1104, ptr %a1107 + store { ptr, i64, i64 } %t1105, ptr %a1108 + call void @finch_str_concat(ptr %a1106, ptr %a1107, ptr %a1108) + %t1109 = load { ptr, i64, i64 }, ptr %a1106 + %t1110 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1095, { ptr, i64, i64 } %t1109) + store { ptr, i64, i64 } { ptr @.str.5172, i64 6, i64 0 }, ptr %a1112 + store { ptr, i64, i64 } %t1110, ptr %a1113 + call void @finch_str_concat(ptr %a1111, ptr %a1112, ptr %a1113) + %t1114 = load { ptr, i64, i64 }, ptr %a1111 + store { ptr, i64, i64 } %t1114, ptr %a1116 + store { ptr, i64, i64 } { ptr @.str.5175, i64 2, i64 0 }, ptr %a1117 + call void @finch_str_concat(ptr %a1115, ptr %a1116, ptr %a1117) + %t1118 = load { ptr, i64, i64 }, ptr %a1115 + %t1119 = load { ptr, i64, i64 }, ptr %a1092 + store { ptr, i64, i64 } %t1118, ptr %a1121 + store { ptr, i64, i64 } %t1119, ptr %a1122 + call void @finch_str_concat(ptr %a1120, ptr %a1121, ptr %a1122) + %t1123 = load { ptr, i64, i64 }, ptr %a1120 + %t1124 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1094, { ptr, i64, i64 } %t1123) + %t1125 = load %S.ast.Node, ptr %a2 + call void @finch.gen.panicIf(ptr %t1093, { ptr, i64, i64 } %t1124, { ptr, i64, i64 } { ptr @.str.5176, i64 33, i64 0 }, %S.ast.Node %t1125) + %t1126 = load ptr, ptr %a1 + %t1127 = load { ptr, i64, i64 }, ptr %a1042 + store { ptr, i64, i64 } { ptr @.str.5177, i64 8, i64 0 }, ptr %a1129 + store { ptr, i64, i64 } %t1127, ptr %a1130 + call void @finch_str_concat(ptr %a1128, ptr %a1129, ptr %a1130) + %t1131 = load { ptr, i64, i64 }, ptr %a1128 + store { ptr, i64, i64 } %t1131, ptr %a1133 + store { ptr, i64, i64 } { ptr @.str.5178, i64 2, i64 0 }, ptr %a1134 + call void @finch_str_concat(ptr %a1132, ptr %a1133, ptr %a1134) + %t1135 = load { ptr, i64, i64 }, ptr %a1132 + %t1136 = load { ptr, i64, i64 }, ptr %a1018 + store { ptr, i64, i64 } %t1135, ptr %a1138 + store { ptr, i64, i64 } %t1136, ptr %a1139 + call void @finch_str_concat(ptr %a1137, ptr %a1138, ptr %a1139) + %t1140 = load { ptr, i64, i64 }, ptr %a1137 + %t1141 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1126, { ptr, i64, i64 } %t1140) + store { ptr, i64, i64 } %t1141, ptr %a1142 + %t1143 = load ptr, ptr %a1 + %t1144 = call { ptr, i64, i64 } @finch.gen.alloca(ptr %t1143, { ptr, i64, i64 } { ptr @.str.5179, i64 17, i64 0 }) + store { ptr, i64, i64 } %t1144, ptr %a1145 + %t1146 = load ptr, ptr %a1 + %t1147 = load { ptr, i64, i64 }, ptr %a1145 + store { ptr, i64, i64 } { ptr @.str.5180, i64 30, i64 0 }, ptr %a1149 + store { ptr, i64, i64 } %t1147, ptr %a1150 + call void @finch_str_concat(ptr %a1148, ptr %a1149, ptr %a1150) + %t1151 = load { ptr, i64, i64 }, ptr %a1148 + store { ptr, i64, i64 } %t1151, ptr %a1153 + store { ptr, i64, i64 } { ptr @.str.5181, i64 6, i64 0 }, ptr %a1154 + call void @finch_str_concat(ptr %a1152, ptr %a1153, ptr %a1154) + %t1155 = load { ptr, i64, i64 }, ptr %a1152 + %t1156 = load { ptr, i64, i64 }, ptr %a1142 + store { ptr, i64, i64 } %t1155, ptr %a1158 + store { ptr, i64, i64 } %t1156, ptr %a1159 + call void @finch_str_concat(ptr %a1157, ptr %a1158, ptr %a1159) + %t1160 = load { ptr, i64, i64 }, ptr %a1157 + store { ptr, i64, i64 } %t1160, ptr %a1162 + store { ptr, i64, i64 } { ptr @.str.5182, i64 6, i64 0 }, ptr %a1163 + call void @finch_str_concat(ptr %a1161, ptr %a1162, ptr %a1163) + %t1164 = load { ptr, i64, i64 }, ptr %a1161 + %t1165 = load ptr, ptr %a1 + %t1166 = load %S.ast.Type, ptr %a15 + %t1167 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t1165, %S.ast.Type %t1166) + store { ptr, i64, i64 } %t1164, ptr %a1169 + store { ptr, i64, i64 } %t1167, ptr %a1170 + call void @finch_str_concat(ptr %a1168, ptr %a1169, ptr %a1170) + %t1171 = load { ptr, i64, i64 }, ptr %a1168 + store { ptr, i64, i64 } %t1171, ptr %a1173 + store { ptr, i64, i64 } { ptr @.str.5183, i64 1, i64 0 }, ptr %a1174 + call void @finch_str_concat(ptr %a1172, ptr %a1173, ptr %a1174) + %t1175 = load { ptr, i64, i64 }, ptr %a1172 + call void @finch.gen.emit(ptr %t1146, { ptr, i64, i64 } %t1175) + %t1176 = load ptr, ptr %a1 + %t1177 = load { ptr, i64, i64 }, ptr %a3 + %t1178 = call { ptr, i64, i64 } @finch.gen.load(ptr %t1176, { ptr, i64, i64 } { ptr @.str.5184, i64 3, i64 0 }, { ptr, i64, i64 } %t1177) + store { ptr, i64, i64 } %t1178, ptr %a1179 + %t1180 = load ptr, ptr %a1 + %t1181 = load { ptr, i64, i64 }, ptr %a1145 + %t1182 = call { ptr, i64, i64 } @finch.gen.load(ptr %t1180, { ptr, i64, i64 } { ptr @.str.5185, i64 3, i64 0 }, { ptr, i64, i64 } %t1181) + store { ptr, i64, i64 } %t1182, ptr %a1183 + %t1184 = load ptr, ptr %a1 + %t1185 = load { ptr, i64, i64 }, ptr %a1142 + %t1186 = call { ptr, i64, i64 } @finch.gen.loopStart(ptr %t1184, { ptr, i64, i64 } %t1185) + store { ptr, i64, i64 } %t1186, ptr %a1187 + %t1188 = load ptr, ptr %a1 + %t1189 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5186, i64 23, i64 0 }, ptr %a1191 + store { ptr, i64, i64 } %t1189, ptr %a1192 + call void @finch_str_concat(ptr %a1190, ptr %a1191, ptr %a1192) + %t1193 = load { ptr, i64, i64 }, ptr %a1190 + store { ptr, i64, i64 } %t1193, ptr %a1195 + store { ptr, i64, i64 } { ptr @.str.5187, i64 6, i64 0 }, ptr %a1196 + call void @finch_str_concat(ptr %a1194, ptr %a1195, ptr %a1196) + %t1197 = load { ptr, i64, i64 }, ptr %a1194 + %t1198 = load { ptr, i64, i64 }, ptr %a1183 + store { ptr, i64, i64 } %t1197, ptr %a1200 + store { ptr, i64, i64 } %t1198, ptr %a1201 + call void @finch_str_concat(ptr %a1199, ptr %a1200, ptr %a1201) + %t1202 = load { ptr, i64, i64 }, ptr %a1199 + store { ptr, i64, i64 } %t1202, ptr %a1204 + store { ptr, i64, i64 } { ptr @.str.5188, i64 6, i64 0 }, ptr %a1205 + call void @finch_str_concat(ptr %a1203, ptr %a1204, ptr %a1205) + %t1206 = load { ptr, i64, i64 }, ptr %a1203 + %t1207 = load { ptr, i64, i64 }, ptr %a1187 + %t1208 = extractvalue { ptr, i64, i64 } %t1207, 1 + %t1209 = icmp uge i64 3, %t1208 + br i1 %t1209, label %range7744, label %inrange7745 +range7744: + call void @finch_panic_index(ptr @.str.5189, i64 4747, i64 3, i64 %t1208) + unreachable +inrange7745: + %t1210 = extractvalue { ptr, i64, i64 } %t1207, 0 + %t1211 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1210, i64 3 + %t1212 = load { ptr, i64, i64 }, ptr %t1211 + store { ptr, i64, i64 } %t1206, ptr %a1214 + store { ptr, i64, i64 } %t1212, ptr %a1215 + call void @finch_str_concat(ptr %a1213, ptr %a1214, ptr %a1215) + %t1216 = load { ptr, i64, i64 }, ptr %a1213 + %t1217 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1188, { ptr, i64, i64 } %t1216) + store { ptr, i64, i64 } %t1217, ptr %a1218 + %t1219 = load ptr, ptr %a1 + %t1220 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } { ptr @.str.5190, i64 23, i64 0 }, ptr %a1222 + store { ptr, i64, i64 } %t1220, ptr %a1223 + call void @finch_str_concat(ptr %a1221, ptr %a1222, ptr %a1223) + %t1224 = load { ptr, i64, i64 }, ptr %a1221 + store { ptr, i64, i64 } %t1224, ptr %a1226 + store { ptr, i64, i64 } { ptr @.str.5191, i64 6, i64 0 }, ptr %a1227 + call void @finch_str_concat(ptr %a1225, ptr %a1226, ptr %a1227) + %t1228 = load { ptr, i64, i64 }, ptr %a1225 + %t1229 = load { ptr, i64, i64 }, ptr %a1179 + store { ptr, i64, i64 } %t1228, ptr %a1231 + store { ptr, i64, i64 } %t1229, ptr %a1232 + call void @finch_str_concat(ptr %a1230, ptr %a1231, ptr %a1232) + %t1233 = load { ptr, i64, i64 }, ptr %a1230 + store { ptr, i64, i64 } %t1233, ptr %a1235 + store { ptr, i64, i64 } { ptr @.str.5192, i64 6, i64 0 }, ptr %a1236 + call void @finch_str_concat(ptr %a1234, ptr %a1235, ptr %a1236) + %t1237 = load { ptr, i64, i64 }, ptr %a1234 + %t1238 = load ptr, ptr %a1 + %t1239 = load { ptr, i64, i64 }, ptr %a1018 + store { ptr, i64, i64 } { ptr @.str.5193, i64 8, i64 0 }, ptr %a1241 + store { ptr, i64, i64 } %t1239, ptr %a1242 + call void @finch_str_concat(ptr %a1240, ptr %a1241, ptr %a1242) + %t1243 = load { ptr, i64, i64 }, ptr %a1240 + store { ptr, i64, i64 } %t1243, ptr %a1245 + store { ptr, i64, i64 } { ptr @.str.5194, i64 2, i64 0 }, ptr %a1246 + call void @finch_str_concat(ptr %a1244, ptr %a1245, ptr %a1246) + %t1247 = load { ptr, i64, i64 }, ptr %a1244 + %t1248 = load { ptr, i64, i64 }, ptr %a1187 + %t1249 = extractvalue { ptr, i64, i64 } %t1248, 1 + %t1250 = icmp uge i64 3, %t1249 + br i1 %t1250, label %range7746, label %inrange7747 +range7746: + call void @finch_panic_index(ptr @.str.5195, i64 4748, i64 3, i64 %t1249) + unreachable +inrange7747: + %t1251 = extractvalue { ptr, i64, i64 } %t1248, 0 + %t1252 = getelementptr inbounds { ptr, i64, i64 }, ptr %t1251, i64 3 + %t1253 = load { ptr, i64, i64 }, ptr %t1252 + store { ptr, i64, i64 } %t1247, ptr %a1255 + store { ptr, i64, i64 } %t1253, ptr %a1256 + call void @finch_str_concat(ptr %a1254, ptr %a1255, ptr %a1256) + %t1257 = load { ptr, i64, i64 }, ptr %a1254 + %t1258 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1238, { ptr, i64, i64 } %t1257) + store { ptr, i64, i64 } %t1237, ptr %a1260 + store { ptr, i64, i64 } %t1258, ptr %a1261 + call void @finch_str_concat(ptr %a1259, ptr %a1260, ptr %a1261) + %t1262 = load { ptr, i64, i64 }, ptr %a1259 + %t1263 = call { ptr, i64, i64 } @finch.gen.op(ptr %t1219, { ptr, i64, i64 } %t1262) + store { ptr, i64, i64 } %t1263, ptr %a1264 + %t1265 = load ptr, ptr %a1 + %t1266 = load { ptr, i64, i64 }, ptr %a1218 + %t1267 = load { ptr, i64, i64 }, ptr %a1264 + %t1268 = load %S.ast.Type, ptr %a15 + call void @finch.gen.copyAt(ptr %t1265, { ptr, i64, i64 } %t1266, { ptr, i64, i64 } %t1267, %S.ast.Type %t1268) + %t1269 = load ptr, ptr %a1 + %t1270 = load { ptr, i64, i64 }, ptr %a1187 + call void @finch.gen.loopEnd(ptr %t1269, { ptr, i64, i64 } %t1270) + %t1271 = load ptr, ptr %a1 + %t1272 = load { ptr, i64, i64 }, ptr %a1145 + %t1273 = call { ptr, i64, i64 } @finch.gen.load(ptr %t1271, { ptr, i64, i64 } { ptr @.str.5196, i64 17, i64 0 }, { ptr, i64, i64 } %t1272) + %t1274 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t1273, 0 + %t1275 = load %S.ast.Type, ptr %a4 + store %S.ast.Type %t1275, ptr %a1276 + call void @finch.copy.S_ast_Type(ptr %a1277, ptr %a1276) + %t1278 = load %S.ast.Type, ptr %a1277 + %t1279 = insertvalue %S.gen.Val %t1274, %S.ast.Type %t1278, 1 + %t1280 = insertvalue %S.gen.Val %t1279, i1 true, 2 + ret %S.gen.Val %t1280 +endif7735: + %t1281 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } %t1281, ptr %a1282 + store { ptr, i64, i64 } { ptr @.str.5197, i64 4, i64 0 }, ptr %a1283 + %t1284 = call i32 @finch_str_eq(ptr %a1282, ptr %a1283) + %t1285 = icmp ne i32 %t1284, 0 + br i1 %t1285, label %then7748, label %endif7750 +then7748: + %t1286 = load ptr, ptr %a1 + %t1287 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t1286, %S.ast.Node %t1287, i64 0) + %t1288 = getelementptr inbounds %S.ast.Type, ptr %a15, i32 0, i32 0 + %t1289 = load { ptr, i64, i64 }, ptr %t1288 + store { ptr, i64, i64 } %t1289, ptr %a1290 + call void @finch_str_copy(ptr %a1291, ptr %a1290) + %t1292 = load { ptr, i64, i64 }, ptr %a1291 + store { ptr, i64, i64 } %t1292, ptr %a1293 + %t1294 = load %S.ast.Type, ptr %a15 + %t1295 = call i1 @finch.gen.isNumber(%S.ast.Type %t1294) + %t1296 = xor i1 %t1295, true + br label %logic.from7751 +logic.from7751: + br i1 %t1296, label %logic.rhs7752, label %logic.end7753 +logic.rhs7752: + %t1297 = load { ptr, i64, i64 }, ptr %a1293 + store { ptr, i64, i64 } %t1297, ptr %a1298 + store { ptr, i64, i64 } { ptr @.str.5198, i64 4, i64 0 }, ptr %a1299 + %t1300 = call i32 @finch_str_eq(ptr %a1298, ptr %a1299) + %t1301 = icmp eq i32 %t1300, 0 + br label %logic.rend7754 +logic.rend7754: + br label %logic.end7753 +logic.end7753: + %t1302 = phi i1 [ false, %logic.from7751 ], [ %t1301, %logic.rend7754 ] + br label %logic.from7755 +logic.from7755: + br i1 %t1302, label %logic.rhs7756, label %logic.end7757 +logic.rhs7756: + %t1303 = load { ptr, i64, i64 }, ptr %a1293 + store { ptr, i64, i64 } %t1303, ptr %a1304 + store { ptr, i64, i64 } { ptr @.str.5199, i64 3, i64 0 }, ptr %a1305 + %t1306 = call i32 @finch_str_eq(ptr %a1304, ptr %a1305) + %t1307 = icmp eq i32 %t1306, 0 + br label %logic.rend7758 +logic.rend7758: + br label %logic.end7757 +logic.end7757: + %t1308 = phi i1 [ false, %logic.from7755 ], [ %t1307, %logic.rend7758 ] + br i1 %t1308, label %then7759, label %endif7761 +then7759: + %t1309 = load ptr, ptr %a1 + %t1310 = load %S.ast.Node, ptr %a2 + call void @finch.gen.fail(ptr %t1309, %S.ast.Node %t1310, { ptr, i64, i64 } { ptr @.str.5200, i64 47, i64 0 }) + br label %endif7761 +endif7761: + %t1311 = load ptr, ptr %a1 + %t1312 = load %S.ast.Type, ptr %a15 + %t1313 = call { ptr, i64, i64 } @finch.gen.cmpFn(ptr %t1311, %S.ast.Type %t1312) + store { ptr, i64, i64 } %t1313, ptr %a1314 + %t1315 = load ptr, ptr %a1 + %t1316 = load { ptr, i64, i64 }, ptr %a37 + %t1317 = call { ptr, i64, i64 } @finch.gen.load(ptr %t1315, { ptr, i64, i64 } { ptr @.str.5201, i64 3, i64 0 }, { ptr, i64, i64 } %t1316) + store { ptr, i64, i64 } %t1317, ptr %a1318 + %t1319 = load ptr, ptr %a1 + %t1320 = load { ptr, i64, i64 }, ptr %a3 + %t1321 = call { ptr, i64, i64 } @finch.gen.load(ptr %t1319, { ptr, i64, i64 } { ptr @.str.5202, i64 3, i64 0 }, { ptr, i64, i64 } %t1320) + store { ptr, i64, i64 } %t1321, ptr %a1322 + %t1323 = load ptr, ptr %a1 + %t1324 = load { ptr, i64, i64 }, ptr %a1322 + store { ptr, i64, i64 } { ptr @.str.5203, i64 21, i64 0 }, ptr %a1326 + store { ptr, i64, i64 } %t1324, ptr %a1327 + call void @finch_str_concat(ptr %a1325, ptr %a1326, ptr %a1327) + %t1328 = load { ptr, i64, i64 }, ptr %a1325 + store { ptr, i64, i64 } %t1328, ptr %a1330 + store { ptr, i64, i64 } { ptr @.str.5204, i64 6, i64 0 }, ptr %a1331 + call void @finch_str_concat(ptr %a1329, ptr %a1330, ptr %a1331) + %t1332 = load { ptr, i64, i64 }, ptr %a1329 + %t1333 = load { ptr, i64, i64 }, ptr %a1318 + store { ptr, i64, i64 } %t1332, ptr %a1335 + store { ptr, i64, i64 } %t1333, ptr %a1336 + call void @finch_str_concat(ptr %a1334, ptr %a1335, ptr %a1336) + %t1337 = load { ptr, i64, i64 }, ptr %a1334 + store { ptr, i64, i64 } %t1337, ptr %a1339 + store { ptr, i64, i64 } { ptr @.str.5205, i64 6, i64 0 }, ptr %a1340 + call void @finch_str_concat(ptr %a1338, ptr %a1339, ptr %a1340) + %t1341 = load { ptr, i64, i64 }, ptr %a1338 + %t1342 = load ptr, ptr %a1 + %t1343 = load %S.ast.Type, ptr %a15 + %t1344 = call { ptr, i64, i64 } @finch.gen.sizeOf(ptr %t1342, %S.ast.Type %t1343) + store { ptr, i64, i64 } %t1341, ptr %a1346 + store { ptr, i64, i64 } %t1344, ptr %a1347 + call void @finch_str_concat(ptr %a1345, ptr %a1346, ptr %a1347) + %t1348 = load { ptr, i64, i64 }, ptr %a1345 + store { ptr, i64, i64 } %t1348, ptr %a1350 + store { ptr, i64, i64 } { ptr @.str.5206, i64 6, i64 0 }, ptr %a1351 + call void @finch_str_concat(ptr %a1349, ptr %a1350, ptr %a1351) + %t1352 = load { ptr, i64, i64 }, ptr %a1349 + %t1353 = load { ptr, i64, i64 }, ptr %a1314 + store { ptr, i64, i64 } %t1352, ptr %a1355 + store { ptr, i64, i64 } %t1353, ptr %a1356 + call void @finch_str_concat(ptr %a1354, ptr %a1355, ptr %a1356) + %t1357 = load { ptr, i64, i64 }, ptr %a1354 + store { ptr, i64, i64 } %t1357, ptr %a1359 + store { ptr, i64, i64 } { ptr @.str.5207, i64 1, i64 0 }, ptr %a1360 + call void @finch_str_concat(ptr %a1358, ptr %a1359, ptr %a1360) + %t1361 = load { ptr, i64, i64 }, ptr %a1358 + call void @finch.gen.emit(ptr %t1323, { ptr, i64, i64 } %t1361) + %t1362 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5208, i64 4, i64 0 }) + %t1363 = insertvalue %S.gen.Val zeroinitializer, %S.ast.Type %t1362, 1 + ret %S.gen.Val %t1363 +endif7750: + %t1364 = load ptr, ptr %a1 + %t1365 = load %S.ast.Node, ptr %a2 + %t1366 = load { ptr, i64, i64 }, ptr %a25 + store { ptr, i64, i64 } { ptr @.str.5209, i64 24, i64 0 }, ptr %a1368 + store { ptr, i64, i64 } %t1366, ptr %a1369 + call void @finch_str_concat(ptr %a1367, ptr %a1368, ptr %a1369) + %t1370 = load { ptr, i64, i64 }, ptr %a1367 + store { ptr, i64, i64 } %t1370, ptr %a1372 + store { ptr, i64, i64 } { ptr @.str.5210, i64 96, i64 0 }, ptr %a1373 + call void @finch_str_concat(ptr %a1371, ptr %a1372, ptr %a1373) + %t1374 = load { ptr, i64, i64 }, ptr %a1371 + call void @finch.gen.fail(ptr %t1364, %S.ast.Node %t1365, { ptr, i64, i64 } %t1374) + ret %S.gen.Val zeroinitializer +} + +define internal { ptr, i64, i64 } @finch.gen.cmpFn(ptr %p0, %S.ast.Type %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Type, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca %S.gen.Saved, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a222 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Type %p1, ptr %a2 + %t3 = load %S.ast.Type, ptr %a2 + %t4 = call { ptr, i64, i64 } @finch.gen.typeKey(%S.ast.Type %t3) + store { ptr, i64, i64 } { ptr @.str.5211, i64 11, i64 0 }, ptr %a6 + store { ptr, i64, i64 } %t4, ptr %a7 + call void @finch_str_concat(ptr %a5, ptr %a6, ptr %a7) + %t8 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t8, ptr %a9 + %t10 = load ptr, ptr %a1 + %t11 = icmp eq ptr %t10, null + br i1 %t11, label %panic7762, label %ok7763 +panic7762: + call void @finch_panic(ptr @.str.5212, i64 4772, ptr @.str.5213) + unreachable +ok7763: + %t12 = getelementptr inbounds %S.gen.Gen, ptr %t10, i32 0, i32 21 + %t13 = load { ptr, i64, i64 }, ptr %t12 + %t14 = load { ptr, i64, i64 }, ptr %a9 + %t15 = call i1 @finch.gen.has({ ptr, i64, i64 } %t13, { ptr, i64, i64 } %t14) + br i1 %t15, label %then7764, label %endif7766 +then7764: + %t16 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t16, ptr %a17 + call void @finch_str_copy(ptr %a18, ptr %a17) + %t19 = load { ptr, i64, i64 }, ptr %a18 + ret { ptr, i64, i64 } %t19 +endif7766: + %t20 = load ptr, ptr %a1 + %t21 = icmp eq ptr %t20, null + br i1 %t21, label %panic7767, label %ok7768 +panic7767: + call void @finch_panic(ptr @.str.5214, i64 4775, ptr @.str.5215) + unreachable +ok7768: + %t22 = getelementptr inbounds %S.gen.Gen, ptr %t20, i32 0, i32 21 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i32 0, i32 1 + %t24 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t24, ptr %a25 + call void @finch_str_copy(ptr %a26, ptr %a25) + %t27 = load { ptr, i64, i64 }, ptr %a26 + %t28 = load i64, ptr %t23 + %t29 = add i64 %t28, 1 + call void @finch_arr_reserve(ptr %t22, i64 %t29, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t30 = load ptr, ptr %t22 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t30, i64 %t28 + store { ptr, i64, i64 } %t27, ptr %t31 + store i64 %t29, ptr %t23 + %t32 = load ptr, ptr %a1 + %t33 = call %S.gen.Saved @finch.gen.beginHelper(ptr %t32) + store %S.gen.Saved %t33, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.5216, i64 0, i64 0 }, ptr %a35 + %t36 = getelementptr inbounds %S.ast.Type, ptr %a2, i32 0, i32 0 + %t37 = load { ptr, i64, i64 }, ptr %t36 + store { ptr, i64, i64 } %t37, ptr %a38 + store { ptr, i64, i64 } { ptr @.str.5217, i64 3, i64 0 }, ptr %a39 + %t40 = call i32 @finch_str_eq(ptr %a38, ptr %a39) + %t41 = icmp ne i32 %t40, 0 + br i1 %t41, label %then7769, label %else7770 +then7769: + %t42 = load ptr, ptr %a1 + %t43 = call { ptr, i64, i64 } @finch.gen.op(ptr %t42, { ptr, i64, i64 } { ptr @.str.5218, i64 39, i64 0 }) + store { ptr, i64, i64 } %t43, ptr %a44 + %t45 = load ptr, ptr %a1 + %t46 = load { ptr, i64, i64 }, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.5219, i64 10, i64 0 }, ptr %a48 + store { ptr, i64, i64 } %t46, ptr %a49 + call void @finch_str_concat(ptr %a47, ptr %a48, ptr %a49) + %t50 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } %t50, ptr %a52 + store { ptr, i64, i64 } { ptr @.str.5220, i64 7, i64 0 }, ptr %a53 + call void @finch_str_concat(ptr %a51, ptr %a52, ptr %a53) + %t54 = load { ptr, i64, i64 }, ptr %a51 + %t55 = call { ptr, i64, i64 } @finch.gen.op(ptr %t45, { ptr, i64, i64 } %t54) + store { ptr, i64, i64 } %t55, ptr %a35 + br label %endif7771 +else7770: + %t56 = load ptr, ptr %a1 + %t57 = load %S.ast.Type, ptr %a2 + %t58 = call { ptr, i64, i64 } @finch.gen.llty(ptr %t56, %S.ast.Type %t57) + store { ptr, i64, i64 } %t58, ptr %a59 + %t60 = load ptr, ptr %a1 + %t61 = load { ptr, i64, i64 }, ptr %a59 + %t62 = call { ptr, i64, i64 } @finch.gen.load(ptr %t60, { ptr, i64, i64 } %t61, { ptr, i64, i64 } { ptr @.str.5221, i64 2, i64 0 }) + store { ptr, i64, i64 } %t62, ptr %a63 + %t64 = load ptr, ptr %a1 + %t65 = load { ptr, i64, i64 }, ptr %a59 + %t66 = call { ptr, i64, i64 } @finch.gen.load(ptr %t64, { ptr, i64, i64 } %t65, { ptr, i64, i64 } { ptr @.str.5222, i64 2, i64 0 }) + store { ptr, i64, i64 } %t66, ptr %a67 + store { ptr, i64, i64 } { ptr @.str.5223, i64 0, i64 0 }, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.5224, i64 0, i64 0 }, ptr %a69 + %t70 = load %S.ast.Type, ptr %a2 + %t71 = call i1 @finch.gen.isFloat(%S.ast.Type %t70) + br i1 %t71, label %then7772, label %else7773 +then7772: + %t72 = load ptr, ptr %a1 + %t73 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.5225, i64 9, i64 0 }, ptr %a75 + store { ptr, i64, i64 } %t73, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t77, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.5226, i64 1, i64 0 }, ptr %a80 + call void @finch_str_concat(ptr %a78, ptr %a79, ptr %a80) + %t81 = load { ptr, i64, i64 }, ptr %a78 + %t82 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t81, ptr %a84 + store { ptr, i64, i64 } %t82, ptr %a85 + call void @finch_str_concat(ptr %a83, ptr %a84, ptr %a85) + %t86 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t86, ptr %a88 + store { ptr, i64, i64 } { ptr @.str.5227, i64 2, i64 0 }, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + %t91 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t90, ptr %a93 + store { ptr, i64, i64 } %t91, ptr %a94 + call void @finch_str_concat(ptr %a92, ptr %a93, ptr %a94) + %t95 = load { ptr, i64, i64 }, ptr %a92 + %t96 = call { ptr, i64, i64 } @finch.gen.op(ptr %t72, { ptr, i64, i64 } %t95) + store { ptr, i64, i64 } %t96, ptr %a68 + %t97 = load ptr, ptr %a1 + %t98 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } { ptr @.str.5228, i64 9, i64 0 }, ptr %a100 + store { ptr, i64, i64 } %t98, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + store { ptr, i64, i64 } %t102, ptr %a104 + store { ptr, i64, i64 } { ptr @.str.5229, i64 1, i64 0 }, ptr %a105 + call void @finch_str_concat(ptr %a103, ptr %a104, ptr %a105) + %t106 = load { ptr, i64, i64 }, ptr %a103 + %t107 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t106, ptr %a109 + store { ptr, i64, i64 } %t107, ptr %a110 + call void @finch_str_concat(ptr %a108, ptr %a109, ptr %a110) + %t111 = load { ptr, i64, i64 }, ptr %a108 + store { ptr, i64, i64 } %t111, ptr %a113 + store { ptr, i64, i64 } { ptr @.str.5230, i64 2, i64 0 }, ptr %a114 + call void @finch_str_concat(ptr %a112, ptr %a113, ptr %a114) + %t115 = load { ptr, i64, i64 }, ptr %a112 + %t116 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t115, ptr %a118 + store { ptr, i64, i64 } %t116, ptr %a119 + call void @finch_str_concat(ptr %a117, ptr %a118, ptr %a119) + %t120 = load { ptr, i64, i64 }, ptr %a117 + %t121 = call { ptr, i64, i64 } @finch.gen.op(ptr %t97, { ptr, i64, i64 } %t120) + store { ptr, i64, i64 } %t121, ptr %a69 + br label %endif7774 +else7773: + %t122 = load ptr, ptr %a1 + %t123 = load %S.ast.Type, ptr %a2 + %t124 = call i1 @finch.gen.isSigned(%S.ast.Type %t123) + %t125 = call { ptr, i64, i64 } @finch.gen.intPred({ ptr, i64, i64 } { ptr @.str.5232, i64 1, i64 0 }, i1 %t124) + store { ptr, i64, i64 } { ptr @.str.5231, i64 5, i64 0 }, ptr %a127 + store { ptr, i64, i64 } %t125, ptr %a128 + call void @finch_str_concat(ptr %a126, ptr %a127, ptr %a128) + %t129 = load { ptr, i64, i64 }, ptr %a126 + store { ptr, i64, i64 } %t129, ptr %a131 + store { ptr, i64, i64 } { ptr @.str.5233, i64 1, i64 0 }, ptr %a132 + call void @finch_str_concat(ptr %a130, ptr %a131, ptr %a132) + %t133 = load { ptr, i64, i64 }, ptr %a130 + %t134 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } %t133, ptr %a136 + store { ptr, i64, i64 } %t134, ptr %a137 + call void @finch_str_concat(ptr %a135, ptr %a136, ptr %a137) + %t138 = load { ptr, i64, i64 }, ptr %a135 + store { ptr, i64, i64 } %t138, ptr %a140 + store { ptr, i64, i64 } { ptr @.str.5234, i64 1, i64 0 }, ptr %a141 + call void @finch_str_concat(ptr %a139, ptr %a140, ptr %a141) + %t142 = load { ptr, i64, i64 }, ptr %a139 + %t143 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t142, ptr %a145 + store { ptr, i64, i64 } %t143, ptr %a146 + call void @finch_str_concat(ptr %a144, ptr %a145, ptr %a146) + %t147 = load { ptr, i64, i64 }, ptr %a144 + store { ptr, i64, i64 } %t147, ptr %a149 + store { ptr, i64, i64 } { ptr @.str.5235, i64 2, i64 0 }, ptr %a150 + call void @finch_str_concat(ptr %a148, ptr %a149, ptr %a150) + %t151 = load { ptr, i64, i64 }, ptr %a148 + %t152 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t151, ptr %a154 + store { ptr, i64, i64 } %t152, ptr %a155 + call void @finch_str_concat(ptr %a153, ptr %a154, ptr %a155) + %t156 = load { ptr, i64, i64 }, ptr %a153 + %t157 = call { ptr, i64, i64 } @finch.gen.op(ptr %t122, { ptr, i64, i64 } %t156) + store { ptr, i64, i64 } %t157, ptr %a68 + %t158 = load ptr, ptr %a1 + %t159 = load %S.ast.Type, ptr %a2 + %t160 = call i1 @finch.gen.isSigned(%S.ast.Type %t159) + %t161 = call { ptr, i64, i64 } @finch.gen.intPred({ ptr, i64, i64 } { ptr @.str.5237, i64 1, i64 0 }, i1 %t160) + store { ptr, i64, i64 } { ptr @.str.5236, i64 5, i64 0 }, ptr %a163 + store { ptr, i64, i64 } %t161, ptr %a164 + call void @finch_str_concat(ptr %a162, ptr %a163, ptr %a164) + %t165 = load { ptr, i64, i64 }, ptr %a162 + store { ptr, i64, i64 } %t165, ptr %a167 + store { ptr, i64, i64 } { ptr @.str.5238, i64 1, i64 0 }, ptr %a168 + call void @finch_str_concat(ptr %a166, ptr %a167, ptr %a168) + %t169 = load { ptr, i64, i64 }, ptr %a166 + %t170 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } %t169, ptr %a172 + store { ptr, i64, i64 } %t170, ptr %a173 + call void @finch_str_concat(ptr %a171, ptr %a172, ptr %a173) + %t174 = load { ptr, i64, i64 }, ptr %a171 + store { ptr, i64, i64 } %t174, ptr %a176 + store { ptr, i64, i64 } { ptr @.str.5239, i64 1, i64 0 }, ptr %a177 + call void @finch_str_concat(ptr %a175, ptr %a176, ptr %a177) + %t178 = load { ptr, i64, i64 }, ptr %a175 + %t179 = load { ptr, i64, i64 }, ptr %a63 + store { ptr, i64, i64 } %t178, ptr %a181 + store { ptr, i64, i64 } %t179, ptr %a182 + call void @finch_str_concat(ptr %a180, ptr %a181, ptr %a182) + %t183 = load { ptr, i64, i64 }, ptr %a180 + store { ptr, i64, i64 } %t183, ptr %a185 + store { ptr, i64, i64 } { ptr @.str.5240, i64 2, i64 0 }, ptr %a186 + call void @finch_str_concat(ptr %a184, ptr %a185, ptr %a186) + %t187 = load { ptr, i64, i64 }, ptr %a184 + %t188 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t187, ptr %a190 + store { ptr, i64, i64 } %t188, ptr %a191 + call void @finch_str_concat(ptr %a189, ptr %a190, ptr %a191) + %t192 = load { ptr, i64, i64 }, ptr %a189 + %t193 = call { ptr, i64, i64 } @finch.gen.op(ptr %t158, { ptr, i64, i64 } %t192) + store { ptr, i64, i64 } %t193, ptr %a69 + br label %endif7774 +endif7774: + %t194 = load ptr, ptr %a1 + %t195 = load ptr, ptr %a1 + %t196 = load { ptr, i64, i64 }, ptr %a69 + store { ptr, i64, i64 } { ptr @.str.5242, i64 8, i64 0 }, ptr %a198 + store { ptr, i64, i64 } %t196, ptr %a199 + call void @finch_str_concat(ptr %a197, ptr %a198, ptr %a199) + %t200 = load { ptr, i64, i64 }, ptr %a197 + store { ptr, i64, i64 } %t200, ptr %a202 + store { ptr, i64, i64 } { ptr @.str.5243, i64 7, i64 0 }, ptr %a203 + call void @finch_str_concat(ptr %a201, ptr %a202, ptr %a203) + %t204 = load { ptr, i64, i64 }, ptr %a201 + %t205 = call { ptr, i64, i64 } @finch.gen.op(ptr %t195, { ptr, i64, i64 } %t204) + store { ptr, i64, i64 } { ptr @.str.5241, i64 8, i64 0 }, ptr %a207 + store { ptr, i64, i64 } %t205, ptr %a208 + call void @finch_str_concat(ptr %a206, ptr %a207, ptr %a208) + %t209 = load { ptr, i64, i64 }, ptr %a206 + store { ptr, i64, i64 } %t209, ptr %a211 + store { ptr, i64, i64 } { ptr @.str.5244, i64 2, i64 0 }, ptr %a212 + call void @finch_str_concat(ptr %a210, ptr %a211, ptr %a212) + %t213 = load { ptr, i64, i64 }, ptr %a210 + %t214 = load ptr, ptr %a1 + %t215 = load { ptr, i64, i64 }, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.5245, i64 8, i64 0 }, ptr %a217 + store { ptr, i64, i64 } %t215, ptr %a218 + call void @finch_str_concat(ptr %a216, ptr %a217, ptr %a218) + %t219 = load { ptr, i64, i64 }, ptr %a216 + store { ptr, i64, i64 } %t219, ptr %a221 + store { ptr, i64, i64 } { ptr @.str.5246, i64 7, i64 0 }, ptr %a222 + call void @finch_str_concat(ptr %a220, ptr %a221, ptr %a222) + %t223 = load { ptr, i64, i64 }, ptr %a220 + %t224 = call { ptr, i64, i64 } @finch.gen.op(ptr %t214, { ptr, i64, i64 } %t223) + store { ptr, i64, i64 } %t213, ptr %a226 + store { ptr, i64, i64 } %t224, ptr %a227 + call void @finch_str_concat(ptr %a225, ptr %a226, ptr %a227) + %t228 = load { ptr, i64, i64 }, ptr %a225 + %t229 = call { ptr, i64, i64 } @finch.gen.op(ptr %t194, { ptr, i64, i64 } %t228) + store { ptr, i64, i64 } %t229, ptr %a35 + br label %endif7771 +endif7771: + %t230 = load ptr, ptr %a1 + %t231 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.5247, i64 8, i64 0 }, ptr %a233 + store { ptr, i64, i64 } %t231, ptr %a234 + call void @finch_str_concat(ptr %a232, ptr %a233, ptr %a234) + %t235 = load { ptr, i64, i64 }, ptr %a232 + call void @finch.gen.emit(ptr %t230, { ptr, i64, i64 } %t235) + %t236 = load ptr, ptr %a1 + %t237 = load %S.gen.Saved, ptr %a34 + %t238 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.5248, i64 20, i64 0 }, ptr %a240 + store { ptr, i64, i64 } %t238, ptr %a241 + call void @finch_str_concat(ptr %a239, ptr %a240, ptr %a241) + %t242 = load { ptr, i64, i64 }, ptr %a239 + store { ptr, i64, i64 } %t242, ptr %a244 + store { ptr, i64, i64 } { ptr @.str.5249, i64 16, i64 0 }, ptr %a245 + call void @finch_str_concat(ptr %a243, ptr %a244, ptr %a245) + %t246 = load { ptr, i64, i64 }, ptr %a243 + call void @finch.gen.endHelper(ptr %t236, %S.gen.Saved %t237, { ptr, i64, i64 } %t246) + %t247 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t247, ptr %a248 + call void @finch_str_copy(ptr %a249, ptr %a248) + %t250 = load { ptr, i64, i64 }, ptr %a249 + ret { ptr, i64, i64 } %t250 +} + +define internal %S.gen.Val @finch.gen.strMethod(ptr %p0, %S.ast.Node %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.ast.Node, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a137 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a183 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a193 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a230 = alloca { ptr, i64, i64 }, align 16 + %a232 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a260 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a270 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a278 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a308 = alloca { ptr, i64, i64 }, align 16 + %a309 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a336 = alloca { ptr, i64, i64 }, align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a345 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a347 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a374 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a389 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a395 = alloca { ptr, i64, i64 }, align 16 + %a398 = alloca { ptr, i64, i64 }, align 16 + %a399 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a403 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a411 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a416 = alloca { ptr, i64, i64 }, align 16 + %a417 = alloca { ptr, i64, i64 }, align 16 + %a418 = alloca { ptr, i64, i64 }, align 16 + %a420 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a422 = alloca { ptr, i64, i64 }, align 16 + %a432 = alloca { ptr, i64, i64 }, align 16 + %a433 = alloca { ptr, i64, i64 }, align 16 + %a449 = alloca { ptr, i64, i64 }, align 16 + %a452 = alloca { ptr, i64, i64 }, align 16 + %a455 = alloca { ptr, i64, i64 }, align 16 + %a456 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a459 = alloca { ptr, i64, i64 }, align 16 + %a460 = alloca { ptr, i64, i64 }, align 16 + %a461 = alloca { ptr, i64, i64 }, align 16 + %a464 = alloca { ptr, i64, i64 }, align 16 + %a465 = alloca { ptr, i64, i64 }, align 16 + %a466 = alloca { ptr, i64, i64 }, align 16 + %a468 = alloca { ptr, i64, i64 }, align 16 + %a469 = alloca { ptr, i64, i64 }, align 16 + %a470 = alloca { ptr, i64, i64 }, align 16 + %a473 = alloca { ptr, i64, i64 }, align 16 + %a474 = alloca { ptr, i64, i64 }, align 16 + %a475 = alloca { ptr, i64, i64 }, align 16 + %a477 = alloca { ptr, i64, i64 }, align 16 + %a478 = alloca { ptr, i64, i64 }, align 16 + %a479 = alloca { ptr, i64, i64 }, align 16 + %a490 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca { ptr, i64, i64 }, align 16 + %a516 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a519 = alloca { ptr, i64, i64 }, align 16 + %a522 = alloca { ptr, i64, i64 }, align 16 + %a523 = alloca { ptr, i64, i64 }, align 16 + %a524 = alloca { ptr, i64, i64 }, align 16 + %a526 = alloca { ptr, i64, i64 }, align 16 + %a527 = alloca { ptr, i64, i64 }, align 16 + %a528 = alloca { ptr, i64, i64 }, align 16 + %a531 = alloca { ptr, i64, i64 }, align 16 + %a532 = alloca { ptr, i64, i64 }, align 16 + %a533 = alloca { ptr, i64, i64 }, align 16 + %a535 = alloca { ptr, i64, i64 }, align 16 + %a536 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a540 = alloca { ptr, i64, i64 }, align 16 + %a541 = alloca { ptr, i64, i64 }, align 16 + %a542 = alloca { ptr, i64, i64 }, align 16 + %a544 = alloca { ptr, i64, i64 }, align 16 + %a545 = alloca { ptr, i64, i64 }, align 16 + %a546 = alloca { ptr, i64, i64 }, align 16 + %a556 = alloca { ptr, i64, i64 }, align 16 + %a557 = alloca { ptr, i64, i64 }, align 16 + %a564 = alloca { ptr, i64, i64 }, align 16 + %a567 = alloca { ptr, i64, i64 }, align 16 + %a568 = alloca { ptr, i64, i64 }, align 16 + %a569 = alloca { ptr, i64, i64 }, align 16 + %a571 = alloca { ptr, i64, i64 }, align 16 + %a572 = alloca { ptr, i64, i64 }, align 16 + %a573 = alloca { ptr, i64, i64 }, align 16 + %a576 = alloca { ptr, i64, i64 }, align 16 + %a577 = alloca { ptr, i64, i64 }, align 16 + %a578 = alloca { ptr, i64, i64 }, align 16 + %a580 = alloca { ptr, i64, i64 }, align 16 + %a581 = alloca { ptr, i64, i64 }, align 16 + %a582 = alloca { ptr, i64, i64 }, align 16 + %a595 = alloca { ptr, i64, i64 }, align 16 + %a596 = alloca { ptr, i64, i64 }, align 16 + %a597 = alloca { ptr, i64, i64 }, align 16 + %a599 = alloca { ptr, i64, i64 }, align 16 + %a600 = alloca { ptr, i64, i64 }, align 16 + %a601 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.ast.Node %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 1 + %t5 = load { ptr, i64, i64 }, ptr %t4 + store { ptr, i64, i64 } %t5, ptr %a6 + call void @finch_str_copy(ptr %a7, ptr %a6) + %t8 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t8, ptr %a9 + %t10 = load ptr, ptr %a1 + %t11 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t10) + store { ptr, i64, i64 } %t11, ptr %a12 + %t13 = load ptr, ptr %a1 + %t14 = load ptr, ptr %a1 + %t15 = icmp eq ptr %t14, null + br i1 %t15, label %panic7775, label %ok7776 +panic7775: + call void @finch_panic(ptr @.str.5250, i64 4804, ptr @.str.5251) + unreachable +ok7776: + %t16 = getelementptr inbounds %S.gen.Gen, ptr %t14, i32 0, i32 1 + %t17 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 13 + %t18 = load i64, ptr %t17 + %t19 = load { ptr, i64, i64 }, ptr %t16 + %t20 = extractvalue { ptr, i64, i64 } %t19, 1 + %t21 = icmp uge i64 %t18, %t20 + br i1 %t21, label %range7777, label %inrange7778 +range7777: + call void @finch_panic_index(ptr @.str.5252, i64 4804, i64 %t18, i64 %t20) + unreachable +inrange7778: + %t22 = extractvalue { ptr, i64, i64 } %t19, 0 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t22, i64 %t18 + %t24 = load { ptr, i64, i64 }, ptr %t23 + %t25 = call { ptr, i64, i64 } @finch.gen.strGlobal(ptr %t13, { ptr, i64, i64 } %t24) + store { ptr, i64, i64 } %t25, ptr %a26 + %t27 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.5253, i64 3, i64 0 }, ptr %a29 + %t30 = call i32 @finch_str_eq(ptr %a28, ptr %a29) + %t31 = icmp ne i32 %t30, 0 + br i1 %t31, label %then7779, label %endif7781 +then7779: + %t32 = load ptr, ptr %a1 + %t33 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t32, %S.ast.Node %t33, i64 2) + %t34 = load ptr, ptr %a1 + %t35 = load ptr, ptr %a1 + %t36 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t37 = load { ptr, i64, i64 }, ptr %t36 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 1, %t38 + br i1 %t39, label %range7782, label %inrange7783 +range7782: + call void @finch_panic_index(ptr @.str.5254, i64 4807, i64 1, i64 %t38) + unreachable +inrange7783: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds %S.ast.Node, ptr %t40, i64 1 + %t42 = load %S.ast.Node, ptr %t41 + %t43 = call %S.gen.Val @finch.gen.expr(ptr %t35, %S.ast.Node %t42) + %t44 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5255, i64 3, i64 0 }) + %t45 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t46 = load { ptr, i64, i64 }, ptr %t45 + %t47 = extractvalue { ptr, i64, i64 } %t46, 1 + %t48 = icmp uge i64 1, %t47 + br i1 %t48, label %range7784, label %inrange7785 +range7784: + call void @finch_panic_index(ptr @.str.5256, i64 4807, i64 1, i64 %t47) + unreachable +inrange7785: + %t49 = extractvalue { ptr, i64, i64 } %t46, 0 + %t50 = getelementptr inbounds %S.ast.Node, ptr %t49, i64 1 + %t51 = load %S.ast.Node, ptr %t50 + %t52 = call %S.gen.Val @finch.gen.coerce(ptr %t34, %S.gen.Val %t43, %S.ast.Type %t44, %S.ast.Node %t51, { ptr, i64, i64 } { ptr @.str.5257, i64 9, i64 0 }) + %t53 = extractvalue %S.gen.Val %t52, 0 + store { ptr, i64, i64 } %t53, ptr %a54 + call void @finch_str_copy(ptr %a55, ptr %a54) + %t56 = load { ptr, i64, i64 }, ptr %a55 + store { ptr, i64, i64 } %t56, ptr %a57 + %t58 = load ptr, ptr %a1 + %t59 = load ptr, ptr %a1 + %t60 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t61 = load { ptr, i64, i64 }, ptr %t60 + %t62 = extractvalue { ptr, i64, i64 } %t61, 1 + %t63 = icmp uge i64 2, %t62 + br i1 %t63, label %range7786, label %inrange7787 +range7786: + call void @finch_panic_index(ptr @.str.5258, i64 4808, i64 2, i64 %t62) + unreachable +inrange7787: + %t64 = extractvalue { ptr, i64, i64 } %t61, 0 + %t65 = getelementptr inbounds %S.ast.Node, ptr %t64, i64 2 + %t66 = load %S.ast.Node, ptr %t65 + %t67 = call %S.gen.Val @finch.gen.expr(ptr %t59, %S.ast.Node %t66) + %t68 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5259, i64 3, i64 0 }) + %t69 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t70 = load { ptr, i64, i64 }, ptr %t69 + %t71 = extractvalue { ptr, i64, i64 } %t70, 1 + %t72 = icmp uge i64 2, %t71 + br i1 %t72, label %range7788, label %inrange7789 +range7788: + call void @finch_panic_index(ptr @.str.5260, i64 4808, i64 2, i64 %t71) + unreachable +inrange7789: + %t73 = extractvalue { ptr, i64, i64 } %t70, 0 + %t74 = getelementptr inbounds %S.ast.Node, ptr %t73, i64 2 + %t75 = load %S.ast.Node, ptr %t74 + %t76 = call %S.gen.Val @finch.gen.coerce(ptr %t58, %S.gen.Val %t67, %S.ast.Type %t68, %S.ast.Node %t75, { ptr, i64, i64 } { ptr @.str.5261, i64 7, i64 0 }) + %t77 = extractvalue %S.gen.Val %t76, 0 + store { ptr, i64, i64 } %t77, ptr %a78 + call void @finch_str_copy(ptr %a79, ptr %a78) + %t80 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } %t80, ptr %a81 + %t82 = load ptr, ptr %a1 + %t83 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.5262, i64 29, i64 0 }, ptr %a85 + store { ptr, i64, i64 } %t83, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + store { ptr, i64, i64 } %t87, ptr %a89 + store { ptr, i64, i64 } { ptr @.str.5263, i64 6, i64 0 }, ptr %a90 + call void @finch_str_concat(ptr %a88, ptr %a89, ptr %a90) + %t91 = load { ptr, i64, i64 }, ptr %a88 + %t92 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t91, ptr %a94 + store { ptr, i64, i64 } %t92, ptr %a95 + call void @finch_str_concat(ptr %a93, ptr %a94, ptr %a95) + %t96 = load { ptr, i64, i64 }, ptr %a93 + store { ptr, i64, i64 } %t96, ptr %a98 + store { ptr, i64, i64 } { ptr @.str.5264, i64 6, i64 0 }, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + %t101 = load { ptr, i64, i64 }, ptr %a57 + store { ptr, i64, i64 } %t100, ptr %a103 + store { ptr, i64, i64 } %t101, ptr %a104 + call void @finch_str_concat(ptr %a102, ptr %a103, ptr %a104) + %t105 = load { ptr, i64, i64 }, ptr %a102 + store { ptr, i64, i64 } %t105, ptr %a107 + store { ptr, i64, i64 } { ptr @.str.5265, i64 6, i64 0 }, ptr %a108 + call void @finch_str_concat(ptr %a106, ptr %a107, ptr %a108) + %t109 = load { ptr, i64, i64 }, ptr %a106 + %t110 = load { ptr, i64, i64 }, ptr %a81 + store { ptr, i64, i64 } %t109, ptr %a112 + store { ptr, i64, i64 } %t110, ptr %a113 + call void @finch_str_concat(ptr %a111, ptr %a112, ptr %a113) + %t114 = load { ptr, i64, i64 }, ptr %a111 + store { ptr, i64, i64 } %t114, ptr %a116 + store { ptr, i64, i64 } { ptr @.str.5266, i64 6, i64 0 }, ptr %a117 + call void @finch_str_concat(ptr %a115, ptr %a116, ptr %a117) + %t118 = load { ptr, i64, i64 }, ptr %a115 + %t119 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t118, ptr %a121 + store { ptr, i64, i64 } %t119, ptr %a122 + call void @finch_str_concat(ptr %a120, ptr %a121, ptr %a122) + %t123 = load { ptr, i64, i64 }, ptr %a120 + store { ptr, i64, i64 } %t123, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.5267, i64 6, i64 0 }, ptr %a126 + call void @finch_str_concat(ptr %a124, ptr %a125, ptr %a126) + %t127 = load { ptr, i64, i64 }, ptr %a124 + %t128 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 11 + %t129 = load i64, ptr %t128 + call void @finch_str_from_int(ptr %a130, i64 %t129) + %t131 = load { ptr, i64, i64 }, ptr %a130 + store { ptr, i64, i64 } %t127, ptr %a133 + store { ptr, i64, i64 } %t131, ptr %a134 + call void @finch_str_concat(ptr %a132, ptr %a133, ptr %a134) + %t135 = load { ptr, i64, i64 }, ptr %a132 + store { ptr, i64, i64 } %t135, ptr %a137 + store { ptr, i64, i64 } { ptr @.str.5268, i64 1, i64 0 }, ptr %a138 + call void @finch_str_concat(ptr %a136, ptr %a137, ptr %a138) + %t139 = load { ptr, i64, i64 }, ptr %a136 + call void @finch.gen.emit(ptr %t82, { ptr, i64, i64 } %t139) + %t140 = load ptr, ptr %a1 + %t141 = load { ptr, i64, i64 }, ptr %a12 + %t142 = call { ptr, i64, i64 } @finch.gen.load(ptr %t140, { ptr, i64, i64 } { ptr @.str.5269, i64 17, i64 0 }, { ptr, i64, i64 } %t141) + %t143 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t142, 0 + %t144 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5270, i64 3, i64 0 }) + %t145 = insertvalue %S.gen.Val %t143, %S.ast.Type %t144, 1 + %t146 = insertvalue %S.gen.Val %t145, i1 true, 2 + ret %S.gen.Val %t146 +endif7781: + %t147 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t147, ptr %a148 + store { ptr, i64, i64 } { ptr @.str.5271, i64 4, i64 0 }, ptr %a149 + %t150 = call i32 @finch_str_eq(ptr %a148, ptr %a149) + %t151 = icmp ne i32 %t150, 0 + br label %logic.from7790 +logic.from7790: + br i1 %t151, label %logic.end7792, label %logic.rhs7791 +logic.rhs7791: + %t152 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t152, ptr %a153 + store { ptr, i64, i64 } { ptr @.str.5272, i64 8, i64 0 }, ptr %a154 + %t155 = call i32 @finch_str_eq(ptr %a153, ptr %a154) + %t156 = icmp ne i32 %t155, 0 + br label %logic.rend7793 +logic.rend7793: + br label %logic.end7792 +logic.end7792: + %t157 = phi i1 [ true, %logic.from7790 ], [ %t156, %logic.rend7793 ] + br label %logic.from7794 +logic.from7794: + br i1 %t157, label %logic.end7796, label %logic.rhs7795 +logic.rhs7795: + %t158 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t158, ptr %a159 + store { ptr, i64, i64 } { ptr @.str.5273, i64 11, i64 0 }, ptr %a160 + %t161 = call i32 @finch_str_eq(ptr %a159, ptr %a160) + %t162 = icmp ne i32 %t161, 0 + br label %logic.rend7797 +logic.rend7797: + br label %logic.end7796 +logic.end7796: + %t163 = phi i1 [ true, %logic.from7794 ], [ %t162, %logic.rend7797 ] + br label %logic.from7798 +logic.from7798: + br i1 %t163, label %logic.end7800, label %logic.rhs7799 +logic.rhs7799: + %t164 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t164, ptr %a165 + store { ptr, i64, i64 } { ptr @.str.5274, i64 9, i64 0 }, ptr %a166 + %t167 = call i32 @finch_str_eq(ptr %a165, ptr %a166) + %t168 = icmp ne i32 %t167, 0 + br label %logic.rend7801 +logic.rend7801: + br label %logic.end7800 +logic.end7800: + %t169 = phi i1 [ true, %logic.from7798 ], [ %t168, %logic.rend7801 ] + br i1 %t169, label %then7802, label %endif7804 +then7802: + %t170 = load ptr, ptr %a1 + %t171 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t170, %S.ast.Node %t171, i64 1) + %t172 = load ptr, ptr %a1 + %t173 = load ptr, ptr %a1 + %t174 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t175 = load { ptr, i64, i64 }, ptr %t174 + %t176 = extractvalue { ptr, i64, i64 } %t175, 1 + %t177 = icmp uge i64 1, %t176 + br i1 %t177, label %range7805, label %inrange7806 +range7805: + call void @finch_panic_index(ptr @.str.5275, i64 4814, i64 1, i64 %t176) + unreachable +inrange7806: + %t178 = extractvalue { ptr, i64, i64 } %t175, 0 + %t179 = getelementptr inbounds %S.ast.Node, ptr %t178, i64 1 + %t180 = load %S.ast.Node, ptr %t179 + %t181 = call %S.gen.Val @finch.gen.strArg(ptr %t173, %S.ast.Node %t180, { ptr, i64, i64 } { ptr @.str.5276, i64 20, i64 0 }) + %t182 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t172, %S.gen.Val %t181) + store { ptr, i64, i64 } %t182, ptr %a183 + %t184 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t184, ptr %a185 + store { ptr, i64, i64 } { ptr @.str.5277, i64 4, i64 0 }, ptr %a186 + %t187 = call i32 @finch_str_eq(ptr %a185, ptr %a186) + %t188 = icmp ne i32 %t187, 0 + br i1 %t188, label %then7807, label %endif7809 +then7807: + %t189 = load ptr, ptr %a1 + %t190 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5278, i64 29, i64 0 }, ptr %a192 + store { ptr, i64, i64 } %t190, ptr %a193 + call void @finch_str_concat(ptr %a191, ptr %a192, ptr %a193) + %t194 = load { ptr, i64, i64 }, ptr %a191 + store { ptr, i64, i64 } %t194, ptr %a196 + store { ptr, i64, i64 } { ptr @.str.5279, i64 6, i64 0 }, ptr %a197 + call void @finch_str_concat(ptr %a195, ptr %a196, ptr %a197) + %t198 = load { ptr, i64, i64 }, ptr %a195 + %t199 = load { ptr, i64, i64 }, ptr %a183 + store { ptr, i64, i64 } %t198, ptr %a201 + store { ptr, i64, i64 } %t199, ptr %a202 + call void @finch_str_concat(ptr %a200, ptr %a201, ptr %a202) + %t203 = load { ptr, i64, i64 }, ptr %a200 + store { ptr, i64, i64 } %t203, ptr %a205 + store { ptr, i64, i64 } { ptr @.str.5280, i64 1, i64 0 }, ptr %a206 + call void @finch_str_concat(ptr %a204, ptr %a205, ptr %a206) + %t207 = load { ptr, i64, i64 }, ptr %a204 + %t208 = call { ptr, i64, i64 } @finch.gen.op(ptr %t189, { ptr, i64, i64 } %t207) + %t209 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t208, 0 + %t210 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5281, i64 3, i64 0 }) + %t211 = insertvalue %S.gen.Val %t209, %S.ast.Type %t210, 1 + ret %S.gen.Val %t211 +endif7809: + %t212 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t212, ptr %a213 + store { ptr, i64, i64 } { ptr @.str.5282, i64 8, i64 0 }, ptr %a214 + %t215 = call i32 @finch_str_eq(ptr %a213, ptr %a214) + %t216 = icmp ne i32 %t215, 0 + br i1 %t216, label %then7810, label %endif7812 +then7810: + %t217 = load ptr, ptr %a1 + %t218 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5283, i64 29, i64 0 }, ptr %a220 + store { ptr, i64, i64 } %t218, ptr %a221 + call void @finch_str_concat(ptr %a219, ptr %a220, ptr %a221) + %t222 = load { ptr, i64, i64 }, ptr %a219 + store { ptr, i64, i64 } %t222, ptr %a224 + store { ptr, i64, i64 } { ptr @.str.5284, i64 6, i64 0 }, ptr %a225 + call void @finch_str_concat(ptr %a223, ptr %a224, ptr %a225) + %t226 = load { ptr, i64, i64 }, ptr %a223 + %t227 = load { ptr, i64, i64 }, ptr %a183 + store { ptr, i64, i64 } %t226, ptr %a229 + store { ptr, i64, i64 } %t227, ptr %a230 + call void @finch_str_concat(ptr %a228, ptr %a229, ptr %a230) + %t231 = load { ptr, i64, i64 }, ptr %a228 + store { ptr, i64, i64 } %t231, ptr %a233 + store { ptr, i64, i64 } { ptr @.str.5285, i64 1, i64 0 }, ptr %a234 + call void @finch_str_concat(ptr %a232, ptr %a233, ptr %a234) + %t235 = load { ptr, i64, i64 }, ptr %a232 + %t236 = call { ptr, i64, i64 } @finch.gen.op(ptr %t217, { ptr, i64, i64 } %t235) + store { ptr, i64, i64 } %t236, ptr %a237 + %t238 = load ptr, ptr %a1 + %t239 = load { ptr, i64, i64 }, ptr %a237 + store { ptr, i64, i64 } { ptr @.str.5286, i64 13, i64 0 }, ptr %a241 + store { ptr, i64, i64 } %t239, ptr %a242 + call void @finch_str_concat(ptr %a240, ptr %a241, ptr %a242) + %t243 = load { ptr, i64, i64 }, ptr %a240 + store { ptr, i64, i64 } %t243, ptr %a245 + store { ptr, i64, i64 } { ptr @.str.5287, i64 3, i64 0 }, ptr %a246 + call void @finch_str_concat(ptr %a244, ptr %a245, ptr %a246) + %t247 = load { ptr, i64, i64 }, ptr %a244 + %t248 = call { ptr, i64, i64 } @finch.gen.op(ptr %t238, { ptr, i64, i64 } %t247) + %t249 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t248, 0 + %t250 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5288, i64 4, i64 0 }) + %t251 = insertvalue %S.gen.Val %t249, %S.ast.Type %t250, 1 + ret %S.gen.Val %t251 +endif7812: + store { ptr, i64, i64 } { ptr @.str.5289, i64 17, i64 0 }, ptr %a252 + %t253 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t253, ptr %a254 + store { ptr, i64, i64 } { ptr @.str.5290, i64 9, i64 0 }, ptr %a255 + %t256 = call i32 @finch_str_eq(ptr %a254, ptr %a255) + %t257 = icmp ne i32 %t256, 0 + br i1 %t257, label %then7813, label %endif7815 +then7813: + store { ptr, i64, i64 } { ptr @.str.5291, i64 15, i64 0 }, ptr %a252 + br label %endif7815 +endif7815: + %t258 = load ptr, ptr %a1 + %t259 = load { ptr, i64, i64 }, ptr %a252 + store { ptr, i64, i64 } { ptr @.str.5292, i64 9, i64 0 }, ptr %a261 + store { ptr, i64, i64 } %t259, ptr %a262 + call void @finch_str_concat(ptr %a260, ptr %a261, ptr %a262) + %t263 = load { ptr, i64, i64 }, ptr %a260 + store { ptr, i64, i64 } %t263, ptr %a265 + store { ptr, i64, i64 } { ptr @.str.5293, i64 5, i64 0 }, ptr %a266 + call void @finch_str_concat(ptr %a264, ptr %a265, ptr %a266) + %t267 = load { ptr, i64, i64 }, ptr %a264 + %t268 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t267, ptr %a270 + store { ptr, i64, i64 } %t268, ptr %a271 + call void @finch_str_concat(ptr %a269, ptr %a270, ptr %a271) + %t272 = load { ptr, i64, i64 }, ptr %a269 + store { ptr, i64, i64 } %t272, ptr %a274 + store { ptr, i64, i64 } { ptr @.str.5294, i64 6, i64 0 }, ptr %a275 + call void @finch_str_concat(ptr %a273, ptr %a274, ptr %a275) + %t276 = load { ptr, i64, i64 }, ptr %a273 + %t277 = load { ptr, i64, i64 }, ptr %a183 + store { ptr, i64, i64 } %t276, ptr %a279 + store { ptr, i64, i64 } %t277, ptr %a280 + call void @finch_str_concat(ptr %a278, ptr %a279, ptr %a280) + %t281 = load { ptr, i64, i64 }, ptr %a278 + store { ptr, i64, i64 } %t281, ptr %a283 + store { ptr, i64, i64 } { ptr @.str.5295, i64 1, i64 0 }, ptr %a284 + call void @finch_str_concat(ptr %a282, ptr %a283, ptr %a284) + %t285 = load { ptr, i64, i64 }, ptr %a282 + %t286 = call { ptr, i64, i64 } @finch.gen.op(ptr %t258, { ptr, i64, i64 } %t285) + store { ptr, i64, i64 } %t286, ptr %a287 + %t288 = load ptr, ptr %a1 + %t289 = load { ptr, i64, i64 }, ptr %a287 + store { ptr, i64, i64 } { ptr @.str.5296, i64 12, i64 0 }, ptr %a291 + store { ptr, i64, i64 } %t289, ptr %a292 + call void @finch_str_concat(ptr %a290, ptr %a291, ptr %a292) + %t293 = load { ptr, i64, i64 }, ptr %a290 + store { ptr, i64, i64 } %t293, ptr %a295 + store { ptr, i64, i64 } { ptr @.str.5297, i64 3, i64 0 }, ptr %a296 + call void @finch_str_concat(ptr %a294, ptr %a295, ptr %a296) + %t297 = load { ptr, i64, i64 }, ptr %a294 + %t298 = call { ptr, i64, i64 } @finch.gen.op(ptr %t288, { ptr, i64, i64 } %t297) + %t299 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t298, 0 + %t300 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5298, i64 4, i64 0 }) + %t301 = insertvalue %S.gen.Val %t299, %S.ast.Type %t300, 1 + ret %S.gen.Val %t301 +endif7804: + %t302 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t302, ptr %a303 + store { ptr, i64, i64 } { ptr @.str.5299, i64 4, i64 0 }, ptr %a304 + %t305 = call i32 @finch_str_eq(ptr %a303, ptr %a304) + %t306 = icmp ne i32 %t305, 0 + br label %logic.from7816 +logic.from7816: + br i1 %t306, label %logic.end7818, label %logic.rhs7817 +logic.rhs7817: + %t307 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t307, ptr %a308 + store { ptr, i64, i64 } { ptr @.str.5300, i64 5, i64 0 }, ptr %a309 + %t310 = call i32 @finch_str_eq(ptr %a308, ptr %a309) + %t311 = icmp ne i32 %t310, 0 + br label %logic.rend7819 +logic.rend7819: + br label %logic.end7818 +logic.end7818: + %t312 = phi i1 [ true, %logic.from7816 ], [ %t311, %logic.rend7819 ] + br label %logic.from7820 +logic.from7820: + br i1 %t312, label %logic.end7822, label %logic.rhs7821 +logic.rhs7821: + %t313 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t313, ptr %a314 + store { ptr, i64, i64 } { ptr @.str.5301, i64 5, i64 0 }, ptr %a315 + %t316 = call i32 @finch_str_eq(ptr %a314, ptr %a315) + %t317 = icmp ne i32 %t316, 0 + br label %logic.rend7823 +logic.rend7823: + br label %logic.end7822 +logic.end7822: + %t318 = phi i1 [ true, %logic.from7820 ], [ %t317, %logic.rend7823 ] + br i1 %t318, label %then7824, label %endif7826 +then7824: + %t319 = load ptr, ptr %a1 + %t320 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t319, %S.ast.Node %t320, i64 0) + %t321 = load ptr, ptr %a1 + %t322 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.5302, i64 21, i64 0 }, ptr %a324 + store { ptr, i64, i64 } %t322, ptr %a325 + call void @finch_str_concat(ptr %a323, ptr %a324, ptr %a325) + %t326 = load { ptr, i64, i64 }, ptr %a323 + store { ptr, i64, i64 } %t326, ptr %a328 + store { ptr, i64, i64 } { ptr @.str.5303, i64 5, i64 0 }, ptr %a329 + call void @finch_str_concat(ptr %a327, ptr %a328, ptr %a329) + %t330 = load { ptr, i64, i64 }, ptr %a327 + %t331 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t330, ptr %a333 + store { ptr, i64, i64 } %t331, ptr %a334 + call void @finch_str_concat(ptr %a332, ptr %a333, ptr %a334) + %t335 = load { ptr, i64, i64 }, ptr %a332 + store { ptr, i64, i64 } %t335, ptr %a337 + store { ptr, i64, i64 } { ptr @.str.5304, i64 6, i64 0 }, ptr %a338 + call void @finch_str_concat(ptr %a336, ptr %a337, ptr %a338) + %t339 = load { ptr, i64, i64 }, ptr %a336 + %t340 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t339, ptr %a342 + store { ptr, i64, i64 } %t340, ptr %a343 + call void @finch_str_concat(ptr %a341, ptr %a342, ptr %a343) + %t344 = load { ptr, i64, i64 }, ptr %a341 + store { ptr, i64, i64 } %t344, ptr %a346 + store { ptr, i64, i64 } { ptr @.str.5305, i64 1, i64 0 }, ptr %a347 + call void @finch_str_concat(ptr %a345, ptr %a346, ptr %a347) + %t348 = load { ptr, i64, i64 }, ptr %a345 + call void @finch.gen.emit(ptr %t321, { ptr, i64, i64 } %t348) + %t349 = load ptr, ptr %a1 + %t350 = load { ptr, i64, i64 }, ptr %a12 + %t351 = call { ptr, i64, i64 } @finch.gen.load(ptr %t349, { ptr, i64, i64 } { ptr @.str.5306, i64 17, i64 0 }, { ptr, i64, i64 } %t350) + %t352 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t351, 0 + %t353 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5307, i64 3, i64 0 }) + %t354 = insertvalue %S.gen.Val %t352, %S.ast.Type %t353, 1 + %t355 = insertvalue %S.gen.Val %t354, i1 true, 2 + ret %S.gen.Val %t355 +endif7826: + %t356 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t356, ptr %a357 + store { ptr, i64, i64 } { ptr @.str.5308, i64 7, i64 0 }, ptr %a358 + %t359 = call i32 @finch_str_eq(ptr %a357, ptr %a358) + %t360 = icmp ne i32 %t359, 0 + br i1 %t360, label %then7827, label %endif7829 +then7827: + %t361 = load ptr, ptr %a1 + %t362 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t361, %S.ast.Node %t362, i64 2) + %t363 = load ptr, ptr %a1 + %t364 = load ptr, ptr %a1 + %t365 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t366 = load { ptr, i64, i64 }, ptr %t365 + %t367 = extractvalue { ptr, i64, i64 } %t366, 1 + %t368 = icmp uge i64 1, %t367 + br i1 %t368, label %range7830, label %inrange7831 +range7830: + call void @finch_panic_index(ptr @.str.5309, i64 4836, i64 1, i64 %t367) + unreachable +inrange7831: + %t369 = extractvalue { ptr, i64, i64 } %t366, 0 + %t370 = getelementptr inbounds %S.ast.Node, ptr %t369, i64 1 + %t371 = load %S.ast.Node, ptr %t370 + %t372 = call %S.gen.Val @finch.gen.strArg(ptr %t364, %S.ast.Node %t371, { ptr, i64, i64 } { ptr @.str.5310, i64 19, i64 0 }) + %t373 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t363, %S.gen.Val %t372) + store { ptr, i64, i64 } %t373, ptr %a374 + %t375 = load ptr, ptr %a1 + %t376 = load ptr, ptr %a1 + %t377 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t378 = load { ptr, i64, i64 }, ptr %t377 + %t379 = extractvalue { ptr, i64, i64 } %t378, 1 + %t380 = icmp uge i64 2, %t379 + br i1 %t380, label %range7832, label %inrange7833 +range7832: + call void @finch_panic_index(ptr @.str.5311, i64 4837, i64 2, i64 %t379) + unreachable +inrange7833: + %t381 = extractvalue { ptr, i64, i64 } %t378, 0 + %t382 = getelementptr inbounds %S.ast.Node, ptr %t381, i64 2 + %t383 = load %S.ast.Node, ptr %t382 + %t384 = call %S.gen.Val @finch.gen.strArg(ptr %t376, %S.ast.Node %t383, { ptr, i64, i64 } { ptr @.str.5312, i64 12, i64 0 }) + %t385 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t375, %S.gen.Val %t384) + store { ptr, i64, i64 } %t385, ptr %a386 + %t387 = load ptr, ptr %a1 + %t388 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.5313, i64 33, i64 0 }, ptr %a390 + store { ptr, i64, i64 } %t388, ptr %a391 + call void @finch_str_concat(ptr %a389, ptr %a390, ptr %a391) + %t392 = load { ptr, i64, i64 }, ptr %a389 + store { ptr, i64, i64 } %t392, ptr %a394 + store { ptr, i64, i64 } { ptr @.str.5314, i64 6, i64 0 }, ptr %a395 + call void @finch_str_concat(ptr %a393, ptr %a394, ptr %a395) + %t396 = load { ptr, i64, i64 }, ptr %a393 + %t397 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t396, ptr %a399 + store { ptr, i64, i64 } %t397, ptr %a400 + call void @finch_str_concat(ptr %a398, ptr %a399, ptr %a400) + %t401 = load { ptr, i64, i64 }, ptr %a398 + store { ptr, i64, i64 } %t401, ptr %a403 + store { ptr, i64, i64 } { ptr @.str.5315, i64 6, i64 0 }, ptr %a404 + call void @finch_str_concat(ptr %a402, ptr %a403, ptr %a404) + %t405 = load { ptr, i64, i64 }, ptr %a402 + %t406 = load { ptr, i64, i64 }, ptr %a374 + store { ptr, i64, i64 } %t405, ptr %a408 + store { ptr, i64, i64 } %t406, ptr %a409 + call void @finch_str_concat(ptr %a407, ptr %a408, ptr %a409) + %t410 = load { ptr, i64, i64 }, ptr %a407 + store { ptr, i64, i64 } %t410, ptr %a412 + store { ptr, i64, i64 } { ptr @.str.5316, i64 6, i64 0 }, ptr %a413 + call void @finch_str_concat(ptr %a411, ptr %a412, ptr %a413) + %t414 = load { ptr, i64, i64 }, ptr %a411 + %t415 = load { ptr, i64, i64 }, ptr %a386 + store { ptr, i64, i64 } %t414, ptr %a417 + store { ptr, i64, i64 } %t415, ptr %a418 + call void @finch_str_concat(ptr %a416, ptr %a417, ptr %a418) + %t419 = load { ptr, i64, i64 }, ptr %a416 + store { ptr, i64, i64 } %t419, ptr %a421 + store { ptr, i64, i64 } { ptr @.str.5317, i64 1, i64 0 }, ptr %a422 + call void @finch_str_concat(ptr %a420, ptr %a421, ptr %a422) + %t423 = load { ptr, i64, i64 }, ptr %a420 + call void @finch.gen.emit(ptr %t387, { ptr, i64, i64 } %t423) + %t424 = load ptr, ptr %a1 + %t425 = load { ptr, i64, i64 }, ptr %a12 + %t426 = call { ptr, i64, i64 } @finch.gen.load(ptr %t424, { ptr, i64, i64 } { ptr @.str.5318, i64 17, i64 0 }, { ptr, i64, i64 } %t425) + %t427 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t426, 0 + %t428 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5319, i64 3, i64 0 }) + %t429 = insertvalue %S.gen.Val %t427, %S.ast.Type %t428, 1 + %t430 = insertvalue %S.gen.Val %t429, i1 true, 2 + ret %S.gen.Val %t430 +endif7829: + %t431 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t431, ptr %a432 + store { ptr, i64, i64 } { ptr @.str.5320, i64 5, i64 0 }, ptr %a433 + %t434 = call i32 @finch_str_eq(ptr %a432, ptr %a433) + %t435 = icmp ne i32 %t434, 0 + br i1 %t435, label %then7834, label %endif7836 +then7834: + %t436 = load ptr, ptr %a1 + %t437 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t436, %S.ast.Node %t437, i64 1) + %t438 = load ptr, ptr %a1 + %t439 = load ptr, ptr %a1 + %t440 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t441 = load { ptr, i64, i64 }, ptr %t440 + %t442 = extractvalue { ptr, i64, i64 } %t441, 1 + %t443 = icmp uge i64 1, %t442 + br i1 %t443, label %range7837, label %inrange7838 +range7837: + call void @finch_panic_index(ptr @.str.5321, i64 4843, i64 1, i64 %t442) + unreachable +inrange7838: + %t444 = extractvalue { ptr, i64, i64 } %t441, 0 + %t445 = getelementptr inbounds %S.ast.Node, ptr %t444, i64 1 + %t446 = load %S.ast.Node, ptr %t445 + %t447 = call %S.gen.Val @finch.gen.strArg(ptr %t439, %S.ast.Node %t446, { ptr, i64, i64 } { ptr @.str.5322, i64 13, i64 0 }) + %t448 = call { ptr, i64, i64 } @finch.gen.spill(ptr %t438, %S.gen.Val %t447) + store { ptr, i64, i64 } %t448, ptr %a449 + %t450 = load ptr, ptr %a1 + %t451 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t450) + store { ptr, i64, i64 } %t451, ptr %a452 + %t453 = load ptr, ptr %a1 + %t454 = load { ptr, i64, i64 }, ptr %a452 + store { ptr, i64, i64 } { ptr @.str.5323, i64 31, i64 0 }, ptr %a456 + store { ptr, i64, i64 } %t454, ptr %a457 + call void @finch_str_concat(ptr %a455, ptr %a456, ptr %a457) + %t458 = load { ptr, i64, i64 }, ptr %a455 + store { ptr, i64, i64 } %t458, ptr %a460 + store { ptr, i64, i64 } { ptr @.str.5324, i64 6, i64 0 }, ptr %a461 + call void @finch_str_concat(ptr %a459, ptr %a460, ptr %a461) + %t462 = load { ptr, i64, i64 }, ptr %a459 + %t463 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t462, ptr %a465 + store { ptr, i64, i64 } %t463, ptr %a466 + call void @finch_str_concat(ptr %a464, ptr %a465, ptr %a466) + %t467 = load { ptr, i64, i64 }, ptr %a464 + store { ptr, i64, i64 } %t467, ptr %a469 + store { ptr, i64, i64 } { ptr @.str.5325, i64 6, i64 0 }, ptr %a470 + call void @finch_str_concat(ptr %a468, ptr %a469, ptr %a470) + %t471 = load { ptr, i64, i64 }, ptr %a468 + %t472 = load { ptr, i64, i64 }, ptr %a449 + store { ptr, i64, i64 } %t471, ptr %a474 + store { ptr, i64, i64 } %t472, ptr %a475 + call void @finch_str_concat(ptr %a473, ptr %a474, ptr %a475) + %t476 = load { ptr, i64, i64 }, ptr %a473 + store { ptr, i64, i64 } %t476, ptr %a478 + store { ptr, i64, i64 } { ptr @.str.5326, i64 1, i64 0 }, ptr %a479 + call void @finch_str_concat(ptr %a477, ptr %a478, ptr %a479) + %t480 = load { ptr, i64, i64 }, ptr %a477 + call void @finch.gen.emit(ptr %t453, { ptr, i64, i64 } %t480) + %t481 = load ptr, ptr %a1 + %t482 = load { ptr, i64, i64 }, ptr %a452 + %t483 = call { ptr, i64, i64 } @finch.gen.load(ptr %t481, { ptr, i64, i64 } { ptr @.str.5327, i64 17, i64 0 }, { ptr, i64, i64 } %t482) + %t484 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t483, 0 + %t485 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5328, i64 3, i64 0 }) + %t486 = call %S.ast.Type @finch.ast.arrayOf(%S.ast.Type %t485) + %t487 = insertvalue %S.gen.Val %t484, %S.ast.Type %t486, 1 + %t488 = insertvalue %S.gen.Val %t487, i1 true, 2 + ret %S.gen.Val %t488 +endif7836: + %t489 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t489, ptr %a490 + store { ptr, i64, i64 } { ptr @.str.5329, i64 6, i64 0 }, ptr %a491 + %t492 = call i32 @finch_str_eq(ptr %a490, ptr %a491) + %t493 = icmp ne i32 %t492, 0 + br i1 %t493, label %then7839, label %endif7841 +then7839: + %t494 = load ptr, ptr %a1 + %t495 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t494, %S.ast.Node %t495, i64 1) + %t496 = load ptr, ptr %a1 + %t497 = load ptr, ptr %a1 + %t498 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t499 = load { ptr, i64, i64 }, ptr %t498 + %t500 = extractvalue { ptr, i64, i64 } %t499, 1 + %t501 = icmp uge i64 1, %t500 + br i1 %t501, label %range7842, label %inrange7843 +range7842: + call void @finch_panic_index(ptr @.str.5330, i64 4850, i64 1, i64 %t500) + unreachable +inrange7843: + %t502 = extractvalue { ptr, i64, i64 } %t499, 0 + %t503 = getelementptr inbounds %S.ast.Node, ptr %t502, i64 1 + %t504 = load %S.ast.Node, ptr %t503 + %t505 = call %S.gen.Val @finch.gen.expr(ptr %t497, %S.ast.Node %t504) + %t506 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5331, i64 3, i64 0 }) + %t507 = getelementptr inbounds %S.ast.Node, ptr %a2, i32 0, i32 9 + %t508 = load { ptr, i64, i64 }, ptr %t507 + %t509 = extractvalue { ptr, i64, i64 } %t508, 1 + %t510 = icmp uge i64 1, %t509 + br i1 %t510, label %range7844, label %inrange7845 +range7844: + call void @finch_panic_index(ptr @.str.5332, i64 4850, i64 1, i64 %t509) + unreachable +inrange7845: + %t511 = extractvalue { ptr, i64, i64 } %t508, 0 + %t512 = getelementptr inbounds %S.ast.Node, ptr %t511, i64 1 + %t513 = load %S.ast.Node, ptr %t512 + %t514 = call %S.gen.Val @finch.gen.coerce(ptr %t496, %S.gen.Val %t505, %S.ast.Type %t506, %S.ast.Node %t513, { ptr, i64, i64 } { ptr @.str.5333, i64 9, i64 0 }) + %t515 = extractvalue %S.gen.Val %t514, 0 + store { ptr, i64, i64 } %t515, ptr %a516 + call void @finch_str_copy(ptr %a517, ptr %a516) + %t518 = load { ptr, i64, i64 }, ptr %a517 + store { ptr, i64, i64 } %t518, ptr %a519 + %t520 = load ptr, ptr %a1 + %t521 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } { ptr @.str.5334, i64 32, i64 0 }, ptr %a523 + store { ptr, i64, i64 } %t521, ptr %a524 + call void @finch_str_concat(ptr %a522, ptr %a523, ptr %a524) + %t525 = load { ptr, i64, i64 }, ptr %a522 + store { ptr, i64, i64 } %t525, ptr %a527 + store { ptr, i64, i64 } { ptr @.str.5335, i64 6, i64 0 }, ptr %a528 + call void @finch_str_concat(ptr %a526, ptr %a527, ptr %a528) + %t529 = load { ptr, i64, i64 }, ptr %a526 + %t530 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t529, ptr %a532 + store { ptr, i64, i64 } %t530, ptr %a533 + call void @finch_str_concat(ptr %a531, ptr %a532, ptr %a533) + %t534 = load { ptr, i64, i64 }, ptr %a531 + store { ptr, i64, i64 } %t534, ptr %a536 + store { ptr, i64, i64 } { ptr @.str.5336, i64 6, i64 0 }, ptr %a537 + call void @finch_str_concat(ptr %a535, ptr %a536, ptr %a537) + %t538 = load { ptr, i64, i64 }, ptr %a535 + %t539 = load { ptr, i64, i64 }, ptr %a519 + store { ptr, i64, i64 } %t538, ptr %a541 + store { ptr, i64, i64 } %t539, ptr %a542 + call void @finch_str_concat(ptr %a540, ptr %a541, ptr %a542) + %t543 = load { ptr, i64, i64 }, ptr %a540 + store { ptr, i64, i64 } %t543, ptr %a545 + store { ptr, i64, i64 } { ptr @.str.5337, i64 1, i64 0 }, ptr %a546 + call void @finch_str_concat(ptr %a544, ptr %a545, ptr %a546) + %t547 = load { ptr, i64, i64 }, ptr %a544 + call void @finch.gen.emit(ptr %t520, { ptr, i64, i64 } %t547) + %t548 = load ptr, ptr %a1 + %t549 = load { ptr, i64, i64 }, ptr %a12 + %t550 = call { ptr, i64, i64 } @finch.gen.load(ptr %t548, { ptr, i64, i64 } { ptr @.str.5338, i64 17, i64 0 }, { ptr, i64, i64 } %t549) + %t551 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t550, 0 + %t552 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5339, i64 3, i64 0 }) + %t553 = insertvalue %S.gen.Val %t551, %S.ast.Type %t552, 1 + %t554 = insertvalue %S.gen.Val %t553, i1 true, 2 + ret %S.gen.Val %t554 +endif7841: + %t555 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t555, ptr %a556 + store { ptr, i64, i64 } { ptr @.str.5340, i64 5, i64 0 }, ptr %a557 + %t558 = call i32 @finch_str_eq(ptr %a556, ptr %a557) + %t559 = icmp ne i32 %t558, 0 + br i1 %t559, label %then7846, label %endif7848 +then7846: + %t560 = load ptr, ptr %a1 + %t561 = load %S.ast.Node, ptr %a2 + call void @finch.gen.need(ptr %t560, %S.ast.Node %t561, i64 0) + %t562 = load ptr, ptr %a1 + %t563 = call { ptr, i64, i64 } @finch.gen.strOut(ptr %t562) + store { ptr, i64, i64 } %t563, ptr %a564 + %t565 = load ptr, ptr %a1 + %t566 = load { ptr, i64, i64 }, ptr %a564 + store { ptr, i64, i64 } { ptr @.str.5341, i64 36, i64 0 }, ptr %a568 + store { ptr, i64, i64 } %t566, ptr %a569 + call void @finch_str_concat(ptr %a567, ptr %a568, ptr %a569) + %t570 = load { ptr, i64, i64 }, ptr %a567 + store { ptr, i64, i64 } %t570, ptr %a572 + store { ptr, i64, i64 } { ptr @.str.5342, i64 6, i64 0 }, ptr %a573 + call void @finch_str_concat(ptr %a571, ptr %a572, ptr %a573) + %t574 = load { ptr, i64, i64 }, ptr %a571 + %t575 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t574, ptr %a577 + store { ptr, i64, i64 } %t575, ptr %a578 + call void @finch_str_concat(ptr %a576, ptr %a577, ptr %a578) + %t579 = load { ptr, i64, i64 }, ptr %a576 + store { ptr, i64, i64 } %t579, ptr %a581 + store { ptr, i64, i64 } { ptr @.str.5343, i64 1, i64 0 }, ptr %a582 + call void @finch_str_concat(ptr %a580, ptr %a581, ptr %a582) + %t583 = load { ptr, i64, i64 }, ptr %a580 + call void @finch.gen.emit(ptr %t565, { ptr, i64, i64 } %t583) + %t584 = load ptr, ptr %a1 + %t585 = load { ptr, i64, i64 }, ptr %a564 + %t586 = call { ptr, i64, i64 } @finch.gen.load(ptr %t584, { ptr, i64, i64 } { ptr @.str.5344, i64 17, i64 0 }, { ptr, i64, i64 } %t585) + %t587 = insertvalue %S.gen.Val zeroinitializer, { ptr, i64, i64 } %t586, 0 + %t588 = call %S.ast.Type @finch.gen.T({ ptr, i64, i64 } { ptr @.str.5345, i64 2, i64 0 }) + %t589 = call %S.ast.Type @finch.ast.arrayOf(%S.ast.Type %t588) + %t590 = insertvalue %S.gen.Val %t587, %S.ast.Type %t589, 1 + %t591 = insertvalue %S.gen.Val %t590, i1 true, 2 + ret %S.gen.Val %t591 +endif7848: + %t592 = load ptr, ptr %a1 + %t593 = load %S.ast.Node, ptr %a2 + %t594 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.5346, i64 21, i64 0 }, ptr %a596 + store { ptr, i64, i64 } %t594, ptr %a597 + call void @finch_str_concat(ptr %a595, ptr %a596, ptr %a597) + %t598 = load { ptr, i64, i64 }, ptr %a595 + store { ptr, i64, i64 } %t598, ptr %a600 + store { ptr, i64, i64 } { ptr @.str.5347, i64 106, i64 0 }, ptr %a601 + call void @finch_str_concat(ptr %a599, ptr %a600, ptr %a601) + %t602 = load { ptr, i64, i64 }, ptr %a599 + call void @finch.gen.fail(ptr %t592, %S.ast.Node %t593, { ptr, i64, i64 } %t602) + ret %S.gen.Val zeroinitializer +} + +define internal { ptr, i64, i64 } @finch.gen.runtimeDecls() { +entry: + %a77 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %t1 = mul i64 71, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t2 = call ptr @finch_alloc(i64 %t1) + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 0 + store { ptr, i64, i64 } { ptr @.str.5348, i64 54, i64 0 }, ptr %t3 + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 1 + store { ptr, i64, i64 } { ptr @.str.5349, i64 65, i64 0 }, ptr %t4 + %t5 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 2 + store { ptr, i64, i64 } { ptr @.str.5350, i64 29, i64 0 }, ptr %t5 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 3 + store { ptr, i64, i64 } { ptr @.str.5351, i64 38, i64 0 }, ptr %t6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 4 + store { ptr, i64, i64 } { ptr @.str.5352, i64 32, i64 0 }, ptr %t7 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 5 + store { ptr, i64, i64 } { ptr @.str.5353, i64 45, i64 0 }, ptr %t8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 6 + store { ptr, i64, i64 } { ptr @.str.5354, i64 35, i64 0 }, ptr %t9 + %t10 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 7 + store { ptr, i64, i64 } { ptr @.str.5355, i64 36, i64 0 }, ptr %t10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 8 + store { ptr, i64, i64 } { ptr @.str.5356, i64 42, i64 0 }, ptr %t11 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 9 + store { ptr, i64, i64 } { ptr @.str.5357, i64 37, i64 0 }, ptr %t12 + %t13 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 10 + store { ptr, i64, i64 } { ptr @.str.5358, i64 38, i64 0 }, ptr %t13 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 11 + store { ptr, i64, i64 } { ptr @.str.5359, i64 42, i64 0 }, ptr %t14 + %t15 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 12 + store { ptr, i64, i64 } { ptr @.str.5360, i64 38, i64 0 }, ptr %t15 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 13 + store { ptr, i64, i64 } { ptr @.str.5361, i64 37, i64 0 }, ptr %t16 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 14 + store { ptr, i64, i64 } { ptr @.str.5362, i64 42, i64 0 }, ptr %t17 + %t18 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 15 + store { ptr, i64, i64 } { ptr @.str.5363, i64 42, i64 0 }, ptr %t18 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 16 + store { ptr, i64, i64 } { ptr @.str.5364, i64 34, i64 0 }, ptr %t19 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 17 + store { ptr, i64, i64 } { ptr @.str.5365, i64 42, i64 0 }, ptr %t20 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 18 + store { ptr, i64, i64 } { ptr @.str.5366, i64 43, i64 0 }, ptr %t21 + %t22 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 19 + store { ptr, i64, i64 } { ptr @.str.5367, i64 47, i64 0 }, ptr %t22 + %t23 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 20 + store { ptr, i64, i64 } { ptr @.str.5368, i64 50, i64 0 }, ptr %t23 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 21 + store { ptr, i64, i64 } { ptr @.str.5369, i64 43, i64 0 }, ptr %t24 + %t25 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 22 + store { ptr, i64, i64 } { ptr @.str.5370, i64 44, i64 0 }, ptr %t25 + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 23 + store { ptr, i64, i64 } { ptr @.str.5371, i64 49, i64 0 }, ptr %t26 + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 24 + store { ptr, i64, i64 } { ptr @.str.5372, i64 57, i64 0 }, ptr %t27 + %t28 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 25 + store { ptr, i64, i64 } { ptr @.str.5373, i64 37, i64 0 }, ptr %t28 + %t29 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 26 + store { ptr, i64, i64 } { ptr @.str.5374, i64 39, i64 0 }, ptr %t29 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 27 + store { ptr, i64, i64 } { ptr @.str.5375, i64 37, i64 0 }, ptr %t30 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 28 + store { ptr, i64, i64 } { ptr @.str.5376, i64 38, i64 0 }, ptr %t31 + %t32 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 29 + store { ptr, i64, i64 } { ptr @.str.5377, i64 39, i64 0 }, ptr %t32 + %t33 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 30 + store { ptr, i64, i64 } { ptr @.str.5378, i64 39, i64 0 }, ptr %t33 + %t34 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 31 + store { ptr, i64, i64 } { ptr @.str.5379, i64 51, i64 0 }, ptr %t34 + %t35 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 32 + store { ptr, i64, i64 } { ptr @.str.5380, i64 44, i64 0 }, ptr %t35 + %t36 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 33 + store { ptr, i64, i64 } { ptr @.str.5381, i64 43, i64 0 }, ptr %t36 + %t37 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 34 + store { ptr, i64, i64 } { ptr @.str.5382, i64 45, i64 0 }, ptr %t37 + %t38 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 35 + store { ptr, i64, i64 } { ptr @.str.5383, i64 44, i64 0 }, ptr %t38 + %t39 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 36 + store { ptr, i64, i64 } { ptr @.str.5384, i64 52, i64 0 }, ptr %t39 + %t40 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 37 + store { ptr, i64, i64 } { ptr @.str.5385, i64 57, i64 0 }, ptr %t40 + %t41 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 38 + store { ptr, i64, i64 } { ptr @.str.5386, i64 48, i64 0 }, ptr %t41 + %t42 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 39 + store { ptr, i64, i64 } { ptr @.str.5387, i64 34, i64 0 }, ptr %t42 + %t43 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 40 + store { ptr, i64, i64 } { ptr @.str.5388, i64 48, i64 0 }, ptr %t43 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 41 + store { ptr, i64, i64 } { ptr @.str.5389, i64 60, i64 0 }, ptr %t44 + %t45 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 42 + store { ptr, i64, i64 } { ptr @.str.5390, i64 55, i64 0 }, ptr %t45 + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 43 + store { ptr, i64, i64 } { ptr @.str.5391, i64 46, i64 0 }, ptr %t46 + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 44 + store { ptr, i64, i64 } { ptr @.str.5392, i64 48, i64 0 }, ptr %t47 + %t48 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 45 + store { ptr, i64, i64 } { ptr @.str.5393, i64 43, i64 0 }, ptr %t48 + %t49 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 46 + store { ptr, i64, i64 } { ptr @.str.5394, i64 45, i64 0 }, ptr %t49 + %t50 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 47 + store { ptr, i64, i64 } { ptr @.str.5395, i64 59, i64 0 }, ptr %t50 + %t51 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 48 + store { ptr, i64, i64 } { ptr @.str.5396, i64 49, i64 0 }, ptr %t51 + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 49 + store { ptr, i64, i64 } { ptr @.str.5397, i64 39, i64 0 }, ptr %t52 + %t53 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 50 + store { ptr, i64, i64 } { ptr @.str.5398, i64 39, i64 0 }, ptr %t53 + %t54 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 51 + store { ptr, i64, i64 } { ptr @.str.5399, i64 35, i64 0 }, ptr %t54 + %t55 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 52 + store { ptr, i64, i64 } { ptr @.str.5400, i64 35, i64 0 }, ptr %t55 + %t56 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 53 + store { ptr, i64, i64 } { ptr @.str.5401, i64 45, i64 0 }, ptr %t56 + %t57 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 54 + store { ptr, i64, i64 } { ptr @.str.5402, i64 47, i64 0 }, ptr %t57 + %t58 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 55 + store { ptr, i64, i64 } { ptr @.str.5403, i64 47, i64 0 }, ptr %t58 + %t59 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 56 + store { ptr, i64, i64 } { ptr @.str.5404, i64 48, i64 0 }, ptr %t59 + %t60 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 57 + store { ptr, i64, i64 } { ptr @.str.5405, i64 44, i64 0 }, ptr %t60 + %t61 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 58 + store { ptr, i64, i64 } { ptr @.str.5406, i64 37, i64 0 }, ptr %t61 + %t62 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 59 + store { ptr, i64, i64 } { ptr @.str.5407, i64 49, i64 0 }, ptr %t62 + %t63 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 60 + store { ptr, i64, i64 } { ptr @.str.5408, i64 39, i64 0 }, ptr %t63 + %t64 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 61 + store { ptr, i64, i64 } { ptr @.str.5409, i64 29, i64 0 }, ptr %t64 + %t65 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 62 + store { ptr, i64, i64 } { ptr @.str.5410, i64 35, i64 0 }, ptr %t65 + %t66 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 63 + store { ptr, i64, i64 } { ptr @.str.5411, i64 29, i64 0 }, ptr %t66 + %t67 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 64 + store { ptr, i64, i64 } { ptr @.str.5412, i64 24, i64 0 }, ptr %t67 + %t68 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 65 + store { ptr, i64, i64 } { ptr @.str.5413, i64 40, i64 0 }, ptr %t68 + %t69 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 66 + store { ptr, i64, i64 } { ptr @.str.5414, i64 33, i64 0 }, ptr %t69 + %t70 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 67 + store { ptr, i64, i64 } { ptr @.str.5415, i64 34, i64 0 }, ptr %t70 + %t71 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 68 + store { ptr, i64, i64 } { ptr @.str.5416, i64 44, i64 0 }, ptr %t71 + %t72 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 69 + store { ptr, i64, i64 } { ptr @.str.5417, i64 32, i64 0 }, ptr %t72 + %t73 = getelementptr inbounds { ptr, i64, i64 }, ptr %t2, i64 70 + store { ptr, i64, i64 } { ptr @.str.5418, i64 23, i64 0 }, ptr %t73 + %t74 = insertvalue { ptr, i64, i64 } undef, ptr %t2, 0 + %t75 = insertvalue { ptr, i64, i64 } %t74, i64 71, 1 + %t76 = insertvalue { ptr, i64, i64 } %t75, i64 71, 2 + store { ptr, i64, i64 } %t76, ptr %a77 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %a77, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.5419, i64 1, i64 0 }, ptr %a79 + call void @finch_str_join(ptr %a80, ptr %a77, ptr %a79) + %t81 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t81, ptr %a83 + store { ptr, i64, i64 } { ptr @.str.5420, i64 1, i64 0 }, ptr %a84 + call void @finch_str_concat(ptr %a82, ptr %a83, ptr %a84) + %t85 = load { ptr, i64, i64 }, ptr %a82 + ret { ptr, i64, i64 } %t85 +} + +define internal { ptr, i64, i64 } @finch.gen.assemble(ptr %p0) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store { ptr, i64, i64 } { ptr @.str.5421, i64 52, i64 0 }, ptr %a2 + %t3 = load ptr, ptr %a1 + %t4 = icmp eq ptr %t3, null + br i1 %t4, label %panic7849, label %ok7850 +panic7849: + call void @finch_panic(ptr @.str.5422, i64 4945, ptr @.str.5423) + unreachable +ok7850: + %t5 = getelementptr inbounds %S.gen.Gen, ptr %t3, i32 0, i32 27 + %t6 = getelementptr inbounds %S.platform.Target, ptr %t5, i32 0, i32 5 + %t7 = load i1, ptr %t6 + br i1 %t7, label %then7851, label %endif7853 +then7851: + %t8 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t8, ptr %a10 + store { ptr, i64, i64 } { ptr @.str.5424, i64 17, i64 0 }, ptr %a11 + call void @finch_str_concat(ptr %a9, ptr %a10, ptr %a11) + %t12 = load { ptr, i64, i64 }, ptr %a9 + %t13 = load ptr, ptr %a1 + %t14 = icmp eq ptr %t13, null + br i1 %t14, label %panic7854, label %ok7855 +panic7854: + call void @finch_panic(ptr @.str.5425, i64 4946, ptr @.str.5426) + unreachable +ok7855: + %t15 = getelementptr inbounds %S.gen.Gen, ptr %t13, i32 0, i32 27 + %t16 = getelementptr inbounds %S.platform.Target, ptr %t15, i32 0, i32 0 + %t17 = load { ptr, i64, i64 }, ptr %t16 + store { ptr, i64, i64 } %t12, ptr %a19 + store { ptr, i64, i64 } %t17, ptr %a20 + call void @finch_str_concat(ptr %a18, ptr %a19, ptr %a20) + %t21 = load { ptr, i64, i64 }, ptr %a18 + store { ptr, i64, i64 } %t21, ptr %a23 + store { ptr, i64, i64 } { ptr @.str.5427, i64 3, i64 0 }, ptr %a24 + call void @finch_str_concat(ptr %a22, ptr %a23, ptr %a24) + %t25 = load { ptr, i64, i64 }, ptr %a22 + store { ptr, i64, i64 } %t25, ptr %a2 + br label %endif7853 +endif7853: + %t26 = load { ptr, i64, i64 }, ptr %a2 + %t27 = load ptr, ptr %a1 + %t28 = icmp eq ptr %t27, null + br i1 %t28, label %panic7856, label %ok7857 +panic7856: + call void @finch_panic(ptr @.str.5428, i64 4948, ptr @.str.5429) + unreachable +ok7857: + %t29 = getelementptr inbounds %S.gen.Gen, ptr %t27, i32 0, i32 2 + %t30 = getelementptr inbounds { ptr, i64, i64 }, ptr %t29, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.5430, i64 1, i64 0 }, ptr %a31 + call void @finch_str_join(ptr %a32, ptr %t29, ptr %a31) + %t33 = load { ptr, i64, i64 }, ptr %a32 + store { ptr, i64, i64 } %t26, ptr %a35 + store { ptr, i64, i64 } %t33, ptr %a36 + call void @finch_str_concat(ptr %a34, ptr %a35, ptr %a36) + %t37 = load { ptr, i64, i64 }, ptr %a34 + store { ptr, i64, i64 } %t37, ptr %a39 + store { ptr, i64, i64 } { ptr @.str.5431, i64 2, i64 0 }, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + %t42 = call { ptr, i64, i64 } @finch.gen.runtimeDecls() + store { ptr, i64, i64 } %t41, ptr %a44 + store { ptr, i64, i64 } %t42, ptr %a45 + call void @finch_str_concat(ptr %a43, ptr %a44, ptr %a45) + %t46 = load { ptr, i64, i64 }, ptr %a43 + store { ptr, i64, i64 } %t46, ptr %a48 + store { ptr, i64, i64 } { ptr @.str.5432, i64 1, i64 0 }, ptr %a49 + call void @finch_str_concat(ptr %a47, ptr %a48, ptr %a49) + %t50 = load { ptr, i64, i64 }, ptr %a47 + store { ptr, i64, i64 } %t50, ptr %a2 + %t51 = load ptr, ptr %a1 + %t52 = icmp eq ptr %t51, null + br i1 %t52, label %panic7858, label %ok7859 +panic7858: + call void @finch_panic(ptr @.str.5433, i64 4949, ptr @.str.5434) + unreachable +ok7859: + %t53 = getelementptr inbounds %S.gen.Gen, ptr %t51, i32 0, i32 26 + %t54 = load i1, ptr %t53 + br i1 %t54, label %then7860, label %endif7862 +then7860: + %t55 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t55, ptr %a57 + store { ptr, i64, i64 } { ptr @.str.5435, i64 62, i64 0 }, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + store { ptr, i64, i64 } %t59, ptr %a2 + br label %endif7862 +endif7862: + %t60 = load { ptr, i64, i64 }, ptr %a2 + %t61 = load ptr, ptr %a1 + %t62 = icmp eq ptr %t61, null + br i1 %t62, label %panic7863, label %ok7864 +panic7863: + call void @finch_panic(ptr @.str.5436, i64 4952, ptr @.str.5437) + unreachable +ok7864: + %t63 = getelementptr inbounds %S.gen.Gen, ptr %t61, i32 0, i32 3 + %t64 = getelementptr inbounds { ptr, i64, i64 }, ptr %t63, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.5438, i64 1, i64 0 }, ptr %a65 + call void @finch_str_join(ptr %a66, ptr %t63, ptr %a65) + %t67 = load { ptr, i64, i64 }, ptr %a66 + store { ptr, i64, i64 } %t60, ptr %a69 + store { ptr, i64, i64 } %t67, ptr %a70 + call void @finch_str_concat(ptr %a68, ptr %a69, ptr %a70) + %t71 = load { ptr, i64, i64 }, ptr %a68 + store { ptr, i64, i64 } %t71, ptr %a2 + %t72 = load ptr, ptr %a1 + %t73 = icmp eq ptr %t72, null + br i1 %t73, label %panic7865, label %ok7866 +panic7865: + call void @finch_panic(ptr @.str.5439, i64 4953, ptr @.str.5440) + unreachable +ok7866: + %t74 = getelementptr inbounds %S.gen.Gen, ptr %t72, i32 0, i32 26 + %t75 = load i1, ptr %t74 + br i1 %t75, label %then7867, label %endif7869 +then7867: + %t76 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t76, ptr %a78 + store { ptr, i64, i64 } { ptr @.str.5441, i64 1, i64 0 }, ptr %a79 + call void @finch_str_concat(ptr %a77, ptr %a78, ptr %a79) + %t80 = load { ptr, i64, i64 }, ptr %a77 + %t81 = load ptr, ptr %a1 + %t82 = call { ptr, i64, i64 } @finch.gen.dbgModule(ptr %t81) + store { ptr, i64, i64 } %t80, ptr %a84 + store { ptr, i64, i64 } %t82, ptr %a85 + call void @finch_str_concat(ptr %a83, ptr %a84, ptr %a85) + %t86 = load { ptr, i64, i64 }, ptr %a83 + store { ptr, i64, i64 } %t86, ptr %a2 + br label %endif7869 +endif7869: + %t87 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t87, ptr %a88 + call void @finch_str_copy(ptr %a89, ptr %a88) + %t90 = load { ptr, i64, i64 }, ptr %a89 + ret { ptr, i64, i64 } %t90 +} + +define internal void @finch.copy.arr_S_ast_Program(ptr %dst, ptr %src) { +entry: + %a5 = alloca i64, align 16 + call void @finch_arr_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr (%S.ast.Program, ptr null, i32 1) to i64)) + %t1 = load ptr, ptr %dst + %t2 = load ptr, ptr %src + %t3 = getelementptr inbounds { ptr, i64, i64 }, ptr %src, i32 0, i32 1 + %t4 = load i64, ptr %t3 + store i64 0, ptr %a5 + br label %n.cond7870 +n.cond7870: + %t6 = load i64, ptr %a5 + %t7 = icmp slt i64 %t6, %t4 + br i1 %t7, label %n.body7871, label %n.end7872 +n.body7871: + %t8 = getelementptr inbounds %S.ast.Program, ptr %t1, i64 %t6 + %t9 = getelementptr inbounds %S.ast.Program, ptr %t2, i64 %t6 + call void @finch.copy.S_ast_Program(ptr %t8, ptr %t9) + %t10 = load i64, ptr %a5 + %t11 = add i64 %t10, 1 + store i64 %t11, ptr %a5 + br label %n.cond7870 +n.end7872: + ret void +} + +define internal void @finch.copy.S_cimport_CFunc(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.cimport.CFunc, ptr %src + store %S.cimport.CFunc %t1, ptr %dst + %t2 = getelementptr inbounds %S.cimport.CFunc, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.cimport.CFunc, ptr %src, i32 0, i32 0 + call void @finch_str_copy(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.cimport.CFunc, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.cimport.CFunc, ptr %src, i32 0, i32 1 + call void @finch_str_copy(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.cimport.CFunc, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.cimport.CFunc, ptr %src, i32 0, i32 2 + call void @finch.copy.S_ast_Type(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.cimport.CFunc, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.cimport.CFunc, ptr %src, i32 0, i32 3 + call void @finch.copy.arr_S_ast_Type(ptr %t8, ptr %t9) + %t10 = getelementptr inbounds %S.cimport.CFunc, ptr %dst, i32 0, i32 5 + %t11 = getelementptr inbounds %S.cimport.CFunc, ptr %src, i32 0, i32 5 + call void @finch_str_copy(ptr %t10, ptr %t11) + ret void +} + +define internal void @finch.copy.map_str_S_cimport_CFunc(ptr %dst, ptr %src) { +entry: + %a3 = alloca i64, align 16 + call void @finch_map_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64)) + %t1 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 2 + %t2 = load i64, ptr %t1 + store i64 0, ptr %a3 + br label %n.cond7873 +n.cond7873: + %t4 = load i64, ptr %a3 + %t5 = icmp slt i64 %t4, %t2 + br i1 %t5, label %n.body7874, label %n.end7875 +n.body7874: + %t6 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 0 + %t7 = load ptr, ptr %t6 + %t8 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t7, i64 %t4 + %t9 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %dst, i32 0, i32 0 + %t10 = load ptr, ptr %t9 + %t11 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t10, i64 %t4 + %t12 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t8, i32 0, i32 0 + %t13 = load i64, ptr %t12 + %t14 = icmp ne i64 %t13, 0 + br i1 %t14, label %entry.live7876, label %entry.next7877 +entry.live7876: + %t15 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t11, i32 0, i32 1 + %t16 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t8, i32 0, i32 1 + call void @finch_str_copy(ptr %t15, ptr %t16) + %t17 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t11, i32 0, i32 2 + %t18 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t8, i32 0, i32 2 + call void @finch.copy.S_cimport_CFunc(ptr %t17, ptr %t18) + br label %entry.next7877 +entry.next7877: + %t19 = load i64, ptr %a3 + %t20 = add i64 %t19, 1 + store i64 %t20, ptr %a3 + br label %n.cond7873 +n.end7875: + ret void +} + +define internal void @finch.copy.map_str_S_cimport_CConst(ptr %dst, ptr %src) { +entry: + %a3 = alloca i64, align 16 + call void @finch_map_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr null, i32 1) to i64)) + %t1 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 2 + %t2 = load i64, ptr %t1 + store i64 0, ptr %a3 + br label %n.cond7878 +n.cond7878: + %t4 = load i64, ptr %a3 + %t5 = icmp slt i64 %t4, %t2 + br i1 %t5, label %n.body7879, label %n.end7880 +n.body7879: + %t6 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 0 + %t7 = load ptr, ptr %t6 + %t8 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t7, i64 %t4 + %t9 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %dst, i32 0, i32 0 + %t10 = load ptr, ptr %t9 + %t11 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t10, i64 %t4 + %t12 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t8, i32 0, i32 0 + %t13 = load i64, ptr %t12 + %t14 = icmp ne i64 %t13, 0 + br i1 %t14, label %entry.live7881, label %entry.next7882 +entry.live7881: + %t15 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t11, i32 0, i32 1 + %t16 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t8, i32 0, i32 1 + call void @finch_str_copy(ptr %t15, ptr %t16) + %t17 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t11, i32 0, i32 2 + %t18 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t8, i32 0, i32 2 + call void @finch.copy.S_cimport_CConst(ptr %t17, ptr %t18) + br label %entry.next7882 +entry.next7882: + %t19 = load i64, ptr %a3 + %t20 = add i64 %t19, 1 + store i64 %t20, ptr %a3 + br label %n.cond7878 +n.end7880: + ret void +} + +define internal void @finch.copy.map_str_S_ast_Type(ptr %dst, ptr %src) { +entry: + %a3 = alloca i64, align 16 + call void @finch_map_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.ast.Type }, ptr null, i32 1) to i64)) + %t1 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 2 + %t2 = load i64, ptr %t1 + store i64 0, ptr %a3 + br label %n.cond7883 +n.cond7883: + %t4 = load i64, ptr %a3 + %t5 = icmp slt i64 %t4, %t2 + br i1 %t5, label %n.body7884, label %n.end7885 +n.body7884: + %t6 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 0 + %t7 = load ptr, ptr %t6 + %t8 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t7, i64 %t4 + %t9 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %dst, i32 0, i32 0 + %t10 = load ptr, ptr %t9 + %t11 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t10, i64 %t4 + %t12 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t8, i32 0, i32 0 + %t13 = load i64, ptr %t12 + %t14 = icmp ne i64 %t13, 0 + br i1 %t14, label %entry.live7886, label %entry.next7887 +entry.live7886: + %t15 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t11, i32 0, i32 1 + %t16 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t8, i32 0, i32 1 + call void @finch_str_copy(ptr %t15, ptr %t16) + %t17 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t11, i32 0, i32 2 + %t18 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t8, i32 0, i32 2 + call void @finch.copy.S_ast_Type(ptr %t17, ptr %t18) + br label %entry.next7887 +entry.next7887: + %t19 = load i64, ptr %a3 + %t20 = add i64 %t19, 1 + store i64 %t20, ptr %a3 + br label %n.cond7883 +n.end7885: + ret void +} + +define internal void @finch.copy.map_str_S_cimport_CStruct(ptr %dst, ptr %src) { +entry: + %a3 = alloca i64, align 16 + call void @finch_map_clone_raw(ptr %dst, ptr %src, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr null, i32 1) to i64)) + %t1 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 2 + %t2 = load i64, ptr %t1 + store i64 0, ptr %a3 + br label %n.cond7888 +n.cond7888: + %t4 = load i64, ptr %a3 + %t5 = icmp slt i64 %t4, %t2 + br i1 %t5, label %n.body7889, label %n.end7890 +n.body7889: + %t6 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %src, i32 0, i32 0 + %t7 = load ptr, ptr %t6 + %t8 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t7, i64 %t4 + %t9 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %dst, i32 0, i32 0 + %t10 = load ptr, ptr %t9 + %t11 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t10, i64 %t4 + %t12 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t8, i32 0, i32 0 + %t13 = load i64, ptr %t12 + %t14 = icmp ne i64 %t13, 0 + br i1 %t14, label %entry.live7891, label %entry.next7892 +entry.live7891: + %t15 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t11, i32 0, i32 1 + %t16 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t8, i32 0, i32 1 + call void @finch_str_copy(ptr %t15, ptr %t16) + %t17 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t11, i32 0, i32 2 + %t18 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t8, i32 0, i32 2 + call void @finch.copy.S_cimport_CStruct(ptr %t17, ptr %t18) + br label %entry.next7892 +entry.next7892: + %t19 = load i64, ptr %a3 + %t20 = add i64 %t19, 1 + store i64 %t20, ptr %a3 + br label %n.cond7888 +n.end7890: + ret void +} + +define internal void @finch.copy.S_cimport_CImports(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.cimport.CImports, ptr %src + store %S.cimport.CImports %t1, ptr %dst + %t2 = getelementptr inbounds %S.cimport.CImports, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.cimport.CImports, ptr %src, i32 0, i32 0 + call void @finch.copy.map_str_S_cimport_CFunc(ptr %t2, ptr %t3) + %t4 = getelementptr inbounds %S.cimport.CImports, ptr %dst, i32 0, i32 1 + %t5 = getelementptr inbounds %S.cimport.CImports, ptr %src, i32 0, i32 1 + call void @finch.copy.map_str_S_cimport_CConst(ptr %t4, ptr %t5) + %t6 = getelementptr inbounds %S.cimport.CImports, ptr %dst, i32 0, i32 2 + %t7 = getelementptr inbounds %S.cimport.CImports, ptr %src, i32 0, i32 2 + call void @finch.copy.map_str_S_ast_Type(ptr %t6, ptr %t7) + %t8 = getelementptr inbounds %S.cimport.CImports, ptr %dst, i32 0, i32 3 + %t9 = getelementptr inbounds %S.cimport.CImports, ptr %src, i32 0, i32 3 + call void @finch.copy.map_str_S_cimport_CStruct(ptr %t8, ptr %t9) + %t10 = getelementptr inbounds %S.cimport.CImports, ptr %dst, i32 0, i32 4 + %t11 = getelementptr inbounds %S.cimport.CImports, ptr %src, i32 0, i32 4 + call void @finch.copy.arr_str(ptr %t10, ptr %t11) + ret void +} + +define internal { ptr, i64, i64 } @finch.gen.generate({ ptr, i64, i64 } %p0, { ptr, i64, i64 } %p1, %S.cimport.CImports %p2, %S.gen.Options %p3) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca %S.cimport.CImports, align 16 + %a4 = alloca %S.gen.Options, align 16 + %a7 = alloca i1, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca %S.cimport.CImports, align 16 + %a20 = alloca %S.cimport.CImports, align 16 + %a31 = alloca %S.platform.Target, align 16 + %a32 = alloca %S.platform.Target, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca %S.gen.Gen, align 16 + %a43 = alloca ptr, align 16 + %a72 = alloca i64, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca i64, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca i64, align 16 + %a222 = alloca i64, align 16 + %a230 = alloca %S.gen.FnSig, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a252 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a274 = alloca %S.gen.FnSig, align 16 + %a275 = alloca %S.gen.FnSig, align 16 + %a277 = alloca %S.gen.FnSig, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a286 = alloca { ptr, i64, i64 }, align 16 + %a287 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a295 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a308 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a319 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a330 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a333 = alloca { ptr, i64, i64 }, align 16 + %a334 = alloca { ptr, i64, i64 }, align 16 + %a335 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a344 = alloca { ptr, i64, i64 }, align 16 + %a347 = alloca { ptr, i64, i64 }, align 16 + %a348 = alloca { ptr, i64, i64 }, align 16 + %a349 = alloca { ptr, i64, i64 }, align 16 + %a351 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca { ptr, i64, i64 }, align 16 + %a353 = alloca { ptr, i64, i64 }, align 16 + %a356 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a365 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a372 = alloca { ptr, i64, i64 }, align 16 + %a377 = alloca { ptr, i64, i64 }, align 16 + %a378 = alloca { ptr, i64, i64 }, align 16 + %a382 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca { ptr, i64, i64 }, align 16 + %a384 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a398 = alloca { ptr, i64, i64 }, align 16 + %a399 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a407 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a411 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a416 = alloca { ptr, i64, i64 }, align 16 + %a417 = alloca { ptr, i64, i64 }, align 16 + %a418 = alloca { ptr, i64, i64 }, align 16 + %a420 = alloca { ptr, i64, i64 }, align 16 + %a421 = alloca { ptr, i64, i64 }, align 16 + %a422 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store %S.cimport.CImports %p2, ptr %a3 + store %S.gen.Options %p3, ptr %a4 + %t5 = getelementptr inbounds %S.gen.Options, ptr %a4, i32 0, i32 0 + %t6 = load i1, ptr %t5 + store i1 %t6, ptr %a7 + %t8 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t8, ptr %a9 + call void @finch.copy.arr_S_ast_Program(ptr %a10, ptr %a9) + %t11 = load { ptr, i64, i64 }, ptr %a10 + %t12 = insertvalue %S.gen.Gen zeroinitializer, { ptr, i64, i64 } %t11, 0 + %t13 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t13, ptr %a14 + call void @finch.copy.arr_str(ptr %a15, ptr %a14) + %t16 = load { ptr, i64, i64 }, ptr %a15 + %t17 = insertvalue %S.gen.Gen %t12, { ptr, i64, i64 } %t16, 1 + %t18 = load %S.cimport.CImports, ptr %a3 + store %S.cimport.CImports %t18, ptr %a19 + call void @finch.copy.S_cimport_CImports(ptr %a20, ptr %a19) + %t21 = load %S.cimport.CImports, ptr %a20 + %t22 = insertvalue %S.gen.Gen %t17, %S.cimport.CImports %t21, 24 + %t23 = getelementptr inbounds %S.gen.Options, ptr %a4, i32 0, i32 0 + %t24 = load i1, ptr %t23 + %t25 = insertvalue %S.gen.Gen %t22, i1 %t24, 25 + %t26 = getelementptr inbounds %S.gen.Options, ptr %a4, i32 0, i32 1 + %t27 = load i1, ptr %t26 + %t28 = insertvalue %S.gen.Gen %t25, i1 %t27, 26 + %t29 = getelementptr inbounds %S.gen.Options, ptr %a4, i32 0, i32 3 + %t30 = load %S.platform.Target, ptr %t29 + store %S.platform.Target %t30, ptr %a31 + call void @finch.copy.S_platform_Target(ptr %a32, ptr %a31) + %t33 = load %S.platform.Target, ptr %a32 + %t34 = insertvalue %S.gen.Gen %t28, %S.platform.Target %t33, 27 + %t35 = getelementptr inbounds %S.gen.Options, ptr %a4, i32 0, i32 2 + %t36 = load { ptr, i64, i64 }, ptr %t35 + store { ptr, i64, i64 } %t36, ptr %a37 + call void @finch_str_copy(ptr %a38, ptr %a37) + %t39 = load { ptr, i64, i64 }, ptr %a38 + %t40 = insertvalue %S.gen.Gen %t34, { ptr, i64, i64 } %t39, 28 + %t41 = insertvalue %S.gen.Gen %t40, i64 -1, 32 + store %S.gen.Gen %t41, ptr %a42 + store ptr %a42, ptr %a43 + %t44 = load ptr, ptr %a43 + %t45 = icmp eq ptr %t44, null + br i1 %t45, label %panic7893, label %ok7894 +panic7893: + call void @finch_panic(ptr @.str.5442, i64 4963, ptr @.str.5443) + unreachable +ok7894: + %t46 = getelementptr inbounds %S.gen.Gen, ptr %t44, i32 0, i32 26 + %t47 = load i1, ptr %t46 + br i1 %t47, label %then7895, label %endif7897 +then7895: + %t48 = load ptr, ptr %a43 + %t49 = icmp eq ptr %t48, null + br i1 %t49, label %panic7898, label %ok7899 +panic7898: + call void @finch_panic(ptr @.str.5444, i64 4965, ptr @.str.5445) + unreachable +ok7899: + %t50 = getelementptr inbounds %S.gen.Gen, ptr %t48, i32 0, i32 29 + %t51 = getelementptr inbounds { ptr, i64, i64 }, ptr %t50, i32 0, i32 1 + %t52 = load i64, ptr %t51 + %t53 = add i64 %t52, 1 + call void @finch_arr_reserve(ptr %t50, i64 %t53, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t54 = load ptr, ptr %t50 + %t55 = getelementptr inbounds { ptr, i64, i64 }, ptr %t54, i64 %t52 + store { ptr, i64, i64 } { ptr @.str.5446, i64 0, i64 0 }, ptr %t55 + store i64 %t53, ptr %t51 + %t56 = load ptr, ptr %a43 + %t57 = icmp eq ptr %t56, null + br i1 %t57, label %panic7900, label %ok7901 +panic7900: + call void @finch_panic(ptr @.str.5447, i64 4966, ptr @.str.5448) + unreachable +ok7901: + %t58 = getelementptr inbounds %S.gen.Gen, ptr %t56, i32 0, i32 29 + %t59 = getelementptr inbounds { ptr, i64, i64 }, ptr %t58, i32 0, i32 1 + %t60 = load i64, ptr %t59 + %t61 = add i64 %t60, 1 + call void @finch_arr_reserve(ptr %t58, i64 %t61, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t62 = load ptr, ptr %t58 + %t63 = getelementptr inbounds { ptr, i64, i64 }, ptr %t62, i64 %t60 + store { ptr, i64, i64 } { ptr @.str.5449, i64 33, i64 0 }, ptr %t63 + store i64 %t61, ptr %t59 + %t64 = load ptr, ptr %a43 + %t65 = icmp eq ptr %t64, null + br i1 %t65, label %panic7902, label %ok7903 +panic7902: + call void @finch_panic(ptr @.str.5450, i64 4967, ptr @.str.5451) + unreachable +ok7903: + %t66 = getelementptr inbounds %S.gen.Gen, ptr %t64, i32 0, i32 29 + %t67 = getelementptr inbounds { ptr, i64, i64 }, ptr %t66, i32 0, i32 1 + %t68 = load i64, ptr %t67 + %t69 = add i64 %t68, 1 + call void @finch_arr_reserve(ptr %t66, i64 %t69, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t70 = load ptr, ptr %t66 + %t71 = getelementptr inbounds { ptr, i64, i64 }, ptr %t70, i64 %t68 + store { ptr, i64, i64 } { ptr @.str.5452, i64 38, i64 0 }, ptr %t71 + store i64 %t69, ptr %t67 + store i64 0, ptr %a72 + br label %each.cond7904 +each.cond7904: + %t73 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t74 = load i64, ptr %t73 + %t75 = load i64, ptr %a72 + %t76 = icmp slt i64 %t75, %t74 + br i1 %t76, label %each.body7905, label %each.end7907 +each.body7905: + %t77 = load ptr, ptr %a2 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %t77, i64 %t75 + %t79 = load { ptr, i64, i64 }, ptr %t78 + store { ptr, i64, i64 } %t79, ptr %a80 + %t81 = load ptr, ptr %a43 + %t82 = icmp eq ptr %t81, null + br i1 %t82, label %panic7908, label %ok7909 +panic7908: + call void @finch_panic(ptr @.str.5453, i64 4969, ptr @.str.5454) + unreachable +ok7909: + %t83 = getelementptr inbounds %S.gen.Gen, ptr %t81, i32 0, i32 31 + %t84 = getelementptr inbounds { ptr, i64, i64 }, ptr %t83, i32 0, i32 1 + %t85 = load ptr, ptr %a43 + %t86 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } { ptr @.str.5455, i64 19, i64 0 }, ptr %a88 + store { ptr, i64, i64 } %t86, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + store { ptr, i64, i64 } %t90, ptr %a92 + store { ptr, i64, i64 } { ptr @.str.5456, i64 15, i64 0 }, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + %t95 = load ptr, ptr %a43 + %t96 = icmp eq ptr %t95, null + br i1 %t96, label %panic7910, label %ok7911 +panic7910: + call void @finch_panic(ptr @.str.5457, i64 4969, ptr @.str.5458) + unreachable +ok7911: + %t97 = getelementptr inbounds %S.gen.Gen, ptr %t95, i32 0, i32 28 + %t98 = load { ptr, i64, i64 }, ptr %t97 + store { ptr, i64, i64 } %t94, ptr %a100 + store { ptr, i64, i64 } %t98, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + store { ptr, i64, i64 } %t102, ptr %a104 + store { ptr, i64, i64 } { ptr @.str.5459, i64 2, i64 0 }, ptr %a105 + call void @finch_str_concat(ptr %a103, ptr %a104, ptr %a105) + %t106 = load { ptr, i64, i64 }, ptr %a103 + %t107 = call i64 @finch.gen.md(ptr %t85, { ptr, i64, i64 } %t106) + %t108 = load i64, ptr %t84 + %t109 = add i64 %t108, 1 + call void @finch_arr_reserve(ptr %t83, i64 %t109, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)) + %t110 = load ptr, ptr %t83 + %t111 = getelementptr inbounds i64, ptr %t110, i64 %t108 + store i64 %t107, ptr %t111 + store i64 %t109, ptr %t84 + br label %each.step7906 +each.step7906: + %t112 = load i64, ptr %a72 + %t113 = add i64 %t112, 1 + store i64 %t113, ptr %a72 + br label %each.cond7904 +each.end7907: + %t114 = load ptr, ptr %a43 + %t115 = icmp eq ptr %t114, null + br i1 %t115, label %panic7912, label %ok7913 +panic7912: + call void @finch_panic(ptr @.str.5461, i64 4971, ptr @.str.5462) + unreachable +ok7913: + %t116 = getelementptr inbounds %S.gen.Gen, ptr %t114, i32 0, i32 31 + %t117 = load { ptr, i64, i64 }, ptr %t116 + %t118 = extractvalue { ptr, i64, i64 } %t117, 1 + %t119 = icmp uge i64 0, %t118 + br i1 %t119, label %range7914, label %inrange7915 +range7914: + call void @finch_panic_index(ptr @.str.5463, i64 4971, i64 0, i64 %t118) + unreachable +inrange7915: + %t120 = extractvalue { ptr, i64, i64 } %t117, 0 + %t121 = getelementptr inbounds i64, ptr %t120, i64 0 + %t122 = load i64, ptr %t121 + call void @finch_str_from_int(ptr %a123, i64 %t122) + %t124 = load { ptr, i64, i64 }, ptr %a123 + store { ptr, i64, i64 } { ptr @.str.5460, i64 52, i64 0 }, ptr %a126 + store { ptr, i64, i64 } %t124, ptr %a127 + call void @finch_str_concat(ptr %a125, ptr %a126, ptr %a127) + %t128 = load { ptr, i64, i64 }, ptr %a125 + store { ptr, i64, i64 } %t128, ptr %a130 + store { ptr, i64, i64 } { ptr @.str.5464, i64 84, i64 0 }, ptr %a131 + call void @finch_str_concat(ptr %a129, ptr %a130, ptr %a131) + %t132 = load { ptr, i64, i64 }, ptr %a129 + %t133 = load ptr, ptr %a43 + %t134 = icmp eq ptr %t133, null + br i1 %t134, label %panic7916, label %ok7917 +panic7916: + call void @finch_panic(ptr @.str.5465, i64 4971, ptr @.str.5466) + unreachable +ok7917: + %t135 = getelementptr inbounds %S.gen.Gen, ptr %t133, i32 0, i32 29 + %t136 = load { ptr, i64, i64 }, ptr %t135 + %t137 = extractvalue { ptr, i64, i64 } %t136, 1 + %t138 = icmp uge i64 0, %t137 + br i1 %t138, label %range7918, label %inrange7919 +range7918: + call void @finch_panic_index(ptr @.str.5467, i64 4971, i64 0, i64 %t137) + unreachable +inrange7919: + %t139 = extractvalue { ptr, i64, i64 } %t136, 0 + %t140 = getelementptr inbounds { ptr, i64, i64 }, ptr %t139, i64 0 + store { ptr, i64, i64 } %t132, ptr %t140 + br label %endif7897 +endif7897: + %t141 = load ptr, ptr %a43 + call void @finch.gen.declare(ptr %t141) + %t142 = load ptr, ptr %a43 + %t143 = call i64 @finch.gen.findFn(ptr %t142, { ptr, i64, i64 } { ptr @.str.5468, i64 0, i64 0 }, { ptr, i64, i64 } { ptr @.str.5469, i64 4, i64 0 }) + store i64 %t143, ptr %a144 + %t145 = load i1, ptr %a7 + br i1 %t145, label %then7920, label %else7921 +then7920: + %t146 = load i64, ptr %a144 + %t147 = icmp sge i64 %t146, 0 + br i1 %t147, label %then7923, label %endif7925 +then7923: + %t148 = load ptr, ptr %a43 + %t149 = load ptr, ptr %a43 + %t150 = icmp eq ptr %t149, null + br i1 %t150, label %panic7926, label %ok7927 +panic7926: + call void @finch_panic(ptr @.str.5470, i64 4977, ptr @.str.5471) + unreachable +ok7927: + %t151 = getelementptr inbounds %S.gen.Gen, ptr %t149, i32 0, i32 0 + %t152 = load ptr, ptr %a43 + %t153 = icmp eq ptr %t152, null + br i1 %t153, label %panic7928, label %ok7929 +panic7928: + call void @finch_panic(ptr @.str.5472, i64 4977, ptr @.str.5473) + unreachable +ok7929: + %t154 = getelementptr inbounds %S.gen.Gen, ptr %t152, i32 0, i32 14 + %t155 = load i64, ptr %a144 + %t156 = load { ptr, i64, i64 }, ptr %t154 + %t157 = extractvalue { ptr, i64, i64 } %t156, 1 + %t158 = icmp uge i64 %t155, %t157 + br i1 %t158, label %range7930, label %inrange7931 +range7930: + call void @finch_panic_index(ptr @.str.5474, i64 4977, i64 %t155, i64 %t157) + unreachable +inrange7931: + %t159 = extractvalue { ptr, i64, i64 } %t156, 0 + %t160 = getelementptr inbounds %S.gen.FnSig, ptr %t159, i64 %t155 + %t161 = getelementptr inbounds %S.gen.FnSig, ptr %t160, i32 0, i32 16 + %t162 = load i64, ptr %t161 + %t163 = load { ptr, i64, i64 }, ptr %t151 + %t164 = extractvalue { ptr, i64, i64 } %t163, 1 + %t165 = icmp uge i64 %t162, %t164 + br i1 %t165, label %range7932, label %inrange7933 +range7932: + call void @finch_panic_index(ptr @.str.5475, i64 4977, i64 %t162, i64 %t164) + unreachable +inrange7933: + %t166 = extractvalue { ptr, i64, i64 } %t163, 0 + %t167 = getelementptr inbounds %S.ast.Program, ptr %t166, i64 %t162 + %t168 = getelementptr inbounds %S.ast.Program, ptr %t167, i32 0, i32 8 + %t169 = load ptr, ptr %a43 + %t170 = icmp eq ptr %t169, null + br i1 %t170, label %panic7934, label %ok7935 +panic7934: + call void @finch_panic(ptr @.str.5476, i64 4977, ptr @.str.5477) + unreachable +ok7935: + %t171 = getelementptr inbounds %S.gen.Gen, ptr %t169, i32 0, i32 14 + %t172 = load i64, ptr %a144 + %t173 = load { ptr, i64, i64 }, ptr %t171 + %t174 = extractvalue { ptr, i64, i64 } %t173, 1 + %t175 = icmp uge i64 %t172, %t174 + br i1 %t175, label %range7936, label %inrange7937 +range7936: + call void @finch_panic_index(ptr @.str.5478, i64 4977, i64 %t172, i64 %t174) + unreachable +inrange7937: + %t176 = extractvalue { ptr, i64, i64 } %t173, 0 + %t177 = getelementptr inbounds %S.gen.FnSig, ptr %t176, i64 %t172 + %t178 = getelementptr inbounds %S.gen.FnSig, ptr %t177, i32 0, i32 17 + %t179 = load i64, ptr %t178 + %t180 = load { ptr, i64, i64 }, ptr %t168 + %t181 = extractvalue { ptr, i64, i64 } %t180, 1 + %t182 = icmp uge i64 %t179, %t181 + br i1 %t182, label %range7938, label %inrange7939 +range7938: + call void @finch_panic_index(ptr @.str.5479, i64 4977, i64 %t179, i64 %t181) + unreachable +inrange7939: + %t183 = extractvalue { ptr, i64, i64 } %t180, 0 + %t184 = getelementptr inbounds %S.ast.Node, ptr %t183, i64 %t179 + %t185 = load %S.ast.Node, ptr %t184 + call void @finch.gen.fail(ptr %t148, %S.ast.Node %t185, { ptr, i64, i64 } { ptr @.str.5480, i64 82, i64 0 }) + br label %endif7925 +endif7925: + br label %endif7922 +else7921: + %t186 = load i64, ptr %a144 + %t187 = icmp slt i64 %t186, 0 + br i1 %t187, label %then7940, label %endif7942 +then7940: + %t188 = load { ptr, i64, i64 }, ptr %a2 + %t189 = extractvalue { ptr, i64, i64 } %t188, 1 + %t190 = icmp uge i64 0, %t189 + br i1 %t190, label %range7943, label %inrange7944 +range7943: + call void @finch_panic_index(ptr @.str.5481, i64 4980, i64 0, i64 %t189) + unreachable +inrange7944: + %t191 = extractvalue { ptr, i64, i64 } %t188, 0 + %t192 = getelementptr inbounds { ptr, i64, i64 }, ptr %t191, i64 0 + %t193 = load { ptr, i64, i64 }, ptr %t192 + store { ptr, i64, i64 } %t193, ptr %a195 + store { ptr, i64, i64 } { ptr @.str.5482, i64 64, i64 0 }, ptr %a196 + call void @finch_str_concat(ptr %a194, ptr %a195, ptr %a196) + %t197 = load { ptr, i64, i64 }, ptr %a194 + %t198 = extractvalue { ptr, i64, i64 } %t197, 1 + %t199 = trunc i64 %t198 to i32 + %t200 = extractvalue { ptr, i64, i64 } %t197, 0 + %t201 = icmp eq ptr %t200, null + %t202 = select i1 %t201, ptr @.str.5483, ptr %t200 + %t203 = call i32 (ptr, ...) @printf(ptr @.str.5484, i32 %t199, ptr %t202) + %t204 = call i32 (ptr, ...) @printf(ptr @.str.5485) + %t205 = trunc i64 1 to i32 + %t206 = call i32 @fflush(ptr null) + call void @exit(i32 %t205) + br label %endif7942 +endif7942: + br label %endif7922 +endif7922: + store i64 0, ptr %a207 + br label %while.cond7945 +while.cond7945: + %t208 = load i64, ptr %a207 + %t209 = load ptr, ptr %a43 + %t210 = icmp eq ptr %t209, null + br i1 %t210, label %panic7948, label %ok7949 +panic7948: + call void @finch_panic(ptr @.str.5486, i64 4985, ptr @.str.5487) + unreachable +ok7949: + %t211 = getelementptr inbounds %S.gen.Gen, ptr %t209, i32 0, i32 14 + %t212 = getelementptr inbounds { ptr, i64, i64 }, ptr %t211, i32 0, i32 1 + %t213 = load i64, ptr %t212 + %t214 = icmp slt i64 %t208, %t213 + br i1 %t214, label %while.body7946, label %while.end7947 +while.body7946: + %t215 = load ptr, ptr %a43 + %t216 = load i64, ptr %a207 + call void @finch.gen.define(ptr %t215, i64 %t216) + %t217 = load i64, ptr %a207 + %t218 = add i64 %t217, 1 + store i64 %t218, ptr %a207 + br label %while.cond7945 +while.end7947: + %t219 = load ptr, ptr %a43 + %t220 = icmp eq ptr %t219, null + br i1 %t220, label %panic7950, label %ok7951 +panic7950: + call void @finch_panic(ptr @.str.5488, i64 4989, ptr @.str.5489) + unreachable +ok7951: + %t221 = getelementptr inbounds %S.gen.Gen, ptr %t219, i32 0, i32 14 + store i64 0, ptr %a222 + br label %each.cond7952 +each.cond7952: + %t223 = getelementptr inbounds { ptr, i64, i64 }, ptr %t221, i32 0, i32 1 + %t224 = load i64, ptr %t223 + %t225 = load i64, ptr %a222 + %t226 = icmp slt i64 %t225, %t224 + br i1 %t226, label %each.body7953, label %each.end7955 +each.body7953: + %t227 = load ptr, ptr %t221 + %t228 = getelementptr inbounds %S.gen.FnSig, ptr %t227, i64 %t225 + %t229 = load %S.gen.FnSig, ptr %t228 + store %S.gen.FnSig %t229, ptr %a230 + %t231 = getelementptr inbounds %S.gen.FnSig, ptr %a230, i32 0, i32 5 + %t232 = load i1, ptr %t231 + br i1 %t232, label %then7956, label %endif7958 +then7956: + %t233 = load ptr, ptr %a43 + %t234 = load %S.gen.FnSig, ptr %a230 + %t235 = call { ptr, i64, i64 } @finch.gen.exportWrapper(ptr %t233, %S.gen.FnSig %t234) + br label %endif7958 +endif7958: + br label %each.step7954 +each.step7954: + %t236 = load i64, ptr %a222 + %t237 = add i64 %t236, 1 + store i64 %t237, ptr %a222 + br label %each.cond7952 +each.end7955: + %t238 = load i1, ptr %a7 + br i1 %t238, label %then7959, label %endif7961 +then7959: + store { ptr, i64, i64 } { ptr @.str.5490, i64 0, i64 0 }, ptr %a239 + %t240 = load ptr, ptr %a43 + %t241 = icmp eq ptr %t240, null + br i1 %t241, label %panic7962, label %ok7963 +panic7962: + call void @finch_panic(ptr @.str.5491, i64 4997, ptr @.str.5492) + unreachable +ok7963: + %t242 = getelementptr inbounds %S.gen.Gen, ptr %t240, i32 0, i32 27 + %t243 = getelementptr inbounds %S.platform.Target, ptr %t242, i32 0, i32 1 + %t244 = load i1, ptr %t243 + br i1 %t244, label %then7964, label %endif7966 +then7964: + store { ptr, i64, i64 } { ptr @.str.5493, i64 10, i64 0 }, ptr %a239 + br label %endif7966 +endif7966: + %t245 = load ptr, ptr %a43 + %t246 = icmp eq ptr %t245, null + br i1 %t246, label %panic7967, label %ok7968 +panic7967: + call void @finch_panic(ptr @.str.5494, i64 5000, ptr @.str.5495) + unreachable +ok7968: + %t247 = getelementptr inbounds %S.gen.Gen, ptr %t245, i32 0, i32 3 + %t248 = getelementptr inbounds { ptr, i64, i64 }, ptr %t247, i32 0, i32 1 + %t249 = load { ptr, i64, i64 }, ptr %a239 + store { ptr, i64, i64 } { ptr @.str.5496, i64 6, i64 0 }, ptr %a251 + store { ptr, i64, i64 } %t249, ptr %a252 + call void @finch_str_concat(ptr %a250, ptr %a251, ptr %a252) + %t253 = load { ptr, i64, i64 }, ptr %a250 + store { ptr, i64, i64 } %t253, ptr %a255 + store { ptr, i64, i64 } { ptr @.str.5497, i64 107, i64 0 }, ptr %a256 + call void @finch_str_concat(ptr %a254, ptr %a255, ptr %a256) + %t257 = load { ptr, i64, i64 }, ptr %a254 + %t258 = load i64, ptr %t248 + %t259 = add i64 %t258, 1 + call void @finch_arr_reserve(ptr %t247, i64 %t259, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t260 = load ptr, ptr %t247 + %t261 = getelementptr inbounds { ptr, i64, i64 }, ptr %t260, i64 %t258 + store { ptr, i64, i64 } %t257, ptr %t261 + store i64 %t259, ptr %t248 + %t262 = load ptr, ptr %a43 + %t263 = call { ptr, i64, i64 } @finch.gen.assemble(ptr %t262) + ret { ptr, i64, i64 } %t263 +endif7961: + %t264 = load ptr, ptr %a43 + %t265 = icmp eq ptr %t264, null + br i1 %t265, label %panic7969, label %ok7970 +panic7969: + call void @finch_panic(ptr @.str.5498, i64 5004, ptr @.str.5499) + unreachable +ok7970: + %t266 = getelementptr inbounds %S.gen.Gen, ptr %t264, i32 0, i32 14 + %t267 = load i64, ptr %a144 + %t268 = load { ptr, i64, i64 }, ptr %t266 + %t269 = extractvalue { ptr, i64, i64 } %t268, 1 + %t270 = icmp uge i64 %t267, %t269 + br i1 %t270, label %range7971, label %inrange7972 +range7971: + call void @finch_panic_index(ptr @.str.5500, i64 5004, i64 %t267, i64 %t269) + unreachable +inrange7972: + %t271 = extractvalue { ptr, i64, i64 } %t268, 0 + %t272 = getelementptr inbounds %S.gen.FnSig, ptr %t271, i64 %t267 + %t273 = load %S.gen.FnSig, ptr %t272 + store %S.gen.FnSig %t273, ptr %a274 + call void @finch.copy.S_gen_FnSig(ptr %a275, ptr %a274) + %t276 = load %S.gen.FnSig, ptr %a275 + store %S.gen.FnSig %t276, ptr %a277 + %t278 = load ptr, ptr %a43 + %t279 = load %S.gen.FnSig, ptr %a277 + %t280 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t278, %S.gen.FnSig %t279) + store { ptr, i64, i64 } { ptr @.str.5501, i64 5, i64 0 }, ptr %a282 + store { ptr, i64, i64 } %t280, ptr %a283 + call void @finch_str_concat(ptr %a281, ptr %a282, ptr %a283) + %t284 = load { ptr, i64, i64 }, ptr %a281 + store { ptr, i64, i64 } %t284, ptr %a286 + store { ptr, i64, i64 } { ptr @.str.5502, i64 1, i64 0 }, ptr %a287 + call void @finch_str_concat(ptr %a285, ptr %a286, ptr %a287) + %t288 = load { ptr, i64, i64 }, ptr %a285 + %t289 = getelementptr inbounds %S.gen.FnSig, ptr %a277, i32 0, i32 11 + %t290 = load { ptr, i64, i64 }, ptr %t289 + store { ptr, i64, i64 } %t288, ptr %a292 + store { ptr, i64, i64 } %t290, ptr %a293 + call void @finch_str_concat(ptr %a291, ptr %a292, ptr %a293) + %t294 = load { ptr, i64, i64 }, ptr %a291 + store { ptr, i64, i64 } %t294, ptr %a296 + store { ptr, i64, i64 } { ptr @.str.5503, i64 1, i64 0 }, ptr %a297 + call void @finch_str_concat(ptr %a295, ptr %a296, ptr %a297) + %t298 = load { ptr, i64, i64 }, ptr %a295 + store { ptr, i64, i64 } %t298, ptr %a299 + store { ptr, i64, i64 } { ptr @.str.5504, i64 0, i64 0 }, ptr %a300 + %t301 = getelementptr inbounds %S.gen.FnSig, ptr %a277, i32 0, i32 13 + %t302 = getelementptr inbounds { ptr, i64, i64 }, ptr %t301, i32 0, i32 1 + %t303 = load i64, ptr %t302 + %t304 = icmp eq i64 %t303, 1 + br i1 %t304, label %then7973, label %endif7975 +then7973: + store { ptr, i64, i64 } { ptr @.str.5505, i64 133, i64 0 }, ptr %a300 + %t305 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } %t305, ptr %a307 + store { ptr, i64, i64 } { ptr @.str.5506, i64 20, i64 0 }, ptr %a308 + call void @finch_str_concat(ptr %a306, ptr %a307, ptr %a308) + %t309 = load { ptr, i64, i64 }, ptr %a306 + store { ptr, i64, i64 } %t309, ptr %a299 + br label %endif7975 +endif7975: + %t310 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } %t310, ptr %a312 + store { ptr, i64, i64 } { ptr @.str.5507, i64 1, i64 0 }, ptr %a313 + call void @finch_str_concat(ptr %a311, ptr %a312, ptr %a313) + %t314 = load { ptr, i64, i64 }, ptr %a311 + store { ptr, i64, i64 } %t314, ptr %a299 + store { ptr, i64, i64 } { ptr @.str.5508, i64 12, i64 0 }, ptr %a315 + %t316 = getelementptr inbounds %S.gen.FnSig, ptr %a277, i32 0, i32 9 + %t317 = load i1, ptr %t316 + br i1 %t317, label %then7976, label %else7977 +then7976: + %t318 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } { ptr @.str.5509, i64 5, i64 0 }, ptr %a320 + store { ptr, i64, i64 } %t318, ptr %a321 + call void @finch_str_concat(ptr %a319, ptr %a320, ptr %a321) + %t322 = load { ptr, i64, i64 }, ptr %a319 + store { ptr, i64, i64 } %t322, ptr %a299 + %t323 = load { ptr, i64, i64 }, ptr %a300 + store { ptr, i64, i64 } %t323, ptr %a325 + store { ptr, i64, i64 } { ptr @.str.5510, i64 2, i64 0 }, ptr %a326 + call void @finch_str_concat(ptr %a324, ptr %a325, ptr %a326) + %t327 = load { ptr, i64, i64 }, ptr %a324 + %t328 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } %t327, ptr %a330 + store { ptr, i64, i64 } %t328, ptr %a331 + call void @finch_str_concat(ptr %a329, ptr %a330, ptr %a331) + %t332 = load { ptr, i64, i64 }, ptr %a329 + store { ptr, i64, i64 } %t332, ptr %a334 + store { ptr, i64, i64 } { ptr @.str.5511, i64 1, i64 0 }, ptr %a335 + call void @finch_str_concat(ptr %a333, ptr %a334, ptr %a335) + %t336 = load { ptr, i64, i64 }, ptr %a333 + store { ptr, i64, i64 } %t336, ptr %a300 + store { ptr, i64, i64 } { ptr @.str.5512, i64 0, i64 0 }, ptr %a299 + %t337 = load ptr, ptr %a43 + %t338 = load %S.gen.FnSig, ptr %a277 + %t339 = call { ptr, i64, i64 } @finch.gen.retTy(ptr %t337, %S.gen.FnSig %t338) + store { ptr, i64, i64 } %t339, ptr %a340 + %t341 = load { ptr, i64, i64 }, ptr %a300 + store { ptr, i64, i64 } %t341, ptr %a343 + store { ptr, i64, i64 } { ptr @.str.5513, i64 21, i64 0 }, ptr %a344 + call void @finch_str_concat(ptr %a342, ptr %a343, ptr %a344) + %t345 = load { ptr, i64, i64 }, ptr %a342 + %t346 = load { ptr, i64, i64 }, ptr %a340 + store { ptr, i64, i64 } %t345, ptr %a348 + store { ptr, i64, i64 } %t346, ptr %a349 + call void @finch_str_concat(ptr %a347, ptr %a348, ptr %a349) + %t350 = load { ptr, i64, i64 }, ptr %a347 + store { ptr, i64, i64 } %t350, ptr %a352 + store { ptr, i64, i64 } { ptr @.str.5514, i64 62, i64 0 }, ptr %a353 + call void @finch_str_concat(ptr %a351, ptr %a352, ptr %a353) + %t354 = load { ptr, i64, i64 }, ptr %a351 + store { ptr, i64, i64 } %t354, ptr %a300 + %t355 = load { ptr, i64, i64 }, ptr %a300 + store { ptr, i64, i64 } %t355, ptr %a357 + store { ptr, i64, i64 } { ptr @.str.5515, i64 20, i64 0 }, ptr %a358 + call void @finch_str_concat(ptr %a356, ptr %a357, ptr %a358) + %t359 = load { ptr, i64, i64 }, ptr %a356 + %t360 = load { ptr, i64, i64 }, ptr %a340 + store { ptr, i64, i64 } %t359, ptr %a362 + store { ptr, i64, i64 } %t360, ptr %a363 + call void @finch_str_concat(ptr %a361, ptr %a362, ptr %a363) + %t364 = load { ptr, i64, i64 }, ptr %a361 + store { ptr, i64, i64 } %t364, ptr %a366 + store { ptr, i64, i64 } { ptr @.str.5516, i64 78, i64 0 }, ptr %a367 + call void @finch_str_concat(ptr %a365, ptr %a366, ptr %a367) + %t368 = load { ptr, i64, i64 }, ptr %a365 + store { ptr, i64, i64 } %t368, ptr %a300 + %t369 = load { ptr, i64, i64 }, ptr %a300 + store { ptr, i64, i64 } %t369, ptr %a371 + store { ptr, i64, i64 } { ptr @.str.5517, i64 62, i64 0 }, ptr %a372 + call void @finch_str_concat(ptr %a370, ptr %a371, ptr %a372) + %t373 = load { ptr, i64, i64 }, ptr %a370 + store { ptr, i64, i64 } %t373, ptr %a300 + %t374 = getelementptr inbounds %S.gen.FnSig, ptr %a277, i32 0, i32 12 + %t375 = getelementptr inbounds %S.ast.Type, ptr %t374, i32 0, i32 0 + %t376 = load { ptr, i64, i64 }, ptr %t375 + store { ptr, i64, i64 } %t376, ptr %a377 + store { ptr, i64, i64 } { ptr @.str.5518, i64 3, i64 0 }, ptr %a378 + %t379 = call i32 @finch_str_eq(ptr %a377, ptr %a378) + %t380 = icmp ne i32 %t379, 0 + br i1 %t380, label %then7979, label %endif7981 +then7979: + %t381 = load { ptr, i64, i64 }, ptr %a340 + store { ptr, i64, i64 } { ptr @.str.5519, i64 20, i64 0 }, ptr %a383 + store { ptr, i64, i64 } %t381, ptr %a384 + call void @finch_str_concat(ptr %a382, ptr %a383, ptr %a384) + %t385 = load { ptr, i64, i64 }, ptr %a382 + store { ptr, i64, i64 } %t385, ptr %a387 + store { ptr, i64, i64 } { ptr @.str.5520, i64 53, i64 0 }, ptr %a388 + call void @finch_str_concat(ptr %a386, ptr %a387, ptr %a388) + %t389 = load { ptr, i64, i64 }, ptr %a386 + store { ptr, i64, i64 } %t389, ptr %a315 + br label %endif7981 +endif7981: + br label %endif7978 +else7977: + %t390 = getelementptr inbounds %S.gen.FnSig, ptr %a277, i32 0, i32 12 + %t391 = getelementptr inbounds %S.ast.Type, ptr %t390, i32 0, i32 0 + %t392 = load { ptr, i64, i64 }, ptr %t391 + store { ptr, i64, i64 } %t392, ptr %a393 + store { ptr, i64, i64 } { ptr @.str.5521, i64 3, i64 0 }, ptr %a394 + %t395 = call i32 @finch_str_eq(ptr %a393, ptr %a394) + %t396 = icmp ne i32 %t395, 0 + br i1 %t396, label %then7982, label %endif7984 +then7982: + %t397 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } { ptr @.str.5522, i64 5, i64 0 }, ptr %a399 + store { ptr, i64, i64 } %t397, ptr %a400 + call void @finch_str_concat(ptr %a398, ptr %a399, ptr %a400) + %t401 = load { ptr, i64, i64 }, ptr %a398 + store { ptr, i64, i64 } %t401, ptr %a299 + store { ptr, i64, i64 } { ptr @.str.5523, i64 46, i64 0 }, ptr %a315 + br label %endif7984 +endif7984: + br label %endif7978 +endif7978: + %t402 = load ptr, ptr %a43 + %t403 = icmp eq ptr %t402, null + br i1 %t403, label %panic7985, label %ok7986 +panic7985: + call void @finch_panic(ptr @.str.5524, i64 5029, ptr @.str.5525) + unreachable +ok7986: + %t404 = getelementptr inbounds %S.gen.Gen, ptr %t402, i32 0, i32 3 + %t405 = getelementptr inbounds { ptr, i64, i64 }, ptr %t404, i32 0, i32 1 + %t406 = load { ptr, i64, i64 }, ptr %a300 + store { ptr, i64, i64 } { ptr @.str.5526, i64 48, i64 0 }, ptr %a408 + store { ptr, i64, i64 } %t406, ptr %a409 + call void @finch_str_concat(ptr %a407, ptr %a408, ptr %a409) + %t410 = load { ptr, i64, i64 }, ptr %a407 + store { ptr, i64, i64 } %t410, ptr %a412 + store { ptr, i64, i64 } { ptr @.str.5527, i64 2, i64 0 }, ptr %a413 + call void @finch_str_concat(ptr %a411, ptr %a412, ptr %a413) + %t414 = load { ptr, i64, i64 }, ptr %a411 + %t415 = load { ptr, i64, i64 }, ptr %a299 + store { ptr, i64, i64 } %t414, ptr %a417 + store { ptr, i64, i64 } %t415, ptr %a418 + call void @finch_str_concat(ptr %a416, ptr %a417, ptr %a418) + %t419 = load { ptr, i64, i64 }, ptr %a416 + store { ptr, i64, i64 } %t419, ptr %a421 + store { ptr, i64, i64 } { ptr @.str.5528, i64 1, i64 0 }, ptr %a422 + call void @finch_str_concat(ptr %a420, ptr %a421, ptr %a422) + %t423 = load { ptr, i64, i64 }, ptr %a420 + %t424 = load { ptr, i64, i64 }, ptr %a315 + store { ptr, i64, i64 } %t423, ptr %a426 + store { ptr, i64, i64 } %t424, ptr %a427 + call void @finch_str_concat(ptr %a425, ptr %a426, ptr %a427) + %t428 = load { ptr, i64, i64 }, ptr %a425 + store { ptr, i64, i64 } %t428, ptr %a430 + store { ptr, i64, i64 } { ptr @.str.5529, i64 2, i64 0 }, ptr %a431 + call void @finch_str_concat(ptr %a429, ptr %a430, ptr %a431) + %t432 = load { ptr, i64, i64 }, ptr %a429 + %t433 = load i64, ptr %t405 + %t434 = add i64 %t433, 1 + call void @finch_arr_reserve(ptr %t404, i64 %t434, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t435 = load ptr, ptr %t404 + %t436 = getelementptr inbounds { ptr, i64, i64 }, ptr %t435, i64 %t433 + store { ptr, i64, i64 } %t432, ptr %t436 + store i64 %t434, ptr %t405 + %t437 = load ptr, ptr %a43 + %t438 = call { ptr, i64, i64 } @finch.gen.assemble(ptr %t437) + ret { ptr, i64, i64 } %t438 +} + +define internal { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %p0) { +entry: + %a1 = alloca %S.C.CXString, align 16 + %a3 = alloca [32 x i8], align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca [32 x i8], align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + store %S.C.CXString %p0, ptr %a1 + %t2 = load %S.C.CXString, ptr %a1 + store %S.C.CXString %t2, ptr %a3 + %t4 = getelementptr inbounds i8, ptr %a3, i64 0 + %t5 = load i64, ptr %t4 + %t6 = getelementptr inbounds i8, ptr %a3, i64 8 + %t7 = load i64, ptr %t6 + %t8 = call ptr @clang_getCString(i64 %t5, i64 %t7) + store { ptr, i64, i64 } zeroinitializer, ptr %a9 + call void @finch_str_from_c(ptr %a9, ptr %t8) + %t10 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t10, ptr %a11 + call void @finch_str_copy(ptr %a12, ptr %a11) + %t13 = load { ptr, i64, i64 }, ptr %a12 + store { ptr, i64, i64 } %t13, ptr %a14 + %t15 = load %S.C.CXString, ptr %a1 + store %S.C.CXString %t15, ptr %a16 + %t17 = getelementptr inbounds i8, ptr %a16, i64 0 + %t18 = load i64, ptr %t17 + %t19 = getelementptr inbounds i8, ptr %a16, i64 8 + %t20 = load i64, ptr %t19 + call void @clang_disposeString(i64 %t18, i64 %t20) + %t21 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t21, ptr %a22 + call void @finch_str_copy(ptr %a23, ptr %a22) + %t24 = load { ptr, i64, i64 }, ptr %a23 + ret { ptr, i64, i64 } %t24 +} + +define internal %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %p0) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a3 = alloca %S.ast.Type, align 16 + %a4 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + %t2 = load %S.ast.Type, ptr %a1 + store %S.ast.Type %t2, ptr %a3 + call void @finch.copy.S_ast_Type(ptr %a4, ptr %a3) + %t5 = load %S.ast.Type, ptr %a4 + %t6 = insertvalue %S.cimport.Mapped zeroinitializer, %S.ast.Type %t5, 0 + %t7 = insertvalue %S.cimport.Mapped %t6, i1 true, 2 + ret %S.cimport.Mapped %t7 +} + +define internal %S.cimport.Mapped @finch.cimport.no({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + call void @finch_str_copy(ptr %a4, ptr %a3) + %t5 = load { ptr, i64, i64 }, ptr %a4 + %t6 = insertvalue %S.cimport.Mapped zeroinitializer, { ptr, i64, i64 } %t5, 1 + %t7 = insertvalue %S.cimport.Mapped %t6, i1 false, 2 + ret %S.cimport.Mapped %t7 +} + +define internal %S.ast.Type @finch.cimport.fixed(%S.ast.Type %p0, i64 %p1) { +entry: + %a1 = alloca %S.ast.Type, align 16 + %a2 = alloca i64, align 16 + %a6 = alloca %S.ast.Type, align 16 + %a10 = alloca %S.ast.Type, align 16 + %a11 = alloca %S.ast.Type, align 16 + %a18 = alloca %S.ast.Type, align 16 + %a19 = alloca %S.ast.Type, align 16 + store %S.ast.Type %p0, ptr %a1 + store i64 %p1, ptr %a2 + %t3 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.5530, i64 5, i64 0 }, 0 + %t4 = load i64, ptr %a2 + %t5 = insertvalue %S.ast.Type %t3, i64 %t4, 4 + store %S.ast.Type %t5, ptr %a6 + %t7 = getelementptr inbounds %S.ast.Type, ptr %a6, i32 0, i32 1 + %t8 = getelementptr inbounds { ptr, i64, i64 }, ptr %t7, i32 0, i32 1 + %t9 = load %S.ast.Type, ptr %a1 + store %S.ast.Type %t9, ptr %a10 + call void @finch.copy.S_ast_Type(ptr %a11, ptr %a10) + %t12 = load %S.ast.Type, ptr %a11 + %t13 = load i64, ptr %t8 + %t14 = add i64 %t13, 1 + call void @finch_arr_reserve(ptr %t7, i64 %t14, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t15 = load ptr, ptr %t7 + %t16 = getelementptr inbounds %S.ast.Type, ptr %t15, i64 %t13 + store %S.ast.Type %t12, ptr %t16 + store i64 %t14, ptr %t8 + %t17 = load %S.ast.Type, ptr %a6 + store %S.ast.Type %t17, ptr %a18 + call void @finch.copy.S_ast_Type(ptr %a19, ptr %a18) + %t20 = load %S.ast.Type, ptr %a19 + ret %S.ast.Type %t20 +} + +define internal { ptr, i64, i64 } @finch.cimport.systemIncludeArgs({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca i1, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca i64, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } zeroinitializer, ptr %a2 + store { ptr, i64, i64 } { ptr @.str.5531, i64 22, i64 0 }, ptr %a3 + %t4 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t4, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.5532, i64 26, i64 0 }, ptr %a7 + call void @finch_str_concat(ptr %a5, ptr %a6, ptr %a7) + %t8 = load { ptr, i64, i64 }, ptr %a5 + %t9 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t8, ptr %a11 + store { ptr, i64, i64 } %t9, ptr %a12 + call void @finch_str_concat(ptr %a10, ptr %a11, ptr %a12) + %t13 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t13, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.5533, i64 13, i64 0 }, ptr %a16 + call void @finch_str_concat(ptr %a14, ptr %a15, ptr %a16) + %t17 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t17, ptr %a19 + call void @finch_str_copy(ptr %a18, ptr %a19) + %t20 = call i64 @finch_shell(ptr %a18) + %t21 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t21, ptr %a22 + %t23 = call i32 @finch_file_exists(ptr %a22) + %t24 = icmp ne i32 %t23, 0 + %t25 = xor i1 %t24, true + br i1 %t25, label %then7987, label %endif7989 +then7987: + %t26 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t26, ptr %a27 + call void @finch.copy.arr_str(ptr %a28, ptr %a27) + %t29 = load { ptr, i64, i64 }, ptr %a28 + ret { ptr, i64, i64 } %t29 +endif7989: + store i1 false, ptr %a30 + %t31 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t31, ptr %a32 + call void @finch_read_file(ptr %a33, ptr %a32, ptr @.str.5534, i64 110) + %t34 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } %t34, ptr %a35 + store { ptr, i64, i64 } { ptr @.str.5536, i64 1, i64 0 }, ptr %a37 + call void @finch_str_split(ptr %a38, ptr %a35, ptr %a37) + %t39 = load { ptr, i64, i64 }, ptr %a38 + store { ptr, i64, i64 } %t39, ptr %a40 + store i64 0, ptr %a41 + br label %each.cond7990 +each.cond7990: + %t42 = getelementptr inbounds { ptr, i64, i64 }, ptr %a40, i32 0, i32 1 + %t43 = load i64, ptr %t42 + %t44 = load i64, ptr %a41 + %t45 = icmp slt i64 %t44, %t43 + br i1 %t45, label %each.body7991, label %each.end7993 +each.body7991: + %t46 = load ptr, ptr %a40 + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %t46, i64 %t44 + %t48 = load { ptr, i64, i64 }, ptr %t47 + store { ptr, i64, i64 } %t48, ptr %a49 + %t50 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t50, ptr %a51 + call void @finch_str_trim(ptr %a52, ptr %a51) + %t53 = load { ptr, i64, i64 }, ptr %a52 + store { ptr, i64, i64 } %t53, ptr %a54 + %t55 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t55, ptr %a56 + store { ptr, i64, i64 } { ptr @.str.5539, i64 34, i64 0 }, ptr %a58 + %t59 = call i32 @finch_str_starts(ptr %a56, ptr %a58) + %t60 = icmp ne i32 %t59, 0 + br i1 %t60, label %then7994, label %endif7996 +then7994: + store i1 true, ptr %a30 + br label %each.step7992 +endif7996: + %t61 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t61, ptr %a62 + store { ptr, i64, i64 } { ptr @.str.5541, i64 19, i64 0 }, ptr %a64 + %t65 = call i32 @finch_str_starts(ptr %a62, ptr %a64) + %t66 = icmp ne i32 %t65, 0 + br i1 %t66, label %then7997, label %endif7999 +then7997: + br label %each.end7993 +endif7999: + %t67 = load i1, ptr %a30 + %t68 = xor i1 %t67, true + br label %logic.from8000 +logic.from8000: + br i1 %t68, label %logic.end8002, label %logic.rhs8001 +logic.rhs8001: + %t69 = getelementptr inbounds { ptr, i64, i64 }, ptr %a54, i32 0, i32 1 + %t70 = load i64, ptr %t69 + %t71 = icmp eq i64 %t70, 0 + br label %logic.rend8003 +logic.rend8003: + br label %logic.end8002 +logic.end8002: + %t72 = phi i1 [ true, %logic.from8000 ], [ %t71, %logic.rend8003 ] + br i1 %t72, label %then8004, label %endif8006 +then8004: + br label %each.step7992 +endif8006: + %t73 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t73, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.5543, i64 22, i64 0 }, ptr %a76 + %t77 = call i32 @finch_str_ends(ptr %a74, ptr %a76) + %t78 = icmp ne i32 %t77, 0 + br i1 %t78, label %then8007, label %else8008 +then8007: + %t79 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t80 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } %t80, ptr %a81 + %t83 = getelementptr inbounds { ptr, i64, i64 }, ptr %a54, i32 0, i32 1 + %t84 = load i64, ptr %t83 + %t85 = sub i64 %t84, 22 + call void @finch_str_sub(ptr %a82, ptr %a81, i64 0, i64 %t85, ptr @.str.5545, i64 124) + %t86 = load { ptr, i64, i64 }, ptr %a82 + store { ptr, i64, i64 } { ptr @.str.5544, i64 11, i64 0 }, ptr %a88 + store { ptr, i64, i64 } %t86, ptr %a89 + call void @finch_str_concat(ptr %a87, ptr %a88, ptr %a89) + %t90 = load { ptr, i64, i64 }, ptr %a87 + %t91 = load i64, ptr %t79 + %t92 = add i64 %t91, 1 + call void @finch_arr_reserve(ptr %a2, i64 %t92, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t93 = load ptr, ptr %a2 + %t94 = getelementptr inbounds { ptr, i64, i64 }, ptr %t93, i64 %t91 + store { ptr, i64, i64 } %t90, ptr %t94 + store i64 %t92, ptr %t79 + br label %endif8009 +else8008: + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t96 = load { ptr, i64, i64 }, ptr %a54 + store { ptr, i64, i64 } { ptr @.str.5546, i64 8, i64 0 }, ptr %a98 + store { ptr, i64, i64 } %t96, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + %t101 = load i64, ptr %t95 + %t102 = add i64 %t101, 1 + call void @finch_arr_reserve(ptr %a2, i64 %t102, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t103 = load ptr, ptr %a2 + %t104 = getelementptr inbounds { ptr, i64, i64 }, ptr %t103, i64 %t101 + store { ptr, i64, i64 } %t100, ptr %t104 + store i64 %t102, ptr %t95 + br label %endif8009 +endif8009: + br label %each.step7992 +each.step7992: + %t105 = load i64, ptr %a41 + %t106 = add i64 %t105, 1 + store i64 %t106, ptr %a41 + br label %each.cond7990 +each.end7993: + %t107 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5547, i64 7, i64 0 }, ptr %a109 + store { ptr, i64, i64 } %t107, ptr %a110 + call void @finch_str_concat(ptr %a108, ptr %a109, ptr %a110) + %t111 = load { ptr, i64, i64 }, ptr %a108 + store { ptr, i64, i64 } %t111, ptr %a113 + store { ptr, i64, i64 } { ptr @.str.5548, i64 1, i64 0 }, ptr %a114 + call void @finch_str_concat(ptr %a112, ptr %a113, ptr %a114) + %t115 = load { ptr, i64, i64 }, ptr %a112 + store { ptr, i64, i64 } %t115, ptr %a117 + call void @finch_str_copy(ptr %a116, ptr %a117) + %t118 = call i64 @finch_shell(ptr %a116) + %t119 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t119, ptr %a120 + call void @finch.copy.arr_str(ptr %a121, ptr %a120) + %t122 = load { ptr, i64, i64 }, ptr %a121 + ret { ptr, i64, i64 } %t122 +} + +define internal { ptr, i64, i64 } @finch.cimport.recordName(ptr %p0, %S.C.CXType %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.C.CXType, align 16 + %a3 = alloca %S.C.CXCursor, align 16 + %a5 = alloca %S.C.CXType, align 16 + %a7 = alloca %S.C.CXCursor, align 16 + %a9 = alloca %S.C.CXCursor, align 16 + %a11 = alloca [32 x i8], align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca %S.C.CXCursor, align 16 + %a42 = alloca [32 x i8], align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca i32, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.C.CXType %p1, ptr %a2 + %t4 = load %S.C.CXType, ptr %a2 + store %S.C.CXType %t4, ptr %a5 + call void @clang_getTypeDeclaration(ptr sret(%S.C.CXCursor) align 16 %a3, ptr byval(%S.C.CXType) align 8 %a5) + %t6 = load %S.C.CXCursor, ptr %a3 + store %S.C.CXCursor %t6, ptr %a7 + %t8 = load %S.C.CXCursor, ptr %a7 + store %S.C.CXCursor %t8, ptr %a9 + %t10 = call { i64, i64 } @clang_getCursorUSR(ptr byval(%S.C.CXCursor) align 8 %a9) + store { i64, i64 } %t10, ptr %a11 + %t12 = load %S.C.CXString, ptr %a11 + %t13 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t12) + store { ptr, i64, i64 } %t13, ptr %a14 + %t15 = load ptr, ptr %a1 + %t16 = icmp eq ptr %t15, null + br i1 %t16, label %panic8010, label %ok8011 +panic8010: + call void @finch_panic(ptr @.str.5549, i64 139, ptr @.str.5550) + unreachable +ok8011: + %t17 = getelementptr inbounds %S.cimport.Importer, ptr %t15, i32 0, i32 3 + %t18 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t18, ptr %a19 + %t20 = call i64 @finch_map_find(ptr %t17, ptr %a19, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t21 = icmp sge i64 %t20, 0 + br i1 %t21, label %then8012, label %endif8014 +then8012: + %t22 = load ptr, ptr %a1 + %t23 = icmp eq ptr %t22, null + br i1 %t23, label %panic8015, label %ok8016 +panic8015: + call void @finch_panic(ptr @.str.5551, i64 140, ptr @.str.5552) + unreachable +ok8016: + %t24 = getelementptr inbounds %S.cimport.Importer, ptr %t22, i32 0, i32 3 + %t25 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t25, ptr %a26 + %t27 = call i64 @finch_map_find(ptr %t24, ptr %a26, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t28 = icmp slt i64 %t27, 0 + br i1 %t28, label %map.missing8017, label %map.found8018 +map.missing8017: + store { ptr, i64, i64 } zeroinitializer, ptr %a29 + store { ptr, i64, i64 } %t25, ptr %a30 + call void @finch_buf_str(ptr %a29, ptr %a30, i32 1) + call void @finch_map_missing(ptr @.str.5553, i64 140, ptr %a29) + unreachable +map.found8018: + %t31 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t24, i32 0, i32 0 + %t32 = load ptr, ptr %t31 + %t33 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t32, i64 %t27 + %t34 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t33, i32 0, i32 2 + %t35 = load { ptr, i64, i64 }, ptr %t34 + store { ptr, i64, i64 } %t35, ptr %a36 + call void @finch_str_copy(ptr %a37, ptr %a36) + %t38 = load { ptr, i64, i64 }, ptr %a37 + ret { ptr, i64, i64 } %t38 +endif8014: + %t39 = load %S.C.CXCursor, ptr %a7 + store %S.C.CXCursor %t39, ptr %a40 + %t41 = call { i64, i64 } @clang_getCursorSpelling(ptr byval(%S.C.CXCursor) align 8 %a40) + store { i64, i64 } %t41, ptr %a42 + %t43 = load %S.C.CXString, ptr %a42 + %t44 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t43) + store { ptr, i64, i64 } %t44, ptr %a45 + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %a45, i32 0, i32 1 + %t47 = load i64, ptr %t46 + %t48 = icmp eq i64 %t47, 0 + br label %logic.from8019 +logic.from8019: + br i1 %t48, label %logic.end8021, label %logic.rhs8020 +logic.rhs8020: + %t49 = load { ptr, i64, i64 }, ptr %a45 + store { ptr, i64, i64 } %t49, ptr %a50 + store { ptr, i64, i64 } { ptr @.str.5555, i64 1, i64 0 }, ptr %a52 + %t53 = call i64 @finch_str_find(ptr %a50, ptr %a52) + %t54 = icmp sge i64 %t53, 0 + br label %logic.rend8022 +logic.rend8022: + br label %logic.end8021 +logic.end8021: + %t55 = phi i1 [ true, %logic.from8019 ], [ %t54, %logic.rend8022 ] + br i1 %t55, label %then8023, label %endif8025 +then8023: + %t56 = load ptr, ptr %a1 + %t57 = icmp eq ptr %t56, null + br i1 %t57, label %panic8026, label %ok8027 +panic8026: + call void @finch_panic(ptr @.str.5556, i64 144, ptr @.str.5557) + unreachable +ok8027: + %t58 = getelementptr inbounds %S.cimport.Importer, ptr %t56, i32 0, i32 5 + %t59 = load i64, ptr %t58 + %t60 = add i64 %t59, 1 + store i64 %t60, ptr %t58 + %t61 = load ptr, ptr %a1 + %t62 = icmp eq ptr %t61, null + br i1 %t62, label %panic8028, label %ok8029 +panic8028: + call void @finch_panic(ptr @.str.5559, i64 145, ptr @.str.5560) + unreachable +ok8029: + %t63 = getelementptr inbounds %S.cimport.Importer, ptr %t61, i32 0, i32 5 + %t64 = load i64, ptr %t63 + call void @finch_str_from_int(ptr %a65, i64 %t64) + %t66 = load { ptr, i64, i64 }, ptr %a65 + store { ptr, i64, i64 } { ptr @.str.5558, i64 12, i64 0 }, ptr %a68 + store { ptr, i64, i64 } %t66, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t70, ptr %a45 + br label %endif8025 +endif8025: + %t71 = load { ptr, i64, i64 }, ptr %a45 + %t72 = load ptr, ptr %a1 + %t73 = icmp eq ptr %t72, null + br i1 %t73, label %panic8030, label %ok8031 +panic8030: + call void @finch_panic(ptr @.str.5561, i64 147, ptr @.str.5562) + unreachable +ok8031: + %t74 = getelementptr inbounds %S.cimport.Importer, ptr %t72, i32 0, i32 3 + %t75 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t75, ptr %a76 + store i32 0, ptr %a77 + %t78 = call i64 @finch_map_slot(ptr %t74, ptr %a76, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a77) + %t79 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t74, i32 0, i32 0 + %t80 = load ptr, ptr %t79 + %t81 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t80, i64 %t78 + %t82 = load i32, ptr %a77 + %t83 = icmp ne i32 %t82, 0 + br i1 %t83, label %map.new8032, label %map.have8033 +map.new8032: + %t84 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t81, i32 0, i32 1 + call void @finch_str_copy(ptr %t84, ptr %a76) + %t85 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t81, i32 0, i32 2 + store { ptr, i64, i64 } zeroinitializer, ptr %t85 + br label %map.have8033 +map.have8033: + %t86 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t81, i32 0, i32 2 + store { ptr, i64, i64 } %t71, ptr %a87 + call void @finch_str_copy(ptr %a88, ptr %a87) + %t89 = load { ptr, i64, i64 }, ptr %a88 + store { ptr, i64, i64 } %t89, ptr %t86 + %t90 = load { ptr, i64, i64 }, ptr %a45 + store { ptr, i64, i64 } %t90, ptr %a91 + call void @finch_str_copy(ptr %a92, ptr %a91) + %t93 = load { ptr, i64, i64 }, ptr %a92 + ret { ptr, i64, i64 } %t93 +} + +define internal i32 @finch.c.cimport.visitField(ptr byval(%S.C.CXCursor) align 8 %c0, ptr %c1) { +entry: + + %t1 = load %S.C.CXCursor, ptr %c0 + %t2 = call i32 @finch.cimport.visitField(%S.C.CXCursor %t1, ptr %c1) + ret i32 %t2 +} + +define internal { ptr, i64, i64 } @finch.cimport.defineRecord(ptr %p0, %S.C.CXType %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.C.CXType, align 16 + %a3 = alloca %S.C.CXType, align 16 + %a5 = alloca %S.C.CXType, align 16 + %a7 = alloca %S.C.CXType, align 16 + %a8 = alloca %S.C.CXCursor, align 16 + %a10 = alloca %S.C.CXType, align 16 + %a12 = alloca %S.C.CXCursor, align 16 + %a14 = alloca %S.C.CXCursor, align 16 + %a16 = alloca [32 x i8], align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca %S.C.CXType, align 16 + %a47 = alloca i64, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca i32, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca %S.C.CXType, align 16 + %a76 = alloca %S.cimport.CStruct, align 16 + %a78 = alloca %S.C.CXCursor, align 16 + %a85 = alloca %S.cimport.FieldCtx, align 16 + %a87 = alloca %S.C.CXType, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca i32, align 16 + %a113 = alloca %S.cimport.CStruct, align 16 + %a114 = alloca %S.cimport.CStruct, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a123 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.C.CXType %p1, ptr %a2 + %t4 = load %S.C.CXType, ptr %a2 + store %S.C.CXType %t4, ptr %a5 + call void @clang_getCanonicalType(ptr sret(%S.C.CXType) align 16 %a3, ptr byval(%S.C.CXType) align 8 %a5) + %t6 = load %S.C.CXType, ptr %a3 + store %S.C.CXType %t6, ptr %a7 + %t9 = load %S.C.CXType, ptr %a7 + store %S.C.CXType %t9, ptr %a10 + call void @clang_getTypeDeclaration(ptr sret(%S.C.CXCursor) align 16 %a8, ptr byval(%S.C.CXType) align 8 %a10) + %t11 = load %S.C.CXCursor, ptr %a8 + store %S.C.CXCursor %t11, ptr %a12 + %t13 = load %S.C.CXCursor, ptr %a12 + store %S.C.CXCursor %t13, ptr %a14 + %t15 = call { i64, i64 } @clang_getCursorUSR(ptr byval(%S.C.CXCursor) align 8 %a14) + store { i64, i64 } %t15, ptr %a16 + %t17 = load %S.C.CXString, ptr %a16 + %t18 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t17) + store { ptr, i64, i64 } %t18, ptr %a19 + %t20 = load ptr, ptr %a1 + %t21 = load %S.C.CXType, ptr %a7 + %t22 = call { ptr, i64, i64 } @finch.cimport.recordName(ptr %t20, %S.C.CXType %t21) + store { ptr, i64, i64 } %t22, ptr %a23 + %t24 = load ptr, ptr %a1 + %t25 = icmp eq ptr %t24, null + br i1 %t25, label %panic8034, label %ok8035 +panic8034: + call void @finch_panic(ptr @.str.5563, i64 157, ptr @.str.5564) + unreachable +ok8035: + %t26 = getelementptr inbounds %S.cimport.Importer, ptr %t24, i32 0, i32 0 + %t27 = getelementptr inbounds %S.cimport.CImports, ptr %t26, i32 0, i32 3 + %t28 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t28, ptr %a29 + %t30 = call i64 @finch_map_find(ptr %t27, ptr %a29, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t31 = icmp sge i64 %t30, 0 + br label %logic.from8036 +logic.from8036: + br i1 %t31, label %logic.end8038, label %logic.rhs8037 +logic.rhs8037: + %t32 = load ptr, ptr %a1 + %t33 = icmp eq ptr %t32, null + br i1 %t33, label %panic8039, label %ok8040 +panic8039: + call void @finch_panic(ptr @.str.5565, i64 157, ptr @.str.5566) + unreachable +ok8040: + %t34 = getelementptr inbounds %S.cimport.Importer, ptr %t32, i32 0, i32 4 + %t35 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t35, ptr %a36 + %t37 = call i64 @finch_map_find(ptr %t34, ptr %a36, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i1 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t38 = icmp sge i64 %t37, 0 + br label %logic.rend8041 +logic.rend8041: + br label %logic.end8038 +logic.end8038: + %t39 = phi i1 [ true, %logic.from8036 ], [ %t38, %logic.rend8041 ] + br i1 %t39, label %then8042, label %endif8044 +then8042: + %t40 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t40, ptr %a41 + call void @finch_str_copy(ptr %a42, ptr %a41) + %t43 = load { ptr, i64, i64 }, ptr %a42 + ret { ptr, i64, i64 } %t43 +endif8044: + %t44 = load %S.C.CXType, ptr %a7 + store %S.C.CXType %t44, ptr %a45 + %t46 = call i64 @clang_Type_getSizeOf(ptr byval(%S.C.CXType) align 8 %a45) + store i64 %t46, ptr %a47 + %t48 = load i64, ptr %a47 + %t49 = icmp slt i64 %t48, 0 + br i1 %t49, label %then8045, label %endif8047 +then8045: + ret { ptr, i64, i64 } { ptr @.str.5567, i64 0, i64 0 } +endif8047: + %t50 = load ptr, ptr %a1 + %t51 = icmp eq ptr %t50, null + br i1 %t51, label %panic8048, label %ok8049 +panic8048: + call void @finch_panic(ptr @.str.5568, i64 164, ptr @.str.5569) + unreachable +ok8049: + %t52 = getelementptr inbounds %S.cimport.Importer, ptr %t50, i32 0, i32 4 + %t53 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t53, ptr %a54 + store i32 0, ptr %a55 + %t56 = call i64 @finch_map_slot(ptr %t52, ptr %a54, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i1 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a55) + %t57 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t52, i32 0, i32 0 + %t58 = load ptr, ptr %t57 + %t59 = getelementptr inbounds { i64, { ptr, i64, i64 }, i1 }, ptr %t58, i64 %t56 + %t60 = load i32, ptr %a55 + %t61 = icmp ne i32 %t60, 0 + br i1 %t61, label %map.new8050, label %map.have8051 +map.new8050: + %t62 = getelementptr inbounds { i64, { ptr, i64, i64 }, i1 }, ptr %t59, i32 0, i32 1 + call void @finch_str_copy(ptr %t62, ptr %a54) + %t63 = getelementptr inbounds { i64, { ptr, i64, i64 }, i1 }, ptr %t59, i32 0, i32 2 + store i1 false, ptr %t63 + br label %map.have8051 +map.have8051: + %t64 = getelementptr inbounds { i64, { ptr, i64, i64 }, i1 }, ptr %t59, i32 0, i32 2 + store i1 true, ptr %t64 + %t65 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t65, ptr %a66 + call void @finch_str_copy(ptr %a67, ptr %a66) + %t68 = load { ptr, i64, i64 }, ptr %a67 + %t69 = insertvalue %S.cimport.CStruct zeroinitializer, { ptr, i64, i64 } %t68, 0 + %t70 = load i64, ptr %a47 + %t71 = insertvalue %S.cimport.CStruct %t69, i64 %t70, 2 + %t72 = load %S.C.CXType, ptr %a7 + store %S.C.CXType %t72, ptr %a73 + %t74 = call i64 @clang_Type_getAlignOf(ptr byval(%S.C.CXType) align 8 %a73) + %t75 = insertvalue %S.cimport.CStruct %t71, i64 %t74, 3 + store %S.cimport.CStruct %t75, ptr %a76 + %t77 = load %S.C.CXCursor, ptr %a12 + store %S.C.CXCursor %t77, ptr %a78 + %t79 = call i32 @clang_getCursorKind(ptr byval(%S.C.CXCursor) align 8 %a78) + %t80 = icmp eq i32 %t79, 3 + br i1 %t80, label %then8052, label %endif8054 +then8052: + %t81 = getelementptr inbounds %S.cimport.CStruct, ptr %a76, i32 0, i32 4 + store { ptr, i64, i64 } { ptr @.str.5570, i64 12, i64 0 }, ptr %t81 + br label %endif8054 +endif8054: + %t82 = load ptr, ptr %a1 + %t83 = insertvalue %S.cimport.FieldCtx zeroinitializer, ptr %t82, 0 + %t84 = insertvalue %S.cimport.FieldCtx %t83, ptr %a76, 1 + store %S.cimport.FieldCtx %t84, ptr %a85 + %t86 = load %S.C.CXType, ptr %a7 + store %S.C.CXType %t86, ptr %a87 + %t88 = call i32 @clang_Type_visitFields(ptr byval(%S.C.CXType) align 8 %a87, ptr @finch.c.cimport.visitField, ptr %a85) + %t89 = load ptr, ptr %a1 + %t90 = icmp eq ptr %t89, null + br i1 %t90, label %panic8055, label %ok8056 +panic8055: + call void @finch_panic(ptr @.str.5571, i64 172, ptr @.str.5572) + unreachable +ok8056: + %t91 = getelementptr inbounds %S.cimport.Importer, ptr %t89, i32 0, i32 4 + %t92 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t92, ptr %a93 + %t94 = call i64 @finch_map_find(ptr %t91, ptr %a93, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i1 }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t95 = icmp sge i64 %t94, 0 + br i1 %t95, label %remove.hit8057, label %remove.end8058 +remove.hit8057: + call void @finch_map_remove_at(ptr %t91, i64 %t94, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, i1 }, ptr null, i32 1) to i64)) + br label %remove.end8058 +remove.end8058: + %t96 = load %S.cimport.CStruct, ptr %a76 + %t97 = load ptr, ptr %a1 + %t98 = icmp eq ptr %t97, null + br i1 %t98, label %panic8059, label %ok8060 +panic8059: + call void @finch_panic(ptr @.str.5573, i64 173, ptr @.str.5574) + unreachable +ok8060: + %t99 = getelementptr inbounds %S.cimport.Importer, ptr %t97, i32 0, i32 0 + %t100 = getelementptr inbounds %S.cimport.CImports, ptr %t99, i32 0, i32 3 + %t101 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t101, ptr %a102 + store i32 0, ptr %a103 + %t104 = call i64 @finch_map_slot(ptr %t100, ptr %a102, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a103) + %t105 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t100, i32 0, i32 0 + %t106 = load ptr, ptr %t105 + %t107 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t106, i64 %t104 + %t108 = load i32, ptr %a103 + %t109 = icmp ne i32 %t108, 0 + br i1 %t109, label %map.new8061, label %map.have8062 +map.new8061: + %t110 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t107, i32 0, i32 1 + call void @finch_str_copy(ptr %t110, ptr %a102) + %t111 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t107, i32 0, i32 2 + store %S.cimport.CStruct zeroinitializer, ptr %t111 + br label %map.have8062 +map.have8062: + %t112 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr %t107, i32 0, i32 2 + store %S.cimport.CStruct %t96, ptr %a113 + call void @finch.copy.S_cimport_CStruct(ptr %a114, ptr %a113) + %t115 = load %S.cimport.CStruct, ptr %a114 + store %S.cimport.CStruct %t115, ptr %t112 + %t116 = load ptr, ptr %a1 + %t117 = icmp eq ptr %t116, null + br i1 %t117, label %panic8063, label %ok8064 +panic8063: + call void @finch_panic(ptr @.str.5575, i64 174, ptr @.str.5576) + unreachable +ok8064: + %t118 = getelementptr inbounds %S.cimport.Importer, ptr %t116, i32 0, i32 0 + %t119 = getelementptr inbounds %S.cimport.CImports, ptr %t118, i32 0, i32 4 + %t120 = getelementptr inbounds { ptr, i64, i64 }, ptr %t119, i32 0, i32 1 + %t121 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t121, ptr %a122 + call void @finch_str_copy(ptr %a123, ptr %a122) + %t124 = load { ptr, i64, i64 }, ptr %a123 + %t125 = load i64, ptr %t120 + %t126 = add i64 %t125, 1 + call void @finch_arr_reserve(ptr %t119, i64 %t126, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t127 = load ptr, ptr %t119 + %t128 = getelementptr inbounds { ptr, i64, i64 }, ptr %t127, i64 %t125 + store { ptr, i64, i64 } %t124, ptr %t128 + store i64 %t126, ptr %t120 + %t129 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t129, ptr %a130 + call void @finch_str_copy(ptr %a131, ptr %a130) + %t132 = load { ptr, i64, i64 }, ptr %a131 + ret { ptr, i64, i64 } %t132 +} + +define internal i32 @finch.cimport.visitField(%S.C.CXCursor %p0, ptr %p1) { +entry: + %a1 = alloca %S.C.CXCursor, align 16 + %a2 = alloca ptr, align 16 + %a4 = alloca ptr, align 16 + %a6 = alloca %S.C.CXCursor, align 16 + %a8 = alloca [32 x i8], align 16 + %a12 = alloca %S.cimport.CField, align 16 + %a13 = alloca %S.C.CXType, align 16 + %a14 = alloca %S.C.CXType, align 16 + %a16 = alloca %S.C.CXCursor, align 16 + %a18 = alloca %S.C.CXType, align 16 + %a20 = alloca %S.C.CXType, align 16 + %a22 = alloca %S.C.CXCursor, align 16 + %a27 = alloca %S.C.CXType, align 16 + %a31 = alloca %S.C.CXType, align 16 + %a35 = alloca %S.C.CXCursor, align 16 + %a48 = alloca %S.C.CXCursor, align 16 + %a50 = alloca %S.C.CXType, align 16 + %a52 = alloca %S.C.CXCursor, align 16 + %a63 = alloca %S.cimport.Mapped, align 16 + %a69 = alloca %S.ast.Type, align 16 + %a70 = alloca %S.ast.Type, align 16 + %a94 = alloca %S.cimport.CField, align 16 + %a95 = alloca %S.cimport.CField, align 16 + store %S.C.CXCursor %p0, ptr %a1 + store ptr %p1, ptr %a2 + %t3 = load ptr, ptr %a2 + store ptr %t3, ptr %a4 + %t5 = load %S.C.CXCursor, ptr %a1 + store %S.C.CXCursor %t5, ptr %a6 + %t7 = call { i64, i64 } @clang_getCursorSpelling(ptr byval(%S.C.CXCursor) align 8 %a6) + store { i64, i64 } %t7, ptr %a8 + %t9 = load %S.C.CXString, ptr %a8 + %t10 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t9) + %t11 = insertvalue %S.cimport.CField zeroinitializer, { ptr, i64, i64 } %t10, 0 + store %S.cimport.CField %t11, ptr %a12 + %t15 = load %S.C.CXCursor, ptr %a1 + store %S.C.CXCursor %t15, ptr %a16 + call void @clang_getCursorType(ptr sret(%S.C.CXType) align 16 %a14, ptr byval(%S.C.CXCursor) align 8 %a16) + %t17 = load %S.C.CXType, ptr %a14 + store %S.C.CXType %t17, ptr %a18 + call void @clang_getCanonicalType(ptr sret(%S.C.CXType) align 16 %a13, ptr byval(%S.C.CXType) align 8 %a18) + %t19 = load %S.C.CXType, ptr %a13 + store %S.C.CXType %t19, ptr %a20 + %t21 = load %S.C.CXCursor, ptr %a1 + store %S.C.CXCursor %t21, ptr %a22 + %t23 = call i64 @clang_Cursor_getOffsetOfField(ptr byval(%S.C.CXCursor) align 8 %a22) + %t24 = sdiv i64 %t23, 8 + %t25 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 2 + store i64 %t24, ptr %t25 + %t26 = load %S.C.CXType, ptr %a20 + store %S.C.CXType %t26, ptr %a27 + %t28 = call i64 @clang_Type_getSizeOf(ptr byval(%S.C.CXType) align 8 %a27) + %t29 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 3 + store i64 %t28, ptr %t29 + %t30 = load %S.C.CXType, ptr %a20 + store %S.C.CXType %t30, ptr %a31 + %t32 = call i64 @clang_Type_getAlignOf(ptr byval(%S.C.CXType) align 8 %a31) + %t33 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 4 + store i64 %t32, ptr %t33 + %t34 = load %S.C.CXCursor, ptr %a1 + store %S.C.CXCursor %t34, ptr %a35 + %t36 = call i32 @clang_Cursor_isBitField(ptr byval(%S.C.CXCursor) align 8 %a35) + %t37 = icmp ne i32 %t36, 0 + br i1 %t37, label %then8065, label %else8066 +then8065: + %t38 = load ptr, ptr %a4 + %t39 = icmp eq ptr %t38, null + br i1 %t39, label %panic8068, label %ok8069 +panic8068: + call void @finch_panic(ptr @.str.5578, i64 191, ptr @.str.5579) + unreachable +ok8069: + %t40 = getelementptr inbounds %S.cimport.FieldCtx, ptr %t38, i32 0, i32 1 + %t41 = load ptr, ptr %t40 + %t42 = icmp eq ptr %t41, null + br i1 %t42, label %panic8070, label %ok8071 +panic8070: + call void @finch_panic(ptr @.str.5580, i64 191, ptr @.str.5581) + unreachable +ok8071: + %t43 = getelementptr inbounds %S.cimport.CStruct, ptr %t41, i32 0, i32 4 + store { ptr, i64, i64 } { ptr @.str.5577, i64 14, i64 0 }, ptr %t43 + %t44 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 5 + store i1 true, ptr %t44 + br label %endif8067 +else8066: + %t45 = getelementptr inbounds %S.C.CXType, ptr %a20, i32 0, i32 0 + %t46 = load i32, ptr %t45 + %t47 = icmp eq i32 %t46, 105 + br label %logic.from8072 +logic.from8072: + br i1 %t47, label %logic.rhs8073, label %logic.end8074 +logic.rhs8073: + %t49 = load %S.C.CXType, ptr %a20 + store %S.C.CXType %t49, ptr %a50 + call void @clang_getTypeDeclaration(ptr sret(%S.C.CXCursor) align 16 %a48, ptr byval(%S.C.CXType) align 8 %a50) + %t51 = load %S.C.CXCursor, ptr %a48 + store %S.C.CXCursor %t51, ptr %a52 + %t53 = call i32 @clang_getCursorKind(ptr byval(%S.C.CXCursor) align 8 %a52) + %t54 = icmp eq i32 %t53, 3 + br label %logic.rend8075 +logic.rend8075: + br label %logic.end8074 +logic.end8074: + %t55 = phi i1 [ false, %logic.from8072 ], [ %t54, %logic.rend8075 ] + br i1 %t55, label %then8076, label %else8077 +then8076: + %t56 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 5 + store i1 true, ptr %t56 + br label %endif8078 +else8077: + %t57 = load ptr, ptr %a4 + %t58 = icmp eq ptr %t57, null + br i1 %t58, label %panic8079, label %ok8080 +panic8079: + call void @finch_panic(ptr @.str.5582, i64 196, ptr @.str.5583) + unreachable +ok8080: + %t59 = getelementptr inbounds %S.cimport.FieldCtx, ptr %t57, i32 0, i32 0 + %t60 = load ptr, ptr %t59 + %t61 = load %S.C.CXType, ptr %a20 + %t62 = call %S.cimport.Mapped @finch.cimport.mapType(ptr %t60, %S.C.CXType %t61, i1 false, i1 false) + store %S.cimport.Mapped %t62, ptr %a63 + %t64 = getelementptr inbounds %S.cimport.Mapped, ptr %a63, i32 0, i32 2 + %t65 = load i1, ptr %t64 + br i1 %t65, label %then8081, label %else8082 +then8081: + %t66 = getelementptr inbounds %S.cimport.Mapped, ptr %a63, i32 0, i32 0 + %t67 = load %S.ast.Type, ptr %t66 + %t68 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 1 + store %S.ast.Type %t67, ptr %a69 + call void @finch.copy.S_ast_Type(ptr %a70, ptr %a69) + %t71 = load %S.ast.Type, ptr %a70 + store %S.ast.Type %t71, ptr %t68 + br label %endif8083 +else8082: + %t72 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 5 + store i1 true, ptr %t72 + br label %endif8083 +endif8083: + br label %endif8078 +endif8078: + br label %endif8067 +endif8067: + %t73 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 5 + %t74 = load i1, ptr %t73 + br i1 %t74, label %then8084, label %endif8086 +then8084: + %t75 = load ptr, ptr %a4 + %t76 = icmp eq ptr %t75, null + br i1 %t76, label %panic8087, label %ok8088 +panic8087: + call void @finch_panic(ptr @.str.5584, i64 204, ptr @.str.5585) + unreachable +ok8088: + %t77 = getelementptr inbounds %S.cimport.FieldCtx, ptr %t75, i32 0, i32 1 + %t78 = load ptr, ptr %t77 + %t79 = icmp eq ptr %t78, null + br i1 %t79, label %panic8089, label %ok8090 +panic8089: + call void @finch_panic(ptr @.str.5586, i64 204, ptr @.str.5587) + unreachable +ok8090: + %t80 = getelementptr inbounds %S.cimport.CStruct, ptr %t78, i32 0, i32 5 + store i1 true, ptr %t80 + br label %endif8086 +endif8086: + %t81 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 0 + %t82 = getelementptr inbounds { ptr, i64, i64 }, ptr %t81, i32 0, i32 1 + %t83 = load i64, ptr %t82 + %t84 = icmp eq i64 %t83, 0 + br i1 %t84, label %then8091, label %endif8093 +then8091: + %t85 = getelementptr inbounds %S.cimport.CField, ptr %a12, i32 0, i32 5 + store i1 true, ptr %t85 + br label %endif8093 +endif8093: + %t86 = load ptr, ptr %a4 + %t87 = icmp eq ptr %t86, null + br i1 %t87, label %panic8094, label %ok8095 +panic8094: + call void @finch_panic(ptr @.str.5588, i64 209, ptr @.str.5589) + unreachable +ok8095: + %t88 = getelementptr inbounds %S.cimport.FieldCtx, ptr %t86, i32 0, i32 1 + %t89 = load ptr, ptr %t88 + %t90 = icmp eq ptr %t89, null + br i1 %t90, label %panic8096, label %ok8097 +panic8096: + call void @finch_panic(ptr @.str.5590, i64 209, ptr @.str.5591) + unreachable +ok8097: + %t91 = getelementptr inbounds %S.cimport.CStruct, ptr %t89, i32 0, i32 1 + %t92 = getelementptr inbounds { ptr, i64, i64 }, ptr %t91, i32 0, i32 1 + %t93 = load %S.cimport.CField, ptr %a12 + store %S.cimport.CField %t93, ptr %a94 + call void @finch.copy.S_cimport_CField(ptr %a95, ptr %a94) + %t96 = load %S.cimport.CField, ptr %a95 + %t97 = load i64, ptr %t92 + %t98 = add i64 %t97, 1 + call void @finch_arr_reserve(ptr %t91, i64 %t98, i64 ptrtoint (ptr getelementptr (%S.cimport.CField, ptr null, i32 1) to i64)) + %t99 = load ptr, ptr %t91 + %t100 = getelementptr inbounds %S.cimport.CField, ptr %t99, i64 %t97 + store %S.cimport.CField %t96, ptr %t100 + store i64 %t98, ptr %t92 + ret i32 1 +} + +define internal %S.cimport.Mapped @finch.cimport.sized(i64 %p0, i1 %p1) { +entry: + %a1 = alloca i64, align 16 + %a2 = alloca i1, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + store i64 %p0, ptr %a1 + store i1 %p1, ptr %a2 + %t3 = load i64, ptr %a1 + %t4 = icmp eq i64 %t3, 1 + br i1 %t4, label %then8098, label %endif8100 +then8098: + %t5 = load i1, ptr %a2 + br i1 %t5, label %then8101, label %endif8103 +then8101: + %t6 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5592, i64 2, i64 0 }) + %t7 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t6) + ret %S.cimport.Mapped %t7 +endif8103: + %t8 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5593, i64 2, i64 0 }) + %t9 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t8) + ret %S.cimport.Mapped %t9 +endif8100: + %t10 = load i64, ptr %a1 + %t11 = icmp eq i64 %t10, 2 + br i1 %t11, label %then8104, label %endif8106 +then8104: + %t12 = load i1, ptr %a2 + br i1 %t12, label %then8107, label %endif8109 +then8107: + %t13 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5594, i64 3, i64 0 }) + %t14 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t13) + ret %S.cimport.Mapped %t14 +endif8109: + %t15 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5595, i64 3, i64 0 }) + %t16 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t15) + ret %S.cimport.Mapped %t16 +endif8106: + %t17 = load i64, ptr %a1 + %t18 = icmp eq i64 %t17, 4 + br i1 %t18, label %then8110, label %endif8112 +then8110: + %t19 = load i1, ptr %a2 + br i1 %t19, label %then8113, label %endif8115 +then8113: + %t20 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5596, i64 3, i64 0 }) + %t21 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t20) + ret %S.cimport.Mapped %t21 +endif8115: + %t22 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5597, i64 3, i64 0 }) + %t23 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t22) + ret %S.cimport.Mapped %t23 +endif8112: + %t24 = load i64, ptr %a1 + %t25 = icmp eq i64 %t24, 8 + br i1 %t25, label %then8116, label %endif8118 +then8116: + %t26 = load i1, ptr %a2 + br i1 %t26, label %then8119, label %endif8121 +then8119: + %t27 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5598, i64 3, i64 0 }) + %t28 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t27) + ret %S.cimport.Mapped %t28 +endif8121: + %t29 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5599, i64 3, i64 0 }) + %t30 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t29) + ret %S.cimport.Mapped %t30 +endif8118: + %t31 = load i64, ptr %a1 + %t32 = mul i64 %t31, 8 + call void @finch_str_from_int(ptr %a33, i64 %t32) + %t34 = load { ptr, i64, i64 }, ptr %a33 + store { ptr, i64, i64 } { ptr @.str.5600, i64 7, i64 0 }, ptr %a36 + store { ptr, i64, i64 } %t34, ptr %a37 + call void @finch_str_concat(ptr %a35, ptr %a36, ptr %a37) + %t38 = load { ptr, i64, i64 }, ptr %a35 + store { ptr, i64, i64 } %t38, ptr %a40 + store { ptr, i64, i64 } { ptr @.str.5601, i64 11, i64 0 }, ptr %a41 + call void @finch_str_concat(ptr %a39, ptr %a40, ptr %a41) + %t42 = load { ptr, i64, i64 }, ptr %a39 + %t43 = call %S.cimport.Mapped @finch.cimport.no({ ptr, i64, i64 } %t42) + ret %S.cimport.Mapped %t43 +} + +define internal %S.cimport.Mapped @finch.cimport.mapType(ptr %p0, %S.C.CXType %p1, i1 %p2, i1 %p3) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.C.CXType, align 16 + %a3 = alloca i1, align 16 + %a4 = alloca i1, align 16 + %a5 = alloca %S.C.CXType, align 16 + %a7 = alloca %S.C.CXType, align 16 + %a9 = alloca %S.C.CXType, align 16 + %a11 = alloca %S.C.CXType, align 16 + %a13 = alloca i64, align 16 + %a16 = alloca i32, align 16 + %a78 = alloca %S.C.CXType, align 16 + %a79 = alloca %S.C.CXType, align 16 + %a81 = alloca %S.C.CXType, align 16 + %a83 = alloca %S.C.CXType, align 16 + %a85 = alloca %S.C.CXType, align 16 + %a98 = alloca %S.C.CXType, align 16 + %a120 = alloca %S.cimport.Mapped, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a148 = alloca %S.C.CXCursor, align 16 + %a150 = alloca %S.C.CXType, align 16 + %a152 = alloca %S.C.CXCursor, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca %S.C.CXType, align 16 + %a177 = alloca %S.C.CXType, align 16 + %a180 = alloca %S.cimport.Mapped, align 16 + %a188 = alloca %S.C.CXType, align 16 + %a196 = alloca %S.C.CXType, align 16 + %a198 = alloca [32 x i8], align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + store ptr %p0, ptr %a1 + store %S.C.CXType %p1, ptr %a2 + store i1 %p2, ptr %a3 + store i1 %p3, ptr %a4 + %t6 = load %S.C.CXType, ptr %a2 + store %S.C.CXType %t6, ptr %a7 + call void @clang_getCanonicalType(ptr sret(%S.C.CXType) align 16 %a5, ptr byval(%S.C.CXType) align 8 %a7) + %t8 = load %S.C.CXType, ptr %a5 + store %S.C.CXType %t8, ptr %a9 + %t10 = load %S.C.CXType, ptr %a9 + store %S.C.CXType %t10, ptr %a11 + %t12 = call i64 @clang_Type_getSizeOf(ptr byval(%S.C.CXType) align 8 %a11) + store i64 %t12, ptr %a13 + %t14 = getelementptr inbounds %S.C.CXType, ptr %a9, i32 0, i32 0 + %t15 = load i32, ptr %t14 + store i32 %t15, ptr %a16 + %t17 = load i32, ptr %a16 + %t18 = icmp eq i32 %t17, 2 + br i1 %t18, label %then8122, label %endif8124 +then8122: + %t19 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5602, i64 4, i64 0 }) + %t20 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t19) + ret %S.cimport.Mapped %t20 +endif8124: + %t21 = load i32, ptr %a16 + %t22 = icmp eq i32 %t21, 3 + br i1 %t22, label %then8125, label %endif8127 +then8125: + %t23 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5603, i64 4, i64 0 }) + %t24 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t23) + ret %S.cimport.Mapped %t24 +endif8127: + %t25 = load i32, ptr %a16 + %t26 = icmp eq i32 %t25, 13 + br label %logic.from8128 +logic.from8128: + br i1 %t26, label %logic.end8130, label %logic.rhs8129 +logic.rhs8129: + %t27 = load i32, ptr %a16 + %t28 = icmp eq i32 %t27, 4 + br label %logic.rend8131 +logic.rend8131: + br label %logic.end8130 +logic.end8130: + %t29 = phi i1 [ true, %logic.from8128 ], [ %t28, %logic.rend8131 ] + br i1 %t29, label %then8132, label %endif8134 +then8132: + %t30 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5604, i64 4, i64 0 }) + %t31 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t30) + ret %S.cimport.Mapped %t31 +endif8134: + %t32 = load i32, ptr %a16 + %t33 = icmp eq i32 %t32, 14 + br label %logic.from8135 +logic.from8135: + br i1 %t33, label %logic.end8137, label %logic.rhs8136 +logic.rhs8136: + %t34 = load i32, ptr %a16 + %t35 = icmp eq i32 %t34, 16 + br label %logic.rend8138 +logic.rend8138: + br label %logic.end8137 +logic.end8137: + %t36 = phi i1 [ true, %logic.from8135 ], [ %t35, %logic.rend8138 ] + br label %logic.from8139 +logic.from8139: + br i1 %t36, label %logic.end8141, label %logic.rhs8140 +logic.rhs8140: + %t37 = load i32, ptr %a16 + %t38 = icmp eq i32 %t37, 17 + br label %logic.rend8142 +logic.rend8142: + br label %logic.end8141 +logic.end8141: + %t39 = phi i1 [ true, %logic.from8139 ], [ %t38, %logic.rend8142 ] + br label %logic.from8143 +logic.from8143: + br i1 %t39, label %logic.end8145, label %logic.rhs8144 +logic.rhs8144: + %t40 = load i32, ptr %a16 + %t41 = icmp eq i32 %t40, 18 + br label %logic.rend8146 +logic.rend8146: + br label %logic.end8145 +logic.end8145: + %t42 = phi i1 [ true, %logic.from8143 ], [ %t41, %logic.rend8146 ] + br label %logic.from8147 +logic.from8147: + br i1 %t42, label %logic.end8149, label %logic.rhs8148 +logic.rhs8148: + %t43 = load i32, ptr %a16 + %t44 = icmp eq i32 %t43, 19 + br label %logic.rend8150 +logic.rend8150: + br label %logic.end8149 +logic.end8149: + %t45 = phi i1 [ true, %logic.from8147 ], [ %t44, %logic.rend8150 ] + br i1 %t45, label %then8151, label %endif8153 +then8151: + %t46 = load i64, ptr %a13 + %t47 = call %S.cimport.Mapped @finch.cimport.sized(i64 %t46, i1 true) + ret %S.cimport.Mapped %t47 +endif8153: + %t48 = load i32, ptr %a16 + %t49 = icmp eq i32 %t48, 5 + br label %logic.from8154 +logic.from8154: + br i1 %t49, label %logic.end8156, label %logic.rhs8155 +logic.rhs8155: + %t50 = load i32, ptr %a16 + %t51 = icmp eq i32 %t50, 8 + br label %logic.rend8157 +logic.rend8157: + br label %logic.end8156 +logic.end8156: + %t52 = phi i1 [ true, %logic.from8154 ], [ %t51, %logic.rend8157 ] + br label %logic.from8158 +logic.from8158: + br i1 %t52, label %logic.end8160, label %logic.rhs8159 +logic.rhs8159: + %t53 = load i32, ptr %a16 + %t54 = icmp eq i32 %t53, 9 + br label %logic.rend8161 +logic.rend8161: + br label %logic.end8160 +logic.end8160: + %t55 = phi i1 [ true, %logic.from8158 ], [ %t54, %logic.rend8161 ] + br label %logic.from8162 +logic.from8162: + br i1 %t55, label %logic.end8164, label %logic.rhs8163 +logic.rhs8163: + %t56 = load i32, ptr %a16 + %t57 = icmp eq i32 %t56, 10 + br label %logic.rend8165 +logic.rend8165: + br label %logic.end8164 +logic.end8164: + %t58 = phi i1 [ true, %logic.from8162 ], [ %t57, %logic.rend8165 ] + br label %logic.from8166 +logic.from8166: + br i1 %t58, label %logic.end8168, label %logic.rhs8167 +logic.rhs8167: + %t59 = load i32, ptr %a16 + %t60 = icmp eq i32 %t59, 11 + br label %logic.rend8169 +logic.rend8169: + br label %logic.end8168 +logic.end8168: + %t61 = phi i1 [ true, %logic.from8166 ], [ %t60, %logic.rend8169 ] + br i1 %t61, label %then8170, label %endif8172 +then8170: + %t62 = load i64, ptr %a13 + %t63 = call %S.cimport.Mapped @finch.cimport.sized(i64 %t62, i1 false) + ret %S.cimport.Mapped %t63 +endif8172: + %t64 = load i32, ptr %a16 + %t65 = icmp eq i32 %t64, 106 + br i1 %t65, label %then8173, label %endif8175 +then8173: + %t66 = load i64, ptr %a13 + %t67 = call %S.cimport.Mapped @finch.cimport.sized(i64 %t66, i1 true) + ret %S.cimport.Mapped %t67 +endif8175: + %t68 = load i32, ptr %a16 + %t69 = icmp eq i32 %t68, 21 + br i1 %t69, label %then8176, label %endif8178 +then8176: + %t70 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5605, i64 3, i64 0 }) + %t71 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t70) + ret %S.cimport.Mapped %t71 +endif8178: + %t72 = load i32, ptr %a16 + %t73 = icmp eq i32 %t72, 22 + br i1 %t73, label %then8179, label %endif8181 +then8179: + %t74 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5606, i64 5, i64 0 }) + %t75 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t74) + ret %S.cimport.Mapped %t75 +endif8181: + %t76 = load i32, ptr %a16 + %t77 = icmp eq i32 %t76, 101 + br i1 %t77, label %then8182, label %endif8184 +then8182: + %t80 = load %S.C.CXType, ptr %a9 + store %S.C.CXType %t80, ptr %a81 + call void @clang_getPointeeType(ptr sret(%S.C.CXType) align 16 %a79, ptr byval(%S.C.CXType) align 8 %a81) + %t82 = load %S.C.CXType, ptr %a79 + store %S.C.CXType %t82, ptr %a83 + call void @clang_getCanonicalType(ptr sret(%S.C.CXType) align 16 %a78, ptr byval(%S.C.CXType) align 8 %a83) + %t84 = load %S.C.CXType, ptr %a78 + store %S.C.CXType %t84, ptr %a85 + %t86 = getelementptr inbounds %S.C.CXType, ptr %a85, i32 0, i32 0 + %t87 = load i32, ptr %t86 + %t88 = icmp eq i32 %t87, 13 + br label %logic.from8185 +logic.from8185: + br i1 %t88, label %logic.end8187, label %logic.rhs8186 +logic.rhs8186: + %t89 = getelementptr inbounds %S.C.CXType, ptr %a85, i32 0, i32 0 + %t90 = load i32, ptr %t89 + %t91 = icmp eq i32 %t90, 4 + br label %logic.rend8188 +logic.rend8188: + br label %logic.end8187 +logic.end8187: + %t92 = phi i1 [ true, %logic.from8185 ], [ %t91, %logic.rend8188 ] + br label %logic.from8189 +logic.from8189: + br i1 %t92, label %logic.rhs8190, label %logic.end8191 +logic.rhs8190: + %t93 = load i1, ptr %a3 + br label %logic.rend8192 +logic.rend8192: + br label %logic.end8191 +logic.end8191: + %t94 = phi i1 [ false, %logic.from8189 ], [ %t93, %logic.rend8192 ] + br i1 %t94, label %then8193, label %endif8195 +then8193: + %t95 = load i1, ptr %a4 + %t96 = xor i1 %t95, true + br label %logic.from8196 +logic.from8196: + br i1 %t96, label %logic.end8198, label %logic.rhs8197 +logic.rhs8197: + %t97 = load %S.C.CXType, ptr %a85 + store %S.C.CXType %t97, ptr %a98 + %t99 = call i32 @clang_isConstQualifiedType(ptr byval(%S.C.CXType) align 8 %a98) + %t100 = icmp ne i32 %t99, 0 + br label %logic.rend8199 +logic.rend8199: + br label %logic.end8198 +logic.end8198: + %t101 = phi i1 [ true, %logic.from8196 ], [ %t100, %logic.rend8199 ] + br i1 %t101, label %then8200, label %endif8202 +then8200: + %t102 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5607, i64 3, i64 0 }) + %t103 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t102) + ret %S.cimport.Mapped %t103 +endif8202: + br label %endif8195 +endif8195: + %t104 = getelementptr inbounds %S.C.CXType, ptr %a85, i32 0, i32 0 + %t105 = load i32, ptr %t104 + %t106 = icmp eq i32 %t105, 2 + br label %logic.from8203 +logic.from8203: + br i1 %t106, label %logic.end8205, label %logic.rhs8204 +logic.rhs8204: + %t107 = getelementptr inbounds %S.C.CXType, ptr %a85, i32 0, i32 0 + %t108 = load i32, ptr %t107 + %t109 = icmp eq i32 %t108, 111 + br label %logic.rend8206 +logic.rend8206: + br label %logic.end8205 +logic.end8205: + %t110 = phi i1 [ true, %logic.from8203 ], [ %t109, %logic.rend8206 ] + br label %logic.from8207 +logic.from8207: + br i1 %t110, label %logic.end8209, label %logic.rhs8208 +logic.rhs8208: + %t111 = getelementptr inbounds %S.C.CXType, ptr %a85, i32 0, i32 0 + %t112 = load i32, ptr %t111 + %t113 = icmp eq i32 %t112, 110 + br label %logic.rend8210 +logic.rend8210: + br label %logic.end8209 +logic.end8209: + %t114 = phi i1 [ true, %logic.from8207 ], [ %t113, %logic.rend8210 ] + br i1 %t114, label %then8211, label %endif8213 +then8211: + %t115 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5608, i64 3, i64 0 }) + %t116 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t115) + ret %S.cimport.Mapped %t116 +endif8213: + %t117 = load ptr, ptr %a1 + %t118 = load %S.C.CXType, ptr %a85 + %t119 = call %S.cimport.Mapped @finch.cimport.mapType(ptr %t117, %S.C.CXType %t118, i1 false, i1 false) + store %S.cimport.Mapped %t119, ptr %a120 + %t121 = getelementptr inbounds %S.cimport.Mapped, ptr %a120, i32 0, i32 2 + %t122 = load i1, ptr %t121 + %t123 = xor i1 %t122, true + br label %logic.from8214 +logic.from8214: + br i1 %t123, label %logic.end8216, label %logic.rhs8215 +logic.rhs8215: + %t124 = getelementptr inbounds %S.cimport.Mapped, ptr %a120, i32 0, i32 0 + %t125 = getelementptr inbounds %S.ast.Type, ptr %t124, i32 0, i32 0 + %t126 = load { ptr, i64, i64 }, ptr %t125 + store { ptr, i64, i64 } %t126, ptr %a127 + store { ptr, i64, i64 } { ptr @.str.5609, i64 4, i64 0 }, ptr %a128 + %t129 = call i32 @finch_str_eq(ptr %a127, ptr %a128) + %t130 = icmp ne i32 %t129, 0 + br label %logic.rend8217 +logic.rend8217: + br label %logic.end8216 +logic.end8216: + %t131 = phi i1 [ true, %logic.from8214 ], [ %t130, %logic.rend8217 ] + br label %logic.from8218 +logic.from8218: + br i1 %t131, label %logic.end8220, label %logic.rhs8219 +logic.rhs8219: + %t132 = getelementptr inbounds %S.cimport.Mapped, ptr %a120, i32 0, i32 0 + %t133 = getelementptr inbounds %S.ast.Type, ptr %t132, i32 0, i32 0 + %t134 = load { ptr, i64, i64 }, ptr %t133 + store { ptr, i64, i64 } %t134, ptr %a135 + store { ptr, i64, i64 } { ptr @.str.5610, i64 5, i64 0 }, ptr %a136 + %t137 = call i32 @finch_str_eq(ptr %a135, ptr %a136) + %t138 = icmp ne i32 %t137, 0 + br label %logic.rend8221 +logic.rend8221: + br label %logic.end8220 +logic.end8220: + %t139 = phi i1 [ true, %logic.from8218 ], [ %t138, %logic.rend8221 ] + br i1 %t139, label %then8222, label %endif8224 +then8222: + %t140 = call %S.ast.Type @finch.ast.simple({ ptr, i64, i64 } { ptr @.str.5611, i64 3, i64 0 }) + %t141 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t140) + ret %S.cimport.Mapped %t141 +endif8224: + %t142 = getelementptr inbounds %S.cimport.Mapped, ptr %a120, i32 0, i32 0 + %t143 = load %S.ast.Type, ptr %t142 + %t144 = call %S.ast.Type @finch.ast.ptrTo(%S.ast.Type %t143) + %t145 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t144) + ret %S.cimport.Mapped %t145 +endif8184: + %t146 = load i32, ptr %a16 + %t147 = icmp eq i32 %t146, 105 + br i1 %t147, label %then8225, label %endif8227 +then8225: + %t149 = load %S.C.CXType, ptr %a9 + store %S.C.CXType %t149, ptr %a150 + call void @clang_getTypeDeclaration(ptr sret(%S.C.CXCursor) align 16 %a148, ptr byval(%S.C.CXType) align 8 %a150) + %t151 = load %S.C.CXCursor, ptr %a148 + store %S.C.CXCursor %t151, ptr %a152 + %t153 = call i32 @clang_getCursorKind(ptr byval(%S.C.CXCursor) align 8 %a152) + %t154 = icmp eq i32 %t153, 3 + br i1 %t154, label %then8228, label %endif8230 +then8228: + %t155 = call %S.cimport.Mapped @finch.cimport.no({ ptr, i64, i64 } { ptr @.str.5612, i64 23, i64 0 }) + ret %S.cimport.Mapped %t155 +endif8230: + %t156 = load ptr, ptr %a1 + %t157 = load %S.C.CXType, ptr %a9 + %t158 = call { ptr, i64, i64 } @finch.cimport.defineRecord(ptr %t156, %S.C.CXType %t157) + store { ptr, i64, i64 } %t158, ptr %a159 + %t160 = getelementptr inbounds { ptr, i64, i64 }, ptr %a159, i32 0, i32 1 + %t161 = load i64, ptr %t160 + %t162 = icmp eq i64 %t161, 0 + br i1 %t162, label %then8231, label %endif8233 +then8231: + %t163 = call %S.cimport.Mapped @finch.cimport.no({ ptr, i64, i64 } { ptr @.str.5613, i64 36, i64 0 }) + ret %S.cimport.Mapped %t163 +endif8233: + %t164 = insertvalue %S.ast.Type zeroinitializer, { ptr, i64, i64 } { ptr @.str.5614, i64 5, i64 0 }, 0 + %t165 = load { ptr, i64, i64 }, ptr %a159 + store { ptr, i64, i64 } %t165, ptr %a166 + call void @finch_str_copy(ptr %a167, ptr %a166) + %t168 = load { ptr, i64, i64 }, ptr %a167 + %t169 = insertvalue %S.ast.Type %t164, { ptr, i64, i64 } %t168, 2 + %t170 = insertvalue %S.ast.Type %t169, { ptr, i64, i64 } { ptr @.str.5615, i64 1, i64 0 }, 3 + %t171 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t170) + ret %S.cimport.Mapped %t171 +endif8227: + %t172 = load i32, ptr %a16 + %t173 = icmp eq i32 %t172, 112 + br i1 %t173, label %then8234, label %endif8236 +then8234: + %t174 = load ptr, ptr %a1 + %t176 = load %S.C.CXType, ptr %a9 + store %S.C.CXType %t176, ptr %a177 + call void @clang_getArrayElementType(ptr sret(%S.C.CXType) align 16 %a175, ptr byval(%S.C.CXType) align 8 %a177) + %t178 = load %S.C.CXType, ptr %a175 + %t179 = call %S.cimport.Mapped @finch.cimport.mapType(ptr %t174, %S.C.CXType %t178, i1 false, i1 false) + store %S.cimport.Mapped %t179, ptr %a180 + %t181 = getelementptr inbounds %S.cimport.Mapped, ptr %a180, i32 0, i32 2 + %t182 = load i1, ptr %t181 + %t183 = xor i1 %t182, true + br i1 %t183, label %then8237, label %endif8239 +then8237: + %t184 = load %S.cimport.Mapped, ptr %a180 + ret %S.cimport.Mapped %t184 +endif8239: + %t185 = getelementptr inbounds %S.cimport.Mapped, ptr %a180, i32 0, i32 0 + %t186 = load %S.ast.Type, ptr %t185 + %t187 = load %S.C.CXType, ptr %a9 + store %S.C.CXType %t187, ptr %a188 + %t189 = call i64 @clang_getArraySize(ptr byval(%S.C.CXType) align 8 %a188) + %t190 = call %S.ast.Type @finch.cimport.fixed(%S.ast.Type %t186, i64 %t189) + %t191 = call %S.cimport.Mapped @finch.cimport.ok(%S.ast.Type %t190) + ret %S.cimport.Mapped %t191 +endif8236: + %t192 = load i32, ptr %a16 + %t193 = icmp eq i32 %t192, 23 + br i1 %t193, label %then8240, label %endif8242 +then8240: + %t194 = call %S.cimport.Mapped @finch.cimport.no({ ptr, i64, i64 } { ptr @.str.5616, i64 16, i64 0 }) + ret %S.cimport.Mapped %t194 +endif8242: + %t195 = load %S.C.CXType, ptr %a9 + store %S.C.CXType %t195, ptr %a196 + %t197 = call { i64, i64 } @clang_getTypeSpelling(ptr byval(%S.C.CXType) align 8 %a196) + store { i64, i64 } %t197, ptr %a198 + %t199 = load %S.C.CXString, ptr %a198 + %t200 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t199) + store { ptr, i64, i64 } { ptr @.str.5617, i64 17, i64 0 }, ptr %a202 + store { ptr, i64, i64 } %t200, ptr %a203 + call void @finch_str_concat(ptr %a201, ptr %a202, ptr %a203) + %t204 = load { ptr, i64, i64 }, ptr %a201 + store { ptr, i64, i64 } %t204, ptr %a206 + store { ptr, i64, i64 } { ptr @.str.5618, i64 1, i64 0 }, ptr %a207 + call void @finch_str_concat(ptr %a205, ptr %a206, ptr %a207) + %t208 = load { ptr, i64, i64 }, ptr %a205 + %t209 = call %S.cimport.Mapped @finch.cimport.no({ ptr, i64, i64 } %t208) + ret %S.cimport.Mapped %t209 +} + +define internal %S.cimport.Number @finch.cimport.parseInt({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca i64, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca i64, align 16 + %a45 = alloca i1, align 16 + %a46 = alloca i64, align 16 + %a58 = alloca i8, align 16 + %a59 = alloca i64, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + call void @finch_str_copy(ptr %a4, ptr %a3) + %t5 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t5, ptr %a6 + store i64 10, ptr %a7 + %t8 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t8, ptr %a9 + store { ptr, i64, i64 } { ptr @.str.5620, i64 2, i64 0 }, ptr %a11 + %t12 = call i32 @finch_str_starts(ptr %a9, ptr %a11) + %t13 = icmp ne i32 %t12, 0 + br label %logic.from8243 +logic.from8243: + br i1 %t13, label %logic.end8245, label %logic.rhs8244 +logic.rhs8244: + %t14 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } { ptr @.str.5622, i64 2, i64 0 }, ptr %a17 + %t18 = call i32 @finch_str_starts(ptr %a15, ptr %a17) + %t19 = icmp ne i32 %t18, 0 + br label %logic.rend8246 +logic.rend8246: + br label %logic.end8245 +logic.end8245: + %t20 = phi i1 [ true, %logic.from8243 ], [ %t19, %logic.rend8246 ] + br i1 %t20, label %then8247, label %else8248 +then8247: + store i64 16, ptr %a7 + %t21 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t21, ptr %a22 + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t25 = load i64, ptr %t24 + call void @finch_str_sub(ptr %a23, ptr %a22, i64 2, i64 %t25, ptr @.str.5623, i64 327) + %t26 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t26, ptr %a6 + br label %endif8249 +else8248: + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t28 = load i64, ptr %t27 + %t29 = icmp sgt i64 %t28, 1 + br label %logic.from8250 +logic.from8250: + br i1 %t29, label %logic.rhs8251, label %logic.end8252 +logic.rhs8251: + %t30 = load { ptr, i64, i64 }, ptr %a6 + %t31 = extractvalue { ptr, i64, i64 } %t30, 1 + %t32 = icmp uge i64 0, %t31 + br i1 %t32, label %range8253, label %inrange8254 +range8253: + call void @finch_panic_index(ptr @.str.5624, i64 328, i64 0, i64 %t31) + unreachable +inrange8254: + %t33 = extractvalue { ptr, i64, i64 } %t30, 0 + %t34 = getelementptr inbounds i8, ptr %t33, i64 0 + %t35 = load i8, ptr %t34 + %t36 = icmp eq i8 %t35, 48 + br label %logic.rend8255 +logic.rend8255: + br label %logic.end8252 +logic.end8252: + %t37 = phi i1 [ false, %logic.from8250 ], [ %t36, %logic.rend8255 ] + br i1 %t37, label %then8256, label %endif8258 +then8256: + store i64 8, ptr %a7 + %t38 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t38, ptr %a39 + %t41 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t42 = load i64, ptr %t41 + call void @finch_str_sub(ptr %a40, ptr %a39, i64 1, i64 %t42, ptr @.str.5625, i64 330) + %t43 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t43, ptr %a6 + br label %endif8258 +endif8258: + br label %endif8249 +endif8249: + store i64 0, ptr %a44 + store i1 false, ptr %a45 + store i64 0, ptr %a46 + br label %while.cond8259 +while.cond8259: + %t47 = load i64, ptr %a46 + %t48 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t49 = load i64, ptr %t48 + %t50 = icmp slt i64 %t47, %t49 + br i1 %t50, label %while.body8260, label %while.end8261 +while.body8260: + %t51 = load i64, ptr %a46 + %t52 = load { ptr, i64, i64 }, ptr %a6 + %t53 = extractvalue { ptr, i64, i64 } %t52, 1 + %t54 = icmp uge i64 %t51, %t53 + br i1 %t54, label %range8262, label %inrange8263 +range8262: + call void @finch_panic_index(ptr @.str.5626, i64 336, i64 %t51, i64 %t53) + unreachable +inrange8263: + %t55 = extractvalue { ptr, i64, i64 } %t52, 0 + %t56 = getelementptr inbounds i8, ptr %t55, i64 %t51 + %t57 = load i8, ptr %t56 + store i8 %t57, ptr %a58 + store i64 99, ptr %a59 + %t60 = load i8, ptr %a58 + %t61 = icmp uge i8 %t60, 48 + br label %logic.from8264 +logic.from8264: + br i1 %t61, label %logic.rhs8265, label %logic.end8266 +logic.rhs8265: + %t62 = load i8, ptr %a58 + %t63 = icmp ule i8 %t62, 57 + br label %logic.rend8267 +logic.rend8267: + br label %logic.end8266 +logic.end8266: + %t64 = phi i1 [ false, %logic.from8264 ], [ %t63, %logic.rend8267 ] + br i1 %t64, label %then8268, label %else8269 +then8268: + %t65 = load i8, ptr %a58 + %t66 = zext i8 %t65 to i64 + %t67 = zext i8 48 to i64 + %t68 = sub i64 %t66, %t67 + store i64 %t68, ptr %a59 + br label %endif8270 +else8269: + %t69 = load i8, ptr %a58 + %t70 = icmp uge i8 %t69, 97 + br label %logic.from8271 +logic.from8271: + br i1 %t70, label %logic.rhs8272, label %logic.end8273 +logic.rhs8272: + %t71 = load i8, ptr %a58 + %t72 = icmp ule i8 %t71, 102 + br label %logic.rend8274 +logic.rend8274: + br label %logic.end8273 +logic.end8273: + %t73 = phi i1 [ false, %logic.from8271 ], [ %t72, %logic.rend8274 ] + br i1 %t73, label %then8275, label %else8276 +then8275: + %t74 = load i8, ptr %a58 + %t75 = zext i8 %t74 to i64 + %t76 = zext i8 97 to i64 + %t77 = sub i64 %t75, %t76 + %t78 = add i64 %t77, 10 + store i64 %t78, ptr %a59 + br label %endif8277 +else8276: + %t79 = load i8, ptr %a58 + %t80 = icmp uge i8 %t79, 65 + br label %logic.from8278 +logic.from8278: + br i1 %t80, label %logic.rhs8279, label %logic.end8280 +logic.rhs8279: + %t81 = load i8, ptr %a58 + %t82 = icmp ule i8 %t81, 70 + br label %logic.rend8281 +logic.rend8281: + br label %logic.end8280 +logic.end8280: + %t83 = phi i1 [ false, %logic.from8278 ], [ %t82, %logic.rend8281 ] + br i1 %t83, label %then8282, label %endif8284 +then8282: + %t84 = load i8, ptr %a58 + %t85 = zext i8 %t84 to i64 + %t86 = zext i8 65 to i64 + %t87 = sub i64 %t85, %t86 + %t88 = add i64 %t87, 10 + store i64 %t88, ptr %a59 + br label %endif8284 +endif8284: + br label %endif8277 +endif8277: + br label %endif8270 +endif8270: + %t89 = load i64, ptr %a59 + %t90 = load i64, ptr %a7 + %t91 = icmp sge i64 %t89, %t90 + br i1 %t91, label %then8285, label %endif8287 +then8285: + br label %while.end8261 +endif8287: + %t92 = load i64, ptr %a44 + %t93 = load i64, ptr %a7 + %t94 = mul i64 %t92, %t93 + %t95 = load i64, ptr %a59 + %t96 = add i64 %t94, %t95 + store i64 %t96, ptr %a44 + store i1 true, ptr %a45 + %t97 = load i64, ptr %a46 + %t98 = add i64 %t97, 1 + store i64 %t98, ptr %a46 + br label %while.cond8259 +while.end8261: + br label %while.cond8288 +while.cond8288: + %t99 = load i64, ptr %a46 + %t100 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t101 = load i64, ptr %t100 + %t102 = icmp slt i64 %t99, %t101 + br i1 %t102, label %while.body8289, label %while.end8290 +while.body8289: + store { ptr, i64, i64 } { ptr @.str.5627, i64 4, i64 0 }, ptr %a103 + %t105 = load i64, ptr %a46 + %t106 = load { ptr, i64, i64 }, ptr %a6 + %t107 = extractvalue { ptr, i64, i64 } %t106, 1 + %t108 = icmp uge i64 %t105, %t107 + br i1 %t108, label %range8291, label %inrange8292 +range8291: + call void @finch_panic_index(ptr @.str.5629, i64 354, i64 %t105, i64 %t107) + unreachable +inrange8292: + %t109 = extractvalue { ptr, i64, i64 } %t106, 0 + %t110 = getelementptr inbounds i8, ptr %t109, i64 %t105 + %t111 = load i8, ptr %t110 + call void @finch_str_from_char(ptr %a112, i8 signext %t111) + %t113 = load { ptr, i64, i64 }, ptr %a112 + store { ptr, i64, i64 } %t113, ptr %a114 + %t115 = call i64 @finch_str_find(ptr %a103, ptr %a114) + %t116 = icmp sge i64 %t115, 0 + %t117 = xor i1 %t116, true + br i1 %t117, label %then8293, label %endif8295 +then8293: + ret %S.cimport.Number zeroinitializer +endif8295: + %t118 = load i64, ptr %a46 + %t119 = add i64 %t118, 1 + store i64 %t119, ptr %a46 + br label %while.cond8288 +while.end8290: + %t120 = load i1, ptr %a45 + %t121 = xor i1 %t120, true + br label %logic.from8296 +logic.from8296: + br i1 %t121, label %logic.rhs8297, label %logic.end8298 +logic.rhs8297: + %t122 = load i64, ptr %a7 + %t123 = icmp ne i64 %t122, 8 + br label %logic.rend8299 +logic.rend8299: + br label %logic.end8298 +logic.end8298: + %t124 = phi i1 [ false, %logic.from8296 ], [ %t123, %logic.rend8299 ] + br i1 %t124, label %then8300, label %endif8302 +then8300: + ret %S.cimport.Number zeroinitializer +endif8302: + %t125 = load i64, ptr %a44 + %t126 = insertvalue %S.cimport.CConst zeroinitializer, i64 %t125, 1 + %t127 = insertvalue %S.cimport.Number zeroinitializer, %S.cimport.CConst %t126, 0 + %t128 = insertvalue %S.cimport.Number %t127, i1 true, 1 + ret %S.cimport.Number %t128 +} + +define internal void @finch.copy.S_cimport_Number(ptr %dst, ptr %src) { +entry: + + %t1 = load %S.cimport.Number, ptr %src + store %S.cimport.Number %t1, ptr %dst + %t2 = getelementptr inbounds %S.cimport.Number, ptr %dst, i32 0, i32 0 + %t3 = getelementptr inbounds %S.cimport.Number, ptr %src, i32 0, i32 0 + call void @finch.copy.S_cimport_CConst(ptr %t2, ptr %t3) + ret void +} + +define internal %S.cimport.Number @finch.cimport.macroValue(ptr %p0, %S.C.CXCursor %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.C.CXCursor, align 16 + %a3 = alloca ptr, align 16 + %a4 = alloca i32, align 16 + %a9 = alloca %S.C.CXSourceRange, align 16 + %a11 = alloca %S.C.CXCursor, align 16 + %a13 = alloca %S.C.CXSourceRange, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca i64, align 16 + %a24 = alloca %S.C.CXToken, align 16 + %a36 = alloca %S.C.CXToken, align 16 + %a38 = alloca [32 x i8], align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a94 = alloca i1, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca i1, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a194 = alloca { ptr, i64, i64 }, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a212 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca double, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a226 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca double, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a236 = alloca { ptr, i64, i64 }, align 16 + %a243 = alloca %S.cimport.Number, align 16 + %a255 = alloca %S.cimport.Number, align 16 + %a256 = alloca %S.cimport.Number, align 16 + store ptr %p0, ptr %a1 + store %S.C.CXCursor %p1, ptr %a2 + store ptr null, ptr %a3 + store i32 0, ptr %a4 + %t5 = load ptr, ptr %a1 + %t6 = icmp eq ptr %t5, null + br i1 %t6, label %panic8303, label %ok8304 +panic8303: + call void @finch_panic(ptr @.str.5630, i64 369, ptr @.str.5631) + unreachable +ok8304: + %t7 = getelementptr inbounds %S.cimport.Importer, ptr %t5, i32 0, i32 1 + %t8 = load ptr, ptr %t7 + %t10 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t10, ptr %a11 + call void @clang_getCursorExtent(ptr sret(%S.C.CXSourceRange) align 16 %a9, ptr byval(%S.C.CXCursor) align 8 %a11) + %t12 = load %S.C.CXSourceRange, ptr %a9 + store %S.C.CXSourceRange %t12, ptr %a13 + call void @clang_tokenize(ptr %t8, ptr byval(%S.C.CXSourceRange) align 8 %a13, ptr %a3, ptr %a4) + store { ptr, i64, i64 } zeroinitializer, ptr %a14 + %t15 = load i32, ptr %a4 + %t16 = zext i32 %t15 to i64 + store i64 1, ptr %a17 + br label %for.cond8305 +for.cond8305: + %t18 = load i64, ptr %a17 + %t19 = icmp slt i64 %t18, %t16 + br i1 %t19, label %for.body8306, label %for.end8308 +for.body8306: + %t20 = load i64, ptr %a17 + %t21 = load ptr, ptr %a3 + %t22 = getelementptr inbounds %S.C.CXToken, ptr %t21, i64 %t20 + %t23 = load %S.C.CXToken, ptr %t22 + store %S.C.CXToken %t23, ptr %a24 + %t25 = call i32 @clang_getTokenKind(ptr byval(%S.C.CXToken) align 8 %a24) + %t26 = icmp eq i32 %t25, 4 + br i1 %t26, label %then8309, label %endif8311 +then8309: + br label %for.step8307 +endif8311: + %t27 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t28 = load ptr, ptr %a1 + %t29 = icmp eq ptr %t28, null + br i1 %t29, label %panic8312, label %ok8313 +panic8312: + call void @finch_panic(ptr @.str.5632, i64 375, ptr @.str.5633) + unreachable +ok8313: + %t30 = getelementptr inbounds %S.cimport.Importer, ptr %t28, i32 0, i32 1 + %t31 = load ptr, ptr %t30 + %t32 = load i64, ptr %a17 + %t33 = load ptr, ptr %a3 + %t34 = getelementptr inbounds %S.C.CXToken, ptr %t33, i64 %t32 + %t35 = load %S.C.CXToken, ptr %t34 + store %S.C.CXToken %t35, ptr %a36 + %t37 = call { i64, i64 } @clang_getTokenSpelling(ptr %t31, ptr byval(%S.C.CXToken) align 8 %a36) + store { i64, i64 } %t37, ptr %a38 + %t39 = load %S.C.CXString, ptr %a38 + %t40 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t39) + %t41 = load i64, ptr %t27 + %t42 = add i64 %t41, 1 + call void @finch_arr_reserve(ptr %a14, i64 %t42, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t43 = load ptr, ptr %a14 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i64 %t41 + store { ptr, i64, i64 } %t40, ptr %t44 + store i64 %t42, ptr %t27 + br label %for.step8307 +for.step8307: + %t45 = load i64, ptr %a17 + %t46 = add i64 %t45, 1 + store i64 %t46, ptr %a17 + br label %for.cond8305 +for.end8308: + %t47 = load ptr, ptr %a1 + %t48 = icmp eq ptr %t47, null + br i1 %t48, label %panic8314, label %ok8315 +panic8314: + call void @finch_panic(ptr @.str.5634, i64 377, ptr @.str.5635) + unreachable +ok8315: + %t49 = getelementptr inbounds %S.cimport.Importer, ptr %t47, i32 0, i32 1 + %t50 = load ptr, ptr %t49 + %t51 = load ptr, ptr %a3 + %t52 = load i32, ptr %a4 + call void @clang_disposeTokens(ptr %t50, ptr %t51, i32 %t52) + br label %while.cond8316 +while.cond8316: + %t53 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t54 = load i64, ptr %t53 + %t55 = icmp sge i64 %t54, 2 + br label %logic.from8319 +logic.from8319: + br i1 %t55, label %logic.rhs8320, label %logic.end8321 +logic.rhs8320: + %t56 = load { ptr, i64, i64 }, ptr %a14 + %t57 = extractvalue { ptr, i64, i64 } %t56, 1 + %t58 = icmp uge i64 0, %t57 + br i1 %t58, label %range8322, label %inrange8323 +range8322: + call void @finch_panic_index(ptr @.str.5636, i64 379, i64 0, i64 %t57) + unreachable +inrange8323: + %t59 = extractvalue { ptr, i64, i64 } %t56, 0 + %t60 = getelementptr inbounds { ptr, i64, i64 }, ptr %t59, i64 0 + %t61 = load { ptr, i64, i64 }, ptr %t60 + store { ptr, i64, i64 } %t61, ptr %a62 + store { ptr, i64, i64 } { ptr @.str.5637, i64 1, i64 0 }, ptr %a63 + %t64 = call i32 @finch_str_eq(ptr %a62, ptr %a63) + %t65 = icmp ne i32 %t64, 0 + br label %logic.rend8324 +logic.rend8324: + br label %logic.end8321 +logic.end8321: + %t66 = phi i1 [ false, %logic.from8319 ], [ %t65, %logic.rend8324 ] + br label %logic.from8325 +logic.from8325: + br i1 %t66, label %logic.rhs8326, label %logic.end8327 +logic.rhs8326: + %t67 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t68 = load i64, ptr %t67 + %t69 = sub i64 %t68, 1 + %t70 = load { ptr, i64, i64 }, ptr %a14 + %t71 = extractvalue { ptr, i64, i64 } %t70, 1 + %t72 = icmp uge i64 %t69, %t71 + br i1 %t72, label %range8328, label %inrange8329 +range8328: + call void @finch_panic_index(ptr @.str.5638, i64 379, i64 %t69, i64 %t71) + unreachable +inrange8329: + %t73 = extractvalue { ptr, i64, i64 } %t70, 0 + %t74 = getelementptr inbounds { ptr, i64, i64 }, ptr %t73, i64 %t69 + %t75 = load { ptr, i64, i64 }, ptr %t74 + store { ptr, i64, i64 } %t75, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.5639, i64 1, i64 0 }, ptr %a77 + %t78 = call i32 @finch_str_eq(ptr %a76, ptr %a77) + %t79 = icmp ne i32 %t78, 0 + br label %logic.rend8330 +logic.rend8330: + br label %logic.end8327 +logic.end8327: + %t80 = phi i1 [ false, %logic.from8325 ], [ %t79, %logic.rend8330 ] + br i1 %t80, label %while.body8317, label %while.end8318 +while.body8317: + %t81 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t82 = load i64, ptr %t81 + %t83 = icmp uge i64 0, %t82 + br i1 %t83, label %range8331, label %inrange8332 +range8331: + call void @finch_panic_index(ptr @.str.5640, i64 380, i64 0, i64 %t82) + unreachable +inrange8332: + %t84 = load ptr, ptr %a14 + %t85 = getelementptr inbounds { ptr, i64, i64 }, ptr %t84, i64 0 + %t86 = load { ptr, i64, i64 }, ptr %t85 + call void @finch_arr_remove_gap(ptr %a14, i64 0, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t87 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t88 = load i64, ptr %t87 + %t89 = icmp eq i64 %t88, 0 + br i1 %t89, label %panic8333, label %ok8334 +panic8333: + call void @finch_panic(ptr @.str.5641, i64 381, ptr @.str.5642) + unreachable +ok8334: + %t90 = sub i64 %t88, 1 + %t91 = load ptr, ptr %a14 + %t92 = getelementptr inbounds { ptr, i64, i64 }, ptr %t91, i64 %t90 + %t93 = load { ptr, i64, i64 }, ptr %t92 + store i64 %t90, ptr %t87 + br label %while.cond8316 +while.end8318: + store i1 false, ptr %a94 + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t96 = load i64, ptr %t95 + %t97 = icmp eq i64 %t96, 2 + br label %logic.from8335 +logic.from8335: + br i1 %t97, label %logic.rhs8336, label %logic.end8337 +logic.rhs8336: + %t98 = load { ptr, i64, i64 }, ptr %a14 + %t99 = extractvalue { ptr, i64, i64 } %t98, 1 + %t100 = icmp uge i64 0, %t99 + br i1 %t100, label %range8338, label %inrange8339 +range8338: + call void @finch_panic_index(ptr @.str.5643, i64 384, i64 0, i64 %t99) + unreachable +inrange8339: + %t101 = extractvalue { ptr, i64, i64 } %t98, 0 + %t102 = getelementptr inbounds { ptr, i64, i64 }, ptr %t101, i64 0 + %t103 = load { ptr, i64, i64 }, ptr %t102 + store { ptr, i64, i64 } %t103, ptr %a104 + store { ptr, i64, i64 } { ptr @.str.5644, i64 1, i64 0 }, ptr %a105 + %t106 = call i32 @finch_str_eq(ptr %a104, ptr %a105) + %t107 = icmp ne i32 %t106, 0 + br label %logic.rend8340 +logic.rend8340: + br label %logic.end8337 +logic.end8337: + %t108 = phi i1 [ false, %logic.from8335 ], [ %t107, %logic.rend8340 ] + br i1 %t108, label %then8341, label %endif8343 +then8341: + store i1 true, ptr %a94 + %t109 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t110 = load i64, ptr %t109 + %t111 = icmp uge i64 0, %t110 + br i1 %t111, label %range8344, label %inrange8345 +range8344: + call void @finch_panic_index(ptr @.str.5645, i64 386, i64 0, i64 %t110) + unreachable +inrange8345: + %t112 = load ptr, ptr %a14 + %t113 = getelementptr inbounds { ptr, i64, i64 }, ptr %t112, i64 0 + %t114 = load { ptr, i64, i64 }, ptr %t113 + call void @finch_arr_remove_gap(ptr %a14, i64 0, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + br label %endif8343 +endif8343: + %t115 = getelementptr inbounds { ptr, i64, i64 }, ptr %a14, i32 0, i32 1 + %t116 = load i64, ptr %t115 + %t117 = icmp ne i64 %t116, 1 + br i1 %t117, label %then8346, label %endif8348 +then8346: + ret %S.cimport.Number zeroinitializer +endif8348: + %t118 = load { ptr, i64, i64 }, ptr %a14 + %t119 = extractvalue { ptr, i64, i64 } %t118, 1 + %t120 = icmp uge i64 0, %t119 + br i1 %t120, label %range8349, label %inrange8350 +range8349: + call void @finch_panic_index(ptr @.str.5646, i64 391, i64 0, i64 %t119) + unreachable +inrange8350: + %t121 = extractvalue { ptr, i64, i64 } %t118, 0 + %t122 = getelementptr inbounds { ptr, i64, i64 }, ptr %t121, i64 0 + %t123 = load { ptr, i64, i64 }, ptr %t122 + store { ptr, i64, i64 } %t123, ptr %a124 + call void @finch_str_copy(ptr %a125, ptr %a124) + %t126 = load { ptr, i64, i64 }, ptr %a125 + store { ptr, i64, i64 } %t126, ptr %a127 + %t128 = getelementptr inbounds { ptr, i64, i64 }, ptr %a127, i32 0, i32 1 + %t129 = load i64, ptr %t128 + %t130 = icmp eq i64 %t129, 0 + br label %logic.from8351 +logic.from8351: + br i1 %t130, label %logic.end8353, label %logic.rhs8352 +logic.rhs8352: + %t131 = load { ptr, i64, i64 }, ptr %a127 + %t132 = extractvalue { ptr, i64, i64 } %t131, 1 + %t133 = icmp uge i64 0, %t132 + br i1 %t133, label %range8354, label %inrange8355 +range8354: + call void @finch_panic_index(ptr @.str.5647, i64 392, i64 0, i64 %t132) + unreachable +inrange8355: + %t134 = extractvalue { ptr, i64, i64 } %t131, 0 + %t135 = getelementptr inbounds i8, ptr %t134, i64 0 + %t136 = load i8, ptr %t135 + %t137 = icmp uge i8 %t136, 48 + br label %logic.from8356 +logic.from8356: + br i1 %t137, label %logic.rhs8357, label %logic.end8358 +logic.rhs8357: + %t138 = load { ptr, i64, i64 }, ptr %a127 + %t139 = extractvalue { ptr, i64, i64 } %t138, 1 + %t140 = icmp uge i64 0, %t139 + br i1 %t140, label %range8359, label %inrange8360 +range8359: + call void @finch_panic_index(ptr @.str.5648, i64 392, i64 0, i64 %t139) + unreachable +inrange8360: + %t141 = extractvalue { ptr, i64, i64 } %t138, 0 + %t142 = getelementptr inbounds i8, ptr %t141, i64 0 + %t143 = load i8, ptr %t142 + %t144 = icmp ule i8 %t143, 57 + br label %logic.rend8361 +logic.rend8361: + br label %logic.end8358 +logic.end8358: + %t145 = phi i1 [ false, %logic.from8356 ], [ %t144, %logic.rend8361 ] + br label %logic.from8362 +logic.from8362: + br i1 %t145, label %logic.end8364, label %logic.rhs8363 +logic.rhs8363: + %t146 = load { ptr, i64, i64 }, ptr %a127 + %t147 = extractvalue { ptr, i64, i64 } %t146, 1 + %t148 = icmp uge i64 0, %t147 + br i1 %t148, label %range8365, label %inrange8366 +range8365: + call void @finch_panic_index(ptr @.str.5649, i64 392, i64 0, i64 %t147) + unreachable +inrange8366: + %t149 = extractvalue { ptr, i64, i64 } %t146, 0 + %t150 = getelementptr inbounds i8, ptr %t149, i64 0 + %t151 = load i8, ptr %t150 + %t152 = icmp eq i8 %t151, 46 + br label %logic.rend8367 +logic.rend8367: + br label %logic.end8364 +logic.end8364: + %t153 = phi i1 [ true, %logic.from8362 ], [ %t152, %logic.rend8367 ] + %t154 = xor i1 %t153, true + br label %logic.rend8368 +logic.rend8368: + br label %logic.end8353 +logic.end8353: + %t155 = phi i1 [ true, %logic.from8351 ], [ %t154, %logic.rend8368 ] + br i1 %t155, label %then8369, label %endif8371 +then8369: + ret %S.cimport.Number zeroinitializer +endif8371: + %t156 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t156, ptr %a157 + store { ptr, i64, i64 } { ptr @.str.5651, i64 1, i64 0 }, ptr %a159 + %t160 = call i64 @finch_str_find(ptr %a157, ptr %a159) + %t161 = icmp sge i64 %t160, 0 + br label %logic.from8372 +logic.from8372: + br i1 %t161, label %logic.end8374, label %logic.rhs8373 +logic.rhs8373: + %t162 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t162, ptr %a163 + store { ptr, i64, i64 } { ptr @.str.5653, i64 1, i64 0 }, ptr %a165 + %t166 = call i64 @finch_str_find(ptr %a163, ptr %a165) + %t167 = icmp sge i64 %t166, 0 + br label %logic.rend8375 +logic.rend8375: + br label %logic.end8374 +logic.end8374: + %t168 = phi i1 [ true, %logic.from8372 ], [ %t167, %logic.rend8375 ] + br label %logic.from8376 +logic.from8376: + br i1 %t168, label %logic.end8378, label %logic.rhs8377 +logic.rhs8377: + %t169 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t169, ptr %a170 + store { ptr, i64, i64 } { ptr @.str.5655, i64 1, i64 0 }, ptr %a172 + %t173 = call i64 @finch_str_find(ptr %a170, ptr %a172) + %t174 = icmp sge i64 %t173, 0 + br label %logic.rend8379 +logic.rend8379: + br label %logic.end8378 +logic.end8378: + %t175 = phi i1 [ true, %logic.from8376 ], [ %t174, %logic.rend8379 ] + br label %logic.from8380 +logic.from8380: + br i1 %t175, label %logic.rhs8381, label %logic.end8382 +logic.rhs8381: + %t176 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t176, ptr %a177 + store { ptr, i64, i64 } { ptr @.str.5657, i64 2, i64 0 }, ptr %a179 + %t180 = call i32 @finch_str_starts(ptr %a177, ptr %a179) + %t181 = icmp ne i32 %t180, 0 + %t182 = xor i1 %t181, true + br label %logic.rend8383 +logic.rend8383: + br label %logic.end8382 +logic.end8382: + %t183 = phi i1 [ false, %logic.from8380 ], [ %t182, %logic.rend8383 ] + store i1 %t183, ptr %a184 + %t185 = load i1, ptr %a184 + br i1 %t185, label %then8384, label %endif8386 +then8384: + %t186 = load { ptr, i64, i64 }, ptr %a127 + store { ptr, i64, i64 } %t186, ptr %a187 + call void @finch_str_copy(ptr %a188, ptr %a187) + %t189 = load { ptr, i64, i64 }, ptr %a188 + store { ptr, i64, i64 } %t189, ptr %a190 + br label %while.cond8387 +while.cond8387: + %t191 = getelementptr inbounds { ptr, i64, i64 }, ptr %a190, i32 0, i32 1 + %t192 = load i64, ptr %t191 + %t193 = icmp sgt i64 %t192, 0 + br label %logic.from8390 +logic.from8390: + br i1 %t193, label %logic.rhs8391, label %logic.end8392 +logic.rhs8391: + store { ptr, i64, i64 } { ptr @.str.5658, i64 4, i64 0 }, ptr %a194 + %t196 = getelementptr inbounds { ptr, i64, i64 }, ptr %a190, i32 0, i32 1 + %t197 = load i64, ptr %t196 + %t198 = sub i64 %t197, 1 + %t199 = load { ptr, i64, i64 }, ptr %a190 + %t200 = extractvalue { ptr, i64, i64 } %t199, 1 + %t201 = icmp uge i64 %t198, %t200 + br i1 %t201, label %range8393, label %inrange8394 +range8393: + call void @finch_panic_index(ptr @.str.5660, i64 398, i64 %t198, i64 %t200) + unreachable +inrange8394: + %t202 = extractvalue { ptr, i64, i64 } %t199, 0 + %t203 = getelementptr inbounds i8, ptr %t202, i64 %t198 + %t204 = load i8, ptr %t203 + call void @finch_str_from_char(ptr %a205, i8 signext %t204) + %t206 = load { ptr, i64, i64 }, ptr %a205 + store { ptr, i64, i64 } %t206, ptr %a207 + %t208 = call i64 @finch_str_find(ptr %a194, ptr %a207) + %t209 = icmp sge i64 %t208, 0 + br label %logic.rend8395 +logic.rend8395: + br label %logic.end8392 +logic.end8392: + %t210 = phi i1 [ false, %logic.from8390 ], [ %t209, %logic.rend8395 ] + br i1 %t210, label %while.body8388, label %while.end8389 +while.body8388: + %t211 = load { ptr, i64, i64 }, ptr %a190 + store { ptr, i64, i64 } %t211, ptr %a212 + %t214 = getelementptr inbounds { ptr, i64, i64 }, ptr %a190, i32 0, i32 1 + %t215 = load i64, ptr %t214 + %t216 = sub i64 %t215, 1 + call void @finch_str_sub(ptr %a213, ptr %a212, i64 0, i64 %t216, ptr @.str.5661, i64 399) + %t217 = load { ptr, i64, i64 }, ptr %a213 + store { ptr, i64, i64 } %t217, ptr %a190 + br label %while.cond8387 +while.end8389: + %t218 = load { ptr, i64, i64 }, ptr %a190 + store { ptr, i64, i64 } zeroinitializer, ptr %a219 + store double 0.0, ptr %a220 + store { ptr, i64, i64 } %t218, ptr %a221 + %t222 = call i32 @finch_str_try_float(ptr %a221, ptr %a220, ptr %a219) + %t223 = icmp eq i32 %t222, 0 + %t224 = load { ptr, i64, i64 }, ptr %a219 + %t225 = load double, ptr %a220 + br i1 %t223, label %or.failed8396, label %or.ok8397 +or.failed8396: + store { ptr, i64, i64 } %t224, ptr %a226 + ret %S.cimport.Number zeroinitializer +or.ok8397: + store double %t225, ptr %a227 + %t228 = load i1, ptr %a94 + br i1 %t228, label %then8398, label %endif8400 +then8398: + %t229 = load double, ptr %a227 + %t230 = fsub double 0.0, %t229 + store double %t230, ptr %a227 + br label %endif8400 +endif8400: + %t231 = insertvalue %S.cimport.CConst zeroinitializer, i1 true, 0 + %t232 = load double, ptr %a227 + %t233 = insertvalue %S.cimport.CConst %t231, double %t232, 2 + %t234 = load { ptr, i64, i64 }, ptr %a190 + store { ptr, i64, i64 } %t234, ptr %a235 + call void @finch_str_copy(ptr %a236, ptr %a235) + %t237 = load { ptr, i64, i64 }, ptr %a236 + %t238 = insertvalue %S.cimport.CConst %t233, { ptr, i64, i64 } %t237, 3 + %t239 = insertvalue %S.cimport.Number zeroinitializer, %S.cimport.CConst %t238, 0 + %t240 = insertvalue %S.cimport.Number %t239, i1 true, 1 + ret %S.cimport.Number %t240 +endif8386: + %t241 = load { ptr, i64, i64 }, ptr %a127 + %t242 = call %S.cimport.Number @finch.cimport.parseInt({ ptr, i64, i64 } %t241) + store %S.cimport.Number %t242, ptr %a243 + %t244 = getelementptr inbounds %S.cimport.Number, ptr %a243, i32 0, i32 1 + %t245 = load i1, ptr %t244 + br label %logic.from8401 +logic.from8401: + br i1 %t245, label %logic.rhs8402, label %logic.end8403 +logic.rhs8402: + %t246 = load i1, ptr %a94 + br label %logic.rend8404 +logic.rend8404: + br label %logic.end8403 +logic.end8403: + %t247 = phi i1 [ false, %logic.from8401 ], [ %t246, %logic.rend8404 ] + br i1 %t247, label %then8405, label %endif8407 +then8405: + %t248 = getelementptr inbounds %S.cimport.Number, ptr %a243, i32 0, i32 0 + %t249 = getelementptr inbounds %S.cimport.CConst, ptr %t248, i32 0, i32 1 + %t250 = load i64, ptr %t249 + %t251 = sub i64 0, %t250 + %t252 = getelementptr inbounds %S.cimport.Number, ptr %a243, i32 0, i32 0 + %t253 = getelementptr inbounds %S.cimport.CConst, ptr %t252, i32 0, i32 1 + store i64 %t251, ptr %t253 + br label %endif8407 +endif8407: + %t254 = load %S.cimport.Number, ptr %a243 + store %S.cimport.Number %t254, ptr %a255 + call void @finch.copy.S_cimport_Number(ptr %a256, ptr %a255) + %t257 = load %S.cimport.Number, ptr %a256 + ret %S.cimport.Number %t257 +} + +define internal i32 @finch.cimport.visitTop(%S.C.CXCursor %p0, %S.C.CXCursor %p1, ptr %p2) { +entry: + %a1 = alloca %S.C.CXCursor, align 16 + %a2 = alloca %S.C.CXCursor, align 16 + %a3 = alloca ptr, align 16 + %a5 = alloca ptr, align 16 + store %S.C.CXCursor %p0, ptr %a1 + store %S.C.CXCursor %p1, ptr %a2 + store ptr %p2, ptr %a3 + %t4 = load ptr, ptr %a3 + store ptr %t4, ptr %a5 + %t6 = load ptr, ptr %a5 + %t7 = load %S.C.CXCursor, ptr %a1 + call void @finch.cimport.visit(ptr %t6, %S.C.CXCursor %t7) + ret i32 1 +} + +define internal i32 @finch.c.cimport.visitTop(ptr byval(%S.C.CXCursor) align 8 %c0, ptr byval(%S.C.CXCursor) align 8 %c1, ptr %c2) { +entry: + + %t1 = load %S.C.CXCursor, ptr %c0 + %t2 = load %S.C.CXCursor, ptr %c1 + %t3 = call i32 @finch.cimport.visitTop(%S.C.CXCursor %t1, %S.C.CXCursor %t2, ptr %c2) + ret i32 %t3 +} + +define internal void @finch.cimport.visit(ptr %p0, %S.C.CXCursor %p1) { +entry: + %a1 = alloca ptr, align 16 + %a2 = alloca %S.C.CXCursor, align 16 + %a4 = alloca %S.C.CXCursor, align 16 + %a6 = alloca [32 x i8], align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca %S.C.CXCursor, align 16 + %a13 = alloca i32, align 16 + %a16 = alloca %S.C.CXType, align 16 + %a17 = alloca %S.C.CXType, align 16 + %a19 = alloca %S.C.CXCursor, align 16 + %a21 = alloca %S.C.CXType, align 16 + %a23 = alloca %S.C.CXType, align 16 + %a27 = alloca %S.C.CXCursor, align 16 + %a29 = alloca %S.C.CXType, align 16 + %a31 = alloca %S.C.CXCursor, align 16 + %a33 = alloca [32 x i8], align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca i1, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca i32, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca %S.cimport.CFunc, align 16 + %a123 = alloca %S.C.CXCursor, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca i32, align 16 + %a144 = alloca %S.cimport.CFunc, align 16 + %a145 = alloca %S.cimport.CFunc, align 16 + %a147 = alloca %S.C.CXType, align 16 + %a148 = alloca %S.C.CXType, align 16 + %a150 = alloca %S.C.CXCursor, align 16 + %a152 = alloca %S.C.CXType, align 16 + %a154 = alloca %S.C.CXType, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca i32, align 16 + %a176 = alloca %S.cimport.CFunc, align 16 + %a177 = alloca %S.cimport.CFunc, align 16 + %a180 = alloca %S.C.CXType, align 16 + %a182 = alloca %S.C.CXType, align 16 + %a185 = alloca %S.cimport.Mapped, align 16 + %a191 = alloca %S.ast.Type, align 16 + %a192 = alloca %S.ast.Type, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca %S.C.CXType, align 16 + %a204 = alloca i64, align 16 + %a206 = alloca i64, align 16 + %a214 = alloca %S.C.CXType, align 16 + %a216 = alloca %S.C.CXType, align 16 + %a221 = alloca %S.cimport.Mapped, align 16 + %a228 = alloca %S.ast.Type, align 16 + %a229 = alloca %S.ast.Type, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca %S.C.CXType, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca i32, align 16 + %a265 = alloca %S.cimport.CFunc, align 16 + %a266 = alloca %S.cimport.CFunc, align 16 + %a271 = alloca %S.C.CXCursor, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca %S.C.CXType, align 16 + %a286 = alloca %S.C.CXCursor, align 16 + %a289 = alloca %S.cimport.Mapped, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca i32, align 16 + %a310 = alloca %S.ast.Type, align 16 + %a311 = alloca %S.ast.Type, align 16 + %a316 = alloca %S.C.CXCursor, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca %S.C.CXCursor, align 16 + %a334 = alloca [32 x i8], align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a351 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca i32, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca %S.C.CXCursor, align 16 + %a378 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca %S.C.CXCursor, align 16 + %a391 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca i32, align 16 + %a405 = alloca %S.C.CXCursor, align 16 + %a409 = alloca %S.C.CXCursor, align 16 + %a416 = alloca %S.cimport.Number, align 16 + %a424 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca i32, align 16 + %a447 = alloca %S.cimport.CConst, align 16 + %a448 = alloca %S.cimport.CConst, align 16 + store ptr %p0, ptr %a1 + store %S.C.CXCursor %p1, ptr %a2 + %t3 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t3, ptr %a4 + %t5 = call { i64, i64 } @clang_getCursorSpelling(ptr byval(%S.C.CXCursor) align 8 %a4) + store { i64, i64 } %t5, ptr %a6 + %t7 = load %S.C.CXString, ptr %a6 + %t8 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t7) + store { ptr, i64, i64 } %t8, ptr %a9 + %t10 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t10, ptr %a11 + %t12 = call i32 @clang_getCursorKind(ptr byval(%S.C.CXCursor) align 8 %a11) + store i32 %t12, ptr %a13 + %t14 = load i32, ptr %a13 + %t15 = icmp eq i32 %t14, 20 + br i1 %t15, label %then8408, label %else8409 +then8408: + %t18 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t18, ptr %a19 + call void @clang_getTypedefDeclUnderlyingType(ptr sret(%S.C.CXType) align 16 %a17, ptr byval(%S.C.CXCursor) align 8 %a19) + %t20 = load %S.C.CXType, ptr %a17 + store %S.C.CXType %t20, ptr %a21 + call void @clang_getCanonicalType(ptr sret(%S.C.CXType) align 16 %a16, ptr byval(%S.C.CXType) align 8 %a21) + %t22 = load %S.C.CXType, ptr %a16 + store %S.C.CXType %t22, ptr %a23 + %t24 = getelementptr inbounds %S.C.CXType, ptr %a23, i32 0, i32 0 + %t25 = load i32, ptr %t24 + %t26 = icmp eq i32 %t25, 105 + br i1 %t26, label %then8411, label %endif8413 +then8411: + %t28 = load %S.C.CXType, ptr %a23 + store %S.C.CXType %t28, ptr %a29 + call void @clang_getTypeDeclaration(ptr sret(%S.C.CXCursor) align 16 %a27, ptr byval(%S.C.CXType) align 8 %a29) + %t30 = load %S.C.CXCursor, ptr %a27 + store %S.C.CXCursor %t30, ptr %a31 + %t32 = call { i64, i64 } @clang_getCursorUSR(ptr byval(%S.C.CXCursor) align 8 %a31) + store { i64, i64 } %t32, ptr %a33 + %t34 = load %S.C.CXString, ptr %a33 + %t35 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t34) + store { ptr, i64, i64 } %t35, ptr %a36 + %t37 = load ptr, ptr %a1 + %t38 = icmp eq ptr %t37, null + br i1 %t38, label %panic8414, label %ok8415 +panic8414: + call void @finch_panic(ptr @.str.5662, i64 433, ptr @.str.5663) + unreachable +ok8415: + %t39 = getelementptr inbounds %S.cimport.Importer, ptr %t37, i32 0, i32 3 + %t40 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t40, ptr %a41 + %t42 = call i64 @finch_map_find(ptr %t39, ptr %a41, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t43 = icmp sge i64 %t42, 0 + br label %logic.from8416 +logic.from8416: + br i1 %t43, label %logic.rhs8417, label %logic.end8418 +logic.rhs8417: + %t44 = load ptr, ptr %a1 + %t45 = icmp eq ptr %t44, null + br i1 %t45, label %panic8419, label %ok8420 +panic8419: + call void @finch_panic(ptr @.str.5664, i64 433, ptr @.str.5665) + unreachable +ok8420: + %t46 = getelementptr inbounds %S.cimport.Importer, ptr %t44, i32 0, i32 0 + %t47 = getelementptr inbounds %S.cimport.CImports, ptr %t46, i32 0, i32 3 + %t48 = load ptr, ptr %a1 + %t49 = icmp eq ptr %t48, null + br i1 %t49, label %panic8421, label %ok8422 +panic8421: + call void @finch_panic(ptr @.str.5666, i64 433, ptr @.str.5667) + unreachable +ok8422: + %t50 = getelementptr inbounds %S.cimport.Importer, ptr %t48, i32 0, i32 3 + %t51 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t51, ptr %a52 + %t53 = call i64 @finch_map_find(ptr %t50, ptr %a52, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t54 = icmp slt i64 %t53, 0 + br i1 %t54, label %map.missing8423, label %map.found8424 +map.missing8423: + store { ptr, i64, i64 } zeroinitializer, ptr %a55 + store { ptr, i64, i64 } %t51, ptr %a56 + call void @finch_buf_str(ptr %a55, ptr %a56, i32 1) + call void @finch_map_missing(ptr @.str.5668, i64 433, ptr %a55) + unreachable +map.found8424: + %t57 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t50, i32 0, i32 0 + %t58 = load ptr, ptr %t57 + %t59 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t58, i64 %t53 + %t60 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t59, i32 0, i32 2 + %t61 = load { ptr, i64, i64 }, ptr %t60 + store { ptr, i64, i64 } %t61, ptr %a62 + %t63 = call i64 @finch_map_find(ptr %t47, ptr %a62, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t64 = icmp sge i64 %t63, 0 + br label %logic.rend8425 +logic.rend8425: + br label %logic.end8418 +logic.end8418: + %t65 = phi i1 [ false, %logic.from8416 ], [ %t64, %logic.rend8425 ] + store i1 %t65, ptr %a66 + %t67 = load i1, ptr %a66 + %t68 = xor i1 %t67, true + br label %logic.from8426 +logic.from8426: + br i1 %t68, label %logic.rhs8427, label %logic.end8428 +logic.rhs8427: + %t69 = load ptr, ptr %a1 + %t70 = icmp eq ptr %t69, null + br i1 %t70, label %panic8429, label %ok8430 +panic8429: + call void @finch_panic(ptr @.str.5669, i64 434, ptr @.str.5670) + unreachable +ok8430: + %t71 = getelementptr inbounds %S.cimport.Importer, ptr %t69, i32 0, i32 0 + %t72 = getelementptr inbounds %S.cimport.CImports, ptr %t71, i32 0, i32 3 + %t73 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t73, ptr %a74 + %t75 = call i64 @finch_map_find(ptr %t72, ptr %a74, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CStruct }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t76 = icmp sge i64 %t75, 0 + %t77 = xor i1 %t76, true + br label %logic.rend8431 +logic.rend8431: + br label %logic.end8428 +logic.end8428: + %t78 = phi i1 [ false, %logic.from8426 ], [ %t77, %logic.rend8431 ] + br i1 %t78, label %then8432, label %endif8434 +then8432: + %t79 = load { ptr, i64, i64 }, ptr %a9 + %t80 = load ptr, ptr %a1 + %t81 = icmp eq ptr %t80, null + br i1 %t81, label %panic8435, label %ok8436 +panic8435: + call void @finch_panic(ptr @.str.5671, i64 435, ptr @.str.5672) + unreachable +ok8436: + %t82 = getelementptr inbounds %S.cimport.Importer, ptr %t80, i32 0, i32 3 + %t83 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t83, ptr %a84 + store i32 0, ptr %a85 + %t86 = call i64 @finch_map_slot(ptr %t82, ptr %a84, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a85) + %t87 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t82, i32 0, i32 0 + %t88 = load ptr, ptr %t87 + %t89 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t88, i64 %t86 + %t90 = load i32, ptr %a85 + %t91 = icmp ne i32 %t90, 0 + br i1 %t91, label %map.new8437, label %map.have8438 +map.new8437: + %t92 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t89, i32 0, i32 1 + call void @finch_str_copy(ptr %t92, ptr %a84) + %t93 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t89, i32 0, i32 2 + store { ptr, i64, i64 } zeroinitializer, ptr %t93 + br label %map.have8438 +map.have8438: + %t94 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t89, i32 0, i32 2 + store { ptr, i64, i64 } %t79, ptr %a95 + call void @finch_str_copy(ptr %a96, ptr %a95) + %t97 = load { ptr, i64, i64 }, ptr %a96 + store { ptr, i64, i64 } %t97, ptr %t94 + br label %endif8434 +endif8434: + br label %endif8413 +endif8413: + br label %endif8410 +else8409: + %t98 = load i32, ptr %a13 + %t99 = icmp eq i32 %t98, 8 + br i1 %t99, label %then8439, label %else8440 +then8439: + %t100 = load ptr, ptr %a1 + %t101 = icmp eq ptr %t100, null + br i1 %t101, label %panic8442, label %ok8443 +panic8442: + call void @finch_panic(ptr @.str.5673, i64 439, ptr @.str.5674) + unreachable +ok8443: + %t102 = getelementptr inbounds %S.cimport.Importer, ptr %t100, i32 0, i32 0 + %t103 = getelementptr inbounds %S.cimport.CImports, ptr %t102, i32 0, i32 0 + %t104 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t104, ptr %a105 + %t106 = call i64 @finch_map_find(ptr %t103, ptr %a105, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t107 = icmp sge i64 %t106, 0 + br i1 %t107, label %then8444, label %endif8446 +then8444: + ret void +endif8446: + %t108 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t108, ptr %a109 + call void @finch_str_copy(ptr %a110, ptr %a109) + %t111 = load { ptr, i64, i64 }, ptr %a110 + %t112 = insertvalue %S.cimport.CFunc zeroinitializer, { ptr, i64, i64 } %t111, 0 + %t113 = load ptr, ptr %a1 + %t114 = icmp eq ptr %t113, null + br i1 %t114, label %panic8447, label %ok8448 +panic8447: + call void @finch_panic(ptr @.str.5675, i64 442, ptr @.str.5676) + unreachable +ok8448: + %t115 = getelementptr inbounds %S.cimport.Importer, ptr %t113, i32 0, i32 2 + %t116 = load { ptr, i64, i64 }, ptr %t115 + store { ptr, i64, i64 } %t116, ptr %a117 + call void @finch_str_copy(ptr %a118, ptr %a117) + %t119 = load { ptr, i64, i64 }, ptr %a118 + %t120 = insertvalue %S.cimport.CFunc %t112, { ptr, i64, i64 } %t119, 1 + store %S.cimport.CFunc %t120, ptr %a121 + %t122 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t122, ptr %a123 + %t124 = call i32 @clang_Cursor_getStorageClass(ptr byval(%S.C.CXCursor) align 8 %a123) + %t125 = icmp eq i32 %t124, 3 + br i1 %t125, label %then8449, label %endif8451 +then8449: + %t126 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 5 + store { ptr, i64, i64 } { ptr @.str.5677, i64 62, i64 0 }, ptr %t126 + %t127 = load %S.cimport.CFunc, ptr %a121 + %t128 = load ptr, ptr %a1 + %t129 = icmp eq ptr %t128, null + br i1 %t129, label %panic8452, label %ok8453 +panic8452: + call void @finch_panic(ptr @.str.5678, i64 445, ptr @.str.5679) + unreachable +ok8453: + %t130 = getelementptr inbounds %S.cimport.Importer, ptr %t128, i32 0, i32 0 + %t131 = getelementptr inbounds %S.cimport.CImports, ptr %t130, i32 0, i32 0 + %t132 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t132, ptr %a133 + store i32 0, ptr %a134 + %t135 = call i64 @finch_map_slot(ptr %t131, ptr %a133, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a134) + %t136 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t131, i32 0, i32 0 + %t137 = load ptr, ptr %t136 + %t138 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t137, i64 %t135 + %t139 = load i32, ptr %a134 + %t140 = icmp ne i32 %t139, 0 + br i1 %t140, label %map.new8454, label %map.have8455 +map.new8454: + %t141 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t138, i32 0, i32 1 + call void @finch_str_copy(ptr %t141, ptr %a133) + %t142 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t138, i32 0, i32 2 + store %S.cimport.CFunc zeroinitializer, ptr %t142 + br label %map.have8455 +map.have8455: + %t143 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t138, i32 0, i32 2 + store %S.cimport.CFunc %t127, ptr %a144 + call void @finch.copy.S_cimport_CFunc(ptr %a145, ptr %a144) + %t146 = load %S.cimport.CFunc, ptr %a145 + store %S.cimport.CFunc %t146, ptr %t143 + ret void +endif8451: + %t149 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t149, ptr %a150 + call void @clang_getCursorType(ptr sret(%S.C.CXType) align 16 %a148, ptr byval(%S.C.CXCursor) align 8 %a150) + %t151 = load %S.C.CXType, ptr %a148 + store %S.C.CXType %t151, ptr %a152 + call void @clang_getCanonicalType(ptr sret(%S.C.CXType) align 16 %a147, ptr byval(%S.C.CXType) align 8 %a152) + %t153 = load %S.C.CXType, ptr %a147 + store %S.C.CXType %t153, ptr %a154 + %t155 = getelementptr inbounds %S.C.CXType, ptr %a154, i32 0, i32 0 + %t156 = load i32, ptr %t155 + %t157 = icmp eq i32 %t156, 110 + br i1 %t157, label %then8456, label %endif8458 +then8456: + %t158 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 5 + store { ptr, i64, i64 } { ptr @.str.5680, i64 42, i64 0 }, ptr %t158 + %t159 = load %S.cimport.CFunc, ptr %a121 + %t160 = load ptr, ptr %a1 + %t161 = icmp eq ptr %t160, null + br i1 %t161, label %panic8459, label %ok8460 +panic8459: + call void @finch_panic(ptr @.str.5681, i64 451, ptr @.str.5682) + unreachable +ok8460: + %t162 = getelementptr inbounds %S.cimport.Importer, ptr %t160, i32 0, i32 0 + %t163 = getelementptr inbounds %S.cimport.CImports, ptr %t162, i32 0, i32 0 + %t164 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t164, ptr %a165 + store i32 0, ptr %a166 + %t167 = call i64 @finch_map_slot(ptr %t163, ptr %a165, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a166) + %t168 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t163, i32 0, i32 0 + %t169 = load ptr, ptr %t168 + %t170 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t169, i64 %t167 + %t171 = load i32, ptr %a166 + %t172 = icmp ne i32 %t171, 0 + br i1 %t172, label %map.new8461, label %map.have8462 +map.new8461: + %t173 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t170, i32 0, i32 1 + call void @finch_str_copy(ptr %t173, ptr %a165) + %t174 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t170, i32 0, i32 2 + store %S.cimport.CFunc zeroinitializer, ptr %t174 + br label %map.have8462 +map.have8462: + %t175 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t170, i32 0, i32 2 + store %S.cimport.CFunc %t159, ptr %a176 + call void @finch.copy.S_cimport_CFunc(ptr %a177, ptr %a176) + %t178 = load %S.cimport.CFunc, ptr %a177 + store %S.cimport.CFunc %t178, ptr %t175 + ret void +endif8458: + %t179 = load ptr, ptr %a1 + %t181 = load %S.C.CXType, ptr %a154 + store %S.C.CXType %t181, ptr %a182 + call void @clang_getResultType(ptr sret(%S.C.CXType) align 16 %a180, ptr byval(%S.C.CXType) align 8 %a182) + %t183 = load %S.C.CXType, ptr %a180 + %t184 = call %S.cimport.Mapped @finch.cimport.mapType(ptr %t179, %S.C.CXType %t183, i1 true, i1 false) + store %S.cimport.Mapped %t184, ptr %a185 + %t186 = getelementptr inbounds %S.cimport.Mapped, ptr %a185, i32 0, i32 2 + %t187 = load i1, ptr %t186 + br i1 %t187, label %then8463, label %else8464 +then8463: + %t188 = getelementptr inbounds %S.cimport.Mapped, ptr %a185, i32 0, i32 0 + %t189 = load %S.ast.Type, ptr %t188 + %t190 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 2 + store %S.ast.Type %t189, ptr %a191 + call void @finch.copy.S_ast_Type(ptr %a192, ptr %a191) + %t193 = load %S.ast.Type, ptr %a192 + store %S.ast.Type %t193, ptr %t190 + br label %endif8465 +else8464: + %t194 = getelementptr inbounds %S.cimport.Mapped, ptr %a185, i32 0, i32 1 + %t195 = load { ptr, i64, i64 }, ptr %t194 + %t196 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 5 + store { ptr, i64, i64 } %t195, ptr %a197 + call void @finch_str_copy(ptr %a198, ptr %a197) + %t199 = load { ptr, i64, i64 }, ptr %a198 + store { ptr, i64, i64 } %t199, ptr %t196 + br label %endif8465 +endif8465: + %t200 = load %S.C.CXType, ptr %a154 + store %S.C.CXType %t200, ptr %a201 + %t202 = call i32 @clang_getNumArgTypes(ptr byval(%S.C.CXType) align 8 %a201) + %t203 = sext i32 %t202 to i64 + store i64 %t203, ptr %a204 + %t205 = load i64, ptr %a204 + store i64 0, ptr %a206 + br label %for.cond8466 +for.cond8466: + %t207 = load i64, ptr %a206 + %t208 = icmp slt i64 %t207, %t205 + br i1 %t208, label %for.body8467, label %for.end8469 +for.body8467: + %t209 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 5 + %t210 = getelementptr inbounds { ptr, i64, i64 }, ptr %t209, i32 0, i32 1 + %t211 = load i64, ptr %t210 + %t212 = icmp sgt i64 %t211, 0 + br i1 %t212, label %then8470, label %endif8472 +then8470: + br label %for.end8469 +endif8472: + %t213 = load ptr, ptr %a1 + %t215 = load %S.C.CXType, ptr %a154 + store %S.C.CXType %t215, ptr %a216 + %t217 = load i64, ptr %a206 + %t218 = trunc i64 %t217 to i32 + call void @clang_getArgType(ptr sret(%S.C.CXType) align 16 %a214, ptr byval(%S.C.CXType) align 8 %a216, i32 %t218) + %t219 = load %S.C.CXType, ptr %a214 + %t220 = call %S.cimport.Mapped @finch.cimport.mapType(ptr %t213, %S.C.CXType %t219, i1 true, i1 true) + store %S.cimport.Mapped %t220, ptr %a221 + %t222 = getelementptr inbounds %S.cimport.Mapped, ptr %a221, i32 0, i32 2 + %t223 = load i1, ptr %t222 + br i1 %t223, label %then8473, label %else8474 +then8473: + %t224 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 3 + %t225 = getelementptr inbounds { ptr, i64, i64 }, ptr %t224, i32 0, i32 1 + %t226 = getelementptr inbounds %S.cimport.Mapped, ptr %a221, i32 0, i32 0 + %t227 = load %S.ast.Type, ptr %t226 + store %S.ast.Type %t227, ptr %a228 + call void @finch.copy.S_ast_Type(ptr %a229, ptr %a228) + %t230 = load %S.ast.Type, ptr %a229 + %t231 = load i64, ptr %t225 + %t232 = add i64 %t231, 1 + call void @finch_arr_reserve(ptr %t224, i64 %t232, i64 ptrtoint (ptr getelementptr (%S.ast.Type, ptr null, i32 1) to i64)) + %t233 = load ptr, ptr %t224 + %t234 = getelementptr inbounds %S.ast.Type, ptr %t233, i64 %t231 + store %S.ast.Type %t230, ptr %t234 + store i64 %t232, ptr %t225 + br label %endif8475 +else8474: + %t235 = getelementptr inbounds %S.cimport.Mapped, ptr %a221, i32 0, i32 1 + %t236 = load { ptr, i64, i64 }, ptr %t235 + %t237 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 5 + store { ptr, i64, i64 } %t236, ptr %a238 + call void @finch_str_copy(ptr %a239, ptr %a238) + %t240 = load { ptr, i64, i64 }, ptr %a239 + store { ptr, i64, i64 } %t240, ptr %t237 + br label %endif8475 +endif8475: + br label %for.step8468 +for.step8468: + %t241 = load i64, ptr %a206 + %t242 = add i64 %t241, 1 + store i64 %t242, ptr %a206 + br label %for.cond8466 +for.end8469: + %t243 = load %S.C.CXType, ptr %a154 + store %S.C.CXType %t243, ptr %a244 + %t245 = call i32 @clang_isFunctionTypeVariadic(ptr byval(%S.C.CXType) align 8 %a244) + %t246 = icmp ne i32 %t245, 0 + %t247 = getelementptr inbounds %S.cimport.CFunc, ptr %a121, i32 0, i32 4 + store i1 %t246, ptr %t247 + %t248 = load %S.cimport.CFunc, ptr %a121 + %t249 = load ptr, ptr %a1 + %t250 = icmp eq ptr %t249, null + br i1 %t250, label %panic8476, label %ok8477 +panic8476: + call void @finch_panic(ptr @.str.5683, i64 473, ptr @.str.5684) + unreachable +ok8477: + %t251 = getelementptr inbounds %S.cimport.Importer, ptr %t249, i32 0, i32 0 + %t252 = getelementptr inbounds %S.cimport.CImports, ptr %t251, i32 0, i32 0 + %t253 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t253, ptr %a254 + store i32 0, ptr %a255 + %t256 = call i64 @finch_map_slot(ptr %t252, ptr %a254, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a255) + %t257 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t252, i32 0, i32 0 + %t258 = load ptr, ptr %t257 + %t259 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t258, i64 %t256 + %t260 = load i32, ptr %a255 + %t261 = icmp ne i32 %t260, 0 + br i1 %t261, label %map.new8478, label %map.have8479 +map.new8478: + %t262 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t259, i32 0, i32 1 + call void @finch_str_copy(ptr %t262, ptr %a254) + %t263 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t259, i32 0, i32 2 + store %S.cimport.CFunc zeroinitializer, ptr %t263 + br label %map.have8479 +map.have8479: + %t264 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t259, i32 0, i32 2 + store %S.cimport.CFunc %t248, ptr %a265 + call void @finch.copy.S_cimport_CFunc(ptr %a266, ptr %a265) + %t267 = load %S.cimport.CFunc, ptr %a266 + store %S.cimport.CFunc %t267, ptr %t264 + br label %endif8441 +else8440: + %t268 = load i32, ptr %a13 + %t269 = icmp eq i32 %t268, 9 + br i1 %t269, label %then8480, label %else8481 +then8480: + %t270 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t270, ptr %a271 + %t272 = call i32 @clang_Cursor_getStorageClass(ptr byval(%S.C.CXCursor) align 8 %a271) + %t273 = icmp ne i32 %t272, 2 + br label %logic.from8483 +logic.from8483: + br i1 %t273, label %logic.end8485, label %logic.rhs8484 +logic.rhs8484: + %t274 = load ptr, ptr %a1 + %t275 = icmp eq ptr %t274, null + br i1 %t275, label %panic8486, label %ok8487 +panic8486: + call void @finch_panic(ptr @.str.5685, i64 475, ptr @.str.5686) + unreachable +ok8487: + %t276 = getelementptr inbounds %S.cimport.Importer, ptr %t274, i32 0, i32 0 + %t277 = getelementptr inbounds %S.cimport.CImports, ptr %t276, i32 0, i32 2 + %t278 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t278, ptr %a279 + %t280 = call i64 @finch_map_find(ptr %t277, ptr %a279, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.ast.Type }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t281 = icmp sge i64 %t280, 0 + br label %logic.rend8488 +logic.rend8488: + br label %logic.end8485 +logic.end8485: + %t282 = phi i1 [ true, %logic.from8483 ], [ %t281, %logic.rend8488 ] + br i1 %t282, label %then8489, label %endif8491 +then8489: + ret void +endif8491: + %t283 = load ptr, ptr %a1 + %t285 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t285, ptr %a286 + call void @clang_getCursorType(ptr sret(%S.C.CXType) align 16 %a284, ptr byval(%S.C.CXCursor) align 8 %a286) + %t287 = load %S.C.CXType, ptr %a284 + %t288 = call %S.cimport.Mapped @finch.cimport.mapType(ptr %t283, %S.C.CXType %t287, i1 false, i1 false) + store %S.cimport.Mapped %t288, ptr %a289 + %t290 = getelementptr inbounds %S.cimport.Mapped, ptr %a289, i32 0, i32 2 + %t291 = load i1, ptr %t290 + br i1 %t291, label %then8492, label %endif8494 +then8492: + %t292 = getelementptr inbounds %S.cimport.Mapped, ptr %a289, i32 0, i32 0 + %t293 = load %S.ast.Type, ptr %t292 + %t294 = load ptr, ptr %a1 + %t295 = icmp eq ptr %t294, null + br i1 %t295, label %panic8495, label %ok8496 +panic8495: + call void @finch_panic(ptr @.str.5687, i64 480, ptr @.str.5688) + unreachable +ok8496: + %t296 = getelementptr inbounds %S.cimport.Importer, ptr %t294, i32 0, i32 0 + %t297 = getelementptr inbounds %S.cimport.CImports, ptr %t296, i32 0, i32 2 + %t298 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t298, ptr %a299 + store i32 0, ptr %a300 + %t301 = call i64 @finch_map_slot(ptr %t297, ptr %a299, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.ast.Type }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a300) + %t302 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t297, i32 0, i32 0 + %t303 = load ptr, ptr %t302 + %t304 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t303, i64 %t301 + %t305 = load i32, ptr %a300 + %t306 = icmp ne i32 %t305, 0 + br i1 %t306, label %map.new8497, label %map.have8498 +map.new8497: + %t307 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t304, i32 0, i32 1 + call void @finch_str_copy(ptr %t307, ptr %a299) + %t308 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t304, i32 0, i32 2 + store %S.ast.Type zeroinitializer, ptr %t308 + br label %map.have8498 +map.have8498: + %t309 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.ast.Type }, ptr %t304, i32 0, i32 2 + store %S.ast.Type %t293, ptr %a310 + call void @finch.copy.S_ast_Type(ptr %a311, ptr %a310) + %t312 = load %S.ast.Type, ptr %a311 + store %S.ast.Type %t312, ptr %t309 + br label %endif8494 +endif8494: + br label %endif8482 +else8481: + %t313 = load i32, ptr %a13 + %t314 = icmp eq i32 %t313, 2 + br i1 %t314, label %then8499, label %else8500 +then8499: + %t315 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t315, ptr %a316 + %t317 = call i32 @clang_isCursorDefinition(ptr byval(%S.C.CXCursor) align 8 %a316) + %t318 = icmp ne i32 %t317, 0 + br label %logic.from8502 +logic.from8502: + br i1 %t318, label %logic.rhs8503, label %logic.end8504 +logic.rhs8503: + %t319 = getelementptr inbounds { ptr, i64, i64 }, ptr %a9, i32 0, i32 1 + %t320 = load i64, ptr %t319 + %t321 = icmp sgt i64 %t320, 0 + br label %logic.rend8505 +logic.rend8505: + br label %logic.end8504 +logic.end8504: + %t322 = phi i1 [ false, %logic.from8502 ], [ %t321, %logic.rend8505 ] + br label %logic.from8506 +logic.from8506: + br i1 %t322, label %logic.rhs8507, label %logic.end8508 +logic.rhs8507: + %t323 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t323, ptr %a324 + store { ptr, i64, i64 } { ptr @.str.5690, i64 1, i64 0 }, ptr %a326 + %t327 = call i64 @finch_str_find(ptr %a324, ptr %a326) + %t328 = icmp sge i64 %t327, 0 + %t329 = xor i1 %t328, true + br label %logic.rend8509 +logic.rend8509: + br label %logic.end8508 +logic.end8508: + %t330 = phi i1 [ false, %logic.from8506 ], [ %t329, %logic.rend8509 ] + br i1 %t330, label %then8510, label %endif8512 +then8510: + %t331 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t331, ptr %a332 + %t333 = call { i64, i64 } @clang_getCursorUSR(ptr byval(%S.C.CXCursor) align 8 %a332) + store { i64, i64 } %t333, ptr %a334 + %t335 = load %S.C.CXString, ptr %a334 + %t336 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t335) + store { ptr, i64, i64 } %t336, ptr %a337 + %t338 = load ptr, ptr %a1 + %t339 = icmp eq ptr %t338, null + br i1 %t339, label %panic8513, label %ok8514 +panic8513: + call void @finch_panic(ptr @.str.5691, i64 485, ptr @.str.5692) + unreachable +ok8514: + %t340 = getelementptr inbounds %S.cimport.Importer, ptr %t338, i32 0, i32 3 + %t341 = load { ptr, i64, i64 }, ptr %a337 + store { ptr, i64, i64 } %t341, ptr %a342 + %t343 = call i64 @finch_map_find(ptr %t340, ptr %a342, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t344 = icmp sge i64 %t343, 0 + %t345 = xor i1 %t344, true + br i1 %t345, label %then8515, label %endif8517 +then8515: + %t346 = load { ptr, i64, i64 }, ptr %a9 + %t347 = load ptr, ptr %a1 + %t348 = icmp eq ptr %t347, null + br i1 %t348, label %panic8518, label %ok8519 +panic8518: + call void @finch_panic(ptr @.str.5693, i64 486, ptr @.str.5694) + unreachable +ok8519: + %t349 = getelementptr inbounds %S.cimport.Importer, ptr %t347, i32 0, i32 3 + %t350 = load { ptr, i64, i64 }, ptr %a337 + store { ptr, i64, i64 } %t350, ptr %a351 + store i32 0, ptr %a352 + %t353 = call i64 @finch_map_slot(ptr %t349, ptr %a351, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a352) + %t354 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t349, i32 0, i32 0 + %t355 = load ptr, ptr %t354 + %t356 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t355, i64 %t353 + %t357 = load i32, ptr %a352 + %t358 = icmp ne i32 %t357, 0 + br i1 %t358, label %map.new8520, label %map.have8521 +map.new8520: + %t359 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t356, i32 0, i32 1 + call void @finch_str_copy(ptr %t359, ptr %a351) + %t360 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t356, i32 0, i32 2 + store { ptr, i64, i64 } zeroinitializer, ptr %t360 + br label %map.have8521 +map.have8521: + %t361 = getelementptr inbounds { i64, { ptr, i64, i64 }, { ptr, i64, i64 } }, ptr %t356, i32 0, i32 2 + store { ptr, i64, i64 } %t346, ptr %a362 + call void @finch_str_copy(ptr %a363, ptr %a362) + %t364 = load { ptr, i64, i64 }, ptr %a363 + store { ptr, i64, i64 } %t364, ptr %t361 + br label %endif8517 +endif8517: + br label %endif8512 +endif8512: + br label %endif8501 +else8500: + %t365 = load i32, ptr %a13 + %t366 = icmp eq i32 %t365, 5 + br i1 %t366, label %then8522, label %else8523 +then8522: + %t367 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t367, ptr %a368 + %t369 = load ptr, ptr %a1 + %t370 = call i32 @clang_visitChildren(ptr byval(%S.C.CXCursor) align 8 %a368, ptr @finch.c.cimport.visitTop, ptr %t369) + br label %endif8524 +else8523: + %t371 = load i32, ptr %a13 + %t372 = icmp eq i32 %t371, 7 + br i1 %t372, label %then8525, label %else8526 +then8525: + %t373 = load ptr, ptr %a1 + %t374 = icmp eq ptr %t373, null + br i1 %t374, label %panic8528, label %ok8529 +panic8528: + call void @finch_panic(ptr @.str.5695, i64 492, ptr @.str.5696) + unreachable +ok8529: + %t375 = getelementptr inbounds %S.cimport.Importer, ptr %t373, i32 0, i32 0 + %t376 = getelementptr inbounds %S.cimport.CImports, ptr %t375, i32 0, i32 1 + %t377 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t377, ptr %a378 + %t379 = call i64 @finch_map_find(ptr %t376, ptr %a378, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t380 = icmp sge i64 %t379, 0 + %t381 = xor i1 %t380, true + br i1 %t381, label %then8530, label %endif8532 +then8530: + %t382 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t382, ptr %a383 + %t384 = call i64 @clang_getEnumConstantDeclValue(ptr byval(%S.C.CXCursor) align 8 %a383) + %t385 = insertvalue %S.cimport.CConst zeroinitializer, i64 %t384, 1 + %t386 = load ptr, ptr %a1 + %t387 = icmp eq ptr %t386, null + br i1 %t387, label %panic8533, label %ok8534 +panic8533: + call void @finch_panic(ptr @.str.5697, i64 493, ptr @.str.5698) + unreachable +ok8534: + %t388 = getelementptr inbounds %S.cimport.Importer, ptr %t386, i32 0, i32 0 + %t389 = getelementptr inbounds %S.cimport.CImports, ptr %t388, i32 0, i32 1 + %t390 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t390, ptr %a391 + store i32 0, ptr %a392 + %t393 = call i64 @finch_map_slot(ptr %t389, ptr %a391, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a392) + %t394 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t389, i32 0, i32 0 + %t395 = load ptr, ptr %t394 + %t396 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t395, i64 %t393 + %t397 = load i32, ptr %a392 + %t398 = icmp ne i32 %t397, 0 + br i1 %t398, label %map.new8535, label %map.have8536 +map.new8535: + %t399 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t396, i32 0, i32 1 + call void @finch_str_copy(ptr %t399, ptr %a391) + %t400 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t396, i32 0, i32 2 + store %S.cimport.CConst zeroinitializer, ptr %t400 + br label %map.have8536 +map.have8536: + %t401 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t396, i32 0, i32 2 + store %S.cimport.CConst %t385, ptr %t401 + br label %endif8532 +endif8532: + br label %endif8527 +else8526: + %t402 = load i32, ptr %a13 + %t403 = icmp eq i32 %t402, 501 + br i1 %t403, label %then8537, label %endif8539 +then8537: + %t404 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t404, ptr %a405 + %t406 = call i32 @clang_Cursor_isMacroBuiltin(ptr byval(%S.C.CXCursor) align 8 %a405) + %t407 = icmp ne i32 %t406, 0 + br label %logic.from8540 +logic.from8540: + br i1 %t407, label %logic.end8542, label %logic.rhs8541 +logic.rhs8541: + %t408 = load %S.C.CXCursor, ptr %a2 + store %S.C.CXCursor %t408, ptr %a409 + %t410 = call i32 @clang_Cursor_isMacroFunctionLike(ptr byval(%S.C.CXCursor) align 8 %a409) + %t411 = icmp ne i32 %t410, 0 + br label %logic.rend8543 +logic.rend8543: + br label %logic.end8542 +logic.end8542: + %t412 = phi i1 [ true, %logic.from8540 ], [ %t411, %logic.rend8543 ] + br i1 %t412, label %then8544, label %endif8546 +then8544: + ret void +endif8546: + %t413 = load ptr, ptr %a1 + %t414 = load %S.C.CXCursor, ptr %a2 + %t415 = call %S.cimport.Number @finch.cimport.macroValue(ptr %t413, %S.C.CXCursor %t414) + store %S.cimport.Number %t415, ptr %a416 + %t417 = getelementptr inbounds %S.cimport.Number, ptr %a416, i32 0, i32 1 + %t418 = load i1, ptr %t417 + br label %logic.from8547 +logic.from8547: + br i1 %t418, label %logic.rhs8548, label %logic.end8549 +logic.rhs8548: + %t419 = load ptr, ptr %a1 + %t420 = icmp eq ptr %t419, null + br i1 %t420, label %panic8550, label %ok8551 +panic8550: + call void @finch_panic(ptr @.str.5699, i64 500, ptr @.str.5700) + unreachable +ok8551: + %t421 = getelementptr inbounds %S.cimport.Importer, ptr %t419, i32 0, i32 0 + %t422 = getelementptr inbounds %S.cimport.CImports, ptr %t421, i32 0, i32 1 + %t423 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t423, ptr %a424 + %t425 = call i64 @finch_map_find(ptr %t422, ptr %a424, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t426 = icmp sge i64 %t425, 0 + %t427 = xor i1 %t426, true + br label %logic.rend8552 +logic.rend8552: + br label %logic.end8549 +logic.end8549: + %t428 = phi i1 [ false, %logic.from8547 ], [ %t427, %logic.rend8552 ] + br i1 %t428, label %then8553, label %endif8555 +then8553: + %t429 = getelementptr inbounds %S.cimport.Number, ptr %a416, i32 0, i32 0 + %t430 = load %S.cimport.CConst, ptr %t429 + %t431 = load ptr, ptr %a1 + %t432 = icmp eq ptr %t431, null + br i1 %t432, label %panic8556, label %ok8557 +panic8556: + call void @finch_panic(ptr @.str.5701, i64 501, ptr @.str.5702) + unreachable +ok8557: + %t433 = getelementptr inbounds %S.cimport.Importer, ptr %t431, i32 0, i32 0 + %t434 = getelementptr inbounds %S.cimport.CImports, ptr %t433, i32 0, i32 1 + %t435 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t435, ptr %a436 + store i32 0, ptr %a437 + %t438 = call i64 @finch_map_slot(ptr %t434, ptr %a436, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1, ptr %a437) + %t439 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t434, i32 0, i32 0 + %t440 = load ptr, ptr %t439 + %t441 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t440, i64 %t438 + %t442 = load i32, ptr %a437 + %t443 = icmp ne i32 %t442, 0 + br i1 %t443, label %map.new8558, label %map.have8559 +map.new8558: + %t444 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t441, i32 0, i32 1 + call void @finch_str_copy(ptr %t444, ptr %a436) + %t445 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t441, i32 0, i32 2 + store %S.cimport.CConst zeroinitializer, ptr %t445 + br label %map.have8559 +map.have8559: + %t446 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CConst }, ptr %t441, i32 0, i32 2 + store %S.cimport.CConst %t430, ptr %a447 + call void @finch.copy.S_cimport_CConst(ptr %a448, ptr %a447) + %t449 = load %S.cimport.CConst, ptr %a448 + store %S.cimport.CConst %t449, ptr %t446 + br label %endif8555 +endif8555: + br label %endif8539 +endif8539: + br label %endif8527 +endif8527: + br label %endif8524 +endif8524: + br label %endif8501 +endif8501: + br label %endif8482 +endif8482: + br label %endif8441 +endif8441: + br label %endif8410 +endif8410: + ret void +} + +define internal { i1, %S.cimport.CImports, { ptr, i64, i64 } } @finch.cimport.importHeaders({ ptr, i64, i64 } %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2, i1 %p3, { ptr, i64, i64 } %p4) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca i1, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca %S.cimport.Importer, align 16 + %a12 = alloca %S.cimport.CImports, align 16 + %a13 = alloca %S.cimport.CImports, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca i64, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca i64, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca i64, align 16 + %a113 = alloca ptr, align 16 + %a114 = alloca i64, align 16 + %a122 = alloca %S.cimport.Header, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca %S.C.CXUnsavedFile, align 16 + %a147 = alloca ptr, align 16 + %a149 = alloca i64, align 16 + %a162 = alloca i32, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a178 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a182 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca i64, align 16 + %a190 = alloca i64, align 16 + %a197 = alloca ptr, align 16 + %a203 = alloca [32 x i8], align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a241 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a247 = alloca { ptr, i64, i64 }, align 16 + %a249 = alloca { ptr, i64, i64 }, align 16 + %a250 = alloca { ptr, i64, i64 }, align 16 + %a251 = alloca { ptr, i64, i64 }, align 16 + %a256 = alloca { ptr, i64, i64 }, align 16 + %a257 = alloca { ptr, i64, i64 }, align 16 + %a258 = alloca { ptr, i64, i64 }, align 16 + %a261 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca { ptr, i64, i64 }, align 16 + %a266 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a272 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca { ptr, i64, i64 }, align 16 + %a275 = alloca { ptr, i64, i64 }, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a282 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a288 = alloca { ptr, i64, i64 }, align 16 + %a289 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a293 = alloca { ptr, i64, i64 }, align 16 + %a294 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a310 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca %S.C.CXCursor, align 16 + %a316 = alloca %S.C.CXCursor, align 16 + %a324 = alloca %S.cimport.CImports, align 16 + %a325 = alloca %S.cimport.CImports, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + store i1 %p3, ptr %a4 + store { ptr, i64, i64 } %p4, ptr %a5 + store %S.cimport.Importer zeroinitializer, ptr %a6 + %t7 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t8 = load i64, ptr %t7 + %t9 = icmp eq i64 %t8, 0 + br i1 %t9, label %then8560, label %endif8562 +then8560: + %t10 = getelementptr inbounds %S.cimport.Importer, ptr %a6, i32 0, i32 0 + %t11 = load %S.cimport.CImports, ptr %t10 + store %S.cimport.CImports %t11, ptr %a12 + call void @finch.copy.S_cimport_CImports(ptr %a13, ptr %a12) + %t14 = load %S.cimport.CImports, ptr %a13 + %t15 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } zeroinitializer, i1 true, 0 + %t16 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t15, %S.cimport.CImports %t14, 1 + ret { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t16 +endif8562: + %t17 = mul i64 3, ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64) + %t18 = call ptr @finch_alloc(i64 %t17) + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i64 0 + store { ptr, i64, i64 } { ptr @.str.5703, i64 2, i64 0 }, ptr %t19 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i64 1 + store { ptr, i64, i64 } { ptr @.str.5704, i64 1, i64 0 }, ptr %t20 + %t21 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i64 2 + store { ptr, i64, i64 } { ptr @.str.5705, i64 10, i64 0 }, ptr %t21 + %t22 = insertvalue { ptr, i64, i64 } undef, ptr %t18, 0 + %t23 = insertvalue { ptr, i64, i64 } %t22, i64 3, 1 + %t24 = insertvalue { ptr, i64, i64 } %t23, i64 3, 2 + store { ptr, i64, i64 } %t24, ptr %a25 + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %a3, i32 0, i32 1 + %t27 = load i64, ptr %t26 + %t28 = icmp sgt i64 %t27, 0 + br i1 %t28, label %then8563, label %endif8565 +then8563: + %t29 = getelementptr inbounds { ptr, i64, i64 }, ptr %a25, i32 0, i32 1 + %t30 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5706, i64 9, i64 0 }, ptr %a32 + store { ptr, i64, i64 } %t30, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = load i64, ptr %t29 + %t36 = add i64 %t35, 1 + call void @finch_arr_reserve(ptr %a25, i64 %t36, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t37 = load ptr, ptr %a25 + %t38 = getelementptr inbounds { ptr, i64, i64 }, ptr %t37, i64 %t35 + store { ptr, i64, i64 } %t34, ptr %t38 + store i64 %t36, ptr %t29 + br label %endif8565 +endif8565: + %t39 = load i1, ptr %a4 + br i1 %t39, label %then8566, label %endif8568 +then8566: + %t40 = getelementptr inbounds { ptr, i64, i64 }, ptr %a25, i32 0, i32 1 + %t41 = load i64, ptr %t40 + %t42 = add i64 %t41, 1 + call void @finch_arr_reserve(ptr %a25, i64 %t42, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t43 = load ptr, ptr %a25 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i64 %t41 + store { ptr, i64, i64 } { ptr @.str.5707, i64 19, i64 0 }, ptr %t44 + store i64 %t42, ptr %t40 + br label %endif8568 +endif8568: + store i64 0, ptr %a45 + br label %each.cond8569 +each.cond8569: + %t46 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t47 = load i64, ptr %t46 + %t48 = load i64, ptr %a45 + %t49 = icmp slt i64 %t48, %t47 + br i1 %t49, label %each.body8570, label %each.end8572 +each.body8570: + %t50 = load ptr, ptr %a2 + %t51 = getelementptr inbounds { ptr, i64, i64 }, ptr %t50, i64 %t48 + %t52 = load { ptr, i64, i64 }, ptr %t51 + store { ptr, i64, i64 } %t52, ptr %a53 + %t54 = getelementptr inbounds { ptr, i64, i64 }, ptr %a25, i32 0, i32 1 + %t55 = load { ptr, i64, i64 }, ptr %a53 + store { ptr, i64, i64 } { ptr @.str.5708, i64 2, i64 0 }, ptr %a57 + store { ptr, i64, i64 } %t55, ptr %a58 + call void @finch_str_concat(ptr %a56, ptr %a57, ptr %a58) + %t59 = load { ptr, i64, i64 }, ptr %a56 + %t60 = load i64, ptr %t54 + %t61 = add i64 %t60, 1 + call void @finch_arr_reserve(ptr %a25, i64 %t61, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t62 = load ptr, ptr %a25 + %t63 = getelementptr inbounds { ptr, i64, i64 }, ptr %t62, i64 %t60 + store { ptr, i64, i64 } %t59, ptr %t63 + store i64 %t61, ptr %t54 + br label %each.step8571 +each.step8571: + %t64 = load i64, ptr %a45 + %t65 = add i64 %t64, 1 + store i64 %t65, ptr %a45 + br label %each.cond8569 +each.end8572: + %t66 = load { ptr, i64, i64 }, ptr %a5 + %t67 = call { ptr, i64, i64 } @finch.cimport.systemIncludeArgs({ ptr, i64, i64 } %t66) + store { ptr, i64, i64 } %t67, ptr %a68 + store i64 0, ptr %a69 + br label %each.cond8573 +each.cond8573: + %t70 = getelementptr inbounds { ptr, i64, i64 }, ptr %a68, i32 0, i32 1 + %t71 = load i64, ptr %t70 + %t72 = load i64, ptr %a69 + %t73 = icmp slt i64 %t72, %t71 + br i1 %t73, label %each.body8574, label %each.end8576 +each.body8574: + %t74 = load ptr, ptr %a68 + %t75 = getelementptr inbounds { ptr, i64, i64 }, ptr %t74, i64 %t72 + %t76 = load { ptr, i64, i64 }, ptr %t75 + store { ptr, i64, i64 } %t76, ptr %a77 + %t78 = getelementptr inbounds { ptr, i64, i64 }, ptr %a25, i32 0, i32 1 + %t79 = load { ptr, i64, i64 }, ptr %a77 + store { ptr, i64, i64 } %t79, ptr %a80 + call void @finch_str_copy(ptr %a81, ptr %a80) + %t82 = load { ptr, i64, i64 }, ptr %a81 + %t83 = load i64, ptr %t78 + %t84 = add i64 %t83, 1 + call void @finch_arr_reserve(ptr %a25, i64 %t84, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t85 = load ptr, ptr %a25 + %t86 = getelementptr inbounds { ptr, i64, i64 }, ptr %t85, i64 %t83 + store { ptr, i64, i64 } %t82, ptr %t86 + store i64 %t84, ptr %t78 + br label %each.step8575 +each.step8575: + %t87 = load i64, ptr %a69 + %t88 = add i64 %t87, 1 + store i64 %t88, ptr %a69 + br label %each.cond8573 +each.end8576: + store { ptr, i64, i64 } zeroinitializer, ptr %a89 + %t90 = getelementptr inbounds { ptr, i64, i64 }, ptr %a25, i32 0, i32 1 + %t91 = load i64, ptr %t90 + store i64 0, ptr %a92 + br label %for.cond8577 +for.cond8577: + %t93 = load i64, ptr %a92 + %t94 = icmp slt i64 %t93, %t91 + br i1 %t94, label %for.body8578, label %for.end8580 +for.body8578: + %t95 = getelementptr inbounds { ptr, i64, i64 }, ptr %a89, i32 0, i32 1 + %t96 = load i64, ptr %a92 + %t97 = load { ptr, i64, i64 }, ptr %a25 + %t98 = extractvalue { ptr, i64, i64 } %t97, 1 + %t99 = icmp uge i64 %t96, %t98 + br i1 %t99, label %range8581, label %inrange8582 +range8581: + call void @finch_panic_index(ptr @.str.5709, i64 528, i64 %t96, i64 %t98) + unreachable +inrange8582: + %t100 = extractvalue { ptr, i64, i64 } %t97, 0 + %t101 = getelementptr inbounds { ptr, i64, i64 }, ptr %t100, i64 %t96 + %t102 = load { ptr, i64, i64 }, ptr %t101 + %t103 = extractvalue { ptr, i64, i64 } %t102, 0 + %t104 = icmp eq ptr %t103, null + %t105 = select i1 %t104, ptr @.str.5710, ptr %t103 + %t106 = load i64, ptr %t95 + %t107 = add i64 %t106, 1 + call void @finch_arr_reserve(ptr %a89, i64 %t107, i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64)) + %t108 = load ptr, ptr %a89 + %t109 = getelementptr inbounds ptr, ptr %t108, i64 %t106 + store ptr %t105, ptr %t109 + store i64 %t107, ptr %t95 + br label %for.step8579 +for.step8579: + %t110 = load i64, ptr %a92 + %t111 = add i64 %t110, 1 + store i64 %t111, ptr %a92 + br label %for.cond8577 +for.end8580: + %t112 = call ptr @clang_createIndex(i32 0, i32 0) + store ptr %t112, ptr %a113 + store i64 0, ptr %a114 + br label %each.cond8583 +each.cond8583: + %t115 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t116 = load i64, ptr %t115 + %t117 = load i64, ptr %a114 + %t118 = icmp slt i64 %t117, %t116 + br i1 %t118, label %each.body8584, label %each.end8586 +each.body8584: + %t119 = load ptr, ptr %a1 + %t120 = getelementptr inbounds %S.cimport.Header, ptr %t119, i64 %t117 + %t121 = load %S.cimport.Header, ptr %t120 + store %S.cimport.Header %t121, ptr %a122 + %t123 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 0 + %t124 = load { ptr, i64, i64 }, ptr %t123 + store { ptr, i64, i64 } { ptr @.str.5711, i64 10, i64 0 }, ptr %a126 + store { ptr, i64, i64 } %t124, ptr %a127 + call void @finch_str_concat(ptr %a125, ptr %a126, ptr %a127) + %t128 = load { ptr, i64, i64 }, ptr %a125 + store { ptr, i64, i64 } %t128, ptr %a130 + store { ptr, i64, i64 } { ptr @.str.5712, i64 2, i64 0 }, ptr %a131 + call void @finch_str_concat(ptr %a129, ptr %a130, ptr %a131) + %t132 = load { ptr, i64, i64 }, ptr %a129 + store { ptr, i64, i64 } %t132, ptr %a133 + %t134 = extractvalue { ptr, i64, i64 } { ptr @.str.5713, i64 14, i64 0 }, 0 + %t135 = icmp eq ptr %t134, null + %t136 = select i1 %t135, ptr @.str.5714, ptr %t134 + %t137 = insertvalue %S.C.CXUnsavedFile zeroinitializer, ptr %t136, 0 + %t138 = load { ptr, i64, i64 }, ptr %a133 + %t139 = extractvalue { ptr, i64, i64 } %t138, 0 + %t140 = icmp eq ptr %t139, null + %t141 = select i1 %t140, ptr @.str.5715, ptr %t139 + %t142 = insertvalue %S.C.CXUnsavedFile %t137, ptr %t141, 1 + %t143 = getelementptr inbounds { ptr, i64, i64 }, ptr %a133, i32 0, i32 1 + %t144 = load i64, ptr %t143 + %t145 = insertvalue %S.C.CXUnsavedFile %t142, i64 %t144, 2 + store %S.C.CXUnsavedFile %t145, ptr %a146 + store ptr null, ptr %a147 + %t148 = or i64 1, 64 + store i64 %t148, ptr %a149 + %t150 = load ptr, ptr %a113 + %t151 = extractvalue { ptr, i64, i64 } { ptr @.str.5716, i64 14, i64 0 }, 0 + %t152 = icmp eq ptr %t151, null + %t153 = select i1 %t152, ptr @.str.5717, ptr %t151 + %t154 = load { ptr, i64, i64 }, ptr %a89 + %t155 = extractvalue { ptr, i64, i64 } %t154, 0 + %t156 = getelementptr inbounds { ptr, i64, i64 }, ptr %a89, i32 0, i32 1 + %t157 = load i64, ptr %t156 + %t158 = trunc i64 %t157 to i32 + %t159 = load i64, ptr %a149 + %t160 = trunc i64 %t159 to i32 + %t161 = call i32 @clang_parseTranslationUnit2(ptr %t150, ptr %t153, ptr %t155, i32 %t158, ptr %a146, i32 1, i32 %t160, ptr %a147) + store i32 %t161, ptr %a162 + %t163 = load i32, ptr %a162 + %t164 = icmp ne i32 %t163, 0 + br label %logic.from8587 +logic.from8587: + br i1 %t164, label %logic.end8589, label %logic.rhs8588 +logic.rhs8588: + %t165 = load ptr, ptr %a147 + %t166 = icmp eq ptr %t165, null + br label %logic.rend8590 +logic.rend8590: + br label %logic.end8589 +logic.end8589: + %t167 = phi i1 [ true, %logic.from8587 ], [ %t166, %logic.rend8590 ] + br i1 %t167, label %then8591, label %endif8593 +then8591: + %t168 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 1 + %t169 = load { ptr, i64, i64 }, ptr %t168 + store { ptr, i64, i64 } %t169, ptr %a171 + store { ptr, i64, i64 } { ptr @.str.5718, i64 33, i64 0 }, ptr %a172 + call void @finch_str_concat(ptr %a170, ptr %a171, ptr %a172) + %t173 = load { ptr, i64, i64 }, ptr %a170 + %t174 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 0 + %t175 = load { ptr, i64, i64 }, ptr %t174 + store { ptr, i64, i64 } %t173, ptr %a177 + store { ptr, i64, i64 } %t175, ptr %a178 + call void @finch_str_concat(ptr %a176, ptr %a177, ptr %a178) + %t179 = load { ptr, i64, i64 }, ptr %a176 + store { ptr, i64, i64 } %t179, ptr %a181 + store { ptr, i64, i64 } { ptr @.str.5719, i64 1, i64 0 }, ptr %a182 + call void @finch_str_concat(ptr %a180, ptr %a181, ptr %a182) + %t183 = load { ptr, i64, i64 }, ptr %a180 + %t184 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } zeroinitializer, { ptr, i64, i64 } %t183, 2 + ret { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t184 +endif8593: + %t185 = load ptr, ptr %a147 + %t186 = call i32 @clang_getNumDiagnostics(ptr %t185) + %t187 = zext i32 %t186 to i64 + store i64 %t187, ptr %a188 + %t189 = load i64, ptr %a188 + store i64 0, ptr %a190 + br label %for.cond8594 +for.cond8594: + %t191 = load i64, ptr %a190 + %t192 = icmp slt i64 %t191, %t189 + br i1 %t192, label %for.body8595, label %for.end8597 +for.body8595: + %t193 = load ptr, ptr %a147 + %t194 = load i64, ptr %a190 + %t195 = trunc i64 %t194 to i32 + %t196 = call ptr @clang_getDiagnostic(ptr %t193, i32 %t195) + store ptr %t196, ptr %a197 + %t198 = load ptr, ptr %a197 + %t199 = call i32 @clang_getDiagnosticSeverity(ptr %t198) + %t200 = icmp sge i32 %t199, 3 + br i1 %t200, label %then8598, label %endif8600 +then8598: + %t201 = load ptr, ptr %a197 + %t202 = call { i64, i64 } @clang_getDiagnosticSpelling(ptr %t201) + store { i64, i64 } %t202, ptr %a203 + %t204 = load %S.C.CXString, ptr %a203 + %t205 = call { ptr, i64, i64 } @finch.cimport.text(%S.C.CXString %t204) + store { ptr, i64, i64 } %t205, ptr %a206 + %t207 = load ptr, ptr %a197 + call void @clang_disposeDiagnostic(ptr %t207) + %t208 = load { ptr, i64, i64 }, ptr %a206 + store { ptr, i64, i64 } %t208, ptr %a209 + store { ptr, i64, i64 } { ptr @.str.5721, i64 14, i64 0 }, ptr %a211 + %t212 = call i64 @finch_str_find(ptr %a209, ptr %a211) + %t213 = icmp sge i64 %t212, 0 + br i1 %t213, label %then8601, label %endif8603 +then8601: + %t214 = load { ptr, i64, i64 }, ptr %a206 + store { ptr, i64, i64 } %t214, ptr %a215 + %t217 = load { ptr, i64, i64 }, ptr %a206 + store { ptr, i64, i64 } %t217, ptr %a218 + %t220 = getelementptr inbounds { ptr, i64, i64 }, ptr %a206, i32 0, i32 1 + %t221 = load i64, ptr %t220 + call void @finch_str_sub(ptr %a219, ptr %a218, i64 1, i64 %t221, ptr @.str.5723, i64 548) + %t222 = load { ptr, i64, i64 }, ptr %a219 + store { ptr, i64, i64 } %t222, ptr %a223 + store { ptr, i64, i64 } { ptr @.str.5725, i64 1, i64 0 }, ptr %a225 + %t226 = call i64 @finch_str_find(ptr %a223, ptr %a225) + %t227 = add i64 %t226, 1 + call void @finch_str_sub(ptr %a216, ptr %a215, i64 1, i64 %t227, ptr @.str.5722, i64 548) + %t228 = load { ptr, i64, i64 }, ptr %a216 + store { ptr, i64, i64 } %t228, ptr %a229 + %t230 = load { ptr, i64, i64 }, ptr %a229 + %t231 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 0 + %t232 = load { ptr, i64, i64 }, ptr %t231 + store { ptr, i64, i64 } %t230, ptr %a233 + store { ptr, i64, i64 } %t232, ptr %a234 + %t235 = call i32 @finch_str_eq(ptr %a233, ptr %a234) + %t236 = icmp ne i32 %t235, 0 + br i1 %t236, label %then8604, label %endif8606 +then8604: + %t237 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 1 + %t238 = load { ptr, i64, i64 }, ptr %t237 + store { ptr, i64, i64 } %t238, ptr %a240 + store { ptr, i64, i64 } { ptr @.str.5726, i64 34, i64 0 }, ptr %a241 + call void @finch_str_concat(ptr %a239, ptr %a240, ptr %a241) + %t242 = load { ptr, i64, i64 }, ptr %a239 + %t243 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 0 + %t244 = load { ptr, i64, i64 }, ptr %t243 + store { ptr, i64, i64 } %t242, ptr %a246 + store { ptr, i64, i64 } %t244, ptr %a247 + call void @finch_str_concat(ptr %a245, ptr %a246, ptr %a247) + %t248 = load { ptr, i64, i64 }, ptr %a245 + store { ptr, i64, i64 } %t248, ptr %a250 + store { ptr, i64, i64 } { ptr @.str.5727, i64 1, i64 0 }, ptr %a251 + call void @finch_str_concat(ptr %a249, ptr %a250, ptr %a251) + %t252 = load { ptr, i64, i64 }, ptr %a249 + %t253 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } zeroinitializer, { ptr, i64, i64 } %t252, 2 + ret { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t253 +endif8606: + %t254 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 1 + %t255 = load { ptr, i64, i64 }, ptr %t254 + store { ptr, i64, i64 } %t255, ptr %a257 + store { ptr, i64, i64 } { ptr @.str.5728, i64 34, i64 0 }, ptr %a258 + call void @finch_str_concat(ptr %a256, ptr %a257, ptr %a258) + %t259 = load { ptr, i64, i64 }, ptr %a256 + %t260 = load { ptr, i64, i64 }, ptr %a229 + store { ptr, i64, i64 } %t259, ptr %a262 + store { ptr, i64, i64 } %t260, ptr %a263 + call void @finch_str_concat(ptr %a261, ptr %a262, ptr %a263) + %t264 = load { ptr, i64, i64 }, ptr %a261 + store { ptr, i64, i64 } %t264, ptr %a266 + store { ptr, i64, i64 } { ptr @.str.5729, i64 10, i64 0 }, ptr %a267 + call void @finch_str_concat(ptr %a265, ptr %a266, ptr %a267) + %t268 = load { ptr, i64, i64 }, ptr %a265 + %t269 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 0 + %t270 = load { ptr, i64, i64 }, ptr %t269 + store { ptr, i64, i64 } %t268, ptr %a272 + store { ptr, i64, i64 } %t270, ptr %a273 + call void @finch_str_concat(ptr %a271, ptr %a272, ptr %a273) + %t274 = load { ptr, i64, i64 }, ptr %a271 + store { ptr, i64, i64 } %t274, ptr %a276 + store { ptr, i64, i64 } { ptr @.str.5730, i64 60, i64 0 }, ptr %a277 + call void @finch_str_concat(ptr %a275, ptr %a276, ptr %a277) + %t278 = load { ptr, i64, i64 }, ptr %a275 + %t279 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } zeroinitializer, { ptr, i64, i64 } %t278, 2 + ret { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t279 +endif8603: + %t280 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 1 + %t281 = load { ptr, i64, i64 }, ptr %t280 + store { ptr, i64, i64 } %t281, ptr %a283 + store { ptr, i64, i64 } { ptr @.str.5731, i64 19, i64 0 }, ptr %a284 + call void @finch_str_concat(ptr %a282, ptr %a283, ptr %a284) + %t285 = load { ptr, i64, i64 }, ptr %a282 + %t286 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 0 + %t287 = load { ptr, i64, i64 }, ptr %t286 + store { ptr, i64, i64 } %t285, ptr %a289 + store { ptr, i64, i64 } %t287, ptr %a290 + call void @finch_str_concat(ptr %a288, ptr %a289, ptr %a290) + %t291 = load { ptr, i64, i64 }, ptr %a288 + store { ptr, i64, i64 } %t291, ptr %a293 + store { ptr, i64, i64 } { ptr @.str.5732, i64 16, i64 0 }, ptr %a294 + call void @finch_str_concat(ptr %a292, ptr %a293, ptr %a294) + %t295 = load { ptr, i64, i64 }, ptr %a292 + %t296 = load { ptr, i64, i64 }, ptr %a206 + store { ptr, i64, i64 } %t295, ptr %a298 + store { ptr, i64, i64 } %t296, ptr %a299 + call void @finch_str_concat(ptr %a297, ptr %a298, ptr %a299) + %t300 = load { ptr, i64, i64 }, ptr %a297 + %t301 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } zeroinitializer, { ptr, i64, i64 } %t300, 2 + ret { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t301 +endif8600: + %t302 = load ptr, ptr %a197 + call void @clang_disposeDiagnostic(ptr %t302) + br label %for.step8596 +for.step8596: + %t303 = load i64, ptr %a190 + %t304 = add i64 %t303, 1 + store i64 %t304, ptr %a190 + br label %for.cond8594 +for.end8597: + %t305 = load ptr, ptr %a147 + %t306 = getelementptr inbounds %S.cimport.Importer, ptr %a6, i32 0, i32 1 + store ptr %t305, ptr %t306 + %t307 = getelementptr inbounds %S.cimport.Header, ptr %a122, i32 0, i32 0 + %t308 = load { ptr, i64, i64 }, ptr %t307 + %t309 = getelementptr inbounds %S.cimport.Importer, ptr %a6, i32 0, i32 2 + store { ptr, i64, i64 } %t308, ptr %a310 + call void @finch_str_copy(ptr %a311, ptr %a310) + %t312 = load { ptr, i64, i64 }, ptr %a311 + store { ptr, i64, i64 } %t312, ptr %t309 + %t314 = load ptr, ptr %a147 + call void @clang_getTranslationUnitCursor(ptr sret(%S.C.CXCursor) align 16 %a313, ptr %t314) + %t315 = load %S.C.CXCursor, ptr %a313 + store %S.C.CXCursor %t315, ptr %a316 + %t317 = call i32 @clang_visitChildren(ptr byval(%S.C.CXCursor) align 8 %a316, ptr @finch.c.cimport.visitTop, ptr %a6) + %t318 = load ptr, ptr %a147 + call void @clang_disposeTranslationUnit(ptr %t318) + br label %each.step8585 +each.step8585: + %t319 = load i64, ptr %a114 + %t320 = add i64 %t319, 1 + store i64 %t320, ptr %a114 + br label %each.cond8583 +each.end8586: + %t321 = load ptr, ptr %a113 + call void @clang_disposeIndex(ptr %t321) + %t322 = getelementptr inbounds %S.cimport.Importer, ptr %a6, i32 0, i32 0 + %t323 = load %S.cimport.CImports, ptr %t322 + store %S.cimport.CImports %t323, ptr %a324 + call void @finch.copy.S_cimport_CImports(ptr %a325, ptr %a324) + %t326 = load %S.cimport.CImports, ptr %a325 + %t327 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } zeroinitializer, i1 true, 0 + %t328 = insertvalue { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t327, %S.cimport.CImports %t326, 1 + ret { i1, %S.cimport.CImports, { ptr, i64, i64 } } %t328 +} + +define internal { ptr, i64, i64 } @finch.platform.firstLine({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + call void @finch_str_trim(ptr %a4, ptr %a3) + %t5 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t5, ptr %a6 + store { ptr, i64, i64 } { ptr @.str.5735, i64 1, i64 0 }, ptr %a8 + call void @finch_str_split(ptr %a9, ptr %a6, ptr %a8) + %t10 = load { ptr, i64, i64 }, ptr %a9 + store { ptr, i64, i64 } %t10, ptr %a11 + %t12 = load { ptr, i64, i64 }, ptr %a11 + %t13 = extractvalue { ptr, i64, i64 } %t12, 1 + %t14 = icmp uge i64 0, %t13 + br i1 %t14, label %range8607, label %inrange8608 +range8607: + call void @finch_panic_index(ptr @.str.5736, i64 20, i64 0, i64 %t13) + unreachable +inrange8608: + %t15 = extractvalue { ptr, i64, i64 } %t12, 0 + %t16 = getelementptr inbounds { ptr, i64, i64 }, ptr %t15, i64 0 + %t17 = load { ptr, i64, i64 }, ptr %t16 + store { ptr, i64, i64 } %t17, ptr %a18 + call void @finch_str_trim(ptr %a19, ptr %a18) + %t20 = load { ptr, i64, i64 }, ptr %a19 + ret { ptr, i64, i64 } %t20 +} + +define internal { ptr, i64, i64 } @finch.platform.hostTriple() { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } { ptr @.str.5738, i64 21, i64 0 }, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } { ptr @.str.5739, i64 22, i64 0 }, ptr %a4 + store { ptr, i64, i64 } %t2, ptr %a5 + call void @finch_str_concat(ptr %a3, ptr %a4, ptr %a5) + %t6 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t6, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.5740, i64 14, i64 0 }, ptr %a9 + call void @finch_str_concat(ptr %a7, ptr %a8, ptr %a9) + %t10 = load { ptr, i64, i64 }, ptr %a7 + store { ptr, i64, i64 } %t10, ptr %a12 + call void @finch_str_copy(ptr %a11, ptr %a12) + %t13 = call i64 @finch_shell(ptr %a11) + %t14 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t14, ptr %a15 + store { ptr, i64, i64 } zeroinitializer, ptr %a16 + store { ptr, i64, i64 } zeroinitializer, ptr %a17 + %t18 = call i32 @finch_try_read_file(ptr %a16, ptr %a15, ptr %a17) + %t19 = icmp eq i32 %t18, 0 + %t20 = load { ptr, i64, i64 }, ptr %a17 + %t21 = load { ptr, i64, i64 }, ptr %a16 + br i1 %t19, label %or.failed8609, label %or.ok8610 +or.failed8609: + store { ptr, i64, i64 } %t20, ptr %a22 + br label %or.bend8611 +or.bend8611: + br label %or.end8612 +or.ok8610: + br label %or.end8612 +or.end8612: + %t23 = phi { ptr, i64, i64 } [ { ptr @.str.5741, i64 0, i64 0 }, %or.bend8611 ], [ %t21, %or.ok8610 ] + store { ptr, i64, i64 } %t23, ptr %a24 + %t25 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } { ptr @.str.5742, i64 7, i64 0 }, ptr %a27 + store { ptr, i64, i64 } %t25, ptr %a28 + call void @finch_str_concat(ptr %a26, ptr %a27, ptr %a28) + %t29 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t29, ptr %a31 + store { ptr, i64, i64 } { ptr @.str.5743, i64 1, i64 0 }, ptr %a32 + call void @finch_str_concat(ptr %a30, ptr %a31, ptr %a32) + %t33 = load { ptr, i64, i64 }, ptr %a30 + store { ptr, i64, i64 } %t33, ptr %a35 + call void @finch_str_copy(ptr %a34, ptr %a35) + %t36 = call i64 @finch_shell(ptr %a34) + %t37 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t37, ptr %a38 + call void @finch_str_trim(ptr %a39, ptr %a38) + %t40 = load { ptr, i64, i64 }, ptr %a39 + %t41 = extractvalue { ptr, i64, i64 } %t40, 1 + %t42 = icmp eq i64 %t41, 0 + br i1 %t42, label %then8613, label %endif8615 +then8613: + ret { ptr, i64, i64 } { ptr @.str.5745, i64 24, i64 0 } +endif8615: + %t43 = load { ptr, i64, i64 }, ptr %a24 + %t44 = call { ptr, i64, i64 } @finch.platform.firstLine({ ptr, i64, i64 } %t43) + ret { ptr, i64, i64 } %t44 +} + +define internal %S.platform.Target @finch.platform.select({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a22 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca %S.platform.Target, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a81 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a89 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a118 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a138 = alloca { ptr, i64, i64 }, align 16 + %a139 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca i1, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a160 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca i1, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a189 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca { ptr, i64, i64 }, align 16 + %a221 = alloca { ptr, i64, i64 }, align 16 + %a242 = alloca %S.platform.Target, align 16 + %a243 = alloca %S.platform.Target, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = call { ptr, i64, i64 } @finch.platform.hostTriple() + store { ptr, i64, i64 } %t2, ptr %a3 + %t4 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t4, ptr %a5 + call void @finch_str_copy(ptr %a6, ptr %a5) + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t10 = load i64, ptr %t9 + %t11 = icmp eq i64 %t10, 0 + br i1 %t11, label %then8616, label %else8617 +then8616: + %t12 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t12, ptr %a13 + call void @finch_str_copy(ptr %a14, ptr %a13) + %t15 = load { ptr, i64, i64 }, ptr %a14 + store { ptr, i64, i64 } %t15, ptr %a8 + br label %endif8618 +else8617: + %t16 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t16, ptr %a17 + store { ptr, i64, i64 } { ptr @.str.5746, i64 7, i64 0 }, ptr %a18 + %t19 = call i32 @finch_str_eq(ptr %a17, ptr %a18) + %t20 = icmp ne i32 %t19, 0 + br i1 %t20, label %then8619, label %else8620 +then8619: + store { ptr, i64, i64 } { ptr @.str.5747, i64 18, i64 0 }, ptr %a8 + br label %endif8621 +else8620: + %t21 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t21, ptr %a22 + store { ptr, i64, i64 } { ptr @.str.5748, i64 5, i64 0 }, ptr %a23 + %t24 = call i32 @finch_str_eq(ptr %a22, ptr %a23) + %t25 = icmp ne i32 %t24, 0 + br i1 %t25, label %then8622, label %else8623 +then8622: + store { ptr, i64, i64 } { ptr @.str.5749, i64 24, i64 0 }, ptr %a8 + br label %endif8624 +else8623: + %t26 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t26, ptr %a27 + store { ptr, i64, i64 } { ptr @.str.5750, i64 5, i64 0 }, ptr %a28 + %t29 = call i32 @finch_str_eq(ptr %a27, ptr %a28) + %t30 = icmp ne i32 %t29, 0 + br label %logic.from8625 +logic.from8625: + br i1 %t30, label %logic.end8627, label %logic.rhs8626 +logic.rhs8626: + %t31 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t31, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.5751, i64 7, i64 0 }, ptr %a33 + %t34 = call i32 @finch_str_eq(ptr %a32, ptr %a33) + %t35 = icmp ne i32 %t34, 0 + br label %logic.rend8628 +logic.rend8628: + br label %logic.end8627 +logic.end8627: + %t36 = phi i1 [ true, %logic.from8625 ], [ %t35, %logic.rend8628 ] + br label %logic.from8629 +logic.from8629: + br i1 %t36, label %logic.end8631, label %logic.rhs8630 +logic.rhs8630: + %t37 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t37, ptr %a38 + store { ptr, i64, i64 } { ptr @.str.5752, i64 11, i64 0 }, ptr %a39 + %t40 = call i32 @finch_str_eq(ptr %a38, ptr %a39) + %t41 = icmp ne i32 %t40, 0 + br label %logic.rend8632 +logic.rend8632: + br label %logic.end8631 +logic.end8631: + %t42 = phi i1 [ true, %logic.from8629 ], [ %t41, %logic.rend8632 ] + br i1 %t42, label %then8633, label %else8634 +then8633: + store { ptr, i64, i64 } { ptr @.str.5753, i64 25, i64 0 }, ptr %a8 + br label %endif8635 +else8634: + %t43 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t43, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.5754, i64 5, i64 0 }, ptr %a45 + %t46 = call i32 @finch_str_eq(ptr %a44, ptr %a45) + %t47 = icmp ne i32 %t46, 0 + br i1 %t47, label %then8636, label %endif8638 +then8636: + %t48 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t48, ptr %a49 + store { ptr, i64, i64 } { ptr @.str.5756, i64 7, i64 0 }, ptr %a51 + %t52 = call i32 @finch_str_starts(ptr %a49, ptr %a51) + %t53 = icmp ne i32 %t52, 0 + br label %logic.from8639 +logic.from8639: + br i1 %t53, label %logic.end8641, label %logic.rhs8640 +logic.rhs8640: + %t54 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t54, ptr %a55 + store { ptr, i64, i64 } { ptr @.str.5758, i64 5, i64 0 }, ptr %a57 + %t58 = call i32 @finch_str_starts(ptr %a55, ptr %a57) + %t59 = icmp ne i32 %t58, 0 + br label %logic.rend8642 +logic.rend8642: + br label %logic.end8641 +logic.end8641: + %t60 = phi i1 [ true, %logic.from8639 ], [ %t59, %logic.rend8642 ] + br i1 %t60, label %then8643, label %else8644 +then8643: + store { ptr, i64, i64 } { ptr @.str.5759, i64 24, i64 0 }, ptr %a8 + br label %endif8645 +else8644: + store { ptr, i64, i64 } { ptr @.str.5760, i64 25, i64 0 }, ptr %a8 + br label %endif8645 +endif8645: + br label %endif8638 +endif8638: + br label %endif8635 +endif8635: + br label %endif8624 +endif8624: + br label %endif8621 +endif8621: + br label %endif8618 +endif8618: + %t61 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t61, ptr %a62 + call void @finch_str_copy(ptr %a63, ptr %a62) + %t64 = load { ptr, i64, i64 }, ptr %a63 + %t65 = insertvalue %S.platform.Target zeroinitializer, { ptr, i64, i64 } %t64, 0 + store %S.platform.Target %t65, ptr %a66 + %t67 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t67, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.5762, i64 7, i64 0 }, ptr %a70 + %t71 = call i64 @finch_str_find(ptr %a68, ptr %a70) + %t72 = icmp sge i64 %t71, 0 + br label %logic.from8646 +logic.from8646: + br i1 %t72, label %logic.end8648, label %logic.rhs8647 +logic.rhs8647: + %t73 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t73, ptr %a74 + store { ptr, i64, i64 } { ptr @.str.5764, i64 5, i64 0 }, ptr %a76 + %t77 = call i64 @finch_str_find(ptr %a74, ptr %a76) + %t78 = icmp sge i64 %t77, 0 + br label %logic.rend8649 +logic.rend8649: + br label %logic.end8648 +logic.end8648: + %t79 = phi i1 [ true, %logic.from8646 ], [ %t78, %logic.rend8649 ] + br label %logic.from8650 +logic.from8650: + br i1 %t79, label %logic.end8652, label %logic.rhs8651 +logic.rhs8651: + %t80 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t80, ptr %a81 + store { ptr, i64, i64 } { ptr @.str.5766, i64 4, i64 0 }, ptr %a83 + %t84 = call i64 @finch_str_find(ptr %a81, ptr %a83) + %t85 = icmp sge i64 %t84, 0 + br label %logic.rend8653 +logic.rend8653: + br label %logic.end8652 +logic.end8652: + %t86 = phi i1 [ true, %logic.from8650 ], [ %t85, %logic.rend8653 ] + br label %logic.from8654 +logic.from8654: + br i1 %t86, label %logic.end8656, label %logic.rhs8655 +logic.rhs8655: + %t87 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t87, ptr %a88 + store { ptr, i64, i64 } { ptr @.str.5768, i64 5, i64 0 }, ptr %a90 + %t91 = call i64 @finch_str_find(ptr %a88, ptr %a90) + %t92 = icmp sge i64 %t91, 0 + br label %logic.rend8657 +logic.rend8657: + br label %logic.end8656 +logic.end8656: + %t93 = phi i1 [ true, %logic.from8654 ], [ %t92, %logic.rend8657 ] + %t94 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 1 + store i1 %t93, ptr %t94 + %t95 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t95, ptr %a96 + store { ptr, i64, i64 } { ptr @.str.5770, i64 4, i64 0 }, ptr %a98 + %t99 = call i64 @finch_str_find(ptr %a96, ptr %a98) + %t100 = icmp sge i64 %t99, 0 + %t101 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 2 + store i1 %t100, ptr %t101 + %t102 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t102, ptr %a103 + store { ptr, i64, i64 } { ptr @.str.5772, i64 5, i64 0 }, ptr %a105 + %t106 = call i64 @finch_str_find(ptr %a103, ptr %a105) + %t107 = icmp sge i64 %t106, 0 + br label %logic.from8658 +logic.from8658: + br i1 %t107, label %logic.end8660, label %logic.rhs8659 +logic.rhs8659: + %t108 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t108, ptr %a109 + store { ptr, i64, i64 } { ptr @.str.5774, i64 6, i64 0 }, ptr %a111 + %t112 = call i64 @finch_str_find(ptr %a109, ptr %a111) + %t113 = icmp sge i64 %t112, 0 + br label %logic.rend8661 +logic.rend8661: + br label %logic.end8660 +logic.end8660: + %t114 = phi i1 [ true, %logic.from8658 ], [ %t113, %logic.rend8661 ] + br label %logic.from8662 +logic.from8662: + br i1 %t114, label %logic.end8664, label %logic.rhs8663 +logic.rhs8663: + %t115 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t115, ptr %a116 + store { ptr, i64, i64 } { ptr @.str.5776, i64 5, i64 0 }, ptr %a118 + %t119 = call i64 @finch_str_find(ptr %a116, ptr %a118) + %t120 = icmp sge i64 %t119, 0 + br label %logic.rend8665 +logic.rend8665: + br label %logic.end8664 +logic.end8664: + %t121 = phi i1 [ true, %logic.from8662 ], [ %t120, %logic.rend8665 ] + %t122 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 3 + store i1 %t121, ptr %t122 + %t123 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t123, ptr %a124 + store { ptr, i64, i64 } { ptr @.str.5778, i64 7, i64 0 }, ptr %a126 + %t127 = call i32 @finch_str_starts(ptr %a124, ptr %a126) + %t128 = icmp ne i32 %t127, 0 + br label %logic.from8666 +logic.from8666: + br i1 %t128, label %logic.end8668, label %logic.rhs8667 +logic.rhs8667: + %t129 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t129, ptr %a130 + store { ptr, i64, i64 } { ptr @.str.5780, i64 5, i64 0 }, ptr %a132 + %t133 = call i32 @finch_str_starts(ptr %a130, ptr %a132) + %t134 = icmp ne i32 %t133, 0 + br label %logic.rend8669 +logic.rend8669: + br label %logic.end8668 +logic.end8668: + %t135 = phi i1 [ true, %logic.from8666 ], [ %t134, %logic.rend8669 ] + %t136 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 4 + store i1 %t135, ptr %t136 + %t137 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t137, ptr %a138 + store { ptr, i64, i64 } { ptr @.str.5782, i64 7, i64 0 }, ptr %a140 + %t141 = call i32 @finch_str_starts(ptr %a138, ptr %a140) + %t142 = icmp ne i32 %t141, 0 + br label %logic.from8670 +logic.from8670: + br i1 %t142, label %logic.end8672, label %logic.rhs8671 +logic.rhs8671: + %t143 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t143, ptr %a144 + store { ptr, i64, i64 } { ptr @.str.5784, i64 5, i64 0 }, ptr %a146 + %t147 = call i32 @finch_str_starts(ptr %a144, ptr %a146) + %t148 = icmp ne i32 %t147, 0 + br label %logic.rend8673 +logic.rend8673: + br label %logic.end8672 +logic.end8672: + %t149 = phi i1 [ true, %logic.from8670 ], [ %t148, %logic.rend8673 ] + store i1 %t149, ptr %a150 + %t151 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t151, ptr %a152 + store { ptr, i64, i64 } { ptr @.str.5786, i64 5, i64 0 }, ptr %a154 + %t155 = call i64 @finch_str_find(ptr %a152, ptr %a154) + %t156 = icmp sge i64 %t155, 0 + br label %logic.from8674 +logic.from8674: + br i1 %t156, label %logic.end8676, label %logic.rhs8675 +logic.rhs8675: + %t157 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t157, ptr %a158 + store { ptr, i64, i64 } { ptr @.str.5788, i64 6, i64 0 }, ptr %a160 + %t161 = call i64 @finch_str_find(ptr %a158, ptr %a160) + %t162 = icmp sge i64 %t161, 0 + br label %logic.rend8677 +logic.rend8677: + br label %logic.end8676 +logic.end8676: + %t163 = phi i1 [ true, %logic.from8674 ], [ %t162, %logic.rend8677 ] + store i1 %t163, ptr %a164 + %t165 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 1 + %t166 = load i1, ptr %t165 + br label %logic.from8678 +logic.from8678: + br i1 %t166, label %logic.end8680, label %logic.rhs8679 +logic.rhs8679: + %t167 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 3 + %t168 = load i1, ptr %t167 + %t169 = load i1, ptr %a164 + %t170 = icmp ne i1 %t168, %t169 + br label %logic.rend8681 +logic.rend8681: + br label %logic.end8680 +logic.end8680: + %t171 = phi i1 [ true, %logic.from8678 ], [ %t170, %logic.rend8681 ] + br label %logic.from8682 +logic.from8682: + br i1 %t171, label %logic.end8684, label %logic.rhs8683 +logic.rhs8683: + %t172 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 4 + %t173 = load i1, ptr %t172 + %t174 = load i1, ptr %a150 + %t175 = icmp ne i1 %t173, %t174 + br label %logic.rend8685 +logic.rend8685: + br label %logic.end8684 +logic.end8684: + %t176 = phi i1 [ true, %logic.from8682 ], [ %t175, %logic.rend8685 ] + %t177 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 5 + store i1 %t176, ptr %t177 + %t178 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 6 + store { ptr, i64, i64 } { ptr @.str.5789, i64 0, i64 0 }, ptr %t178 + %t179 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 1 + %t180 = load i1, ptr %t179 + br i1 %t180, label %then8686, label %endif8688 +then8686: + %t181 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 6 + store { ptr, i64, i64 } { ptr @.str.5790, i64 4, i64 0 }, ptr %t181 + br label %endif8688 +endif8688: + %t182 = extractvalue { ptr, i64, i64 } { ptr @.str.5791, i64 8, i64 0 }, 0 + %t183 = icmp eq ptr %t182, null + %t184 = select i1 %t183, ptr @.str.5792, ptr %t182 + %t185 = call ptr @getenv(ptr %t184) + store { ptr, i64, i64 } zeroinitializer, ptr %a186 + call void @finch_str_from_c(ptr %a186, ptr %t185) + %t187 = load { ptr, i64, i64 }, ptr %a186 + store { ptr, i64, i64 } %t187, ptr %a188 + call void @finch_str_copy(ptr %a189, ptr %a188) + %t190 = load { ptr, i64, i64 }, ptr %a189 + store { ptr, i64, i64 } %t190, ptr %a191 + %t192 = getelementptr inbounds { ptr, i64, i64 }, ptr %a191, i32 0, i32 1 + %t193 = load i64, ptr %t192 + %t194 = icmp sgt i64 %t193, 0 + br i1 %t194, label %then8689, label %else8690 +then8689: + %t195 = load { ptr, i64, i64 }, ptr %a191 + %t196 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 7 + store { ptr, i64, i64 } %t195, ptr %a197 + call void @finch_str_copy(ptr %a198, ptr %a197) + %t199 = load { ptr, i64, i64 }, ptr %a198 + store { ptr, i64, i64 } %t199, ptr %t196 + br label %endif8691 +else8690: + %t200 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 5 + %t201 = load i1, ptr %t200 + br label %logic.from8692 +logic.from8692: + br i1 %t201, label %logic.rhs8693, label %logic.end8694 +logic.rhs8693: + %t202 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 1 + %t203 = load i1, ptr %t202 + br label %logic.rend8695 +logic.rend8695: + br label %logic.end8694 +logic.end8694: + %t204 = phi i1 [ false, %logic.from8692 ], [ %t203, %logic.rend8695 ] + br i1 %t204, label %then8696, label %else8697 +then8696: + %t205 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 7 + store { ptr, i64, i64 } { ptr @.str.5793, i64 22, i64 0 }, ptr %t205 + br label %endif8698 +else8697: + %t206 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 5 + %t207 = load i1, ptr %t206 + br label %logic.from8699 +logic.from8699: + br i1 %t207, label %logic.rhs8700, label %logic.end8701 +logic.rhs8700: + %t208 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 4 + %t209 = load i1, ptr %t208 + br label %logic.rend8702 +logic.rend8702: + br label %logic.end8701 +logic.end8701: + %t210 = phi i1 [ false, %logic.from8699 ], [ %t209, %logic.rend8702 ] + br label %logic.from8703 +logic.from8703: + br i1 %t210, label %logic.rhs8704, label %logic.end8705 +logic.rhs8704: + %t211 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 3 + %t212 = load i1, ptr %t211 + %t213 = xor i1 %t212, true + br label %logic.rend8706 +logic.rend8706: + br label %logic.end8705 +logic.end8705: + %t214 = phi i1 [ false, %logic.from8703 ], [ %t213, %logic.rend8706 ] + br i1 %t214, label %then8707, label %else8708 +then8707: + %t215 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 7 + store { ptr, i64, i64 } { ptr @.str.5794, i64 21, i64 0 }, ptr %t215 + br label %endif8709 +else8708: + %t216 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 5 + %t217 = load i1, ptr %t216 + br i1 %t217, label %then8710, label %else8711 +then8710: + %t218 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.5795, i64 15, i64 0 }, ptr %a220 + store { ptr, i64, i64 } %t218, ptr %a221 + call void @finch_str_concat(ptr %a219, ptr %a220, ptr %a221) + %t222 = load { ptr, i64, i64 }, ptr %a219 + %t223 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 7 + store { ptr, i64, i64 } %t222, ptr %t223 + br label %endif8712 +else8711: + %t224 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 7 + store { ptr, i64, i64 } { ptr @.str.5796, i64 2, i64 0 }, ptr %t224 + br label %endif8712 +endif8712: + br label %endif8709 +endif8709: + br label %endif8698 +endif8698: + br label %endif8691 +endif8691: + %t225 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 5 + %t226 = load i1, ptr %t225 + br label %logic.from8713 +logic.from8713: + br i1 %t226, label %logic.rhs8714, label %logic.end8715 +logic.rhs8714: + %t227 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 1 + %t228 = load i1, ptr %t227 + br label %logic.rend8716 +logic.rend8716: + br label %logic.end8715 +logic.end8715: + %t229 = phi i1 [ false, %logic.from8713 ], [ %t228, %logic.rend8716 ] + br i1 %t229, label %then8717, label %else8718 +then8717: + %t230 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 8 + store { ptr, i64, i64 } { ptr @.str.5797, i64 5, i64 0 }, ptr %t230 + br label %endif8719 +else8718: + %t231 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 5 + %t232 = load i1, ptr %t231 + br label %logic.from8720 +logic.from8720: + br i1 %t232, label %logic.rhs8721, label %logic.end8722 +logic.rhs8721: + %t233 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 4 + %t234 = load i1, ptr %t233 + br label %logic.rend8723 +logic.rend8723: + br label %logic.end8722 +logic.end8722: + %t235 = phi i1 [ false, %logic.from8720 ], [ %t234, %logic.rend8723 ] + br label %logic.from8724 +logic.from8724: + br i1 %t235, label %logic.rhs8725, label %logic.end8726 +logic.rhs8725: + %t236 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 3 + %t237 = load i1, ptr %t236 + %t238 = xor i1 %t237, true + br label %logic.rend8727 +logic.rend8727: + br label %logic.end8726 +logic.end8726: + %t239 = phi i1 [ false, %logic.from8724 ], [ %t238, %logic.rend8727 ] + br i1 %t239, label %then8728, label %endif8730 +then8728: + %t240 = getelementptr inbounds %S.platform.Target, ptr %a66, i32 0, i32 8 + store { ptr, i64, i64 } { ptr @.str.5798, i64 13, i64 0 }, ptr %t240 + br label %endif8730 +endif8730: + br label %endif8719 +endif8719: + %t241 = load %S.platform.Target, ptr %a66 + store %S.platform.Target %t241, ptr %a242 + call void @finch.copy.S_platform_Target(ptr %a243, ptr %a242) + %t244 = load %S.platform.Target, ptr %a243 + ret %S.platform.Target %t244 +} + +define internal i1 @finch.platform.charIsSigned(%S.platform.Target %p0) { +entry: + %a1 = alloca %S.platform.Target, align 16 + store %S.platform.Target %p0, ptr %a1 + %t2 = getelementptr inbounds %S.platform.Target, ptr %a1, i32 0, i32 4 + %t3 = load i1, ptr %t2 + %t4 = xor i1 %t3, true + br label %logic.from8731 +logic.from8731: + br i1 %t4, label %logic.end8733, label %logic.rhs8732 +logic.rhs8732: + %t5 = getelementptr inbounds %S.platform.Target, ptr %a1, i32 0, i32 3 + %t6 = load i1, ptr %t5 + br label %logic.rend8734 +logic.rend8734: + br label %logic.end8733 +logic.end8733: + %t7 = phi i1 [ true, %logic.from8731 ], [ %t6, %logic.rend8734 ] + br label %logic.from8735 +logic.from8735: + br i1 %t7, label %logic.end8737, label %logic.rhs8736 +logic.rhs8736: + %t8 = getelementptr inbounds %S.platform.Target, ptr %a1, i32 0, i32 1 + %t9 = load i1, ptr %t8 + br label %logic.rend8738 +logic.rend8738: + br label %logic.end8737 +logic.end8737: + %t10 = phi i1 [ true, %logic.from8735 ], [ %t9, %logic.rend8738 ] + ret i1 %t10 +} + +define internal { ptr, i64, i64 } @finch.linker.fingerprint({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca i32, align 16 + %a3 = alloca i64, align 16 + %a11 = alloca i8, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a20 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca i64, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store i32 2166136261, ptr %a2 + store i64 0, ptr %a3 + br label %each.cond8739 +each.cond8739: + %t4 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t5 = load i64, ptr %t4 + %t6 = load i64, ptr %a3 + %t7 = icmp slt i64 %t6, %t5 + br i1 %t7, label %each.body8740, label %each.end8742 +each.body8740: + %t8 = load ptr, ptr %a1 + %t9 = getelementptr inbounds i8, ptr %t8, i64 %t6 + %t10 = load i8, ptr %t9 + store i8 %t10, ptr %a11 + %t12 = load i32, ptr %a2 + %t13 = load i8, ptr %a11 + %t14 = zext i8 %t13 to i32 + %t15 = xor i32 %t12, %t14 + %t16 = mul i32 %t15, 16777619 + store i32 %t16, ptr %a2 + br label %each.step8741 +each.step8741: + %t17 = load i64, ptr %a3 + %t18 = add i64 %t17, 1 + store i64 %t18, ptr %a3 + br label %each.cond8739 +each.end8742: + store { ptr, i64, i64 } { ptr @.str.5799, i64 16, i64 0 }, ptr %a19 + store { ptr, i64, i64 } zeroinitializer, ptr %a20 + store i64 0, ptr %a21 + br label %for.cond8743 +for.cond8743: + %t22 = load i64, ptr %a21 + %t23 = icmp slt i64 %t22, 8 + br i1 %t23, label %for.body8744, label %for.end8746 +for.body8744: + %t24 = getelementptr inbounds { ptr, i64, i64 }, ptr %a20, i32 0, i32 1 + %t25 = load i32, ptr %a2 + %t26 = load i64, ptr %a21 + %t27 = mul i64 4, %t26 + %t28 = sub i64 28, %t27 + %t29 = trunc i64 %t28 to i32 + %t30 = lshr i32 %t25, %t29 + %t31 = and i32 %t30, 15 + %t32 = zext i32 %t31 to i64 + %t33 = load { ptr, i64, i64 }, ptr %a19 + %t34 = extractvalue { ptr, i64, i64 } %t33, 1 + %t35 = icmp uge i64 %t32, %t34 + br i1 %t35, label %range8747, label %inrange8748 +range8747: + call void @finch_panic_index(ptr @.str.5800, i64 17, i64 %t32, i64 %t34) + unreachable +inrange8748: + %t36 = extractvalue { ptr, i64, i64 } %t33, 0 + %t37 = getelementptr inbounds i8, ptr %t36, i64 %t32 + %t38 = load i8, ptr %t37 + call void @finch_str_from_char(ptr %a39, i8 signext %t38) + %t40 = load { ptr, i64, i64 }, ptr %a39 + %t41 = load i64, ptr %t24 + %t42 = add i64 %t41, 1 + call void @finch_arr_reserve(ptr %a20, i64 %t42, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t43 = load ptr, ptr %a20 + %t44 = getelementptr inbounds { ptr, i64, i64 }, ptr %t43, i64 %t41 + store { ptr, i64, i64 } %t40, ptr %t44 + store i64 %t42, ptr %t24 + br label %for.step8745 +for.step8745: + %t45 = load i64, ptr %a21 + %t46 = add i64 %t45, 1 + store i64 %t46, ptr %a21 + br label %for.cond8743 +for.end8746: + %t47 = getelementptr inbounds { ptr, i64, i64 }, ptr %a20, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.5801, i64 0, i64 0 }, ptr %a48 + call void @finch_str_join(ptr %a49, ptr %a20, ptr %a48) + %t50 = load { ptr, i64, i64 }, ptr %a49 + ret { ptr, i64, i64 } %t50 +} + +define internal { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + store { ptr, i64, i64 } { ptr @.str.5804, i64 1, i64 0 }, ptr %a5 + store { ptr, i64, i64 } { ptr @.str.5805, i64 4, i64 0 }, ptr %a6 + call void @finch_str_replace(ptr %a4, ptr %a3, ptr %a5, ptr %a6) + %t7 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.5802, i64 1, i64 0 }, ptr %a9 + store { ptr, i64, i64 } %t7, ptr %a10 + call void @finch_str_concat(ptr %a8, ptr %a9, ptr %a10) + %t11 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t11, ptr %a13 + store { ptr, i64, i64 } { ptr @.str.5806, i64 1, i64 0 }, ptr %a14 + call void @finch_str_concat(ptr %a12, ptr %a13, ptr %a14) + %t15 = load { ptr, i64, i64 }, ptr %a12 + ret { ptr, i64, i64 } %t15 +} + +define internal { ptr, i64, i64 } @finch.linker.cacheDir() { +entry: + %a5 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %t1 = extractvalue { ptr, i64, i64 } { ptr @.str.5807, i64 14, i64 0 }, 0 + %t2 = icmp eq ptr %t1, null + %t3 = select i1 %t2, ptr @.str.5808, ptr %t1 + %t4 = call ptr @getenv(ptr %t3) + store { ptr, i64, i64 } zeroinitializer, ptr %a5 + call void @finch_str_from_c(ptr %a5, ptr %t4) + %t6 = load { ptr, i64, i64 }, ptr %a5 + store { ptr, i64, i64 } %t6, ptr %a7 + call void @finch_str_copy(ptr %a8, ptr %a7) + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + %t11 = getelementptr inbounds { ptr, i64, i64 }, ptr %a10, i32 0, i32 1 + %t12 = load i64, ptr %t11 + %t13 = icmp sgt i64 %t12, 0 + br i1 %t13, label %then8749, label %endif8751 +then8749: + %t14 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t14, ptr %a16 + store { ptr, i64, i64 } { ptr @.str.5809, i64 6, i64 0 }, ptr %a17 + call void @finch_str_concat(ptr %a15, ptr %a16, ptr %a17) + %t18 = load { ptr, i64, i64 }, ptr %a15 + ret { ptr, i64, i64 } %t18 +endif8751: + %t19 = extractvalue { ptr, i64, i64 } { ptr @.str.5810, i64 4, i64 0 }, 0 + %t20 = icmp eq ptr %t19, null + %t21 = select i1 %t20, ptr @.str.5811, ptr %t19 + %t22 = call ptr @getenv(ptr %t21) + store { ptr, i64, i64 } zeroinitializer, ptr %a23 + call void @finch_str_from_c(ptr %a23, ptr %t22) + %t24 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t24, ptr %a25 + call void @finch_str_copy(ptr %a26, ptr %a25) + %t27 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t27, ptr %a28 + %t29 = getelementptr inbounds { ptr, i64, i64 }, ptr %a28, i32 0, i32 1 + %t30 = load i64, ptr %t29 + %t31 = icmp sgt i64 %t30, 0 + br i1 %t31, label %then8752, label %endif8754 +then8752: + %t32 = load { ptr, i64, i64 }, ptr %a28 + store { ptr, i64, i64 } %t32, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.5812, i64 13, i64 0 }, ptr %a35 + call void @finch_str_concat(ptr %a33, ptr %a34, ptr %a35) + %t36 = load { ptr, i64, i64 }, ptr %a33 + ret { ptr, i64, i64 } %t36 +endif8754: + ret { ptr, i64, i64 } { ptr @.str.5813, i64 16, i64 0 } +} + +define internal { ptr, i64, i64 } @finch.linker.libFlags({ ptr, i64, i64 } %p0, %S.platform.Target %p1) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca %S.platform.Target, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a32 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a47 = alloca i64, align 16 + %a51 = alloca { ptr, i64, i64 }, align 16 + %a56 = alloca { ptr, i64, i64 }, align 16 + %a57 = alloca { ptr, i64, i64 }, align 16 + %a58 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a65 = alloca { ptr, i64, i64 }, align 16 + %a66 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a72 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a87 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store %S.platform.Target %p1, ptr %a2 + %t3 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t3, ptr %a4 + store { ptr, i64, i64 } { ptr @.str.5815, i64 10, i64 0 }, ptr %a6 + %t7 = call i32 @finch_str_ends(ptr %a4, ptr %a6) + %t8 = icmp ne i32 %t7, 0 + br i1 %t8, label %then8755, label %endif8757 +then8755: + %t9 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t9, ptr %a10 + %t12 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t13 = load i64, ptr %t12 + %t14 = sub i64 %t13, 10 + call void @finch_str_sub(ptr %a11, ptr %a10, i64 0, i64 %t14, ptr @.str.5817, i64 42) + %t15 = load { ptr, i64, i64 }, ptr %a11 + %t16 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t15) + store { ptr, i64, i64 } { ptr @.str.5816, i64 11, i64 0 }, ptr %a18 + store { ptr, i64, i64 } %t16, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + ret { ptr, i64, i64 } %t20 +endif8757: + %t21 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 5 + %t22 = load i1, ptr %t21 + %t23 = xor i1 %t22, true + br i1 %t23, label %then8758, label %endif8760 +then8758: + store { ptr, i64, i64 } { ptr @.str.5818, i64 24, i64 0 }, ptr %a24 + %t25 = load { ptr, i64, i64 }, ptr %a1 + %t26 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t25) + store { ptr, i64, i64 } { ptr @.str.5819, i64 18, i64 0 }, ptr %a28 + store { ptr, i64, i64 } %t26, ptr %a29 + call void @finch_str_concat(ptr %a27, ptr %a28, ptr %a29) + %t30 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t30, ptr %a32 + store { ptr, i64, i64 } { ptr @.str.5820, i64 4, i64 0 }, ptr %a33 + call void @finch_str_concat(ptr %a31, ptr %a32, ptr %a33) + %t34 = load { ptr, i64, i64 }, ptr %a31 + %t35 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t34, ptr %a37 + store { ptr, i64, i64 } %t35, ptr %a38 + call void @finch_str_concat(ptr %a36, ptr %a37, ptr %a38) + %t39 = load { ptr, i64, i64 }, ptr %a36 + store { ptr, i64, i64 } %t39, ptr %a41 + store { ptr, i64, i64 } { ptr @.str.5821, i64 14, i64 0 }, ptr %a42 + call void @finch_str_concat(ptr %a40, ptr %a41, ptr %a42) + %t43 = load { ptr, i64, i64 }, ptr %a40 + store { ptr, i64, i64 } %t43, ptr %a45 + call void @finch_str_copy(ptr %a44, ptr %a45) + %t46 = call i64 @finch_shell(ptr %a44) + store i64 %t46, ptr %a47 + %t48 = load i64, ptr %a47 + %t49 = icmp eq i64 %t48, 0 + br label %logic.from8761 +logic.from8761: + br i1 %t49, label %logic.rhs8762, label %logic.end8763 +logic.rhs8762: + %t50 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t50, ptr %a51 + %t52 = call i32 @finch_file_exists(ptr %a51) + %t53 = icmp ne i32 %t52, 0 + br label %logic.rend8764 +logic.rend8764: + br label %logic.end8763 +logic.end8763: + %t54 = phi i1 [ false, %logic.from8761 ], [ %t53, %logic.rend8764 ] + br i1 %t54, label %then8765, label %endif8767 +then8765: + %t55 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t55, ptr %a56 + store { ptr, i64, i64 } zeroinitializer, ptr %a57 + store { ptr, i64, i64 } zeroinitializer, ptr %a58 + %t59 = call i32 @finch_try_read_file(ptr %a57, ptr %a56, ptr %a58) + %t60 = icmp eq i32 %t59, 0 + %t61 = load { ptr, i64, i64 }, ptr %a58 + %t62 = load { ptr, i64, i64 }, ptr %a57 + br i1 %t60, label %or.failed8768, label %or.ok8769 +or.failed8768: + store { ptr, i64, i64 } %t61, ptr %a63 + br label %or.bend8770 +or.bend8770: + br label %or.end8771 +or.ok8769: + br label %or.end8771 +or.end8771: + %t64 = phi { ptr, i64, i64 } [ { ptr @.str.5822, i64 0, i64 0 }, %or.bend8770 ], [ %t62, %or.ok8769 ] + store { ptr, i64, i64 } %t64, ptr %a65 + call void @finch_str_trim(ptr %a66, ptr %a65) + %t67 = load { ptr, i64, i64 }, ptr %a66 + store { ptr, i64, i64 } %t67, ptr %a68 + %t69 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.5824, i64 7, i64 0 }, ptr %a71 + store { ptr, i64, i64 } %t69, ptr %a72 + call void @finch_str_concat(ptr %a70, ptr %a71, ptr %a72) + %t73 = load { ptr, i64, i64 }, ptr %a70 + store { ptr, i64, i64 } %t73, ptr %a75 + store { ptr, i64, i64 } { ptr @.str.5825, i64 1, i64 0 }, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t77, ptr %a79 + call void @finch_str_copy(ptr %a78, ptr %a79) + %t80 = call i64 @finch_shell(ptr %a78) + %t81 = getelementptr inbounds { ptr, i64, i64 }, ptr %a68, i32 0, i32 1 + %t82 = load i64, ptr %t81 + %t83 = icmp sgt i64 %t82, 0 + br i1 %t83, label %then8772, label %endif8774 +then8772: + %t84 = load { ptr, i64, i64 }, ptr %a68 + ret { ptr, i64, i64 } %t84 +endif8774: + br label %endif8767 +endif8767: + br label %endif8760 +endif8760: + %t85 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } { ptr @.str.5826, i64 2, i64 0 }, ptr %a87 + store { ptr, i64, i64 } %t85, ptr %a88 + call void @finch_str_concat(ptr %a86, ptr %a87, ptr %a88) + %t89 = load { ptr, i64, i64 }, ptr %a86 + %t90 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t89) + ret { ptr, i64, i64 } %t90 +} + +define internal { ptr, i64, i64 } @finch.linker.guessLib({ ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a4 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca i64, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca i64, align 16 + %a33 = alloca i64, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t2, ptr %a3 + call void @finch_str_copy(ptr %a4, ptr %a3) + %t5 = load { ptr, i64, i64 }, ptr %a4 + store { ptr, i64, i64 } %t5, ptr %a6 + %t7 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t7, ptr %a8 + store { ptr, i64, i64 } { ptr @.str.5828, i64 1, i64 0 }, ptr %a10 + %t11 = call i64 @finch_str_find(ptr %a8, ptr %a10) + store i64 %t11, ptr %a12 + br label %while.cond8775 +while.cond8775: + %t13 = load i64, ptr %a12 + %t14 = icmp sge i64 %t13, 0 + br i1 %t14, label %while.body8776, label %while.end8777 +while.body8776: + %t15 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t15, ptr %a16 + %t18 = load i64, ptr %a12 + %t19 = add i64 %t18, 1 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t21 = load i64, ptr %t20 + call void @finch_str_sub(ptr %a17, ptr %a16, i64 %t19, i64 %t21, ptr @.str.5829, i64 63) + %t22 = load { ptr, i64, i64 }, ptr %a17 + store { ptr, i64, i64 } %t22, ptr %a6 + %t23 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t23, ptr %a24 + store { ptr, i64, i64 } { ptr @.str.5831, i64 1, i64 0 }, ptr %a26 + %t27 = call i64 @finch_str_find(ptr %a24, ptr %a26) + store i64 %t27, ptr %a12 + br label %while.cond8775 +while.end8777: + %t28 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t29 = load i64, ptr %t28 + store i64 %t29, ptr %a30 + %t31 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t32 = load i64, ptr %t31 + store i64 0, ptr %a33 + br label %for.cond8778 +for.cond8778: + %t34 = load i64, ptr %a33 + %t35 = icmp slt i64 %t34, %t32 + br i1 %t35, label %for.body8779, label %for.end8781 +for.body8779: + %t36 = load i64, ptr %a33 + %t37 = load { ptr, i64, i64 }, ptr %a6 + %t38 = extractvalue { ptr, i64, i64 } %t37, 1 + %t39 = icmp uge i64 %t36, %t38 + br i1 %t39, label %range8782, label %inrange8783 +range8782: + call void @finch_panic_index(ptr @.str.5832, i64 68, i64 %t36, i64 %t38) + unreachable +inrange8783: + %t40 = extractvalue { ptr, i64, i64 } %t37, 0 + %t41 = getelementptr inbounds i8, ptr %t40, i64 %t36 + %t42 = load i8, ptr %t41 + %t43 = icmp eq i8 %t42, 46 + br i1 %t43, label %then8784, label %endif8786 +then8784: + %t44 = load i64, ptr %a33 + store i64 %t44, ptr %a30 + br label %endif8786 +endif8786: + br label %for.step8780 +for.step8780: + %t45 = load i64, ptr %a33 + %t46 = add i64 %t45, 1 + store i64 %t46, ptr %a33 + br label %for.cond8778 +for.end8781: + %t47 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t47, ptr %a48 + %t50 = load i64, ptr %a30 + call void @finch_str_sub(ptr %a49, ptr %a48, i64 0, i64 %t50, ptr @.str.5833, i64 72) + %t51 = load { ptr, i64, i64 }, ptr %a49 + store { ptr, i64, i64 } %t51, ptr %a6 + br label %while.cond8787 +while.cond8787: + %t52 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t53 = load i64, ptr %t52 + %t54 = icmp sgt i64 %t53, 0 + br label %logic.from8790 +logic.from8790: + br i1 %t54, label %logic.rhs8791, label %logic.end8792 +logic.rhs8791: + %t55 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t56 = load i64, ptr %t55 + %t57 = sub i64 %t56, 1 + %t58 = load { ptr, i64, i64 }, ptr %a6 + %t59 = extractvalue { ptr, i64, i64 } %t58, 1 + %t60 = icmp uge i64 %t57, %t59 + br i1 %t60, label %range8793, label %inrange8794 +range8793: + call void @finch_panic_index(ptr @.str.5834, i64 73, i64 %t57, i64 %t59) + unreachable +inrange8794: + %t61 = extractvalue { ptr, i64, i64 } %t58, 0 + %t62 = getelementptr inbounds i8, ptr %t61, i64 %t57 + %t63 = load i8, ptr %t62 + %t64 = icmp uge i8 %t63, 48 + br label %logic.rend8795 +logic.rend8795: + br label %logic.end8792 +logic.end8792: + %t65 = phi i1 [ false, %logic.from8790 ], [ %t64, %logic.rend8795 ] + br label %logic.from8796 +logic.from8796: + br i1 %t65, label %logic.rhs8797, label %logic.end8798 +logic.rhs8797: + %t66 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t67 = load i64, ptr %t66 + %t68 = sub i64 %t67, 1 + %t69 = load { ptr, i64, i64 }, ptr %a6 + %t70 = extractvalue { ptr, i64, i64 } %t69, 1 + %t71 = icmp uge i64 %t68, %t70 + br i1 %t71, label %range8799, label %inrange8800 +range8799: + call void @finch_panic_index(ptr @.str.5835, i64 73, i64 %t68, i64 %t70) + unreachable +inrange8800: + %t72 = extractvalue { ptr, i64, i64 } %t69, 0 + %t73 = getelementptr inbounds i8, ptr %t72, i64 %t68 + %t74 = load i8, ptr %t73 + %t75 = icmp ule i8 %t74, 57 + br label %logic.rend8801 +logic.rend8801: + br label %logic.end8798 +logic.end8798: + %t76 = phi i1 [ false, %logic.from8796 ], [ %t75, %logic.rend8801 ] + br i1 %t76, label %while.body8788, label %while.end8789 +while.body8788: + %t77 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t77, ptr %a78 + %t80 = getelementptr inbounds { ptr, i64, i64 }, ptr %a6, i32 0, i32 1 + %t81 = load i64, ptr %t80 + %t82 = sub i64 %t81, 1 + call void @finch_str_sub(ptr %a79, ptr %a78, i64 0, i64 %t82, ptr @.str.5836, i64 74) + %t83 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } %t83, ptr %a6 + br label %while.cond8787 +while.end8789: + %t84 = load { ptr, i64, i64 }, ptr %a6 + store { ptr, i64, i64 } %t84, ptr %a85 + call void @finch_str_lower(ptr %a86, ptr %a85) + %t87 = load { ptr, i64, i64 }, ptr %a86 + ret { ptr, i64, i64 } %t87 +} + +define internal void @finch.linker.Names.add(ptr %self, { ptr, i64, i64 } %p0) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca i64, align 16 + %a11 = alloca i64, align 16 + %a16 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + %t2 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t3 = load i64, ptr %t2 + %t4 = icmp sgt i64 %t3, 0 + br label %logic.from8802 +logic.from8802: + br i1 %t4, label %logic.rhs8803, label %logic.end8804 +logic.rhs8803: + %t5 = getelementptr inbounds %S.linker.Names, ptr %self, i32 0, i32 0 + %t6 = getelementptr inbounds { ptr, i64, i64 }, ptr %t5, i32 0, i32 1 + %t7 = load { ptr, i64, i64 }, ptr %a1 + store i64 -1, ptr %a8 + %t9 = load i64, ptr %t6 + %t10 = load ptr, ptr %t5 + store i64 0, ptr %a11 + br label %find.cond8805 +find.cond8805: + %t12 = load i64, ptr %a11 + %t13 = icmp slt i64 %t12, %t9 + br i1 %t13, label %find.body8806, label %find.end8809 +find.body8806: + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %t10, i64 %t12 + %t15 = load { ptr, i64, i64 }, ptr %t14 + store { ptr, i64, i64 } %t15, ptr %a16 + store { ptr, i64, i64 } %t7, ptr %a17 + %t18 = call i32 @finch_str_eq(ptr %a16, ptr %a17) + %t19 = icmp ne i32 %t18, 0 + br i1 %t19, label %find.hit8807, label %find.next8808 +find.hit8807: + store i64 %t12, ptr %a8 + br label %find.end8809 +find.next8808: + %t20 = add i64 %t12, 1 + store i64 %t20, ptr %a11 + br label %find.cond8805 +find.end8809: + %t21 = load i64, ptr %a8 + %t22 = icmp sge i64 %t21, 0 + %t23 = xor i1 %t22, true + br label %logic.rend8810 +logic.rend8810: + br label %logic.end8804 +logic.end8804: + %t24 = phi i1 [ false, %logic.from8802 ], [ %t23, %logic.rend8810 ] + br i1 %t24, label %then8811, label %endif8813 +then8811: + %t25 = getelementptr inbounds %S.linker.Names, ptr %self, i32 0, i32 0 + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %t25, i32 0, i32 1 + %t27 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t27, ptr %a28 + call void @finch_str_copy(ptr %a29, ptr %a28) + %t30 = load { ptr, i64, i64 }, ptr %a29 + %t31 = load i64, ptr %t26 + %t32 = add i64 %t31, 1 + call void @finch_arr_reserve(ptr %t25, i64 %t32, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t33 = load ptr, ptr %t25 + %t34 = getelementptr inbounds { ptr, i64, i64 }, ptr %t33, i64 %t31 + store { ptr, i64, i64 } %t30, ptr %t34 + store i64 %t32, ptr %t26 + br label %endif8813 +endif8813: + ret void +} + +define internal { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %p0, { ptr, i64, i64 } %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca { ptr, i64, i64 }, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca i64, align 16 + %a14 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca i64, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a49 = alloca { ptr, i64, i64 }, align 16 + %a50 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store { ptr, i64, i64 } %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t4, ptr %a5 + %t7 = load { ptr, i64, i64 }, ptr %a2 + store { ptr, i64, i64 } %t7, ptr %a8 + %t9 = call i64 @finch_str_find(ptr %a5, ptr %a8) + store i64 %t9, ptr %a10 + %t11 = load i64, ptr %a10 + %t12 = icmp slt i64 %t11, 0 + br i1 %t12, label %then8814, label %endif8816 +then8814: + ret { ptr, i64, i64 } { ptr @.str.5839, i64 0, i64 0 } +endif8816: + %t13 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t13, ptr %a14 + %t16 = load i64, ptr %a10 + %t17 = getelementptr inbounds { ptr, i64, i64 }, ptr %a2, i32 0, i32 1 + %t18 = load i64, ptr %t17 + %t19 = add i64 %t16, %t18 + %t20 = getelementptr inbounds { ptr, i64, i64 }, ptr %a1, i32 0, i32 1 + %t21 = load i64, ptr %t20 + call void @finch_str_sub(ptr %a15, ptr %a14, i64 %t19, i64 %t21, ptr @.str.5840, i64 95) + %t22 = load { ptr, i64, i64 }, ptr %a15 + store { ptr, i64, i64 } %t22, ptr %a23 + store i64 0, ptr %a24 + br label %while.cond8817 +while.cond8817: + %t25 = load i64, ptr %a24 + %t26 = getelementptr inbounds { ptr, i64, i64 }, ptr %a23, i32 0, i32 1 + %t27 = load i64, ptr %t26 + %t28 = icmp slt i64 %t25, %t27 + br label %logic.from8820 +logic.from8820: + br i1 %t28, label %logic.rhs8821, label %logic.end8822 +logic.rhs8821: + %t29 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t29, ptr %a30 + %t32 = load i64, ptr %a24 + %t33 = load { ptr, i64, i64 }, ptr %a23 + %t34 = extractvalue { ptr, i64, i64 } %t33, 1 + %t35 = icmp uge i64 %t32, %t34 + br i1 %t35, label %range8823, label %inrange8824 +range8823: + call void @finch_panic_index(ptr @.str.5842, i64 97, i64 %t32, i64 %t34) + unreachable +inrange8824: + %t36 = extractvalue { ptr, i64, i64 } %t33, 0 + %t37 = getelementptr inbounds i8, ptr %t36, i64 %t32 + %t38 = load i8, ptr %t37 + call void @finch_str_from_char(ptr %a39, i8 signext %t38) + %t40 = load { ptr, i64, i64 }, ptr %a39 + store { ptr, i64, i64 } %t40, ptr %a41 + %t42 = call i64 @finch_str_find(ptr %a30, ptr %a41) + %t43 = icmp sge i64 %t42, 0 + %t44 = xor i1 %t43, true + br label %logic.rend8825 +logic.rend8825: + br label %logic.end8822 +logic.end8822: + %t45 = phi i1 [ false, %logic.from8820 ], [ %t44, %logic.rend8825 ] + br i1 %t45, label %while.body8818, label %while.end8819 +while.body8818: + %t46 = load i64, ptr %a24 + %t47 = add i64 %t46, 1 + store i64 %t47, ptr %a24 + br label %while.cond8817 +while.end8819: + %t48 = load { ptr, i64, i64 }, ptr %a23 + store { ptr, i64, i64 } %t48, ptr %a49 + %t51 = load i64, ptr %a24 + call void @finch_str_sub(ptr %a50, ptr %a49, i64 0, i64 %t51, ptr @.str.5843, i64 100) + %t52 = load { ptr, i64, i64 }, ptr %a50 + ret { ptr, i64, i64 } %t52 +} + +define internal i64 @finch.linker.linkFailed({ ptr, i64, i64 } %p0, %S.cimport.CImports %p1, %S.platform.Target %p2) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca %S.cimport.CImports, align 16 + %a3 = alloca %S.platform.Target, align 16 + %a4 = alloca %S.linker.Names, align 16 + %a5 = alloca %S.linker.Names, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a9 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a12 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca i64, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a28 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a36 = alloca { ptr, i64, i64 }, align 16 + %a37 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a45 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a54 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a62 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a70 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a82 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a102 = alloca { ptr, i64, i64 }, align 16 + %a103 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a112 = alloca { ptr, i64, i64 }, align 16 + %a113 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a128 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca i64, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a173 = alloca { ptr, i64, i64 }, align 16 + %a184 = alloca { ptr, i64, i64 }, align 16 + %a185 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca i64, align 16 + %a195 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + %a216 = alloca { ptr, i64, i64 }, align 16 + %a220 = alloca i64, align 16 + %a223 = alloca i64, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca i64, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a240 = alloca { ptr, i64, i64 }, align 16 + %a265 = alloca i64, align 16 + %a276 = alloca { ptr, i64, i64 }, align 16 + %a277 = alloca { ptr, i64, i64 }, align 16 + %a279 = alloca { ptr, i64, i64 }, align 16 + %a280 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca i64, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a297 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a309 = alloca { ptr, i64, i64 }, align 16 + %a314 = alloca { ptr, i64, i64 }, align 16 + %a315 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a323 = alloca { ptr, i64, i64 }, align 16 + %a324 = alloca { ptr, i64, i64 }, align 16 + %a325 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a329 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a343 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca { ptr, i64, i64 }, align 16 + %a358 = alloca { ptr, i64, i64 }, align 16 + %a359 = alloca { ptr, i64, i64 }, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a366 = alloca { ptr, i64, i64 }, align 16 + %a367 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a372 = alloca { ptr, i64, i64 }, align 16 + %a381 = alloca { ptr, i64, i64 }, align 16 + %a382 = alloca { ptr, i64, i64 }, align 16 + %a383 = alloca { ptr, i64, i64 }, align 16 + %a385 = alloca { ptr, i64, i64 }, align 16 + %a386 = alloca { ptr, i64, i64 }, align 16 + %a387 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a429 = alloca { ptr, i64, i64 }, align 16 + %a430 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store %S.cimport.CImports %p1, ptr %a2 + store %S.platform.Target %p2, ptr %a3 + store %S.linker.Names zeroinitializer, ptr %a4 + store %S.linker.Names zeroinitializer, ptr %a5 + %t6 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t6, ptr %a7 + store { ptr, i64, i64 } { ptr @.str.5845, i64 1, i64 0 }, ptr %a9 + call void @finch_str_split(ptr %a10, ptr %a7, ptr %a9) + %t11 = load { ptr, i64, i64 }, ptr %a10 + store { ptr, i64, i64 } %t11, ptr %a12 + store i64 0, ptr %a13 + br label %each.cond8826 +each.cond8826: + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %a12, i32 0, i32 1 + %t15 = load i64, ptr %t14 + %t16 = load i64, ptr %a13 + %t17 = icmp slt i64 %t16, %t15 + br i1 %t17, label %each.body8827, label %each.end8829 +each.body8827: + %t18 = load ptr, ptr %a12 + %t19 = getelementptr inbounds { ptr, i64, i64 }, ptr %t18, i64 %t16 + %t20 = load { ptr, i64, i64 }, ptr %t19 + store { ptr, i64, i64 } %t20, ptr %a21 + %t22 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } %t22, ptr %a23 + call void @finch_str_trim(ptr %a24, ptr %a23) + %t25 = load { ptr, i64, i64 }, ptr %a24 + store { ptr, i64, i64 } %t25, ptr %a26 + %t27 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t27, ptr %a28 + store { ptr, i64, i64 } { ptr @.str.5848, i64 24, i64 0 }, ptr %a30 + %t31 = call i64 @finch_str_find(ptr %a28, ptr %a30) + %t32 = icmp sge i64 %t31, 0 + br i1 %t32, label %then8830, label %else8831 +then8830: + %t33 = load { ptr, i64, i64 }, ptr %a26 + %t34 = call { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %t33, { ptr, i64, i64 } { ptr @.str.5849, i64 24, i64 0 }, { ptr, i64, i64 } { ptr @.str.5850, i64 1, i64 0 }) + call void @finch.linker.Names.add(ptr %a4, { ptr, i64, i64 } %t34) + br label %endif8832 +else8831: + %t35 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t35, ptr %a36 + store { ptr, i64, i64 } { ptr @.str.5852, i64 18, i64 0 }, ptr %a38 + %t39 = call i64 @finch_str_find(ptr %a36, ptr %a38) + %t40 = icmp sge i64 %t39, 0 + br i1 %t40, label %then8833, label %else8834 +then8833: + %t41 = load { ptr, i64, i64 }, ptr %a26 + %t42 = call { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %t41, { ptr, i64, i64 } { ptr @.str.5853, i64 18, i64 0 }, { ptr, i64, i64 } { ptr @.str.5854, i64 2, i64 0 }) + call void @finch.linker.Names.add(ptr %a4, { ptr, i64, i64 } %t42) + br label %endif8835 +else8834: + %t43 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t43, ptr %a44 + store { ptr, i64, i64 } { ptr @.str.5856, i64 27, i64 0 }, ptr %a46 + %t47 = call i64 @finch_str_find(ptr %a44, ptr %a46) + %t48 = icmp sge i64 %t47, 0 + br i1 %t48, label %then8836, label %else8837 +then8836: + %t49 = load { ptr, i64, i64 }, ptr %a26 + %t50 = call { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %t49, { ptr, i64, i64 } { ptr @.str.5857, i64 27, i64 0 }, { ptr, i64, i64 } { ptr @.str.5858, i64 3, i64 0 }) + call void @finch.linker.Names.add(ptr %a4, { ptr, i64, i64 } %t50) + br label %endif8838 +else8837: + %t51 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t51, ptr %a52 + store { ptr, i64, i64 } { ptr @.str.5860, i64 14, i64 0 }, ptr %a54 + %t55 = call i64 @finch_str_find(ptr %a52, ptr %a54) + %t56 = icmp sge i64 %t55, 0 + br i1 %t56, label %then8839, label %else8840 +then8839: + %t57 = load { ptr, i64, i64 }, ptr %a26 + %t58 = call { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %t57, { ptr, i64, i64 } { ptr @.str.5861, i64 14, i64 0 }, { ptr, i64, i64 } { ptr @.str.5862, i64 4, i64 0 }) + call void @finch.linker.Names.add(ptr %a5, { ptr, i64, i64 } %t58) + br label %endif8841 +else8840: + %t59 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t59, ptr %a60 + store { ptr, i64, i64 } { ptr @.str.5864, i64 24, i64 0 }, ptr %a62 + %t63 = call i64 @finch_str_find(ptr %a60, ptr %a62) + %t64 = icmp sge i64 %t63, 0 + br i1 %t64, label %then8842, label %else8843 +then8842: + %t65 = load { ptr, i64, i64 }, ptr %a26 + %t66 = call { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %t65, { ptr, i64, i64 } { ptr @.str.5865, i64 24, i64 0 }, { ptr, i64, i64 } { ptr @.str.5866, i64 4, i64 0 }) + call void @finch.linker.Names.add(ptr %a5, { ptr, i64, i64 } %t66) + br label %endif8844 +else8843: + %t67 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t67, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.5868, i64 13, i64 0 }, ptr %a70 + %t71 = call i64 @finch_str_find(ptr %a68, ptr %a70) + %t72 = icmp sge i64 %t71, 0 + br i1 %t72, label %then8845, label %else8846 +then8845: + %t73 = load { ptr, i64, i64 }, ptr %a26 + %t74 = call { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %t73, { ptr, i64, i64 } { ptr @.str.5869, i64 13, i64 0 }, { ptr, i64, i64 } { ptr @.str.5870, i64 1, i64 0 }) + call void @finch.linker.Names.add(ptr %a5, { ptr, i64, i64 } %t74) + br label %endif8847 +else8846: + %t75 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t75, ptr %a76 + store { ptr, i64, i64 } { ptr @.str.5872, i64 11, i64 0 }, ptr %a78 + %t79 = call i64 @finch_str_find(ptr %a76, ptr %a78) + %t80 = icmp sge i64 %t79, 0 + br label %logic.from8848 +logic.from8848: + br i1 %t80, label %logic.rhs8849, label %logic.end8850 +logic.rhs8849: + %t81 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t81, ptr %a82 + store { ptr, i64, i64 } { ptr @.str.5874, i64 9, i64 0 }, ptr %a84 + %t85 = call i64 @finch_str_find(ptr %a82, ptr %a84) + %t86 = icmp sge i64 %t85, 0 + br label %logic.rend8851 +logic.rend8851: + br label %logic.end8850 +logic.end8850: + %t87 = phi i1 [ false, %logic.from8848 ], [ %t86, %logic.rend8851 ] + br i1 %t87, label %then8852, label %else8853 +then8852: + %t88 = load { ptr, i64, i64 }, ptr %a26 + %t89 = call { ptr, i64, i64 } @finch.linker.between({ ptr, i64, i64 } %t88, { ptr, i64, i64 } { ptr @.str.5875, i64 11, i64 0 }, { ptr, i64, i64 } { ptr @.str.5876, i64 1, i64 0 }) + store { ptr, i64, i64 } %t89, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.5877, i64 10, i64 0 }, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + call void @finch.linker.Names.add(ptr %a5, { ptr, i64, i64 } %t93) + br label %endif8854 +else8853: + %t94 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t94, ptr %a95 + store { ptr, i64, i64 } { ptr @.str.5879, i64 1, i64 0 }, ptr %a97 + %t98 = call i32 @finch_str_starts(ptr %a95, ptr %a97) + %t99 = icmp ne i32 %t98, 0 + br label %logic.from8855 +logic.from8855: + br i1 %t99, label %logic.rhs8856, label %logic.end8857 +logic.rhs8856: + %t100 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t100, ptr %a101 + store { ptr, i64, i64 } { ptr @.str.5881, i64 19, i64 0 }, ptr %a103 + %t104 = call i64 @finch_str_find(ptr %a101, ptr %a103) + %t105 = icmp sge i64 %t104, 0 + br label %logic.rend8858 +logic.rend8858: + br label %logic.end8857 +logic.end8857: + %t106 = phi i1 [ false, %logic.from8855 ], [ %t105, %logic.rend8858 ] + br i1 %t106, label %then8859, label %endif8861 +then8859: + %t107 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t107, ptr %a108 + %t110 = load { ptr, i64, i64 }, ptr %a26 + store { ptr, i64, i64 } %t110, ptr %a111 + store { ptr, i64, i64 } { ptr @.str.5884, i64 19, i64 0 }, ptr %a113 + %t114 = call i64 @finch_str_find(ptr %a111, ptr %a113) + call void @finch_str_sub(ptr %a109, ptr %a108, i64 1, i64 %t114, ptr @.str.5882, i64 125) + %t115 = load { ptr, i64, i64 }, ptr %a109 + store { ptr, i64, i64 } %t115, ptr %a116 + %t117 = getelementptr inbounds %S.platform.Target, ptr %a3, i32 0, i32 3 + %t118 = load i1, ptr %t117 + br label %logic.from8862 +logic.from8862: + br i1 %t118, label %logic.rhs8863, label %logic.end8864 +logic.rhs8863: + %t119 = load { ptr, i64, i64 }, ptr %a116 + store { ptr, i64, i64 } %t119, ptr %a120 + store { ptr, i64, i64 } { ptr @.str.5886, i64 1, i64 0 }, ptr %a122 + %t123 = call i32 @finch_str_starts(ptr %a120, ptr %a122) + %t124 = icmp ne i32 %t123, 0 + br label %logic.rend8865 +logic.rend8865: + br label %logic.end8864 +logic.end8864: + %t125 = phi i1 [ false, %logic.from8862 ], [ %t124, %logic.rend8865 ] + br i1 %t125, label %then8866, label %endif8868 +then8866: + %t126 = load { ptr, i64, i64 }, ptr %a116 + store { ptr, i64, i64 } %t126, ptr %a127 + %t129 = getelementptr inbounds { ptr, i64, i64 }, ptr %a116, i32 0, i32 1 + %t130 = load i64, ptr %t129 + call void @finch_str_sub(ptr %a128, ptr %a127, i64 1, i64 %t130, ptr @.str.5887, i64 127) + %t131 = load { ptr, i64, i64 }, ptr %a128 + store { ptr, i64, i64 } %t131, ptr %a116 + br label %endif8868 +endif8868: + %t132 = load { ptr, i64, i64 }, ptr %a116 + call void @finch.linker.Names.add(ptr %a4, { ptr, i64, i64 } %t132) + br label %endif8861 +endif8861: + br label %endif8854 +endif8854: + br label %endif8847 +endif8847: + br label %endif8844 +endif8844: + br label %endif8841 +endif8841: + br label %endif8838 +endif8838: + br label %endif8835 +endif8835: + br label %endif8832 +endif8832: + br label %each.step8828 +each.step8828: + %t133 = load i64, ptr %a13 + %t134 = add i64 %t133, 1 + store i64 %t134, ptr %a13 + br label %each.cond8826 +each.end8829: + %t135 = getelementptr inbounds %S.linker.Names, ptr %a4, i32 0, i32 0 + %t136 = getelementptr inbounds { ptr, i64, i64 }, ptr %t135, i32 0, i32 1 + %t137 = load i64, ptr %t136 + %t138 = icmp eq i64 %t137, 0 + br label %logic.from8869 +logic.from8869: + br i1 %t138, label %logic.rhs8870, label %logic.end8871 +logic.rhs8870: + %t139 = getelementptr inbounds %S.linker.Names, ptr %a5, i32 0, i32 0 + %t140 = getelementptr inbounds { ptr, i64, i64 }, ptr %t139, i32 0, i32 1 + %t141 = load i64, ptr %t140 + %t142 = icmp eq i64 %t141, 0 + br label %logic.rend8872 +logic.rend8872: + br label %logic.end8871 +logic.end8871: + %t143 = phi i1 [ false, %logic.from8869 ], [ %t142, %logic.rend8872 ] + br i1 %t143, label %then8873, label %endif8875 +then8873: + %t144 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t144, ptr %a146 + store { ptr, i64, i64 } { ptr @.str.5888, i64 21, i64 0 }, ptr %a147 + call void @finch_str_concat(ptr %a145, ptr %a146, ptr %a147) + %t148 = load { ptr, i64, i64 }, ptr %a145 + %t149 = extractvalue { ptr, i64, i64 } %t148, 1 + %t150 = trunc i64 %t149 to i32 + %t151 = extractvalue { ptr, i64, i64 } %t148, 0 + %t152 = icmp eq ptr %t151, null + %t153 = select i1 %t152, ptr @.str.5889, ptr %t151 + %t154 = call i32 (ptr, ...) @printf(ptr @.str.5890, i32 %t150, ptr %t153) + %t155 = call i32 (ptr, ...) @printf(ptr @.str.5891) + ret i64 1 +endif8875: + %t156 = getelementptr inbounds %S.linker.Names, ptr %a5, i32 0, i32 0 + store i64 0, ptr %a157 + br label %each.cond8876 +each.cond8876: + %t158 = getelementptr inbounds { ptr, i64, i64 }, ptr %t156, i32 0, i32 1 + %t159 = load i64, ptr %t158 + %t160 = load i64, ptr %a157 + %t161 = icmp slt i64 %t160, %t159 + br i1 %t161, label %each.body8877, label %each.end8879 +each.body8877: + %t162 = load ptr, ptr %t156 + %t163 = getelementptr inbounds { ptr, i64, i64 }, ptr %t162, i64 %t160 + %t164 = load { ptr, i64, i64 }, ptr %t163 + store { ptr, i64, i64 } %t164, ptr %a165 + %t166 = load { ptr, i64, i64 }, ptr %a165 + store { ptr, i64, i64 } { ptr @.str.5892, i64 20, i64 0 }, ptr %a168 + store { ptr, i64, i64 } %t166, ptr %a169 + call void @finch_str_concat(ptr %a167, ptr %a168, ptr %a169) + %t170 = load { ptr, i64, i64 }, ptr %a167 + store { ptr, i64, i64 } %t170, ptr %a172 + store { ptr, i64, i64 } { ptr @.str.5893, i64 62, i64 0 }, ptr %a173 + call void @finch_str_concat(ptr %a171, ptr %a172, ptr %a173) + %t174 = load { ptr, i64, i64 }, ptr %a171 + %t175 = extractvalue { ptr, i64, i64 } %t174, 1 + %t176 = trunc i64 %t175 to i32 + %t177 = extractvalue { ptr, i64, i64 } %t174, 0 + %t178 = icmp eq ptr %t177, null + %t179 = select i1 %t178, ptr @.str.5894, ptr %t177 + %t180 = call i32 (ptr, ...) @printf(ptr @.str.5895, i32 %t176, ptr %t179) + %t181 = call i32 (ptr, ...) @printf(ptr @.str.5896) + br label %each.step8878 +each.step8878: + %t182 = load i64, ptr %a157 + %t183 = add i64 %t182, 1 + store i64 %t183, ptr %a157 + br label %each.cond8876 +each.end8879: + store { ptr, i64, i64 } zeroinitializer, ptr %a184 + store { ptr, i64, i64 } zeroinitializer, ptr %a185 + %t186 = getelementptr inbounds %S.linker.Names, ptr %a4, i32 0, i32 0 + store i64 0, ptr %a187 + br label %each.cond8880 +each.cond8880: + %t188 = getelementptr inbounds { ptr, i64, i64 }, ptr %t186, i32 0, i32 1 + %t189 = load i64, ptr %t188 + %t190 = load i64, ptr %a187 + %t191 = icmp slt i64 %t190, %t189 + br i1 %t191, label %each.body8881, label %each.end8883 +each.body8881: + %t192 = load ptr, ptr %t186 + %t193 = getelementptr inbounds { ptr, i64, i64 }, ptr %t192, i64 %t190 + %t194 = load { ptr, i64, i64 }, ptr %t193 + store { ptr, i64, i64 } %t194, ptr %a195 + store { ptr, i64, i64 } { ptr @.str.5897, i64 0, i64 0 }, ptr %a196 + %t197 = getelementptr inbounds %S.cimport.CImports, ptr %a2, i32 0, i32 0 + %t198 = load { ptr, i64, i64 }, ptr %a195 + store { ptr, i64, i64 } %t198, ptr %a199 + %t200 = call i64 @finch_map_find(ptr %t197, ptr %a199, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t201 = icmp sge i64 %t200, 0 + br i1 %t201, label %then8884, label %endif8886 +then8884: + %t202 = getelementptr inbounds %S.cimport.CImports, ptr %a2, i32 0, i32 0 + %t203 = load { ptr, i64, i64 }, ptr %a195 + store { ptr, i64, i64 } %t203, ptr %a204 + %t205 = call i64 @finch_map_find(ptr %t202, ptr %a204, i64 ptrtoint (ptr getelementptr ({ i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr null, i32 1) to i64), i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64), i32 1) + %t206 = icmp slt i64 %t205, 0 + br i1 %t206, label %map.missing8887, label %map.found8888 +map.missing8887: + store { ptr, i64, i64 } zeroinitializer, ptr %a207 + store { ptr, i64, i64 } %t203, ptr %a208 + call void @finch_buf_str(ptr %a207, ptr %a208, i32 1) + call void @finch_map_missing(ptr @.str.5898, i64 145, ptr %a207) + unreachable +map.found8888: + %t209 = getelementptr inbounds { ptr, i64, i64, i64, ptr, i64, i64 }, ptr %t202, i32 0, i32 0 + %t210 = load ptr, ptr %t209 + %t211 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t210, i64 %t205 + %t212 = getelementptr inbounds { i64, { ptr, i64, i64 }, %S.cimport.CFunc }, ptr %t211, i32 0, i32 2 + %t213 = getelementptr inbounds %S.cimport.CFunc, ptr %t212, i32 0, i32 1 + %t214 = load { ptr, i64, i64 }, ptr %t213 + store { ptr, i64, i64 } %t214, ptr %a215 + call void @finch_str_copy(ptr %a216, ptr %a215) + %t217 = load { ptr, i64, i64 }, ptr %a216 + store { ptr, i64, i64 } %t217, ptr %a196 + br label %endif8886 +endif8886: + %t218 = getelementptr inbounds { ptr, i64, i64 }, ptr %a184, i32 0, i32 1 + %t219 = load { ptr, i64, i64 }, ptr %a196 + store i64 -1, ptr %a220 + %t221 = load i64, ptr %t218 + %t222 = load ptr, ptr %a184 + store i64 0, ptr %a223 + br label %find.cond8889 +find.cond8889: + %t224 = load i64, ptr %a223 + %t225 = icmp slt i64 %t224, %t221 + br i1 %t225, label %find.body8890, label %find.end8893 +find.body8890: + %t226 = getelementptr inbounds { ptr, i64, i64 }, ptr %t222, i64 %t224 + %t227 = load { ptr, i64, i64 }, ptr %t226 + store { ptr, i64, i64 } %t227, ptr %a228 + store { ptr, i64, i64 } %t219, ptr %a229 + %t230 = call i32 @finch_str_eq(ptr %a228, ptr %a229) + %t231 = icmp ne i32 %t230, 0 + br i1 %t231, label %find.hit8891, label %find.next8892 +find.hit8891: + store i64 %t224, ptr %a220 + br label %find.end8893 +find.next8892: + %t232 = add i64 %t224, 1 + store i64 %t232, ptr %a223 + br label %find.cond8889 +find.end8893: + %t233 = load i64, ptr %a220 + store i64 %t233, ptr %a234 + %t235 = load i64, ptr %a234 + %t236 = icmp slt i64 %t235, 0 + br i1 %t236, label %then8894, label %endif8896 +then8894: + %t237 = getelementptr inbounds { ptr, i64, i64 }, ptr %a184, i32 0, i32 1 + %t238 = load { ptr, i64, i64 }, ptr %a196 + store { ptr, i64, i64 } %t238, ptr %a239 + call void @finch_str_copy(ptr %a240, ptr %a239) + %t241 = load { ptr, i64, i64 }, ptr %a240 + %t242 = load i64, ptr %t237 + %t243 = add i64 %t242, 1 + call void @finch_arr_reserve(ptr %a184, i64 %t243, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t244 = load ptr, ptr %a184 + %t245 = getelementptr inbounds { ptr, i64, i64 }, ptr %t244, i64 %t242 + store { ptr, i64, i64 } %t241, ptr %t245 + store i64 %t243, ptr %t237 + %t246 = getelementptr inbounds { ptr, i64, i64 }, ptr %a185, i32 0, i32 1 + %t247 = load i64, ptr %t246 + %t248 = add i64 %t247, 1 + call void @finch_arr_reserve(ptr %a185, i64 %t248, i64 ptrtoint (ptr getelementptr (%S.linker.Names, ptr null, i32 1) to i64)) + %t249 = load ptr, ptr %a185 + %t250 = getelementptr inbounds %S.linker.Names, ptr %t249, i64 %t247 + store %S.linker.Names zeroinitializer, ptr %t250 + store i64 %t248, ptr %t246 + %t251 = getelementptr inbounds { ptr, i64, i64 }, ptr %a184, i32 0, i32 1 + %t252 = load i64, ptr %t251 + %t253 = sub i64 %t252, 1 + store i64 %t253, ptr %a234 + br label %endif8896 +endif8896: + %t254 = load i64, ptr %a234 + %t255 = load { ptr, i64, i64 }, ptr %a185 + %t256 = extractvalue { ptr, i64, i64 } %t255, 1 + %t257 = icmp uge i64 %t254, %t256 + br i1 %t257, label %range8897, label %inrange8898 +range8897: + call void @finch_panic_index(ptr @.str.5899, i64 153, i64 %t254, i64 %t256) + unreachable +inrange8898: + %t258 = extractvalue { ptr, i64, i64 } %t255, 0 + %t259 = getelementptr inbounds %S.linker.Names, ptr %t258, i64 %t254 + %t260 = load { ptr, i64, i64 }, ptr %a195 + call void @finch.linker.Names.add(ptr %t259, { ptr, i64, i64 } %t260) + br label %each.step8882 +each.step8882: + %t261 = load i64, ptr %a187 + %t262 = add i64 %t261, 1 + store i64 %t262, ptr %a187 + br label %each.cond8880 +each.end8883: + %t263 = getelementptr inbounds { ptr, i64, i64 }, ptr %a184, i32 0, i32 1 + %t264 = load i64, ptr %t263 + store i64 0, ptr %a265 + br label %for.cond8899 +for.cond8899: + %t266 = load i64, ptr %a265 + %t267 = icmp slt i64 %t266, %t264 + br i1 %t267, label %for.body8900, label %for.end8902 +for.body8900: + %t268 = load i64, ptr %a265 + %t269 = load { ptr, i64, i64 }, ptr %a185 + %t270 = extractvalue { ptr, i64, i64 } %t269, 1 + %t271 = icmp uge i64 %t268, %t270 + br i1 %t271, label %range8903, label %inrange8904 +range8903: + call void @finch_panic_index(ptr @.str.5900, i64 156, i64 %t268, i64 %t270) + unreachable +inrange8904: + %t272 = extractvalue { ptr, i64, i64 } %t269, 0 + %t273 = getelementptr inbounds %S.linker.Names, ptr %t272, i64 %t268 + %t274 = getelementptr inbounds %S.linker.Names, ptr %t273, i32 0, i32 0 + %t275 = load { ptr, i64, i64 }, ptr %t274 + store { ptr, i64, i64 } %t275, ptr %a276 + call void @finch.copy.arr_str(ptr %a277, ptr %a276) + %t278 = load { ptr, i64, i64 }, ptr %a277 + store { ptr, i64, i64 } %t278, ptr %a279 + store { ptr, i64, i64 } zeroinitializer, ptr %a280 + %t281 = getelementptr inbounds { ptr, i64, i64 }, ptr %a279, i32 0, i32 1 + %t282 = load i64, ptr %t281 + store i64 0, ptr %a283 + br label %for.cond8905 +for.cond8905: + %t284 = load i64, ptr %a283 + %t285 = icmp slt i64 %t284, %t282 + br i1 %t285, label %for.body8906, label %for.end8908 +for.body8906: + %t286 = load i64, ptr %a283 + %t287 = icmp slt i64 %t286, 3 + br i1 %t287, label %then8909, label %endif8911 +then8909: + %t288 = getelementptr inbounds { ptr, i64, i64 }, ptr %a280, i32 0, i32 1 + %t289 = load i64, ptr %a283 + %t290 = load { ptr, i64, i64 }, ptr %a279 + %t291 = extractvalue { ptr, i64, i64 } %t290, 1 + %t292 = icmp uge i64 %t289, %t291 + br i1 %t292, label %range8912, label %inrange8913 +range8912: + call void @finch_panic_index(ptr @.str.5901, i64 160, i64 %t289, i64 %t291) + unreachable +inrange8913: + %t293 = extractvalue { ptr, i64, i64 } %t290, 0 + %t294 = getelementptr inbounds { ptr, i64, i64 }, ptr %t293, i64 %t289 + %t295 = load { ptr, i64, i64 }, ptr %t294 + store { ptr, i64, i64 } %t295, ptr %a296 + call void @finch_str_copy(ptr %a297, ptr %a296) + %t298 = load { ptr, i64, i64 }, ptr %a297 + %t299 = load i64, ptr %t288 + %t300 = add i64 %t299, 1 + call void @finch_arr_reserve(ptr %a280, i64 %t300, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t301 = load ptr, ptr %a280 + %t302 = getelementptr inbounds { ptr, i64, i64 }, ptr %t301, i64 %t299 + store { ptr, i64, i64 } %t298, ptr %t302 + store i64 %t300, ptr %t288 + br label %endif8911 +endif8911: + br label %for.step8907 +for.step8907: + %t303 = load i64, ptr %a283 + %t304 = add i64 %t303, 1 + store i64 %t304, ptr %a283 + br label %for.cond8905 +for.end8908: + %t305 = getelementptr inbounds { ptr, i64, i64 }, ptr %a280, i32 0, i32 1 + store { ptr, i64, i64 } { ptr @.str.5902, i64 2, i64 0 }, ptr %a306 + call void @finch_str_join(ptr %a307, ptr %a280, ptr %a306) + %t308 = load { ptr, i64, i64 }, ptr %a307 + store { ptr, i64, i64 } %t308, ptr %a309 + %t310 = getelementptr inbounds { ptr, i64, i64 }, ptr %a279, i32 0, i32 1 + %t311 = load i64, ptr %t310 + %t312 = icmp sgt i64 %t311, 3 + br i1 %t312, label %then8914, label %endif8916 +then8914: + %t313 = load { ptr, i64, i64 }, ptr %a309 + store { ptr, i64, i64 } %t313, ptr %a315 + store { ptr, i64, i64 } { ptr @.str.5903, i64 5, i64 0 }, ptr %a316 + call void @finch_str_concat(ptr %a314, ptr %a315, ptr %a316) + %t317 = load { ptr, i64, i64 }, ptr %a314 + %t318 = getelementptr inbounds { ptr, i64, i64 }, ptr %a279, i32 0, i32 1 + %t319 = load i64, ptr %t318 + %t320 = sub i64 %t319, 3 + call void @finch_str_from_int(ptr %a321, i64 %t320) + %t322 = load { ptr, i64, i64 }, ptr %a321 + store { ptr, i64, i64 } %t317, ptr %a324 + store { ptr, i64, i64 } %t322, ptr %a325 + call void @finch_str_concat(ptr %a323, ptr %a324, ptr %a325) + %t326 = load { ptr, i64, i64 }, ptr %a323 + store { ptr, i64, i64 } %t326, ptr %a328 + store { ptr, i64, i64 } { ptr @.str.5904, i64 5, i64 0 }, ptr %a329 + call void @finch_str_concat(ptr %a327, ptr %a328, ptr %a329) + %t330 = load { ptr, i64, i64 }, ptr %a327 + store { ptr, i64, i64 } %t330, ptr %a309 + br label %endif8916 +endif8916: + %t331 = load i64, ptr %a265 + %t332 = load { ptr, i64, i64 }, ptr %a184 + %t333 = extractvalue { ptr, i64, i64 } %t332, 1 + %t334 = icmp uge i64 %t331, %t333 + br i1 %t334, label %range8917, label %inrange8918 +range8917: + call void @finch_panic_index(ptr @.str.5905, i64 167, i64 %t331, i64 %t333) + unreachable +inrange8918: + %t335 = extractvalue { ptr, i64, i64 } %t332, 0 + %t336 = getelementptr inbounds { ptr, i64, i64 }, ptr %t335, i64 %t331 + %t337 = getelementptr inbounds { ptr, i64, i64 }, ptr %t336, i32 0, i32 1 + %t338 = load i64, ptr %t337 + %t339 = icmp eq i64 %t338, 0 + br i1 %t339, label %then8919, label %endif8921 +then8919: + %t340 = load { ptr, i64, i64 }, ptr %a309 + store { ptr, i64, i64 } { ptr @.str.5906, i64 25, i64 0 }, ptr %a342 + store { ptr, i64, i64 } %t340, ptr %a343 + call void @finch_str_concat(ptr %a341, ptr %a342, ptr %a343) + %t344 = load { ptr, i64, i64 }, ptr %a341 + %t345 = extractvalue { ptr, i64, i64 } %t344, 1 + %t346 = trunc i64 %t345 to i32 + %t347 = extractvalue { ptr, i64, i64 } %t344, 0 + %t348 = icmp eq ptr %t347, null + %t349 = select i1 %t348, ptr @.str.5907, ptr %t347 + %t350 = call i32 (ptr, ...) @printf(ptr @.str.5908, i32 %t346, ptr %t349) + %t351 = call i32 (ptr, ...) @printf(ptr @.str.5909) + br label %for.step8901 +endif8921: + store { ptr, i64, i64 } { ptr @.str.5910, i64 4, i64 0 }, ptr %a352 + %t353 = getelementptr inbounds { ptr, i64, i64 }, ptr %a279, i32 0, i32 1 + %t354 = load i64, ptr %t353 + %t355 = icmp eq i64 %t354, 1 + br i1 %t355, label %then8922, label %endif8924 +then8922: + store { ptr, i64, i64 } { ptr @.str.5911, i64 5, i64 0 }, ptr %a352 + br label %endif8924 +endif8924: + %t356 = load { ptr, i64, i64 }, ptr %a309 + store { ptr, i64, i64 } { ptr @.str.5912, i64 7, i64 0 }, ptr %a358 + store { ptr, i64, i64 } %t356, ptr %a359 + call void @finch_str_concat(ptr %a357, ptr %a358, ptr %a359) + %t360 = load { ptr, i64, i64 }, ptr %a357 + store { ptr, i64, i64 } %t360, ptr %a362 + store { ptr, i64, i64 } { ptr @.str.5913, i64 1, i64 0 }, ptr %a363 + call void @finch_str_concat(ptr %a361, ptr %a362, ptr %a363) + %t364 = load { ptr, i64, i64 }, ptr %a361 + %t365 = load { ptr, i64, i64 }, ptr %a352 + store { ptr, i64, i64 } %t364, ptr %a367 + store { ptr, i64, i64 } %t365, ptr %a368 + call void @finch_str_concat(ptr %a366, ptr %a367, ptr %a368) + %t369 = load { ptr, i64, i64 }, ptr %a366 + store { ptr, i64, i64 } %t369, ptr %a371 + store { ptr, i64, i64 } { ptr @.str.5914, i64 7, i64 0 }, ptr %a372 + call void @finch_str_concat(ptr %a370, ptr %a371, ptr %a372) + %t373 = load { ptr, i64, i64 }, ptr %a370 + %t374 = load i64, ptr %a265 + %t375 = load { ptr, i64, i64 }, ptr %a184 + %t376 = extractvalue { ptr, i64, i64 } %t375, 1 + %t377 = icmp uge i64 %t374, %t376 + br i1 %t377, label %range8925, label %inrange8926 +range8925: + call void @finch_panic_index(ptr @.str.5915, i64 175, i64 %t374, i64 %t376) + unreachable +inrange8926: + %t378 = extractvalue { ptr, i64, i64 } %t375, 0 + %t379 = getelementptr inbounds { ptr, i64, i64 }, ptr %t378, i64 %t374 + %t380 = load { ptr, i64, i64 }, ptr %t379 + store { ptr, i64, i64 } %t373, ptr %a382 + store { ptr, i64, i64 } %t380, ptr %a383 + call void @finch_str_concat(ptr %a381, ptr %a382, ptr %a383) + %t384 = load { ptr, i64, i64 }, ptr %a381 + store { ptr, i64, i64 } %t384, ptr %a386 + store { ptr, i64, i64 } { ptr @.str.5916, i64 31, i64 0 }, ptr %a387 + call void @finch_str_concat(ptr %a385, ptr %a386, ptr %a387) + %t388 = load { ptr, i64, i64 }, ptr %a385 + %t389 = extractvalue { ptr, i64, i64 } %t388, 1 + %t390 = trunc i64 %t389 to i32 + %t391 = extractvalue { ptr, i64, i64 } %t388, 0 + %t392 = icmp eq ptr %t391, null + %t393 = select i1 %t392, ptr @.str.5917, ptr %t391 + %t394 = call i32 (ptr, ...) @printf(ptr @.str.5918, i32 %t390, ptr %t393) + %t395 = call i32 (ptr, ...) @printf(ptr @.str.5919) + %t396 = extractvalue { ptr, i64, i64 } { ptr @.str.5920, i64 74, i64 0 }, 1 + %t397 = trunc i64 %t396 to i32 + %t398 = extractvalue { ptr, i64, i64 } { ptr @.str.5920, i64 74, i64 0 }, 0 + %t399 = icmp eq ptr %t398, null + %t400 = select i1 %t399, ptr @.str.5921, ptr %t398 + %t401 = call i32 (ptr, ...) @printf(ptr @.str.5922, i32 %t397, ptr %t400) + %t402 = call i32 (ptr, ...) @printf(ptr @.str.5923) + %t403 = extractvalue { ptr, i64, i64 } { ptr @.str.5924, i64 66, i64 0 }, 1 + %t404 = trunc i64 %t403 to i32 + %t405 = extractvalue { ptr, i64, i64 } { ptr @.str.5924, i64 66, i64 0 }, 0 + %t406 = icmp eq ptr %t405, null + %t407 = select i1 %t406, ptr @.str.5925, ptr %t405 + %t408 = call i32 (ptr, ...) @printf(ptr @.str.5926, i32 %t404, ptr %t407) + %t409 = call i32 (ptr, ...) @printf(ptr @.str.5927) + %t410 = extractvalue { ptr, i64, i64 } { ptr @.str.5928, i64 0, i64 0 }, 1 + %t411 = trunc i64 %t410 to i32 + %t412 = extractvalue { ptr, i64, i64 } { ptr @.str.5928, i64 0, i64 0 }, 0 + %t413 = icmp eq ptr %t412, null + %t414 = select i1 %t413, ptr @.str.5929, ptr %t412 + %t415 = call i32 (ptr, ...) @printf(ptr @.str.5930, i32 %t411, ptr %t414) + %t416 = call i32 (ptr, ...) @printf(ptr @.str.5931) + %t417 = load i64, ptr %a265 + %t418 = load { ptr, i64, i64 }, ptr %a184 + %t419 = extractvalue { ptr, i64, i64 } %t418, 1 + %t420 = icmp uge i64 %t417, %t419 + br i1 %t420, label %range8927, label %inrange8928 +range8927: + call void @finch_panic_index(ptr @.str.5933, i64 179, i64 %t417, i64 %t419) + unreachable +inrange8928: + %t421 = extractvalue { ptr, i64, i64 } %t418, 0 + %t422 = getelementptr inbounds { ptr, i64, i64 }, ptr %t421, i64 %t417 + %t423 = load { ptr, i64, i64 }, ptr %t422 + %t424 = call { ptr, i64, i64 } @finch.linker.guessLib({ ptr, i64, i64 } %t423) + store { ptr, i64, i64 } { ptr @.str.5932, i64 12, i64 0 }, ptr %a426 + store { ptr, i64, i64 } %t424, ptr %a427 + call void @finch_str_concat(ptr %a425, ptr %a426, ptr %a427) + %t428 = load { ptr, i64, i64 }, ptr %a425 + store { ptr, i64, i64 } %t428, ptr %a430 + store { ptr, i64, i64 } { ptr @.str.5934, i64 1, i64 0 }, ptr %a431 + call void @finch_str_concat(ptr %a429, ptr %a430, ptr %a431) + %t432 = load { ptr, i64, i64 }, ptr %a429 + %t433 = extractvalue { ptr, i64, i64 } %t432, 1 + %t434 = trunc i64 %t433 to i32 + %t435 = extractvalue { ptr, i64, i64 } %t432, 0 + %t436 = icmp eq ptr %t435, null + %t437 = select i1 %t436, ptr @.str.5935, ptr %t435 + %t438 = call i32 (ptr, ...) @printf(ptr @.str.5936, i32 %t434, ptr %t437) + %t439 = call i32 (ptr, ...) @printf(ptr @.str.5937) + %t440 = extractvalue { ptr, i64, i64 } { ptr @.str.5938, i64 0, i64 0 }, 1 + %t441 = trunc i64 %t440 to i32 + %t442 = extractvalue { ptr, i64, i64 } { ptr @.str.5938, i64 0, i64 0 }, 0 + %t443 = icmp eq ptr %t442, null + %t444 = select i1 %t443, ptr @.str.5939, ptr %t442 + %t445 = call i32 (ptr, ...) @printf(ptr @.str.5940, i32 %t441, ptr %t444) + %t446 = call i32 (ptr, ...) @printf(ptr @.str.5941) + br label %for.step8901 +for.step8901: + %t447 = load i64, ptr %a265 + %t448 = add i64 %t447, 1 + store i64 %t448, ptr %a265 + br label %for.cond8899 +for.end8902: + ret i64 1 +} + +define internal { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } @finch.linker.runtimeObject({ ptr, i64, i64 } %p0, %S.platform.Target %p1, { ptr, i64, i64 } %p2) { +entry: + %a1 = alloca { ptr, i64, i64 }, align 16 + %a2 = alloca %S.platform.Target, align 16 + %a3 = alloca { ptr, i64, i64 }, align 16 + %a5 = alloca { ptr, i64, i64 }, align 16 + %a6 = alloca { ptr, i64, i64 }, align 16 + %a7 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a15 = alloca { ptr, i64, i64 }, align 16 + %a17 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a23 = alloca { ptr, i64, i64 }, align 16 + %a24 = alloca { ptr, i64, i64 }, align 16 + %a25 = alloca { ptr, i64, i64 }, align 16 + %a29 = alloca { ptr, i64, i64 }, align 16 + %a30 = alloca { ptr, i64, i64 }, align 16 + %a31 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a34 = alloca { ptr, i64, i64 }, align 16 + %a35 = alloca { ptr, i64, i64 }, align 16 + %a38 = alloca { ptr, i64, i64 }, align 16 + %a39 = alloca { ptr, i64, i64 }, align 16 + %a40 = alloca { ptr, i64, i64 }, align 16 + %a42 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a46 = alloca { ptr, i64, i64 }, align 16 + %a48 = alloca { ptr, i64, i64 }, align 16 + %a52 = alloca { ptr, i64, i64 }, align 16 + %a53 = alloca { ptr, i64, i64 }, align 16 + %a59 = alloca { ptr, i64, i64 }, align 16 + %a60 = alloca { ptr, i64, i64 }, align 16 + %a61 = alloca { ptr, i64, i64 }, align 16 + %a63 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a73 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a77 = alloca { ptr, i64, i64 }, align 16 + %a79 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a84 = alloca { ptr, i64, i64 }, align 16 + %a85 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a88 = alloca { ptr, i64, i64 }, align 16 + %a90 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a95 = alloca { ptr, i64, i64 }, align 16 + %a96 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a100 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a107 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a111 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a117 = alloca { ptr, i64, i64 }, align 16 + %a119 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a127 = alloca { ptr, i64, i64 }, align 16 + %a129 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a133 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca i64, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a147 = alloca { ptr, i64, i64 }, align 16 + %a149 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a153 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a157 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a162 = alloca { ptr, i64, i64 }, align 16 + %a163 = alloca { ptr, i64, i64 }, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a167 = alloca { ptr, i64, i64 }, align 16 + %a170 = alloca { ptr, i64, i64 }, align 16 + %a171 = alloca { ptr, i64, i64 }, align 16 + %a172 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a177 = alloca { ptr, i64, i64 }, align 16 + %a179 = alloca { ptr, i64, i64 }, align 16 + %a180 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a186 = alloca { ptr, i64, i64 }, align 16 + %a187 = alloca { ptr, i64, i64 }, align 16 + %a188 = alloca { ptr, i64, i64 }, align 16 + %a190 = alloca { ptr, i64, i64 }, align 16 + %a191 = alloca { ptr, i64, i64 }, align 16 + %a192 = alloca { ptr, i64, i64 }, align 16 + %a196 = alloca { ptr, i64, i64 }, align 16 + %a197 = alloca { ptr, i64, i64 }, align 16 + %a198 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a202 = alloca { ptr, i64, i64 }, align 16 + %a206 = alloca { ptr, i64, i64 }, align 16 + %a207 = alloca { ptr, i64, i64 }, align 16 + %a208 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a215 = alloca { ptr, i64, i64 }, align 16 + store { ptr, i64, i64 } %p0, ptr %a1 + store %S.platform.Target %p1, ptr %a2 + store { ptr, i64, i64 } %p2, ptr %a3 + %t4 = load { ptr, i64, i64 }, ptr %a1 + store { ptr, i64, i64 } %t4, ptr %a5 + store { ptr, i64, i64 } zeroinitializer, ptr %a6 + store { ptr, i64, i64 } zeroinitializer, ptr %a7 + %t8 = call i32 @finch_try_read_file(ptr %a6, ptr %a5, ptr %a7) + %t9 = icmp eq i32 %t8, 0 + %t10 = load { ptr, i64, i64 }, ptr %a7 + %t11 = load { ptr, i64, i64 }, ptr %a6 + br i1 %t9, label %try.failed8929, label %try.ok8930 +try.failed8929: + %t12 = insertvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } zeroinitializer, { ptr, i64, i64 } %t10, 2 + ret { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t12 +try.ok8930: + store { ptr, i64, i64 } %t11, ptr %a13 + %t14 = call { ptr, i64, i64 } @finch.linker.cacheDir() + store { ptr, i64, i64 } %t14, ptr %a15 + %t16 = load { ptr, i64, i64 }, ptr %a15 + store { ptr, i64, i64 } %t16, ptr %a18 + store { ptr, i64, i64 } { ptr @.str.5942, i64 4, i64 0 }, ptr %a19 + call void @finch_str_concat(ptr %a17, ptr %a18, ptr %a19) + %t20 = load { ptr, i64, i64 }, ptr %a17 + %t21 = load { ptr, i64, i64 }, ptr %a13 + %t22 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t21, ptr %a24 + store { ptr, i64, i64 } %t22, ptr %a25 + call void @finch_str_concat(ptr %a23, ptr %a24, ptr %a25) + %t26 = load { ptr, i64, i64 }, ptr %a23 + %t27 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 0 + %t28 = load { ptr, i64, i64 }, ptr %t27 + store { ptr, i64, i64 } %t26, ptr %a30 + store { ptr, i64, i64 } %t28, ptr %a31 + call void @finch_str_concat(ptr %a29, ptr %a30, ptr %a31) + %t32 = load { ptr, i64, i64 }, ptr %a29 + store { ptr, i64, i64 } %t32, ptr %a34 + store { ptr, i64, i64 } { ptr @.str.5943, i64 3, i64 0 }, ptr %a35 + call void @finch_str_concat(ptr %a33, ptr %a34, ptr %a35) + %t36 = load { ptr, i64, i64 }, ptr %a33 + %t37 = call { ptr, i64, i64 } @finch.linker.fingerprint({ ptr, i64, i64 } %t36) + store { ptr, i64, i64 } %t20, ptr %a39 + store { ptr, i64, i64 } %t37, ptr %a40 + call void @finch_str_concat(ptr %a38, ptr %a39, ptr %a40) + %t41 = load { ptr, i64, i64 }, ptr %a38 + store { ptr, i64, i64 } %t41, ptr %a43 + store { ptr, i64, i64 } { ptr @.str.5944, i64 2, i64 0 }, ptr %a44 + call void @finch_str_concat(ptr %a42, ptr %a43, ptr %a44) + %t45 = load { ptr, i64, i64 }, ptr %a42 + store { ptr, i64, i64 } %t45, ptr %a46 + %t47 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t47, ptr %a48 + %t49 = call i32 @finch_file_exists(ptr %a48) + %t50 = icmp ne i32 %t49, 0 + br i1 %t50, label %then8931, label %endif8933 +then8931: + %t51 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t51, ptr %a52 + call void @finch_str_copy(ptr %a53, ptr %a52) + %t54 = load { ptr, i64, i64 }, ptr %a53 + %t55 = insertvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } zeroinitializer, i1 true, 0 + %t56 = insertvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t55, { ptr, i64, i64 } %t54, 1 + ret { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t56 +endif8933: + %t57 = load { ptr, i64, i64 }, ptr %a15 + %t58 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t57) + store { ptr, i64, i64 } { ptr @.str.5945, i64 9, i64 0 }, ptr %a60 + store { ptr, i64, i64 } %t58, ptr %a61 + call void @finch_str_concat(ptr %a59, ptr %a60, ptr %a61) + %t62 = load { ptr, i64, i64 }, ptr %a59 + store { ptr, i64, i64 } %t62, ptr %a64 + call void @finch_str_copy(ptr %a63, ptr %a64) + %t65 = call i64 @finch_shell(ptr %a63) + %t66 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t66, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.5946, i64 5, i64 0 }, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + %t71 = call i32 @getpid() + %t72 = sext i32 %t71 to i64 + call void @finch_str_from_int(ptr %a73, i64 %t72) + %t74 = load { ptr, i64, i64 }, ptr %a73 + store { ptr, i64, i64 } %t70, ptr %a76 + store { ptr, i64, i64 } %t74, ptr %a77 + call void @finch_str_concat(ptr %a75, ptr %a76, ptr %a77) + %t78 = load { ptr, i64, i64 }, ptr %a75 + store { ptr, i64, i64 } %t78, ptr %a79 + store { ptr, i64, i64 } { ptr @.str.5947, i64 6, i64 0 }, ptr %a80 + %t81 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 1 + %t82 = load i1, ptr %t81 + br i1 %t82, label %then8934, label %endif8936 +then8934: + store { ptr, i64, i64 } { ptr @.str.5948, i64 0, i64 0 }, ptr %a80 + br label %endif8936 +endif8936: + %t83 = load { ptr, i64, i64 }, ptr %a79 + store { ptr, i64, i64 } %t83, ptr %a85 + store { ptr, i64, i64 } { ptr @.str.5949, i64 4, i64 0 }, ptr %a86 + call void @finch_str_concat(ptr %a84, ptr %a85, ptr %a86) + %t87 = load { ptr, i64, i64 }, ptr %a84 + store { ptr, i64, i64 } %t87, ptr %a88 + %t89 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t89, ptr %a91 + store { ptr, i64, i64 } { ptr @.str.5950, i64 4, i64 0 }, ptr %a92 + call void @finch_str_concat(ptr %a90, ptr %a91, ptr %a92) + %t93 = load { ptr, i64, i64 }, ptr %a90 + %t94 = load { ptr, i64, i64 }, ptr %a80 + store { ptr, i64, i64 } %t93, ptr %a96 + store { ptr, i64, i64 } %t94, ptr %a97 + call void @finch_str_concat(ptr %a95, ptr %a96, ptr %a97) + %t98 = load { ptr, i64, i64 }, ptr %a95 + store { ptr, i64, i64 } %t98, ptr %a100 + store { ptr, i64, i64 } { ptr @.str.5951, i64 4, i64 0 }, ptr %a101 + call void @finch_str_concat(ptr %a99, ptr %a100, ptr %a101) + %t102 = load { ptr, i64, i64 }, ptr %a99 + %t103 = load { ptr, i64, i64 }, ptr %a1 + %t104 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t103) + store { ptr, i64, i64 } %t102, ptr %a106 + store { ptr, i64, i64 } %t104, ptr %a107 + call void @finch_str_concat(ptr %a105, ptr %a106, ptr %a107) + %t108 = load { ptr, i64, i64 }, ptr %a105 + store { ptr, i64, i64 } %t108, ptr %a110 + store { ptr, i64, i64 } { ptr @.str.5952, i64 4, i64 0 }, ptr %a111 + call void @finch_str_concat(ptr %a109, ptr %a110, ptr %a111) + %t112 = load { ptr, i64, i64 }, ptr %a109 + %t113 = load { ptr, i64, i64 }, ptr %a79 + %t114 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t113) + store { ptr, i64, i64 } %t112, ptr %a116 + store { ptr, i64, i64 } %t114, ptr %a117 + call void @finch_str_concat(ptr %a115, ptr %a116, ptr %a117) + %t118 = load { ptr, i64, i64 }, ptr %a115 + store { ptr, i64, i64 } %t118, ptr %a120 + store { ptr, i64, i64 } { ptr @.str.5953, i64 3, i64 0 }, ptr %a121 + call void @finch_str_concat(ptr %a119, ptr %a120, ptr %a121) + %t122 = load { ptr, i64, i64 }, ptr %a119 + %t123 = load { ptr, i64, i64 }, ptr %a88 + %t124 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t123) + store { ptr, i64, i64 } %t122, ptr %a126 + store { ptr, i64, i64 } %t124, ptr %a127 + call void @finch_str_concat(ptr %a125, ptr %a126, ptr %a127) + %t128 = load { ptr, i64, i64 }, ptr %a125 + store { ptr, i64, i64 } %t128, ptr %a130 + store { ptr, i64, i64 } { ptr @.str.5954, i64 5, i64 0 }, ptr %a131 + call void @finch_str_concat(ptr %a129, ptr %a130, ptr %a131) + %t132 = load { ptr, i64, i64 }, ptr %a129 + store { ptr, i64, i64 } %t132, ptr %a134 + call void @finch_str_copy(ptr %a133, ptr %a134) + %t135 = call i64 @finch_shell(ptr %a133) + store i64 %t135, ptr %a136 + %t137 = load i64, ptr %a136 + %t138 = icmp ne i64 %t137, 0 + br i1 %t138, label %then8937, label %endif8939 +then8937: + %t139 = load { ptr, i64, i64 }, ptr %a88 + store { ptr, i64, i64 } %t139, ptr %a140 + store { ptr, i64, i64 } zeroinitializer, ptr %a141 + store { ptr, i64, i64 } zeroinitializer, ptr %a142 + %t143 = call i32 @finch_try_read_file(ptr %a141, ptr %a140, ptr %a142) + %t144 = icmp eq i32 %t143, 0 + %t145 = load { ptr, i64, i64 }, ptr %a142 + %t146 = load { ptr, i64, i64 }, ptr %a141 + br i1 %t144, label %or.failed8940, label %or.ok8941 +or.failed8940: + store { ptr, i64, i64 } %t145, ptr %a147 + br label %or.bend8942 +or.bend8942: + br label %or.end8943 +or.ok8941: + br label %or.end8943 +or.end8943: + %t148 = phi { ptr, i64, i64 } [ { ptr @.str.5955, i64 0, i64 0 }, %or.bend8942 ], [ %t146, %or.ok8941 ] + store { ptr, i64, i64 } %t148, ptr %a149 + %t150 = load { ptr, i64, i64 }, ptr %a79 + %t151 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t150) + store { ptr, i64, i64 } { ptr @.str.5956, i64 6, i64 0 }, ptr %a153 + store { ptr, i64, i64 } %t151, ptr %a154 + call void @finch_str_concat(ptr %a152, ptr %a153, ptr %a154) + %t155 = load { ptr, i64, i64 }, ptr %a152 + store { ptr, i64, i64 } %t155, ptr %a157 + store { ptr, i64, i64 } { ptr @.str.5957, i64 1, i64 0 }, ptr %a158 + call void @finch_str_concat(ptr %a156, ptr %a157, ptr %a158) + %t159 = load { ptr, i64, i64 }, ptr %a156 + %t160 = load { ptr, i64, i64 }, ptr %a88 + %t161 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t160) + store { ptr, i64, i64 } %t159, ptr %a163 + store { ptr, i64, i64 } %t161, ptr %a164 + call void @finch_str_concat(ptr %a162, ptr %a163, ptr %a164) + %t165 = load { ptr, i64, i64 }, ptr %a162 + store { ptr, i64, i64 } %t165, ptr %a167 + call void @finch_str_copy(ptr %a166, ptr %a167) + %t168 = call i64 @finch_shell(ptr %a166) + %t169 = load { ptr, i64, i64 }, ptr %a149 + store { ptr, i64, i64 } %t169, ptr %a171 + store { ptr, i64, i64 } { ptr @.str.5958, i64 46, i64 0 }, ptr %a172 + call void @finch_str_concat(ptr %a170, ptr %a171, ptr %a172) + %t173 = load { ptr, i64, i64 }, ptr %a170 + %t174 = load { ptr, i64, i64 }, ptr %a3 + store { ptr, i64, i64 } %t173, ptr %a176 + store { ptr, i64, i64 } %t174, ptr %a177 + call void @finch_str_concat(ptr %a175, ptr %a176, ptr %a177) + %t178 = load { ptr, i64, i64 }, ptr %a175 + store { ptr, i64, i64 } %t178, ptr %a180 + store { ptr, i64, i64 } { ptr @.str.5959, i64 30, i64 0 }, ptr %a181 + call void @finch_str_concat(ptr %a179, ptr %a180, ptr %a181) + %t182 = load { ptr, i64, i64 }, ptr %a179 + %t183 = insertvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } zeroinitializer, { ptr, i64, i64 } %t182, 2 + ret { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t183 +endif8939: + %t184 = load { ptr, i64, i64 }, ptr %a88 + %t185 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t184) + store { ptr, i64, i64 } { ptr @.str.5960, i64 6, i64 0 }, ptr %a187 + store { ptr, i64, i64 } %t185, ptr %a188 + call void @finch_str_concat(ptr %a186, ptr %a187, ptr %a188) + %t189 = load { ptr, i64, i64 }, ptr %a186 + store { ptr, i64, i64 } %t189, ptr %a191 + store { ptr, i64, i64 } { ptr @.str.5961, i64 7, i64 0 }, ptr %a192 + call void @finch_str_concat(ptr %a190, ptr %a191, ptr %a192) + %t193 = load { ptr, i64, i64 }, ptr %a190 + %t194 = load { ptr, i64, i64 }, ptr %a79 + %t195 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t194) + store { ptr, i64, i64 } %t193, ptr %a197 + store { ptr, i64, i64 } %t195, ptr %a198 + call void @finch_str_concat(ptr %a196, ptr %a197, ptr %a198) + %t199 = load { ptr, i64, i64 }, ptr %a196 + store { ptr, i64, i64 } %t199, ptr %a201 + store { ptr, i64, i64 } { ptr @.str.5962, i64 1, i64 0 }, ptr %a202 + call void @finch_str_concat(ptr %a200, ptr %a201, ptr %a202) + %t203 = load { ptr, i64, i64 }, ptr %a200 + %t204 = load { ptr, i64, i64 }, ptr %a46 + %t205 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t204) + store { ptr, i64, i64 } %t203, ptr %a207 + store { ptr, i64, i64 } %t205, ptr %a208 + call void @finch_str_concat(ptr %a206, ptr %a207, ptr %a208) + %t209 = load { ptr, i64, i64 }, ptr %a206 + store { ptr, i64, i64 } %t209, ptr %a211 + call void @finch_str_copy(ptr %a210, ptr %a211) + %t212 = call i64 @finch_shell(ptr %a210) + %t213 = load { ptr, i64, i64 }, ptr %a46 + store { ptr, i64, i64 } %t213, ptr %a214 + call void @finch_str_copy(ptr %a215, ptr %a214) + %t216 = load { ptr, i64, i64 }, ptr %a215 + %t217 = insertvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } zeroinitializer, i1 true, 0 + %t218 = insertvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t217, { ptr, i64, i64 } %t216, 1 + ret { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t218 +} + +define internal i64 @finch.linker.build(%S.linker.Build %p0, %S.platform.Target %p1, %S.cimport.CImports %p2) { +entry: + %a1 = alloca %S.linker.Build, align 16 + %a2 = alloca %S.platform.Target, align 16 + %a3 = alloca %S.cimport.CImports, align 16 + %a8 = alloca { ptr, i64, i64 }, align 16 + %a10 = alloca { ptr, i64, i64 }, align 16 + %a11 = alloca { ptr, i64, i64 }, align 16 + %a13 = alloca { ptr, i64, i64 }, align 16 + %a18 = alloca { ptr, i64, i64 }, align 16 + %a19 = alloca { ptr, i64, i64 }, align 16 + %a21 = alloca { ptr, i64, i64 }, align 16 + %a26 = alloca { ptr, i64, i64 }, align 16 + %a27 = alloca { ptr, i64, i64 }, align 16 + %a33 = alloca { ptr, i64, i64 }, align 16 + %a41 = alloca { ptr, i64, i64 }, align 16 + %a43 = alloca { ptr, i64, i64 }, align 16 + %a44 = alloca { ptr, i64, i64 }, align 16 + %a55 = alloca { ptr, i64, i64 }, align 16 + %a64 = alloca { ptr, i64, i64 }, align 16 + %a67 = alloca { ptr, i64, i64 }, align 16 + %a68 = alloca { ptr, i64, i64 }, align 16 + %a69 = alloca { ptr, i64, i64 }, align 16 + %a71 = alloca { ptr, i64, i64 }, align 16 + %a74 = alloca { ptr, i64, i64 }, align 16 + %a75 = alloca { ptr, i64, i64 }, align 16 + %a76 = alloca { ptr, i64, i64 }, align 16 + %a78 = alloca { ptr, i64, i64 }, align 16 + %a80 = alloca { ptr, i64, i64 }, align 16 + %a83 = alloca { ptr, i64, i64 }, align 16 + %a86 = alloca { ptr, i64, i64 }, align 16 + %a91 = alloca { ptr, i64, i64 }, align 16 + %a92 = alloca { ptr, i64, i64 }, align 16 + %a93 = alloca { ptr, i64, i64 }, align 16 + %a97 = alloca { ptr, i64, i64 }, align 16 + %a98 = alloca { ptr, i64, i64 }, align 16 + %a99 = alloca { ptr, i64, i64 }, align 16 + %a101 = alloca { ptr, i64, i64 }, align 16 + %a104 = alloca { ptr, i64, i64 }, align 16 + %a105 = alloca { ptr, i64, i64 }, align 16 + %a106 = alloca { ptr, i64, i64 }, align 16 + %a108 = alloca { ptr, i64, i64 }, align 16 + %a109 = alloca { ptr, i64, i64 }, align 16 + %a110 = alloca { ptr, i64, i64 }, align 16 + %a114 = alloca { ptr, i64, i64 }, align 16 + %a115 = alloca { ptr, i64, i64 }, align 16 + %a116 = alloca { ptr, i64, i64 }, align 16 + %a120 = alloca { ptr, i64, i64 }, align 16 + %a121 = alloca { ptr, i64, i64 }, align 16 + %a122 = alloca { ptr, i64, i64 }, align 16 + %a124 = alloca { ptr, i64, i64 }, align 16 + %a125 = alloca { ptr, i64, i64 }, align 16 + %a126 = alloca { ptr, i64, i64 }, align 16 + %a130 = alloca { ptr, i64, i64 }, align 16 + %a131 = alloca { ptr, i64, i64 }, align 16 + %a132 = alloca { ptr, i64, i64 }, align 16 + %a134 = alloca { ptr, i64, i64 }, align 16 + %a135 = alloca { ptr, i64, i64 }, align 16 + %a136 = alloca { ptr, i64, i64 }, align 16 + %a140 = alloca { ptr, i64, i64 }, align 16 + %a141 = alloca { ptr, i64, i64 }, align 16 + %a142 = alloca { ptr, i64, i64 }, align 16 + %a144 = alloca { ptr, i64, i64 }, align 16 + %a145 = alloca { ptr, i64, i64 }, align 16 + %a146 = alloca { ptr, i64, i64 }, align 16 + %a150 = alloca { ptr, i64, i64 }, align 16 + %a151 = alloca { ptr, i64, i64 }, align 16 + %a152 = alloca { ptr, i64, i64 }, align 16 + %a154 = alloca { ptr, i64, i64 }, align 16 + %a155 = alloca { ptr, i64, i64 }, align 16 + %a156 = alloca { ptr, i64, i64 }, align 16 + %a158 = alloca { ptr, i64, i64 }, align 16 + %a159 = alloca { ptr, i64, i64 }, align 16 + %a161 = alloca i64, align 16 + %a164 = alloca { ptr, i64, i64 }, align 16 + %a165 = alloca { ptr, i64, i64 }, align 16 + %a166 = alloca { ptr, i64, i64 }, align 16 + %a168 = alloca { ptr, i64, i64 }, align 16 + %a169 = alloca { ptr, i64, i64 }, align 16 + %a174 = alloca { ptr, i64, i64 }, align 16 + %a175 = alloca { ptr, i64, i64 }, align 16 + %a176 = alloca { ptr, i64, i64 }, align 16 + %a181 = alloca { ptr, i64, i64 }, align 16 + %a199 = alloca { ptr, i64, i64 }, align 16 + %a200 = alloca { ptr, i64, i64 }, align 16 + %a201 = alloca { ptr, i64, i64 }, align 16 + %a203 = alloca { ptr, i64, i64 }, align 16 + %a204 = alloca { ptr, i64, i64 }, align 16 + %a205 = alloca { ptr, i64, i64 }, align 16 + %a209 = alloca { ptr, i64, i64 }, align 16 + %a210 = alloca { ptr, i64, i64 }, align 16 + %a211 = alloca { ptr, i64, i64 }, align 16 + %a213 = alloca { ptr, i64, i64 }, align 16 + %a214 = alloca { ptr, i64, i64 }, align 16 + %a217 = alloca { ptr, i64, i64 }, align 16 + %a218 = alloca { ptr, i64, i64 }, align 16 + %a219 = alloca { ptr, i64, i64 }, align 16 + %a223 = alloca { ptr, i64, i64 }, align 16 + %a224 = alloca { ptr, i64, i64 }, align 16 + %a225 = alloca { ptr, i64, i64 }, align 16 + %a227 = alloca { ptr, i64, i64 }, align 16 + %a228 = alloca { ptr, i64, i64 }, align 16 + %a229 = alloca { ptr, i64, i64 }, align 16 + %a233 = alloca { ptr, i64, i64 }, align 16 + %a234 = alloca { ptr, i64, i64 }, align 16 + %a235 = alloca { ptr, i64, i64 }, align 16 + %a237 = alloca { ptr, i64, i64 }, align 16 + %a238 = alloca { ptr, i64, i64 }, align 16 + %a239 = alloca { ptr, i64, i64 }, align 16 + %a244 = alloca { ptr, i64, i64 }, align 16 + %a245 = alloca { ptr, i64, i64 }, align 16 + %a246 = alloca { ptr, i64, i64 }, align 16 + %a248 = alloca { ptr, i64, i64 }, align 16 + %a253 = alloca { ptr, i64, i64 }, align 16 + %a254 = alloca { ptr, i64, i64 }, align 16 + %a255 = alloca { ptr, i64, i64 }, align 16 + %a262 = alloca { ptr, i64, i64 }, align 16 + %a263 = alloca { ptr, i64, i64 }, align 16 + %a264 = alloca { ptr, i64, i64 }, align 16 + %a267 = alloca { ptr, i64, i64 }, align 16 + %a268 = alloca { ptr, i64, i64 }, align 16 + %a269 = alloca { ptr, i64, i64 }, align 16 + %a271 = alloca { ptr, i64, i64 }, align 16 + %a273 = alloca i64, align 16 + %a281 = alloca { ptr, i64, i64 }, align 16 + %a283 = alloca { ptr, i64, i64 }, align 16 + %a284 = alloca { ptr, i64, i64 }, align 16 + %a285 = alloca { ptr, i64, i64 }, align 16 + %a290 = alloca { ptr, i64, i64 }, align 16 + %a291 = alloca { ptr, i64, i64 }, align 16 + %a292 = alloca { ptr, i64, i64 }, align 16 + %a296 = alloca { ptr, i64, i64 }, align 16 + %a298 = alloca { ptr, i64, i64 }, align 16 + %a299 = alloca { ptr, i64, i64 }, align 16 + %a300 = alloca { ptr, i64, i64 }, align 16 + %a302 = alloca { ptr, i64, i64 }, align 16 + %a303 = alloca { ptr, i64, i64 }, align 16 + %a304 = alloca { ptr, i64, i64 }, align 16 + %a306 = alloca { ptr, i64, i64 }, align 16 + %a307 = alloca { ptr, i64, i64 }, align 16 + %a311 = alloca { ptr, i64, i64 }, align 16 + %a312 = alloca { ptr, i64, i64 }, align 16 + %a313 = alloca { ptr, i64, i64 }, align 16 + %a316 = alloca { ptr, i64, i64 }, align 16 + %a317 = alloca { ptr, i64, i64 }, align 16 + %a318 = alloca { ptr, i64, i64 }, align 16 + %a320 = alloca { ptr, i64, i64 }, align 16 + %a321 = alloca { ptr, i64, i64 }, align 16 + %a322 = alloca { ptr, i64, i64 }, align 16 + %a326 = alloca { ptr, i64, i64 }, align 16 + %a327 = alloca { ptr, i64, i64 }, align 16 + %a328 = alloca { ptr, i64, i64 }, align 16 + %a330 = alloca { ptr, i64, i64 }, align 16 + %a331 = alloca { ptr, i64, i64 }, align 16 + %a332 = alloca { ptr, i64, i64 }, align 16 + %a336 = alloca { ptr, i64, i64 }, align 16 + %a337 = alloca { ptr, i64, i64 }, align 16 + %a338 = alloca { ptr, i64, i64 }, align 16 + %a340 = alloca { ptr, i64, i64 }, align 16 + %a341 = alloca { ptr, i64, i64 }, align 16 + %a342 = alloca { ptr, i64, i64 }, align 16 + %a346 = alloca { ptr, i64, i64 }, align 16 + %a347 = alloca { ptr, i64, i64 }, align 16 + %a348 = alloca { ptr, i64, i64 }, align 16 + %a350 = alloca { ptr, i64, i64 }, align 16 + %a351 = alloca { ptr, i64, i64 }, align 16 + %a352 = alloca { ptr, i64, i64 }, align 16 + %a354 = alloca { ptr, i64, i64 }, align 16 + %a355 = alloca { ptr, i64, i64 }, align 16 + %a357 = alloca i64, align 16 + %a361 = alloca { ptr, i64, i64 }, align 16 + %a362 = alloca { ptr, i64, i64 }, align 16 + %a363 = alloca { ptr, i64, i64 }, align 16 + %a368 = alloca { ptr, i64, i64 }, align 16 + %a370 = alloca { ptr, i64, i64 }, align 16 + %a371 = alloca { ptr, i64, i64 }, align 16 + %a372 = alloca { ptr, i64, i64 }, align 16 + %a375 = alloca { ptr, i64, i64 }, align 16 + %a376 = alloca { ptr, i64, i64 }, align 16 + %a377 = alloca { ptr, i64, i64 }, align 16 + %a388 = alloca { ptr, i64, i64 }, align 16 + %a389 = alloca { ptr, i64, i64 }, align 16 + %a390 = alloca { ptr, i64, i64 }, align 16 + %a392 = alloca { ptr, i64, i64 }, align 16 + %a393 = alloca { ptr, i64, i64 }, align 16 + %a394 = alloca { ptr, i64, i64 }, align 16 + %a398 = alloca { ptr, i64, i64 }, align 16 + %a399 = alloca { ptr, i64, i64 }, align 16 + %a400 = alloca { ptr, i64, i64 }, align 16 + %a402 = alloca { ptr, i64, i64 }, align 16 + %a403 = alloca { ptr, i64, i64 }, align 16 + %a404 = alloca { ptr, i64, i64 }, align 16 + %a408 = alloca { ptr, i64, i64 }, align 16 + %a409 = alloca { ptr, i64, i64 }, align 16 + %a410 = alloca { ptr, i64, i64 }, align 16 + %a412 = alloca { ptr, i64, i64 }, align 16 + %a413 = alloca { ptr, i64, i64 }, align 16 + %a417 = alloca { ptr, i64, i64 }, align 16 + %a418 = alloca { ptr, i64, i64 }, align 16 + %a425 = alloca { ptr, i64, i64 }, align 16 + %a426 = alloca { ptr, i64, i64 }, align 16 + %a427 = alloca { ptr, i64, i64 }, align 16 + %a431 = alloca { ptr, i64, i64 }, align 16 + %a432 = alloca { ptr, i64, i64 }, align 16 + %a433 = alloca { ptr, i64, i64 }, align 16 + %a436 = alloca { ptr, i64, i64 }, align 16 + %a437 = alloca { ptr, i64, i64 }, align 16 + %a438 = alloca { ptr, i64, i64 }, align 16 + %a442 = alloca { ptr, i64, i64 }, align 16 + %a443 = alloca { ptr, i64, i64 }, align 16 + %a444 = alloca { ptr, i64, i64 }, align 16 + %a449 = alloca { ptr, i64, i64 }, align 16 + %a450 = alloca { ptr, i64, i64 }, align 16 + %a451 = alloca { ptr, i64, i64 }, align 16 + %a455 = alloca { ptr, i64, i64 }, align 16 + %a456 = alloca { ptr, i64, i64 }, align 16 + %a457 = alloca { ptr, i64, i64 }, align 16 + %a460 = alloca { ptr, i64, i64 }, align 16 + %a461 = alloca { ptr, i64, i64 }, align 16 + %a462 = alloca { ptr, i64, i64 }, align 16 + %a467 = alloca { ptr, i64, i64 }, align 16 + %a468 = alloca { ptr, i64, i64 }, align 16 + %a469 = alloca { ptr, i64, i64 }, align 16 + %a474 = alloca { ptr, i64, i64 }, align 16 + %a475 = alloca { ptr, i64, i64 }, align 16 + %a476 = alloca { ptr, i64, i64 }, align 16 + %a480 = alloca { ptr, i64, i64 }, align 16 + %a481 = alloca { ptr, i64, i64 }, align 16 + %a482 = alloca { ptr, i64, i64 }, align 16 + %a484 = alloca { ptr, i64, i64 }, align 16 + %a485 = alloca { ptr, i64, i64 }, align 16 + %a486 = alloca { ptr, i64, i64 }, align 16 + %a488 = alloca { ptr, i64, i64 }, align 16 + %a489 = alloca { ptr, i64, i64 }, align 16 + %a491 = alloca i64, align 16 + %a493 = alloca { ptr, i64, i64 }, align 16 + %a494 = alloca { ptr, i64, i64 }, align 16 + %a495 = alloca { ptr, i64, i64 }, align 16 + %a500 = alloca { ptr, i64, i64 }, align 16 + %a502 = alloca { ptr, i64, i64 }, align 16 + %a505 = alloca { ptr, i64, i64 }, align 16 + %a506 = alloca { ptr, i64, i64 }, align 16 + %a507 = alloca { ptr, i64, i64 }, align 16 + %a509 = alloca { ptr, i64, i64 }, align 16 + %a510 = alloca { ptr, i64, i64 }, align 16 + %a511 = alloca { ptr, i64, i64 }, align 16 + %a515 = alloca { ptr, i64, i64 }, align 16 + %a516 = alloca { ptr, i64, i64 }, align 16 + %a517 = alloca { ptr, i64, i64 }, align 16 + %a519 = alloca { ptr, i64, i64 }, align 16 + %a520 = alloca { ptr, i64, i64 }, align 16 + %a522 = alloca i64, align 16 + %a530 = alloca { ptr, i64, i64 }, align 16 + %a533 = alloca { ptr, i64, i64 }, align 16 + %a534 = alloca { ptr, i64, i64 }, align 16 + %a535 = alloca { ptr, i64, i64 }, align 16 + %a537 = alloca { ptr, i64, i64 }, align 16 + %a538 = alloca { ptr, i64, i64 }, align 16 + %a545 = alloca { ptr, i64, i64 }, align 16 + %a546 = alloca { ptr, i64, i64 }, align 16 + %a547 = alloca { ptr, i64, i64 }, align 16 + %a549 = alloca { ptr, i64, i64 }, align 16 + %a550 = alloca { ptr, i64, i64 }, align 16 + %a551 = alloca { ptr, i64, i64 }, align 16 + store %S.linker.Build %p0, ptr %a1 + store %S.platform.Target %p1, ptr %a2 + store %S.cimport.CImports %p2, ptr %a3 + %t4 = extractvalue { ptr, i64, i64 } { ptr @.str.5963, i64 11, i64 0 }, 0 + %t5 = icmp eq ptr %t4, null + %t6 = select i1 %t5, ptr @.str.5964, ptr %t4 + %t7 = call ptr @getenv(ptr %t6) + store { ptr, i64, i64 } zeroinitializer, ptr %a8 + call void @finch_str_from_c(ptr %a8, ptr %t7) + %t9 = load { ptr, i64, i64 }, ptr %a8 + store { ptr, i64, i64 } %t9, ptr %a10 + call void @finch_str_copy(ptr %a11, ptr %a10) + %t12 = load { ptr, i64, i64 }, ptr %a11 + store { ptr, i64, i64 } %t12, ptr %a13 + %t14 = getelementptr inbounds { ptr, i64, i64 }, ptr %a13, i32 0, i32 1 + %t15 = load i64, ptr %t14 + %t16 = icmp eq i64 %t15, 0 + br i1 %t16, label %then8944, label %endif8946 +then8944: + store { ptr, i64, i64 } { ptr @.str.5965, i64 5, i64 0 }, ptr %a13 + br label %endif8946 +endif8946: + %t17 = load { ptr, i64, i64 }, ptr %a13 + store { ptr, i64, i64 } %t17, ptr %a18 + call void @finch_str_copy(ptr %a19, ptr %a18) + %t20 = load { ptr, i64, i64 }, ptr %a19 + store { ptr, i64, i64 } %t20, ptr %a21 + %t22 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 5 + %t23 = load i1, ptr %t22 + br i1 %t23, label %then8947, label %else8948 +then8947: + %t24 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 7 + %t25 = load { ptr, i64, i64 }, ptr %t24 + store { ptr, i64, i64 } %t25, ptr %a26 + call void @finch_str_copy(ptr %a27, ptr %a26) + %t28 = load { ptr, i64, i64 }, ptr %a27 + store { ptr, i64, i64 } %t28, ptr %a21 + br label %endif8949 +else8948: + %t29 = extractvalue { ptr, i64, i64 } { ptr @.str.5966, i64 8, i64 0 }, 0 + %t30 = icmp eq ptr %t29, null + %t31 = select i1 %t30, ptr @.str.5967, ptr %t29 + %t32 = call ptr @getenv(ptr %t31) + store { ptr, i64, i64 } zeroinitializer, ptr %a33 + call void @finch_str_from_c(ptr %a33, ptr %t32) + %t34 = load { ptr, i64, i64 }, ptr %a33 + %t35 = extractvalue { ptr, i64, i64 } %t34, 1 + %t36 = icmp sgt i64 %t35, 0 + br i1 %t36, label %then8950, label %endif8952 +then8950: + %t37 = extractvalue { ptr, i64, i64 } { ptr @.str.5968, i64 8, i64 0 }, 0 + %t38 = icmp eq ptr %t37, null + %t39 = select i1 %t38, ptr @.str.5969, ptr %t37 + %t40 = call ptr @getenv(ptr %t39) + store { ptr, i64, i64 } zeroinitializer, ptr %a41 + call void @finch_str_from_c(ptr %a41, ptr %t40) + %t42 = load { ptr, i64, i64 }, ptr %a41 + store { ptr, i64, i64 } %t42, ptr %a43 + call void @finch_str_copy(ptr %a44, ptr %a43) + %t45 = load { ptr, i64, i64 }, ptr %a44 + store { ptr, i64, i64 } %t45, ptr %a21 + br label %endif8952 +endif8952: + br label %endif8949 +endif8949: + %t46 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 2 + %t47 = load { ptr, i64, i64 }, ptr %t46 + %t48 = load %S.platform.Target, ptr %a2 + %t49 = load { ptr, i64, i64 }, ptr %a21 + %t50 = call { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } @finch.linker.runtimeObject({ ptr, i64, i64 } %t47, %S.platform.Target %t48, { ptr, i64, i64 } %t49) + %t51 = extractvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t50, 0 + %t52 = xor i1 %t51, true + %t53 = extractvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t50, 2 + %t54 = extractvalue { i1, { ptr, i64, i64 }, { ptr, i64, i64 } } %t50, 1 + br i1 %t52, label %or.failed8953, label %or.ok8954 +or.failed8953: + store { ptr, i64, i64 } %t53, ptr %a55 + %t56 = load { ptr, i64, i64 }, ptr %a55 + %t57 = extractvalue { ptr, i64, i64 } %t56, 1 + %t58 = trunc i64 %t57 to i32 + %t59 = extractvalue { ptr, i64, i64 } %t56, 0 + %t60 = icmp eq ptr %t59, null + %t61 = select i1 %t60, ptr @.str.5970, ptr %t59 + %t62 = call i32 (ptr, ...) @printf(ptr @.str.5971, i32 %t58, ptr %t61) + %t63 = call i32 (ptr, ...) @printf(ptr @.str.5972) + ret i64 1 +or.ok8954: + store { ptr, i64, i64 } %t54, ptr %a64 + %t65 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 0 + %t66 = load { ptr, i64, i64 }, ptr %t65 + store { ptr, i64, i64 } %t66, ptr %a68 + store { ptr, i64, i64 } { ptr @.str.5973, i64 3, i64 0 }, ptr %a69 + call void @finch_str_concat(ptr %a67, ptr %a68, ptr %a69) + %t70 = load { ptr, i64, i64 }, ptr %a67 + store { ptr, i64, i64 } %t70, ptr %a71 + %t72 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 0 + %t73 = load { ptr, i64, i64 }, ptr %t72 + store { ptr, i64, i64 } %t73, ptr %a75 + store { ptr, i64, i64 } { ptr @.str.5974, i64 2, i64 0 }, ptr %a76 + call void @finch_str_concat(ptr %a74, ptr %a75, ptr %a76) + %t77 = load { ptr, i64, i64 }, ptr %a74 + store { ptr, i64, i64 } %t77, ptr %a78 + %t79 = load { ptr, i64, i64 }, ptr %a71 + store { ptr, i64, i64 } %t79, ptr %a80 + %t81 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 1 + %t82 = load { ptr, i64, i64 }, ptr %t81 + store { ptr, i64, i64 } %t82, ptr %a83 + %t84 = call i32 @finch_write_file(ptr %a80, ptr %a83) + %t85 = icmp ne i32 %t84, 0 + store { ptr, i64, i64 } { ptr @.str.5975, i64 0, i64 0 }, ptr %a86 + %t87 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 5 + %t88 = load i1, ptr %t87 + br i1 %t88, label %then8955, label %endif8957 +then8955: + %t89 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 0 + %t90 = load { ptr, i64, i64 }, ptr %t89 + store { ptr, i64, i64 } { ptr @.str.5976, i64 10, i64 0 }, ptr %a92 + store { ptr, i64, i64 } %t90, ptr %a93 + call void @finch_str_concat(ptr %a91, ptr %a92, ptr %a93) + %t94 = load { ptr, i64, i64 }, ptr %a91 + store { ptr, i64, i64 } %t94, ptr %a86 + br label %endif8957 +endif8957: + %t95 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 0 + %t96 = load { ptr, i64, i64 }, ptr %t95 + store { ptr, i64, i64 } %t96, ptr %a98 + store { ptr, i64, i64 } { ptr @.str.5977, i64 4, i64 0 }, ptr %a99 + call void @finch_str_concat(ptr %a97, ptr %a98, ptr %a99) + %t100 = load { ptr, i64, i64 }, ptr %a97 + store { ptr, i64, i64 } %t100, ptr %a101 + %t102 = load { ptr, i64, i64 }, ptr %a13 + %t103 = load { ptr, i64, i64 }, ptr %a86 + store { ptr, i64, i64 } %t102, ptr %a105 + store { ptr, i64, i64 } %t103, ptr %a106 + call void @finch_str_concat(ptr %a104, ptr %a105, ptr %a106) + %t107 = load { ptr, i64, i64 }, ptr %a104 + store { ptr, i64, i64 } %t107, ptr %a109 + store { ptr, i64, i64 } { ptr @.str.5978, i64 1, i64 0 }, ptr %a110 + call void @finch_str_concat(ptr %a108, ptr %a109, ptr %a110) + %t111 = load { ptr, i64, i64 }, ptr %a108 + %t112 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 3 + %t113 = load { ptr, i64, i64 }, ptr %t112 + store { ptr, i64, i64 } %t111, ptr %a115 + store { ptr, i64, i64 } %t113, ptr %a116 + call void @finch_str_concat(ptr %a114, ptr %a115, ptr %a116) + %t117 = load { ptr, i64, i64 }, ptr %a114 + %t118 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 4 + %t119 = load { ptr, i64, i64 }, ptr %t118 + store { ptr, i64, i64 } %t117, ptr %a121 + store { ptr, i64, i64 } %t119, ptr %a122 + call void @finch_str_concat(ptr %a120, ptr %a121, ptr %a122) + %t123 = load { ptr, i64, i64 }, ptr %a120 + store { ptr, i64, i64 } %t123, ptr %a125 + store { ptr, i64, i64 } { ptr @.str.5979, i64 7, i64 0 }, ptr %a126 + call void @finch_str_concat(ptr %a124, ptr %a125, ptr %a126) + %t127 = load { ptr, i64, i64 }, ptr %a124 + %t128 = load { ptr, i64, i64 }, ptr %a71 + %t129 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t128) + store { ptr, i64, i64 } %t127, ptr %a131 + store { ptr, i64, i64 } %t129, ptr %a132 + call void @finch_str_concat(ptr %a130, ptr %a131, ptr %a132) + %t133 = load { ptr, i64, i64 }, ptr %a130 + store { ptr, i64, i64 } %t133, ptr %a135 + store { ptr, i64, i64 } { ptr @.str.5980, i64 4, i64 0 }, ptr %a136 + call void @finch_str_concat(ptr %a134, ptr %a135, ptr %a136) + %t137 = load { ptr, i64, i64 }, ptr %a134 + %t138 = load { ptr, i64, i64 }, ptr %a78 + %t139 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t138) + store { ptr, i64, i64 } %t137, ptr %a141 + store { ptr, i64, i64 } %t139, ptr %a142 + call void @finch_str_concat(ptr %a140, ptr %a141, ptr %a142) + %t143 = load { ptr, i64, i64 }, ptr %a140 + store { ptr, i64, i64 } %t143, ptr %a145 + store { ptr, i64, i64 } { ptr @.str.5981, i64 3, i64 0 }, ptr %a146 + call void @finch_str_concat(ptr %a144, ptr %a145, ptr %a146) + %t147 = load { ptr, i64, i64 }, ptr %a144 + %t148 = load { ptr, i64, i64 }, ptr %a101 + %t149 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t148) + store { ptr, i64, i64 } %t147, ptr %a151 + store { ptr, i64, i64 } %t149, ptr %a152 + call void @finch_str_concat(ptr %a150, ptr %a151, ptr %a152) + %t153 = load { ptr, i64, i64 }, ptr %a150 + store { ptr, i64, i64 } %t153, ptr %a155 + store { ptr, i64, i64 } { ptr @.str.5982, i64 5, i64 0 }, ptr %a156 + call void @finch_str_concat(ptr %a154, ptr %a155, ptr %a156) + %t157 = load { ptr, i64, i64 }, ptr %a154 + store { ptr, i64, i64 } %t157, ptr %a159 + call void @finch_str_copy(ptr %a158, ptr %a159) + %t160 = call i64 @finch_shell(ptr %a158) + store i64 %t160, ptr %a161 + %t162 = load { ptr, i64, i64 }, ptr %a71 + %t163 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t162) + store { ptr, i64, i64 } { ptr @.str.5983, i64 6, i64 0 }, ptr %a165 + store { ptr, i64, i64 } %t163, ptr %a166 + call void @finch_str_concat(ptr %a164, ptr %a165, ptr %a166) + %t167 = load { ptr, i64, i64 }, ptr %a164 + store { ptr, i64, i64 } %t167, ptr %a169 + call void @finch_str_copy(ptr %a168, ptr %a169) + %t170 = call i64 @finch_shell(ptr %a168) + %t171 = load i64, ptr %a161 + %t172 = icmp ne i64 %t171, 0 + br i1 %t172, label %then8958, label %endif8960 +then8958: + %t173 = load { ptr, i64, i64 }, ptr %a101 + store { ptr, i64, i64 } %t173, ptr %a174 + store { ptr, i64, i64 } zeroinitializer, ptr %a175 + store { ptr, i64, i64 } zeroinitializer, ptr %a176 + %t177 = call i32 @finch_try_read_file(ptr %a175, ptr %a174, ptr %a176) + %t178 = icmp eq i32 %t177, 0 + %t179 = load { ptr, i64, i64 }, ptr %a176 + %t180 = load { ptr, i64, i64 }, ptr %a175 + br i1 %t178, label %or.failed8961, label %or.ok8962 +or.failed8961: + store { ptr, i64, i64 } %t179, ptr %a181 + br label %or.bend8963 +or.bend8963: + br label %or.end8964 +or.ok8962: + br label %or.end8964 +or.end8964: + %t182 = phi { ptr, i64, i64 } [ { ptr @.str.5984, i64 0, i64 0 }, %or.bend8963 ], [ %t180, %or.ok8962 ] + %t183 = extractvalue { ptr, i64, i64 } %t182, 1 + %t184 = trunc i64 %t183 to i32 + %t185 = extractvalue { ptr, i64, i64 } %t182, 0 + %t186 = icmp eq ptr %t185, null + %t187 = select i1 %t186, ptr @.str.5985, ptr %t185 + %t188 = call i32 (ptr, ...) @printf(ptr @.str.5986, i32 %t184, ptr %t187) + %t189 = call i32 (ptr, ...) @printf(ptr @.str.5987) + %t190 = extractvalue { ptr, i64, i64 } { ptr @.str.5988, i64 46, i64 0 }, 1 + %t191 = trunc i64 %t190 to i32 + %t192 = extractvalue { ptr, i64, i64 } { ptr @.str.5988, i64 46, i64 0 }, 0 + %t193 = icmp eq ptr %t192, null + %t194 = select i1 %t193, ptr @.str.5989, ptr %t192 + %t195 = call i32 (ptr, ...) @printf(ptr @.str.5990, i32 %t191, ptr %t194) + %t196 = call i32 (ptr, ...) @printf(ptr @.str.5991) + %t197 = load { ptr, i64, i64 }, ptr %a78 + %t198 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t197) + store { ptr, i64, i64 } { ptr @.str.5992, i64 6, i64 0 }, ptr %a200 + store { ptr, i64, i64 } %t198, ptr %a201 + call void @finch_str_concat(ptr %a199, ptr %a200, ptr %a201) + %t202 = load { ptr, i64, i64 }, ptr %a199 + store { ptr, i64, i64 } %t202, ptr %a204 + store { ptr, i64, i64 } { ptr @.str.5993, i64 1, i64 0 }, ptr %a205 + call void @finch_str_concat(ptr %a203, ptr %a204, ptr %a205) + %t206 = load { ptr, i64, i64 }, ptr %a203 + %t207 = load { ptr, i64, i64 }, ptr %a101 + %t208 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t207) + store { ptr, i64, i64 } %t206, ptr %a210 + store { ptr, i64, i64 } %t208, ptr %a211 + call void @finch_str_concat(ptr %a209, ptr %a210, ptr %a211) + %t212 = load { ptr, i64, i64 }, ptr %a209 + store { ptr, i64, i64 } %t212, ptr %a214 + call void @finch_str_copy(ptr %a213, ptr %a214) + %t215 = call i64 @finch_shell(ptr %a213) + ret i64 1 +endif8960: + %t216 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } %t216, ptr %a218 + store { ptr, i64, i64 } { ptr @.str.5994, i64 1, i64 0 }, ptr %a219 + call void @finch_str_concat(ptr %a217, ptr %a218, ptr %a219) + %t220 = load { ptr, i64, i64 }, ptr %a217 + %t221 = load { ptr, i64, i64 }, ptr %a78 + %t222 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t221) + store { ptr, i64, i64 } %t220, ptr %a224 + store { ptr, i64, i64 } %t222, ptr %a225 + call void @finch_str_concat(ptr %a223, ptr %a224, ptr %a225) + %t226 = load { ptr, i64, i64 }, ptr %a223 + store { ptr, i64, i64 } %t226, ptr %a228 + store { ptr, i64, i64 } { ptr @.str.5995, i64 1, i64 0 }, ptr %a229 + call void @finch_str_concat(ptr %a227, ptr %a228, ptr %a229) + %t230 = load { ptr, i64, i64 }, ptr %a227 + %t231 = load { ptr, i64, i64 }, ptr %a64 + %t232 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t231) + store { ptr, i64, i64 } %t230, ptr %a234 + store { ptr, i64, i64 } %t232, ptr %a235 + call void @finch_str_concat(ptr %a233, ptr %a234, ptr %a235) + %t236 = load { ptr, i64, i64 }, ptr %a233 + store { ptr, i64, i64 } %t236, ptr %a238 + store { ptr, i64, i64 } { ptr @.str.5996, i64 4, i64 0 }, ptr %a239 + call void @finch_str_concat(ptr %a237, ptr %a238, ptr %a239) + %t240 = load { ptr, i64, i64 }, ptr %a237 + %t241 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 0 + %t242 = load { ptr, i64, i64 }, ptr %t241 + %t243 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t242) + store { ptr, i64, i64 } %t240, ptr %a245 + store { ptr, i64, i64 } %t243, ptr %a246 + call void @finch_str_concat(ptr %a244, ptr %a245, ptr %a246) + %t247 = load { ptr, i64, i64 }, ptr %a244 + store { ptr, i64, i64 } %t247, ptr %a248 + %t249 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 2 + %t250 = load i1, ptr %t249 + %t251 = xor i1 %t250, true + br i1 %t251, label %then8965, label %endif8967 +then8965: + %t252 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t252, ptr %a254 + store { ptr, i64, i64 } { ptr @.str.5997, i64 4, i64 0 }, ptr %a255 + call void @finch_str_concat(ptr %a253, ptr %a254, ptr %a255) + %t256 = load { ptr, i64, i64 }, ptr %a253 + store { ptr, i64, i64 } %t256, ptr %a248 + br label %endif8967 +endif8967: + %t257 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 5 + %t258 = load i1, ptr %t257 + br i1 %t258, label %then8968, label %endif8970 +then8968: + %t259 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 3 + %t260 = load i1, ptr %t259 + br i1 %t260, label %then8971, label %else8972 +then8971: + %t261 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t261, ptr %a263 + store { ptr, i64, i64 } { ptr @.str.5998, i64 12, i64 0 }, ptr %a264 + call void @finch_str_concat(ptr %a262, ptr %a263, ptr %a264) + %t265 = load { ptr, i64, i64 }, ptr %a262 + store { ptr, i64, i64 } %t265, ptr %a248 + br label %endif8973 +else8972: + %t266 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t266, ptr %a268 + store { ptr, i64, i64 } { ptr @.str.5999, i64 8, i64 0 }, ptr %a269 + call void @finch_str_concat(ptr %a267, ptr %a268, ptr %a269) + %t270 = load { ptr, i64, i64 }, ptr %a267 + store { ptr, i64, i64 } %t270, ptr %a248 + br label %endif8973 +endif8973: + br label %endif8970 +endif8970: + store { ptr, i64, i64 } zeroinitializer, ptr %a271 + %t272 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 6 + store i64 0, ptr %a273 + br label %each.cond8974 +each.cond8974: + %t274 = getelementptr inbounds { ptr, i64, i64 }, ptr %t272, i32 0, i32 1 + %t275 = load i64, ptr %t274 + %t276 = load i64, ptr %a273 + %t277 = icmp slt i64 %t276, %t275 + br i1 %t277, label %each.body8975, label %each.end8977 +each.body8975: + %t278 = load ptr, ptr %t272 + %t279 = getelementptr inbounds { ptr, i64, i64 }, ptr %t278, i64 %t276 + %t280 = load { ptr, i64, i64 }, ptr %t279 + store { ptr, i64, i64 } %t280, ptr %a281 + %t282 = load { ptr, i64, i64 }, ptr %a281 + store { ptr, i64, i64 } %t282, ptr %a283 + store { ptr, i64, i64 } { ptr @.str.6001, i64 2, i64 0 }, ptr %a285 + %t286 = call i32 @finch_str_ends(ptr %a283, ptr %a285) + %t287 = icmp ne i32 %t286, 0 + br i1 %t287, label %then8978, label %else8979 +then8978: + %t288 = getelementptr inbounds %S.linker.Build, ptr %a1, i32 0, i32 0 + %t289 = load { ptr, i64, i64 }, ptr %t288 + store { ptr, i64, i64 } %t289, ptr %a291 + store { ptr, i64, i64 } { ptr @.str.6002, i64 1, i64 0 }, ptr %a292 + call void @finch_str_concat(ptr %a290, ptr %a291, ptr %a292) + %t293 = load { ptr, i64, i64 }, ptr %a290 + %t294 = getelementptr inbounds { ptr, i64, i64 }, ptr %a271, i32 0, i32 1 + %t295 = load i64, ptr %t294 + call void @finch_str_from_int(ptr %a296, i64 %t295) + %t297 = load { ptr, i64, i64 }, ptr %a296 + store { ptr, i64, i64 } %t293, ptr %a299 + store { ptr, i64, i64 } %t297, ptr %a300 + call void @finch_str_concat(ptr %a298, ptr %a299, ptr %a300) + %t301 = load { ptr, i64, i64 }, ptr %a298 + store { ptr, i64, i64 } %t301, ptr %a303 + store { ptr, i64, i64 } { ptr @.str.6003, i64 2, i64 0 }, ptr %a304 + call void @finch_str_concat(ptr %a302, ptr %a303, ptr %a304) + %t305 = load { ptr, i64, i64 }, ptr %a302 + store { ptr, i64, i64 } %t305, ptr %a306 + store { ptr, i64, i64 } { ptr @.str.6004, i64 6, i64 0 }, ptr %a307 + %t308 = getelementptr inbounds %S.platform.Target, ptr %a2, i32 0, i32 1 + %t309 = load i1, ptr %t308 + br i1 %t309, label %then8981, label %endif8983 +then8981: + store { ptr, i64, i64 } { ptr @.str.6005, i64 0, i64 0 }, ptr %a307 + br label %endif8983 +endif8983: + %t310 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } %t310, ptr %a312 + store { ptr, i64, i64 } { ptr @.str.6006, i64 4, i64 0 }, ptr %a313 + call void @finch_str_concat(ptr %a311, ptr %a312, ptr %a313) + %t314 = load { ptr, i64, i64 }, ptr %a311 + %t315 = load { ptr, i64, i64 }, ptr %a307 + store { ptr, i64, i64 } %t314, ptr %a317 + store { ptr, i64, i64 } %t315, ptr %a318 + call void @finch_str_concat(ptr %a316, ptr %a317, ptr %a318) + %t319 = load { ptr, i64, i64 }, ptr %a316 + store { ptr, i64, i64 } %t319, ptr %a321 + store { ptr, i64, i64 } { ptr @.str.6007, i64 4, i64 0 }, ptr %a322 + call void @finch_str_concat(ptr %a320, ptr %a321, ptr %a322) + %t323 = load { ptr, i64, i64 }, ptr %a320 + %t324 = load { ptr, i64, i64 }, ptr %a281 + %t325 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t324) + store { ptr, i64, i64 } %t323, ptr %a327 + store { ptr, i64, i64 } %t325, ptr %a328 + call void @finch_str_concat(ptr %a326, ptr %a327, ptr %a328) + %t329 = load { ptr, i64, i64 }, ptr %a326 + store { ptr, i64, i64 } %t329, ptr %a331 + store { ptr, i64, i64 } { ptr @.str.6008, i64 4, i64 0 }, ptr %a332 + call void @finch_str_concat(ptr %a330, ptr %a331, ptr %a332) + %t333 = load { ptr, i64, i64 }, ptr %a330 + %t334 = load { ptr, i64, i64 }, ptr %a306 + %t335 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t334) + store { ptr, i64, i64 } %t333, ptr %a337 + store { ptr, i64, i64 } %t335, ptr %a338 + call void @finch_str_concat(ptr %a336, ptr %a337, ptr %a338) + %t339 = load { ptr, i64, i64 }, ptr %a336 + store { ptr, i64, i64 } %t339, ptr %a341 + store { ptr, i64, i64 } { ptr @.str.6009, i64 3, i64 0 }, ptr %a342 + call void @finch_str_concat(ptr %a340, ptr %a341, ptr %a342) + %t343 = load { ptr, i64, i64 }, ptr %a340 + %t344 = load { ptr, i64, i64 }, ptr %a101 + %t345 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t344) + store { ptr, i64, i64 } %t343, ptr %a347 + store { ptr, i64, i64 } %t345, ptr %a348 + call void @finch_str_concat(ptr %a346, ptr %a347, ptr %a348) + %t349 = load { ptr, i64, i64 }, ptr %a346 + store { ptr, i64, i64 } %t349, ptr %a351 + store { ptr, i64, i64 } { ptr @.str.6010, i64 5, i64 0 }, ptr %a352 + call void @finch_str_concat(ptr %a350, ptr %a351, ptr %a352) + %t353 = load { ptr, i64, i64 }, ptr %a350 + store { ptr, i64, i64 } %t353, ptr %a355 + call void @finch_str_copy(ptr %a354, ptr %a355) + %t356 = call i64 @finch_shell(ptr %a354) + store i64 %t356, ptr %a357 + %t358 = load i64, ptr %a357 + %t359 = icmp ne i64 %t358, 0 + br i1 %t359, label %then8984, label %endif8986 +then8984: + %t360 = load { ptr, i64, i64 }, ptr %a101 + store { ptr, i64, i64 } %t360, ptr %a361 + store { ptr, i64, i64 } zeroinitializer, ptr %a362 + store { ptr, i64, i64 } zeroinitializer, ptr %a363 + %t364 = call i32 @finch_try_read_file(ptr %a362, ptr %a361, ptr %a363) + %t365 = icmp eq i32 %t364, 0 + %t366 = load { ptr, i64, i64 }, ptr %a363 + %t367 = load { ptr, i64, i64 }, ptr %a362 + br i1 %t365, label %or.failed8987, label %or.ok8988 +or.failed8987: + store { ptr, i64, i64 } %t366, ptr %a368 + br label %or.bend8989 +or.bend8989: + br label %or.end8990 +or.ok8988: + br label %or.end8990 +or.end8990: + %t369 = phi { ptr, i64, i64 } [ { ptr @.str.6011, i64 0, i64 0 }, %or.bend8989 ], [ %t367, %or.ok8988 ] + store { ptr, i64, i64 } %t369, ptr %a371 + store { ptr, i64, i64 } { ptr @.str.6012, i64 24, i64 0 }, ptr %a372 + call void @finch_str_concat(ptr %a370, ptr %a371, ptr %a372) + %t373 = load { ptr, i64, i64 }, ptr %a370 + %t374 = load { ptr, i64, i64 }, ptr %a281 + store { ptr, i64, i64 } %t373, ptr %a376 + store { ptr, i64, i64 } %t374, ptr %a377 + call void @finch_str_concat(ptr %a375, ptr %a376, ptr %a377) + %t378 = load { ptr, i64, i64 }, ptr %a375 + %t379 = extractvalue { ptr, i64, i64 } %t378, 1 + %t380 = trunc i64 %t379 to i32 + %t381 = extractvalue { ptr, i64, i64 } %t378, 0 + %t382 = icmp eq ptr %t381, null + %t383 = select i1 %t382, ptr @.str.6013, ptr %t381 + %t384 = call i32 (ptr, ...) @printf(ptr @.str.6014, i32 %t380, ptr %t383) + %t385 = call i32 (ptr, ...) @printf(ptr @.str.6015) + %t386 = load { ptr, i64, i64 }, ptr %a78 + %t387 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t386) + store { ptr, i64, i64 } { ptr @.str.6016, i64 6, i64 0 }, ptr %a389 + store { ptr, i64, i64 } %t387, ptr %a390 + call void @finch_str_concat(ptr %a388, ptr %a389, ptr %a390) + %t391 = load { ptr, i64, i64 }, ptr %a388 + store { ptr, i64, i64 } %t391, ptr %a393 + store { ptr, i64, i64 } { ptr @.str.6017, i64 1, i64 0 }, ptr %a394 + call void @finch_str_concat(ptr %a392, ptr %a393, ptr %a394) + %t395 = load { ptr, i64, i64 }, ptr %a392 + %t396 = load { ptr, i64, i64 }, ptr %a101 + %t397 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t396) + store { ptr, i64, i64 } %t395, ptr %a399 + store { ptr, i64, i64 } %t397, ptr %a400 + call void @finch_str_concat(ptr %a398, ptr %a399, ptr %a400) + %t401 = load { ptr, i64, i64 }, ptr %a398 + store { ptr, i64, i64 } %t401, ptr %a403 + store { ptr, i64, i64 } { ptr @.str.6018, i64 1, i64 0 }, ptr %a404 + call void @finch_str_concat(ptr %a402, ptr %a403, ptr %a404) + %t405 = load { ptr, i64, i64 }, ptr %a402 + %t406 = load { ptr, i64, i64 }, ptr %a306 + %t407 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t406) + store { ptr, i64, i64 } %t405, ptr %a409 + store { ptr, i64, i64 } %t407, ptr %a410 + call void @finch_str_concat(ptr %a408, ptr %a409, ptr %a410) + %t411 = load { ptr, i64, i64 }, ptr %a408 + store { ptr, i64, i64 } %t411, ptr %a413 + call void @finch_str_copy(ptr %a412, ptr %a413) + %t414 = call i64 @finch_shell(ptr %a412) + ret i64 1 +endif8986: + %t415 = getelementptr inbounds { ptr, i64, i64 }, ptr %a271, i32 0, i32 1 + %t416 = load { ptr, i64, i64 }, ptr %a306 + store { ptr, i64, i64 } %t416, ptr %a417 + call void @finch_str_copy(ptr %a418, ptr %a417) + %t419 = load { ptr, i64, i64 }, ptr %a418 + %t420 = load i64, ptr %t415 + %t421 = add i64 %t420, 1 + call void @finch_arr_reserve(ptr %a271, i64 %t421, i64 ptrtoint (ptr getelementptr ({ ptr, i64, i64 }, ptr null, i32 1) to i64)) + %t422 = load ptr, ptr %a271 + %t423 = getelementptr inbounds { ptr, i64, i64 }, ptr %t422, i64 %t420 + store { ptr, i64, i64 } %t419, ptr %t423 + store i64 %t421, ptr %t415 + %t424 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t424, ptr %a426 + store { ptr, i64, i64 } { ptr @.str.6019, i64 1, i64 0 }, ptr %a427 + call void @finch_str_concat(ptr %a425, ptr %a426, ptr %a427) + %t428 = load { ptr, i64, i64 }, ptr %a425 + %t429 = load { ptr, i64, i64 }, ptr %a306 + %t430 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t429) + store { ptr, i64, i64 } %t428, ptr %a432 + store { ptr, i64, i64 } %t430, ptr %a433 + call void @finch_str_concat(ptr %a431, ptr %a432, ptr %a433) + %t434 = load { ptr, i64, i64 }, ptr %a431 + store { ptr, i64, i64 } %t434, ptr %a248 + br label %endif8980 +else8979: + %t435 = load { ptr, i64, i64 }, ptr %a281 + store { ptr, i64, i64 } %t435, ptr %a436 + store { ptr, i64, i64 } { ptr @.str.6021, i64 2, i64 0 }, ptr %a438 + %t439 = call i32 @finch_str_ends(ptr %a436, ptr %a438) + %t440 = icmp ne i32 %t439, 0 + br label %logic.from8991 +logic.from8991: + br i1 %t440, label %logic.end8993, label %logic.rhs8992 +logic.rhs8992: + %t441 = load { ptr, i64, i64 }, ptr %a281 + store { ptr, i64, i64 } %t441, ptr %a442 + store { ptr, i64, i64 } { ptr @.str.6023, i64 2, i64 0 }, ptr %a444 + %t445 = call i32 @finch_str_ends(ptr %a442, ptr %a444) + %t446 = icmp ne i32 %t445, 0 + br label %logic.rend8994 +logic.rend8994: + br label %logic.end8993 +logic.end8993: + %t447 = phi i1 [ true, %logic.from8991 ], [ %t446, %logic.rend8994 ] + br i1 %t447, label %then8995, label %else8996 +then8995: + %t448 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t448, ptr %a450 + store { ptr, i64, i64 } { ptr @.str.6024, i64 1, i64 0 }, ptr %a451 + call void @finch_str_concat(ptr %a449, ptr %a450, ptr %a451) + %t452 = load { ptr, i64, i64 }, ptr %a449 + %t453 = load { ptr, i64, i64 }, ptr %a281 + %t454 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t453) + store { ptr, i64, i64 } %t452, ptr %a456 + store { ptr, i64, i64 } %t454, ptr %a457 + call void @finch_str_concat(ptr %a455, ptr %a456, ptr %a457) + %t458 = load { ptr, i64, i64 }, ptr %a455 + store { ptr, i64, i64 } %t458, ptr %a248 + br label %endif8997 +else8996: + %t459 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t459, ptr %a461 + store { ptr, i64, i64 } { ptr @.str.6025, i64 1, i64 0 }, ptr %a462 + call void @finch_str_concat(ptr %a460, ptr %a461, ptr %a462) + %t463 = load { ptr, i64, i64 }, ptr %a460 + %t464 = load { ptr, i64, i64 }, ptr %a281 + %t465 = load %S.platform.Target, ptr %a2 + %t466 = call { ptr, i64, i64 } @finch.linker.libFlags({ ptr, i64, i64 } %t464, %S.platform.Target %t465) + store { ptr, i64, i64 } %t463, ptr %a468 + store { ptr, i64, i64 } %t466, ptr %a469 + call void @finch_str_concat(ptr %a467, ptr %a468, ptr %a469) + %t470 = load { ptr, i64, i64 }, ptr %a467 + store { ptr, i64, i64 } %t470, ptr %a248 + br label %endif8997 +endif8997: + br label %endif8980 +endif8980: + br label %each.step8976 +each.step8976: + %t471 = load i64, ptr %a273 + %t472 = add i64 %t471, 1 + store i64 %t472, ptr %a273 + br label %each.cond8974 +each.end8977: + %t473 = load { ptr, i64, i64 }, ptr %a248 + store { ptr, i64, i64 } %t473, ptr %a475 + store { ptr, i64, i64 } { ptr @.str.6026, i64 3, i64 0 }, ptr %a476 + call void @finch_str_concat(ptr %a474, ptr %a475, ptr %a476) + %t477 = load { ptr, i64, i64 }, ptr %a474 + %t478 = load { ptr, i64, i64 }, ptr %a101 + %t479 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t478) + store { ptr, i64, i64 } %t477, ptr %a481 + store { ptr, i64, i64 } %t479, ptr %a482 + call void @finch_str_concat(ptr %a480, ptr %a481, ptr %a482) + %t483 = load { ptr, i64, i64 }, ptr %a480 + store { ptr, i64, i64 } %t483, ptr %a485 + store { ptr, i64, i64 } { ptr @.str.6027, i64 5, i64 0 }, ptr %a486 + call void @finch_str_concat(ptr %a484, ptr %a485, ptr %a486) + %t487 = load { ptr, i64, i64 }, ptr %a484 + store { ptr, i64, i64 } %t487, ptr %a489 + call void @finch_str_copy(ptr %a488, ptr %a489) + %t490 = call i64 @finch_shell(ptr %a488) + store i64 %t490, ptr %a491 + %t492 = load { ptr, i64, i64 }, ptr %a101 + store { ptr, i64, i64 } %t492, ptr %a493 + store { ptr, i64, i64 } zeroinitializer, ptr %a494 + store { ptr, i64, i64 } zeroinitializer, ptr %a495 + %t496 = call i32 @finch_try_read_file(ptr %a494, ptr %a493, ptr %a495) + %t497 = icmp eq i32 %t496, 0 + %t498 = load { ptr, i64, i64 }, ptr %a495 + %t499 = load { ptr, i64, i64 }, ptr %a494 + br i1 %t497, label %or.failed8998, label %or.ok8999 +or.failed8998: + store { ptr, i64, i64 } %t498, ptr %a500 + br label %or.bend9000 +or.bend9000: + br label %or.end9001 +or.ok8999: + br label %or.end9001 +or.end9001: + %t501 = phi { ptr, i64, i64 } [ { ptr @.str.6028, i64 0, i64 0 }, %or.bend9000 ], [ %t499, %or.ok8999 ] + store { ptr, i64, i64 } %t501, ptr %a502 + %t503 = load { ptr, i64, i64 }, ptr %a78 + %t504 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t503) + store { ptr, i64, i64 } { ptr @.str.6029, i64 6, i64 0 }, ptr %a506 + store { ptr, i64, i64 } %t504, ptr %a507 + call void @finch_str_concat(ptr %a505, ptr %a506, ptr %a507) + %t508 = load { ptr, i64, i64 }, ptr %a505 + store { ptr, i64, i64 } %t508, ptr %a510 + store { ptr, i64, i64 } { ptr @.str.6030, i64 1, i64 0 }, ptr %a511 + call void @finch_str_concat(ptr %a509, ptr %a510, ptr %a511) + %t512 = load { ptr, i64, i64 }, ptr %a509 + %t513 = load { ptr, i64, i64 }, ptr %a101 + %t514 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t513) + store { ptr, i64, i64 } %t512, ptr %a516 + store { ptr, i64, i64 } %t514, ptr %a517 + call void @finch_str_concat(ptr %a515, ptr %a516, ptr %a517) + %t518 = load { ptr, i64, i64 }, ptr %a515 + store { ptr, i64, i64 } %t518, ptr %a520 + call void @finch_str_copy(ptr %a519, ptr %a520) + %t521 = call i64 @finch_shell(ptr %a519) + store i64 0, ptr %a522 + br label %each.cond9002 +each.cond9002: + %t523 = getelementptr inbounds { ptr, i64, i64 }, ptr %a271, i32 0, i32 1 + %t524 = load i64, ptr %t523 + %t525 = load i64, ptr %a522 + %t526 = icmp slt i64 %t525, %t524 + br i1 %t526, label %each.body9003, label %each.end9005 +each.body9003: + %t527 = load ptr, ptr %a271 + %t528 = getelementptr inbounds { ptr, i64, i64 }, ptr %t527, i64 %t525 + %t529 = load { ptr, i64, i64 }, ptr %t528 + store { ptr, i64, i64 } %t529, ptr %a530 + %t531 = load { ptr, i64, i64 }, ptr %a530 + %t532 = call { ptr, i64, i64 } @finch.linker.quote({ ptr, i64, i64 } %t531) + store { ptr, i64, i64 } { ptr @.str.6031, i64 6, i64 0 }, ptr %a534 + store { ptr, i64, i64 } %t532, ptr %a535 + call void @finch_str_concat(ptr %a533, ptr %a534, ptr %a535) + %t536 = load { ptr, i64, i64 }, ptr %a533 + store { ptr, i64, i64 } %t536, ptr %a538 + call void @finch_str_copy(ptr %a537, ptr %a538) + %t539 = call i64 @finch_shell(ptr %a537) + br label %each.step9004 +each.step9004: + %t540 = load i64, ptr %a522 + %t541 = add i64 %t540, 1 + store i64 %t541, ptr %a522 + br label %each.cond9002 +each.end9005: + %t542 = load i64, ptr %a491 + %t543 = icmp eq i64 %t542, 127 + br i1 %t543, label %then9006, label %endif9008 +then9006: + %t544 = load { ptr, i64, i64 }, ptr %a21 + store { ptr, i64, i64 } { ptr @.str.6032, i64 42, i64 0 }, ptr %a546 + store { ptr, i64, i64 } %t544, ptr %a547 + call void @finch_str_concat(ptr %a545, ptr %a546, ptr %a547) + %t548 = load { ptr, i64, i64 }, ptr %a545 + store { ptr, i64, i64 } %t548, ptr %a550 + store { ptr, i64, i64 } { ptr @.str.6033, i64 32, i64 0 }, ptr %a551 + call void @finch_str_concat(ptr %a549, ptr %a550, ptr %a551) + %t552 = load { ptr, i64, i64 }, ptr %a549 + %t553 = extractvalue { ptr, i64, i64 } %t552, 1 + %t554 = trunc i64 %t553 to i32 + %t555 = extractvalue { ptr, i64, i64 } %t552, 0 + %t556 = icmp eq ptr %t555, null + %t557 = select i1 %t556, ptr @.str.6034, ptr %t555 + %t558 = call i32 (ptr, ...) @printf(ptr @.str.6035, i32 %t554, ptr %t557) + %t559 = call i32 (ptr, ...) @printf(ptr @.str.6036) + ret i64 1 +endif9008: + %t560 = load i64, ptr %a491 + %t561 = icmp ne i64 %t560, 0 + br i1 %t561, label %then9009, label %endif9011 +then9009: + %t562 = load { ptr, i64, i64 }, ptr %a502 + %t563 = load %S.cimport.CImports, ptr %a3 + %t564 = load %S.platform.Target, ptr %a2 + %t565 = call i64 @finch.linker.linkFailed({ ptr, i64, i64 } %t562, %S.cimport.CImports %t563, %S.platform.Target %t564) + ret i64 %t565 +endif9011: + %t566 = getelementptr inbounds { ptr, i64, i64 }, ptr %a502, i32 0, i32 1 + %t567 = load i64, ptr %t566 + %t568 = icmp sgt i64 %t567, 0 + br i1 %t568, label %then9012, label %endif9014 +then9012: + %t569 = load { ptr, i64, i64 }, ptr %a502 + %t570 = extractvalue { ptr, i64, i64 } %t569, 1 + %t571 = trunc i64 %t570 to i32 + %t572 = extractvalue { ptr, i64, i64 } %t569, 0 + %t573 = icmp eq ptr %t572, null + %t574 = select i1 %t573, ptr @.str.6037, ptr %t572 + %t575 = call i32 (ptr, ...) @printf(ptr @.str.6038, i32 %t571, ptr %t574) + %t576 = call i32 (ptr, ...) @printf(ptr @.str.6039) + br label %endif9014 +endif9014: + ret i64 0 +} + +define i32 @main(i32 %argc, ptr %argv) { +entry: + %args = alloca { ptr, i64, i64 } + call void @finch_args(ptr %args, i32 %argc, ptr %argv) + %a = load { ptr, i64, i64 }, ptr %args + %r = call i64 @finch.main.main({ ptr, i64, i64 } %a) + %code = trunc i64 %r to i32 + ret i32 %code +} + diff --git a/shell.nix b/shell.nix index 41460f3..41090bd 100644 --- a/shell.nix +++ b/shell.nix @@ -4,10 +4,7 @@ pkgs.mkShell { packages = with pkgs; [ # building Finch (the clang wrapper first, so `clang` finds the system headers) llvmPackages.clang - llvmPackages.llvm llvmPackages.libclang # reads C headers for `import "stdio.h"` - cmake - ninja pkg-config # finds the right flags for `link "..."` # for the graphics examples (window, opengl, raylib, vulkan) diff --git a/src/abi.cpp b/src/abi.cpp deleted file mode 100644 index 7209102..0000000 --- a/src/abi.cpp +++ /dev/null @@ -1,367 +0,0 @@ -// The C calling convention for structs passed and returned by value, the way clang does it: -// System V x86-64 (Linux, macOS): small structs split into eightbytes, INTEGER or SSE registers -// Microsoft x64 (Windows): 1/2/4/8 bytes in one register, everything else by address -// AAPCS64 (ARM64 Linux, Apple): float groups in vector registers, else up to 16 bytes in x registers - -#include "codegen_impl.h" -#include "target.h" - -using namespace llvm; - -namespace finch { - -namespace { - -enum Class { None, Integer, Sse }; - -struct Leaf { - uint64_t offset; - uint64_t size; - bool isFloat; - bool isDouble; -}; - -} // namespace - -// Flatten a value into its scalar pieces with byte offsets. -static void leaves(Codegen &cg, const FType &t, uint64_t base, std::vector &out) { - switch (t.kind) { - case FType::Struct: { - const StructLayout *lay = cg.dl->getStructLayout(t.info->llvm); - for (auto &f : t.info->fields) leaves(cg, f.type, base + lay->getElementOffset(f.llvmIndex), out); - break; - } - case FType::Fixed: { - uint64_t es = cg.dl->getTypeAllocSize(cg.ty(*t.elem)); - for (long long i = 0; i < t.count; i++) leaves(cg, *t.elem, base + i * es, out); - break; - } - default: - out.push_back({base, cg.dl->getTypeAllocSize(cg.ty(t)), t.kind == FType::F32 || t.kind == FType::F64, - t.kind == FType::F64}); - } -} - -AbiArg Codegen::classify(const FType &t) { - AbiArg a; - if (t.kind != FType::Struct) return a; // Direct - uint64_t size = dl->getTypeAllocSize(ty(t)); - if (g_target.triple.isAArch64()) { - // A homogeneous float aggregate (1-4 floats or 1-4 doubles) travels in vector registers. - std::vector ls; - leaves(*this, t, 0, ls); - bool hfa = !ls.empty() && ls.size() <= 4; - for (const Leaf &l : ls) hfa &= l.isFloat && l.isDouble == ls[0].isDouble; - if (hfa) { - llvm::Type *ft = ls[0].isDouble ? (llvm::Type *)b.getDoubleTy() : b.getFloatTy(); - a.kind = AbiArg::Expand; - a.parts.push_back(ArrayType::get(ft, ls.size())); - a.coerced = StructType::get(ctx, std::vector(ls.size(), ft)); - a.stackAlign8 = !g_target.triple.isOSDarwin(); - return a; - } - if (size > 16) { - a.kind = AbiArg::Indirect; // a copy, passed by address; returned through sret - return a; - } - // up to 16 bytes in general registers: i64 or [2 x i64]; returned as an exact-size integer - uint64_t align = dl->getABITypeAlign(ty(t)).value(); - a.kind = AbiArg::Expand; - if (align >= 16) { - a.parts.push_back(b.getInt128Ty()); - a.coerced = b.getInt128Ty(); - } else if (size <= 8) { - a.parts.push_back(b.getInt64Ty()); - a.coerced = b.getIntNTy(size * 8); - } else { - a.parts.push_back(ArrayType::get(b.getInt64Ty(), 2)); - a.coerced = a.parts[0]; - } - return a; - } - if (g_target.windows) { - // Microsoft x64: 1, 2, 4 or 8 bytes travel as one integer (even if they hold floats); - // anything else is copied by the caller and passed by address - if (size == 1 || size == 2 || size == 4 || size == 8) { - a.kind = AbiArg::Expand; - a.parts.push_back(b.getIntNTy(size * 8)); - a.coerced = a.parts[0]; - } else { - a.kind = AbiArg::Indirect; - } - return a; - } - if (size > 16 || size == 0) { - a.kind = AbiArg::Memory; - return a; - } - std::vector ls; - leaves(*this, t, 0, ls); - unsigned n = (size + 7) / 8; - Class cls[2] = {None, None}; - bool hasDouble[2] = {false, false}; - for (const Leaf &l : ls) { - if (l.offset % std::min(l.size, 8) != 0) { // misaligned field (packed struct): memory - a.kind = AbiArg::Memory; - return a; - } - unsigned k = l.offset / 8; - cls[k] = (cls[k] == Integer || !l.isFloat) ? Integer : Sse; - hasDouble[k] |= l.isDouble; - } - a.kind = AbiArg::Expand; - for (unsigned k = 0; k < n; k++) { - uint64_t bytes = std::min(8, size - 8 * k); - if (cls[k] == Sse) { - if (hasDouble[k]) a.parts.push_back(b.getDoubleTy()); - else if (bytes > 4) a.parts.push_back(FixedVectorType::get(b.getFloatTy(), 2)); - else a.parts.push_back(b.getFloatTy()); - } else { - a.parts.push_back(b.getIntNTy(bytes * 8)); - } - } - a.coerced = a.parts.size() == 1 ? a.parts[0] : StructType::get(ctx, a.parts); - return a; -} - -namespace { - -struct Plan { - AbiArg ret; - std::vector params; - llvm::FunctionType *fty = nullptr; -}; - -} // namespace - -// Decide how every parameter travels, counting the 6 integer and 8 SSE argument registers. -static Plan makePlan(Codegen &cg, const FType &ret, const std::vector ¶ms, bool variadic, - std::vector *extraTypes = nullptr) { - Plan pl; - int intRegs = 6, sseRegs = 8; - std::vector types; - llvm::Type *retTy = cg.ty(ret); - if (ret.kind == FType::Str) retTy = cg.b.getPtrTy(); - pl.ret = cg.classify(ret); - if (pl.ret.kind == AbiArg::Indirect) pl.ret.kind = AbiArg::Memory; // returned through a hidden pointer - if (pl.ret.kind == AbiArg::Memory) { - types.push_back(cg.b.getPtrTy()); // sret - retTy = cg.b.getVoidTy(); - intRegs--; - } else if (pl.ret.kind == AbiArg::Expand) { - retTy = pl.ret.coerced; - } - for (const FType &t : params) { - AbiArg a = cg.classify(t); - if (a.kind == AbiArg::Expand) { - int ni = 0, ns = 0; - for (llvm::Type *p : a.parts) (p->isIntegerTy() ? ni : ns)++; - // only System V counts registers here; elsewhere the backend places each part - if (g_target.windows || g_target.triple.isAArch64() || (ni <= intRegs && ns <= sseRegs)) { - intRegs -= ni; - sseRegs -= ns; - for (llvm::Type *p : a.parts) types.push_back(p); - } else { - a.kind = AbiArg::Memory; // out of registers: the whole struct goes on the stack - } - } - if (a.kind == AbiArg::Memory || a.kind == AbiArg::Indirect) types.push_back(cg.b.getPtrTy()); - if (a.kind == AbiArg::Direct) { - if (t.isFloat()) sseRegs--; - else intRegs--; - types.push_back(t.kind == FType::Str ? cg.b.getPtrTy() : cg.ty(t)); - } - pl.params.push_back(a); - } - (void)extraTypes; - pl.fty = FunctionType::get(retTy, types, variadic); - return pl; -} - -// Is C's plain `char` signed? Yes on x86 and Apple; no on ARM64 Linux. -static bool charIsSigned() { - return !g_target.triple.isAArch64() || g_target.triple.isOSDarwin() || g_target.triple.isOSWindows(); -} - -static Attribute::AttrKind extAttr(const FType &t) { - if (t.bits() >= 32 || !(t.isInt() || t.kind == FType::Bool || t.kind == FType::Char)) return Attribute::None; - if (t.kind == FType::Char) return charIsSigned() ? Attribute::SExt : Attribute::ZExt; - return t.isSigned() ? Attribute::SExt : Attribute::ZExt; -} - -// Attributes that tell LLVM how C passes each piece: sret, byval, signext/zeroext. -static AttributeList attrsFor(Codegen &cg, const Plan &pl, const FType &ret, const std::vector ¶ms) { - LLVMContext &ctx = cg.ctx; - AttributeList al; - unsigned idx = 0; - if (pl.ret.kind == AbiArg::Memory) { - al = al.addParamAttribute(ctx, idx, Attribute::getWithStructRetType(ctx, cg.ty(ret))); - idx++; - } else if (Attribute::AttrKind k = extAttr(ret); k != Attribute::None) { - al = al.addRetAttribute(ctx, k); - } - for (size_t i = 0; i < params.size(); i++) { - const AbiArg &a = pl.params[i]; - if (a.kind == AbiArg::Memory) { - uint64_t align = std::max(8, params[i].info->isC ? params[i].info->cstruct->align : 8); - al = al.addParamAttribute(ctx, idx, Attribute::getWithByValType(ctx, cg.ty(params[i]))); - al = al.addParamAttribute(ctx, idx, Attribute::getWithAlignment(ctx, Align(align))); - idx++; - } else if (a.kind == AbiArg::Indirect) { - idx++; - } else if (a.kind == AbiArg::Expand) { - if (a.stackAlign8) al = al.addParamAttribute(ctx, idx, Attribute::getWithStackAlignment(ctx, Align(8))); - idx += a.parts.size(); - } else { - if (Attribute::AttrKind k = extAttr(params[i]); k != Attribute::None) al = al.addParamAttribute(ctx, idx, k); - idx++; - } - } - return al; -} - -static std::vector resolvedParams(Codegen &cg, const CFunc &f) { - std::vector ps; - for (const FType &t : f.params) ps.push_back(cg.resolve(t, Pos{})); - return ps; -} - -Function *Codegen::declareC(const CFunc &f) { - if (Function *fn = mod->getFunction(f.name)) return fn; - FType ret = resolve(f.ret, Pos{}); - std::vector ps = resolvedParams(*this, f); - for (const FType &t : ps) - if (t.kind == FType::Struct && !t.info->unsupported.empty()) return nullptr; - Plan pl = makePlan(*this, ret, ps, f.variadic); - Function *fn = Function::Create(pl.fty, Function::ExternalLinkage, f.name, mod.get()); - fn->setAttributes(attrsFor(*this, pl, ret, ps)); - return fn; -} - -// A stack slot big enough for both the struct and its register form. -static Value *abiSlot(Codegen &cg, const FType &t, const AbiArg &a) { - llvm::Type *st = cg.ty(t); - llvm::Type *big = a.coerced && cg.dl->getTypeAllocSize(a.coerced) > cg.dl->getTypeAllocSize(st) ? a.coerced : st; - return cg.tmpOf(big); -} - -Value_ Codegen::emitCCall(const CFunc &f, Function *fn, std::vector args, Pos p) { - FType ret = resolve(f.ret, p); - std::vector ps = resolvedParams(*this, f); - for (const FType &t : ps) - if (t.kind == FType::Struct && !t.info->unsupported.empty()) - failAt(p.file, p.line, p.col, "the C function '" + f.name + "' takes the struct " + t.info->name + - " by value, which Finch can't pass yet: it " + t.info->unsupported); - if (ret.kind == FType::Struct && !ret.info->unsupported.empty()) - failAt(p.file, p.line, p.col, "the C function '" + f.name + "' returns the struct " + ret.info->name + - " by value, which Finch can't receive yet: it " + ret.info->unsupported); - Plan pl = makePlan(*this, ret, ps, f.variadic); - - std::vector ll; - Value *sret = nullptr; - if (pl.ret.kind == AbiArg::Memory) { - sret = tmpOf(ty(ret)); - cast(sret)->setAlignment(Align(16)); - ll.push_back(sret); - } - for (size_t i = 0; i < args.size(); i++) { - const Value_ &v = args[i]; - if (i >= ps.size()) { // the '...' part: C's default promotions - const FType &t = v.type; - Value *x = v.v; - if (t.kind == FType::F32) x = b.CreateFPExt(x, b.getDoubleTy()); - else if (t.kind == FType::Str) x = cstr(x); - else if (t.kind == FType::Bool || ((t.isInt() || t.kind == FType::Char) && t.bits() < 32)) - x = b.CreateIntCast(x, b.getInt32Ty(), t.isSigned() || (t.kind == FType::Char && charIsSigned())); - ll.push_back(x); - continue; - } - const AbiArg &a = pl.params[i]; - if (ps[i].kind == FType::Str) { - ll.push_back(cstr(v.v)); - } else if (a.kind == AbiArg::Memory || a.kind == AbiArg::Indirect) { - Value *s = tmpOf(ty(ps[i])); // a copy the callee may change - cast(s)->setAlignment(Align(16)); - b.CreateStore(v.v, s); - ll.push_back(s); - } else if (a.kind == AbiArg::Expand) { - Value *s = abiSlot(*this, ps[i], a); - b.CreateStore(v.v, s); - for (size_t k = 0; k < a.parts.size(); k++) - ll.push_back(b.CreateLoad(a.parts[k], b.CreateConstInBoundsGEP1_64(b.getInt8Ty(), s, 8 * k))); - } else { - ll.push_back(v.v); - } - } - CallInst *call = b.CreateCall(pl.fty, fn, ll); - AttributeList al = attrsFor(*this, pl, ret, ps); - call->setAttributes(al); - - if (ret.kind == FType::Void) return {nullptr, FType::Void}; - if (pl.ret.kind == AbiArg::Memory) return {b.CreateLoad(ty(ret), sret), ret}; - if (pl.ret.kind == AbiArg::Expand) { - Value *s = abiSlot(*this, ret, pl.ret); - b.CreateStore(call, s); - return {b.CreateLoad(ty(ret), s), ret}; - } - if (ret.kind == FType::Str) return strFromC(call); // borrowed: copied if it is kept - return {call, ret}; -} - -// A C-callable door into a Finch function, for addr(fn) (callbacks like qsort's or libclang's). -Function *Codegen::cThunk(Fn &fn, Pos p) { - if (fn.cThunk) return fn.cThunk; - auto cOk = [](const FType &t) { - return t.isNumber() || t.kind == FType::Bool || t.kind == FType::Char || t.isPtr() || t.kind == FType::Void || - (t.kind == FType::Struct && t.info->isC); - }; - for (const FType &t : fn.params) - if (!cOk(t)) - failAt(p.file, p.line, p.col, "addr(" + fn.decl->name + ") gives C a function pointer, so its parameters must be C types (numbers, ptr, C structs), not " + t.show()); - if (!cOk(fn.ret)) failAt(p.file, p.line, p.col, "addr(" + fn.decl->name + "): a function given to C can't return " + fn.ret.show()); - - Plan pl = makePlan(*this, fn.ret, fn.params, false); - Function *th = Function::Create(pl.fty, Function::InternalLinkage, "finch.c." + fn.decl->name, mod.get()); - th->setAttributes(attrsFor(*this, pl, fn.ret, fn.params)); - fn.cThunk = th; - - IRBuilderBase::InsertPointGuard guard(b); - DISubprogram *savedFn = diFn; - diFn = nullptr; - b.SetInsertPoint(BasicBlock::Create(ctx, "entry", th)); - b.SetCurrentDebugLocation(DebugLoc()); - unsigned ai = 0; - Value *sret = nullptr; - if (pl.ret.kind == AbiArg::Memory) sret = th->getArg(ai++); - std::vector args; - for (size_t i = 0; i < fn.params.size(); i++) { - const AbiArg &a = pl.params[i]; - if (a.kind == AbiArg::Memory || a.kind == AbiArg::Indirect) { - args.push_back(b.CreateLoad(ty(fn.params[i]), th->getArg(ai++))); - } else if (a.kind == AbiArg::Expand) { - Value *s = abiSlot(*this, fn.params[i], a); - for (size_t k = 0; k < a.parts.size(); k++) - b.CreateStore(th->getArg(ai++), b.CreateConstInBoundsGEP1_64(b.getInt8Ty(), s, 8 * k)); - args.push_back(b.CreateLoad(ty(fn.params[i]), s)); - } else { - args.push_back(th->getArg(ai++)); - } - } - Value *r = b.CreateCall(fn.llvm, args); - if (fn.ret.kind == FType::Void) { - b.CreateRetVoid(); - } else if (pl.ret.kind == AbiArg::Memory) { - b.CreateStore(r, sret); - b.CreateRetVoid(); - } else if (pl.ret.kind == AbiArg::Expand) { - Value *s = abiSlot(*this, fn.ret, pl.ret); - b.CreateStore(r, s); - b.CreateRet(b.CreateLoad(pl.ret.coerced, s)); - } else { - b.CreateRet(r); - } - diFn = savedFn; - return th; -} - -} // namespace finch diff --git a/boot/ast.fch b/src/ast.fch similarity index 100% rename from boot/ast.fch rename to src/ast.fch diff --git a/src/ast.h b/src/ast.h deleted file mode 100644 index 87c3828..0000000 --- a/src/ast.h +++ /dev/null @@ -1,356 +0,0 @@ -#pragma once - -#include -#include -#include - -struct StructInfo; // filled in by codegen: fields, LLVM type, ownership - -struct Type { - enum Kind { - Void, Bool, Char, I8, I16, I32, I64, U8, U16, U32, U64, F32, F64, - Str, Ptr, Null, - Array, // []T: growable, owns its elements - Map, // map[K]V: a hash map that keeps insertion order, owns its keys and values - Fixed, // [N]T: only inside C structs - Struct, // a resolved struct - Named, // a struct name as written, before codegen resolves it - }; - Kind kind = Void; - std::shared_ptr elem; // Ptr (null = untyped `ptr`), Array, Fixed; Map: the value - std::shared_ptr key; // Map - long long count = 0; // Fixed - std::string name; // Named / Struct - std::string module; // Named: written qualifier ("" = none); Struct: defining module - StructInfo *info = nullptr; // Struct - - Type() = default; - Type(Kind k) : kind(k) {} - static Type ptrTo(const Type &t) { - Type p(Ptr); - p.elem = std::make_shared(t); - return p; - } - static Type arrayOf(const Type &t) { - Type a(Array); - a.elem = std::make_shared(t); - return a; - } - static Type mapOf(const Type &k, const Type &v) { - Type m(Map); - m.key = std::make_shared(k); - m.elem = std::make_shared(v); - return m; - } - - bool isInt() const { return kind >= I8 && kind <= U64; } - bool isSigned() const { return kind >= I8 && kind <= I64; } - bool isUnsigned() const { return kind >= U8 && kind <= U64; } - bool isFloat() const { return kind == F32 || kind == F64; } - bool isNumber() const { return isInt() || isFloat(); } - bool isPtr() const { return kind == Ptr; } - int bits() const { - switch (kind) { - case Bool: return 1; - case Char: case I8: case U8: return 8; - case I16: case U16: return 16; - case I32: case U32: case F32: return 32; - default: return 64; - } - } - - bool operator==(const Type &o) const { - if (kind != o.kind) return false; - switch (kind) { - case Ptr: - if (!elem || !o.elem) return !elem && !o.elem; - return *elem == *o.elem; - case Array: return *elem == *o.elem; - case Map: return *key == *o.key && *elem == *o.elem; - case Fixed: return count == o.count && *elem == *o.elem; - case Struct: return info == o.info; - case Named: return name == o.name && module == o.module; - default: return true; - } - } - bool operator!=(const Type &o) const { return !(*this == o); } - - // How the type is written in Finch, for error messages. - std::string show() const { - switch (kind) { - case Void: return "nothing"; - case Bool: return "bool"; - case Char: return "char"; - case I8: return "i8"; - case I16: return "i16"; - case I32: return "i32"; - case I64: return "int"; - case U8: return "u8"; - case U16: return "u16"; - case U32: return "u32"; - case U64: return "u64"; - case F32: return "f32"; - case F64: return "float"; - case Str: return "str"; - case Ptr: return elem ? "ptr[" + elem->show() + "]" : "ptr"; - case Null: return "null"; - case Array: return "[]" + elem->show(); - case Map: return "map[" + key->show() + "]" + elem->show(); - case Fixed: return "[" + std::to_string(count) + "]" + elem->show(); - case Struct: - case Named: return module.empty() ? name : module + "." + name; - } - return "?"; - } -}; - -// Built-in type names. `int` is i64 and `float` is f64: the everyday defaults. -bool typeFromName(const std::string &name, Type &out); - -struct Pos { - int line = 0, col = 0; - int file = 0; // index into the list of source files (see error.h) -}; - -// ---------- expressions ---------- - -enum class ExprKind { Int, Float, Bool, Char, Str, Null, Var, Unary, Binary, Call, Member, Index, ArrayLit, Method, - MapLit, Try, OrElse }; - -struct Expr { - ExprKind kind; - Pos pos; - Expr(ExprKind k, Pos p) : kind(k), pos(p) {} - virtual ~Expr() = default; -}; -using ExprPtr = std::unique_ptr; - -struct IntExpr : Expr { - long long value; - IntExpr(Pos p, long long v) : Expr(ExprKind::Int, p), value(v) {} -}; -struct FloatExpr : Expr { - double value; - FloatExpr(Pos p, double v) : Expr(ExprKind::Float, p), value(v) {} -}; -struct BoolExpr : Expr { - bool value; - BoolExpr(Pos p, bool v) : Expr(ExprKind::Bool, p), value(v) {} -}; -struct CharExpr : Expr { - char value; - CharExpr(Pos p, char v) : Expr(ExprKind::Char, p), value(v) {} -}; -struct StrExpr : Expr { - std::string value; - StrExpr(Pos p, std::string v) : Expr(ExprKind::Str, p), value(std::move(v)) {} -}; -struct NullExpr : Expr { - explicit NullExpr(Pos p) : Expr(ExprKind::Null, p) {} -}; -struct VarExpr : Expr { - std::string name; - VarExpr(Pos p, std::string n) : Expr(ExprKind::Var, p), name(std::move(n)) {} -}; -struct UnaryExpr : Expr { - char op; // '-', '!' or '~' - ExprPtr operand; - UnaryExpr(Pos p, char o, ExprPtr e) : Expr(ExprKind::Unary, p), op(o), operand(std::move(e)) {} -}; -enum class BinOp { - Add, Sub, Mul, Div, Mod, - BitAnd, BitOr, BitXor, Shl, Shr, - Eq, NotEq, Less, LessEq, Greater, GreaterEq, - And, Or, -}; -struct BinaryExpr : Expr { - BinOp op; - ExprPtr lhs, rhs; - BinaryExpr(Pos p, BinOp o, ExprPtr l, ExprPtr r) - : Expr(ExprKind::Binary, p), op(o), lhs(std::move(l)), rhs(std::move(r)) {} -}; -// name(args): a function, a built-in, a conversion or a struct constructor. -struct CallExpr : Expr { - std::string callee; - std::vector args; - std::vector argNames; // "" for positional; Point(x: 1, y: 2) - CallExpr(Pos p, std::string c) : Expr(ExprKind::Call, p), callee(std::move(c)) {} -}; -struct MemberExpr : Expr { // obj.field, p.value, a.len - ExprPtr obj; - std::string field; - MemberExpr(Pos p, ExprPtr o, std::string f) - : Expr(ExprKind::Member, p), obj(std::move(o)), field(std::move(f)) {} -}; -struct IndexExpr : Expr { // a[i] - ExprPtr obj, index; - IndexExpr(Pos p, ExprPtr o, ExprPtr i) : Expr(ExprKind::Index, p), obj(std::move(o)), index(std::move(i)) {} -}; -struct ArrayLitExpr : Expr { // [1, 2, 3] - std::vector elems; - explicit ArrayLitExpr(Pos p) : Expr(ExprKind::ArrayLit, p) {} -}; -struct MapLitExpr : Expr { // ["a": 1, "b": 2], or [:] for an empty map - std::vector keys, values; - explicit MapLitExpr(Pos p) : Expr(ExprKind::MapLit, p) {} -}; -// obj.name(args): a.push(x), s.find("x"), p.move(1, 2), and math.sqrt(2) / math.Vec(1, 2) for modules -struct MethodExpr : Expr { - ExprPtr obj; - std::string name; - std::vector args; - std::vector argNames; - MethodExpr(Pos p, ExprPtr o, std::string n) : Expr(ExprKind::Method, p), obj(std::move(o)), name(std::move(n)) {} -}; - -struct BlockStmt; -// try f(x): if f fails, the current function fails with the same error -struct TryExpr : Expr { - ExprPtr call; - TryExpr(Pos p, ExprPtr c) : Expr(ExprKind::Try, p), call(std::move(c)) {} -}; -// f(x) or fallback, f(x) or { ...err... } -struct OrElseExpr : Expr { - ExprPtr call; - ExprPtr fallback; // or a value - std::unique_ptr block; // or a block that sees `err` - OrElseExpr(Pos p, ExprPtr c) : Expr(ExprKind::OrElse, p), call(std::move(c)) {} - ~OrElseExpr() override; -}; - -// ---------- statements ---------- - -enum class StmtKind { VarDecl, Assign, Expr, If, While, For, ForEach, Return, Break, Continue, Block, Defer }; - -struct Stmt { - StmtKind kind; - Pos pos; - Stmt(StmtKind k, Pos p) : kind(k), pos(p) {} - virtual ~Stmt() = default; -}; -using StmtPtr = std::unique_ptr; - -struct BlockStmt : Stmt { - std::vector body; - Pos end; // the closing '}' - explicit BlockStmt(Pos p) : Stmt(StmtKind::Block, p) {} -}; -using BlockPtr = std::unique_ptr; -inline OrElseExpr::~OrElseExpr() = default; - -struct VarDeclStmt : Stmt { - bool hasType; // `int x = 5` vs `x := 5` - Type type; - std::string name; - Pos namePos; - ExprPtr init; // may be null only when hasType - VarDeclStmt(Pos p) : Stmt(StmtKind::VarDecl, p) {} -}; -struct AssignStmt : Stmt { - ExprPtr target; // a variable, field, element or p.value - char op; // '=', '+', '-', '*', '/', '%' - ExprPtr value; - AssignStmt(Pos p) : Stmt(StmtKind::Assign, p) {} -}; -struct ExprStmt : Stmt { - ExprPtr expr; - ExprStmt(Pos p, ExprPtr e) : Stmt(StmtKind::Expr, p), expr(std::move(e)) {} -}; -struct IfStmt : Stmt { - ExprPtr cond; - BlockPtr then; - StmtPtr otherwise; // null, BlockStmt, or IfStmt (else if) - IfStmt(Pos p) : Stmt(StmtKind::If, p) {} -}; -struct WhileStmt : Stmt { - ExprPtr cond; - BlockPtr body; - WhileStmt(Pos p) : Stmt(StmtKind::While, p) {} -}; -struct ForStmt : Stmt { - std::string var; - Pos varPos; - ExprPtr from, to; // for var in from..to (to is exclusive) - BlockPtr body; - ForStmt(Pos p) : Stmt(StmtKind::For, p) {} -}; -struct ForEachStmt : Stmt { - std::string var; - Pos varPos; - std::string var2; // for i, x in list / for k, v in map ("" = one variable) - Pos var2Pos; - ExprPtr list; // for var in list (an array, a str or a map) - BlockPtr body; - ForEachStmt(Pos p) : Stmt(StmtKind::ForEach, p) {} -}; -struct ReturnStmt : Stmt { - ExprPtr value; // may be null - ReturnStmt(Pos p) : Stmt(StmtKind::Return, p) {} -}; -struct BreakStmt : Stmt { - explicit BreakStmt(Pos p) : Stmt(StmtKind::Break, p) {} -}; -struct ContinueStmt : Stmt { - explicit ContinueStmt(Pos p) : Stmt(StmtKind::Continue, p) {} -}; -struct DeferStmt : Stmt { // defer : runs when the block ends - StmtPtr body; - DeferStmt(Pos p, StmtPtr s) : Stmt(StmtKind::Defer, p), body(std::move(s)) {} -}; - -// ---------- top level ---------- - -struct Param { - Type type; - std::string name; - Pos pos; // the type - Pos namePos; // the name -}; - -struct FnDecl { - Pos pos; - Pos namePos; - std::string name; - std::string recv; // fn Point.move(...): "Point" (a method; `self` is the Point it is called on) - Pos recvPos; - Type ret; // Void when there is no `-> type` - bool fallible = false; // -> int! / -> ! : can fail with an error - std::vector params; - BlockPtr body; -}; - -struct Field { - Type type; - std::string name; - ExprPtr init; // default value, may be null - Pos pos; - Pos namePos; -}; - -struct StructDecl { - Pos pos; - Pos namePos; - std::string name; - std::vector fields; -}; - -struct Import { - Pos pos; - std::string path; // "stdio.h" (C header, isC) or "math" (Finch module) - bool isC = true; -}; - -struct Link { - Pos pos; - std::string lib; // "glfw" -> libglfw.so; "helpers.c" / ".o" / ".a" -> a file next to the .fch file -}; - -// One .fch file. -struct Program { - std::string module; // "" for the main file, else the module's name - std::string path; - std::vector imports; - std::vector links; - std::vector structs; - std::vector fns; -}; diff --git a/src/builtins_doc.h b/src/builtins_doc.h deleted file mode 100644 index 05d2687..0000000 --- a/src/builtins_doc.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once -// One description of every built-in function and method, shared by the language server -// (hover, completion, signature help). - -struct BuiltinDoc { - const char *name; - const char *signature; - const char *doc; -}; - -inline const BuiltinDoc kBuiltins[] = { - {"print", "print(a, b, ...)", "Prints the values separated by spaces, then a new line. Works with every type."}, - {"input", "input(str question = \"\") -> str", "Shows the question and reads one line typed by the user, without the newline."}, - {"read_file", "read_file(str path) -> str", "The whole file as text. Stops the program if it can't be read, unless handled: read_file(p) or { ... }, try read_file(p)."}, - {"write_file", "write_file(str path, str text) -> bool", "Writes (replaces) the file. true if it worked; with or / try, the reason it didn't."}, - {"file_exists", "file_exists(str path) -> bool", "Is there a file at this path?"}, - {"delete_file", "delete_file(str path) -> bool", "Deletes the file. true if it worked; with or / try, the reason it didn't."}, - {"error", "error(str message)", "The failure a fallible function returns: return error(\"...\"). The caller handles it with or / try."}, - {"shell", "shell(str command) -> int", "Runs a command in the system's shell and gives back its exit code."}, - {"exit", "exit(int code)", "Ends the program right away with this exit code."}, - {"addr", "addr(x) -> ptr[T]", "A pointer to a variable, field or element. addr(function) gives C a callback."}, - {"new", "new(value) -> ptr[T]", "Puts a copy of the value on the heap. Give it back with free(...)."}, - {"free", "free(ptr p)", "Gives back memory from new(...) (or from C), freeing what the value owns."}, - {"str", "str(x) -> str", "Turns a number, bool, char, []u8 or C char pointer into text."}, - {"int", "int(x) -> int", "Converts to a whole number: cuts off fractions, parses text (stops the program if it isn't a number, unless handled: int(s) or 0)."}, - {"float", "float(x) -> float", "Converts to a decimal number; parses text (int(s) or 0.0 handles bad text)."}, - {"char", "char(int n) -> char", "The character with this code."}, - {"bool", "bool(int n) -> bool", "true for any number but 0."}, - {"ptr", "ptr(x) -> ptr", "An untyped pointer: from a typed pointer, or from a number (an address or offset for C)."}, -}; - -inline const BuiltinDoc kArrayMethods[] = { - {"len", ".len -> int", "The number of elements."}, - {"ptr", ".ptr -> ptr[T]", "The address of the first element, for C."}, - {"push", "push(T x)", "Adds x at the end."}, - {"pop", "pop() -> T", "Removes the last element and gives it back."}, - {"insert", "insert(int i, T x)", "Puts x at position i, moving the rest."}, - {"remove", "remove(int i) -> T", "Removes position i and gives it back."}, - {"clear", "clear()", "Removes everything."}, - {"resize", "resize(int n)", "Makes the array n long; new elements are zero."}, - {"find", "find(T x) -> int", "The index of x, or -1."}, - {"contains", "contains(T x) -> bool", "Is x in the array?"}, - {"sort", "sort()", "Sorts in place (numbers, chars, str)."}, - {"reverse", "reverse()", "Reverses in place."}, - {"slice", "slice(int start, int end) -> []T", "A new array with the elements start to end-1."}, - {"join", "join(str sep) -> str", "For []str: one text with sep between the parts."}, -}; - -inline const BuiltinDoc kStrMethods[] = { - {"len", ".len -> int", "The number of bytes."}, - {"ptr", ".ptr -> ptr[char]", "The address of the text, for C (valid while the str lives)."}, - {"sub", "sub(int start, int end) -> str", "The part from start to end-1."}, - {"find", "find(str t) -> int", "Where t starts, or -1."}, - {"contains", "contains(str t) -> bool", "Does the text contain t?"}, - {"starts_with", "starts_with(str t) -> bool", "Does the text start with t?"}, - {"ends_with", "ends_with(str t) -> bool", "Does the text end with t?"}, - {"split", "split(str sep) -> []str", "The parts between each sep; split(\"\") gives single characters."}, - {"trim", "trim() -> str", "Without spaces and newlines at both ends."}, - {"upper", "upper() -> str", "With a-z changed to A-Z."}, - {"lower", "lower() -> str", "With A-Z changed to a-z."}, - {"replace", "replace(str from, str to) -> str", "Every from replaced by to."}, - {"repeat", "repeat(int n) -> str", "The text n times."}, - {"bytes", "bytes() -> []u8", "The bytes of the text."}, -}; - -inline const BuiltinDoc kMapMethods[] = { - {"len", ".len -> int", "The number of keys."}, - {"has", "has(K key) -> bool", "Is the key in the map?"}, - {"get", "get(K key, V default) -> V", "The value for key, or default if the key isn't there."}, - {"remove", "remove(K key) -> bool", "Removes the key and its value; true if it was there."}, - {"clear", "clear()", "Removes everything."}, - {"keys", "keys() -> []K", "The keys, in the order they were added."}, - {"values", "values() -> []V", "The values, in the order their keys were added."}, -}; - -inline const char *kKeywords[] = {"fn", "return", "if", "else", "while", "for", "in", "break", "continue", "true", - "false", "null", "import", "link", "struct", "defer", "or", "try", "self"}; - -inline const char *kTypeNames[] = {"int", "float", "bool", "char", "str", "ptr", "map", "i8", "i16", "i32", "i64", - "u8", "u16", "u32", "u64", "f32", "f64"}; diff --git a/src/cimport.cpp b/src/cimport.cpp deleted file mode 100644 index df4d263..0000000 --- a/src/cimport.cpp +++ /dev/null @@ -1,373 +0,0 @@ -#include "cimport.h" -#include "error.h" -#include "target.h" - -#include - -#include -#include -#include -#include -#include - -namespace { - -// Ask the system C compiler where it looks for headers (and, on macOS, frameworks), so we find -// the same stdio.h it would. Returns ready -isystem / -iframework arguments. -std::vector systemIncludeArgs() { - std::string output; - capture(g_target.cc + " -E -v -x c " + nullDevice(), output); - std::vector dirs; - std::stringstream lines(output); - bool inList = false; - for (std::string l; std::getline(lines, l);) { - if (!l.empty() && l.back() == '\r') l.pop_back(); - l += "\n"; - if (l.rfind("#include <...> search starts here:", 0) == 0) { inList = true; continue; } - if (l.rfind("End of search list.", 0) == 0) break; - if (!inList) continue; - size_t a = l.find_first_not_of(' '); - size_t z = l.find_last_not_of(" \n"); - if (a == std::string::npos) continue; - std::string d = l.substr(a, z - a + 1); - // macOS: "/…/System/Library/Frameworks (framework directory)" holds and friends - if (d.size() > 22 && d.compare(d.size() - 22, 22, " (framework directory)") == 0) - dirs.push_back("-iframework" + d.substr(0, d.size() - 22)); - else - dirs.push_back("-isystem" + d); - } - return dirs; -} - -std::string str(CXString s) { - std::string out = clang_getCString(s) ? clang_getCString(s) : ""; - clang_disposeString(s); - return out; -} - -// Where a C type is used decides how `char *` looks in Finch: in function signatures it is -// a `str`; inside structs, globals and behind pointers it stays a raw `ptr[char]`. -enum class Ctx { Signature, Data }; - -struct Importer { - CImports &out; - CXTranslationUnit tu = nullptr; - std::string header; - std::map recordNames; // record USR -> Finch name (typedef wins) - std::map defining; // USR -> 1 while its fields are being mapped - int anon = 0; - - explicit Importer(CImports &o) : out(o) {} - - // The Finch name of a C record: its typedef name, its tag, or a made-up one. - std::string recordName(CXType t) { - CXCursor decl = clang_getTypeDeclaration(t); - std::string usr = str(clang_getCursorUSR(decl)); - auto it = recordNames.find(usr); - if (it != recordNames.end()) return it->second; - std::string name = str(clang_getCursorSpelling(decl)); - if (name.empty() || name.find(' ') != std::string::npos) name = "anon_struct_" + std::to_string(++anon); - recordNames[usr] = name; - return name; - } - - // Fill out.structs[name] for a complete record; returns its name, or "" if it can't be one. - std::string defineRecord(CXType t) { - t = clang_getCanonicalType(t); - CXCursor decl = clang_getTypeDeclaration(t); - std::string usr = str(clang_getCursorUSR(decl)); - std::string name = recordName(t); - if (out.structs.count(name) || defining.count(usr)) return name; - long long size = clang_Type_getSizeOf(t); - if (size < 0) return ""; // incomplete (opaque) struct - defining[usr] = 1; - - CStruct s; - s.name = name; - s.size = size; - s.align = clang_Type_getAlignOf(t); - if (clang_getCursorKind(decl) == CXCursor_UnionDecl) s.unsupported = "is a C union"; - struct Ctx2 { Importer *self; CStruct *s; } c2{this, &s}; - clang_Type_visitFields(t, [](CXCursor field, CXClientData data) -> CXVisitorResult { - auto &c = *static_cast(data); - CField f; - f.name = str(clang_getCursorSpelling(field)); - CXType ft = clang_getCanonicalType(clang_getCursorType(field)); - f.offset = clang_Cursor_getOffsetOfField(field) / 8; - f.size = clang_Type_getSizeOf(ft); - f.align = clang_Type_getAlignOf(ft); - std::string why; - if (clang_Cursor_isBitField(field)) { - c.s->unsupported = "has bit fields"; - f.hidden = true; - } else if (ft.kind == CXType_Record && - clang_getCursorKind(clang_getTypeDeclaration(ft)) == CXCursor_UnionDecl) { - f.hidden = true; // unions are kept as opaque bytes - } else if (!c.self->mapType(ft, f.type, why, Ctx::Data)) { - f.hidden = true; - } - if (f.hidden) c.s->hasHidden = true; - if (f.name.empty()) f.hidden = true; - c.s->fields.push_back(f); - return CXVisit_Continue; - }, &c2); - defining.erase(usr); - out.structs[name] = s; - return name; - } - - // C type -> Finch type. Returns false (with a reason) if Finch can't express it. - bool mapType(CXType t, Type &res, std::string &why, Ctx ctx) { - t = clang_getCanonicalType(t); - long long size = clang_Type_getSizeOf(t); - auto sized = [&](bool isSigned) { - switch (size) { - case 1: res = isSigned ? Type::I8 : Type::U8; return true; - case 2: res = isSigned ? Type::I16 : Type::U16; return true; - case 4: res = isSigned ? Type::I32 : Type::U32; return true; - case 8: res = isSigned ? Type::I64 : Type::U64; return true; - } - why = "uses a " + std::to_string(size * 8) + "-bit number"; - return false; - }; - - switch (t.kind) { - case CXType_Void: res = Type::Void; return true; - case CXType_Bool: res = Type::Bool; return true; - case CXType_Char_S: - case CXType_Char_U: res = Type::Char; return true; - case CXType_SChar: - case CXType_Short: - case CXType_Int: - case CXType_Long: - case CXType_LongLong: return sized(true); - case CXType_UChar: - case CXType_UShort: - case CXType_UInt: - case CXType_ULong: - case CXType_ULongLong: return sized(false); - case CXType_Enum: return sized(true); - case CXType_Float: res = Type::F32; return true; - case CXType_Double: res = Type::F64; return true; - case CXType_Pointer: { - CXType pointee = clang_getCanonicalType(clang_getPointeeType(t)); - if ((pointee.kind == CXType_Char_S || pointee.kind == CXType_Char_U) && ctx == Ctx::Signature) { - res = Type::Str; // char* in a signature is a C string - return true; - } - Type inner; - std::string ignored; - if (pointee.kind == CXType_Void || pointee.kind == CXType_FunctionProto || - pointee.kind == CXType_FunctionNoProto || !mapType(pointee, inner, ignored, Ctx::Data) || - inner.kind == Type::Void || inner.kind == Type::Fixed) - res = Type::Ptr; // an opaque `ptr` you can pass around - else - res = Type::ptrTo(inner); - return true; - } - case CXType_Record: { - if (clang_getCursorKind(clang_getTypeDeclaration(t)) == CXCursor_UnionDecl) { - why = "uses a C union by value"; - return false; - } - std::string name = defineRecord(t); - if (name.empty()) { - why = "uses an incomplete C struct by value"; - return false; - } - res = Type(Type::Named); - res.name = name; - res.module = "C"; - return true; - } - case CXType_ConstantArray: { - Type inner; - if (!mapType(clang_getArrayElementType(t), inner, why, Ctx::Data)) return false; - res = Type(Type::Fixed); - res.elem = std::make_shared(inner); - res.count = clang_getArraySize(t); - return true; - } - case CXType_LongDouble: why = "uses long double"; return false; - default: why = "uses the C type '" + str(clang_getTypeSpelling(t)) + "'"; return false; - } - } - - // Simple #defines: a single number, maybe negative, maybe in parentheses. - bool macroValue(CXCursor c, CConst &res) { - CXToken *toks; - unsigned n; - clang_tokenize(tu, clang_getCursorExtent(c), &toks, &n); - std::vector parts; - for (unsigned k = 1; k < n; k++) { // token 0 is the macro's name - if (clang_getTokenKind(toks[k]) == CXToken_Comment) continue; - parts.push_back(str(clang_getTokenSpelling(tu, toks[k]))); - } - clang_disposeTokens(tu, toks, n); - - while (parts.size() >= 2 && parts.front() == "(" && parts.back() == ")") { - parts.erase(parts.begin()); - parts.pop_back(); - } - bool neg = false; - if (parts.size() == 2 && parts[0] == "-") { - neg = true; - parts.erase(parts.begin()); - } - if (parts.size() != 1) return false; - const std::string &lit = parts[0]; - if (lit.empty() || !(std::isdigit((unsigned char)lit[0]) || lit[0] == '.')) return false; - - bool isFloat = lit.find_first_of(".eE") != std::string::npos && lit.rfind("0x", 0) != 0; - char *end; - if (isFloat) { - res.type = Type::F64; - res.f = std::strtod(lit.c_str(), &end); - if (neg) res.f = -res.f; - } else { - res.type = Type::I64; - res.i = (long long)std::strtoull(lit.c_str(), &end, 0); // C rules: 0x.., 0755 - if (neg) res.i = -res.i; - } - for (; *end; end++) // allow suffixes: 10UL, 1.0f - if (!std::strchr("uUlLfF", *end)) return false; - return true; - } - - void visitTop(CXCursor c) { - std::string name = str(clang_getCursorSpelling(c)); - switch (clang_getCursorKind(c)) { - case CXCursor_TypedefDecl: { - // typedef struct {...} Name; -> the struct is called Name in Finch - CXType u = clang_getCanonicalType(clang_getTypedefDeclUnderlyingType(c)); - if (u.kind == CXType_Record) { - std::string usr = str(clang_getCursorUSR(clang_getTypeDeclaration(u))); - // prefer the typedef name, unless the struct is already known under its tag - auto it = recordNames.find(usr); - bool used = it != recordNames.end() && out.structs.count(it->second); - if (!used && !out.structs.count(name)) recordNames[usr] = name; - } - break; - } - case CXCursor_FunctionDecl: { - if (out.fns.count(name)) break; - CFunc f; - f.name = name; - f.header = header; - if (clang_Cursor_getStorageClass(c) == CX_SC_Static) { - f.unsupported = "is a static inline C function (it has no code to link against)"; - out.fns[name] = f; - break; - } - CXType ft = clang_getCanonicalType(clang_getCursorType(c)); - if (ft.kind == CXType_FunctionNoProto) { - f.unsupported = "has no parameter list in its C declaration"; - out.fns[name] = f; - break; - } - std::string why; - if (!mapType(clang_getResultType(ft), f.ret, why, Ctx::Signature)) f.unsupported = why; - int n = clang_getNumArgTypes(ft); - for (int k = 0; k < n && f.unsupported.empty(); k++) { - Type t; - if (!mapType(clang_getArgType(ft, k), t, why, Ctx::Signature)) f.unsupported = why; - f.params.push_back(t); - } - f.variadic = clang_isFunctionTypeVariadic(ft); - out.fns[name] = f; - break; - } - case CXCursor_VarDecl: { - if (clang_Cursor_getStorageClass(c) != CX_SC_Extern || out.globals.count(name)) break; - CGlobal g; - std::string why; - if (mapType(clang_getCursorType(c), g.type, why, Ctx::Data)) out.globals[name] = g; - break; - } - case CXCursor_StructDecl: - if (clang_isCursorDefinition(c) && !name.empty() && name.find(' ') == std::string::npos) { - std::string usr = str(clang_getCursorUSR(c)); - if (!recordNames.count(usr)) recordNames[usr] = name; - } - break; - case CXCursor_EnumDecl: - clang_visitChildren(c, [](CXCursor k, CXCursor, CXClientData d) { - static_cast(d)->visitTop(k); - return CXChildVisit_Continue; - }, this); - break; - case CXCursor_EnumConstantDecl: { - CConst k; - k.type = Type::I64; - k.i = clang_getEnumConstantDeclValue(c); - out.consts.emplace(name, k); - break; - } - case CXCursor_MacroDefinition: { - if (clang_Cursor_isMacroBuiltin(c) || clang_Cursor_isMacroFunctionLike(c)) break; - CConst k; - if (macroValue(c, k)) out.consts.emplace(name, k); - break; - } - default: break; - } - } -}; - -} // namespace - -CImports importHeaders(const std::vector &imports, const std::vector &dirs) { - CImports out; - bool any = false; - for (const Import &im : imports) any |= im.isC; - if (!any) return out; - - // parse for the target system: sizes (long is 32 bits on Windows) and headers differ - std::vector args = {"-x", "c", "-std=gnu11", "--target=" + g_target.triple.str()}; - if (g_target.windows) args.push_back("-D_USE_MATH_DEFINES"); // M_PI and friends, as on Linux - for (const std::string &d : dirs) args.push_back("-I" + d); - for (const std::string &d : systemIncludeArgs()) args.push_back(d); - std::vector argv; - for (const std::string &a : args) argv.push_back(a.c_str()); - - Importer imp(out); - CXIndex index = clang_createIndex(0, 0); - for (const Import &im : imports) { - if (!im.isC) continue; - std::string src = "#include \"" + im.path + "\"\n"; - CXUnsavedFile file = {"finch_import.c", src.c_str(), (unsigned long)src.size()}; - CXTranslationUnit tu = nullptr; - CXErrorCode err = clang_parseTranslationUnit2( - index, "finch_import.c", argv.data(), (int)argv.size(), &file, 1, - CXTranslationUnit_DetailedPreprocessingRecord | CXTranslationUnit_SkipFunctionBodies, &tu); - if (err != CXError_Success || !tu) failAt(im.pos.file, im.pos.line, im.pos.col, "couldn't read C header '" + im.path + "'"); - - for (unsigned k = 0; k < clang_getNumDiagnostics(tu); k++) { - CXDiagnostic d = clang_getDiagnostic(tu, k); - if (clang_getDiagnosticSeverity(d) >= CXDiagnostic_Error) { - std::string msg = str(clang_getDiagnosticSpelling(d)); - clang_disposeDiagnostic(d); - if (msg.find("file not found") != std::string::npos) { - // "'GL/gl.h' file not found": it may be a header that this one includes - std::string missing = msg.substr(1, msg.find('\'', 1) - 1); - if (missing == im.path) - failAt(im.pos.file, im.pos.line, im.pos.col, "can't find the C header '" + im.path + "'"); - failAt(im.pos.file, im.pos.line, im.pos.col, "can't find the C header '" + missing + "', which '" + im.path + - "' includes (is its library's development package installed?)"); - } - failAt(im.pos.file, im.pos.line, im.pos.col, "C header '" + im.path + "' has an error: " + msg); - } - clang_disposeDiagnostic(d); - } - - imp.tu = tu; - imp.header = im.path; - clang_visitChildren(clang_getTranslationUnitCursor(tu), [](CXCursor c, CXCursor, CXClientData d) { - static_cast(d)->visitTop(c); - return CXChildVisit_Continue; - }, &imp); - clang_disposeTranslationUnit(tu); - } - clang_disposeIndex(index); - return out; -} diff --git a/boot/cimport.fch b/src/cimport.fch similarity index 100% rename from boot/cimport.fch rename to src/cimport.fch diff --git a/src/cimport.h b/src/cimport.h deleted file mode 100644 index fe4be0d..0000000 --- a/src/cimport.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "ast.h" - -#include -#include -#include -#include - -// What Finch learned from `import "something.h"`. -// C structs by value appear in types as Named{name, module "C"}. - -struct CFunc { - std::string name; - std::string header; // the import it came from - Type ret; - std::vector params; - bool variadic = false; - std::string unsupported; // non-empty: why Finch can't call it (yet) -}; - -struct CConst { // enum values and simple #define numbers - Type type; - long long i = 0; - double f = 0; -}; - -struct CGlobal { // extern variables like stdout - Type type; -}; - -struct CField { - std::string name; - Type type; - long long offset = 0; // bytes - long long size = 0, align = 1; - bool hidden = false; // unions, bitfields, unmappable types: kept for layout only -}; - -struct CStruct { - std::string name; - std::vector fields; - long long size = 0, align = 1; - std::string unsupported; // why it can't be used by value (pointers to it still work) - bool hasHidden = false; -}; - -struct CImports { - std::unordered_map fns; - std::unordered_map consts; - std::unordered_map globals; - std::map structs; -}; - -// `dirs`: folders searched first for "local.h" headers (the .fch files' folders). -CImports importHeaders(const std::vector &imports, const std::vector &dirs); diff --git a/src/codegen.cpp b/src/codegen.cpp deleted file mode 100644 index e0b4906..0000000 --- a/src/codegen.cpp +++ /dev/null @@ -1,1505 +0,0 @@ -// Code generation, part 1: the program, statements, scopes and expressions. -// Types, ownership and printing live in codegen_types.cpp; calls and built-ins in -// codegen_builtins.cpp; the C calling convention in abi.cpp. - -#include "codegen_impl.h" -#include "builtins_doc.h" - -using namespace llvm; - -namespace finch { - -Codegen::Codegen(LLVMContext &c, const std::vector &ps, const CImports &ci, TargetMachine &tm, bool dbg) - : ctx(c), b(c), mod(std::make_unique("finch", c)), progs(ps), cimports(ci), debug(dbg) { - mod->setTargetTriple(tm.getTargetTriple()); - mod->setDataLayout(tm.createDataLayout()); - dl = &mod->getDataLayout(); - scopes.reserve(256); - if (debug) { - di = std::make_unique(*mod); - for (const SourceFile &f : g_files) { - std::string path = f.path; - size_t slash = path.find_last_of('/'); - std::string dir = slash == std::string::npos ? "." : path.substr(0, slash); - std::string name = slash == std::string::npos ? path : path.substr(slash + 1); - diFiles.push_back(di->createFile(name, dir)); - } - diUnit = di->createCompileUnit(dwarf::DW_LANG_C, diFiles[0], "finch " FINCH_VERSION, false, "", 0); - mod->addModuleFlag(Module::Warning, "Debug Info Version", DEBUG_METADATA_VERSION); - if (tm.getTargetTriple().isWindowsMSVCEnvironment()) - mod->addModuleFlag(Module::Warning, "CodeView", 1); // what Visual Studio and WinDbg read - else - mod->addModuleFlag(Module::Warning, "Dwarf Version", 5); - } -} - -std::unique_ptr Codegen::run() { - declareStructs(); - declareFns(); - if (!modules[""].fns.count("main")) failAt(0, 1, 1, "there is no main function (add 'fn main() { ... }')"); - for (auto &[name, m] : modules) - for (auto &[fname, fn] : m.fns) define(fn); - for (auto &[s, ms] : methods) - for (auto &[mname, fn] : ms) define(fn); - defineMainWrapper(); - if (di) di->finalize(); - - std::string err; - raw_string_ostream os(err); - if (verifyModule(*mod, &os)) { - std::fprintf(stderr, "internal compiler error (please report):\n%s\n", err.c_str()); - std::exit(2); - } - return std::move(mod); -} - -// ---------- declarations ---------- - -void Codegen::declareStructs() { - for (const Program &p : progs) { - ModuleScope &m = modules[p.module]; - for (const Import &im : p.imports) - if (!im.isC) m.imports.insert(im.path); - for (const StructDecl &d : p.structs) { - if (m.structs.count(d.name)) failAt(d.pos.file, d.pos.line, d.pos.col, "the struct '" + d.name + "' is defined twice"); - auto s = std::make_unique(); - s->name = d.name; - s->module = p.module; - s->decl = &d; - s->pos = d.pos; - s->llvm = StructType::create(ctx, "finch." + (p.module.empty() ? "" : p.module + ".") + d.name); - m.structs[d.name] = s.get(); - structStore.push_back(std::move(s)); - } - } - for (const auto &[name, cs] : cimports.structs) { - auto s = std::make_unique(); - s->name = name; - s->module = "C"; - s->isC = true; - s->cstruct = &cs; - s->unsupported = cs.unsupported; - s->llvm = StructType::create(ctx, "c." + name); - cStructs[name] = s.get(); - structStore.push_back(std::move(s)); - } - for (auto &s : structStore) resolveStruct(s.get()); - if (g_index) - for (auto &s : structStore) { - StructIndex si{s->module, s->name, {}, -1, 0, 0}; - if (s->decl) { - si.file = s->decl->namePos.file; - si.line = s->decl->namePos.line; - si.col = s->decl->namePos.col; - note(s->decl->namePos, s->name.size(), structHover(s.get()), s->decl->namePos); - } - for (auto &f : s->fields) { - si.fields.push_back({f.name, f.type.show()}); - if (s->decl) note(f.pos, f.name.size(), "```finch\n" + f.type.show() + " " + f.name + "\n```\nfield of `" + s->name + "`", f.pos); - } - g_index->structs.push_back(si); - } -} - -void Codegen::declareFns() { - for (const Program &p : progs) - for (const FnDecl &fn : p.fns) declare(p, fn); - - // Which methods change `self`? Calling one of them on something changes it too, so repeat until stable. - for (bool changed = true; changed;) { - changed = false; - for (auto &[s, ms] : methods) - for (auto &[name, f] : ms) - if (!f.mutatesSelf && mutates("self", *f.decl->body)) { - f.mutatesSelf = true; - mutatingMethods.insert(name); - changed = true; - } - } - // Owning parameters the function never changes are lent to it instead of copied. - auto borrow = [&](Fn &f) { - for (size_t i = 0; i < f.params.size(); i++) - f.borrowParam.push_back(owning(f.params[i]) && !mutates(f.decl->params[i].name, *f.decl->body)); - }; - for (auto &[name, m] : modules) - for (auto &[fname, f] : m.fns) borrow(f); - for (auto &[s, ms] : methods) - for (auto &[name, f] : ms) borrow(f); -} - -FType Codegen::structType(StructInfo *s) { - FType t(FType::Struct); - t.info = s; - t.name = s->name; - t.module = s->module == "C" ? "" : s->module; - return t; -} - -llvm::Type *Codegen::retType(const Fn &f) { - if (!f.fallible) return ty(f.ret); - llvm::Type *v = f.ret.kind == FType::Void ? (llvm::Type *)b.getInt8Ty() : ty(f.ret); - return StructType::get(ctx, {b.getInt1Ty(), v, ty(FType::Str)}); -} - -void Codegen::declare(const Program &p, const FnDecl &fn) { - ModuleScope &m = modules[p.module]; - Pos pos = fn.pos; - curModule = p.module; - StructInfo *recv = nullptr; - if (!fn.recv.empty()) { // fn Point.move(...) - Pos rp = fn.recvPos; - recv = findStruct("", fn.recv, false); - if (!recv) - failAt(rp.file, rp.line, rp.col, "there is no struct named '" + fn.recv + "' here (a method goes in the same file as its struct, or on a struct from C)"); - resolveStruct(recv); - for (auto &f : recv->fields) - if (f.name == fn.name && !f.hidden) - failAt(fn.namePos.file, fn.namePos.line, fn.namePos.col, "the struct " + recv->name + " already has a field named '" + fn.name + "'"); - if (methods[recv].count(fn.name)) failAt(pos.file, pos.line, pos.col, "the method " + fn.recv + "." + fn.name + " is defined twice"); - for (const Param &prm : fn.params) - if (prm.name == "self") - failAt(prm.namePos.file, prm.namePos.line, prm.namePos.col, "'self' is already the " + recv->name + " the method is called on"); - } else { - if (m.fns.count(fn.name)) failAt(pos.file, pos.line, pos.col, "function '" + fn.name + "' is defined twice"); - if (isBuiltin(fn.name)) failAt(pos.file, pos.line, pos.col, "'" + fn.name + "' is a built-in function, pick another name"); - if (m.structs.count(fn.name)) failAt(pos.file, pos.line, pos.col, "'" + fn.name + "' is already the name of a struct"); - } - - Fn f; - f.decl = &fn; - f.module = p.module; - f.recv = recv; - f.fallible = fn.fallible; - f.ret = resolve(fn.ret, pos); - for (const Param &prm : fn.params) f.params.push_back(resolve(prm.type, prm.pos)); - - bool isMain = p.module.empty() && fn.name == "main"; - if (isMain) { - bool argsOk = f.params.empty() || (f.params.size() == 1 && f.params[0] == FType::arrayOf(FType::Str)); - if (!argsOk) failAt(pos.file, pos.line, pos.col, "main takes no parameters, or the program's arguments: fn main([]str args)"); - FType::Kind r = f.ret.kind; - if (r != FType::Void && r != FType::I64 && r != FType::I32) - failAt(pos.file, pos.line, pos.col, "main returns nothing (fn main()) or an exit code (fn main() -> int)"); - } - - std::vector params; - if (recv) params.push_back(b.getPtrTy()); // self - for (size_t i = 0; i < f.params.size(); i++) params.push_back(ty(f.params[i])); - // User functions get a prefix so they never clash with C library names. - std::string name = "finch." + (p.module.empty() ? "" : p.module + ".") + (recv ? recv->name + "." : "") + fn.name; - f.llvm = Function::Create(FunctionType::get(retType(f), params, false), Function::InternalLinkage, name, mod.get()); - if (recv) methods[recv][fn.name] = f; - else m.fns[fn.name] = f; -} - -// The real C `main` calls the Finch one and turns its result into an exit code. -void Codegen::defineMainWrapper() { - Fn &fm = modules[""].fns["main"]; - Function *w = Function::Create(FunctionType::get(b.getInt32Ty(), {b.getInt32Ty(), b.getPtrTy()}, false), - Function::ExternalLinkage, "main", mod.get()); - b.SetInsertPoint(BasicBlock::Create(ctx, "entry", w)); - b.SetCurrentDebugLocation(DebugLoc()); - std::vector args; - Value *argsArr = nullptr; - if (!fm.params.empty()) { - Value *out = tmp(Constant::getNullValue(ty(fm.params[0]))); - b.CreateCall(rt("finch_args"), {out, w->getArg(0), w->getArg(1)}); - argsArr = b.CreateLoad(ty(fm.params[0]), out); - args.push_back(argsArr); - } - Value *r = b.CreateCall(fm.llvm, args); - if (argsArr) dropValue(argsArr, fm.params[0]); - if (fm.fallible) { // fn main() -> !: a failure is printed, and the exit code is 1 - BasicBlock *bad = BasicBlock::Create(ctx, "main.failed", w), *good = BasicBlock::Create(ctx, "main.ok", w); - b.CreateCondBr(b.CreateExtractValue(r, 0), good, bad); - b.SetInsertPoint(bad); - Value *msg = tmp(b.CreateExtractValue(r, 2)); - b.CreateCall(rt("finch_report_error"), {msg}); - b.CreateCall(rt("finch_str_drop"), {msg}); - b.CreateRet(b.getInt32(1)); - b.SetInsertPoint(good); - if (fm.ret.kind != FType::Void) r = b.CreateExtractValue(r, 1); - } - if (fm.ret.kind == FType::Void) b.CreateRet(b.getInt32(0)); - else b.CreateRet(b.CreateIntCast(r, b.getInt32Ty(), true)); -} - -void Codegen::define(Fn &fn) { - const FnDecl &d = *fn.decl; - curFn = &fn; - curModule = fn.module; - if (g_index) { - std::string shown = fn.recv ? fn.recv->name + "." + d.name : d.name; - FnInfo fi{fn.module, shown, signature(fn), "", {}, d.namePos.file, d.namePos.line, d.namePos.col, d.body->end.line}; - for (size_t i = 0; i < fn.params.size(); i++) fi.params.push_back(fn.params[i].show() + " " + d.params[i].name); - g_index->fns.push_back(fi); - note(d.namePos, d.name.size(), "```finch\n" + signature(fn) + "\n```", d.namePos); - } - Function *f = fn.llvm; - b.SetInsertPoint(BasicBlock::Create(ctx, "entry", f)); - if (di) { - DIFile *file = diFiles[d.pos.file]; - std::vector types{diType(fn.ret)}; - for (const FType &t : fn.params) types.push_back(diType(t)); - diFn = di->createFunction(file, d.name, f->getName(), file, d.pos.line, - di->createSubroutineType(di->getOrCreateTypeArray(types)), d.pos.line, - DINode::FlagPrototyped, DISubprogram::SPFlagDefinition); - f->setSubprogram(diFn); - } - setLoc(d.pos); - - scopes.clear(); - varOrder = 0; - pushScope(); - unsigned i = 0; - auto argIt = f->arg_begin(); - if (fn.recv) { // `self` is the caller's struct itself, reached through its address - Argument &selfArg = *argIt++; - selfArg.setName("self"); - Var v; - v.slot = &selfArg; - v.type = structType(fn.recv); - v.order = ++varOrder; - v.pos = d.recvPos; - scopes.back().vars["self"] = v; - if (g_index) g_index->vars.push_back({"self", v.type.show(), d.pos.file, d.pos.line, d.pos.col, d.pos.file, d.pos.line, d.body->end.line}); - if (di) { - FType pt = FType::ptrTo(v.type); - AllocaInst *a = slot(pt, "self.addr"); - b.CreateStore(&selfArg, a); - DILocalVariable *dv = di->createParameterVariable(diFn, "self", 1, diFiles[d.pos.file], d.pos.line, diType(pt)); - di->insertDeclare(a, dv, di->createExpression(), DILocation::get(ctx, d.pos.line, d.pos.col, diFn), b.GetInsertBlock()); - } - } - for (; argIt != f->arg_end(); ++argIt) { - Argument &arg = *argIt; - const Param &p = d.params[i]; - const FType &t = fn.params[i]; - arg.setName(p.name); - unsigned argNo = i + 1 + (fn.recv ? 1 : 0); - if (owning(t) && !fn.borrowParam[i]) addVar(p.namePos, p.name, t, copyValue(&arg, t), true, false, argNo); // changed inside: own a copy - else addVar(p.namePos, p.name, t, &arg, false, false, argNo); - i++; - } - blockBody(*d.body); - if (!terminated()) { - if (fn.ret.kind != FType::Void) - failAt(d.pos.file, d.pos.line, d.pos.col, "function '" + d.name + "' can reach its end without returning " + fn.ret.show()); - emitCleanups(0); - retValue(nullptr); - } - scopes.clear(); - diFn = nullptr; -} - -// ---------- scopes ---------- - -void Codegen::pushScope() { scopes.emplace_back(); } - -void Codegen::hold(const Value_ &v) { - if (v.fresh && v.v && !isa(v.v) && owning(v.type)) pending.push_back({v.v, v.type, false}); -} - -void Codegen::holdAddr(Value *addr, const FType &t) { - if (owning(t)) pending.push_back({addr, t, true}); -} - -void Codegen::dropPending(size_t downTo) { - for (size_t i = pending.size(); i-- > downTo;) { - if (pending[i].isAddr) dropAt(pending[i].v, pending[i].type); - else dropValue(pending[i].v, pending[i].type); - } -} - -void Codegen::popScope() { - if (!terminated()) emitScopeCleanups(scopes.size() - 1); - scopes.pop_back(); -} - -void Codegen::emitCleanups(size_t downTo) { - for (size_t i = scopes.size(); i-- > downTo;) emitScopeCleanups(i); -} - -// Drop the scope's variables and run its defers, newest first. -void Codegen::emitScopeCleanups(size_t idx) { - for (size_t k = scopes[idx].cleanups.size(); k-- > 0;) { - Cleanup c = scopes[idx].cleanups[k]; // a copy: emitting a defer may grow `scopes` - if (!c.isDefer) { - Var v = scopes[idx].vars.at(c.var); - if (!v.moved) dropAt(v.slot, v.type); - continue; - } - int savedLimit = deferLimit; - deferLimit = c.order; - inDefer++; - pushScope(); - stmt(*c.body); - popScope(); - inDefer--; - deferLimit = savedLimit; - } -} - -bool Codegen::terminated() { return b.GetInsertBlock()->getTerminator() != nullptr; } - -BasicBlock *Codegen::newBlock(const char *name) { - return BasicBlock::Create(ctx, name, b.GetInsertBlock()->getParent()); -} - -// Variables live in stack slots created at the top of the function; LLVM turns them into registers. -AllocaInst *Codegen::slot(const FType &t, const std::string &name) { - Function *f = b.GetInsertBlock()->getParent(); - IRBuilder<> entry(&f->getEntryBlock(), f->getEntryBlock().begin()); - AllocaInst *a = entry.CreateAlloca(ty(t), nullptr, name); - if (t.kind == FType::Struct && t.info->isC) a->setAlignment(Align(t.info->cstruct->align)); - return a; -} - -Var *Codegen::lookup(const std::string &name) { - for (size_t i = scopes.size(); i-- > 0;) { - auto found = scopes[i].vars.find(name); - if (found == scopes[i].vars.end()) continue; - if (deferLimit >= 0 && found->second.order > deferLimit) continue; // declared after the defer - return &found->second; - } - return nullptr; -} - -Var &Codegen::addVar(Pos p, const std::string &name, const FType &t, Value *init, bool owned, bool readonly, - unsigned argNo) { - // `err` of an inner `or` hides the outer one: f() or g() or err - if (lookup(name) && name != "err") failAt(p.file, p.line, p.col, "a variable named '" + name + "' already exists here"); - ModuleScope &m = modules[curModule]; - if (m.fns.count(name)) failAt(p.file, p.line, p.col, "'" + name + "' is already the name of a function"); - if (m.imports.count(name)) failAt(p.file, p.line, p.col, "'" + name + "' is already the name of an imported module"); - if (isBuiltin(name)) failAt(p.file, p.line, p.col, "'" + name + "' is a built-in name, pick another one"); - AllocaInst *s = slot(t, name); - b.CreateStore(init, s); - Var v; - v.slot = s; - v.type = t; - v.readonly = readonly; - v.owned = owned && owning(t); - v.order = ++varOrder; - v.pos = p; - if (v.owned) scopes.back().cleanups.push_back({false, name}); - if (g_index && name[0] != '$' && curFn) { - const FnDecl &d = *curFn->decl; - g_index->vars.push_back({name, t.show(), p.file, p.line, p.col, d.pos.file, d.pos.line, d.body->end.line}); - note(p, name.size(), "```finch\n" + t.show() + " " + name + "\n```", p); - } - if (di && name[0] != '$') { - DILocalVariable *dv = argNo ? di->createParameterVariable(diFn, name, argNo, diFiles[p.file], p.line, diType(t)) - : di->createAutoVariable(diFn, name, diFiles[p.file], p.line, diType(t)); - di->insertDeclare(s, dv, di->createExpression(), DILocation::get(ctx, p.line, p.col, diFn), b.GetInsertBlock()); - } - return scopes.back().vars[name] = v; -} - -// ---------- statements ---------- - -void Codegen::block(const BlockStmt &blk) { - pushScope(); - blockBody(blk); - popScope(); -} - -void Codegen::blockBody(const BlockStmt &blk) { - for (const StmtPtr &s : blk.body) { - if (terminated()) - failAt(s->pos.file, s->pos.line, s->pos.col, "this code can never run (it comes after return, break or continue)"); - stmt(*s); - } -} - -void Codegen::stmt(const Stmt &s) { - setLoc(s.pos); - switch (s.kind) { - case StmtKind::Block: block(static_cast(s)); break; - case StmtKind::VarDecl: varDecl(static_cast(s)); break; - case StmtKind::Assign: assign(static_cast(s)); break; - case StmtKind::Expr: { - const Expr &x = *static_cast(s).expr; - release(x.kind == ExprKind::OrElse ? orElse(static_cast(x), true) : expr(x)); - break; - } - case StmtKind::If: ifStmt(static_cast(s)); break; - case StmtKind::While: whileStmt(static_cast(s)); break; - case StmtKind::For: forStmt(static_cast(s)); break; - case StmtKind::ForEach: forEachStmt(static_cast(s)); break; - case StmtKind::Return: returnStmt(static_cast(s)); break; - case StmtKind::Break: jump(true, s.pos); break; - case StmtKind::Continue: jump(false, s.pos); break; - case StmtKind::Defer: { - auto &d = static_cast(s); - scopes.back().cleanups.push_back({true, "", d.body.get(), varOrder}); - break; - } - } -} - -void Codegen::jump(bool isBreak, Pos p) { - const char *word = isBreak ? "break" : "continue"; - if (inDefer) failAt(p.file, p.line, p.col, std::string(word) + " can't be used inside defer"); - if (loops.empty()) failAt(p.file, p.line, p.col, std::string(word) + " can only be used inside a loop"); - Loop l = loops.back(); - dropPending(l.pendingDepth); - emitCleanups(l.scopeDepth); - b.CreateBr(isBreak ? l.breakTo : l.continueTo); -} - -void Codegen::varDecl(const VarDeclStmt &s) { - Pos p = s.pos; - if (!s.hasType) { - Value_ v = expr(*s.init); - Pos ip = s.init->pos; - if (v.type.kind == FType::Void) failAt(ip.file, ip.line, ip.col, "this gives back nothing, so it can't be stored"); - if (v.type.kind == FType::Null) failAt(ip.file, ip.line, ip.col, "null needs a type, like: ptr[int] " + s.name + " = null"); - addVar(s.namePos, s.name, v.type, own(v), true); - return; - } - FType t = resolve(s.type, p); - if (t.kind == FType::Void) failAt(p.file, p.line, p.col, "a variable can't have the type 'nothing'"); - Value_ v = s.init ? coerce(exprWant(*s.init, t), t, s.init->pos, "'" + s.name + "'") : defaultValue(t, p); - addVar(s.namePos, s.name, t, own(v), true); -} - -void Codegen::assign(const AssignStmt &s) { - std::string root = rootVar(*s.target); - if (!root.empty()) { - Var *v = lookup(root); - if (v && v->readonly) failAt(s.pos.file, s.pos.line, s.pos.col, v->readonlyWhy); - if (!v && s.target->kind == ExprKind::Var && !cimports.globals.count(root)) - failAt(s.pos.file, s.pos.line, s.pos.col, "there is no variable named '" + root + "' (create it with " + root + " := ...)"); - } - std::string what = s.target->kind == ExprKind::Var ? "'" + root + "'" : "the value"; - - if (s.op == '=') { - // The right side first: it may move memory the target lives in (a.push(...) inside it). - Value_ v; - bool known = false; - FType want; - if (s.target->kind == ExprKind::Var) { - if (Var *var = lookup(root)) { want = var->type; known = true; } - } - v = known ? exprWant(*s.value, want) : expr(*s.value); - Held held(*this); - hold(v); // while the target is computed (a[try f()] = ...) - Place dst = place(*s.target, true); - v = coerce(v, dst.type, s.value->pos, what); - Value *nv = own(v); - if (owning(dst.type)) { - Value *old = b.CreateLoad(ty(dst.type), dst.addr); - b.CreateStore(nv, dst.addr); - dropValue(old, dst.type); - } else { - b.CreateStore(nv, dst.addr); - } - return; - } - BinOp op = s.op == '+' ? BinOp::Add : s.op == '-' ? BinOp::Sub : s.op == '*' ? BinOp::Mul - : s.op == '/' ? BinOp::Div : BinOp::Mod; - Value_ rhs = expr(*s.value); - Held held(*this); - hold(rhs); - Place dst = place(*s.target, true); - Value_ cur{b.CreateLoad(ty(dst.type), dst.addr), dst.type}; - Value_ v = coerce(arith(op, cur, rhs, s.pos), dst.type, s.pos, what); - Value *nv = own(v); - if (owning(dst.type)) { - b.CreateStore(nv, dst.addr); - dropValue(cur.v, dst.type); - } else { - b.CreateStore(nv, dst.addr); - } -} - -Value *Codegen::condition(const Expr &e) { return coerce(expr(e), FType::Bool, e.pos, "a condition").v; } - -void Codegen::ifStmt(const IfStmt &s) { - Value *cond = condition(*s.cond); - BasicBlock *thenBB = newBlock("then"); - BasicBlock *elseBB = s.otherwise ? newBlock("else") : nullptr; - BasicBlock *end = newBlock("endif"); - b.CreateCondBr(cond, thenBB, elseBB ? elseBB : end); - - b.SetInsertPoint(thenBB); - block(*s.then); - BasicBlock *last = b.GetInsertBlock(); - if (!terminated()) b.CreateBr(end); - - if (elseBB) { - b.SetInsertPoint(elseBB); - stmt(*s.otherwise); - last = b.GetInsertBlock(); - if (!terminated()) b.CreateBr(end); - } - continueAt(end, last); -} - -// Continue emitting into `bb`; if nothing jumps there, drop it and stay "after a return". -void Codegen::continueAt(BasicBlock *bb, BasicBlock *deadEnd) { - if (pred_empty(bb)) { - bb->eraseFromParent(); - b.SetInsertPoint(deadEnd); - } else { - b.SetInsertPoint(bb); - } -} - -void Codegen::whileStmt(const WhileStmt &s) { - BasicBlock *condBB = newBlock("while.cond"); - BasicBlock *body = newBlock("while.body"); - BasicBlock *end = newBlock("while.end"); - b.CreateBr(condBB); - - b.SetInsertPoint(condBB); - Value *cond = condition(*s.cond); - if (auto *c = dyn_cast(cond); c && c->isOne()) b.CreateBr(body); // while true - else b.CreateCondBr(cond, body, end); - - b.SetInsertPoint(body); - loops.push_back({condBB, end, scopes.size(), pending.size()}); - block(*s.body); - loops.pop_back(); - if (!terminated()) b.CreateBr(condBB); - continueAt(end, b.GetInsertBlock()); -} - -void Codegen::forStmt(const ForStmt &s) { - Value *from = coerce(expr(*s.from), FType::I64, s.from->pos, "the start of a range").v; - Value *to = coerce(expr(*s.to), FType::I64, s.to->pos, "the end of a range").v; - - pushScope(); - Var &iv = addVar(s.varPos, s.var, FType::I64, from, false, true); - iv.readonlyWhy = "the loop variable '" + s.var + "' can't be changed"; - Value *i = iv.slot; - - BasicBlock *condBB = newBlock("for.cond"); - BasicBlock *body = newBlock("for.body"); - BasicBlock *step = newBlock("for.step"); - BasicBlock *end = newBlock("for.end"); - b.CreateBr(condBB); - - b.SetInsertPoint(condBB); - b.CreateCondBr(b.CreateICmpSLT(b.CreateLoad(b.getInt64Ty(), i), to), body, end); - - b.SetInsertPoint(body); - loops.push_back({step, end, scopes.size(), pending.size()}); - block(*s.body); - loops.pop_back(); - if (!terminated()) b.CreateBr(step); - - b.SetInsertPoint(step); - b.CreateStore(b.CreateAdd(b.CreateLoad(b.getInt64Ty(), i), b.getInt64(1)), i); - b.CreateBr(condBB); - - b.SetInsertPoint(end); - popScope(); -} - -// for x in list: x is each element (or each char of a str); for i, x in list: also its index; -// for key in map / for key, value in map: in the order the keys were added -void Codegen::forEachStmt(const ForEachStmt &s) { - pushScope(); - LRef r = ref(*s.list); - Value *addr; - FType lt; - bool live = r.isPlace; // iterate the variable itself: re-read its length every round - if (r.isPlace) { - addr = r.pl.addr; - lt = r.pl.type; - } else { - lt = r.val.type; - addr = addVar(s.pos, "$list" + std::to_string(varOrder), lt, own(r.val), true).slot; - } - if (lt.kind == FType::Map) { - FType kt = *lt.key, vt = *lt.elem; - StructType *ET = mapEntryTy(lt); - llvm::Type *MT = ty(lt); - // if the loop changes the map, keys and values are copied, so they can't disappear under us - bool copyKV = live && mutates(rootVar(*s.list), *s.body); - Value *i = slot(FType::I64, "$i"); - b.CreateStore(b.getInt64(0), i); - // adding keys inside the loop could reorder the entries: that stops the program (removing is fine) - Value *adds = live ? b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(MT, addr, 6)) : nullptr; - BasicBlock *condBB = newBlock("map.cond"), *check = newBlock("map.check"), *body = newBlock("map.body"), - *step = newBlock("map.step"), *end = newBlock("map.end"); - b.CreateBr(condBB); - b.SetInsertPoint(condBB); - if (adds && mutates(rootVar(*s.list), *s.body)) { - BasicBlock *changed = newBlock("map.changed"), *same = newBlock("map.same"); - b.CreateCondBr(b.CreateICmpNE(b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(MT, addr, 6)), adds), changed, same); - b.SetInsertPoint(changed); - b.CreateCall(rt("finch_map_changed"), {fileName(s.pos), b.getInt64(s.pos.line)}); - b.CreateUnreachable(); - b.SetInsertPoint(same); - } - Value *iv = b.CreateLoad(b.getInt64Ty(), i); - b.CreateCondBr(b.CreateICmpSLT(iv, b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(MT, addr, 2))), check, end); - b.SetInsertPoint(check); - Value *entry = b.CreateInBoundsGEP(ET, b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(MT, addr, 0)), iv); - Value *hash = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ET, entry, 0)); - b.CreateCondBr(b.CreateICmpEQ(hash, b.getInt64(0)), step, body); // a removed entry - b.SetInsertPoint(body); - loops.push_back({step, end, scopes.size(), pending.size()}); - pushScope(); - std::string why = " can't be changed (to change the map, use m[key] = ...)"; - Value *kv = b.CreateLoad(ty(kt), b.CreateStructGEP(ET, entry, 1)); - Var &k = addVar(s.varPos, s.var, kt, copyKV ? copyValue(kv, kt) : kv, copyKV, true); - k.readonlyWhy = "the loop variable '" + s.var + "'" + why; - if (!s.var2.empty()) { - Value *vv = b.CreateLoad(ty(vt), b.CreateStructGEP(ET, entry, 2)); - Var &v = addVar(s.var2Pos, s.var2, vt, copyKV ? copyValue(vv, vt) : vv, copyKV, true); - v.readonlyWhy = "the loop variable '" + s.var2 + "'" + why; - } - block(*s.body); - popScope(); - loops.pop_back(); - if (!terminated()) b.CreateBr(step); - b.SetInsertPoint(step); - b.CreateStore(b.CreateAdd(b.CreateLoad(b.getInt64Ty(), i), b.getInt64(1)), i); - b.CreateBr(condBB); - b.SetInsertPoint(end); - popScope(); - return; - } - if (lt.kind != FType::Array && lt.kind != FType::Str && lt.kind != FType::Fixed) - failAt(s.list->pos.file, s.list->pos.line, s.list->pos.col, - "for ... in needs an array, a str or a map, but this is " + lt.show() + " (for a range of numbers write 0..n)"); - FType et = lt.kind == FType::Str ? FType(FType::Char) : *lt.elem; - // If the loop changes the list, each element is copied, so it can't disappear under us. - bool copyElems = live && owning(et) && mutates(rootVar(*s.list), *s.body); - - Value *i = slot(FType::I64, "$i"); - b.CreateStore(b.getInt64(0), i); - BasicBlock *condBB = newBlock("each.cond"); - BasicBlock *body = newBlock("each.body"); - BasicBlock *step = newBlock("each.step"); - BasicBlock *end = newBlock("each.end"); - b.CreateBr(condBB); - - b.SetInsertPoint(condBB); - Value *len = lt.kind == FType::Fixed ? (Value *)b.getInt64(lt.count) : b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ty(lt), addr, 1)); - Value *iv = b.CreateLoad(b.getInt64Ty(), i); - b.CreateCondBr(b.CreateICmpSLT(iv, len), body, end); - - b.SetInsertPoint(body); - Value *elemAddr; - if (lt.kind == FType::Fixed) { - elemAddr = b.CreateInBoundsGEP(ty(lt), addr, {b.getInt64(0), iv}); - } else { - Value *data = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(ty(lt), addr, 0)); - elemAddr = b.CreateInBoundsGEP(ty(et), data, iv); - } - Value *elem = b.CreateLoad(ty(et), elemAddr); - loops.push_back({step, end, scopes.size(), pending.size()}); - pushScope(); - std::string elemVar = s.var; - Pos elemPos = s.varPos; - if (!s.var2.empty()) { // for i, x in list - Var &index = addVar(s.varPos, s.var, FType::I64, iv, false, true); - index.readonlyWhy = "the loop variable '" + s.var + "' can't be changed"; - elemVar = s.var2; - elemPos = s.var2Pos; - } - Var &xv = addVar(elemPos, elemVar, et, copyElems ? copyValue(elem, et) : elem, copyElems, true); - xv.readonlyWhy = "the loop variable '" + elemVar + "' can't be changed (to change the list, use list[i] = ...)"; - block(*s.body); - popScope(); - loops.pop_back(); - if (!terminated()) b.CreateBr(step); - - b.SetInsertPoint(step); - b.CreateStore(b.CreateAdd(b.CreateLoad(b.getInt64Ty(), i), b.getInt64(1)), i); - b.CreateBr(condBB); - - b.SetInsertPoint(end); - popScope(); -} - -void Codegen::retValue(Value *v) { - if (!curFn->fallible) { - if (v) b.CreateRet(v); - else b.CreateRetVoid(); - return; - } - Value *r = Constant::getNullValue(curFn->llvm->getReturnType()); - r = b.CreateInsertValue(r, b.getInt1(true), 0); - if (v) r = b.CreateInsertValue(r, v, 1); - b.CreateRet(r); -} - -void Codegen::retError(Value *msg) { - Value *r = Constant::getNullValue(curFn->llvm->getReturnType()); - b.CreateRet(b.CreateInsertValue(r, msg, 2)); -} - -void Codegen::returnStmt(const ReturnStmt &s) { - const FnDecl &d = *curFn->decl; - if (inDefer) failAt(s.pos.file, s.pos.line, s.pos.col, "return can't be used inside defer"); - // return error("...") - if (s.value && s.value->kind == ExprKind::Call && static_cast(*s.value).callee == "error") { - auto &c = static_cast(*s.value); - if (!curFn->fallible) - failAt(c.pos.file, c.pos.line, c.pos.col, "'" + d.name + "' can't fail, so it can't return an error (make it fallible: -> " + - (curFn->ret.kind == FType::Void ? std::string("!") : curFn->ret.show() + "!") + ")"); - if (g_index) - for (const BuiltinDoc &bd : kBuiltins) - if (std::string(bd.name) == "error") note(c.pos, 5, "```finch\n" + std::string(bd.signature) + "\n```\n" + bd.doc); - checkArgs(c.args, c.argNames, 1, c.pos, "error"); - Value *msg = own(coerce(expr(*c.args[0]), FType::Str, c.args[0]->pos, "the error message")); - dropPending(0); - emitCleanups(0); - retError(msg); - return; - } - if (curFn->ret.kind == FType::Void) { - if (s.value) - failAt(s.value->pos.file, s.value->pos.line, s.value->pos.col, "'" + d.name + "' doesn't return a value (it has no '-> type')"); - dropPending(0); - emitCleanups(0); - retValue(nullptr); - return; - } - if (!s.value) failAt(s.pos.file, s.pos.line, s.pos.col, "'" + d.name + "' must return " + curFn->ret.show()); - - // `return local` moves the variable out instead of copying it. - if (s.value->kind == ExprKind::Var) { - const std::string &name = static_cast(*s.value).name; - for (size_t idx = scopes.size(); idx-- > 0;) { - auto it = scopes[idx].vars.find(name); - if (it == scopes[idx].vars.end()) continue; - if (it->second.owned && it->second.type == curFn->ret) { - Value *v = b.CreateLoad(ty(it->second.type), it->second.slot); - it->second.moved = true; - dropPending(0); - emitCleanups(0); - scopes[idx].vars[name].moved = false; - retValue(v); - return; - } - break; - } - } - Value_ v = coerce(exprWant(*s.value, curFn->ret), curFn->ret, s.value->pos, "the returned value"); - Value *out = own(v); - dropPending(0); - emitCleanups(0); - retValue(out); -} - -// ---------- mutation analysis (does a function or loop change a variable?) ---------- - -std::string Codegen::rootVar(const Expr &e) { - switch (e.kind) { - case ExprKind::Var: return static_cast(e).name; - case ExprKind::Member: return rootVar(*static_cast(e).obj); - case ExprKind::Index: return rootVar(*static_cast(e).obj); - default: return ""; - } -} - -bool Codegen::mutatesExpr(const std::string &name, const Expr &e) { - static const std::set changing = {"push", "pop", "insert", "remove", "clear", "resize", "sort", "reverse"}; - switch (e.kind) { - case ExprKind::Try: return mutatesExpr(name, *static_cast(e).call); - case ExprKind::OrElse: { - auto &x = static_cast(e); - return mutatesExpr(name, *x.call) || (x.fallback && mutatesExpr(name, *x.fallback)) || (x.block && mutates(name, *x.block)); - } - case ExprKind::MapLit: { - auto &x = static_cast(e); - for (size_t k = 0; k < x.keys.size(); k++) - if (mutatesExpr(name, *x.keys[k]) || mutatesExpr(name, *x.values[k])) return true; - return false; - } - case ExprKind::Unary: return mutatesExpr(name, *static_cast(e).operand); - case ExprKind::Binary: { - auto &x = static_cast(e); - return mutatesExpr(name, *x.lhs) || mutatesExpr(name, *x.rhs); - } - case ExprKind::Call: { - auto &c = static_cast(e); - if (c.callee == "addr" && c.args.size() == 1 && rootVar(*c.args[0]) == name) return true; - for (auto &a : c.args) - if (mutatesExpr(name, *a)) return true; - return false; - } - case ExprKind::Member: return mutatesExpr(name, *static_cast(e).obj); - case ExprKind::Index: { - auto &x = static_cast(e); - return mutatesExpr(name, *x.obj) || mutatesExpr(name, *x.index); - } - case ExprKind::ArrayLit: - for (auto &a : static_cast(e).elems) - if (mutatesExpr(name, *a)) return true; - return false; - case ExprKind::Method: { - auto &m = static_cast(e); - if ((changing.count(m.name) || mutatingMethods.count(m.name)) && rootVar(*m.obj) == name) return true; - if (mutatesExpr(name, *m.obj)) return true; - for (auto &a : m.args) - if (mutatesExpr(name, *a)) return true; - return false; - } - default: return false; - } -} - -bool Codegen::mutates(const std::string &name, const Stmt &s) { - auto e = [&](const ExprPtr &x) { return x && mutatesExpr(name, *x); }; - switch (s.kind) { - case StmtKind::Block: - for (auto &st : static_cast(s).body) - if (mutates(name, *st)) return true; - return false; - case StmtKind::VarDecl: return e(static_cast(s).init); - case StmtKind::Assign: { - auto &a = static_cast(s); - return rootVar(*a.target) == name || e(a.target) || e(a.value); - } - case StmtKind::Expr: return e(static_cast(s).expr); - case StmtKind::If: { - auto &x = static_cast(s); - return e(x.cond) || mutates(name, *x.then) || (x.otherwise && mutates(name, *x.otherwise)); - } - case StmtKind::While: { - auto &x = static_cast(s); - return e(x.cond) || mutates(name, *x.body); - } - case StmtKind::For: { - auto &x = static_cast(s); - return e(x.from) || e(x.to) || mutates(name, *x.body); - } - case StmtKind::ForEach: { - auto &x = static_cast(s); - return e(x.list) || mutates(name, *x.body); - } - case StmtKind::Return: return e(static_cast(s).value); - case StmtKind::Defer: return mutates(name, *static_cast(s).body); - default: return false; - } -} - -// ---------- expressions ---------- - -Value_ Codegen::exprWant(const Expr &e, const FType &want) { - if (e.kind == ExprKind::ArrayLit) return arrayLit(static_cast(e), &want); - if (e.kind == ExprKind::MapLit) return mapLit(static_cast(e), &want); - return expr(e); -} - -// ---------- errors as values ---------- - -// Emit a call that may fail; `failed` (i1) and `msg` (str) tell how it went. -Value_ Codegen::fallible(const Expr &call, Value *&failed, Value *&msg) { - Pos p = call.pos; - if (call.kind != ExprKind::Call && call.kind != ExprKind::Method) - failAt(p.file, p.line, p.col, "only a function call can fail; 'or' and 'try' go after one, like int(text) or 0"); - const Expr *savedTarget = fallibleTarget; - Value *savedFailed = fallibleFailed, *savedMsg = fallibleMsg; - fallibleTarget = &call; - fallibleFailed = fallibleMsg = nullptr; - Value_ v = expr(call); - failed = fallibleFailed; - msg = fallibleMsg; - fallibleTarget = savedTarget; - fallibleFailed = savedFailed; - fallibleMsg = savedMsg; - if (!failed) failAt(p.file, p.line, p.col, "this call can't fail, so it needs no 'or' or 'try'"); - return v; -} - -// try f(x): on failure, the current function fails with the same error -Value_ Codegen::tryExpr(const TryExpr &t) { - Pos p = t.pos; - if (inDefer) failAt(p.file, p.line, p.col, "try can't be used inside defer"); - if (!curFn->fallible) - failAt(p.file, p.line, p.col, "try passes the error on, so '" + curFn->decl->name + "' must be able to fail too (-> " + - (curFn->ret.kind == FType::Void ? std::string("!") : curFn->ret.show() + "!") + - "); or handle it here: ... or / ... or { ... }"); - Value *failed, *msg; - Value_ v = fallible(*t.call, failed, msg); - BasicBlock *bad = newBlock("try.failed"), *ok = newBlock("try.ok"); - b.CreateCondBr(failed, bad, ok); - b.SetInsertPoint(bad); - dropPending(0); // what the expressions around this `try` were holding - emitCleanups(0); - retError(msg); - b.SetInsertPoint(ok); - return v; -} - -// f(x) or fallback / f(x) or { ... err ... } -Value_ Codegen::orElse(const OrElseExpr &e, bool discard) { - Value *failed, *msg; - Value_ v = fallible(*e.call, failed, msg); - BasicBlock *bad = newBlock("or.failed"), *ok = newBlock("or.ok"); - b.CreateCondBr(failed, bad, ok); - b.SetInsertPoint(bad); - if (e.block) { - pushScope(); - addVar(e.block->pos, "err", FType::Str, msg, true); - blockBody(*e.block); - bool left = terminated(); - if (!left && v.type.kind != FType::Void && !discard) - failAt(e.block->end.file, e.block->end.line, e.block->end.col, - "this block must leave with return, break, continue or exit(...): after a failure there is no value to go on with (or give one: ... or )"); - popScope(); - if (discard && v.type.kind != FType::Void) { // read_file(p) or { ... } as a statement: drop the unused value - BasicBlock *join = newBlock("or.end"); - if (!left) b.CreateBr(join); - b.SetInsertPoint(ok); - release(v); - b.CreateBr(join); - b.SetInsertPoint(join); - return {nullptr, FType::Void}; - } - if (!left) b.CreateBr(ok); - b.SetInsertPoint(ok); - return v; - } - Pos fp = e.fallback->pos; - if (v.type.kind == FType::Void) - failAt(fp.file, fp.line, fp.col, "this call gives back no value, so there is nothing to replace; handle the failure with or { ... }"); - pushScope(); // the fallback can use the message too: f(x) or err - addVar(fp, "err", FType::Str, msg, true); - Value *fv = own(coerce(exprWant(*e.fallback, v.type), v.type, fp, "the value after 'or'")); - popScope(); - BasicBlock *badEnd = b.GetInsertBlock(); - BasicBlock *join = newBlock("or.end"); - b.CreateBr(join); - b.SetInsertPoint(ok); - b.CreateBr(join); - b.SetInsertPoint(join); - PHINode *phi = b.CreatePHI(ty(v.type), 2); - phi->addIncoming(fv, badEnd); - phi->addIncoming(v.v, ok); - return {phi, v.type, false, owning(v.type)}; -} - -Value_ Codegen::expr(const Expr &e) { - switch (e.kind) { - case ExprKind::Int: return {b.getInt64(static_cast(e).value), FType::I64, true}; - case ExprKind::Float: return {ConstantFP::get(b.getDoubleTy(), static_cast(e).value), FType::F64, true}; - case ExprKind::Bool: return {b.getInt1(static_cast(e).value), FType::Bool}; - case ExprKind::Char: return {b.getInt8(static_cast(e).value), FType::Char}; - case ExprKind::Str: return {strConst(static_cast(e).value), FType::Str, false, true}; - case ExprKind::Null: return {ConstantPointerNull::get(b.getPtrTy()), FType::Null}; - case ExprKind::Var: { - auto &v = static_cast(e); - if (!lookup(v.name)) { - auto c = cimports.consts.find(v.name); - if (c != cimports.consts.end()) { - note(e.pos, v.name.size(), "C constant `" + v.name + " = " + - (c->second.type.isFloat() ? std::to_string(c->second.f) : std::to_string(c->second.i)) + "`"); - if (c->second.type.isFloat()) return {ConstantFP::get(b.getDoubleTy(), c->second.f), FType::F64, true}; - return {b.getInt64(c->second.i), FType::I64, true}; - } - if (modules[curModule].imports.count(v.name)) - failAt(e.pos.file, e.pos.line, e.pos.col, "'" + v.name + "' is a module; use something from it, like " + v.name + ".name(...)"); - // C's standard streams are macros on some systems; the runtime knows them everywhere - if (!cimports.globals.count(v.name) && (v.name == "stdin" || v.name == "stdout" || v.name == "stderr") && - cimports.fns.count("fprintf")) { - int which = v.name == "stdin" ? 0 : v.name == "stdout" ? 1 : 2; - return {b.CreateCall(rt("finch_std_stream"), {b.getInt32(which)}), FType::Ptr}; - } - } - Place pl = place(e); - return {b.CreateLoad(ty(pl.type), pl.addr, v.name), pl.type}; - } - case ExprKind::Member: - case ExprKind::Index: { - LRef r = ref(e); - if (!r.isPlace) return r.val; - return {b.CreateLoad(ty(r.pl.type), r.pl.addr), r.pl.type}; - } - case ExprKind::Unary: return unary(static_cast(e)); - case ExprKind::Binary: return binary(static_cast(e)); - case ExprKind::Call: return call(static_cast(e)); - case ExprKind::Method: return method(static_cast(e)); - case ExprKind::ArrayLit: return arrayLit(static_cast(e), nullptr); - case ExprKind::MapLit: return mapLit(static_cast(e), nullptr); - case ExprKind::Try: return tryExpr(static_cast(e)); - case ExprKind::OrElse: return orElse(static_cast(e)); - } - return {nullptr, FType::Void}; -} - -Value_ Codegen::unary(const UnaryExpr &u) { - Pos p = u.pos; - Value_ v = expr(*u.operand); - if (u.op == '!') return {b.CreateNot(coerce(v, FType::Bool, u.operand->pos, "the value after '!'").v), FType::Bool}; - if (u.op == '~') { - if (!v.type.isInt()) failAt(p.file, p.line, p.col, "'~' flips the bits of a whole number, not of " + v.type.show()); - return {b.CreateNot(v.v), v.type}; - } - if (v.type.isSigned()) return {b.CreateNeg(v.v), v.type, v.literal}; - if (v.type.isFloat()) return {b.CreateFNeg(v.v), v.type, v.literal}; - if (v.type.isUnsigned()) failAt(p.file, p.line, p.col, v.type.show() + " can't be negative (it's unsigned)"); - failAt(p.file, p.line, p.col, "can't put '-' in front of " + v.type.show()); -} - -// An address for `e` if it has one (a variable, field, element, p.value); otherwise its value. -LRef Codegen::ref(const Expr &e, bool forWrite) { - switch (e.kind) { - case ExprKind::Var: { - auto &v = static_cast(e); - if (Var *var = lookup(v.name)) { - note(e.pos, v.name.size(), "```finch\n" + var->type.show() + " " + v.name + "\n```", var->pos); - return {true, {var->slot, var->type}, {}}; - } - if (cimports.globals.count(v.name)) return {true, {cGlobal(v.name), resolve(cimports.globals.at(v.name).type, e.pos)}, {}}; - return {false, {}, expr(e)}; - } - case ExprKind::Member: return member(static_cast(e), forWrite); - case ExprKind::Index: return index(static_cast(e), forWrite); - default: return {false, {}, expr(e)}; - } -} - -Place Codegen::place(const Expr &e, bool forWrite) { - if (e.kind == ExprKind::Var) { - auto &v = static_cast(e); - if (!lookup(v.name) && !cimports.globals.count(v.name)) - failAt(e.pos.file, e.pos.line, e.pos.col, "there is no variable named '" + v.name + "'"); - } - LRef r = ref(e, forWrite); - if (!r.isPlace) failAt(e.pos.file, e.pos.line, e.pos.col, "this is a temporary value, it can't be changed or pointed to"); - return r.pl; -} - -LRef Codegen::member(const MemberExpr &m, bool forWrite) { - Pos p = m.pos; - if (m.obj->kind == ExprKind::Var) { - const std::string &mn = static_cast(*m.obj).name; - if (!lookup(mn) && modules[curModule].imports.count(mn)) - failAt(p.file, p.line, p.col, "modules only have functions and structs; call it: " + mn + "." + m.field + "(...)"); - } - LRef obj = ref(*m.obj, forWrite); - FType t = obj.isPlace ? obj.pl.type : obj.val.type; - - // pointers: p.value is the target, p.field reaches through to a struct's field - if (t.isPtr()) { - Value *pv = obj.isPlace ? b.CreateLoad(b.getPtrTy(), obj.pl.addr) : obj.val.v; - if (!t.elem) failAt(p.file, p.line, p.col, "this ptr has no type, so Finch doesn't know what's inside (use ptr[int] etc.)"); - if (!isa(pv) && !isa(pv)) - panicIf(b.CreateIsNull(pv), "used ." + m.field + " on a null pointer", p); - // p.value is the target -- unless the target is a struct with its own field called `value` - bool structHasValue = false; - if (t.elem->kind == FType::Struct) - for (auto &f : t.elem->info->fields) structHasValue |= f.name == "value" && !f.hidden; - if (m.field == "value" && !structHasValue) return {true, {pv, *t.elem}, {}}; - if (t.elem->kind != FType::Struct) - failAt(p.file, p.line, p.col, "a " + t.show() + " only has '.value' (the thing it points to)"); - obj = {true, {pv, *t.elem}, {}}; - t = *t.elem; - } - - if (t.kind == FType::Map) { - if (m.field != "len") failAt(p.file, p.line, p.col, "a map has .len (the number of keys), not '." + m.field + "'"); - if (forWrite) failAt(p.file, p.line, p.col, ".len can't be changed directly (use m[key] = ..., remove or clear)"); - note(Pos{p.line, p.col + 1, p.file}, 3, "`.len -> int`: the number of keys"); - Value *len; - if (obj.isPlace) { - len = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ty(t), obj.pl.addr, 1)); - } else { - len = b.CreateExtractValue(obj.val.v, 1); - release(obj.val); - } - return {false, {}, {len, FType::I64}}; - } - if (t.kind == FType::Array || t.kind == FType::Str || t.kind == FType::Fixed) { - if (m.field == "len" || m.field == "ptr") - note(Pos{p.line, p.col + 1, p.file}, m.field.size(), - m.field == "len" ? "`.len -> int`: the number of " + std::string(t.kind == FType::Str ? "bytes" : "elements") - : "`.ptr`: the address of the first element, for C"); - if (m.field != "len" && m.field != "ptr") - failAt(p.file, p.line, p.col, (t.kind == FType::Str ? "a str" : "an array") + std::string(" has .len and .ptr, not '.") + m.field + "'"); - if (forWrite) failAt(p.file, p.line, p.col, "." + m.field + " can't be changed directly" + (t.kind == FType::Array ? " (use resize, push or pop)" : "")); - if (t.kind == FType::Fixed) { - if (m.field == "len") return {false, {}, {b.getInt64(t.count), FType::I64}}; - if (!obj.isPlace) failAt(p.file, p.line, p.col, ".ptr of a temporary value would point to nothing"); - return {false, {}, {obj.pl.addr, FType::ptrTo(*t.elem)}}; - } - Value *v = obj.isPlace ? b.CreateLoad(ty(t), obj.pl.addr) : obj.val.v; - if (m.field == "len") { - Value *len = b.CreateExtractValue(v, 1); - if (!obj.isPlace) release(obj.val); - return {false, {}, {len, FType::I64}}; - } - // a literal lives as long as the program; other temporaries are freed right after this expression - if (!obj.isPlace && obj.val.fresh && !isa(obj.val.v)) - failAt(p.file, p.line, p.col, ".ptr of a temporary value would point to freed memory"); - FType pt = t.kind == FType::Str ? FType::ptrTo(FType::Char) : FType::ptrTo(*t.elem); - return {false, {}, {t.kind == FType::Str ? cstr(v) : b.CreateExtractValue(v, 0), pt}}; - } - - if (t.kind != FType::Struct) failAt(p.file, p.line, p.col, t.show() + " has no fields (no '." + m.field + "')"); - StructInfo *s = t.info; - int idx = -1; - for (size_t k = 0; k < s->fields.size(); k++) - if (s->fields[k].name == m.field && !s->fields[k].hidden) idx = (int)k; - if (idx < 0) { - std::string names; - for (auto &f : s->fields) - if (!f.hidden) names += (names.empty() ? "" : ", ") + f.name; - failAt(p.file, p.line, p.col, "the struct " + t.show() + " has no field '" + m.field + "' (it has: " + names + ")"); - } - const StructInfo::F &f = s->fields[idx]; - note(Pos{p.line, p.col + 1, p.file}, m.field.size(), - "```finch\n" + f.type.show() + " " + m.field + "\n```\nfield of `" + s->name + "`", f.pos); - unsigned llvmIdx = f.llvmIndex; - if (obj.isPlace) return {true, {b.CreateStructGEP(s->llvm, obj.pl.addr, llvmIdx), f.type}, {}}; - // a field of a temporary struct: take it (copying if it owns memory), then drop the rest - Value *fv = b.CreateExtractValue(obj.val.v, llvmIdx); - Value_ out{fv, f.type}; - if (owning(f.type) && obj.val.fresh) out = {copyValue(fv, f.type), f.type, false, true}; - release(obj.val); - return {false, {}, out}; -} - -LRef Codegen::index(const IndexExpr &e, bool forWrite) { - Pos p = e.pos; - LRef obj = ref(*e.obj, forWrite); - FType t = obj.isPlace ? obj.pl.type : obj.val.type; - Held held(*this); - if (!obj.isPlace) hold(obj.val); // while the index is computed - if (t.kind == FType::Map) return mapIndex(e, obj, t, forWrite); - Value *i = coerce(expr(*e.index), FType::I64, e.index->pos, "an index").v; - - if (t.isPtr()) { // C-style: p[i], no bounds known - if (!t.elem) failAt(p.file, p.line, p.col, "this ptr has no type, so Finch doesn't know what's inside (use ptr[int] etc.)"); - Value *pv = obj.isPlace ? b.CreateLoad(b.getPtrTy(), obj.pl.addr) : obj.val.v; - panicIf(b.CreateIsNull(pv), "used [] on a null pointer", p); - return {true, {b.CreateInBoundsGEP(ty(*t.elem), pv, i), *t.elem}, {}}; - } - if (t.kind == FType::Fixed) { - boundsCheck(i, b.getInt64(t.count), p); - if (obj.isPlace) return {true, {b.CreateInBoundsGEP(ty(t), obj.pl.addr, {b.getInt64(0), i}), *t.elem}, {}}; - Value *a = tmp(obj.val.v); - return {false, {}, {b.CreateLoad(ty(*t.elem), b.CreateInBoundsGEP(ty(t), a, {b.getInt64(0), i})), *t.elem}}; - } - if (t.kind != FType::Array && t.kind != FType::Str) - failAt(p.file, p.line, p.col, "[ ] works on arrays, maps, str and pointers, not on " + t.show()); - FType et = t.kind == FType::Str ? FType(FType::Char) : *t.elem; - if (t.kind == FType::Str && forWrite) { - if (!obj.isPlace) failAt(p.file, p.line, p.col, "this is a temporary str, it can't be changed"); - b.CreateCall(rt("finch_str_own"), {obj.pl.addr}); // literals live in read-only memory: copy first - } - Value *v = obj.isPlace ? b.CreateLoad(ty(t), obj.pl.addr) : obj.val.v; - Value *len = b.CreateExtractValue(v, 1); - boundsCheck(i, len, p); - Value *addr = b.CreateInBoundsGEP(ty(et), b.CreateExtractValue(v, 0), i); - if (obj.isPlace) return {true, {addr, et}, {}}; - Value *ev = b.CreateLoad(ty(et), addr); - Value_ out{ev, et}; - if (owning(et) && obj.val.fresh) out = {copyValue(ev, et), et, false, true}; - release(obj.val); - return {false, {}, out}; -} - -Value_ Codegen::arrayLit(const ArrayLitExpr &a, const FType *want) { - Pos p = a.pos; - FType et; - if (want && want->kind == FType::Array) { - et = *want->elem; - } else if (a.elems.empty()) { - failAt(p.file, p.line, p.col, "an empty [] needs a type, like: []int nums = []"); - } else { - // numbers written in the code: if any has a dot, they are all floats - bool allNum = true, anyFloat = false; - for (auto &x : a.elems) { - const Expr *y = x.get(); - if (y->kind == ExprKind::Unary && static_cast(y)->op == '-') y = static_cast(y)->operand.get(); - if (y->kind == ExprKind::Float) anyFloat = true; - else if (y->kind != ExprKind::Int) allNum = false; - } - et = FType::Void; - if (allNum && anyFloat) et = FType::F64; - } - std::vector vals; - Held held(*this); - for (size_t k = 0; k < a.elems.size(); k++) { - Value_ v = et.kind == FType::Void ? exprWant(*a.elems[k], et) : exprWant(*a.elems[k], et); - if (et.kind == FType::Void) { - if (v.type.kind == FType::Void || v.type.kind == FType::Null) - failAt(a.elems[k]->pos.file, a.elems[k]->pos.line, a.elems[k]->pos.col, "an array element needs a value with a type"); - et = v.type; - } - v = coerce(v, et, a.elems[k]->pos, "every element of this array"); - vals.push_back(own(v)); - hold({vals.back(), et, false, true}); - } - FType at = FType::arrayOf(et); - Value *n = b.getInt64(vals.size()); - Value *data = vals.empty() ? (Value *)ConstantPointerNull::get(b.getPtrTy()) - : b.CreateCall(rt("finch_alloc"), {b.CreateMul(n, elemSize(et))}); - for (size_t k = 0; k < vals.size(); k++) b.CreateStore(vals[k], b.CreateInBoundsGEP(ty(et), data, b.getInt64(k))); - Value *arr = UndefValue::get(ty(at)); - arr = b.CreateInsertValue(arr, data, 0); - arr = b.CreateInsertValue(arr, n, 1); - arr = b.CreateInsertValue(arr, n, 2); - return {arr, at, false, true}; -} - -// ---------- operators ---------- - -static const char *opName(BinOp op) { - switch (op) { - case BinOp::Add: return "+"; - case BinOp::Sub: return "-"; - case BinOp::Mul: return "*"; - case BinOp::Div: return "/"; - case BinOp::Mod: return "%"; - case BinOp::BitAnd: return "&"; - case BinOp::BitOr: return "|"; - case BinOp::BitXor: return "^"; - case BinOp::Shl: return "<<"; - case BinOp::Shr: return ">>"; - case BinOp::Eq: return "=="; - case BinOp::NotEq: return "!="; - case BinOp::Less: return "<"; - case BinOp::LessEq: return "<="; - case BinOp::Greater: return ">"; - case BinOp::GreaterEq: return ">="; - case BinOp::And: return "&&"; - case BinOp::Or: return "||"; - } - return "?"; -} - -void Codegen::badOperands(BinOp op, const Value_ &l, const Value_ &r, Pos p) { - std::string msg = std::string("can't use '") + opName(op) + "' on " + l.type.show() + - (l.type == r.type ? "" : " and " + r.type.show()); - if (l.type.isInt() && r.type.isInt() && l.type != r.type) msg += " (convert one side, like " + l.type.show() + "(...))"; - if (l.type.kind == FType::Bool && (op == BinOp::BitAnd || op == BinOp::BitOr)) - msg += std::string(" (for true/false use '") + (op == BinOp::BitAnd ? "&&" : "||") + "')"; - else if ((l.type.isFloat() || r.type.isFloat()) && op >= BinOp::BitAnd && op <= BinOp::Shr) - msg += " (bit operators work on whole numbers only)"; - else if (op == BinOp::Add && (l.type.kind == FType::Str || r.type.kind == FType::Str)) - msg += " (turn the other side into text first: str(...))"; - else if ((l.type.kind == FType::Struct || l.type.kind == FType::Array) && (op == BinOp::Eq || op == BinOp::NotEq)) - msg += " (compare the parts one by one)"; - failAt(p.file, p.line, p.col, msg); -} - -// Bring both sides to one type: a number literal adapts to the other side, -// otherwise the smaller type grows into the bigger one. -bool Codegen::unify(Value_ &l, Value_ &r) { - if (l.type == r.type) return true; - if (l.type.isInt() && r.type.isInt()) { - auto *lc = l.literal ? dyn_cast(l.v) : nullptr; - auto *rc = r.literal ? dyn_cast(r.v) : nullptr; - if (lc && !rc && fits(lc, l.type, r.type)) { l = {intCast(l.v, l.type, r.type), r.type, true}; return true; } - if (rc && !lc && fits(rc, r.type, l.type)) { r = {intCast(r.v, r.type, l.type), l.type, true}; return true; } - if (widens(l.type, r.type)) { l = {intCast(l.v, l.type, r.type), r.type}; return true; } - if (widens(r.type, l.type)) { r = {intCast(r.v, r.type, l.type), l.type}; return true; } - return false; - } - if (l.type.isInt() && r.type.isFloat()) { l = {intToFloat(l.v, l.type, r.type), r.type, l.literal}; return true; } - if (l.type.isFloat() && r.type.isInt()) { r = {intToFloat(r.v, r.type, l.type), l.type, r.literal}; return true; } - if (l.type.isFloat() && r.type.isFloat()) { - if (l.type.kind == FType::F32) l = {b.CreateFPExt(l.v, b.getDoubleTy()), FType::F64}; - if (r.type.kind == FType::F32) r = {b.CreateFPExt(r.v, b.getDoubleTy()), FType::F64}; - return true; - } - return false; -} - -Value_ Codegen::arith(BinOp op, Value_ l, Value_ r, Pos p) { - Value_ v = arithOp(op, l, r, p); - v.literal = l.literal && r.literal && isa(v.v); - return v; -} - -Value_ Codegen::arithOp(BinOp op, Value_ l, Value_ r, Pos p) { - if (op == BinOp::Add && l.type.kind == FType::Str && r.type.kind == FType::Str) { - Value *out = tmp(Constant::getNullValue(ty(FType::Str))); - b.CreateCall(rt("finch_str_concat"), {out, tmp(l.v), tmp(r.v)}); - release(l); - release(r); - return {b.CreateLoad(ty(FType::Str), out), FType::Str, false, true}; - } - if (!unify(l, r)) badOperands(op, l, r, p); - if (l.type.isInt()) { - bool s = l.type.isSigned(); - switch (op) { - case BinOp::Add: return {b.CreateAdd(l.v, r.v), l.type}; - case BinOp::Sub: return {b.CreateSub(l.v, r.v), l.type}; - case BinOp::Mul: return {b.CreateMul(l.v, r.v), l.type}; - case BinOp::Div: - checkDivisor(l, r, p); - return {s ? b.CreateSDiv(l.v, r.v) : b.CreateUDiv(l.v, r.v), l.type}; - case BinOp::Mod: - checkDivisor(l, r, p); - return {s ? b.CreateSRem(l.v, r.v) : b.CreateURem(l.v, r.v), l.type}; - case BinOp::BitAnd: return {b.CreateAnd(l.v, r.v), l.type}; - case BinOp::BitOr: return {b.CreateOr(l.v, r.v), l.type}; - case BinOp::BitXor: return {b.CreateXor(l.v, r.v), l.type}; - case BinOp::Shl: return {b.CreateShl(l.v, r.v), l.type}; - case BinOp::Shr: return {s ? b.CreateAShr(l.v, r.v) : b.CreateLShr(l.v, r.v), l.type}; - default: break; - } - } - if (l.type.isFloat()) { - switch (op) { - case BinOp::Add: return {b.CreateFAdd(l.v, r.v), l.type}; - case BinOp::Sub: return {b.CreateFSub(l.v, r.v), l.type}; - case BinOp::Mul: return {b.CreateFMul(l.v, r.v), l.type}; - case BinOp::Div: return {b.CreateFDiv(l.v, r.v), l.type}; - case BinOp::Mod: return {b.CreateFRem(l.v, r.v), l.type}; - default: break; - } - } - badOperands(op, l, r, p); -} - -Value_ Codegen::compare(BinOp op, Value_ l, Value_ r, Pos p) { - bool equality = op == BinOp::Eq || op == BinOp::NotEq; - auto ptrLike = [](const FType &t) { return t.isPtr() || t.kind == FType::Null; }; - - if (ptrLike(l.type) || ptrLike(r.type)) { // pointers compare addresses - if (!equality || !ptrLike(l.type) || !ptrLike(r.type)) { - if (l.type.kind == FType::Str || r.type.kind == FType::Str) - failAt(p.file, p.line, p.col, "a str is never null; to check for empty text use s.len == 0"); - badOperands(op, l, r, p); - } - return {op == BinOp::Eq ? b.CreateICmpEQ(l.v, r.v) : b.CreateICmpNE(l.v, r.v), FType::Bool}; - } - - if (l.type.kind == FType::Str && r.type.kind == FType::Str) { - Value *res; - if (equality) { - Value *eq = b.CreateCall(rt("finch_str_eq"), {tmp(l.v), tmp(r.v)}); - res = op == BinOp::Eq ? b.CreateICmpNE(eq, b.getInt32(0)) : b.CreateICmpEQ(eq, b.getInt32(0)); - } else { - Value *c = b.CreateCall(rt("finch_str_cmp"), {tmp(l.v), tmp(r.v)}); - CmpInst::Predicate pr = op == BinOp::Less ? CmpInst::ICMP_SLT : op == BinOp::LessEq ? CmpInst::ICMP_SLE - : op == BinOp::Greater ? CmpInst::ICMP_SGT : CmpInst::ICMP_SGE; - res = b.CreateICmp(pr, c, b.getInt64(0)); - } - release(l); - release(r); - return {res, FType::Bool}; - } - - if (!unify(l, r)) badOperands(op, l, r, p); - if (l.type.isFloat()) { - CmpInst::Predicate pr; - switch (op) { - case BinOp::Eq: pr = CmpInst::FCMP_OEQ; break; - case BinOp::NotEq: pr = CmpInst::FCMP_UNE; break; - case BinOp::Less: pr = CmpInst::FCMP_OLT; break; - case BinOp::LessEq: pr = CmpInst::FCMP_OLE; break; - case BinOp::Greater: pr = CmpInst::FCMP_OGT; break; - default: pr = CmpInst::FCMP_OGE; break; - } - return {b.CreateFCmp(pr, l.v, r.v), FType::Bool}; - } - if (!l.type.isInt() && l.type.kind != FType::Char && l.type.kind != FType::Bool) badOperands(op, l, r, p); - if (l.type.kind == FType::Bool && !equality) badOperands(op, l, r, p); - bool s = l.type.isSigned(); - CmpInst::Predicate pr; - switch (op) { - case BinOp::Eq: pr = CmpInst::ICMP_EQ; break; - case BinOp::NotEq: pr = CmpInst::ICMP_NE; break; - case BinOp::Less: pr = s ? CmpInst::ICMP_SLT : CmpInst::ICMP_ULT; break; - case BinOp::LessEq: pr = s ? CmpInst::ICMP_SLE : CmpInst::ICMP_ULE; break; - case BinOp::Greater: pr = s ? CmpInst::ICMP_SGT : CmpInst::ICMP_UGT; break; - default: pr = s ? CmpInst::ICMP_SGE : CmpInst::ICMP_UGE; break; - } - return {b.CreateICmp(pr, l.v, r.v), FType::Bool}; -} - -// && and || only evaluate the right side when needed. -Value_ Codegen::logic(const BinaryExpr &e) { - bool isAnd = e.op == BinOp::And; - Value *l = condition(*e.lhs); - BasicBlock *from = b.GetInsertBlock(); - BasicBlock *rhsBB = newBlock(isAnd ? "and.rhs" : "or.rhs"); - BasicBlock *end = newBlock(isAnd ? "and.end" : "or.end"); - if (isAnd) b.CreateCondBr(l, rhsBB, end); - else b.CreateCondBr(l, end, rhsBB); - - b.SetInsertPoint(rhsBB); - Value *r = condition(*e.rhs); - BasicBlock *rhsEnd = b.GetInsertBlock(); - b.CreateBr(end); - - b.SetInsertPoint(end); - PHINode *phi = b.CreatePHI(b.getInt1Ty(), 2); - phi->addIncoming(b.getInt1(!isAnd), from); - phi->addIncoming(r, rhsEnd); - return {phi, FType::Bool}; -} - -Value_ Codegen::binary(const BinaryExpr &e) { - switch (e.op) { - case BinOp::And: - case BinOp::Or: return logic(e); - case BinOp::Eq: - case BinOp::NotEq: - case BinOp::Less: - case BinOp::LessEq: - case BinOp::Greater: - case BinOp::GreaterEq: { - Value_ l = expr(*e.lhs); - Held held(*this); - hold(l); - Value_ r = expr(*e.rhs); - return compare(e.op, l, r, e.pos); - } - default: { - Value_ l = expr(*e.lhs); - Held held(*this); - hold(l); - Value_ r = expr(*e.rhs); - return arith(e.op, l, r, e.pos); - } - } -} - -// ---------- language server index ---------- - -void Codegen::note(Pos at, size_t len, const std::string &hover, Pos def) { - if (!g_index || at.line <= 0) return; - SymRef r{at.file, at.line, at.col, (int)len, hover}; - if (def.line > 0) { - r.defFile = def.file; - r.defLine = def.line; - r.defCol = def.col; - } - g_index->refs.push_back(r); -} - -std::string Codegen::signature(const Fn &fn) { - std::string owner = fn.recv ? fn.recv->name + "." : fn.module.empty() ? "" : fn.module + "."; - std::string s = "fn " + owner + fn.decl->name + "("; - for (size_t i = 0; i < fn.params.size(); i++) s += (i ? ", " : "") + fn.params[i].show() + " " + fn.decl->params[i].name; - s += ")"; - if (fn.ret.kind != FType::Void) s += " -> " + fn.ret.show() + (fn.fallible ? "!" : ""); - else if (fn.fallible) s += " -> !"; - return s; -} - -std::string Codegen::structHover(StructInfo *s) { - std::string h = "```finch\nstruct " + s->name + " {\n"; - for (auto &f : s->fields) h += " " + f.type.show() + " " + f.name + "\n"; - return h + "}\n```" + (s->isC ? "\nfrom C" : ""); -} - -// ---------- debug info ---------- - -void Codegen::setLoc(Pos p) { - if (!di || !diFn) return; - b.SetCurrentDebugLocation(DILocation::get(ctx, p.line, p.col, diFn)); -} - -} // namespace finch - -std::unique_ptr generate(const std::vector &progs, const CImports &c, llvm::LLVMContext &ctx, - llvm::TargetMachine &tm, bool debug) { - return finch::Codegen(ctx, progs, c, tm, debug).run(); -} diff --git a/src/codegen.h b/src/codegen.h deleted file mode 100644 index 095abb6..0000000 --- a/src/codegen.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "ast.h" -#include "cimport.h" - -#include -#include -#include - -#include - -// All files of the program (the main file first, then its modules) become one LLVM module. -// `tm` describes the machine we compile for (sizes, alignment), which shapes the IR. -std::unique_ptr generate(const std::vector &progs, const CImports &c, llvm::LLVMContext &ctx, - llvm::TargetMachine &tm, bool debug); diff --git a/src/codegen_builtins.cpp b/src/codegen_builtins.cpp deleted file mode 100644 index 649a22b..0000000 --- a/src/codegen_builtins.cpp +++ /dev/null @@ -1,905 +0,0 @@ -// Code generation, part 3: calls, built-in functions, conversions and methods. - -#include "codegen_impl.h" -#include "builtins_doc.h" - -using namespace llvm; - -namespace finch { - -bool Codegen::isBuiltin(const std::string &n) { - static const std::set names = {"print", "addr", "input", "new", "free", "read_file", "write_file", - "file_exists", "delete_file", "exit", "shell", "error"}; - FType t; - return names.count(n) || typeFromName(n, t); -} - -// Help people who forgot an import. -std::string Codegen::headerHint(const std::string &name) { - static const std::unordered_map known = { - {"printf", "stdio.h"}, {"puts", "stdio.h"}, {"putchar", "stdio.h"}, {"scanf", "stdio.h"}, - {"fopen", "stdio.h"}, {"getchar", "stdio.h"}, {"sqrt", "math.h"}, {"pow", "math.h"}, - {"sin", "math.h"}, {"cos", "math.h"}, {"floor", "math.h"}, {"fabs", "math.h"}, - {"malloc", "stdlib.h"}, {"rand", "stdlib.h"}, {"srand", "stdlib.h"}, {"abs", "stdlib.h"}, - {"atoi", "stdlib.h"}, {"strlen", "string.h"}, {"strcpy", "string.h"}, {"memcpy", "string.h"}, - {"time", "time.h"}, {"sleep", "unistd.h"}, {"usleep", "unistd.h"}, - }; - auto it = known.find(name); - return it == known.end() ? "" : std::string(" (it's from C: add import \"") + it->second + "\" at the top)"; -} - -void Codegen::checkArgs(const std::vector &args, const std::vector &names, size_t want, Pos p, - const std::string &name, bool variadic) { - for (size_t i = 0; i < names.size(); i++) - if (!names[i].empty()) - failAt(args[i]->pos.file, args[i]->pos.line, args[i]->pos.col, "named arguments (" + names[i] + ": ...) are only for creating structs"); - if (args.size() == want || (variadic && args.size() > want)) return; - failAt(p.file, p.line, p.col, "'" + name + "' takes " + (variadic ? "at least " : "") + std::to_string(want) + - " argument(s), but got " + std::to_string(args.size())); -} - -Function *Codegen::libc(const char *name, llvm::Type *ret, std::vector params, bool vararg) { - FunctionCallee c = mod->getOrInsertFunction(name, FunctionType::get(ret, params, vararg)); - return cast(c.getCallee()); -} - -// The runtime (runtime/finch_rt.c), declared on first use. -Function *Codegen::rt(const std::string &name) { - if (Function *f = mod->getFunction(name)) return f; - llvm::Type *P = b.getPtrTy(), *I = b.getInt64Ty(), *I32 = b.getInt32Ty(), *D = b.getDoubleTy(), *V = b.getVoidTy(); - struct Sig { llvm::Type *ret; std::vector params; }; - std::map sigs = { - {"finch_panic", {V, {P, I, P}}}, - {"finch_panic_index", {V, {P, I, I, I}}}, - {"finch_alloc", {P, {I}}}, - {"finch_zalloc", {P, {I}}}, - {"finch_str_copy", {V, {P, P}}}, - {"finch_str_own", {V, {P}}}, - {"finch_str_drop", {V, {P}}}, - {"finch_str_from_c", {V, {P, P}}}, - {"finch_str_concat", {V, {P, P, P}}}, - {"finch_str_eq", {I32, {P, P}}}, - {"finch_str_cmp", {I, {P, P}}}, - {"finch_str_from_int", {V, {P, I}}}, - {"finch_str_from_uint", {V, {P, I}}}, - {"finch_str_from_float", {V, {P, D}}}, - {"finch_str_from_char", {V, {P, b.getInt8Ty()}}}, - {"finch_str_from_bool", {V, {P, I32}}}, - {"finch_str_to_int", {I, {P, P, I}}}, - {"finch_str_to_float", {D, {P, P, I}}}, - {"finch_str_sub", {V, {P, P, I, I, P, I}}}, - {"finch_str_find", {I, {P, P}}}, - {"finch_str_starts", {I32, {P, P}}}, - {"finch_str_ends", {I32, {P, P}}}, - {"finch_str_trim", {V, {P, P}}}, - {"finch_str_upper", {V, {P, P}}}, - {"finch_str_lower", {V, {P, P}}}, - {"finch_str_replace", {V, {P, P, P, P}}}, - {"finch_str_split", {V, {P, P, P}}}, - {"finch_str_join", {V, {P, P, P}}}, - {"finch_str_repeat", {V, {P, P, I}}}, - {"finch_str_from_bytes", {V, {P, P}}}, - {"finch_arr_reserve", {V, {P, I, I}}}, - {"finch_arr_make", {V, {P, I, I}}}, - {"finch_arr_resize", {V, {P, I, I}}}, - {"finch_arr_clone_raw", {V, {P, P, I}}}, - {"finch_arr_free", {V, {P}}}, - {"finch_arr_insert_gap", {V, {P, I, I, P, I}}}, - {"finch_arr_remove_gap", {V, {P, I, I}}}, - {"finch_bytes_from_str", {V, {P, P}}}, - {"finch_args", {V, {P, I32, P}}}, - {"finch_input", {V, {P, P}}}, - {"finch_file_exists", {I32, {P}}}, - {"finch_read_file", {V, {P, P, P, I}}}, - {"finch_write_file", {I32, {P, P}}}, - {"finch_shell", {I, {P}}}, - {"finch_delete_file", {I32, {P}}}, - {"finch_std_stream", {P, {I32}}}, - {"finch_str_try_int", {I32, {P, P, P}}}, - {"finch_str_try_float", {I32, {P, P, P}}}, - {"finch_try_read_file", {I32, {P, P, P}}}, - {"finch_try_write_file", {I32, {P, P, P}}}, - {"finch_try_delete_file", {I32, {P, P}}}, - {"finch_report_error", {V, {P}}}, - {"finch_map_find", {I, {P, P, I, I, I32}}}, - {"finch_map_slot", {I, {P, P, I, I, I32, P}}}, - {"finch_map_remove_at", {V, {P, I, I}}}, - {"finch_map_clear", {V, {P}}}, - {"finch_map_free", {V, {P}}}, - {"finch_map_clone_raw", {V, {P, P, I}}}, - {"finch_map_missing", {V, {P, I, P}}}, - {"finch_map_changed", {V, {P, I}}}, - {"finch_buf_add", {V, {P, P, I}}}, - {"finch_buf_int", {V, {P, I}}}, - {"finch_buf_uint", {V, {P, I}}}, - {"finch_buf_float", {V, {P, D}}}, - {"finch_buf_bool", {V, {P, I32}}}, - {"finch_buf_ptr", {V, {P, P}}}, - {"finch_buf_char", {V, {P, b.getInt8Ty(), I32}}}, - {"finch_buf_str", {V, {P, P, I32}}}, - {"finch_buf_print", {V, {P}}}, - }; - auto it = sigs.find(name); - if (it == sigs.end()) { - std::fprintf(stderr, "internal compiler error: unknown runtime function %s\n", name.c_str()); - std::exit(2); - } - Function *f = Function::Create(FunctionType::get(it->second.ret, it->second.params, false), Function::ExternalLinkage, - name, mod.get()); - if (name == "finch_panic" || name == "finch_panic_index" || name == "finch_map_missing" || name == "finch_map_changed") { - f->addFnAttr(Attribute::NoReturn); - f->addFnAttr(Attribute::Cold); - } - if (name == "finch_str_from_char" || name == "finch_buf_char") f->addParamAttr(1, Attribute::SExt); - return f; -} - -// ---------- runtime errors ---------- - -Value *Codegen::fileName(Pos p) { - std::string key = "file." + std::to_string(p.file); - if (GlobalVariable *g = mod->getNamedGlobal("finch." + key)) return g; - GlobalVariable *g = b.CreateGlobalString(g_files[p.file].path, "finch." + key); - return g; -} - -void Codegen::panicIf(Value *cond, const std::string &msg, Pos p) { - BasicBlock *bad = newBlock("panic"); - BasicBlock *ok = newBlock("ok"); - b.CreateCondBr(cond, bad, ok); - b.SetInsertPoint(bad); - b.CreateCall(rt("finch_panic"), {fileName(p), b.getInt64(p.line), b.CreateGlobalString(msg, "panic.msg")}); - b.CreateUnreachable(); - b.SetInsertPoint(ok); -} - -void Codegen::boundsCheck(Value *i, Value *len, Pos p) { - BasicBlock *bad = newBlock("out.of.range"); - BasicBlock *ok = newBlock("in.range"); - b.CreateCondBr(b.CreateICmpUGE(i, len), bad, ok); // unsigned: catches negative indexes too - b.SetInsertPoint(bad); - b.CreateCall(rt("finch_panic_index"), {fileName(p), b.getInt64(p.line), i, len}); - b.CreateUnreachable(); - b.SetInsertPoint(ok); -} - -// Dividing by zero is undefined in C; in Finch it is a clear error. -void Codegen::checkDivisor(const Value_ &l, const Value_ &r, Pos p) { - auto *c = dyn_cast(r.v); - if (c && c->isZero()) failAt(p.file, p.line, p.col, "division by zero"); - if (!c) panicIf(b.CreateICmpEQ(r.v, ConstantInt::get(r.v->getType(), 0)), "division by zero", p); - // the smallest signed number divided by -1 doesn't fit anywhere - if (l.type.isSigned() && (!c || c->isMinusOne())) { - Value *min = ConstantInt::get(l.v->getType(), APInt::getSignedMinValue(l.type.bits())); - Value *minusOne = ConstantInt::get(r.v->getType(), -1, true); - panicIf(b.CreateAnd(b.CreateICmpEQ(l.v, min), b.CreateICmpEQ(r.v, minusOne)), - "division overflows (the smallest number divided by -1)", p); - } -} - -Value *Codegen::cGlobal(const std::string &name) { - if (GlobalVariable *gv = mod->getNamedGlobal(name)) return gv; - FType t = resolve(cimports.globals.at(name).type, Pos{}); - return new GlobalVariable(*mod, ty(t), false, GlobalValue::ExternalLinkage, nullptr, name); -} - -// ---------- calls ---------- - -static std::string docHover(const BuiltinDoc &d) { - return "```finch\n" + std::string(d.signature) + "\n```\n" + d.doc; -} - -static std::string cSignature(const CFunc &f) { - std::string s = f.ret.show() + " " + f.name + "("; - for (size_t i = 0; i < f.params.size(); i++) s += (i ? ", " : "") + f.params[i].show(); - if (f.variadic) s += f.params.empty() ? "..." : ", ..."; - return s + ")"; -} - -Value_ Codegen::call(const CallExpr &c) { - const std::string &n = c.callee; - Pos p = c.pos; - if (g_index) - for (const BuiltinDoc &d : kBuiltins) - if (n == d.name) note(p, n.size(), docHover(d)); - auto one = [&](const char *what) -> const Expr & { - checkArgs(c.args, c.argNames, 1, p, n); - (void)what; - return *c.args[0]; - }; - - bool canFail = &c == fallibleTarget; // inside `... or ...` / `try ...`: report failures instead of stopping - // a failure: set the flag and message that `or` / `try` look at - auto failedIf = [&](Value *ok, Value *errSlot) { - fallibleFailed = b.CreateICmpEQ(ok, b.getInt32(0)); - fallibleMsg = b.CreateLoad(ty(FType::Str), errSlot); - }; - if (n == "error") - failAt(p.file, p.line, p.col, "error(...) makes an error to return from a function that can fail: return error(\"...\")"); - if (n == "print") { - checkArgs(c.args, c.argNames, 0, p, n, true); - return print(c.args, p); - } - if (n == "addr") { - checkArgs(c.args, c.argNames, 1, p, n); - return addrOf(c.args, p); - } - if (n == "input") { - if (c.args.size() > 1) checkArgs(c.args, c.argNames, 1, p, n); - Value_ prompt = c.args.empty() ? Value_{strConst(""), FType::Str, false, true} - : coerce(expr(*c.args[0]), FType::Str, c.args[0]->pos, "the question"); - Value *out = tmpOf(ty(FType::Str)); - b.CreateCall(rt("finch_input"), {out, tmp(prompt.v)}); - release(prompt); - return {b.CreateLoad(ty(FType::Str), out), FType::Str, false, true}; - } - if (n == "new") { - const Expr &a = one("value"); - Value_ v = expr(a); - if (v.type.kind == FType::Void || v.type.kind == FType::Null) - failAt(a.pos.file, a.pos.line, a.pos.col, "new(...) needs a value to put in memory, like new(Point(x: 1, y: 2))"); - Value *mem = b.CreateCall(rt("finch_alloc"), {elemSize(v.type)}); - b.CreateStore(own(v), mem); - return {mem, FType::ptrTo(v.type)}; - } - if (n == "free") { - const Expr &a = one("pointer"); - Value_ v = expr(a); - if (!v.type.isPtr()) - failAt(a.pos.file, a.pos.line, a.pos.col, "free(...) is only for pointers from new(...) or C; arrays, str and structs are freed by Finch at the end of their block"); - if (v.type.elem && owning(*v.type.elem)) { - BasicBlock *drop = newBlock("free.drop"), *done = newBlock("free.done"); - b.CreateCondBr(b.CreateIsNull(v.v), done, drop); - b.SetInsertPoint(drop); - dropAt(v.v, *v.type.elem); - b.CreateBr(done); - b.SetInsertPoint(done); - } - b.CreateCall(libc("free", b.getVoidTy(), {b.getPtrTy()}), {v.v}); - return {nullptr, FType::Void}; - } - if (n == "exit") { - Value *code = coerce(expr(one("code")), FType::I32, c.args[0]->pos, "the exit code").v; - b.CreateCall(libc("fflush", b.getInt32Ty(), {b.getPtrTy()}), {ConstantPointerNull::get(b.getPtrTy())}); - b.CreateCall(libc("exit", b.getVoidTy(), {b.getInt32Ty()}), {code}); - return {nullptr, FType::Void}; - } - if (n == "delete_file") { - Value_ path = coerce(expr(one("path")), FType::Str, c.args[0]->pos, "the file name"); - Value *ss = tmpOf(ty(FType::Str)); - b.CreateCall(rt("finch_str_copy"), {ss, tmp(path.v)}); // NUL-terminated copy - if (canFail) { - Value *err = tmp(zero(FType::Str)); - failedIf(b.CreateCall(rt("finch_try_delete_file"), {ss, err}), err); - dropAt(ss, FType::Str); - release(path); - return {nullptr, FType::Void}; - } - Value *r = b.CreateCall(rt("finch_delete_file"), {ss}); - dropAt(ss, FType::Str); - release(path); - return {b.CreateICmpNE(r, b.getInt32(0)), FType::Bool}; - } - if (n == "read_file" || n == "file_exists") { - Value_ path = coerce(expr(one("path")), FType::Str, c.args[0]->pos, "the file name"); - Value *pp = tmp(path.v); - Value_ res; - if (n == "file_exists") { - res = {b.CreateICmpNE(b.CreateCall(rt("finch_file_exists"), {pp}), b.getInt32(0)), FType::Bool}; - } else if (canFail) { - Value *out = tmp(zero(FType::Str)), *err = tmp(zero(FType::Str)); - failedIf(b.CreateCall(rt("finch_try_read_file"), {out, pp, err}), err); - res = {b.CreateLoad(ty(FType::Str), out), FType::Str, false, true}; - } else { - Value *out = tmpOf(ty(FType::Str)); - b.CreateCall(rt("finch_read_file"), {out, pp, fileName(p), b.getInt64(p.line)}); - res = {b.CreateLoad(ty(FType::Str), out), FType::Str, false, true}; - } - release(path); - return res; - } - if (n == "shell") { - Value_ cmd = coerce(expr(one("command")), FType::Str, c.args[0]->pos, "the command"); - Value *ss = tmpOf(ty(FType::Str)); - b.CreateCall(rt("finch_str_copy"), {ss, tmp(cmd.v)}); // a heap copy is always NUL-terminated - Value *r = b.CreateCall(rt("finch_shell"), {ss}); - dropAt(ss, FType::Str); - release(cmd); - return {r, FType::I64}; - } - if (n == "write_file") { - checkArgs(c.args, c.argNames, 2, p, n); - Value_ path = coerce(expr(*c.args[0]), FType::Str, c.args[0]->pos, "the file name"); - Held held(*this); - hold(path); - Value_ text = coerce(expr(*c.args[1]), FType::Str, c.args[1]->pos, "the text"); - if (canFail) { - Value *err = tmp(zero(FType::Str)); - failedIf(b.CreateCall(rt("finch_try_write_file"), {tmp(path.v), tmp(text.v), err}), err); - release(path); - release(text); - return {nullptr, FType::Void}; - } - Value *ok = b.CreateCall(rt("finch_write_file"), {tmp(path.v), tmp(text.v)}); - release(path); - release(text); - return {b.CreateICmpNE(ok, b.getInt32(0)), FType::Bool}; - } - FType target; - if (typeFromName(n, target)) { - checkArgs(c.args, c.argNames, 1, p, n); - return convert(target, c.args, p, n, canFail); - } - - ModuleScope &m = modules[curModule]; - if (auto it = m.fns.find(n); it != m.fns.end()) { - note(p, n.size(), "```finch\n" + signature(it->second) + "\n```", it->second.decl->namePos); - return callFinch(it->second, c.args, c.argNames, p, n, &c); - } - if (StructInfo *s = findStruct("", n, false)) { - note(p, n.size(), structHover(s), s->decl ? s->decl->namePos : Pos{}); - return construct(s, c.args, c.argNames, p); - } - if (auto cf = cimports.fns.find(n); cf != cimports.fns.end()) { - note(p, n.size(), "C function from `" + cf->second.header + "`\n```c\n" + cSignature(cf->second) + "\n```"); - checkArgs(c.args, c.argNames, cf->second.params.size(), p, n, cf->second.variadic); - return callC(cf->second, c.args, p); - } - if (lookup(n)) failAt(p.file, p.line, p.col, "'" + n + "' is a variable, not a function"); - for (auto &[mname, ms] : modules) - if (ms.fns.count(n) && mname != curModule && !mname.empty()) - failAt(p.file, p.line, p.col, "there is no function named '" + n + "' here; it is in the module " + mname + - " (write " + mname + "." + n + "(...)" + (m.imports.count(mname) ? "" : " and add: import " + mname) + ")"); - failAt(p.file, p.line, p.col, "there is no function named '" + n + "'" + headerHint(n)); -} - -Value_ Codegen::callFinch(const Fn &fn, const std::vector &args, const std::vector &names, Pos p, - const std::string &shown, const Expr *site, Value *self, const std::string &selfRoot) { - const FnDecl &d = *fn.decl; - if (fn.module.empty() && d.name == "main" && !fn.recv) failAt(p.file, p.line, p.col, "main can't be called, it is where the program starts"); - if (fn.fallible && site != fallibleTarget) - failAt(p.file, p.line, p.col, "'" + shown + "' can fail, so say what happens then: " + shown + "(...) or , " + shown + - "(...) or { ... }, or try " + shown + "(...)"); - checkArgs(args, names, fn.params.size(), p, shown); - std::vector vals; - std::vector fresh; - Held held(*this); - if (self) vals.push_back(self); - for (size_t i = 0; i < args.size(); i++) { - Value_ v = coerce(exprWant(*args[i], fn.params[i]), fn.params[i], args[i]->pos, "argument '" + d.params[i].name + "'"); - // a method that changes self gets its own copy of anything that lives inside self (p.add(p.items)) - if (fn.mutatesSelf && !selfRoot.empty() && owning(v.type) && !v.fresh && rootVar(*args[i]) == selfRoot) - v = {copyValue(v.v, v.type), v.type, false, true}; - vals.push_back(v.v); // owning values are lent: the function never drops them - if (v.fresh) fresh.push_back(v); - hold(v); - } - setLoc(p); - Value *r = b.CreateCall(fn.llvm, vals); - for (auto &v : fresh) release(v); - if (fn.fallible) { - fallibleFailed = b.CreateNot(b.CreateExtractValue(r, 0)); - fallibleMsg = b.CreateExtractValue(r, 2); - if (fn.ret.kind == FType::Void) return {nullptr, FType::Void}; - return {b.CreateExtractValue(r, 1), fn.ret, false, owning(fn.ret)}; - } - if (fn.ret.kind == FType::Void) return {nullptr, FType::Void}; - return {r, fn.ret, false, owning(fn.ret)}; -} - -Value_ Codegen::construct(StructInfo *s, const std::vector &args, const std::vector &names, Pos p) { - resolveStruct(s); - FType t(FType::Struct); - t.info = s; - t.name = s->name; - t.module = s->module == "C" ? "" : s->module; - std::vector fields; - for (auto &f : s->fields) fields.push_back(&f); - - bool named = !names.empty() && !names[0].empty(); - std::vector given(fields.size(), nullptr); - for (size_t i = 0; i < args.size(); i++) { - Pos ap = args[i]->pos; - if (names[i].empty() == named) - failAt(ap.file, ap.line, ap.col, "give either all fields by name (x: 1, y: 2) or none (1, 2), not a mix"); - if (!named) { - if (args.size() != fields.size()) - failAt(p.file, p.line, p.col, s->name + " has " + std::to_string(fields.size()) + " fields, but got " + - std::to_string(args.size()) + " values (or name them: " + s->name + "(field: value))"); - given[i] = args[i].get(); - continue; - } - size_t k = 0; - while (k < fields.size() && fields[k]->name != names[i]) k++; - if (k == fields.size()) failAt(ap.file, ap.line, ap.col, s->name + " has no field '" + names[i] + "'"); - if (given[k]) failAt(ap.file, ap.line, ap.col, "the field '" + names[i] + "' is given twice"); - given[k] = args[i].get(); - } - - Value *v = zero(t); - Held held(*this); - for (size_t k = 0; k < fields.size(); k++) { - const StructInfo::F &f = *fields[k]; - Value_ fv; - if (given[k]) { - fv = coerce(exprWant(*given[k], f.type), f.type, given[k]->pos, "the field '" + f.name + "'"); - } else if (f.init) { - // a default value is evaluated where the struct is defined, without the caller's variables - std::vector saved; - std::swap(saved, scopes); - scopes.reserve(256); - pushScope(); - std::string savedModule = curModule; - curModule = s->module; - fv = coerce(exprWant(*f.init, f.type), f.type, f.init->pos, "the default of '" + f.name + "'"); - curModule = savedModule; - scopes.pop_back(); - std::swap(saved, scopes); - } else { - continue; // zero - } - Value *fo = own(fv); - hold({fo, f.type, false, true}); - v = b.CreateInsertValue(v, fo, f.llvmIndex); - } - return {v, t, false, owning(t)}; -} - -Value_ Codegen::callC(const CFunc &f, const std::vector &args, Pos p) { - if (!f.unsupported.empty()) - failAt(p.file, p.line, p.col, "the C function '" + f.name + "' can't be used from Finch yet: it " + f.unsupported); - std::vector vals; - Held held(*this); - for (size_t i = 0; i < args.size(); i++) { - if (!vals.empty()) hold(vals.back()); - if (i < f.params.size()) { - FType pt = resolve(f.params[i], p); - vals.push_back(coerce(exprWant(*args[i], pt), pt, args[i]->pos, "argument " + std::to_string(i + 1) + " of " + f.name)); - } else { - Value_ v = expr(*args[i]); - if (v.type.kind == FType::Void) failAt(args[i]->pos.file, args[i]->pos.line, args[i]->pos.col, "this gives back nothing"); - if (v.type.kind == FType::Struct || v.type.kind == FType::Array) - failAt(args[i]->pos.file, args[i]->pos.line, args[i]->pos.col, "structs and arrays can't be passed to the '...' part of a C function"); - vals.push_back(v); - } - } - setLoc(p); - Value_ r = emitCCall(f, declareC(f), vals, p); - for (auto &v : vals) release(v); - return r; -} - -// ---------- built-ins ---------- - -// print(a, b, c) prints the values separated by spaces, then a newline. -Value_ Codegen::print(const std::vector &args, Pos) { - for (size_t i = 0; i < args.size(); i++) { - Value_ v = expr(*args[i]); - if (v.type.kind == FType::Void) - failAt(args[i]->pos.file, args[i]->pos.line, args[i]->pos.col, "this gives back nothing, so there is nothing to print"); - if (i) printf_(" ", {}); - emitPrint(v.v, v.type, false); - release(v); - } - printf_("\n", {}); - return {nullptr, FType::Void}; -} - -// addr(x) gives a pointer to x; addr(function) gives a C-callable function pointer. -Value_ Codegen::addrOf(const std::vector &args, Pos p) { - const Expr &e = *args[0]; - if (e.kind == ExprKind::Var) { - const std::string &n = static_cast(e).name; - Var *v = lookup(n); - if (!v) { - auto &fns = modules[curModule].fns; - if (auto it = fns.find(n); it != fns.end()) return {cThunk(it->second, p), FType::Ptr}; - } - if (v && v->readonly) failAt(e.pos.file, e.pos.line, e.pos.col, "can't take the address of a loop variable"); - } - if (e.kind != ExprKind::Var && e.kind != ExprKind::Member && e.kind != ExprKind::Index) - failAt(e.pos.file, e.pos.line, e.pos.col, "addr(...) needs a variable, a field or an element, like addr(x)"); - Place pl = place(e, true); - return {pl.addr, FType::ptrTo(pl.type)}; -} - -// Explicit conversions: int(x), u8(x), float(x), char(x), bool(x), str(x), ptr(x) ... -Value_ Codegen::convert(const FType &to, const std::vector &args, Pos, const std::string &name, bool canFail) { - Value_ v = expr(*args[0]); - const FType &from = v.type; - Pos p = args[0]->pos; - if (to.kind == FType::Str) { - Value *out = tmpOf(ty(FType::Str)); - if (from.kind == FType::Str) return {copyValue(v.v, FType::Str), FType::Str, false, true}; - if (from.isPtr()) return strFromC(v.v); - if (from.isSigned()) b.CreateCall(rt("finch_str_from_int"), {out, b.CreateSExt(v.v, b.getInt64Ty())}); - else if (from.isUnsigned()) b.CreateCall(rt("finch_str_from_uint"), {out, b.CreateZExt(v.v, b.getInt64Ty())}); - else if (from.isFloat()) b.CreateCall(rt("finch_str_from_float"), {out, b.CreateFPExt(v.v, b.getDoubleTy())}); - else if (from.kind == FType::Char) b.CreateCall(rt("finch_str_from_char"), {out, v.v}); - else if (from.kind == FType::Bool) b.CreateCall(rt("finch_str_from_bool"), {out, b.CreateZExt(v.v, b.getInt32Ty())}); - else if (from.kind == FType::Array && (from.elem->kind == FType::U8 || from.elem->kind == FType::Char)) { - b.CreateCall(rt("finch_str_from_bytes"), {out, tmp(v.v)}); - release(v); - } else if (from.kind == FType::Array || from.kind == FType::Fixed || from.kind == FType::Map || from.kind == FType::Struct) { - b.CreateStore(zero(FType::Str), out); // the same text print(...) shows - emitFormat(out, v.v, from, false); - release(v); - } else { - failAt(p.file, p.line, p.col, "can't turn " + from.show() + " into str"); - } - return {b.CreateLoad(ty(FType::Str), out), FType::Str, false, true}; - } - if (from == to) return v; - if (from.kind == FType::Str && (to.isInt() || to.isFloat()) && canFail) { // int(text) or 0 - Value *sp = tmp(v.v), *err = tmp(zero(FType::Str)); - Value *out = tmp(to.isInt() ? (Value *)b.getInt64(0) : ConstantFP::get(b.getDoubleTy(), 0)); - Value *ok = b.CreateCall(rt(to.isInt() ? "finch_str_try_int" : "finch_str_try_float"), {sp, out, err}); - fallibleFailed = b.CreateICmpEQ(ok, b.getInt32(0)); - fallibleMsg = b.CreateLoad(ty(FType::Str), err); - Value_ r; - if (to.isInt()) r = {intCast(b.CreateLoad(b.getInt64Ty(), out), FType::I64, to), to}; - else r = {b.CreateFPCast(b.CreateLoad(b.getDoubleTy(), out), ty(to)), to}; - release(v); - return r; - } - if (from.kind == FType::Str && (to.isInt() || to.isFloat())) { - Value *sp = tmp(v.v); - Value_ r; - if (to.isInt()) r = {intCast(b.CreateCall(rt("finch_str_to_int"), {sp, fileName(p), b.getInt64(p.line)}), FType::I64, to), to}; - else r = {b.CreateFPCast(b.CreateCall(rt("finch_str_to_float"), {sp, fileName(p), b.getInt64(p.line)}), ty(to)), to}; - release(v); - return r; - } - if (to.isInt() || to.kind == FType::Char) { - if (from.isInt() || from.kind == FType::Char) return {b.CreateIntCast(v.v, ty(to), from.isSigned()), to}; - if (from.kind == FType::Bool) return {b.CreateZExt(v.v, ty(to)), to}; - if (from.isFloat() && to.isInt()) return {to.isSigned() ? b.CreateFPToSI(v.v, ty(to)) : b.CreateFPToUI(v.v, ty(to)), to}; - } - if (to.isFloat()) { - if (from.isInt()) return {intToFloat(v.v, from, to), to}; - if (from.isFloat()) return {b.CreateFPCast(v.v, ty(to)), to}; - } - if (to.kind == FType::Bool && from.isInt()) return {b.CreateICmpNE(v.v, ConstantInt::get(ty(from), 0)), to}; - if (to.isPtr() && (from.isPtr() || from.kind == FType::Null)) return {v.v, to}; - if (to.isPtr() && from.isInt()) return {b.CreateIntToPtr(intCast(v.v, from, FType::U64), b.getPtrTy()), to}; // an address or offset for C - if (to.isInt() && from.isPtr()) return {b.CreatePtrToInt(v.v, ty(to)), to}; - if (to.isPtr() && from.kind == FType::Str) failAt(p.file, p.line, p.col, "use .ptr to get a str's address (it is only valid while the str lives)"); - failAt(p.file, p.line, p.col, "can't turn " + from.show() + " into " + name); -} - -// ---------- methods ---------- - -Value_ Codegen::method(const MethodExpr &m) { - Pos p = m.pos; - // math.sqrt(x), math.Vec(1, 2) - if (m.obj->kind == ExprKind::Var) { - const std::string &mn = static_cast(*m.obj).name; - if (!lookup(mn) && modules[curModule].imports.count(mn)) { - auto mi = modules.find(mn); - if (mi == modules.end()) failAt(p.file, p.line, p.col, "the module '" + mn + "' was not found"); - note(m.obj->pos, mn.size(), "module `" + mn + "`"); - Pos namePos{p.line, p.col + 1, p.file}; - if (auto it = mi->second.fns.find(m.name); it != mi->second.fns.end()) { - note(namePos, m.name.size(), "```finch\n" + signature(it->second) + "\n```", it->second.decl->namePos); - return callFinch(it->second, m.args, m.argNames, p, mn + "." + m.name, &m); - } - if (auto it = mi->second.structs.find(m.name); it != mi->second.structs.end()) { - note(namePos, m.name.size(), structHover(it->second), it->second->decl->namePos); - return construct(it->second, m.args, m.argNames, p); - } - failAt(p.file, p.line, p.col, "the module '" + mn + "' has no function or struct named '" + m.name + "'"); - } - if (!lookup(mn) && !cimports.globals.count(mn) && !cimports.consts.count(mn)) - failAt(m.obj->pos.file, m.obj->pos.line, m.obj->pos.col, - "there is no variable or module named '" + mn + "' (to use a module, add import " + mn + " at the top)"); - } - static const std::set changing = {"push", "pop", "insert", "remove", "clear", "resize", "sort", "reverse"}; - // writing through a map's m[key] adds the key if it's missing: groups[k].push(x) - LRef r = ref(*m.obj, changing.count(m.name) > 0 || mutatingMethods.count(m.name) > 0); - FType t = r.isPlace ? r.pl.type : r.val.type; - if (t.kind == FType::Struct || (t.isPtr() && t.elem && t.elem->kind == FType::Struct)) return structMethod(m, r, t); - if (changing.count(m.name) && (t.kind == FType::Array || t.kind == FType::Map)) { - std::string root = rootVar(*m.obj); - if (Var *v = root.empty() ? nullptr : lookup(root); v && v->readonly) failAt(p.file, p.line, p.col, v->readonlyWhy); - } - Held held(*this); - if (t.kind == FType::Map) { - Value_ recv = r.isPlace ? Value_{r.pl.addr, t} : Value_{tmp(r.val.v), t, false, r.val.fresh}; - if (!r.isPlace && r.val.fresh) holdAddr(recv.v, t); - Value_ out = mapMethod(m, &recv); - if (!r.isPlace && r.val.fresh) dropAt(recv.v, t); - return out; - } - if (g_index && (t.kind == FType::Array || t.kind == FType::Str)) { - auto look = [&](const BuiltinDoc *first, const BuiltinDoc *last) { - for (; first != last; ++first) - if (m.name == first->name) note(Pos{p.line, p.col + 1, p.file}, m.name.size(), docHover(*first)); - }; - if (t.kind == FType::Str) look(std::begin(kStrMethods), std::end(kStrMethods)); - else look(std::begin(kArrayMethods), std::end(kArrayMethods)); - } - if (t.kind == FType::Array) { - Value_ recv = r.isPlace ? Value_{r.pl.addr, t} : r.val; - if (!r.isPlace) { - if (changing.count(m.name)) failAt(p.file, p.line, p.col, m.name + "() would change a temporary array; store it in a variable first"); - recv = {tmp(r.val.v), t, false, r.val.fresh}; - if (r.val.fresh) holdAddr(recv.v, t); - } - Value_ out = arrayMethod(m, &recv); - if (!r.isPlace && r.val.fresh) dropAt(recv.v, t); - return out; - } - if (t.kind == FType::Str) { - Value_ sv = r.isPlace ? Value_{b.CreateLoad(ty(t), r.pl.addr), t} : r.val; - Value *addr = tmp(sv.v); // the runtime takes strings by address - if (!r.isPlace) hold(sv); - auto argStr = [&](size_t i, const char *what) { - Value_ a = coerce(expr(*m.args[i]), FType::Str, m.args[i]->pos, what); - hold(a); - return a; - }; - auto argInt = [&](size_t i, const char *what) { - return coerce(expr(*m.args[i]), FType::I64, m.args[i]->pos, what).v; - }; - auto need = [&](size_t n) { checkArgs(m.args, m.argNames, n, p, m.name); }; - Value *out = tmpOf(ty(FType::Str)); - Value_ res; - const std::string &n = m.name; - auto strRes = [&]() { return Value_{b.CreateLoad(ty(FType::Str), out), FType::Str, false, true}; }; - if (n == "sub") { - need(2); - Value *a = argInt(0, "the start"), *e = argInt(1, "the end"); - b.CreateCall(rt("finch_str_sub"), {out, addr, a, e, fileName(p), b.getInt64(p.line)}); - res = strRes(); - } else if (n == "find" || n == "contains" || n == "starts_with" || n == "ends_with") { - need(1); - Value_ t2 = argStr(0, "the text to look for"); - Value *tp = tmp(t2.v); - if (n == "find") res = {b.CreateCall(rt("finch_str_find"), {addr, tp}), FType::I64}; - else if (n == "contains") res = {b.CreateICmpSGE(b.CreateCall(rt("finch_str_find"), {addr, tp}), b.getInt64(0)), FType::Bool}; - else res = {b.CreateICmpNE(b.CreateCall(rt(n == "starts_with" ? "finch_str_starts" : "finch_str_ends"), {addr, tp}), b.getInt32(0)), FType::Bool}; - release(t2); - } else if (n == "trim" || n == "upper" || n == "lower") { - need(0); - b.CreateCall(rt("finch_str_" + n), {out, addr}); - res = strRes(); - } else if (n == "replace") { - need(2); - Value_ a = argStr(0, "the text to replace"), c = argStr(1, "the new text"); - b.CreateCall(rt("finch_str_replace"), {out, addr, tmp(a.v), tmp(c.v)}); - release(a); - release(c); - res = strRes(); - } else if (n == "split") { - need(1); - Value_ sep = argStr(0, "the separator"); - FType at = FType::arrayOf(FType::Str); - Value *ao = tmpOf(ty(at)); - b.CreateCall(rt("finch_str_split"), {ao, addr, tmp(sep.v)}); - release(sep); - res = {b.CreateLoad(ty(at), ao), at, false, true}; - } else if (n == "repeat") { - need(1); - b.CreateCall(rt("finch_str_repeat"), {out, addr, argInt(0, "the count")}); - res = strRes(); - } else if (n == "bytes") { - need(0); - FType at = FType::arrayOf(FType::U8); - Value *ao = tmpOf(ty(at)); - b.CreateCall(rt("finch_bytes_from_str"), {ao, addr}); - res = {b.CreateLoad(ty(at), ao), at, false, true}; - } else { - failAt(p.file, p.line, p.col, "a str has no method '" + n + "' (it has: sub, find, contains, starts_with, ends_with, split, trim, upper, lower, replace, repeat, bytes)"); - } - if (!r.isPlace) release(sv); - return res; - } - failAt(p.file, p.line, p.col, t.show() + " has no methods"); -} - -// p.move(1, 2): a method of a struct (also through a ptr[Struct]); self is passed by address -Value_ Codegen::structMethod(const MethodExpr &m, LRef &r, const FType &t) { - Pos p = m.pos; - FType st = t.isPtr() ? *t.elem : t; - auto ms = methods.find(st.info); - const Fn *fn = nullptr; - if (ms != methods.end()) - if (auto it = ms->second.find(m.name); it != ms->second.end()) fn = &it->second; - if (!fn) { - std::string names; - if (ms != methods.end()) - for (auto &[n, f] : ms->second) names += (names.empty() ? "" : ", ") + n; - if (names.empty()) - failAt(p.file, p.line, p.col, "the struct " + st.show() + " has no methods; add one with fn " + st.name + "." + m.name + "(...) { ... }"); - failAt(p.file, p.line, p.col, "the struct " + st.show() + " has no method '" + m.name + "' (it has: " + names + ")"); - } - note(Pos{p.line, p.col + 1, p.file}, m.name.size(), "```finch\n" + signature(*fn) + "\n```", fn->decl->namePos); - std::string root = rootVar(*m.obj); - if (fn->mutatesSelf && !root.empty() && !t.isPtr()) - if (Var *v = lookup(root); v && v->readonly) failAt(p.file, p.line, p.col, v->readonlyWhy); - - Value *self; - bool temp = false; - if (t.isPtr()) { - self = r.isPlace ? b.CreateLoad(b.getPtrTy(), r.pl.addr) : r.val.v; - panicIf(b.CreateIsNull(self), "called ." + m.name + "() on a null pointer", p); - root.clear(); // self lives somewhere else - } else if (r.isPlace) { - self = r.pl.addr; - } else { - self = tmp(r.val.v); // a temporary struct: Point(1, 2).length() - temp = true; - } - Held held(*this); - if (temp && r.val.fresh) holdAddr(self, st); - Value_ out = callFinch(*fn, m.args, m.argNames, p, st.name + "." + m.name, &m, self, root); - if (temp && r.val.fresh && owning(st)) dropAt(self, st); - return out; -} - -// An element compare for find/contains/sort: -1, 0, 1 (only numbers, chars, bools and str) -static bool comparable(const FType &t) { - return t.isNumber() || t.kind == FType::Char || t.kind == FType::Bool || t.kind == FType::Str; -} - -Value_ Codegen::arrayMethod(const MethodExpr &m, Value_ *recv) { - Pos p = m.pos; - const std::string &n = m.name; - FType at = recv->type, et = *at.elem; - llvm::Type *AT = ty(at), *ET = ty(et); - Value *a = recv->v; // the array's address - auto need = [&](size_t k) { checkArgs(m.args, m.argNames, k, p, n); }; - auto lenAddr = [&]() { return b.CreateStructGEP(AT, a, 1); }; - auto len = [&]() { return b.CreateLoad(b.getInt64Ty(), lenAddr()); }; - auto data = [&]() { return b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(AT, a, 0)); }; - auto elemValue = [&](size_t i) { return own(coerce(exprWant(*m.args[i], et), et, m.args[i]->pos, "the element")); }; - - if (n == "push") { - need(1); - Value *v = elemValue(0); - Value *l = len(); - b.CreateCall(rt("finch_arr_reserve"), {a, b.CreateAdd(l, b.getInt64(1)), elemSize(et)}); - b.CreateStore(v, b.CreateInBoundsGEP(ET, data(), l)); - b.CreateStore(b.CreateAdd(l, b.getInt64(1)), lenAddr()); - return {nullptr, FType::Void}; - } - if (n == "pop") { - need(0); - Value *l = len(); - panicIf(b.CreateICmpEQ(l, b.getInt64(0)), "pop() on an empty array", p); - Value *last = b.CreateSub(l, b.getInt64(1)); - Value *v = b.CreateLoad(ET, b.CreateInBoundsGEP(ET, data(), last)); - b.CreateStore(last, lenAddr()); - return {v, et, false, owning(et)}; - } - if (n == "insert") { - need(2); - Value *i = coerce(expr(*m.args[0]), FType::I64, m.args[0]->pos, "the position").v; - Value *v = elemValue(1); - b.CreateCall(rt("finch_arr_insert_gap"), {a, i, elemSize(et), fileName(p), b.getInt64(p.line)}); - b.CreateStore(v, b.CreateInBoundsGEP(ET, data(), i)); - return {nullptr, FType::Void}; - } - if (n == "remove") { - need(1); - Value *i = coerce(expr(*m.args[0]), FType::I64, m.args[0]->pos, "the position").v; - boundsCheck(i, len(), p); - Value *v = b.CreateLoad(ET, b.CreateInBoundsGEP(ET, data(), i)); - b.CreateCall(rt("finch_arr_remove_gap"), {a, i, elemSize(et)}); - return {v, et, false, owning(et)}; - } - if (n == "clear" || n == "resize") { - need(n == "clear" ? 0 : 1); - Value *nl = n == "clear" ? (Value *)b.getInt64(0) : coerce(expr(*m.args[0]), FType::I64, m.args[0]->pos, "the new length").v; - if (owning(et)) { // drop the elements that go away - Value *l = len(), *d = data(); - Value *from = b.CreateSelect(b.CreateICmpSLT(nl, l), b.CreateSelect(b.CreateICmpSLT(nl, b.getInt64(0)), b.getInt64(0), nl), l); - forN(b.CreateSub(l, from), [&](Value *k) { dropAt(b.CreateInBoundsGEP(ET, d, b.CreateAdd(from, k)), et); }); - } - b.CreateCall(rt("finch_arr_resize"), {a, nl, elemSize(et)}); - return {nullptr, FType::Void}; - } - if (n == "find" || n == "contains") { - need(1); - if (!comparable(et)) failAt(p.file, p.line, p.col, n + "() works on arrays of numbers, chars, bools or str"); - Value_ x = coerce(exprWant(*m.args[0], et), et, m.args[0]->pos, "the value to look for"); - Value *xv = x.v; - Value *res = tmpOf(b.getInt64Ty()); - b.CreateStore(b.getInt64(-1), res); - Value *l = len(), *d = data(); - Value *i = tmpOf(b.getInt64Ty()); - b.CreateStore(b.getInt64(0), i); - BasicBlock *cond = newBlock("find.cond"), *body = newBlock("find.body"), *hit = newBlock("find.hit"), - *next = newBlock("find.next"), *end = newBlock("find.end"); - b.CreateBr(cond); - b.SetInsertPoint(cond); - Value *iv = b.CreateLoad(b.getInt64Ty(), i); - b.CreateCondBr(b.CreateICmpSLT(iv, l), body, end); - b.SetInsertPoint(body); - Value_ ev{b.CreateLoad(ET, b.CreateInBoundsGEP(ET, d, iv)), et}; - Value *eq = compare(BinOp::Eq, ev, {xv, et}, p).v; - b.CreateCondBr(eq, hit, next); - b.SetInsertPoint(hit); - b.CreateStore(iv, res); - b.CreateBr(end); - b.SetInsertPoint(next); - b.CreateStore(b.CreateAdd(iv, b.getInt64(1)), i); - b.CreateBr(cond); - b.SetInsertPoint(end); - release(x); - Value *r = b.CreateLoad(b.getInt64Ty(), res); - if (n == "find") return {r, FType::I64}; - return {b.CreateICmpSGE(r, b.getInt64(0)), FType::Bool}; - } - if (n == "join") { - need(1); - if (et.kind != FType::Str) failAt(p.file, p.line, p.col, "join() works on an array of str"); - Value_ sep = coerce(expr(*m.args[0]), FType::Str, m.args[0]->pos, "the separator"); - Value *out = tmpOf(ty(FType::Str)); - b.CreateCall(rt("finch_str_join"), {out, a, tmp(sep.v)}); - release(sep); - return {b.CreateLoad(ty(FType::Str), out), FType::Str, false, true}; - } - if (n == "slice") { - need(2); - Value *s = coerce(expr(*m.args[0]), FType::I64, m.args[0]->pos, "the start").v; - Value *e = coerce(expr(*m.args[1]), FType::I64, m.args[1]->pos, "the end").v; - Value *l = len(); - panicIf(b.CreateOr(b.CreateOr(b.CreateICmpSLT(s, b.getInt64(0)), b.CreateICmpSGT(e, l)), b.CreateICmpSGT(s, e)), - "slice(start, end) is out of range", p); - Value *cnt = b.CreateSub(e, s); - Value *out = tmpOf(AT); - b.CreateCall(rt("finch_arr_make"), {out, cnt, elemSize(et)}); - Value *src = data(); - Value *dst = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(AT, out, 0)); - forN(cnt, [&](Value *k) { - copyAt(b.CreateInBoundsGEP(ET, dst, k), b.CreateInBoundsGEP(ET, src, b.CreateAdd(s, k)), et); - }); - return {b.CreateLoad(AT, out), at, false, true}; - } - if (n == "reverse") { - need(0); - Value *l = len(), *d = data(); - forN(b.CreateSDiv(l, b.getInt64(2)), [&](Value *k) { - Value *x = b.CreateInBoundsGEP(ET, d, k); - Value *y = b.CreateInBoundsGEP(ET, d, b.CreateSub(b.CreateSub(l, b.getInt64(1)), k)); - Value *xv = b.CreateLoad(ET, x), *yv = b.CreateLoad(ET, y); - b.CreateStore(yv, x); - b.CreateStore(xv, y); - }); - return {nullptr, FType::Void}; - } - if (n == "sort") { - need(0); - if (!comparable(et) || et.kind == FType::Bool) failAt(p.file, p.line, p.col, "sort() works on arrays of numbers, chars or str"); - std::string key = "cmp." + typeKey(et); - Function *cmp = helpers[key]; - if (!cmp) { - cmp = Function::Create(FunctionType::get(b.getInt32Ty(), {b.getPtrTy(), b.getPtrTy()}, false), - Function::InternalLinkage, "finch." + key, mod.get()); - helpers[key] = cmp; - IRBuilderBase::InsertPointGuard g(b); - DISubprogram *savedFn = diFn; - diFn = nullptr; - b.SetInsertPoint(BasicBlock::Create(ctx, "entry", cmp)); - b.SetCurrentDebugLocation(DebugLoc()); - Value *x = cmp->getArg(0), *y = cmp->getArg(1); - Value *r; - if (et.kind == FType::Str) { - r = b.CreateTrunc(b.CreateCall(rt("finch_str_cmp"), {x, y}), b.getInt32Ty()); - } else { - Value_ xv{b.CreateLoad(ET, x), et}, yv{b.CreateLoad(ET, y), et}; - Value *lt = compare(BinOp::Less, xv, yv, p).v, *gt = compare(BinOp::Greater, xv, yv, p).v; - r = b.CreateSub(b.CreateZExt(gt, b.getInt32Ty()), b.CreateZExt(lt, b.getInt32Ty())); - } - b.CreateRet(r); - diFn = savedFn; - } - b.CreateCall(libc("qsort", b.getVoidTy(), {b.getPtrTy(), b.getInt64Ty(), b.getInt64Ty(), b.getPtrTy()}), - {data(), len(), elemSize(et), cmp}); - return {nullptr, FType::Void}; - } - failAt(p.file, p.line, p.col, "an array has no method '" + n + "' (it has: push, pop, insert, remove, clear, resize, find, contains, join, slice, reverse, sort)"); -} - -} // namespace finch diff --git a/src/codegen_impl.h b/src/codegen_impl.h deleted file mode 100644 index 4d3b8f8..0000000 --- a/src/codegen_impl.h +++ /dev/null @@ -1,327 +0,0 @@ -#pragma once -// Internal to the code generator: the Codegen class, shared by codegen*.cpp and abi.cpp. - -#include "codegen.h" -#include "error.h" -#include "index.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -using FType = ::Type; // Finch types (llvm::Type is the LLVM one) - -struct StructInfo { - std::string name; - std::string module; // "" main file, a module name, or "C" for imported C structs - bool isC = false; - const StructDecl *decl = nullptr; // Finch structs - const CStruct *cstruct = nullptr; // C structs - struct F { - std::string name; - FType type; - const Expr *init = nullptr; // default value - bool hidden = false; // C union/bitfield padding: has no name in Finch - unsigned llvmIndex = 0; // C structs carry explicit padding between fields - Pos pos; // Finch structs: where the field is declared - }; - std::vector fields; - llvm::StructType *llvm = nullptr; - int state = 0; // 0 = not resolved, 1 = resolving (cycle check), 2 = done - bool owning = false; - std::string unsupported; // C structs Finch can't lay out - Pos pos; -}; - -namespace finch { - -struct Value_ { - llvm::Value *v; - FType type; - bool literal = false; // a number written in the code (or a C constant): adapts to the type around it - bool fresh = false; // an owning value nobody holds yet: it must be stored (moved) or released -}; - -struct Var { - llvm::Value *slot; - FType type; - bool readonly = false; // loop variables - std::string readonlyWhy; - bool owned = false; // dropped when its scope ends - int order = 0; // declaration order, for defer - bool moved = false; // returned out of the function: not dropped on that path - Pos pos; // where it was declared -}; - -struct Cleanup { - bool isDefer; - std::string var; // Drop: the variable - const Stmt *body = nullptr; // Defer: the statement - int order = 0; // Defer: variables declared after it are not visible -}; - -struct Scope { - std::unordered_map vars; - std::vector cleanups; -}; - -struct Fn { - llvm::Function *llvm = nullptr; - const FnDecl *decl = nullptr; - std::string module; - std::vector borrowParam; // owning params the function never changes: no copy - llvm::Function *cThunk = nullptr; - FType ret; // resolved types - std::vector params; - StructInfo *recv = nullptr; // a method of this struct: the first LLVM parameter is `self`'s address - bool mutatesSelf = false; // the method changes `self` - bool fallible = false; // -> T!: returns { i1 ok, T value, str error } -}; - -struct Loop { - llvm::BasicBlock *continueTo, *breakTo; - size_t scopeDepth; // scopes opened inside the loop are cleaned up by break/continue - size_t pendingDepth; // and so are temporaries held by expressions around it (see Codegen::pending) -}; - -// A fresh value an expression is holding while it computes another part (f(a + b, try g())): if that -// part leaves early (try, or a return/break/continue in an `or { }` block), it must be dropped. -struct Pending { - llvm::Value *v; - FType type; - bool isAddr; // v is the value's address -}; - -struct Place { // something that can be assigned to - llvm::Value *addr; - FType type; -}; - -struct LRef { - bool isPlace; - Place pl; - Value_ val; -}; - -struct ModuleScope { - std::map fns; - std::map structs; - std::set imports; // Finch modules visible here -}; - -// How a C struct travels: System V x86-64 (Linux) or Microsoft x64 (Windows). -struct AbiArg { - // Direct: as is. Expand: split into register-sized parts. Memory: on the stack (byval), or - // returned through a hidden pointer (sret). Indirect (Windows): a pointer to a copy the caller made. - enum Kind { Direct, Expand, Memory, Indirect } kind = Direct; - std::vector parts; // Expand: one value per eightbyte - llvm::Type *coerced = nullptr; // Expand: { parts... } for returns - bool stackAlign8 = false; // AArch64 Linux: HFA arguments that end up on the stack -}; - -class Codegen { -public: - Codegen(llvm::LLVMContext &c, const std::vector &progs, const CImports &ci, llvm::TargetMachine &tm, - bool debug); - std::unique_ptr run(); - - // ---------- state ---------- - llvm::LLVMContext &ctx; - llvm::IRBuilder<> b; - std::unique_ptr mod; - const std::vector &progs; - const CImports &cimports; - const llvm::DataLayout *dl; - - std::map modules; - std::map cStructs; - std::vector> structStore; - std::vector scopes; - std::vector loops; - std::vector pending; - const Fn *curFn = nullptr; - std::string curModule; - int varOrder = 0; - int deferLimit = -1; // while emitting a defer: hide variables declared after it - int inDefer = 0; - std::map helpers; // drop/copy/print per type - std::map> methods; - std::set mutatingMethods; // names of methods that change self (for the mutation analysis) - - // errors as values: the call that `or` / `try` is handling reports here whether it failed - const Expr *fallibleTarget = nullptr; - llvm::Value *fallibleFailed = nullptr; // i1 - llvm::Value *fallibleMsg = nullptr; // str - - // debug info (-g) - bool debug; - std::unique_ptr di; - std::vector diFiles; - llvm::DICompileUnit *diUnit = nullptr; - llvm::DISubprogram *diFn = nullptr; - std::map diTypes; - - // ---------- codegen.cpp: program, statements, expressions ---------- - void declareStructs(); - void declareFns(); - void declare(const Program &p, const FnDecl &fn); - void define(Fn &fn); - void defineMainWrapper(); - void block(const BlockStmt &blk); - void blockBody(const BlockStmt &blk); - void stmt(const Stmt &s); - void varDecl(const VarDeclStmt &s); - void assign(const AssignStmt &s); - void ifStmt(const IfStmt &s); - void whileStmt(const WhileStmt &s); - void forStmt(const ForStmt &s); - void forEachStmt(const ForEachStmt &s); - void returnStmt(const ReturnStmt &s); - llvm::Type *retType(const Fn &f); - void retValue(llvm::Value *v); // return from the current function (wrapped as success if it can fail) - void retError(llvm::Value *msg); // fail the current function with the str `msg` - void jump(bool isBreak, Pos p); - llvm::Value *condition(const Expr &e); - void continueAt(llvm::BasicBlock *bb, llvm::BasicBlock *deadEnd); - bool terminated(); - llvm::BasicBlock *newBlock(const char *name); - - void hold(const Value_ &v); // see Pending - void holdAddr(llvm::Value *addr, const FType &t); - void dropPending(size_t downTo); // emit drops for pending[downTo..] - struct Held { // forgets what was held when the expression is done - Codegen &cg; - size_t mark; - explicit Held(Codegen &c) : cg(c), mark(c.pending.size()) {} - ~Held() { cg.pending.erase(cg.pending.begin() + mark, cg.pending.end()); } - }; - void pushScope(); - void popScope(); // emits the scope's cleanups if reachable - void emitCleanups(size_t downTo); // run cleanups of scopes [downTo, end) without popping - void emitScopeCleanups(size_t idx); - llvm::AllocaInst *slot(const FType &t, const std::string &name); - Var *lookup(const std::string &name); - Var &addVar(Pos p, const std::string &name, const FType &t, llvm::Value *init, bool owned, bool readonly = false, - unsigned argNo = 0); - - Value_ expr(const Expr &e); - Value_ exprWant(const Expr &e, const FType &want); - Value_ binary(const BinaryExpr &e); - Value_ unary(const UnaryExpr &e); - Value_ logic(const BinaryExpr &e); - Value_ arith(BinOp op, Value_ l, Value_ r, Pos p); - Value_ arithOp(BinOp op, Value_ l, Value_ r, Pos p); - Value_ compare(BinOp op, Value_ l, Value_ r, Pos p); - bool unify(Value_ &l, Value_ &r); - [[noreturn]] void badOperands(BinOp op, const Value_ &l, const Value_ &r, Pos p); - LRef ref(const Expr &e, bool forWrite = false); // an address if `e` has one, else a value - Place place(const Expr &e, bool forWrite = false); - LRef member(const MemberExpr &m, bool forWrite); - LRef index(const IndexExpr &e, bool forWrite); - Value_ arrayLit(const ArrayLitExpr &a, const FType *want); - Value_ fallible(const Expr &call, llvm::Value *&failed, llvm::Value *&msg); - Value_ tryExpr(const TryExpr &t); - Value_ orElse(const OrElseExpr &e, bool discard = false); // discard: a statement, the value isn't used - FType structType(StructInfo *s); - std::string rootVar(const Expr &e); - bool mutates(const std::string &name, const Stmt &s); - bool mutatesExpr(const std::string &name, const Expr &e); - - // ---------- codegen_types.cpp: types, conversions, ownership, printing ---------- - llvm::Type *ty(const FType &t); - FType resolve(const FType &t, Pos p); - FType resolveT(const FType &t, Pos p, bool deep); // deep: structs by value must be complete - void forN(llvm::Value *n, const std::function &body); // for i in 0..n - llvm::Value *tmpOf(llvm::Type *t); // an uninitialised stack slot - void resolveStruct(StructInfo *s); - StructInfo *findStruct(const std::string &module, const std::string &name, bool qualified); - bool owning(const FType &t); - llvm::Constant *zero(const FType &t); - Value_ defaultValue(const FType &t, Pos p); - static bool widens(const FType &from, const FType &to); - static bool fits(llvm::ConstantInt *c, const FType &from, const FType &to); - llvm::Value *intCast(llvm::Value *v, const FType &from, const FType &to); - llvm::Value *intToFloat(llvm::Value *v, const FType &from, const FType &to); - Value_ coerce(Value_ v, const FType &want, Pos p, const std::string &what); - llvm::Value *own(const Value_ &v); // something that can be stored: moved if fresh, else copied - void release(const Value_ &v); // drop a fresh value nobody kept - llvm::Value *copyValue(llvm::Value *v, const FType &t); - void dropValue(llvm::Value *v, const FType &t); - void dropAt(llvm::Value *addr, const FType &t); - void copyAt(llvm::Value *dst, llvm::Value *src, const FType &t); - llvm::Function *dropFn(const FType &t); - llvm::Function *copyFn(const FType &t); - std::string typeKey(const FType &t); - llvm::Value *tmp(llvm::Value *v); // a stack copy of v, to pass by address - void emitPrint(llvm::Value *v, const FType &t, bool quoted); - void emitFormat(llvm::Value *buf, llvm::Value *v, const FType &t, bool quoted); // append v as text to the str at buf - void bufText(llvm::Value *buf, const std::string &text); - llvm::Function *formatFn(const FType &t); - void printf_(const std::string &fmt, std::vector args); - llvm::Value *strConst(const std::string &s); - llvm::Value *cstr(llvm::Value *strValue); // str -> char* for C - Value_ strFromC(llvm::Value *p); // char* -> borrowed str - llvm::Value *elemSize(const FType &t); - - // ---------- codegen_builtins.cpp: calls, built-ins, methods ---------- - Value_ call(const CallExpr &c); - Value_ method(const MethodExpr &m); - Value_ callFinch(const Fn &fn, const std::vector &args, const std::vector &names, Pos p, - const std::string &shownName, const Expr *site, llvm::Value *self = nullptr, - const std::string &selfRoot = ""); - Value_ construct(StructInfo *s, const std::vector &args, const std::vector &names, Pos p); - Value_ callC(const CFunc &f, const std::vector &args, Pos p); - Value_ convert(const FType &to, const std::vector &args, Pos p, const std::string &name, bool canFail = false); - Value_ print(const std::vector &args, Pos p); - Value_ addrOf(const std::vector &args, Pos p); - Value_ arrayMethod(const MethodExpr &m, Value_ *recv); - Value_ structMethod(const MethodExpr &m, LRef &r, const FType &t); - - // ---------- codegen_map.cpp: maps ---------- - llvm::StructType *mapEntryTy(const FType &t); - Value_ mapLit(const MapLitExpr &e, const FType *want); - LRef mapIndex(const IndexExpr &e, LRef &obj, const FType &t, bool forWrite); - Value_ mapMethod(const MethodExpr &m, Value_ *recv); - std::vector mapArgs(llvm::Value *map, llvm::Value *keyAddr, const FType &t); - llvm::Value *mapSlot(llvm::Value *map, const FType &t, const Value_ &key, Pos p, bool fill); - llvm::Value *mapEntry(llvm::Value *map, const FType &t, llvm::Value *i); - void forEachEntry(llvm::Value *map, const FType &t, const std::function &body); - llvm::Value *keyText(const Value_ &key); - bool isBuiltin(const std::string &n); - std::string headerHint(const std::string &name); - void checkArgs(const std::vector &args, const std::vector &names, size_t want, Pos p, - const std::string &name, bool variadic = false); - llvm::Value *cGlobal(const std::string &name); - llvm::Function *rt(const std::string &name); // a runtime function by name - - // runtime errors - llvm::Value *fileName(Pos p); - void panicIf(llvm::Value *cond, const std::string &msg, Pos p); - void boundsCheck(llvm::Value *i, llvm::Value *len, Pos p); - void checkDivisor(const Value_ &l, const Value_ &r, Pos p); - llvm::Function *libc(const char *name, llvm::Type *ret, std::vector params, bool vararg = false); - - // ---------- abi.cpp: C calling convention for structs by value ---------- - AbiArg classify(const FType &t); - llvm::Function *declareC(const CFunc &f); - Value_ emitCCall(const CFunc &f, llvm::Function *fn, std::vector args, Pos p); - llvm::Function *cThunk(Fn &fn, Pos p); - - // ---------- language server index ---------- - void note(Pos at, size_t len, const std::string &hover, Pos def = Pos{}); - std::string signature(const Fn &fn); - std::string structHover(StructInfo *s); - - // ---------- debug info ---------- - void setLoc(Pos p); - llvm::DIType *diType(const FType &t); -}; - -} // namespace finch diff --git a/src/codegen_map.cpp b/src/codegen_map.cpp deleted file mode 100644 index 182d396..0000000 --- a/src/codegen_map.cpp +++ /dev/null @@ -1,246 +0,0 @@ -// Code generation, part 4: maps. -// -// map[K]V is { entries, len, used, cap, index, icap } (see runtime/finch_rt.c). The runtime finds and -// places entries; the compiler stores, copies and drops the keys and values in them, like it does -// for array elements. An entry is { i64 hash, K key, V value }; hash 0 marks a removed entry. - -#include "codegen_impl.h" -#include "builtins_doc.h" - -using namespace llvm; - -namespace finch { - -StructType *Codegen::mapEntryTy(const FType &t) { - return StructType::get(ctx, {b.getInt64Ty(), ty(*t.key), ty(*t.elem)}); -} - -// The runtime's (map, key, entry size, key size, key is str) arguments. -std::vector Codegen::mapArgs(Value *map, Value *keyAddr, const FType &t) { - return {map, keyAddr, b.getInt64(dl->getTypeAllocSize(mapEntryTy(t))), elemSize(*t.key), - b.getInt32(t.key->kind == FType::Str ? 1 : 0)}; -} - -Value *Codegen::mapEntry(Value *map, const FType &t, Value *i) { - Value *entries = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(ty(t), map, 0)); - return b.CreateInBoundsGEP(mapEntryTy(t), entries, i); -} - -// The entry for `key`, added if it's missing: the key is copied in, and the value is its type's -// default when `fill` (m[k] += 1 starts from 0). -Value *Codegen::mapSlot(Value *map, const FType &t, const Value_ &key, Pos p, bool fill) { - StructType *ET = mapEntryTy(t); - Value *keyAddr = tmp(key.v); - Value *added = tmpOf(b.getInt32Ty()); - std::vector args = mapArgs(map, keyAddr, t); - args.push_back(added); - Value *entry = mapEntry(map, t, b.CreateCall(rt("finch_map_slot"), args)); - BasicBlock *fresh = newBlock("map.new"), *have = newBlock("map.have"); - b.CreateCondBr(b.CreateICmpNE(b.CreateLoad(b.getInt32Ty(), added), b.getInt32(0)), fresh, have); - b.SetInsertPoint(fresh); - copyAt(b.CreateStructGEP(ET, entry, 1), keyAddr, *t.key); - if (fill) b.CreateStore(own(defaultValue(*t.elem, p)), b.CreateStructGEP(ET, entry, 2)); - b.CreateBr(have); - b.SetInsertPoint(have); - return entry; -} - -// Every live entry, in insertion order: body(entry number, entry address). -void Codegen::forEachEntry(Value *map, const FType &t, const std::function &body) { - Value *used = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ty(t), map, 2)); - forN(used, [&](Value *i) { - Value *entry = mapEntry(map, t, i); - Value *hash = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(mapEntryTy(t), entry, 0)); - BasicBlock *live = newBlock("entry.live"), *next = newBlock("entry.next"); - b.CreateCondBr(b.CreateICmpNE(hash, b.getInt64(0)), live, next); - b.SetInsertPoint(live); - body(i, entry); - b.CreateBr(next); - b.SetInsertPoint(next); - }); -} - -// A key as text for error messages: "bob" or 42 -Value *Codegen::keyText(const Value_ &key) { - Value *out = tmpOf(ty(FType::Str)); - const FType &t = key.type; - if (t.kind == FType::Str) { - Value *q = tmp(strConst("\"")), *half = tmpOf(ty(FType::Str)); - b.CreateCall(rt("finch_str_concat"), {half, q, tmp(key.v)}); - b.CreateCall(rt("finch_str_concat"), {out, half, q}); - } else if (t.isSigned()) { - b.CreateCall(rt("finch_str_from_int"), {out, b.CreateSExt(key.v, b.getInt64Ty())}); - } else if (t.isUnsigned()) { - b.CreateCall(rt("finch_str_from_uint"), {out, b.CreateZExt(key.v, b.getInt64Ty())}); - } else if (t.kind == FType::Char) { - b.CreateCall(rt("finch_str_from_char"), {out, key.v}); - } else { - b.CreateCall(rt("finch_str_from_bool"), {out, b.CreateZExt(key.v, b.getInt32Ty())}); - } - return out; -} - -// m[key]: reading a missing key stops the program; writing (m[k] = v, m[k] += 1, m[k].push(x)) adds it -LRef Codegen::mapIndex(const IndexExpr &e, LRef &obj, const FType &t, bool forWrite) { - Pos p = e.pos; - FType kt = *t.key, vt = *t.elem; - Value_ key = coerce(exprWant(*e.index, kt), kt, e.index->pos, "the key"); - if (forWrite) { - if (!obj.isPlace) failAt(p.file, p.line, p.col, "this is a temporary map, it can't be changed"); - Value *entry = mapSlot(obj.pl.addr, t, key, p, true); - release(key); - return {true, {b.CreateStructGEP(mapEntryTy(t), entry, 2), vt}, {}}; - } - Value *map = obj.isPlace ? obj.pl.addr : tmp(obj.val.v); - Value *i = b.CreateCall(rt("finch_map_find"), mapArgs(map, tmp(key.v), t)); - BasicBlock *missing = newBlock("map.missing"), *found = newBlock("map.found"); - b.CreateCondBr(b.CreateICmpSLT(i, b.getInt64(0)), missing, found); - b.SetInsertPoint(missing); - b.CreateCall(rt("finch_map_missing"), {fileName(p), b.getInt64(p.line), keyText(key)}); - b.CreateUnreachable(); - b.SetInsertPoint(found); - release(key); - Value *valueAddr = b.CreateStructGEP(mapEntryTy(t), mapEntry(map, t, i), 2); - if (obj.isPlace) return {true, {valueAddr, vt}, {}}; - Value *v = b.CreateLoad(ty(vt), valueAddr); // from a temporary map: take the value, drop the rest - Value_ out{v, vt}; - if (owning(vt) && obj.val.fresh) out = {copyValue(v, vt), vt, false, true}; - release(obj.val); - return {false, {}, out}; -} - -// ["a": 1, "b": 2], or [:] where the type is known -Value_ Codegen::mapLit(const MapLitExpr &e, const FType *want) { - Pos p = e.pos; - FType t; - Value_ k0, v0; // the first entry, when it decides the types - bool first = false; - if (want && want->kind == FType::Map) { - t = *want; - } else if (e.keys.empty()) { - failAt(p.file, p.line, p.col, "an empty [:] needs a type, like: map[str]int m = [:]"); - } else { - // number values written in the code are all floats if any of them has a dot - bool allNum = true, anyFloat = false; - for (auto &x : e.values) { - const Expr *y = x.get(); - if (y->kind == ExprKind::Unary && static_cast(y)->op == '-') y = static_cast(y)->operand.get(); - if (y->kind == ExprKind::Float) anyFloat = true; - else if (y->kind != ExprKind::Int) allNum = false; - } - k0 = expr(*e.keys[0]); - v0 = expr(*e.values[0]); - Pos kp = e.keys[0]->pos, vp = e.values[0]->pos; - if (k0.type.kind == FType::Void || k0.type.kind == FType::Null) failAt(kp.file, kp.line, kp.col, "a map key needs a value with a type"); - if (v0.type.kind == FType::Void || v0.type.kind == FType::Null) failAt(vp.file, vp.line, vp.col, "a map value needs a value with a type"); - t = resolve(FType::mapOf(k0.type, allNum && anyFloat ? FType(FType::F64) : v0.type), kp); - first = true; - } - Value *map = tmp(zero(t)); - StructType *ET = mapEntryTy(t); - Held held(*this); - holdAddr(map, t); // the entries so far, if a later one leaves early - for (size_t i = 0; i < e.keys.size(); i++) { - Held entry(*this); - Value_ k = i == 0 && first ? k0 : exprWant(*e.keys[i], *t.key); - k = coerce(k, *t.key, e.keys[i]->pos, "every key of this map"); - hold(k); - Value_ v = i == 0 && first ? v0 : exprWant(*e.values[i], *t.elem); - Value *vv = own(coerce(v, *t.elem, e.values[i]->pos, "every value of this map")); - Value *valueAddr = b.CreateStructGEP(ET, mapSlot(map, t, k, p, false), 2); - dropAt(valueAddr, *t.elem); // a key given twice: the last value wins - b.CreateStore(vv, valueAddr); - release(k); - } - return {b.CreateLoad(ty(t), map), t, false, true}; -} - -Value_ Codegen::mapMethod(const MethodExpr &m, Value_ *recv) { - Pos p = m.pos; - const std::string &n = m.name; - FType t = recv->type, kt = *t.key, vt = *t.elem; - StructType *ET = mapEntryTy(t); - Value *map = recv->v; - auto need = [&](size_t k) { checkArgs(m.args, m.argNames, k, p, n); }; - auto keyArg = [&]() { return coerce(exprWant(*m.args[0], kt), kt, m.args[0]->pos, "the key"); }; - if (g_index) - for (const BuiltinDoc &d : kMapMethods) - if (n == d.name) note(Pos{p.line, p.col + 1, p.file}, n.size(), "```finch\n" + std::string(d.signature) + "\n```\n" + d.doc); - - if (n == "has") { - need(1); - Value_ k = keyArg(); - Value *i = b.CreateCall(rt("finch_map_find"), mapArgs(map, tmp(k.v), t)); - release(k); - return {b.CreateICmpSGE(i, b.getInt64(0)), FType::Bool}; - } - if (n == "get") { // m.get(key, default): the default is only computed when the key is missing - need(2); - Value_ k = keyArg(); - Value *i = b.CreateCall(rt("finch_map_find"), mapArgs(map, tmp(k.v), t)); - release(k); - BasicBlock *found = newBlock("get.found"), *missing = newBlock("get.missing"), *end = newBlock("get.end"); - b.CreateCondBr(b.CreateICmpSGE(i, b.getInt64(0)), found, missing); - b.SetInsertPoint(found); - Value *v = b.CreateLoad(ty(vt), b.CreateStructGEP(ET, mapEntry(map, t, i), 2)); - v = copyValue(v, vt); - BasicBlock *foundEnd = b.GetInsertBlock(); - b.CreateBr(end); - b.SetInsertPoint(missing); - Value *d = own(coerce(exprWant(*m.args[1], vt), vt, m.args[1]->pos, "the default")); - BasicBlock *missingEnd = b.GetInsertBlock(); - b.CreateBr(end); - b.SetInsertPoint(end); - PHINode *phi = b.CreatePHI(ty(vt), 2); - phi->addIncoming(v, foundEnd); - phi->addIncoming(d, missingEnd); - return {phi, vt, false, owning(vt)}; - } - if (n == "remove") { // true if the key was there - need(1); - Value_ k = keyArg(); - Value *i = b.CreateCall(rt("finch_map_find"), mapArgs(map, tmp(k.v), t)); - release(k); - BasicBlock *hit = newBlock("remove.hit"), *end = newBlock("remove.end"); - Value *was = b.CreateICmpSGE(i, b.getInt64(0)); - b.CreateCondBr(was, hit, end); - b.SetInsertPoint(hit); - Value *entry = mapEntry(map, t, i); - dropAt(b.CreateStructGEP(ET, entry, 1), kt); - dropAt(b.CreateStructGEP(ET, entry, 2), vt); - b.CreateCall(rt("finch_map_remove_at"), {map, i, b.getInt64(dl->getTypeAllocSize(ET))}); - b.CreateBr(end); - b.SetInsertPoint(end); - return {was, FType::Bool}; - } - if (n == "clear") { - need(0); - if (owning(kt) || owning(vt)) - forEachEntry(map, t, [&](Value *, Value *entry) { - dropAt(b.CreateStructGEP(ET, entry, 1), kt); - dropAt(b.CreateStructGEP(ET, entry, 2), vt); - }); - b.CreateCall(rt("finch_map_clear"), {map}); - return {nullptr, FType::Void}; - } - if (n == "keys" || n == "values") { // a new array, in insertion order - need(0); - FType et = n == "keys" ? kt : vt; - unsigned field = n == "keys" ? 1 : 2; - FType at = FType::arrayOf(et); - Value *out = tmpOf(ty(at)); - Value *len = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ty(t), map, 1)); - b.CreateCall(rt("finch_arr_make"), {out, len, elemSize(et)}); - Value *data = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(ty(at), out, 0)); - Value *j = tmp(b.getInt64(0)); - forEachEntry(map, t, [&](Value *, Value *entry) { - Value *jv = b.CreateLoad(b.getInt64Ty(), j); - copyAt(b.CreateInBoundsGEP(ty(et), data, jv), b.CreateStructGEP(ET, entry, field), et); - b.CreateStore(b.CreateAdd(jv, b.getInt64(1)), j); - }); - return {b.CreateLoad(ty(at), out), at, false, true}; - } - failAt(p.file, p.line, p.col, "a map has no method '" + n + "' (it has: has, get, remove, clear, keys, values; and m[key], .len)"); -} - -} // namespace finch diff --git a/src/codegen_types.cpp b/src/codegen_types.cpp deleted file mode 100644 index 4879997..0000000 --- a/src/codegen_types.cpp +++ /dev/null @@ -1,580 +0,0 @@ -// Code generation, part 2: types, conversions, ownership (copy/drop) and printing. - -#include "codegen_impl.h" - -using namespace llvm; - -namespace finch { - -// ---------- types ---------- - -llvm::Type *Codegen::ty(const FType &t) { - switch (t.kind) { - case FType::Void: return b.getVoidTy(); - case FType::Bool: return b.getInt1Ty(); - case FType::Char: - case FType::I8: - case FType::U8: return b.getInt8Ty(); - case FType::I16: - case FType::U16: return b.getInt16Ty(); - case FType::I32: - case FType::U32: return b.getInt32Ty(); - case FType::I64: - case FType::U64: return b.getInt64Ty(); - case FType::F32: return b.getFloatTy(); - case FType::F64: return b.getDoubleTy(); - case FType::Str: - case FType::Array: return StructType::get(ctx, {b.getPtrTy(), b.getInt64Ty(), b.getInt64Ty()}); - case FType::Map: { - llvm::Type *P = b.getPtrTy(), *I = b.getInt64Ty(); - return StructType::get(ctx, {P, I, I, I, P, I, I}); // entries, len, used, cap, index, icap, adds - } - case FType::Ptr: - case FType::Null: return b.getPtrTy(); - case FType::Fixed: return ArrayType::get(ty(*t.elem), t.count); - case FType::Struct: return t.info->llvm; - case FType::Named: break; - } - std::fprintf(stderr, "internal compiler error: unresolved type %s\n", t.show().c_str()); - std::exit(2); -} - -FType Codegen::resolve(const FType &t, Pos p) { return resolveT(t, p, true); } - -StructInfo *Codegen::findStruct(const std::string &module, const std::string &name, bool qualified) { - if (qualified) { - if (module == "C") { - auto it = cStructs.find(name); - return it == cStructs.end() ? nullptr : it->second; - } - auto m = modules.find(module); - if (m == modules.end()) return nullptr; - auto it = m->second.structs.find(name); - return it == m->second.structs.end() ? nullptr : it->second; - } - auto &here = modules[curModule].structs; - if (auto it = here.find(name); it != here.end()) return it->second; - if (auto it = cStructs.find(name); it != cStructs.end()) return it->second; - return nullptr; -} - -FType Codegen::resolveT(const FType &t, Pos p, bool deep) { - switch (t.kind) { - case FType::Ptr: - if (!t.elem) return t; - return FType::ptrTo(resolveT(*t.elem, p, false)); - case FType::Array: return FType::arrayOf(resolveT(*t.elem, p, false)); - case FType::Map: { - FType k = resolveT(*t.key, p, true); - if (!k.isInt() && k.kind != FType::Char && k.kind != FType::Bool && k.kind != FType::Str) - failAt(p.file, p.line, p.col, "a map key must be a whole number, a char, a bool or a str, not " + k.show()); - FType v = resolveT(*t.elem, p, false); - if (v.kind == FType::Void) failAt(p.file, p.line, p.col, "a map value can't have the type 'nothing'"); - return FType::mapOf(k, v); - } - case FType::Fixed: { - FType f = t; - f.elem = std::make_shared(resolveT(*t.elem, p, deep)); - return f; - } - case FType::Named: { - bool qualified = !t.module.empty(); - if (qualified && t.module != "C" && !modules[curModule].imports.count(t.module)) - failAt(p.file, p.line, p.col, "'" + t.module + "' is not imported here (add: import " + t.module + ")"); - StructInfo *s = findStruct(t.module, t.name, qualified); - if (!s) failAt(p.file, p.line, p.col, "there is no type named '" + t.show() + "'"); - FType r(FType::Struct); - r.info = s; - r.name = s->name; - r.module = s->module == "C" ? "" : s->module; // shown as math.Vec; C and main-file structs by name - if (deep) resolveStruct(s); - return r; - } - default: return t; - } -} - -void Codegen::resolveStruct(StructInfo *s) { - if (s->state == 2) return; - if (s->state == 1) - failAt(s->pos.file, s->pos.line, s->pos.col, - "the struct " + s->name + " contains itself; use ptr[" + s->name + "] or []" + s->name + " for that field"); - s->state = 1; - std::string savedModule = curModule; - curModule = s->isC ? "" : s->module; - - std::vector elems; - if (!s->isC) { - for (const Field &f : s->decl->fields) { - StructInfo::F nf; - nf.name = f.name; - nf.type = resolveT(f.type, f.pos, true); - if (nf.type.kind == FType::Void) failAt(f.pos.file, f.pos.line, f.pos.col, "a field can't have the type 'nothing'"); - nf.init = f.init.get(); - nf.pos = f.namePos; - nf.llvmIndex = elems.size(); - elems.push_back(ty(nf.type)); - s->owning |= owning(nf.type); - s->fields.push_back(nf); - } - s->llvm->setBody(elems); - } else { - // Lay the C struct out byte for byte: explicit padding, packed, exactly C's offsets. - long long off = 0; - Pos none; - for (const CField &cf : s->cstruct->fields) { - if (cf.hidden || cf.offset < off) continue; - FType ft = resolveT(cf.type, none, true); - llvm::Type *lt = ty(ft); - long long size = dl->getTypeAllocSize(lt); - if (size != cf.size) continue; // something Finch can't mirror; the padding covers it - if (cf.offset > off) elems.push_back(ArrayType::get(b.getInt8Ty(), cf.offset - off)); - StructInfo::F nf; - nf.name = cf.name; - nf.type = ft; - nf.llvmIndex = elems.size(); - elems.push_back(lt); - s->fields.push_back(nf); - off = cf.offset + size; - } - if (s->cstruct->size > off) elems.push_back(ArrayType::get(b.getInt8Ty(), s->cstruct->size - off)); - s->llvm->setBody(elems, true); - if (s->cstruct->hasHidden && s->unsupported.empty()) s->unsupported = "has fields Finch can't see (unions or bit fields)"; - } - curModule = savedModule; - s->state = 2; -} - -bool Codegen::owning(const FType &t) { - switch (t.kind) { - case FType::Str: - case FType::Array: - case FType::Map: return true; - case FType::Struct: - resolveStruct(t.info); - return t.info->owning; - default: return false; - } -} - -Constant *Codegen::zero(const FType &t) { return Constant::getNullValue(ty(t)); } - -Value_ Codegen::defaultValue(const FType &t, Pos p) { - if (t.kind == FType::Struct && !t.info->isC) { - for (auto &f : t.info->fields) - if (f.init) return construct(t.info, {}, {}, p); - } - return {zero(t), t, false, owning(t)}; -} - -// Can every value of `from` be stored in `to`? (i8 -> i32 yes, i32 -> u32 no) -bool Codegen::widens(const FType &from, const FType &to) { - if (!from.isInt() || !to.isInt()) return false; - if (from.isSigned() && to.isUnsigned()) return false; - return to.bits() > from.bits(); -} - -// Does the constant number `c` (of type `from`) fit into `to`? -bool Codegen::fits(ConstantInt *c, const FType &from, const FType &to) { - if (!to.isInt()) return false; - bool negative = from.isSigned() && c->isNegative(); - if (negative && to.isUnsigned()) return false; - if (negative) return c->getSExtValue() >= -(1LL << (to.bits() - 1)); - unsigned long long v = c->getZExtValue(); - if (to.bits() == 64) return to.isUnsigned() || v <= (unsigned long long)INT64_MAX; - unsigned long long max = to.isUnsigned() ? (1ULL << to.bits()) - 1 : (1ULL << (to.bits() - 1)) - 1; - return v <= max; -} - -Value *Codegen::intCast(Value *v, const FType &from, const FType &to) { return b.CreateIntCast(v, ty(to), from.isSigned()); } - -Value *Codegen::intToFloat(Value *v, const FType &from, const FType &to) { - return from.isSigned() ? b.CreateSIToFP(v, ty(to)) : b.CreateUIToFP(v, ty(to)); -} - -// Implicit conversions: only the ones that can't surprise you. -Value_ Codegen::coerce(Value_ v, const FType &want, Pos p, const std::string &what) { - const FType &from = v.type; - if (from == want) return v; - if (from.kind == FType::Null && want.isPtr()) return {ConstantPointerNull::get(b.getPtrTy()), want}; - // any pointer fits an untyped `ptr`; an untyped ptr fits any pointer - if (want.isPtr() && from.isPtr() && (!want.elem || !from.elem)) return {v.v, want}; - - if (from.isInt() && want.isInt()) { - auto *c = v.literal ? dyn_cast(v.v) : nullptr; - if ((c && fits(c, from, want)) || widens(from, want)) return {intCast(v.v, from, want), want, (bool)c}; - if (c) - failAt(p.file, p.line, p.col, "the number " + std::to_string(from.isSigned() ? c->getSExtValue() : (long long)c->getZExtValue()) + - " doesn't fit in " + want.show()); - } - if (from.isInt() && want.isFloat()) return {intToFloat(v.v, from, want), want, v.literal}; - if (from.kind == FType::F32 && want.kind == FType::F64) return {b.CreateFPExt(v.v, ty(want)), want}; - if (from.kind == FType::F64 && want.kind == FType::F32 && v.literal) return {b.CreateFPTrunc(v.v, ty(want)), want, true}; - - std::string msg = what + " must be " + want.show() + ", but this is " + from.show(); - if (from.isNumber() && want.isNumber()) - msg += " (use " + want.show() + "(...) to convert" + (from.isFloat() && want.isInt() ? ", it cuts off the fraction)" : ")"); - else if (want.kind == FType::Str && (from.isNumber() || from.kind == FType::Bool || from.kind == FType::Char)) - msg += " (turn it into text with str(...))"; - else if (want.isPtr() && from.kind == FType::Str) - msg += " (use .ptr to get the text's address)"; - if (from.kind == FType::Null) msg = what + " can't be null (only pointers can)"; - failAt(p.file, p.line, p.col, msg); -} - -// ---------- ownership ---------- - -Value *Codegen::tmpOf(llvm::Type *t) { - Function *f = b.GetInsertBlock()->getParent(); - IRBuilder<> entry(&f->getEntryBlock(), f->getEntryBlock().begin()); - AllocaInst *a = entry.CreateAlloca(t); - if (t->isStructTy()) a->setAlignment(Align(16)); - return a; -} - -Value *Codegen::tmp(Value *v) { - Value *a = tmpOf(v->getType()); - b.CreateStore(v, a); - return a; -} - -Value *Codegen::own(const Value_ &v) { - if (!owning(v.type) || v.fresh) return v.v; - return copyValue(v.v, v.type); -} - -void Codegen::release(const Value_ &v) { - // constants (string literals, empty arrays) own no memory: nothing to free - if (v.fresh && v.v && !isa(v.v) && owning(v.type)) dropValue(v.v, v.type); -} - -Value *Codegen::copyValue(Value *v, const FType &t) { - if (!owning(t)) return v; - Value *out = tmpOf(ty(t)); - copyAt(out, tmp(v), t); - return b.CreateLoad(ty(t), out); -} - -void Codegen::dropValue(Value *v, const FType &t) { - if (owning(t)) dropAt(tmp(v), t); -} - -void Codegen::dropAt(Value *addr, const FType &t) { - if (!owning(t)) return; - if (t.kind == FType::Str) b.CreateCall(rt("finch_str_drop"), {addr}); - else b.CreateCall(dropFn(t), {addr}); -} - -void Codegen::copyAt(Value *dst, Value *src, const FType &t) { - if (!owning(t)) { - b.CreateStore(b.CreateLoad(ty(t), src), dst); - return; - } - if (t.kind == FType::Str) b.CreateCall(rt("finch_str_copy"), {dst, src}); - else b.CreateCall(copyFn(t), {dst, src}); -} - -void Codegen::forN(Value *n, const std::function &body) { - Value *i = tmpOf(b.getInt64Ty()); - b.CreateStore(b.getInt64(0), i); - BasicBlock *cond = newBlock("n.cond"), *loop = newBlock("n.body"), *end = newBlock("n.end"); - b.CreateBr(cond); - b.SetInsertPoint(cond); - Value *iv = b.CreateLoad(b.getInt64Ty(), i); - b.CreateCondBr(b.CreateICmpSLT(iv, n), loop, end); - b.SetInsertPoint(loop); - body(iv); - b.CreateStore(b.CreateAdd(iv, b.getInt64(1)), i); - b.CreateBr(cond); - b.SetInsertPoint(end); -} - -std::string Codegen::typeKey(const FType &t) { - switch (t.kind) { - case FType::Array: return "arr_" + typeKey(*t.elem); - case FType::Map: return "map_" + typeKey(*t.key) + "_" + typeKey(*t.elem); - case FType::Fixed: return "fix" + std::to_string(t.count) + "_" + typeKey(*t.elem); - case FType::Ptr: return "ptr"; - case FType::Struct: return "S_" + (t.info->module.empty() ? std::string("main") : t.info->module) + "_" + t.info->name; - default: return t.show(); - } -} - -// Helper functions are generated once per type and shared; they have no source position. -struct HelperScope { - Codegen &cg; - IRBuilderBase::InsertPointGuard guard; - DISubprogram *savedFn; - HelperScope(Codegen &c, Function *f) : cg(c), guard(c.b), savedFn(c.diFn) { - c.diFn = nullptr; - c.b.SetInsertPoint(BasicBlock::Create(c.ctx, "entry", f)); - c.b.SetCurrentDebugLocation(DebugLoc()); - } - ~HelperScope() { cg.diFn = savedFn; } -}; - -Function *Codegen::dropFn(const FType &t) { - std::string key = "drop." + typeKey(t); - if (auto it = helpers.find(key); it != helpers.end()) return it->second; - Function *f = Function::Create(FunctionType::get(b.getVoidTy(), {b.getPtrTy()}, false), Function::InternalLinkage, - "finch." + key, mod.get()); - helpers[key] = f; - HelperScope hs(*this, f); - Value *a = f->getArg(0); - if (t.kind == FType::Array) { - FType et = *t.elem; - if (owning(et)) { - Value *data = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(ty(t), a, 0)); - Value *len = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ty(t), a, 1)); - forN(len, [&](Value *i) { dropAt(b.CreateInBoundsGEP(ty(et), data, i), et); }); - } - b.CreateCall(rt("finch_arr_free"), {a}); - } else if (t.kind == FType::Map) { - FType kt = *t.key, vt = *t.elem; - if (owning(kt) || owning(vt)) - forEachEntry(a, t, [&](Value *, Value *entry) { - dropAt(b.CreateStructGEP(mapEntryTy(t), entry, 1), kt); - dropAt(b.CreateStructGEP(mapEntryTy(t), entry, 2), vt); - }); - b.CreateCall(rt("finch_map_free"), {a}); - } else if (t.kind == FType::Struct) { - for (auto &fl : t.info->fields) - if (owning(fl.type)) dropAt(b.CreateStructGEP(t.info->llvm, a, fl.llvmIndex), fl.type); - } - b.CreateRetVoid(); - return f; -} - -Function *Codegen::copyFn(const FType &t) { - std::string key = "copy." + typeKey(t); - if (auto it = helpers.find(key); it != helpers.end()) return it->second; - Function *f = Function::Create(FunctionType::get(b.getVoidTy(), {b.getPtrTy(), b.getPtrTy()}, false), - Function::InternalLinkage, "finch." + key, mod.get()); - helpers[key] = f; - HelperScope hs(*this, f); - Value *dst = f->getArg(0), *src = f->getArg(1); - if (t.kind == FType::Array) { - FType et = *t.elem; - b.CreateCall(rt("finch_arr_clone_raw"), {dst, src, elemSize(et)}); - if (owning(et)) { - Value *d = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(ty(t), dst, 0)); - Value *s = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(ty(t), src, 0)); - Value *len = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ty(t), src, 1)); - forN(len, [&](Value *i) { - copyAt(b.CreateInBoundsGEP(ty(et), d, i), b.CreateInBoundsGEP(ty(et), s, i), et); - }); - } - } else if (t.kind == FType::Map) { - StructType *ET = mapEntryTy(t); - FType kt = *t.key, vt = *t.elem; - b.CreateCall(rt("finch_map_clone_raw"), {dst, src, b.getInt64(dl->getTypeAllocSize(ET))}); - if (owning(kt) || owning(vt)) // the slots were copied byte for byte: now give the copy its own keys and values - forEachEntry(src, t, [&](Value *i, Value *from) { - Value *to = mapEntry(dst, t, i); - copyAt(b.CreateStructGEP(ET, to, 1), b.CreateStructGEP(ET, from, 1), kt); - copyAt(b.CreateStructGEP(ET, to, 2), b.CreateStructGEP(ET, from, 2), vt); - }); - } else if (t.kind == FType::Struct) { - b.CreateStore(b.CreateLoad(ty(t), src), dst); - for (auto &fl : t.info->fields) - if (owning(fl.type)) - copyAt(b.CreateStructGEP(t.info->llvm, dst, fl.llvmIndex), b.CreateStructGEP(t.info->llvm, src, fl.llvmIndex), fl.type); - } - b.CreateRetVoid(); - return f; -} - -// ---------- strings ---------- - -Value *Codegen::strConst(const std::string &s) { - Constant *g = b.CreateGlobalString(s, "str"); - return ConstantStruct::get(cast(ty(FType::Str)), {g, b.getInt64(s.size()), b.getInt64(0)}); -} - -// str -> char* for C (an empty str may have no memory at all; C gets "" then) -Value *Codegen::cstr(Value *s) { - Value *p = b.CreateExtractValue(s, 0); - return b.CreateSelect(b.CreateIsNull(p), b.CreateGlobalString("", "empty"), p); -} - -Value_ Codegen::strFromC(Value *p) { - Value *out = tmpOf(ty(FType::Str)); - b.CreateCall(rt("finch_str_from_c"), {out, p}); - return {b.CreateLoad(ty(FType::Str), out), FType::Str}; -} - -Value *Codegen::elemSize(const FType &t) { return b.getInt64(dl->getTypeAllocSize(ty(t))); } - -// ---------- printing ---------- - -void Codegen::printf_(const std::string &fmt, std::vector args) { - args.insert(args.begin(), b.CreateGlobalString(fmt, "fmt")); - b.CreateCall(libc("printf", b.getInt32Ty(), {b.getPtrTy()}, true), args); -} - -void Codegen::emitPrint(Value *v, const FType &t, bool quoted) { - if (t.isSigned()) printf_("%lld", {b.CreateSExt(v, b.getInt64Ty())}); - else if (t.isUnsigned()) printf_("%llu", {b.CreateZExt(v, b.getInt64Ty())}); - else if (t.isFloat()) printf_("%g", {b.CreateFPExt(v, b.getDoubleTy())}); - else if (t.kind == FType::Char) printf_(quoted ? "'%c'" : "%c", {b.CreateZExt(v, b.getInt32Ty())}); - else if (t.kind == FType::Bool) printf_("%s", {b.CreateSelect(v, b.CreateGlobalString("true", "true"), b.CreateGlobalString("false", "false"))}); - else if (t.kind == FType::Str) - printf_(quoted ? "\"%.*s\"" : "%.*s", {b.CreateTrunc(b.CreateExtractValue(v, 1), b.getInt32Ty()), cstr(v)}); - else { // pointers, arrays, maps, structs: built as text first (the same text str(x) gives) - Value *buf = tmp(zero(FType::Str)); - emitFormat(buf, v, t, quoted); - b.CreateCall(rt("finch_buf_print"), {buf}); - } -} - -void Codegen::bufText(Value *buf, const std::string &text) { - b.CreateCall(rt("finch_buf_add"), {buf, b.CreateGlobalString(text, "txt"), b.getInt64(text.size())}); -} - -void Codegen::emitFormat(Value *buf, Value *v, const FType &t, bool quoted) { - if (t.isSigned()) b.CreateCall(rt("finch_buf_int"), {buf, b.CreateSExt(v, b.getInt64Ty())}); - else if (t.isUnsigned()) b.CreateCall(rt("finch_buf_uint"), {buf, b.CreateZExt(v, b.getInt64Ty())}); - else if (t.isFloat()) b.CreateCall(rt("finch_buf_float"), {buf, b.CreateFPExt(v, b.getDoubleTy())}); - else if (t.kind == FType::Char) b.CreateCall(rt("finch_buf_char"), {buf, v, b.getInt32(quoted)}); - else if (t.kind == FType::Bool) b.CreateCall(rt("finch_buf_bool"), {buf, b.CreateZExt(v, b.getInt32Ty())}); - else if (t.kind == FType::Str) b.CreateCall(rt("finch_buf_str"), {buf, tmp(v), b.getInt32(quoted)}); - else if (t.isPtr() || t.kind == FType::Null) b.CreateCall(rt("finch_buf_ptr"), {buf, v}); // the same everywhere: null or 0x... - else b.CreateCall(formatFn(t), {buf, tmp(v)}); -} - -// One function per array / map / struct type: (str *buf, T *value) -Function *Codegen::formatFn(const FType &t) { - std::string key = "format." + typeKey(t); - if (auto it = helpers.find(key); it != helpers.end()) return it->second; - Function *f = Function::Create(FunctionType::get(b.getVoidTy(), {b.getPtrTy(), b.getPtrTy()}, false), - Function::InternalLinkage, "finch." + key, mod.get()); - helpers[key] = f; - HelperScope hs(*this, f); - Value *buf = f->getArg(0), *a = f->getArg(1); - if (t.kind == FType::Array || t.kind == FType::Fixed) { - FType et = *t.elem; - Value *data, *len; - if (t.kind == FType::Fixed) { - data = a; - len = b.getInt64(t.count); - } else { - data = b.CreateLoad(b.getPtrTy(), b.CreateStructGEP(ty(t), a, 0)); - len = b.CreateLoad(b.getInt64Ty(), b.CreateStructGEP(ty(t), a, 1)); - } - bufText(buf, "["); - forN(len, [&](Value *i) { - BasicBlock *sep = newBlock("sep"), *item = newBlock("item"); - b.CreateCondBr(b.CreateICmpSGT(i, b.getInt64(0)), sep, item); - b.SetInsertPoint(sep); - bufText(buf, ", "); - b.CreateBr(item); - b.SetInsertPoint(item); - emitFormat(buf, b.CreateLoad(ty(et), b.CreateInBoundsGEP(ty(et), data, i)), et, true); - }); - bufText(buf, "]"); - } else if (t.kind == FType::Map) { // {"a": 1, "b": 2} - StructType *ET = mapEntryTy(t); - Value *firstItem = tmp(b.getInt1(true)); - bufText(buf, "{"); - forEachEntry(a, t, [&](Value *, Value *entry) { - BasicBlock *sep = newBlock("sep"), *item = newBlock("item"); - b.CreateCondBr(b.CreateLoad(b.getInt1Ty(), firstItem), item, sep); - b.SetInsertPoint(sep); - bufText(buf, ", "); - b.CreateBr(item); - b.SetInsertPoint(item); - b.CreateStore(b.getInt1(false), firstItem); - emitFormat(buf, b.CreateLoad(ty(*t.key), b.CreateStructGEP(ET, entry, 1)), *t.key, true); - bufText(buf, ": "); - emitFormat(buf, b.CreateLoad(ty(*t.elem), b.CreateStructGEP(ET, entry, 2)), *t.elem, true); - }); - bufText(buf, "}"); - } else if (t.kind == FType::Struct) { - bufText(buf, t.info->name + "("); - bool first = true; - for (auto &fl : t.info->fields) { - if (fl.hidden) continue; - bufText(buf, (first ? "" : ", ") + fl.name + ": "); - first = false; - emitFormat(buf, b.CreateLoad(ty(fl.type), b.CreateStructGEP(t.info->llvm, a, fl.llvmIndex)), fl.type, true); - } - bufText(buf, ")"); - } - b.CreateRetVoid(); - return f; -} - -// ---------- debug info ---------- - -DIType *Codegen::diType(const FType &t) { - std::string key = typeKey(t); - if (auto it = diTypes.find(key); it != diTypes.end()) return it->second; - DIType *d = nullptr; - auto basic = [&](const char *n, unsigned bits, unsigned enc) { return di->createBasicType(n, bits, enc); }; - switch (t.kind) { - case FType::Void: return nullptr; - case FType::Bool: d = basic("bool", 8, dwarf::DW_ATE_boolean); break; - case FType::Char: d = basic("char", 8, dwarf::DW_ATE_signed_char); break; - case FType::I8: d = basic("i8", 8, dwarf::DW_ATE_signed); break; - case FType::I16: d = basic("i16", 16, dwarf::DW_ATE_signed); break; - case FType::I32: d = basic("i32", 32, dwarf::DW_ATE_signed); break; - case FType::I64: d = basic("int", 64, dwarf::DW_ATE_signed); break; - case FType::U8: d = basic("u8", 8, dwarf::DW_ATE_unsigned); break; - case FType::U16: d = basic("u16", 16, dwarf::DW_ATE_unsigned); break; - case FType::U32: d = basic("u32", 32, dwarf::DW_ATE_unsigned); break; - case FType::U64: d = basic("u64", 64, dwarf::DW_ATE_unsigned); break; - case FType::F32: d = basic("f32", 32, dwarf::DW_ATE_float); break; - case FType::F64: d = basic("float", 64, dwarf::DW_ATE_float); break; - case FType::Ptr: - case FType::Null: d = di->createPointerType(t.elem ? diType(*t.elem) : nullptr, 64, 0, std::nullopt, t.show()); break; - case FType::Fixed: - d = di->createArrayType(t.count * (uint64_t)dl->getTypeAllocSizeInBits(ty(*t.elem)), 0, diType(*t.elem), - di->getOrCreateArray({di->getOrCreateSubrange(0, t.count)})); - break; - case FType::Str: - case FType::Array: { - DIType *et = t.kind == FType::Str ? diType(FType::Char) : diType(*t.elem); - DIType *pt = di->createPointerType(et, 64); - DIType *i64 = diType(FType::I64); - DIFile *f = diFiles[0]; - Metadata *els[] = {di->createMemberType(diUnit, "ptr", f, 0, 64, 64, 0, DINode::FlagZero, pt), - di->createMemberType(diUnit, "len", f, 0, 64, 64, 64, DINode::FlagZero, i64), - di->createMemberType(diUnit, "cap", f, 0, 64, 64, 128, DINode::FlagZero, i64)}; - d = di->createStructType(diUnit, t.show(), f, 0, 192, 64, DINode::FlagZero, nullptr, di->getOrCreateArray(els)); - break; - } - case FType::Map: { // shown by its parts; the entries are behind `entries` - DIType *i64 = diType(FType::I64), *pt = di->createPointerType(nullptr, 64); - DIFile *f = diFiles[0]; - const char *names[] = {"entries", "len", "used", "cap", "index", "icap", "adds"}; - std::vector els; - for (unsigned k = 0; k < 7; k++) - els.push_back(di->createMemberType(diUnit, names[k], f, 0, 64, 64, 64 * k, DINode::FlagZero, k == 0 || k == 4 ? pt : i64)); - d = di->createStructType(diUnit, t.show(), f, 0, 448, 64, DINode::FlagZero, nullptr, di->getOrCreateArray(els)); - break; - } - case FType::Struct: { - StructInfo *s = t.info; - DIFile *f = s->isC ? diFiles[0] : diFiles[s->pos.file]; - auto *fwd = di->createReplaceableCompositeType(dwarf::DW_TAG_structure_type, s->name, diUnit, f, s->pos.line); - diTypes[key] = fwd; - const StructLayout *lay = dl->getStructLayout(s->llvm); - std::vector els; - for (auto &fl : s->fields) { - uint64_t bits = dl->getTypeAllocSizeInBits(ty(fl.type)); - els.push_back(di->createMemberType(diUnit, fl.name, f, s->pos.line, bits, 8, lay->getElementOffsetInBits(fl.llvmIndex), - DINode::FlagZero, diType(fl.type))); - } - DICompositeType *real = di->createStructType(diUnit, s->name, f, s->pos.line, lay->getSizeInBits(), 8, - DINode::FlagZero, nullptr, di->getOrCreateArray(els)); - di->replaceTemporary(TempDIType(fwd), real); - d = real; - break; - } - case FType::Named: return nullptr; - } - diTypes[key] = d; - return d; -} - -} // namespace finch diff --git a/src/error.h b/src/error.h deleted file mode 100644 index c848f0c..0000000 --- a/src/error.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -// Every source file the compiler has read; positions point into this list. -struct SourceFile { - std::string path; - std::string text; -}; -inline std::vector g_files; -inline int g_curFile = 0; // the file the lexer/parser is working on - -// The language server needs errors as values: it shows them in the editor and keeps running. -struct FinchError { - int file, line, col; - std::string msg; -}; -inline bool g_throwErrors = false; - -// Finch stops at the first error and shows exactly where it is. -[[noreturn]] inline void failAt(int file, int line, int col, const std::string &msg) { - if (g_throwErrors) throw FinchError{file, line, col, msg}; - const SourceFile &f = g_files.at(file); - std::fprintf(stderr, "%s:%d:%d: error: %s\n", f.path.c_str(), line, col, msg.c_str()); - - size_t start = 0; - for (int l = 1; l < line && start != std::string::npos; l++) { - start = f.text.find('\n', start); - if (start != std::string::npos) start++; - } - if (line > 0 && start != std::string::npos && start < f.text.size()) { - std::string text = f.text.substr(start, f.text.find('\n', start) - start); - std::string pad; - int c = 1; // columns count characters; skip UTF-8 continuation bytes - for (size_t k = 0; k < text.size() && c < col; k++) { - if (((unsigned char)text[k] & 0xC0) == 0x80) continue; - pad += text[k] == '\t' ? '\t' : ' '; - c++; - } - std::fprintf(stderr, "%5d | %s\n | %s^\n", line, text.c_str(), pad.c_str()); - } - std::exit(1); -} - -[[noreturn]] inline void fail(int line, int col, const std::string &msg) { failAt(g_curFile, line, col, msg); } diff --git a/boot/gen.fch b/src/gen.fch similarity index 98% rename from boot/gen.fch rename to src/gen.fch index c694f03..25070d6 100644 --- a/boot/gen.fch +++ b/src/gen.fch @@ -362,7 +362,15 @@ fn resolve(ptr[Gen] g, ast.Type t, ast.Node at) -> ast.Type { return ast.arrayOf(resolve(g, t.elem[0], at)) } if t.kind == "map" { - return ast.mapOf(resolve(g, t.elem[0], at), resolve(g, t.elem[1], at)) + key := resolve(g, t.elem[0], at) + if !isInt(key) && key.kind != "char" && key.kind != "bool" && key.kind != "str" && key.kind != "enum" { + fail(g, at, "a map key must be a whole number, a char, a bool or a str, not " + ast.show(key)) + } + value := resolve(g, t.elem[1], at) + if value.kind == "void" { + fail(g, at, "a map value can't have the type 'nothing'") + } + return ast.mapOf(key, value) } if t.kind == "fixed" { out := ast.Type(kind: "fixed", count: t.count) @@ -2917,6 +2925,18 @@ fn badOperands(ptr[Gen] g, str o, Val l, Val r, ast.Node at) { if o == "+" && (l.ty.kind == "str" || r.ty.kind == "str") { msg = msg + " (turn the other side into text first: str(...))" } + if (o == "&" || o == "|") && l.ty.kind == "bool" { + if o == "&" { + msg = msg + " (for true/false use '&&')" + } else { + msg = msg + " (for true/false use '||')" + } + } else if o == "&" || o == "|" || o == "^" || o == "<<" || o == ">>" { + msg = msg + " (bit operators work on whole numbers only)" + } + if (l.ty.kind == "struct" || l.ty.kind == "array") && (o == "==" || o == "!=") { + msg = msg + " (compare the parts one by one)" + } fail(g, at, msg) } @@ -3015,6 +3035,9 @@ fn arith(ptr[Gen] g, str o, Val l, Val r, ast.Node at) -> Val { fn compare(ptr[Gen] g, str o, Val l, Val r, ast.Node at) -> Val { eq := o == "==" || o == "!=" if l.ty.kind == "ptr" || r.ty.kind == "ptr" || l.ty.kind == "null" || r.ty.kind == "null" { + if l.ty.kind == "str" || r.ty.kind == "str" { + fail(g, at, "a str is never null; to check for empty text use s.len == 0") + } if !eq { badOperands(g, o, l, r, at) } @@ -4125,6 +4148,19 @@ fn runtimeDeclares(str name) -> bool { return ["printf", "fflush", "exit", "free", "qsort"].contains(name) } +// Help people who forgot an import. +fn headerHint(str name) -> str { + names := ["printf", "puts", "putchar", "scanf", "fopen", "getchar", "sqrt", "pow", "sin", "cos", "floor", "fabs", "malloc", "rand", "srand", + "abs", "atoi", "strlen", "strcpy", "memcpy", "time", "sleep", "usleep"] + headers := ["stdio.h", "stdio.h", "stdio.h", "stdio.h", "stdio.h", "stdio.h", "math.h", "math.h", "math.h", "math.h", "math.h", "math.h", + "stdlib.h", "stdlib.h", "stdlib.h", "stdlib.h", "stdlib.h", "string.h", "string.h", "string.h", "time.h", "unistd.h", "unistd.h"] + k := names.find(name) + if k < 0 { + return "" + } + return " (it's from C: add import \"" + headers[k] + "\" at the top)" +} + fn call(ptr[Gen] g, ast.Node c) -> Val { n := c.name if n == "error" { @@ -4285,7 +4321,7 @@ fn call(ptr[Gen] g, ast.Node c) -> Val { checkArgs(g, c, 0, 1, n) v := expr(g, c.kids[0]) if v.ty.kind != "ptr" { - fail(g, c.kids[0], "free(...) is only for pointers from new(...)") + fail(g, c.kids[0], "free(...) is only for pointers from new(...) or C; arrays, str and structs are freed by Finch at the end of their block") } emit(g, "call void @free(ptr " + v.v + ")") return Val(ty: T("void")) @@ -4331,7 +4367,7 @@ fn call(ptr[Gen] g, ast.Node c) -> Val { if lookup(g, n) >= 0 { fail(g, c, "'" + n + "' is a variable, not a function") } - fail(g, c, "there is no function named '" + n + "'") + fail(g, c, "there is no function named '" + n + "'" + headerHint(n)) return Val() } @@ -4541,7 +4577,16 @@ fn method(ptr[Gen] g, ast.Node m) -> Val { } } if fi < 0 { - fail(g, m, "the " + st.kind + " " + ast.show(st) + " has no method '" + m.name + "'") + []str have + for sg in g.sigs { + if sg.recv == st.name && sg.recvmod == st.module { + have.push(sg.name) + } + } + if have.len == 0 { + fail(g, m, "the " + st.kind + " " + ast.show(st) + " has no methods; add one with fn " + st.name + "." + m.name + "(...) { ... }") + } + fail(g, m, "the " + st.kind + " " + ast.show(st) + " has no method '" + m.name + "' (it has: " + have.join(", ") + ")") } // a method that changes self can't be called on a temporary or a read-only value if g.sigs[fi].mutself && (t.kind == "struct" || t.kind == "enum") { diff --git a/src/index.h b/src/index.h deleted file mode 100644 index 9e12b25..0000000 --- a/src/index.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -// What the compiler learns about a program while checking it, for the language server: -// what each name is, its type, and where it was defined. - -#include -#include - -struct SymRef { // a name in the source - int file, line, col, len; - std::string hover; // markdown shown on mouse-over - int defFile = -1, defLine = 0, defCol = 0; -}; - -struct VarInfo { // a variable or parameter, for completion - std::string name, type; - int file, line, col; - int fnFile, fnLine, fnEnd; // the function it lives in -}; - -struct FnInfo { - std::string module, name, signature, doc; - std::vector params; - int file, line, col, endLine; -}; - -struct StructIndex { - std::string module, name; - std::vector> fields; // name, type - int file, line, col; -}; - -struct SemIndex { - std::vector refs; - std::vector vars; - std::vector fns; - std::vector structs; -}; - -inline SemIndex *g_index = nullptr; // set by the language server; null when compiling diff --git a/src/lexer.cpp b/src/lexer.cpp deleted file mode 100644 index ffe367f..0000000 --- a/src/lexer.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include "lexer.h" -#include "error.h" - -#include -#include - -static const std::unordered_map keywords = { - {"fn", Tok::Fn}, {"return", Tok::Return}, {"if", Tok::If}, - {"else", Tok::Else}, {"while", Tok::While}, {"for", Tok::For}, - {"in", Tok::In}, {"break", Tok::Break}, {"continue", Tok::Continue}, - {"true", Tok::True}, {"false", Tok::False}, {"null", Tok::Null}, - {"import", Tok::Import}, {"link", Tok::Link}, {"struct", Tok::Struct}, - {"defer", Tok::Defer}, {"or", Tok::OrElse}, {"try", Tok::Try}, -}; - -std::vector lex(int file) { - g_curFile = file; - const std::string &src = g_files[file].text; - std::vector out; - size_t i = 0; - int line = 1, col = 1; - bool newline = true; - - auto advance = [&]() { - if (src[i] == '\n') { line++; col = 1; newline = true; } - else if (((unsigned char)src[i] & 0xC0) != 0x80) col++; // count characters, not UTF-8 bytes - i++; - }; - auto peek = [&](size_t off = 0) -> char { - return i + off < src.size() ? src[i + off] : '\0'; - }; - - while (i < src.size()) { - char c = src[i]; - - if (std::isspace((unsigned char)c)) { advance(); continue; } - if (c == '/' && peek(1) == '/') { - while (i < src.size() && src[i] != '\n') advance(); - continue; - } - if (c == '/' && peek(1) == '*') { - int l = line, cl = col; - advance(); advance(); - while (i < src.size() && !(src[i] == '*' && peek(1) == '/')) advance(); - if (i >= src.size()) fail(l, cl, "comment is never closed (missing */)"); - advance(); advance(); - continue; - } - - Token t{Tok::End, "", line, col, newline}; - newline = false; - - if (std::isalpha((unsigned char)c) || c == '_') { - size_t start = i; - while (std::isalnum((unsigned char)peek()) || peek() == '_') advance(); - t.text = src.substr(start, i - start); - auto kw = keywords.find(t.text); - t.kind = kw != keywords.end() ? kw->second : Tok::Ident; - } else if (std::isdigit((unsigned char)c)) { - size_t start = i; - t.kind = Tok::Int; - if (c == '0' && (peek(1) == 'x' || peek(1) == 'X')) { // 0xFF - advance(); advance(); - while (std::isxdigit((unsigned char)peek()) || peek() == '_') advance(); - if (i - start == 2) fail(t.line, t.col, "'0x' needs hex digits after it, like 0xFF"); - } else { - while (std::isdigit((unsigned char)peek()) || peek() == '_') advance(); - // "1..5" is a range, not the float "1." - if (peek() == '.' && std::isdigit((unsigned char)peek(1))) { - t.kind = Tok::Float; - advance(); - while (std::isdigit((unsigned char)peek()) || peek() == '_') advance(); - } - } - for (size_t k = start; k < i; k++) - if (src[k] != '_') t.text += src[k]; - } else if (c == '"' || c == '\'') { - char quote = c; - t.kind = quote == '"' ? Tok::String : Tok::Char; - advance(); - while (peek() != quote) { - if (peek() == '\0' || peek() == '\n') - fail(t.line, t.col, quote == '"' ? "string is never closed (missing \")" - : "char is never closed (missing ')"); - char ch = peek(); - advance(); - if (ch == '\\') { - char e = peek(); - advance(); - switch (e) { - case 'n': ch = '\n'; break; - case 't': ch = '\t'; break; - case 'r': ch = '\r'; break; - case '0': ch = '\0'; break; - case '\\': ch = '\\'; break; - case '"': ch = '"'; break; - case '\'': ch = '\''; break; - default: fail(line, col - 1, std::string("unknown escape \\") + e); - } - } - t.text += ch; - } - advance(); - if (t.kind == Tok::Char && t.text.size() != 1) - fail(t.line, t.col, "a char holds exactly one character, like 'a'"); - } else { - char n = peek(1); - auto two = [&](Tok k) { t.kind = k; advance(); advance(); }; - auto one = [&](Tok k) { t.kind = k; advance(); }; - switch (c) { - case '(': one(Tok::LParen); break; - case ')': one(Tok::RParen); break; - case '{': one(Tok::LBrace); break; - case '}': one(Tok::RBrace); break; - case '[': one(Tok::LBracket); break; - case ']': one(Tok::RBracket); break; - case ',': one(Tok::Comma); break; - case '%': n == '=' ? two(Tok::PercentEq) : one(Tok::Percent); break; - case '^': one(Tok::Caret); break; - case '~': one(Tok::Tilde); break; - case '.': n == '.' ? two(Tok::DotDot) : one(Tok::Dot); break; - case '+': n == '=' ? two(Tok::PlusEq) : one(Tok::Plus); break; - case '-': n == '=' ? two(Tok::MinusEq) : n == '>' ? two(Tok::Arrow) : one(Tok::Minus); break; - case '*': n == '=' ? two(Tok::StarEq) : one(Tok::Star); break; - case '/': n == '=' ? two(Tok::SlashEq) : one(Tok::Slash); break; - case '=': n == '=' ? two(Tok::Eq) : one(Tok::Assign); break; - case '!': n == '=' ? two(Tok::NotEq) : one(Tok::Not); break; - case '<': n == '=' ? two(Tok::LessEq) : n == '<' ? two(Tok::Shl) : one(Tok::Less); break; - case '>': n == '=' ? two(Tok::GreaterEq) : n == '>' ? two(Tok::Shr) : one(Tok::Greater); break; - case ':': n == '=' ? two(Tok::Declare) : one(Tok::Colon); break; - case '&': n == '&' ? two(Tok::And) : one(Tok::Amp); break; - case '|': n == '|' ? two(Tok::Or) : one(Tok::Pipe); break; - default: { - // show the whole UTF-8 character, not just its first byte - size_t len = (c & 0xE0) == 0xC0 ? 2 : (c & 0xF0) == 0xE0 ? 3 : (c & 0xF8) == 0xF0 ? 4 : 1; - std::string ch = src.substr(i, len); - std::string hint = (unsigned char)c >= 0x80 ? " (names use only a-z, A-Z, 0-9 and _; other letters only go inside \"text\")" : ""; - fail(line, col, "unexpected character '" + ch + "'" + hint); - } - } - } - out.push_back(t); - } - out.push_back({Tok::End, "", line, col, true}); - return out; -} - -const char *tokName(Tok t) { - switch (t) { - case Tok::End: return "end of file"; - case Tok::Ident: return "a name"; - case Tok::Int: return "a number"; - case Tok::Float: return "a number"; - case Tok::String: return "a string"; - case Tok::Char: return "a char"; - case Tok::Fn: return "'fn'"; - case Tok::Return: return "'return'"; - case Tok::If: return "'if'"; - case Tok::Else: return "'else'"; - case Tok::While: return "'while'"; - case Tok::For: return "'for'"; - case Tok::In: return "'in'"; - case Tok::Break: return "'break'"; - case Tok::Continue: return "'continue'"; - case Tok::True: return "'true'"; - case Tok::False: return "'false'"; - case Tok::Null: return "'null'"; - case Tok::Import: return "'import'"; - case Tok::Link: return "'link'"; - case Tok::Struct: return "'struct'"; - case Tok::Defer: return "'defer'"; - case Tok::OrElse: return "'or'"; - case Tok::Try: return "'try'"; - case Tok::Colon: return "':'"; - case Tok::LParen: return "'('"; - case Tok::RParen: return "')'"; - case Tok::LBrace: return "'{'"; - case Tok::RBrace: return "'}'"; - case Tok::LBracket: return "'['"; - case Tok::RBracket: return "']'"; - case Tok::Comma: return "','"; - case Tok::Dot: return "'.'"; - case Tok::Arrow: return "'->'"; - case Tok::DotDot: return "'..'"; - case Tok::Plus: return "'+'"; - case Tok::Minus: return "'-'"; - case Tok::Star: return "'*'"; - case Tok::Slash: return "'/'"; - case Tok::Percent: return "'%'"; - case Tok::Amp: return "'&'"; - case Tok::Pipe: return "'|'"; - case Tok::Caret: return "'^'"; - case Tok::Tilde: return "'~'"; - case Tok::Shl: return "'<<'"; - case Tok::Shr: return "'>>'"; - case Tok::PercentEq: return "'%='"; - case Tok::Assign: return "'='"; - case Tok::Declare: return "':='"; - case Tok::PlusEq: return "'+='"; - case Tok::MinusEq: return "'-='"; - case Tok::StarEq: return "'*='"; - case Tok::SlashEq: return "'/='"; - case Tok::Eq: return "'=='"; - case Tok::NotEq: return "'!='"; - case Tok::Less: return "'<'"; - case Tok::LessEq: return "'<='"; - case Tok::Greater: return "'>'"; - case Tok::GreaterEq: return "'>='"; - case Tok::And: return "'&&'"; - case Tok::Or: return "'||'"; - case Tok::Not: return "'!'"; - } - return "?"; -} diff --git a/boot/lexer.fch b/src/lexer.fch similarity index 91% rename from boot/lexer.fch rename to src/lexer.fch index 2e661bc..5fbb2ee 100644 --- a/boot/lexer.fch +++ b/src/lexer.fch @@ -195,7 +195,20 @@ fn lex(str src, str path) -> []Token { } else { op := operator(lx) if op.len == 0 { - fail(lx, t.line, t.col, "unexpected character '" + str(c) + "'") + // show the whole UTF-8 character, not just its first byte + n := 1 + if (int(c) & 0xE0) == 0xC0 { + n = 2 + } else if (int(c) & 0xF0) == 0xE0 { + n = 3 + } else if (int(c) & 0xF8) == 0xF0 { + n = 4 + } + hint := "" + if int(c) >= 0x80 { + hint = " (names use only a-z, A-Z, 0-9 and _; other letters only go inside \"text\")" + } + fail(lx, t.line, t.col, "unexpected character '" + lx.src.sub(lx.i, lx.i + n) + "'" + hint) } for k in 0..op.len { advance(lx) diff --git a/src/lexer.h b/src/lexer.h deleted file mode 100644 index 23761b8..0000000 --- a/src/lexer.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include -#include - -enum class Tok { - End, - Ident, Int, Float, String, Char, - - // keywords - Fn, Return, If, Else, While, For, In, Break, Continue, True, False, Null, Import, Link, Struct, Defer, - OrElse, Try, // or, try - - // punctuation - LParen, RParen, LBrace, RBrace, LBracket, RBracket, Comma, Colon, Dot, DotDot, Arrow, - - // operators - Plus, Minus, Star, Slash, Percent, - Amp, Pipe, Caret, Tilde, Shl, Shr, // & | ^ ~ << >> - Assign, Declare, // = := - PlusEq, MinusEq, StarEq, SlashEq, PercentEq, // += -= *= /= %= - Eq, NotEq, Less, LessEq, Greater, GreaterEq, - And, Or, Not, -}; - -struct Token { - Tok kind; - std::string text; - int line; - int col; - bool newlineBefore; // token starts a new line: ends the previous statement -}; - -// Lexes g_files[file].text. -std::vector lex(int file); -const char *tokName(Tok t); diff --git a/src/linker.fch b/src/linker.fch new file mode 100644 index 0000000..571c96b --- /dev/null +++ b/src/linker.fch @@ -0,0 +1,304 @@ +// From LLVM IR to a program: compile the IR, add the runtime (compiled once and kept), link the C libraries +// and C files the program asks for, and turn the linker's complaints into something a person can act on. +import platform +import cimport +import "stdlib.h" +import "unistd.h" + +// 32-bit FNV-1a, as hex: names the cached runtime object after what it was built from +fn fingerprint(str text) -> str { + u32 h = 2166136261 + for c in text { + h = (h ^ u32(c)) * 16777619 + } + digits := "0123456789abcdef" + []str parts + for k in 0..8 { + parts.push(str(digits[int((h >> u32(28 - 4 * k)) & 15)])) + } + return parts.join("") +} + +fn quote(str a) -> str { + return "'" + a.replace("'", "'\\''") + "'" +} + +// where files that are made once and kept go: ~/.cache/finch +fn cacheDir() -> str { + x := getenv("XDG_CACHE_HOME") + if x.len > 0 { + return x + "/finch" + } + h := getenv("HOME") + if h.len > 0 { + return h + "/.cache/finch" + } + return "/tmp/finch-cache" +} + +// "-lname", or whatever pkg-config says the library needs +fn libFlags(str name, platform.Target tg) -> str { + if name.ends_with(".framework") { + return "-framework " + quote(name.sub(0, name.len - 10)) // macOS: link "Cocoa.framework" + } + if !tg.cross { + tmp := "/tmp/finch_pkg_flags.txt" + code := shell("pkg-config --libs " + quote(name) + " > '" + tmp + "' 2> /dev/null") + if code == 0 && file_exists(tmp) { + flags := (read_file(tmp) or "").trim() + shell("rm -f '" + tmp + "'") + if flags.len > 0 { + return flags + } + } + } + return quote("-l" + name) +} + +// "GLFW/glfw3.h" -> "glfw": a decent first guess for the library's name +fn guessLib(str header) -> str { + name := header + slash := name.find("/") + while slash >= 0 { + name = name.sub(slash + 1, name.len) + slash = name.find("/") + } + dot := name.len + for i in 0..name.len { + if name[i] == '.' { + dot = i + } + } + name = name.sub(0, dot) + while name.len > 0 && name[name.len - 1] >= '0' && name[name.len - 1] <= '9' { + name = name.sub(0, name.len - 1) + } + return name.lower() +} + +struct Names { + []str items +} + +fn Names.add(str x) { + if x.len > 0 && !self.items.contains(x) { + self.items.push(x) + } +} + +// the text after `marker` up to the next one of `stops` +fn between(str line, str marker, str stops) -> str { + a := line.find(marker) + if a < 0 { + return "" + } + rest := line.sub(a + marker.len, line.len) + n := 0 + while n < rest.len && !stops.contains(str(rest[n])) { + n += 1 + } + return rest.sub(0, n) +} + +// The linker speaks in riddles; say what is missing and what to write. +fn linkFailed(str output, cimport.CImports ci, platform.Target tg) -> int { + missing := Names() + libs := Names() + for line in output.split("\n") { + l := line.trim() + if l.contains("undefined reference to `") { + missing.add(between(l, "undefined reference to `", "'")) + } else if l.contains("undefined symbol: ") { + missing.add(between(l, "undefined symbol: ", " \n")) + } else if l.contains("unresolved external symbol ") { + missing.add(between(l, "unresolved external symbol ", " \n\r")) + } else if l.contains("cannot find -l") { + libs.add(between(l, "cannot find -l", ": \n\r")) + } else if l.contains("library not found for -l") { + libs.add(between(l, "library not found for -l", ": \n\r")) + } else if l.contains("ld: library '") { + libs.add(between(l, "ld: library '", "'")) + } else if l.contains("framework '") && l.contains("not found") { + libs.add(between(l, "framework '", "'") + ".framework") + } else if l.starts_with("\"") && l.contains("\", referenced from:") { + // Apple ld: "_name", referenced from: + name := l.sub(1, l.find("\", referenced from:")) + if tg.darwin && name.starts_with("_") { + name = name.sub(1, name.len) + } + missing.add(name) + } + } + if missing.items.len == 0 && libs.items.len == 0 { + print(output + "error: linking failed") + return 1 + } + for lib in libs.items { + print("error: the library '" + lib + "' wasn't found. Is it installed? (on Nix: add it to shell.nix)") + } + // the missing functions, grouped by the header they came from + []str headers + []Names byHeader + for name in missing.items { + header := "" + if ci.fns.has(name) { + header = ci.fns[name].header + } + k := headers.find(header) + if k < 0 { + headers.push(header) + byHeader.push(Names()) + k = headers.len - 1 + } + byHeader[k].add(name) + } + for k in 0..headers.len { + names := byHeader[k].items + []str shown + for i in 0..names.len { + if i < 3 { + shown.push(names[i]) + } + } + list := shown.join(", ") + if names.len > 3 { + list = list + " and " + str(names.len - 3) + " more" + } + if headers[k].len == 0 { + print("error: no code found for " + list) + continue + } + verb := "come" + if names.len == 1 { + verb = "comes" + } + print("error: " + list + " " + verb + " from \"" + headers[k] + "\", but its library isn't linked") + print(" the header only says the functions exist; their code lives in a library.") + print(" add this at the top of your file (with the library's real name):") + print("") + print(" link \"" + guessLib(headers[k]) + "\"") + print("") + } + return 1 +} + +// The runtime, compiled once per system and compiler and kept in the cache folder. +fn runtimeObject(str rt, platform.Target tg, str cc) -> str! { + source := try read_file(rt) + dir := cacheDir() + obj := dir + "/rt-" + fingerprint(source + cc + tg.triple + "2.5") + ".o" + if file_exists(obj) { + return obj + } + shell("mkdir -p " + quote(dir)) + part := obj + ".part" + str(int(getpid())) + pic := " -fPIC" + if tg.windows { + pic = "" + } + log := part + ".log" + code := shell(cc + " -O2" + pic + " -c " + quote(rt) + " -o " + quote(part) + " > " + quote(log) + " 2>&1") + if code != 0 { + text := read_file(log) or "" + shell("rm -f " + quote(part) + " " + quote(log)) + return error(text + "error: couldn't build the Finch runtime with '" + cc + "' (is a C compiler installed?)") + } + shell("rm -f " + quote(log) + " && mv " + quote(part) + " " + quote(obj)) + return obj +} + +struct Build { + str out // the program + str ir // its LLVM IR, as text + str rt // the runtime's source file + str opt // -O2 or -O0 + str extra // -g, -fPIC ... + bool shared + []str links // what the program asked to link: a library name, a .c file (with its folder), a .o or .a +} + +// IR -> program. 0 if it worked. +fn build(Build b, platform.Target tg, cimport.CImports ci) -> int { + clang := getenv("FINCH_CLANG") + if clang.len == 0 { + clang = "clang" + } + // the C compiler of the runtime and the linker: the target's own when building for another system + cc := clang + if tg.cross { + cc = tg.cc + } else if getenv("FINCH_CC").len > 0 { + cc = getenv("FINCH_CC") + } + rtobj := runtimeObject(b.rt, tg, cc) or { + print(err) + return 1 + } + ll := b.out + ".ll" + obj := b.out + ".o" + write_file(ll, b.ir) + target := "" + if tg.cross { + target = " --target=" + tg.triple + } + log := b.out + ".log" + code := shell(clang + target + " " + b.opt + b.extra + " -w -c " + quote(ll) + " -o " + quote(obj) + " > " + quote(log) + " 2>&1") + shell("rm -f " + quote(ll)) + if code != 0 { + print(read_file(log) or "") + print("error: clang couldn't compile the program's IR") + shell("rm -f " + quote(obj) + " " + quote(log)) + return 1 + } + cmd := cc + " " + quote(obj) + " " + quote(rtobj) + " -o " + quote(b.out) + if !tg.msvc { + cmd = cmd + " -lm" + } + if b.shared { + if tg.darwin { + cmd = cmd + " -dynamiclib" + } else { + cmd = cmd + " -shared" + } + } + []str temps + for l in b.links { + if l.ends_with(".c") { + // the program's own C file, built along with it + o := b.out + "." + str(temps.len) + ".o" + pic := " -fPIC" + if tg.windows { + pic = "" + } + c := shell(cc + " -O2" + pic + " -c " + quote(l) + " -o " + quote(o) + " > " + quote(log) + " 2>&1") + if c != 0 { + print((read_file(log) or "") + "error: couldn't compile " + l) + shell("rm -f " + quote(obj) + " " + quote(log) + " " + quote(o)) + return 1 + } + temps.push(o) + cmd = cmd + " " + quote(o) + } else if l.ends_with(".o") || l.ends_with(".a") { + cmd = cmd + " " + quote(l) + } else { + cmd = cmd + " " + libFlags(l, tg) + } + } + status := shell(cmd + " > " + quote(log) + " 2>&1") + output := read_file(log) or "" + shell("rm -f " + quote(obj) + " " + quote(log)) + for t in temps { + shell("rm -f " + quote(t)) + } + if status == 127 { + print("error: no C compiler found to link with ('" + cc + "'; install one, or set FINCH_CC)") + return 1 + } + if status != 0 { + return linkFailed(output, ci, tg) + } + if output.len > 0 { + print(output) // warnings, if any + } + return 0 +} diff --git a/src/loader.cpp b/src/loader.cpp deleted file mode 100644 index a4d57e9..0000000 --- a/src/loader.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "loader.h" -#include "error.h" -#include "lexer.h" -#include "parser.h" -#include "target.h" - -#include -#include -#include - -#include -#include -#include -#include - -using namespace llvm; - -static bool readFile(const std::string &path, std::string &out) { - std::ifstream in(path, std::ios::binary); - if (!in) return false; - std::stringstream ss; - ss << in.rdbuf(); - out = ss.str(); - return true; -} - -std::string normalizePath(const std::string &path) { - SmallString<256> p(path); - sys::fs::make_absolute(p); - sys::path::remove_dots(p, true); - sys::path::native(p); - return std::string(p.str()); -} - -void Loader::load(const std::string &path, const std::string &module, Pos from) { - std::string text; - bool found = false; - if (overrides) { - auto it = overrides->find(normalizePath(path)); - if (it != overrides->end()) text = it->second, found = true; - } - if (!found && !readFile(path, text)) { - if (from.line) failAt(from.file, from.line, from.col, "can't find the module '" + module + "' (looked for " + path + ")"); - std::fprintf(stderr, "error: can't open '%s'\n", path.c_str()); - std::exit(1); - } - int idx = (int)g_files.size(); - g_files.push_back({path, text}); - Program p = parse(lex(idx), idx); - p.module = module; - p.path = path; - std::vector mods; - for (const Import &im : p.imports) - if (!im.isC) mods.push_back(im); - progs.push_back(std::move(p)); - for (const Import &im : mods) { - if (im.path == "main") failAt(im.pos.file, im.pos.line, im.pos.col, "'main' can't be imported"); - if (loaded[im.path]) continue; - loaded[im.path] = true; - load(findModule(dirOf(path), im.path), im.path, im.pos); - } -} - -// next to the importing file, then in $FINCH_PATH folders -std::string Loader::findModule(const std::string &dir, const std::string &name) { - std::string here = dir + "/" + name + ".fch"; - if (sys::fs::exists(here)) return here; - if (const char *fp = std::getenv("FINCH_PATH")) { - std::stringstream ss(fp); - for (std::string d; std::getline(ss, d, pathListSeparator());) - if (!d.empty() && sys::fs::exists(d + "/" + name + ".fch")) return d + "/" + name + ".fch"; - } - return here; -} diff --git a/src/loader.h b/src/loader.h deleted file mode 100644 index e9364a3..0000000 --- a/src/loader.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -// Reads the main file and, recursively, every Finch module it imports. - -#include "ast.h" - -#include -#include -#include - -struct Loader { - std::vector progs; - std::map loaded; // module name -> seen - const std::map *overrides = nullptr; // path -> text (files open in an editor) - - void load(const std::string &path, const std::string &module, Pos from); - static std::string findModule(const std::string &dir, const std::string &name); -}; - -// A path made absolute and tidy, so two spellings of one file compare equal. -std::string normalizePath(const std::string &path); diff --git a/src/lsp.cpp b/src/lsp.cpp deleted file mode 100644 index 938b0b0..0000000 --- a/src/lsp.cpp +++ /dev/null @@ -1,580 +0,0 @@ -// The Finch language server: `finch lsp` speaks the Language Server Protocol on stdin/stdout. -// -// Every time a document changes it is checked by the real compiler (lexer, parser, type -// checker and code generator, without optimizing or writing anything), with errors thrown -// instead of ending the process and a semantic index (index.h) collecting what each name is. -// Hover, go-to-definition, completion, signature help and document symbols read that index. - -#include "builtins_doc.h" -#include "cimport.h" -#include "codegen.h" -#include "error.h" -#include "index.h" -#include "loader.h" -#include "target.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#include -#endif - -using namespace llvm; - -namespace { - -// ---------- URIs ---------- - -std::string uriToPath(const std::string &uri) { - std::string s = uri.rfind("file://", 0) == 0 ? uri.substr(7) : uri; - std::string out; - for (size_t i = 0; i < s.size(); i++) { - if (s[i] == '%' && i + 2 < s.size()) { - out += (char)std::stoi(s.substr(i + 1, 2), nullptr, 16); - i += 2; - } else { - out += s[i]; - } - } -#ifdef _WIN32 - if (out.size() > 2 && out[0] == '/' && out[2] == ':') out = out.substr(1); // /c:/x -> c:/x -#endif - return normalizePath(out); -} - -std::string pathToUri(const std::string &path) { - std::string p = normalizePath(path), out = "file://"; -#ifdef _WIN32 - for (char &c : p) - if (c == '\\') c = '/'; - out += "/"; -#endif - for (unsigned char c : p) { - if (isalnum(c) || c == '/' || c == '-' || c == '_' || c == '.' || c == '~' || c == ':') out += (char)c; - else { - char buf[4]; - std::snprintf(buf, sizeof buf, "%%%02X", c); - out += buf; - } - } - return out; -} - -// ---------- one check of a document ---------- - -struct Diagnostic { - std::string path; - int line, col; - std::string msg; -}; - -struct Analysis { - std::vector files; - SemIndex index; - std::vector diags; - std::set modules; // modules the document imports - const CImports *c = nullptr; -}; - -class Server { -public: - int run(); - -private: - std::map docs; // normalized path -> text - std::map> results; // last check of each open document - std::map> lastGood; // last check without errors - std::map> headerCache; - std::set diagnosed; // paths we published errors for - TargetMachine *tm = nullptr; - bool shutdown = false; - - // protocol - bool readMessage(json::Value &out); - void send(const json::Value &v); - void reply(const json::Value &id, json::Value result); - void notify(const std::string &method, json::Value params); - void handle(const json::Object &msg); - - // features - void check(const std::string &path); - json::Value hover(const std::string &path, int line, int col); - json::Value definition(const std::string &path, int line, int col); - json::Value completion(const std::string &path, int line, int col); - json::Value symbols(const std::string &path); - json::Value signatureHelp(const std::string &path, int line, int col); - - const SymRef *refAt(const Analysis &a, const std::string &path, int line, int col); - std::string lineText(const std::string &path, int line); -}; - -bool Server::readMessage(json::Value &out) { - size_t length = 0; - std::string header; - while (std::getline(std::cin, header)) { - if (!header.empty() && header.back() == '\r') header.pop_back(); - if (header.empty()) break; - if (header.rfind("Content-Length:", 0) == 0) length = std::stoul(header.substr(15)); - } - if (!std::cin || length == 0) return false; - std::string body(length, '\0'); - std::cin.read(&body[0], length); - Expected v = json::parse(body); - if (!v) { - consumeError(v.takeError()); - return true; // skip a broken message - } - out = std::move(*v); - return true; -} - -void Server::send(const json::Value &v) { - std::string body; - raw_string_ostream os(body); - os << v; - os.flush(); - std::cout << "Content-Length: " << body.size() << "\r\n\r\n" << body; - std::cout.flush(); -} - -void Server::reply(const json::Value &id, json::Value result) { - send(json::Object{{"jsonrpc", "2.0"}, {"id", id}, {"result", std::move(result)}}); -} - -void Server::notify(const std::string &method, json::Value params) { - send(json::Object{{"jsonrpc", "2.0"}, {"method", method}, {"params", std::move(params)}}); -} - -int Server::run() { -#ifdef _WIN32 - _setmode(_fileno(stdin), _O_BINARY); - _setmode(_fileno(stdout), _O_BINARY); -#endif - initTargets(); - setTarget(""); - std::string err; - const Target *target = TargetRegistry::lookupTarget(g_target.triple, err); - if (!target) return 1; - tm = target->createTargetMachine(g_target.triple, "generic", "", TargetOptions(), Reloc::PIC_); - - json::Value msg(nullptr); - while (readMessage(msg)) { - if (const json::Object *o = msg.getAsObject()) handle(*o); - if (shutdown && !std::cin) break; - } - return 0; -} - -static int intAt(const json::Object *o, const char *key) { - if (!o) return 0; - if (auto v = o->getInteger(key)) return (int)*v; - return 0; -} - -void Server::handle(const json::Object &msg) { - std::string method = msg.getString("method").value_or("").str(); - const json::Value *id = msg.get("id"); - const json::Object *params = msg.getObject("params"); - auto docPath = [&]() -> std::string { - if (!params) return ""; - const json::Object *td = params->getObject("textDocument"); - return td ? uriToPath(td->getString("uri").value_or("").str()) : ""; - }; - // positions: LSP is 0-based (line, UTF-16 column); Finch is 1-based (line, character) - auto position = [&](int &line, int &col) { - const json::Object *pos = params ? params->getObject("position") : nullptr; - line = intAt(pos, "line") + 1; - col = intAt(pos, "character") + 1; - }; - - if (method == "initialize") { - json::Object caps{ - {"textDocumentSync", json::Object{{"openClose", true}, {"change", 1}, {"save", true}}}, - {"hoverProvider", true}, - {"definitionProvider", true}, - {"documentSymbolProvider", true}, - {"completionProvider", json::Object{{"triggerCharacters", json::Array{"."}}}}, - {"signatureHelpProvider", json::Object{{"triggerCharacters", json::Array{"(", ","}}}}, - }; - reply(*id, json::Object{{"capabilities", std::move(caps)}, - {"serverInfo", json::Object{{"name", "finch"}, {"version", FINCH_VERSION}}}}); - } else if (method == "shutdown") { - shutdown = true; - reply(*id, nullptr); - } else if (method == "exit") { - std::exit(shutdown ? 0 : 1); - } else if (method == "textDocument/didOpen" || method == "textDocument/didChange") { - std::string path = docPath(); - if (method == "textDocument/didOpen") { - docs[path] = params->getObject("textDocument")->getString("text").value_or("").str(); - } else if (const json::Array *changes = params->getArray("contentChanges")) { - if (!changes->empty()) - if (const json::Object *ch = changes->back().getAsObject()) docs[path] = ch->getString("text").value_or("").str(); - } - check(path); - } else if (method == "textDocument/didSave") { - check(docPath()); - } else if (method == "textDocument/didClose") { - std::string path = docPath(); - docs.erase(path); - results.erase(path); - lastGood.erase(path); - notify("textDocument/publishDiagnostics", json::Object{{"uri", pathToUri(path)}, {"diagnostics", json::Array{}}}); - } else if (id) { - int line = 0, col = 0; - position(line, col); - std::string path = docPath(); - if (method == "textDocument/hover") reply(*id, hover(path, line, col)); - else if (method == "textDocument/definition") reply(*id, definition(path, line, col)); - else if (method == "textDocument/completion") reply(*id, completion(path, line, col)); - else if (method == "textDocument/documentSymbol") reply(*id, symbols(path)); - else if (method == "textDocument/signatureHelp") reply(*id, signatureHelp(path, line, col)); - else send(json::Object{{"jsonrpc", "2.0"}, {"id", *id}, - {"error", json::Object{{"code", -32601}, {"message", "not supported: " + method}}}}); - } -} - -// Check `path` with the real compiler, keep the index, publish errors. -void Server::check(const std::string &path) { - auto a = std::make_shared(); - g_files.clear(); - g_throwErrors = true; - g_index = &a->index; - try { - Loader loader; - loader.overrides = &docs; - loader.load(path, "", Pos{}); - std::vector imports; - std::vector dirs; - std::string key; - for (const Program &p : loader.progs) { - for (const Import &im : p.imports) { - imports.push_back(im); - if (im.isC) key += im.path + "\n"; - else if (p.module.empty()) a->modules.insert(im.path); - } - std::string d = dirOf(p.path); - if (std::find(dirs.begin(), dirs.end(), d) == dirs.end()) dirs.push_back(d), key += "@" + d + "\n"; - } - auto &cached = headerCache[key]; // headers are slow to read: once per set of imports - if (!cached) cached = std::make_unique(importHeaders(imports, dirs)); - a->c = cached.get(); - LLVMContext ctx; - generate(loader.progs, *cached, ctx, *tm, false); - } catch (const FinchError &e) { - std::string file = e.file >= 0 && e.file < (int)g_files.size() ? normalizePath(g_files[e.file].path) : path; - a->diags.push_back({file, e.line, e.col, e.msg}); - } - g_index = nullptr; - g_throwErrors = false; - a->files = g_files; - - // While the code is half-typed (`p.`, `add(1, `) it doesn't compile; completion and signature - // help keep using what the last good version knew. Hover and definition use the newest refs. - if (a->diags.empty()) { - lastGood[path] = a; - } else if (auto good = lastGood.find(path); good != lastGood.end()) { - const Analysis &g = *good->second; - for (const FnInfo &f : g.index.fns) a->index.fns.push_back(f); - for (const StructIndex &st : g.index.structs) a->index.structs.push_back(st); - for (const VarInfo &v : g.index.vars) a->index.vars.push_back(v); - if (a->modules.empty()) a->modules = g.modules; - if (!a->c) a->c = g.c; - } - results[path] = a; - - std::map byFile; - byFile[path]; - for (const std::string &p : diagnosed) byFile[p]; // clear errors that went away - diagnosed.clear(); - for (const Diagnostic &d : a->diags) { - int line = std::max(0, d.line - 1), col = std::max(0, d.col - 1); - byFile[d.path].push_back(json::Object{ - {"range", json::Object{{"start", json::Object{{"line", line}, {"character", col}}}, - {"end", json::Object{{"line", line}, {"character", col + 1}}}}}, - {"severity", 1}, - {"source", "finch"}, - {"message", d.msg}}); - diagnosed.insert(d.path); - } - for (auto &[p, list] : byFile) - notify("textDocument/publishDiagnostics", json::Object{{"uri", pathToUri(p)}, {"diagnostics", std::move(list)}}); -} - -const SymRef *Server::refAt(const Analysis &a, const std::string &path, int line, int col) { - for (const SymRef &r : a.index.refs) { - if (r.line != line || col < r.col || col > r.col + r.len) continue; - if (r.file < 0 || r.file >= (int)a.files.size() || normalizePath(a.files[r.file].path) != path) continue; - return &r; - } - return nullptr; -} - -json::Value Server::hover(const std::string &path, int line, int col) { - auto it = results.find(path); - if (it == results.end()) return nullptr; - const SymRef *r = refAt(*it->second, path, line, col); - if (!r) return nullptr; - return json::Object{{"contents", json::Object{{"kind", "markdown"}, {"value", r->hover}}}}; -} - -json::Value Server::definition(const std::string &path, int line, int col) { - auto it = results.find(path); - if (it == results.end()) return nullptr; - const Analysis &a = *it->second; - const SymRef *r = refAt(a, path, line, col); - if (!r || r->defFile < 0 || r->defFile >= (int)a.files.size()) return nullptr; - int l = r->defLine - 1, c = r->defCol - 1; - return json::Object{{"uri", pathToUri(a.files[r->defFile].path)}, - {"range", json::Object{{"start", json::Object{{"line", l}, {"character", c}}}, - {"end", json::Object{{"line", l}, {"character", c}}}}}}; -} - -std::string Server::lineText(const std::string &path, int line) { - auto it = docs.find(path); - if (it == docs.end()) return ""; - size_t start = 0; - for (int l = 1; l < line && start != std::string::npos; l++) { - start = it->second.find('\n', start); - if (start != std::string::npos) start++; - } - if (start == std::string::npos) return ""; - return it->second.substr(start, it->second.find('\n', start) - start); -} - -// LSP CompletionItemKind -enum { KMethod = 2, KFunction = 3, KField = 5, KVariable = 6, KModule = 9, KKeyword = 14, KSnippet = 15, - KConstant = 21, KStruct = 22, KTypeParam = 25 }; - -static json::Value item(const std::string &label, int kind, const std::string &detail = "", const std::string &doc = "") { - json::Object o{{"label", label}, {"kind", kind}}; - if (!detail.empty()) o["detail"] = detail; - if (!doc.empty()) o["documentation"] = json::Object{{"kind", "markdown"}, {"value", doc}}; - return o; -} - -json::Value Server::completion(const std::string &path, int line, int col) { - json::Array items; - auto it = results.find(path); - std::shared_ptr a = it == results.end() ? nullptr : it->second; - - // what's before the cursor: "name." or "name.partial"? - std::string text = lineText(path, line); - // columns count characters, but we only need the ASCII part right before the cursor - std::string before; - { - int c = 1; - size_t k = 0; - for (; k < text.size() && c < col; k++) - if (((unsigned char)text[k] & 0xC0) != 0x80) c++; - before = text.substr(0, k); - } - size_t end = before.size(); - while (end > 0 && (isalnum((unsigned char)before[end - 1]) || before[end - 1] == '_')) end--; - bool afterDot = end > 0 && before[end - 1] == '.'; - - if (afterDot) { - size_t s = end - 1; - while (s > 0 && (isalnum((unsigned char)before[s - 1]) || before[s - 1] == '_' || before[s - 1] == ']' || before[s - 1] == '[')) s--; - std::string owner = before.substr(s, end - 1 - s); - if (size_t br = owner.find('['); br != std::string::npos) owner = owner.substr(0, br) + "[]"; - if (!a) return json::Object{{"isIncomplete", false}, {"items", std::move(items)}}; - - // a module? - if (a->modules.count(owner)) { - std::set seen; - for (const FnInfo &f : a->index.fns) - if (f.module == owner && seen.insert(f.name).second) items.push_back(item(f.name, KFunction, f.signature)); - for (const StructIndex &s2 : a->index.structs) - if (s2.module == owner && seen.insert(s2.name).second) items.push_back(item(s2.name, KStruct, "struct " + s2.name)); - return json::Object{{"isIncomplete", false}, {"items", std::move(items)}}; - } - // a variable: find its type (the innermost one declared before the cursor) - bool element = owner.size() > 2 && owner.compare(owner.size() - 2, 2, "[]") == 0; - std::string name = element ? owner.substr(0, owner.size() - 2) : owner; - std::string type; - for (const VarInfo &v : a->index.vars) - if (v.name == name && v.line <= line && line <= v.fnEnd + 1) type = v.type; - if (element && type.rfind("[]", 0) == 0) type = type.substr(2); - if (element && type == "str") type = "char"; - if (element && type.rfind("map[", 0) == 0) { // m[key]. -> the value type - int depth = 0; - for (size_t k = 3; k < type.size(); k++) { - if (type[k] == '[') depth++; - else if (type[k] == ']' && --depth == 0) { - type = type.substr(k + 1); - break; - } - } - } - if (type.rfind("ptr[", 0) == 0) type = type.substr(4, type.size() - 5); // fields through a pointer - if (type == "str") { - for (const BuiltinDoc &d : kStrMethods) items.push_back(item(d.name, d.name[0] == 'l' || d.name[0] == 'p' ? KField : KMethod, d.signature, d.doc)); - } else if (type.rfind("[]", 0) == 0) { - for (const BuiltinDoc &d : kArrayMethods) items.push_back(item(d.name, std::string(d.name) == "len" || std::string(d.name) == "ptr" ? KField : KMethod, d.signature, d.doc)); - } else if (type.rfind("map[", 0) == 0) { - for (const BuiltinDoc &d : kMapMethods) items.push_back(item(d.name, std::string(d.name) == "len" ? KField : KMethod, d.signature, d.doc)); - } else if (!type.empty()) { - std::string mod, sname = type; - if (size_t dot = type.find('.'); dot != std::string::npos) mod = type.substr(0, dot), sname = type.substr(dot + 1); - for (const StructIndex &s2 : a->index.structs) - if (s2.name == sname && (mod.empty() || s2.module == mod)) - for (auto &[fname, ftype] : s2.fields) items.push_back(item(fname, KField, ftype + " " + fname)); - std::set seen; - for (const FnInfo &f : a->index.fns) // methods: indexed as Struct.name - if (f.name.size() > sname.size() + 1 && f.name.compare(0, sname.size() + 1, sname + ".") == 0 && - seen.insert(f.name).second) - items.push_back(item(f.name.substr(sname.size() + 1), KMethod, f.signature)); - if (type.rfind("ptr", 0) == 0 || items.empty()) items.push_back(item("value", KField, "the value the pointer points to")); - } - return json::Object{{"isIncomplete", false}, {"items", std::move(items)}}; - } - - std::string prefix = before.substr(end); - for (const char *k : kKeywords) items.push_back(item(k, KKeyword)); - for (const char *t : kTypeNames) items.push_back(item(t, KTypeParam, "type")); - for (const BuiltinDoc &d : kBuiltins) items.push_back(item(d.name, KFunction, d.signature, d.doc)); - if (a) { - std::set seen; - for (const VarInfo &v : a->index.vars) // variables of the function around the cursor - if (v.fnLine <= line && line <= v.fnEnd && v.line <= line && seen.insert(v.name).second) - items.push_back(item(v.name, KVariable, v.type + " " + v.name)); - for (const FnInfo &f : a->index.fns) - if (f.module.empty() && seen.insert(f.name).second) items.push_back(item(f.name, KFunction, f.signature)); - for (const StructIndex &s : a->index.structs) - if (s.module.empty() && seen.insert(s.name).second) items.push_back(item(s.name, KStruct, "struct " + s.name)); - for (const std::string &m : a->modules) items.push_back(item(m, KModule, "module " + m)); - // C names only once something is typed: headers declare thousands - if (a->c && !prefix.empty()) { - for (auto &[name, f] : a->c->fns) - if (name.rfind(prefix, 0) == 0 && f.unsupported.empty()) items.push_back(item(name, KFunction, "C: " + f.header)); - for (auto &[name, k] : a->c->consts) - if (name.rfind(prefix, 0) == 0) items.push_back(item(name, KConstant, "C constant")); - for (auto &[name, s] : a->c->structs) - if (name.rfind(prefix, 0) == 0) items.push_back(item(name, KStruct, "C struct")); - } - } - return json::Object{{"isIncomplete", !prefix.empty()}, {"items", std::move(items)}}; -} - -json::Value Server::symbols(const std::string &path) { - json::Array out; - auto it = results.find(path); - if (it == results.end()) return out; - const Analysis &a = *it->second; - auto inDoc = [&](int file) { return file >= 0 && file < (int)a.files.size() && normalizePath(a.files[file].path) == path; }; - auto range = [](int l1, int c1, int l2) { - return json::Object{{"start", json::Object{{"line", l1 - 1}, {"character", c1 - 1}}}, - {"end", json::Object{{"line", std::max(l1, l2) - 1}, {"character", 0}}}}; - }; - for (const FnInfo &f : a.index.fns) - if (inDoc(f.file)) - out.push_back(json::Object{{"name", f.name}, {"detail", f.signature}, {"kind", 12}, - {"range", range(f.line, f.col, f.endLine + 1)}, {"selectionRange", range(f.line, f.col, f.line)}}); - for (const StructIndex &s : a.index.structs) - if (inDoc(s.file)) { - json::Array kids; - for (auto &[n, t] : s.fields) kids.push_back(json::Object{{"name", n}, {"detail", t}, {"kind", 8}, - {"range", range(s.line, s.col, s.line)}, {"selectionRange", range(s.line, s.col, s.line)}}); - out.push_back(json::Object{{"name", s.name}, {"kind", 23}, {"range", range(s.line, s.col, s.line)}, - {"selectionRange", range(s.line, s.col, s.line)}, {"children", std::move(kids)}}); - } - return out; -} - -// Inside `name(a, b|`: which function, and which argument. -json::Value Server::signatureHelp(const std::string &path, int line, int col) { - auto it = results.find(path); - std::shared_ptr a = it == results.end() ? nullptr : it->second; - std::string text; - for (int l = std::max(1, line - 5); l < line; l++) text += lineText(path, l) + "\n"; - std::string cur = lineText(path, line); - text += cur.substr(0, std::min(cur.size(), col - 1)); - - int depth = 0, commas = 0; - size_t k = text.size(); - while (k > 0) { - char ch = text[--k]; - if (ch == ')' || ch == ']') depth++; - else if (ch == '[') depth--; - else if (ch == '(') { - if (depth == 0) break; - depth--; - } else if (ch == ',' && depth == 0) commas++; - if (k == 0) return nullptr; - } - size_t e = k; - while (k > 0 && (isalnum((unsigned char)text[k - 1]) || text[k - 1] == '_' || text[k - 1] == '.')) k--; - std::string callee = text.substr(k, e - k); - if (callee.empty()) return nullptr; - std::string name = callee.substr(callee.rfind('.') == std::string::npos ? 0 : callee.rfind('.') + 1); - std::string mod = callee.find('.') == std::string::npos ? "" : callee.substr(0, callee.find('.')); - - std::string label, doc; - std::vector params; - if (a) { - for (const FnInfo &f : a->index.fns) { - bool method = f.name.size() > name.size() && f.name.compare(f.name.size() - name.size() - 1, name.size() + 1, "." + name) == 0; - if ((f.name == name && (f.module == mod || (mod.empty() && f.module.empty()) || !a->modules.count(mod))) || - (method && !mod.empty() && !a->modules.count(mod))) // p.move( -> Point.move - label = f.signature, params = f.params; - } - if (label.empty()) - for (const StructIndex &s : a->index.structs) - if (s.name == name) { - label = name + "("; - for (size_t i = 0; i < s.fields.size(); i++) { - params.push_back(s.fields[i].second + " " + s.fields[i].first); - label += (i ? ", " : "") + params.back(); - } - label += ")"; - } - if (label.empty() && a->c) - if (auto f = a->c->fns.find(name); f != a->c->fns.end()) { - label = name + "("; - for (size_t i = 0; i < f->second.params.size(); i++) { - params.push_back(f->second.params[i].show()); - label += (i ? ", " : "") + params.back(); - } - label += f->second.variadic ? ", ...)" : ")"; - doc = "C function from " + f->second.header; - } - } - if (label.empty()) { - auto look = [&](const BuiltinDoc *f, const BuiltinDoc *l) { - for (; f != l && label.empty(); ++f) - if (name == f->name) label = f->signature, doc = f->doc; - }; - look(std::begin(kBuiltins), std::end(kBuiltins)); - if (!mod.empty()) { - look(std::begin(kArrayMethods), std::end(kArrayMethods)); - look(std::begin(kStrMethods), std::end(kStrMethods)); - look(std::begin(kMapMethods), std::end(kMapMethods)); - } - } - if (label.empty()) return nullptr; - json::Array ps; - for (const std::string &p : params) ps.push_back(json::Object{{"label", p}}); - json::Object sig{{"label", label}, {"parameters", std::move(ps)}}; - if (!doc.empty()) sig["documentation"] = doc; - return json::Object{{"signatures", json::Array{std::move(sig)}}, {"activeSignature", 0}, {"activeParameter", commas}}; -} - -} // namespace - -int runLanguageServer() { return Server().run(); } diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 73ec72c..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,350 +0,0 @@ -#include "cimport.h" -#include "codegen.h" -#include "error.h" -#include "lexer.h" -#include "loader.h" -#include "parser.h" -#include "target.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rt_source.inc" // kRuntimeSource: runtime/finch_rt.c, embedded at build time - -using namespace llvm; - -static void usage() { - std::fprintf(stderr, - "Finch " FINCH_VERSION " - small, quick, sharp.\n\n" - "usage:\n" - " finch run [args...] compile and run\n" - " finch build [-o name] compile to a program\n" - " finch ir show the generated LLVM IR\n" - " finch version show the version\n" - " finch lsp the language server, for editors (VS Code, Kate, ...)\n" - "\n" - " -l link a C library, same as link \"lib\" in the file\n" - " --target build for another system: windows, linux, arm64 (Linux), macos,\n" - " or an LLVM triple\n" - " -g add debug info (gdb / lldb / Visual Studio)\n" - " -O0 skip optimizations (to read the raw IR)\n"); - std::exit(1); -} - -// ---------- LLVM ---------- - -static void optimize(Module &mod, TargetMachine *tm) { - LoopAnalysisManager lam; - FunctionAnalysisManager fam; - CGSCCAnalysisManager cgam; - ModuleAnalysisManager mam; - PassBuilder pb(tm); - pb.registerModuleAnalyses(mam); - pb.registerCGSCCAnalyses(cgam); - pb.registerFunctionAnalyses(fam); - pb.registerLoopAnalyses(lam); - pb.crossRegisterProxies(lam, fam, cgam, mam); - pb.buildPerModuleDefaultPipeline(OptimizationLevel::O2).run(mod, mam); -} - -static TargetMachine *targetMachine() { - initTargets(); - const Triple &triple = g_target.triple; - if (!triple.isX86() && !triple.isAArch64()) { - std::fprintf(stderr, "error: Finch generates code for x86-64 and ARM64, not for %s\n", triple.getArchName().str().c_str()); - std::exit(1); - } - std::string err; - const Target *target = TargetRegistry::lookupTarget(triple, err); - if (!target) { - std::fprintf(stderr, "error: %s\n", err.c_str()); - std::exit(1); - } - return target->createTargetMachine(triple, "generic", "", TargetOptions(), Reloc::PIC_); -} - -static void emitObject(Module &mod, TargetMachine *tm, const std::string &path) { - std::error_code ec; - raw_fd_ostream out(path, ec, sys::fs::OF_None); - if (ec) { - std::fprintf(stderr, "error: can't write '%s': %s\n", path.c_str(), ec.message().c_str()); - std::exit(1); - } - legacy::PassManager pm; - if (tm->addPassesToEmitFile(pm, out, nullptr, CodeGenFileType::ObjectFile)) { - std::fprintf(stderr, "error: this machine can't produce object files\n"); - std::exit(1); - } - pm.run(mod); -} - -// ---------- linking ---------- - -// The runtime is compiled once per version and kept in ~/.cache/finch. -static std::string runtimeObject() { - std::string dir = cacheDir(); - size_t hash = std::hash()(std::string(kRuntimeSource) + FINCH_VERSION + g_target.cc + g_target.triple.str()); - std::string obj = dir + (g_target.windows && !g_target.cross ? "\\" : "/") + "rt-" + std::to_string(hash) + ".o"; - if (sys::fs::exists(obj)) return obj; - - sys::fs::create_directories(dir); - std::string src = obj + ".c", part = obj + ".part"; - { - std::ofstream out(src); - out << kRuntimeSource; - } - std::string output; - std::string pic = g_target.windows ? "" : " -fPIC"; - int status = capture(g_target.cc + " -O2" + pic + " -c " + shellQuote(src) + " -o " + shellQuote(part), output); - std::remove(src.c_str()); - if (status != 0) { - std::fprintf(stderr, "%serror: couldn't build the Finch runtime with '%s' (is a C compiler installed?)\n", output.c_str(), - g_target.cc.c_str()); - std::exit(1); - } - sys::fs::rename(part, obj); - return obj; -} - -// pkg-config knows the right paths for a library if it has one; otherwise plain -l. -static std::string libFlags(const std::string &lib) { - std::string out; - // macOS: link "Cocoa.framework" -> -framework Cocoa - if (lib.size() > 10 && lib.compare(lib.size() - 10, 10, ".framework") == 0) - return " -framework " + shellQuote(lib.substr(0, lib.size() - 10)); - if (!g_target.cross && capture("pkg-config --libs " + shellQuote(lib), out) == 0) { - while (!out.empty() && std::isspace((unsigned char)out.back())) out.pop_back(); - return " " + out; - } - return " " + shellQuote("-l" + lib); -} - -// "GLFW/glfw3.h" -> "glfw": a decent first guess for the library's name. -static std::string guessLib(const std::string &header) { - std::string name = header.substr(header.find_last_of('/') + 1); - name = name.substr(0, name.rfind('.')); - while (!name.empty() && std::isdigit((unsigned char)name.back())) name.pop_back(); - for (char &ch : name) ch = std::tolower((unsigned char)ch); - return name; -} - -// The linker speaks in riddles; turn its complaints into something you can act on. -[[noreturn]] static void linkFailed(const std::string &output, const CImports &c) { - std::vector missing, missingLibs; - auto addOnce = [](std::vector &v, const std::string &x) { - if (std::find(v.begin(), v.end(), x) == v.end()) v.push_back(x); - }; - std::istringstream lines(output); - for (std::string l; std::getline(lines, l);) { - size_t a; - if ((a = l.find("undefined reference to `")) != std::string::npos) { - a += 24; - addOnce(missing, l.substr(a, l.find('\'', a) - a)); - } else if ((a = l.find("undefined symbol: ")) != std::string::npos) { - a += 18; - addOnce(missing, l.substr(a, l.find_first_of(" \n", a) - a)); - } else if ((a = l.find("unresolved external symbol ")) != std::string::npos) { // MSVC link.exe - a += 27; - addOnce(missing, l.substr(a, l.find_first_of(" \n\r", a) - a)); - } else if ((a = l.find("cannot open file '")) != std::string::npos || // MSVC: LNK1104 - (a = l.find("cannot open input file '")) != std::string::npos || // MSVC: LNK1181 - (a = l.find("could not open '")) != std::string::npos) { // lld-link - a = l.find('\'', a) + 1; - std::string lib = l.substr(a, l.find('\'', a) - a); - if (lib.size() > 4 && lib.compare(lib.size() - 4, 4, ".lib") == 0) lib = lib.substr(0, lib.size() - 4); - addOnce(missingLibs, lib); - } else if ((a = l.find("cannot find -l")) != std::string::npos || - (a = l.find("library not found for -l")) != std::string::npos) { // older Apple ld - a = l.find("-l", a) + 2; - addOnce(missingLibs, l.substr(a, l.find_first_of(": \n\r", a) - a)); - } else if ((a = l.find("ld: library '")) != std::string::npos) { // Apple ld: library 'x' not found - a += 13; - addOnce(missingLibs, l.substr(a, l.find('\'', a) - a)); - } else if ((a = l.find("framework '")) != std::string::npos && l.find("not found") != std::string::npos) { - a += 11; - addOnce(missingLibs, l.substr(a, l.find('\'', a) - a) + ".framework"); - } else if (l.rfind(" \"", 0) == 0 && (a = l.find("\", referenced from:")) != std::string::npos) { - // Apple ld: Undefined symbols for architecture arm64:\n "_name", referenced from: - std::string name = l.substr(3, a - 3); - if (g_target.darwin && !name.empty() && name[0] == '_') name.erase(0, 1); - addOnce(missing, name); - } - } - if (missing.empty() && missingLibs.empty()) { - std::fprintf(stderr, "%serror: linking failed\n", output.c_str()); - std::exit(1); - } - - for (const std::string &lib : missingLibs) - std::fprintf(stderr, "error: the library '%s' wasn't found. Is it installed? (on Nix: add it to shell.nix)\n", lib.c_str()); - - std::vector>> byHeader; - for (const std::string &name : missing) { - auto f = c.fns.find(name); - std::string header = f == c.fns.end() ? "" : f->second.header; - auto it = std::find_if(byHeader.begin(), byHeader.end(), [&](auto &g) { return g.first == header; }); - if (it == byHeader.end()) byHeader.push_back({header, {name}}); - else it->second.push_back(name); - } - for (auto &[header, names] : byHeader) { - std::string list; - for (size_t k = 0; k < names.size() && k < 3; k++) list += (k ? ", " : "") + names[k]; - if (names.size() > 3) list += " and " + std::to_string(names.size() - 3) + " more"; - if (header.empty()) { - std::fprintf(stderr, "error: no code found for %s\n", list.c_str()); - continue; - } - std::fprintf(stderr, - "error: %s come%s from \"%s\", but its library isn't linked\n" - " the header only says the functions exist; their code lives in a library.\n" - " add this at the top of your file (with the library's real name):\n\n" - " link \"%s\"\n\n", - list.c_str(), names.size() == 1 ? "s" : "", header.c_str(), guessLib(header).c_str()); - } - std::exit(1); -} - -static bool endsWith(const std::string &s, const char *x) { - size_t n = std::strlen(x); - return s.size() > n && s.compare(s.size() - n, n, x) == 0; -} - -static void link(const std::string &obj, const std::string &exe, const std::vector &libs, - const CImports &c) { - std::string cmd = g_target.cc + " " + shellQuote(obj) + " " + shellQuote(runtimeObject()) + " -o " + shellQuote(exe); - if (!g_target.msvc) cmd += " -lm"; - std::vector temps; - for (const std::string &l : libs) { - if (endsWith(l, ".c")) { // compile the user's C file - std::string o = obj + "." + std::to_string(temps.size()) + ".o", output; - std::string pic = g_target.windows ? "" : " -fPIC"; - if (capture(g_target.cc + " -O2" + pic + " -c " + shellQuote(l) + " -o " + shellQuote(o), output) != 0) { - std::fprintf(stderr, "%serror: couldn't compile %s\n", output.c_str(), l.c_str()); - std::exit(1); - } - temps.push_back(o); - cmd += " " + shellQuote(o); - } else if (endsWith(l, ".o") || endsWith(l, ".a")) { - cmd += " " + shellQuote(l); - } else { - cmd += libFlags(l); - } - } - std::string output; - int status = capture(cmd, output); - std::remove(obj.c_str()); - for (const std::string &t : temps) std::remove(t.c_str()); - if (status == 127) { - std::fprintf(stderr, "error: no C compiler found to link with ('%s'; install one, or set FINCH_CC)\n", g_target.cc.c_str()); - std::exit(1); - } - if (status != 0) linkFailed(output, c); - std::fputs(output.c_str(), stderr); // warnings, if any -} - -static std::string stem(const std::string &path) { - size_t slash = path.find_last_of("/\\"); - std::string name = slash == std::string::npos ? path : path.substr(slash + 1); - size_t dot = name.rfind('.'); - return dot == std::string::npos ? name : name.substr(0, dot); -} - -int runLanguageServer(); // lsp.cpp - -int main(int argc, char **argv) { - if (argc == 2 && std::string(argv[1]) == "lsp") return runLanguageServer(); - if (argc == 2 && (std::string(argv[1]) == "version" || std::string(argv[1]) == "--version")) { - std::printf("finch %s (LLVM %s)\n", FINCH_VERSION, LLVM_VERSION_STRING); - return 0; - } - if (argc < 3) usage(); - std::string cmd = argv[1], file = argv[2]; - if (cmd != "run" && cmd != "build" && cmd != "ir") usage(); - std::string out = stem(file); - std::vector libs, programArgs; - std::string targetName; - bool optimizeCode = true, debug = false, outGiven = false; - for (int i = 3; i < argc; i++) { - std::string a = argv[i]; - if (cmd == "run" && !programArgs.empty()) programArgs.push_back(a); - else if (a == "-o" && i + 1 < argc && cmd == "build") out = argv[++i], outGiven = true; - else if (a == "--target" && i + 1 < argc) targetName = argv[++i]; - else if (a == "-O0") optimizeCode = false; - else if (a == "-g") debug = true; - else if (a == "-l" && i + 1 < argc) libs.push_back(argv[++i]); - else if (a.rfind("-l", 0) == 0 && a.size() > 2) libs.push_back(a.substr(2)); - else if (cmd == "run") programArgs.push_back(a); - else usage(); - } - - setTarget(targetName); - if (!outGiven) out += g_target.exe; - - Loader loader; - loader.load(file, "", Pos{}); - std::vector allImports; - std::vector dirs; - for (const Program &p : loader.progs) { - allImports.insert(allImports.end(), p.imports.begin(), p.imports.end()); - for (const Link &l : p.links) { - bool file = endsWith(l.lib, ".c") || endsWith(l.lib, ".o") || endsWith(l.lib, ".a"); - std::string path = file && !sys::path::is_absolute(l.lib) ? dirOf(p.path) + "/" + l.lib : l.lib; - if (file && !sys::fs::exists(path)) failAt(l.pos.file, l.pos.line, l.pos.col, "can't find the file '" + path + "'"); - libs.push_back(path); - } - if (std::find(dirs.begin(), dirs.end(), dirOf(p.path)) == dirs.end()) dirs.push_back(dirOf(p.path)); - } - CImports c = importHeaders(allImports, dirs); - LLVMContext ctx; - TargetMachine *tm = targetMachine(); - std::unique_ptr mod = generate(loader.progs, c, ctx, *tm, debug); - if (optimizeCode) optimize(*mod, tm); - - if (cmd == "ir") { - mod->print(outs(), nullptr); - return 0; - } - - std::string obj = out + ".o"; - if (cmd == "run") { - SmallString<128> tmp; - sys::fs::createTemporaryFile("finch", g_target.windows ? "exe" : "", tmp); - out = tmp.str().str(); - obj = out + ".o"; - } - emitObject(*mod, tm, obj); - link(obj, out, libs, c); - - if (cmd == "run") { - std::string line = shellQuote(out); - for (const std::string &a : programArgs) line += " " + shellQuote(a); - line = runPrefix() + line; // wine / qemu for programs built for another system -#ifdef _WIN32 - line = "\"" + line + "\""; // cmd /c strips one pair of outer quotes -#endif - std::string crash; - int status = runCommand(line, &crash); - std::remove(out.c_str()); - if (!crash.empty()) std::fprintf(stderr, "\nthe program crashed: %s\n", crash.c_str()); - return status; - } - return 0; -} diff --git a/boot/main.fch b/src/main.fch similarity index 80% rename from boot/main.fch rename to src/main.fch index 936ccc3..9f8853e 100644 --- a/boot/main.fch +++ b/src/main.fch @@ -11,6 +11,7 @@ import parser import gen import cimport import platform +import linker import "stdlib.h" fn dirOf(str path) -> str { @@ -100,20 +101,6 @@ fn load(ptr[Loader] l, str path, str module) { } } -// -lname, or whatever pkg-config says the library needs -fn libFlags(str name) -> str { - tmp := "/tmp/finch_pkg_flags.txt" - code := shell("pkg-config --libs '" + name + "' > '" + tmp + "' 2> /dev/null") - if code == 0 && file_exists(tmp) { - flags := read_file(tmp).trim() - shell("rm -f '" + tmp + "'") - if flags.len > 0 { - return flags - } - } - return "-l" + name -} - fn usage() { print("Finch -- the compiler is written in Finch") print("usage:") @@ -131,10 +118,6 @@ fn usage() { exit(1) } -fn quote(str a) -> str { - return "'" + a.replace("'", "'\\''") + "'" -} - fn main([]str args) -> int { if args.len == 2 && (args[1] == "version" || args[1] == "--version") { print("Finch 2.4.0 (the compiler is written in Finch)") @@ -171,10 +154,10 @@ fn main([]str args) -> int { } else if a == "-O0" { opt = "-O0" } else if a == "-l" && ai + 1 < args.len { - extraLibs.push(libFlags(args[ai + 1])) + extraLibs.push(args[ai + 1]) ai += 1 } else if a.starts_with("-l") && a.len > 2 { - extraLibs.push(libFlags(a.sub(2, a.len))) + extraLibs.push(a.sub(2, a.len)) } else if a == "-I" && ai + 1 < args.len { extraDirs.push(args[ai + 1]) ai += 1 @@ -228,7 +211,7 @@ fn main([]str args) -> int { []cimport.Header headers []str seen []str dirs = extraDirs - []str libs = extraLibs + []str links = extraLibs for prog in loader.progs { d := dirOf(prog.path) if !dirs.contains(d) { @@ -241,10 +224,10 @@ fn main([]str args) -> int { } } for l in prog.links { - if l.ends_with(".c") { - libs.push("'" + d + "/" + l + "'") + if l.ends_with(".c") || l.ends_with(".o") || l.ends_with(".a") { + links.push(d + "/" + l) // the program's own C code, next to the .fch file } else { - libs.push(libFlags(l)) + links.push(l) } } } @@ -277,13 +260,6 @@ fn main([]str args) -> int { print("error: can't find the Finch runtime (runtime/finch_rt.c)") return 1 } - llPath := out + ".ll" - write_file(llPath, ir) - // the IR is always compiled by clang (CC may be gcc, which can't read it); FINCH_CC picks the linker for another system - clang := getenv("FINCH_CC") - if clang.len == 0 || tg.cross { - clang = "clang" - } extra := "" if shared { extra = " -fPIC" @@ -291,37 +267,16 @@ fn main([]str args) -> int { if debug { extra = extra + " -g" // or clang drops the debug info that is in the IR } - code := 0 - if tg.cross { - // an object for the target, then the target's own C compiler links it with the runtime - obj := out + ".o" - code = shell("clang --target=" + tg.triple + " " + opt + extra + " -w -c '" + llPath + "' -o '" + obj + "'") - if code == 0 { - linkShared := "" - if shared { - linkShared = " -shared" - } - code = shell(tg.cc + " '" + obj + "' '" + rt + "' -o '" + out + "' -lm" + linkShared + " " + libs.join(" ")) - } - shell("rm -f '" + obj + "'") - } else { - if shared { - extra = extra + " -shared" - } - code = shell(clang + " " + opt + extra + " -w '" + llPath + "' '" + rt + "' -o '" + out + "' -lm " + libs.join(" ")) - } - shell("rm -f '" + llPath + "'") - if code != 0 { - print("error: clang failed") + if linker.build(linker.Build(out: out, ir: ir, rt: rt, opt: opt, extra: extra, shared: shared, links: links), tg, ci) != 0 { return 1 } if cmd == "run" { []str quoted for a in progArgs { - quoted.push(quote(a)) + quoted.push(linker.quote(a)) } - status := shell(tg.runner + quote(out) + " " + quoted.join(" ")) - shell("rm -f " + quote(out)) + status := shell(tg.runner + linker.quote(out) + " " + quoted.join(" ")) + shell("rm -f " + linker.quote(out)) return status } return 0 diff --git a/src/parser.cpp b/src/parser.cpp deleted file mode 100644 index 4a76616..0000000 --- a/src/parser.cpp +++ /dev/null @@ -1,602 +0,0 @@ -#include "parser.h" -#include "error.h" - -#include -#include -#include -#include -#include -#include - -bool typeFromName(const std::string &name, Type &out) { - static const std::unordered_map names = { - {"int", Type::I64}, {"float", Type::F64}, {"bool", Type::Bool}, {"char", Type::Char}, - {"str", Type::Str}, {"ptr", Type::Ptr}, {"i8", Type::I8}, {"i16", Type::I16}, - {"i32", Type::I32}, {"i64", Type::I64}, {"u8", Type::U8}, {"u16", Type::U16}, - {"u32", Type::U32}, {"u64", Type::U64}, {"f32", Type::F32}, {"f64", Type::F64}, - }; - auto it = names.find(name); - if (it == names.end()) return false; - out = Type(it->second); - return true; -} - -namespace { - -bool isTypeName(const std::string &name) { - Type t; - return typeFromName(name, t); -} - -class Parser { -public: - Parser(const std::vector &t, int f) : toks(t), file(f) {} - - Program program() { - Program p; - while (!at(Tok::End)) { - switch (cur().kind) { - case Tok::Import: p.imports.push_back(import()); break; - case Tok::Link: p.links.push_back(link()); break; - case Tok::Struct: p.structs.push_back(structDecl()); break; - default: p.fns.push_back(function()); break; - } - } - return p; - } - -private: - const std::vector &toks; - int file; - size_t i = 0; - int parenDepth = 0; // inside ( ) and [ ] newlines don't end anything - - const Token &cur() const { return toks[i]; } - const Token &peekTok(size_t off = 1) const { return toks[std::min(i + off, toks.size() - 1)]; } - const Token &next() { return toks[i++]; } - bool at(Tok k) const { return cur().kind == k; } - Pos pos() const { return {cur().line, cur().col, file}; } - - std::string describe(const Token &t) const { - return t.kind == Tok::Ident ? "'" + t.text + "'" : tokName(t.kind); - } - - bool accept(Tok k) { - if (!at(k)) return false; - i++; - return true; - } - const Token &expect(Tok k, const char *what = nullptr) { - if (!at(k)) - fail(cur().line, cur().col, - std::string("expected ") + (what ? what : tokName(k)) + ", found " + describe(cur())); - return next(); - } - [[noreturn]] void unexpected(const char *ctx) { - fail(cur().line, cur().col, "unexpected " + describe(cur()) + " " + ctx); - } - - // A token can continue an expression only if it is on the same line (or we're inside brackets). - bool sameLine() const { return parenDepth > 0 || !cur().newlineBefore; } - - // int, u8, ptr, ptr[int], []str, map[str]int, Point, math.Vec ... - Type type() { - if (accept(Tok::LBracket)) { - expect(Tok::RBracket, "']' (an array type looks like []int)"); - return Type::arrayOf(type()); - } - if (!at(Tok::Ident)) unexpected("(expected a type like int, str, []int, ptr[int] or a struct name)"); - if (cur().text == "map" && peekTok().kind == Tok::LBracket) { - next(); - next(); - Type k = type(); - expect(Tok::RBracket, "']' (a map type looks like map[str]int)"); - return Type::mapOf(k, type()); - } - std::string name = next().text; - Type t; - if (typeFromName(name, t)) { - if (t.kind == Type::Ptr && accept(Tok::LBracket)) { - t = Type::ptrTo(type()); - expect(Tok::RBracket); - } - return t; - } - t = Type(Type::Named); - t.name = name; - if (at(Tok::Dot) && peekTok().kind == Tok::Ident) { // module.Struct - next(); - t.module = name; - t.name = next().text; - } - return t; - } - - // Does a declaration like `int x`, `ptr[int] p`, `[]int a`, `Point p` or `math.Vec v` start here? - bool atDeclaration() const { - if (at(Tok::LBracket)) return peekTok().kind == Tok::RBracket; - if (!at(Tok::Ident)) return false; - Tok n = peekTok().kind; - if (n == Tok::Ident) return !peekTok().newlineBefore; - if ((cur().text == "ptr" || cur().text == "map") && n == Tok::LBracket) return true; - return n == Tok::Dot && peekTok(2).kind == Tok::Ident && peekTok(3).kind == Tok::Ident && - !peekTok(3).newlineBefore; - } - - // ---------- top level ---------- - - Import import() { - Import im; - im.pos = pos(); - expect(Tok::Import); - if (at(Tok::Ident)) { - im.isC = false; - im.path = next().text; - } else { - im.path = expect(Tok::String, "a module name (import math) or a C header in quotes (import \"stdio.h\")").text; - } - return im; - } - - Link link() { - Link l; - l.pos = pos(); - expect(Tok::Link); - l.lib = expect(Tok::String, "a library name in quotes, like link \"glfw\"").text; - auto ends = [&](const char *x) { size_t n = std::strlen(x); return l.lib.size() > n && l.lib.compare(l.lib.size() - n, n, x) == 0; }; - if (ends(".c") || ends(".o") || ends(".a")) return l; // your own C code, next to the .fch file - if (l.lib.rfind("lib", 0) == 0 || l.lib.find(".so") != std::string::npos || l.lib.find('/') != std::string::npos) - fail(l.pos.line, l.pos.col, "write just the library's name: for libglfw.so that's link \"glfw\""); - return l; - } - - StructDecl structDecl() { - StructDecl s; - s.pos = pos(); - expect(Tok::Struct); - s.namePos = pos(); - s.name = expect(Tok::Ident, "a struct name").text; - if (isTypeName(s.name)) fail(s.pos.line, s.pos.col, "'" + s.name + "' is a built-in type name, pick another"); - Pos open = pos(); - expect(Tok::LBrace); - while (!at(Tok::RBrace)) { - if (at(Tok::End)) fail(open.line, open.col, "this '{' is never closed (missing '}')"); - Field f; - f.pos = pos(); - if (!atDeclaration()) unexpected("(a field looks like: int x or str name = \"default\")"); - f.type = type(); - f.namePos = pos(); - f.name = expect(Tok::Ident, "a field name").text; - for (const Field &other : s.fields) - if (other.name == f.name) fail(f.pos.line, f.pos.col, "the field '" + f.name + "' is listed twice"); - if (accept(Tok::Assign)) f.init = expr(); - s.fields.push_back(std::move(f)); - endOfStatement(); - } - next(); - return s; - } - - FnDecl function() { - FnDecl fn; - fn.pos = pos(); - if (at(Tok::Ident) && isTypeName(cur().text)) - fail(fn.pos.line, fn.pos.col, "functions start with 'fn', like: fn add(int a, int b) -> int { ... }"); - expect(Tok::Fn, "'fn', 'struct', 'import' or 'link' (every function starts with fn)"); - - fn.namePos = pos(); - fn.name = expect(Tok::Ident, "a function name").text; - if (accept(Tok::Dot)) { // fn Point.move(...): a method - fn.recv = fn.name; - fn.recvPos = fn.namePos; - fn.namePos = pos(); - fn.name = expect(Tok::Ident, "a method name (fn Point.name(...))").text; - } - expect(Tok::LParen); - parenDepth++; - if (!at(Tok::RParen)) { - do { - Param p; - p.pos = pos(); - p.type = type(); - p.namePos = pos(); - p.name = expect(Tok::Ident, "a parameter name").text; - fn.params.push_back(p); - } while (accept(Tok::Comma)); - } - parenDepth--; - expect(Tok::RParen); - fn.ret = Type(Type::Void); - if (accept(Tok::Arrow)) { - if (!at(Tok::Not)) fn.ret = type(); - fn.fallible = accept(Tok::Not); // -> int! or -> ! - if (!fn.fallible && fn.ret.kind == Type::Void) unexpected("(after '->' comes a type, or ! for a function that can fail)"); - } - fn.body = block(); - return fn; - } - - // ---------- statements ---------- - - BlockPtr block() { - auto b = std::make_unique(pos()); - expect(Tok::LBrace); - int saved = parenDepth; - parenDepth = 0; - while (!at(Tok::RBrace)) { - if (at(Tok::End)) fail(b->pos.line, b->pos.col, "this '{' is never closed (missing '}')"); - b->body.push_back(statement()); - endOfStatement(); - } - parenDepth = saved; - b->end = pos(); - next(); - return b; - } - - void endOfStatement() { - if (at(Tok::RBrace) || at(Tok::End) || cur().newlineBefore) return; - unexpected("(put each statement on its own line)"); - } - - StmtPtr statement() { - Pos p = pos(); - switch (cur().kind) { - case Tok::If: return ifStmt(); - case Tok::While: { - next(); - auto s = std::make_unique(p); - s->cond = expr(); - s->body = block(); - return s; - } - case Tok::For: { - next(); - Pos varPos = pos(); - std::string var = expect(Tok::Ident, "a loop variable name").text; - std::string var2; - Pos var2Pos; - if (accept(Tok::Comma)) { // for i, x in list / for key, value in map - var2Pos = pos(); - var2 = expect(Tok::Ident, "a second loop variable name").text; - } - expect(Tok::In); - ExprPtr first = expr(); - if (!var2.empty() && at(Tok::DotDot)) fail(var2Pos.line, var2Pos.col, "a range (for i in 0..n) has one loop variable"); - if (accept(Tok::DotDot)) { // for i in 0..10 - auto s = std::make_unique(p); - s->var = var; - s->varPos = varPos; - s->from = std::move(first); - s->to = expr(); - s->body = block(); - return s; - } - auto s = std::make_unique(p); // for x in list - s->var = var; - s->varPos = varPos; - s->var2 = var2; - s->var2Pos = var2Pos; - s->list = std::move(first); - s->body = block(); - return s; - } - case Tok::Return: { - next(); - auto s = std::make_unique(p); - if (!at(Tok::RBrace) && !cur().newlineBefore) s->value = expr(); - return s; - } - case Tok::Break: next(); return std::make_unique(p); - case Tok::Continue: next(); return std::make_unique(p); - case Tok::Defer: { - next(); - if (at(Tok::Defer)) fail(p.line, p.col, "defer inside defer is not allowed"); - return std::make_unique(p, statement()); - } - case Tok::LBrace: return block(); - case Tok::Fn: fail(p.line, p.col, "functions can't be inside other functions (move it out)"); - case Tok::Struct: fail(p.line, p.col, "structs go outside functions, at the top level of the file"); - case Tok::Import: - case Tok::Link: fail(p.line, p.col, "import and link go at the top of the file, outside functions"); - default: break; - } - - // int x = 5, Point p, []int a - if (atDeclaration()) { - auto s = std::make_unique(p); - s->hasType = true; - s->type = type(); - s->namePos = pos(); - s->name = expect(Tok::Ident, "a variable name").text; - if (accept(Tok::Assign)) s->init = expr(); - return s; - } - - // x := 5 - if (at(Tok::Ident) && peekTok().kind == Tok::Declare) { - auto s = std::make_unique(p); - s->hasType = false; - s->namePos = pos(); - s->name = next().text; - next(); - s->init = expr(); - return s; - } - - ExprPtr e = expr(); - - // x = 5, p.value += 1, a[i] = 2, ... - char op = 0; - switch (cur().kind) { - case Tok::Assign: op = '='; break; - case Tok::PlusEq: op = '+'; break; - case Tok::MinusEq: op = '-'; break; - case Tok::StarEq: op = '*'; break; - case Tok::SlashEq: op = '/'; break; - case Tok::PercentEq: op = '%'; break; - case Tok::Declare: - fail(cur().line, cur().col, "':=' creates a new variable, so the left side must be a plain name"); - default: break; - } - if (op && sameLine()) { - if (e->kind != ExprKind::Var && e->kind != ExprKind::Member && e->kind != ExprKind::Index) - fail(p.line, p.col, "only a variable, a field, an element or p.value can be assigned to"); - auto s = std::make_unique(p); - s->target = std::move(e); - s->op = op; - next(); - s->value = expr(); - return s; - } - - if (e->kind != ExprKind::Call && e->kind != ExprKind::Method && e->kind != ExprKind::Try && e->kind != ExprKind::OrElse) - fail(p.line, p.col, "this value is computed but never used"); - return std::make_unique(p, std::move(e)); - } - - StmtPtr ifStmt() { - auto s = std::make_unique(pos()); - expect(Tok::If); - s->cond = expr(); - s->then = block(); - if (accept(Tok::Else)) { - if (at(Tok::If)) s->otherwise = ifStmt(); - else s->otherwise = block(); - } - return s; - } - - // ---------- expressions (lowest to highest precedence) ---------- - - // f(x) or fallback / f(x) or { ... }: the lowest precedence, right to left - ExprPtr expr() { - ExprPtr l = orExpr(); - if (!sameLine() || !at(Tok::OrElse)) return l; - Pos p = pos(); - next(); - auto e = std::make_unique(p, std::move(l)); - if (at(Tok::LBrace)) e->block = block(); - else e->fallback = expr(); - return e; - } - - ExprPtr orExpr() { - ExprPtr l = andExpr(); - while (sameLine() && at(Tok::Or)) { - Pos p = pos(); - next(); - l = std::make_unique(p, BinOp::Or, std::move(l), andExpr()); - } - return l; - } - - ExprPtr andExpr() { - ExprPtr l = compare(); - while (sameLine() && at(Tok::And)) { - Pos p = pos(); - next(); - l = std::make_unique(p, BinOp::And, std::move(l), compare()); - } - return l; - } - - ExprPtr compare() { - ExprPtr l = additive(); - while (sameLine()) { - BinOp op; - switch (cur().kind) { - case Tok::Eq: op = BinOp::Eq; break; - case Tok::NotEq: op = BinOp::NotEq; break; - case Tok::Less: op = BinOp::Less; break; - case Tok::LessEq: op = BinOp::LessEq; break; - case Tok::Greater: op = BinOp::Greater; break; - case Tok::GreaterEq: op = BinOp::GreaterEq; break; - default: return l; - } - Pos p = pos(); - next(); - l = std::make_unique(p, op, std::move(l), additive()); - } - return l; - } - - // Precedence is Go's, not C's: bit operators bind tighter than comparisons, - // so `x & 1 == 0` means `(x & 1) == 0`. - ExprPtr additive() { // + - | ^ - ExprPtr l = multiplicative(); - while (sameLine()) { - BinOp op; - switch (cur().kind) { - case Tok::Plus: op = BinOp::Add; break; - case Tok::Minus: op = BinOp::Sub; break; - case Tok::Pipe: op = BinOp::BitOr; break; - case Tok::Caret: op = BinOp::BitXor; break; - default: return l; - } - Pos p = pos(); - next(); - l = std::make_unique(p, op, std::move(l), multiplicative()); - } - return l; - } - - ExprPtr multiplicative() { // * / % << >> & - ExprPtr l = unary(); - while (sameLine()) { - BinOp op; - switch (cur().kind) { - case Tok::Star: op = BinOp::Mul; break; - case Tok::Slash: op = BinOp::Div; break; - case Tok::Percent: op = BinOp::Mod; break; - case Tok::Shl: op = BinOp::Shl; break; - case Tok::Shr: op = BinOp::Shr; break; - case Tok::Amp: op = BinOp::BitAnd; break; - default: return l; - } - Pos p = pos(); - next(); - l = std::make_unique(p, op, std::move(l), unary()); - } - return l; - } - - ExprPtr unary() { - Pos p = pos(); - if (accept(Tok::Minus)) return std::make_unique(p, '-', unary()); - if (accept(Tok::Not)) return std::make_unique(p, '!', unary()); - if (accept(Tok::Tilde)) return std::make_unique(p, '~', unary()); - if (accept(Tok::Try)) return std::make_unique(p, postfix()); - return postfix(); - } - - // p.value, a.len, a[i], a.push(x), math.sqrt(2) - ExprPtr postfix() { - ExprPtr e = primary(); - while (sameLine()) { - Pos p = pos(); - if (accept(Tok::Dot)) { - std::string name = expect(Tok::Ident, "a name after '.'").text; - if (at(Tok::LParen) && !cur().newlineBefore) { - auto m = std::make_unique(p, std::move(e), name); - args(m->args, m->argNames); - e = std::move(m); - } else { - e = std::make_unique(p, std::move(e), name); - } - } else if (at(Tok::LBracket)) { - next(); - parenDepth++; - ExprPtr index = expr(); - parenDepth--; - expect(Tok::RBracket); - e = std::make_unique(p, std::move(e), std::move(index)); - } else { - return e; - } - } - return e; - } - - // ( arg, name: arg, ... ) -- we are at the '(' - void args(std::vector &out, std::vector &names) { - expect(Tok::LParen); - parenDepth++; - if (!at(Tok::RParen)) { - do { - if (at(Tok::RParen)) break; // a trailing comma is fine - std::string name; - if (at(Tok::Ident) && peekTok().kind == Tok::Colon) { - name = next().text; - next(); - } - names.push_back(name); - out.push_back(expr()); - } while (accept(Tok::Comma)); - } - parenDepth--; - expect(Tok::RParen); - } - - ExprPtr primary() { - Pos p = pos(); - const Token &t = cur(); - switch (t.kind) { - case Tok::Int: { - next(); - errno = 0; - unsigned long long v = std::strtoull(t.text.c_str(), nullptr, t.text.size() > 1 && (t.text[1] == 'x' || t.text[1] == 'X') ? 16 : 10); - if (errno == ERANGE || v > (unsigned long long)LLONG_MAX) - fail(p.line, p.col, "number is too big for int"); - return std::make_unique(p, (long long)v); - } - case Tok::Float: next(); return std::make_unique(p, std::strtod(t.text.c_str(), nullptr)); - case Tok::True: next(); return std::make_unique(p, true); - case Tok::False: next(); return std::make_unique(p, false); - case Tok::Null: next(); return std::make_unique(p); - case Tok::Char: next(); return std::make_unique(p, t.text[0]); - case Tok::String: next(); return std::make_unique(p, t.text); - case Tok::LParen: { - next(); - parenDepth++; - ExprPtr e = expr(); - parenDepth--; - expect(Tok::RParen); - return e; - } - case Tok::LBracket: { // [1, 2, 3] or a map: ["a": 1, "b": 2], [:] - next(); - parenDepth++; - if (accept(Tok::Colon)) { - parenDepth--; - expect(Tok::RBracket, "']' (an empty map is [:])"); - return std::make_unique(p); - } - if (!at(Tok::RBracket)) { - ExprPtr first = expr(); - if (accept(Tok::Colon)) { - auto m = std::make_unique(p); - m->keys.push_back(std::move(first)); - m->values.push_back(expr()); - while (accept(Tok::Comma) && !at(Tok::RBracket)) { // a trailing comma is fine - m->keys.push_back(expr()); - expect(Tok::Colon, "':' (every map entry is key: value)"); - m->values.push_back(expr()); - } - parenDepth--; - expect(Tok::RBracket); - return m; - } - auto a = std::make_unique(p); - a->elems.push_back(std::move(first)); - while (accept(Tok::Comma) && !at(Tok::RBracket)) a->elems.push_back(expr()); - parenDepth--; - expect(Tok::RBracket); - return a; - } - auto a = std::make_unique(p); - parenDepth--; - expect(Tok::RBracket); - return a; - } - case Tok::Ident: { - next(); - if (at(Tok::LParen) && !cur().newlineBefore) { - auto call = std::make_unique(p, t.text); - args(call->args, call->argNames); - return call; - } - if (isTypeName(t.text)) - fail(p.line, p.col, "a type name alone is not a value (did you mean " + t.text + "(...)?)"); - return std::make_unique(p, t.text); - } - default: unexpected("(expected a value)"); - } - } -}; - -} // namespace - -Program parse(const std::vector &tokens, int file) { - return Parser(tokens, file).program(); -} diff --git a/boot/parser.fch b/src/parser.fch similarity index 96% rename from boot/parser.fch rename to src/parser.fch index 38b2279..8d78003 100644 --- a/boot/parser.fch +++ b/src/parser.fch @@ -239,8 +239,13 @@ fn parseProgram(ptr[Parser] p) -> ast.Program { prog.imports.push(next(p).text) } } else if at(p, "link") { - next(p) - prog.links.push(expect(p, "string", "a library or C file name, like link \"glfw\"").text) + lt := next(p) + lib := expect(p, "string", "a library name in quotes, like link \"glfw\"").text + ownCode := lib.ends_with(".c") || lib.ends_with(".o") || lib.ends_with(".a") // your own C code, next to the .fch file + if !ownCode && (lib.starts_with("lib") || lib.contains(".so") || lib.contains("/")) { + fail(p, lt, "write just the library's name: for libglfw.so that's link \"glfw\"") + } + prog.links.push(lib) } else if at(p, "struct") { prog.structs.push(parseStruct(p)) } else if at(p, "enum") { @@ -377,6 +382,9 @@ fn parseStruct(ptr[Parser] p) -> ast.Node { fn parseFn(ptr[Parser] p) -> ast.Node { f := node(p, "fn") f.exported = accept(p, "export") + if at(p, "ident") && isTypeName(cur(p).text) { + fail(p, cur(p), "functions start with 'fn', like: fn add(int a, int b) -> int { ... }") + } expect(p, "fn", "'fn', 'struct' or 'import'") f.name = expect(p, "ident", "a function name").text if at(p, "[") { diff --git a/src/parser.h b/src/parser.h deleted file mode 100644 index 7769892..0000000 --- a/src/parser.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "ast.h" -#include "lexer.h" - -// Parses one file's tokens; `file` is its index in g_files. -Program parse(const std::vector &tokens, int file); diff --git a/boot/platform.fch b/src/platform.fch similarity index 100% rename from boot/platform.fch rename to src/platform.fch diff --git a/src/target.cpp b/src/target.cpp deleted file mode 100644 index 3c533d4..0000000 --- a/src/target.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#include "target.h" - -#include -#include - -#include -#include -#include - -#ifdef _WIN32 -#define popen _popen -#define pclose _pclose -#else -#include -#endif - -static bool hostIsWindows() { -#ifdef _WIN32 - return true; -#else - return false; -#endif -} - -// The Finch-generated code needs these LLVM backends (the same C functions LLVM's own tools call). -extern "C" { -#ifdef FINCH_TARGET_X86 -void LLVMInitializeX86TargetInfo(); -void LLVMInitializeX86Target(); -void LLVMInitializeX86TargetMC(); -void LLVMInitializeX86AsmPrinter(); -#endif -#ifdef FINCH_TARGET_AARCH64 -void LLVMInitializeAArch64TargetInfo(); -void LLVMInitializeAArch64Target(); -void LLVMInitializeAArch64TargetMC(); -void LLVMInitializeAArch64AsmPrinter(); -#endif -} - -void initTargets() { -#ifdef FINCH_TARGET_X86 - LLVMInitializeX86TargetInfo(); - LLVMInitializeX86Target(); - LLVMInitializeX86TargetMC(); - LLVMInitializeX86AsmPrinter(); -#endif -#ifdef FINCH_TARGET_AARCH64 - LLVMInitializeAArch64TargetInfo(); - LLVMInitializeAArch64Target(); - LLVMInitializeAArch64TargetMC(); - LLVMInitializeAArch64AsmPrinter(); -#endif - llvm::InitializeNativeTarget(); - llvm::InitializeNativeTargetAsmPrinter(); -} - -void setTarget(const std::string &name) { - std::string host = llvm::sys::getDefaultTargetTriple(); - llvm::Triple hostTriple(llvm::Triple::normalize(host)); - std::string t = name; - if (name.empty()) t = host; - else if (name == "windows") t = hostIsWindows() ? host : "x86_64-w64-mingw32"; - else if (name == "linux") t = "x86_64-unknown-linux-gnu"; - else if (name == "arm64" || name == "aarch64" || name == "linux-arm64") t = "aarch64-unknown-linux-gnu"; - else if (name == "macos") t = hostTriple.isAArch64() ? "arm64-apple-macosx14.0.0" : "x86_64-apple-macosx14.0.0"; - g_target.triple = llvm::Triple(llvm::Triple::normalize(t)); - g_target.windows = g_target.triple.isOSWindows(); - g_target.msvc = g_target.triple.isWindowsMSVCEnvironment(); - g_target.darwin = g_target.triple.isOSDarwin(); - g_target.cross = hostTriple.getOS() != g_target.triple.getOS() || hostTriple.getArch() != g_target.triple.getArch(); - g_target.exe = g_target.windows ? ".exe" : ""; - - // FINCH_CC chooses the C compiler for any target; CC only when not cross-compiling. - if (const char *fc = std::getenv("FINCH_CC")) g_target.cc = fc; - else if (!g_target.cross && std::getenv("CC")) g_target.cc = std::getenv("CC"); - else if (g_target.cross && g_target.windows) g_target.cc = "x86_64-w64-mingw32-gcc"; - else if (g_target.cross && g_target.triple.isAArch64() && g_target.triple.isOSLinux()) g_target.cc = "aarch64-linux-gnu-gcc"; - else if (g_target.cross) g_target.cc = "clang --target=" + g_target.triple.str(); - else if (hostIsWindows()) g_target.cc = "clang"; - else g_target.cc = "cc"; -} - -std::string runPrefix() { - if (!g_target.cross) return ""; - if (g_target.windows && !hostIsWindows()) return "wine "; - if (g_target.triple.isAArch64() && g_target.triple.isOSLinux()) return "qemu-aarch64 "; - return ""; -} - -std::string shellQuote(const std::string &s) { -#ifdef _WIN32 - // cmd.exe: double quotes; a " inside a file name is impossible on Windows - return "\"" + s + "\""; -#else - std::string out = "'"; - for (char ch : s) out += ch == '\'' ? std::string("'\\''") : std::string(1, ch); - return out + "'"; -#endif -} - -static int exitStatus(int status) { -#ifdef _WIN32 - return status; -#else - if (status == -1) return -1; - if (WIFEXITED(status)) return WEXITSTATUS(status); - if (WIFSIGNALED(status)) return 128 + WTERMSIG(status); - return -1; -#endif -} - -int capture(const std::string &cmd, std::string &output) { - FILE *p = popen((cmd + " 2>&1").c_str(), "r"); - if (!p) return -1; - char buf[4096]; - size_t n; - while ((n = std::fread(buf, 1, sizeof buf, p)) > 0) output.append(buf, n); - return exitStatus(pclose(p)); -} - -int runCommand(const std::string &cmd, std::string *crash) { - std::fflush(stdout); - int status = std::system(cmd.c_str()); -#ifndef _WIN32 - if (crash && status != -1 && WIFSIGNALED(status)) *crash = strsignal(WTERMSIG(status)); -#else - // a crashed Windows program exits with an NTSTATUS code like 0xC0000005 - if (crash && (unsigned)status >= 0xC0000000u) { - char buf[64]; - std::snprintf(buf, sizeof buf, "exception 0x%08X%s", (unsigned)status, - (unsigned)status == 0xC0000005u ? " (access violation)" : (unsigned)status == 0xC00000FDu ? " (stack overflow)" : ""); - *crash = buf; - } -#endif - return exitStatus(status); -} - -const char *nullDevice() { return hostIsWindows() ? "NUL" : "/dev/null"; } - -std::string cacheDir() { -#ifdef _WIN32 - if (const char *l = std::getenv("LOCALAPPDATA")) return std::string(l) + "\\finch"; - if (const char *t = std::getenv("TEMP")) return std::string(t) + "\\finch"; - return "finch-cache"; -#else - if (const char *x = std::getenv("XDG_CACHE_HOME")) return std::string(x) + "/finch"; - if (const char *h = std::getenv("HOME")) return std::string(h) + "/.cache/finch"; - return "/tmp/finch-cache"; -#endif -} - -char pathListSeparator() { return hostIsWindows() ? ';' : ':'; } - -std::string dirOf(const std::string &path) { - size_t slash = hostIsWindows() ? path.find_last_of("/\\") : path.find_last_of('/'); - return slash == std::string::npos ? "." : path.substr(0, slash); -} diff --git a/src/target.h b/src/target.h deleted file mode 100644 index eb18c34..0000000 --- a/src/target.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once -// The system Finch compiles for, and everything that depends on it: -// the C compiler used to link, how the shell quotes, file names, the C ABI. - -#include - -#include - -struct TargetInfo { - llvm::Triple triple; - bool darwin = false; // macOS - bool windows = false; // Windows (MSVC or MinGW): Microsoft x64 calling convention, .exe - bool msvc = false; // the MSVC environment (link with clang + the Windows SDK) - bool cross = false; // compiling for another system than the one we run on - std::string cc; // the C compiler that links programs and builds the runtime - std::string exe; // ".exe" or "" -}; - -inline TargetInfo g_target; - -// "windows", "linux", "macos", "arm64" (ARM64 Linux), or a full LLVM triple; "" = the system finch runs on -void setTarget(const std::string &name); - -// Register the LLVM backends Finch can generate code for (x86-64, ARM64). -void initTargets(); - -// How to run a program built for g_target on this machine ("" = directly, "wine", "qemu-aarch64"). -std::string runPrefix(); - -// Quote one argument for the shell that runs our commands (sh on Unix, cmd.exe on Windows). -std::string shellQuote(const std::string &s); - -// Run a command; its exit status, and everything it printed in `output`. -int capture(const std::string &cmd, std::string &output); - -// Run a command with its output going to the terminal; its exit status (128+n for a signal). -int runCommand(const std::string &cmd, std::string *crash = nullptr); - -// The null device: /dev/null or NUL. -const char *nullDevice(); - -// The folder for cached files (~/.cache/finch, %LOCALAPPDATA%\finch). -std::string cacheDir(); - -// Separator of FINCH_PATH entries (':' or ';'). -char pathListSeparator(); - -// The folder part of a path (both / and \ on Windows). -std::string dirOf(const std::string &path); diff --git a/tests/boot.sh b/tests/boot.sh deleted file mode 100755 index ee573dd..0000000 --- a/tests/boot.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env bash -# The self-hosted compiler (boot/) must -# 1. build itself: stage1 (built by build/finch) -> stage2 -> stage3, with identical IR -# 2. give the same output as build/finch on every test in tests/run it supports -set -u -cd "$(dirname "$0")/.." -tmp=$(mktemp -d) -trap 'rm -rf "$tmp"' EXIT - -build/finch build boot/main.fch -o "$tmp/boot1" || exit 1 -# Stage 2: the compiler built by itself. Until it can read the C headers its own source imports -# (libclang's), this stage can't be made, and the tests below run on stage 1 instead. -boot=$tmp/boot1 -if "$tmp/boot1" build boot/main.fch -o "$tmp/boot2" > "$tmp/stage2.err" 2>&1; then - "$tmp/boot1" ir boot/main.fch > "$tmp/stage2.ll" - "$tmp/boot2" ir boot/main.fch > "$tmp/stage3.ll" - if cmp -s "$tmp/stage2.ll" "$tmp/stage3.ll"; then - echo "bootstrap: stage 2 and stage 3 are identical ($(wc -l < "$tmp/stage3.ll") lines of IR)" - boot=$tmp/boot2 - else - echo "bootstrap: FAILED, stage 2 and stage 3 differ" - exit 1 - fi -else - echo "bootstrap: not yet -- stage 1 can't build itself: $(head -1 "$tmp/stage2.err")" -fi - -pass=0; failed=0; skipped=0 -# tests/run: what the C++ compiler also runs. tests/new: the language since then (enums, match, ...), -# which only this compiler has. -for f in tests/run/*.fch tests/new/*.fch; do - grep -q "^fn main" "$f" || continue - input="${f%.fch}.in" - [ -f "$input" ] || input=/dev/null - if ! "$boot" build "$f" -o "$tmp/prog" > "$tmp/err" 2>&1; then - failed=$((failed + 1)) - echo "FAIL (compile) $f" - head -3 "$tmp/err" - continue - fi - got=$("$tmp/prog" < "$input" 2>&1) - if [ "$got" == "$(cat "${f%.fch}.out")" ]; then - pass=$((pass + 1)) - else - failed=$((failed + 1)) - echo "FAIL (output) $f" - diff <(echo "$got") "${f%.fch}.out" | head -10 - fi -done -# programs that must be refused, and say why: the first line is "// expect: " -for f in tests/new/fail/*.fch; do - expect=$(head -1 "$f" | sed -n 's|^// expect: ||p') - got=$("$boot" build "$f" -o "$tmp/refused" 2>&1) - status=$? - if [ $status -ne 0 ] && [[ "$got" == *"$expect"* ]]; then - pass=$((pass + 1)) - else - failed=$((failed + 1)) - echo "FAIL $f (wanted: $expect)" - echo "$got" | head -3 - fi -done -# the same programs with debug info (-g -O0): the metadata has to be valid for every kind of thing a program has -for f in tests/new/enums.fch tests/new/generics.fch tests/new/std_json.fch tests/run/basics.fch tests/run/methods_basic.fch \ - tests/run/maps.fch tests/run/errors.fch tests/run/defer.fch tests/run/c_structs.fch tests/run/memory.fch; do - input="${f%.fch}.in" - [ -f "$input" ] || input=/dev/null - if "$boot" build "$f" -g -O0 -o "$tmp/progg" > "$tmp/err" 2>&1 && [ "$("$tmp/progg" < "$input" 2>&1)" == "$(cat "${f%.fch}.out")" ]; then - pass=$((pass + 1)) - else - failed=$((failed + 1)) - echo "FAIL (-g) $f" - head -3 "$tmp/err" - fi -done - -# a library a C program loads (finch build --shared), with the compiler under test -if FINCH_RT="$PWD/runtime/finch_rt.c" FINCH="$boot" tests/shared.sh > "$tmp/shared.out" 2>&1; then - pass=$((pass + 1)) -else - failed=$((failed + 1)) - echo "FAIL tests/shared.sh" - head -5 "$tmp/shared.out" -fi -echo "self-hosted compiler: $pass passed, $failed failed, $skipped skipped (features it doesn't have)" -[ $failed -eq 0 ] diff --git a/tests/cimport_boot_test.fch b/tests/cimport_boot_test.fch deleted file mode 100644 index 98d17c0..0000000 --- a/tests/cimport_boot_test.fch +++ /dev/null @@ -1,18 +0,0 @@ -import ast -import cimport - -fn main() -> ! { - headers := [cimport.Header(path: "stdio.h", where: "test:1:1"), cimport.Header(path: "/home/nexoniarz/.claude/jobs/4af40c6f/tmp/cx/h.h", where: "test:2:1")] - c := try cimport.importHeaders(headers, []) - print("functions", c.fns.len, "consts", c.consts.len, "globals", c.globals.len, "structs", c.structs.len) - f := c.fns["add"] - print(f.name, ast.show(f.ret), f.params.len, f.unsupported) - m := c.fns["many"] - print(m.name, ast.show(m.ret), m.params.len, ast.show(m.params[0]), ast.show(m.params[1]), m.unsupported) - print(c.consts["N"].i, c.consts["Green"].i, c.consts["EOF"].i) - print(ast.show(c.globals["counter"]), ast.show(c.globals["stdout"])) - s := c.structs["Vec2"] - print(s.name, s.size, s.align, s.fields.len, s.unsupported) - printf := c.fns["printf"] - print(printf.name, printf.variadic, printf.params.len, ast.show(printf.params[0])) -} diff --git a/tests/run.sh b/tests/run.sh index fd4d0af..8c697ac 100755 --- a/tests/run.sh +++ b/tests/run.sh @@ -3,16 +3,19 @@ # tests/run/*.fch must compile and print exactly what is in the matching .out file # (files without `fn main` are modules or helpers and are skipped; # a matching .in file is fed to the program as its input) -# tests/fail/*.fch must fail; the first line is "// expect: " +# tests/fail/*.fch and tests/new/fail/*.fch must fail; the first line is "// expect: " +# the same programs built with -g -O0, and a library loaded by a C program (tests/shared.sh) # MEMCHECK=1 tests/run.sh also runs every program under valgrind: no leaks, no bad memory access set -u cd "$(dirname "$0")" FINCH=${FINCH:-../build/finch} +FINCH="$(cd "$(dirname "$FINCH")" && pwd)/$(basename "$FINCH")" # tests/shared.sh runs from another folder +export FINCH_RT=${FINCH_RT:-$PWD/../runtime/finch_rt.c} pass=0; failed=0 tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT -for f in run/*.fch; do +for f in run/*.fch new/*.fch; do grep -q "^fn main" "$f" || continue want="${f%.fch}.out" input="${f%.fch}.in" @@ -38,7 +41,7 @@ for f in run/*.fch; do pass=$((pass + 1)) done -for f in fail/*.fch; do +for f in fail/*.fch new/fail/*.fch; do expect=$(head -1 "$f" | sed -n 's|^// expect: ||p') got=$("$FINCH" run "$f" < /dev/null 2>&1) status=$? @@ -52,5 +55,28 @@ for f in fail/*.fch; do fi done +# the same programs with debug info (-g -O0): the metadata has to be valid for every kind of thing a program has +for f in new/enums.fch new/generics.fch new/std_json.fch run/basics.fch run/methods_basic.fch run/maps.fch run/errors.fch \ + run/defer.fch run/c_structs.fch run/memory.fch; do + input="${f%.fch}.in" + [ -f "$input" ] || input=/dev/null + if "$FINCH" build "$f" -g -O0 -o "$tmp/progg" > "$tmp/err" 2>&1 && [ "$("$tmp/progg" < "$input" 2>&1)" == "$(cat "${f%.fch}.out")" ]; then + pass=$((pass + 1)) + else + failed=$((failed + 1)) + echo "FAIL (-g) $f" + head -3 "$tmp/err" + fi +done + +# a library a C program loads (finch build --shared) +if FINCH="$FINCH" ./shared.sh > "$tmp/shared.out" 2>&1; then + pass=$((pass + 1)) +else + failed=$((failed + 1)) + echo "FAIL shared.sh" + head -5 "$tmp/shared.out" +fi + echo "$pass passed, $failed failed" [ $failed -eq 0 ] diff --git a/tests/shared.sh b/tests/shared.sh index 83ea020..5d730ef 100755 --- a/tests/shared.sh +++ b/tests/shared.sh @@ -4,6 +4,7 @@ set -e cd "$(dirname "$0")/shared" FINCH=${FINCH:-../../build/finch} +export FINCH_RT=${FINCH_RT:-$PWD/../../runtime/finch_rt.c} tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT "$FINCH" build mod.fch --shared -o "$tmp/libmod.so"