about summary refs log tree commit diff
path: root/bootstrap
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-15 17:34:39 +0200
committerBaitinq <[email protected]>2025-07-15 18:00:31 +0200
commitcc56ed42486c2636af50bae451825ad90cfd4b6c (patch)
tree2307d6ced51f427405e4152b4ff1493e245a6b30 /bootstrap
parentBoostrap: Support generating LLVM IR file (diff)
downloadpry-lang-cc56ed42486c2636af50bae451825ad90cfd4b6c.tar.gz
pry-lang-cc56ed42486c2636af50bae451825ad90cfd4b6c.tar.bz2
pry-lang-cc56ed42486c2636af50bae451825ad90cfd4b6c.zip
Finish bootstrapping :^)
Diffstat (limited to 'bootstrap')
-rw-r--r--bootstrap/output.ll14737
1 files changed, 14737 insertions, 0 deletions
diff --git a/bootstrap/output.ll b/bootstrap/output.ll
new file mode 100644
index 0000000..9f1baf0
--- /dev/null
+++ b/bootstrap/output.ll
@@ -0,0 +1,14737 @@
+; ModuleID = 'module'
+source_filename = "module"
+
+%arena = type { ptr, i64 }
+%arena.0 = type { ptr, i64 }
+%arena.1 = type { ptr, i64 }
+%arena.4 = type { ptr, i64 }
+%token = type { i64, ptr }
+%token.2 = type { i64, ptr }
+%tokenizer = type { ptr, i64, i64, ptr }
+%tokenizer.3 = type { ptr, i64, i64, ptr }
+%slice = type { ptr, i64 }
+%parser = type { ptr, i64, i64, ptr, ptr }
+%NODE_FUNCTION_CALL_STATEMENT_DATA = type { ptr, ptr, i64 }
+%NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA = type { ptr, ptr }
+%Node = type { i64, ptr }
+%NODE_ADDITIVE_EXPRESSION_DATA = type { i1, ptr, ptr }
+%codegen = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
+%NODE_RETURN_STATEMENT_DATA = type { ptr }
+%NODE_TYPE_SIMPLE_TYPE_DATA = type { ptr, ptr }
+%NODE_TYPE_POINTER_TYPE_DATA = type { ptr }
+%NODE_CAST_STATEMENT_DATA = type { ptr, ptr }
+%NODE_SIZEOF_STATEMENT_DATA = type { ptr }
+%NODE_TYPE_FUNCTION_TYPE_DATA = type { ptr, i64, ptr }
+%NODE_IF_STATEMENT_DATA = type { ptr, ptr, i64 }
+%NODE_WHILE_STATEMENT_DATA = type { ptr, ptr, i64 }
+%NODE_ASSIGNMENT_STATEMENT_DATA = type { i1, i1, ptr, ptr }
+%NODE_TYPE_STRUCT_TYPE_DATA = type { ptr, i64 }
+%NODE_FUNCTION_DEFINITION_DATA = type { ptr, i64, ptr, i64, ptr }
+%NODE_STRUCT_INSTANCIATION_DATA = type { ptr }
+%NODE_PRIMARY_EXPRESSION_NUMBER_DATA = type { i64 }
+%NODE_PRIMARY_EXPRESSION_BOOLEAN_DATA = type { i1 }
+%NODE_PRIMARY_EXPRESSION_CHAR_DATA = type { i8 }
+%NODE_PRIMARY_EXPRESSION_STRING_DATA = type { ptr }
+%NODE_FIELD_ACCESS_DATA = type { ptr, ptr }
+%NODE_EQUALITY_EXPRESSION_DATA = type { ptr, ptr, i64 }
+%NODE_UNARY_EXPRESSION_DATA = type { i64, ptr }
+%NODE_MULTIPLICATIVE_EXPRESSION_DATA = type { ptr, ptr, i64 }
+%NODE_IMPORT_DECLARATION_DATA = type { ptr, ptr }
+%NODE_PROGRAM_DATA = type { ptr, i64 }
+%HashMap = type { ptr, i64, ptr }
+%HashMapEntry = type { ptr, ptr, ptr }
+%Environment = type { ptr, i64, ptr }
+%Scope = type { ptr }
+%Variable = type { ptr, ptr, ptr, ptr, ptr }
+%StructField = type { ptr, ptr }
+
+@0 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@1 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@2 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@3 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@TOKEN_IMPORT = global i64 1
+@TOKEN_LET = global i64 2
+@TOKEN_EXTERN = global i64 3
+@TOKEN_IF = global i64 4
+@TOKEN_WHILE = global i64 5
+@TOKEN_RETURN = global i64 6
+@TOKEN_BREAK = global i64 7
+@TOKEN_CONTINUE = global i64 8
+@TOKEN_ARROW = global i64 9
+@TOKEN_STRUCT = global i64 10
+@TOKEN_TYPE = global i64 34
+@TOKEN_IDENTIFIER = global i64 11
+@TOKEN_NUMBER = global i64 12
+@TOKEN_BOOLEAN = global i64 13
+@TOKEN_NULL = global i64 14
+@TOKEN_CHAR = global i64 15
+@TOKEN_STRING = global i64 16
+@TOKEN_EQUALS = global i64 17
+@TOKEN_PLUS = global i64 18
+@TOKEN_MINUS = global i64 19
+@TOKEN_MUL = global i64 20
+@TOKEN_DIV = global i64 21
+@TOKEN_MOD = global i64 22
+@TOKEN_BANG = global i64 23
+@TOKEN_LESS = global i64 24
+@TOKEN_GREATER = global i64 25
+@TOKEN_DOT = global i64 26
+@TOKEN_SEMICOLON = global i64 27
+@TOKEN_COMMA = global i64 28
+@TOKEN_COLON = global i64 29
+@TOKEN_LPAREN = global i64 30
+@TOKEN_RPAREN = global i64 31
+@TOKEN_LBRACE = global i64 32
+@TOKEN_RBRACE = global i64 33
+@4 = private unnamed_addr constant [8 x i8] c"Import\0A\00", align 1
+@5 = private unnamed_addr constant [5 x i8] c"Let\0A\00", align 1
+@6 = private unnamed_addr constant [8 x i8] c"Extern\0A\00", align 1
+@7 = private unnamed_addr constant [4 x i8] c"If\0A\00", align 1
+@8 = private unnamed_addr constant [7 x i8] c"While\0A\00", align 1
+@9 = private unnamed_addr constant [8 x i8] c"Return\0A\00", align 1
+@10 = private unnamed_addr constant [7 x i8] c"Break\0A\00", align 1
+@11 = private unnamed_addr constant [10 x i8] c"Continue\0A\00", align 1
+@12 = private unnamed_addr constant [7 x i8] c"Arrow\0A\00", align 1
+@13 = private unnamed_addr constant [8 x i8] c"Struct\0A\00", align 1
+@14 = private unnamed_addr constant [6 x i8] c"Type\0A\00", align 1
+@15 = private unnamed_addr constant [16 x i8] c"Identifier: %s\0A\00", align 1
+@16 = private unnamed_addr constant [12 x i8] c"Number: %d\0A\00", align 1
+@17 = private unnamed_addr constant [13 x i8] c"Boolean: %d\0A\00", align 1
+@18 = private unnamed_addr constant [6 x i8] c"Null\0A\00", align 1
+@19 = private unnamed_addr constant [10 x i8] c"Char: %c\0A\00", align 1
+@20 = private unnamed_addr constant [12 x i8] c"String: %s\0A\00", align 1
+@21 = private unnamed_addr constant [8 x i8] c"Equals\0A\00", align 1
+@22 = private unnamed_addr constant [6 x i8] c"Plus\0A\00", align 1
+@23 = private unnamed_addr constant [7 x i8] c"Minus\0A\00", align 1
+@24 = private unnamed_addr constant [5 x i8] c"Mul\0A\00", align 1
+@25 = private unnamed_addr constant [5 x i8] c"Div\0A\00", align 1
+@26 = private unnamed_addr constant [5 x i8] c"Mod\0A\00", align 1
+@27 = private unnamed_addr constant [6 x i8] c"Bang\0A\00", align 1
+@28 = private unnamed_addr constant [6 x i8] c"Less\0A\00", align 1
+@29 = private unnamed_addr constant [9 x i8] c"Greater\0A\00", align 1
+@30 = private unnamed_addr constant [5 x i8] c"Dot\0A\00", align 1
+@31 = private unnamed_addr constant [11 x i8] c"Semicolon\0A\00", align 1
+@32 = private unnamed_addr constant [7 x i8] c"Comma\0A\00", align 1
+@33 = private unnamed_addr constant [7 x i8] c"Colon\0A\00", align 1
+@34 = private unnamed_addr constant [8 x i8] c"LParen\0A\00", align 1
+@35 = private unnamed_addr constant [8 x i8] c"RParen\0A\00", align 1
+@36 = private unnamed_addr constant [8 x i8] c"LBrace\0A\00", align 1
+@37 = private unnamed_addr constant [8 x i8] c"RBrace\0A\00", align 1
+@38 = private unnamed_addr constant [2 x i8] c"'\00", align 1
+@39 = private unnamed_addr constant [2 x i8] c"'\00", align 1
+@40 = private unnamed_addr constant [2 x i8] c"\22\00", align 1
+@41 = private unnamed_addr constant [2 x i8] c"\22\00", align 1
+@42 = private unnamed_addr constant [3 x i8] c"/*\00", align 1
+@43 = private unnamed_addr constant [3 x i8] c"*/\00", align 1
+@44 = private unnamed_addr constant [7 x i8] c"import\00", align 1
+@45 = private unnamed_addr constant [4 x i8] c"let\00", align 1
+@46 = private unnamed_addr constant [7 x i8] c"extern\00", align 1
+@47 = private unnamed_addr constant [3 x i8] c"if\00", align 1
+@48 = private unnamed_addr constant [6 x i8] c"while\00", align 1
+@49 = private unnamed_addr constant [7 x i8] c"return\00", align 1
+@50 = private unnamed_addr constant [6 x i8] c"break\00", align 1
+@51 = private unnamed_addr constant [9 x i8] c"continue\00", align 1
+@52 = private unnamed_addr constant [5 x i8] c"true\00", align 1
+@53 = private unnamed_addr constant [6 x i8] c"false\00", align 1
+@54 = private unnamed_addr constant [5 x i8] c"null\00", align 1
+@55 = private unnamed_addr constant [7 x i8] c"struct\00", align 1
+@56 = private unnamed_addr constant [8 x i8] c"newtype\00", align 1
+@57 = private unnamed_addr constant [3 x i8] c"=>\00", align 1
+@58 = private unnamed_addr constant [2 x i8] c";\00", align 1
+@59 = private unnamed_addr constant [2 x i8] c",\00", align 1
+@60 = private unnamed_addr constant [2 x i8] c":\00", align 1
+@61 = private unnamed_addr constant [2 x i8] c"(\00", align 1
+@62 = private unnamed_addr constant [2 x i8] c")\00", align 1
+@63 = private unnamed_addr constant [2 x i8] c"{\00", align 1
+@64 = private unnamed_addr constant [2 x i8] c"}\00", align 1
+@65 = private unnamed_addr constant [2 x i8] c"=\00", align 1
+@66 = private unnamed_addr constant [2 x i8] c"+\00", align 1
+@67 = private unnamed_addr constant [2 x i8] c"-\00", align 1
+@68 = private unnamed_addr constant [2 x i8] c"*\00", align 1
+@69 = private unnamed_addr constant [2 x i8] c"/\00", align 1
+@70 = private unnamed_addr constant [2 x i8] c"%\00", align 1
+@71 = private unnamed_addr constant [2 x i8] c"!\00", align 1
+@72 = private unnamed_addr constant [2 x i8] c"<\00", align 1
+@73 = private unnamed_addr constant [2 x i8] c">\00", align 1
+@74 = private unnamed_addr constant [2 x i8] c".\00", align 1
+@75 = private unnamed_addr constant [11 x i8] c"NO IDENT!\0A\00", align 1
+@76 = private unnamed_addr constant [15 x i8] c"File size: %d\0A\00", align 1
+@77 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
+@78 = private unnamed_addr constant [15 x i8] c"Add token: %d\0A\00", align 1
+@79 = private unnamed_addr constant [18 x i8] c"PRINT TOKENS: %d\0A\00", align 1
+@80 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@81 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@TOKEN_IMPORT.4 = global i64 1
+@TOKEN_LET.5 = global i64 2
+@TOKEN_EXTERN.6 = global i64 3
+@TOKEN_IF.7 = global i64 4
+@TOKEN_WHILE.8 = global i64 5
+@TOKEN_RETURN.9 = global i64 6
+@TOKEN_BREAK.10 = global i64 7
+@TOKEN_CONTINUE.11 = global i64 8
+@TOKEN_ARROW.12 = global i64 9
+@TOKEN_STRUCT.13 = global i64 10
+@TOKEN_TYPE.14 = global i64 34
+@TOKEN_IDENTIFIER.15 = global i64 11
+@TOKEN_NUMBER.16 = global i64 12
+@TOKEN_BOOLEAN.17 = global i64 13
+@TOKEN_NULL.18 = global i64 14
+@TOKEN_CHAR.19 = global i64 15
+@TOKEN_STRING.20 = global i64 16
+@TOKEN_EQUALS.21 = global i64 17
+@TOKEN_PLUS.22 = global i64 18
+@TOKEN_MINUS.23 = global i64 19
+@TOKEN_MUL.24 = global i64 20
+@TOKEN_DIV.25 = global i64 21
+@TOKEN_MOD.26 = global i64 22
+@TOKEN_BANG.27 = global i64 23
+@TOKEN_LESS.28 = global i64 24
+@TOKEN_GREATER.29 = global i64 25
+@TOKEN_DOT.30 = global i64 26
+@TOKEN_SEMICOLON.31 = global i64 27
+@TOKEN_COMMA.32 = global i64 28
+@TOKEN_COLON.33 = global i64 29
+@TOKEN_LPAREN.34 = global i64 30
+@TOKEN_RPAREN.35 = global i64 31
+@TOKEN_LBRACE.36 = global i64 32
+@TOKEN_RBRACE.37 = global i64 33
+@82 = private unnamed_addr constant [8 x i8] c"Import\0A\00", align 1
+@83 = private unnamed_addr constant [5 x i8] c"Let\0A\00", align 1
+@84 = private unnamed_addr constant [8 x i8] c"Extern\0A\00", align 1
+@85 = private unnamed_addr constant [4 x i8] c"If\0A\00", align 1
+@86 = private unnamed_addr constant [7 x i8] c"While\0A\00", align 1
+@87 = private unnamed_addr constant [8 x i8] c"Return\0A\00", align 1
+@88 = private unnamed_addr constant [7 x i8] c"Break\0A\00", align 1
+@89 = private unnamed_addr constant [10 x i8] c"Continue\0A\00", align 1
+@90 = private unnamed_addr constant [7 x i8] c"Arrow\0A\00", align 1
+@91 = private unnamed_addr constant [8 x i8] c"Struct\0A\00", align 1
+@92 = private unnamed_addr constant [6 x i8] c"Type\0A\00", align 1
+@93 = private unnamed_addr constant [16 x i8] c"Identifier: %s\0A\00", align 1
+@94 = private unnamed_addr constant [12 x i8] c"Number: %d\0A\00", align 1
+@95 = private unnamed_addr constant [13 x i8] c"Boolean: %d\0A\00", align 1
+@96 = private unnamed_addr constant [6 x i8] c"Null\0A\00", align 1
+@97 = private unnamed_addr constant [10 x i8] c"Char: %c\0A\00", align 1
+@98 = private unnamed_addr constant [12 x i8] c"String: %s\0A\00", align 1
+@99 = private unnamed_addr constant [8 x i8] c"Equals\0A\00", align 1
+@100 = private unnamed_addr constant [6 x i8] c"Plus\0A\00", align 1
+@101 = private unnamed_addr constant [7 x i8] c"Minus\0A\00", align 1
+@102 = private unnamed_addr constant [5 x i8] c"Mul\0A\00", align 1
+@103 = private unnamed_addr constant [5 x i8] c"Div\0A\00", align 1
+@104 = private unnamed_addr constant [5 x i8] c"Mod\0A\00", align 1
+@105 = private unnamed_addr constant [6 x i8] c"Bang\0A\00", align 1
+@106 = private unnamed_addr constant [6 x i8] c"Less\0A\00", align 1
+@107 = private unnamed_addr constant [9 x i8] c"Greater\0A\00", align 1
+@108 = private unnamed_addr constant [5 x i8] c"Dot\0A\00", align 1
+@109 = private unnamed_addr constant [11 x i8] c"Semicolon\0A\00", align 1
+@110 = private unnamed_addr constant [7 x i8] c"Comma\0A\00", align 1
+@111 = private unnamed_addr constant [7 x i8] c"Colon\0A\00", align 1
+@112 = private unnamed_addr constant [8 x i8] c"LParen\0A\00", align 1
+@113 = private unnamed_addr constant [8 x i8] c"RParen\0A\00", align 1
+@114 = private unnamed_addr constant [8 x i8] c"LBrace\0A\00", align 1
+@115 = private unnamed_addr constant [8 x i8] c"RBrace\0A\00", align 1
+@116 = private unnamed_addr constant [2 x i8] c"'\00", align 1
+@117 = private unnamed_addr constant [2 x i8] c"'\00", align 1
+@118 = private unnamed_addr constant [2 x i8] c"\22\00", align 1
+@119 = private unnamed_addr constant [2 x i8] c"\22\00", align 1
+@120 = private unnamed_addr constant [3 x i8] c"/*\00", align 1
+@121 = private unnamed_addr constant [3 x i8] c"*/\00", align 1
+@122 = private unnamed_addr constant [7 x i8] c"import\00", align 1
+@123 = private unnamed_addr constant [4 x i8] c"let\00", align 1
+@124 = private unnamed_addr constant [7 x i8] c"extern\00", align 1
+@125 = private unnamed_addr constant [3 x i8] c"if\00", align 1
+@126 = private unnamed_addr constant [6 x i8] c"while\00", align 1
+@127 = private unnamed_addr constant [7 x i8] c"return\00", align 1
+@128 = private unnamed_addr constant [6 x i8] c"break\00", align 1
+@129 = private unnamed_addr constant [9 x i8] c"continue\00", align 1
+@130 = private unnamed_addr constant [5 x i8] c"true\00", align 1
+@131 = private unnamed_addr constant [6 x i8] c"false\00", align 1
+@132 = private unnamed_addr constant [5 x i8] c"null\00", align 1
+@133 = private unnamed_addr constant [7 x i8] c"struct\00", align 1
+@134 = private unnamed_addr constant [8 x i8] c"newtype\00", align 1
+@135 = private unnamed_addr constant [3 x i8] c"=>\00", align 1
+@136 = private unnamed_addr constant [2 x i8] c";\00", align 1
+@137 = private unnamed_addr constant [2 x i8] c",\00", align 1
+@138 = private unnamed_addr constant [2 x i8] c":\00", align 1
+@139 = private unnamed_addr constant [2 x i8] c"(\00", align 1
+@140 = private unnamed_addr constant [2 x i8] c")\00", align 1
+@141 = private unnamed_addr constant [2 x i8] c"{\00", align 1
+@142 = private unnamed_addr constant [2 x i8] c"}\00", align 1
+@143 = private unnamed_addr constant [2 x i8] c"=\00", align 1
+@144 = private unnamed_addr constant [2 x i8] c"+\00", align 1
+@145 = private unnamed_addr constant [2 x i8] c"-\00", align 1
+@146 = private unnamed_addr constant [2 x i8] c"*\00", align 1
+@147 = private unnamed_addr constant [2 x i8] c"/\00", align 1
+@148 = private unnamed_addr constant [2 x i8] c"%\00", align 1
+@149 = private unnamed_addr constant [2 x i8] c"!\00", align 1
+@150 = private unnamed_addr constant [2 x i8] c"<\00", align 1
+@151 = private unnamed_addr constant [2 x i8] c">\00", align 1
+@152 = private unnamed_addr constant [2 x i8] c".\00", align 1
+@153 = private unnamed_addr constant [11 x i8] c"NO IDENT!\0A\00", align 1
+@154 = private unnamed_addr constant [15 x i8] c"File size: %d\0A\00", align 1
+@155 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
+@156 = private unnamed_addr constant [15 x i8] c"Add token: %d\0A\00", align 1
+@157 = private unnamed_addr constant [18 x i8] c"PRINT TOKENS: %d\0A\00", align 1
+@NODE_PROGRAM = global i64 1
+@NODE_STATEMENT = global i64 2
+@NODE_ASSIGNMENT_STATEMENT = global i64 3
+@NODE_IMPORT_DECLARATION = global i64 4
+@NODE_FUNCTION_CALL_STATEMENT = global i64 5
+@NODE_IF_STATEMENT = global i64 6
+@NODE_WHILE_STATEMENT = global i64 7
+@NODE_EQUALITY_EXPRESSION = global i64 8
+@NODE_ADDITIVE_EXPRESSION = global i64 9
+@NODE_MULTIPLICATIVE_EXPRESSION = global i64 10
+@NODE_UNARY_EXPRESSION = global i64 11
+@NODE_POSTFIX_EXPRESSION = global i64 12
+@NODE_PRIMARY_EXPRESSION_NUMBER = global i64 13
+@NODE_PRIMARY_EXPRESSION_BOOLEAN = global i64 14
+@NODE_PRIMARY_EXPRESSION_NULL = global i64 15
+@NODE_PRIMARY_EXPRESSION_CHAR = global i64 16
+@NODE_PRIMARY_EXPRESSION_STRING = global i64 17
+@NODE_PRIMARY_EXPRESSION_IDENTIFIER = global i64 18
+@NODE_FUNCTION_DEFINITION = global i64 19
+@NODE_STRUCT_INSTANCIATION = global i64 20
+@NODE_FIELD_ACCESS = global i64 21
+@NODE_TYPE_SIMPLE_TYPE = global i64 22
+@NODE_TYPE_FUNCTION_TYPE = global i64 23
+@NODE_TYPE_POINTER_TYPE = global i64 24
+@NODE_TYPE_STRUCT_TYPE = global i64 25
+@NODE_RETURN_STATEMENT = global i64 26
+@NODE_CAST_STATEMENT = global i64 27
+@NODE_SIZEOF_STATEMENT = global i64 28
+@NODE_BREAK_STATEMENT = global i64 29
+@NODE_CONTINUE_STATEMENT = global i64 30
+@EQUALITY_EXPRESSION_TYPE_EQ = global i64 0
+@EQUALITY_EXPRESSION_TYPE_NE = global i64 1
+@EQUALITY_EXPRESSION_TYPE_GE = global i64 2
+@EQUALITY_EXPRESSION_TYPE_LE = global i64 3
+@EQUALITY_EXPRESSION_TYPE_LT = global i64 4
+@EQUALITY_EXPRESSION_TYPE_GT = global i64 5
+@MULTIPLICATIVE_EXPRESSION_TYPE_MUL = global i64 0
+@MULTIPLICATIVE_EXPRESSION_TYPE_DIV = global i64 1
+@MULTIPLICATIVE_EXPRESSION_TYPE_MOD = global i64 2
+@UNARY_EXPRESSION_TYPE_NOT = global i64 0
+@UNARY_EXPRESSION_TYPE_MINUS = global i64 1
+@UNARY_EXPRESSION_TYPE_STAR = global i64 2
+@158 = private unnamed_addr constant [5 x i8] c"cast\00", align 1
+@159 = private unnamed_addr constant [7 x i8] c"sizeof\00", align 1
+@160 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@161 = private unnamed_addr constant [16 x i8] c"STRUCT TYP: %d\0A\00", align 1
+@162 = private unnamed_addr constant [8 x i8] c"NO TOK\0A\00", align 1
+@163 = private unnamed_addr constant [9 x i8] c"./std/%s\00", align 1
+@164 = private unnamed_addr constant [2 x i8] c".\00", align 1
+@165 = private unnamed_addr constant [6 x i8] c"None\0A\00", align 1
+@166 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@167 = private unnamed_addr constant [18 x i8] c"ASSERTION FAILED\0A\00", align 1
+@LLVMCodeGenLevelDefault = global i64 2
+@LLVMRelocDefault = global i64 0
+@LLVMCodeModelDefault = global i64 0
+@LLVMAbortProcessAction = global i64 0
+@LLVMObjectFile = global i64 1
+@168 = global i64 5
+@LLVMIntEQ = global i64 32
+@LLVMIntNE = global i64 33
+@LLVMIntUGT = global i64 34
+@LLVMIntUGE = global i64 35
+@LLVMIntULT = global i64 36
+@LLVMIntULE = global i64 37
+@LLVMIntSGT = global i64 38
+@LLVMIntSGE = global i64 39
+@LLVMIntSLT = global i64 40
+@LLVMIntSLE = global i64 41
+@169 = private unnamed_addr constant [7 x i8] c"module\00", align 1
+@170 = private unnamed_addr constant [8 x i8] c"varargs\00", align 1
+@171 = private unnamed_addr constant [27 x i8] c"Types do not match: %d != \00", align 1
+@172 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
+@173 = private unnamed_addr constant [34 x i8] c"Simple types do not match: %s != \00", align 1
+@174 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
+@175 = private unnamed_addr constant [36 x i8] c"Function return types do not match\0A\00", align 1
+@176 = private unnamed_addr constant [41 x i8] c"Function parameter lengths do not match\0A\00", align 1
+@177 = private unnamed_addr constant [39 x i8] c"Function parameter types do not match\0A\00", align 1
+@178 = private unnamed_addr constant [28 x i8] c"Pointer types do not match\0A\00", align 1
+@179 = private unnamed_addr constant [35 x i8] c"Struct field lengths do not match\0A\00", align 1
+@180 = private unnamed_addr constant [33 x i8] c"Struct field types do not match\0A\00", align 1
+@181 = private unnamed_addr constant [3 x i8] c"i8\00", align 1
+@182 = private unnamed_addr constant [4 x i8] c"i64\00", align 1
+@183 = private unnamed_addr constant [5 x i8] c"bool\00", align 1
+@184 = private unnamed_addr constant [5 x i8] c"void\00", align 1
+@185 = private unnamed_addr constant [8 x i8] c"varargs\00", align 1
+@186 = private unnamed_addr constant [20 x i8] c"NO SIMPLE TYPE %s!\0A\00", align 1
+@187 = private unnamed_addr constant [8 x i8] c"varargs\00", align 1
+@188 = private unnamed_addr constant [18 x i8] c"NO TYPEEE BOI %d\0A\00", align 1
+@189 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@190 = private unnamed_addr constant [5 x i8] c"void\00", align 1
+@191 = private unnamed_addr constant [4 x i8] c"i64\00", align 1
+@192 = private unnamed_addr constant [5 x i8] c"bool\00", align 1
+@193 = private unnamed_addr constant [3 x i8] c"i8\00", align 1
+@194 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@195 = private unnamed_addr constant [3 x i8] c"i8\00", align 1
+@196 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@197 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@198 = private unnamed_addr constant [8 x i8] c"varargs\00", align 1
+@199 = private unnamed_addr constant [13 x i8] c"unnamed_func\00", align 1
+@200 = private unnamed_addr constant [11 x i8] c"entrypoint\00", align 1
+@201 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@202 = private unnamed_addr constant [5 x i8] c"bool\00", align 1
+@203 = private unnamed_addr constant [4 x i8] c"i64\00", align 1
+@204 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@205 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@206 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@207 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@208 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@209 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@210 = private unnamed_addr constant [5 x i8] c"bool\00", align 1
+@211 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@212 = private unnamed_addr constant [5 x i8] c"bool\00", align 1
+@213 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@214 = private unnamed_addr constant [4 x i8] c"i64\00", align 1
+@215 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@216 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@217 = private unnamed_addr constant [4 x i8] c"i64\00", align 1
+@218 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@219 = private unnamed_addr constant [14 x i8] c"ASSERT 1: %d\0A\00", align 1
+@220 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@221 = private unnamed_addr constant [13 x i8] c"ASSERT 2 %d\0A\00", align 1
+@222 = private unnamed_addr constant [19 x i8] c"NO variable 2: %s\0A\00", align 1
+@223 = private unnamed_addr constant [19 x i8] c"NO variable 1: %s\0A\00", align 1
+@224 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@225 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@226 = private unnamed_addr constant [11 x i8] c"then_block\00", align 1
+@227 = private unnamed_addr constant [12 x i8] c"merge_block\00", align 1
+@228 = private unnamed_addr constant [12 x i8] c"while_block\00", align 1
+@229 = private unnamed_addr constant [12 x i8] c"inner_block\00", align 1
+@230 = private unnamed_addr constant [12 x i8] c"outer_block\00", align 1
+@231 = private unnamed_addr constant [13 x i8] c"ASSERT 3 %d\0A\00", align 1
+@232 = private unnamed_addr constant [10 x i8] c"output.ll\00", align 1
+@233 = private unnamed_addr constant [19 x i8] c"Target output: %s\0A\00", align 1
+@234 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@235 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@236 = private unnamed_addr constant [25 x i8] c"Verification output: %s\0A\00", align 1
+@237 = private unnamed_addr constant [19 x i8] c"bootstrap_output.o\00", align 1
+@238 = private unnamed_addr constant [27 x i8] c"Object file generated: %s\0A\00", align 1
+@239 = private unnamed_addr constant [2 x i8] c"r\00", align 1
+@240 = private unnamed_addr constant [16 x i8] c"Need filename!\0A\00", align 1
+@241 = private unnamed_addr constant [14 x i8] c"--generate-ir\00", align 1
+@242 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
+
+declare void @printf(ptr, ...)
+
+declare void @exit(i64)
+
+define i1 @strcmp(ptr %0, ptr %1) {
+entrypoint:
+  %stra = alloca ptr, align 8
+  store ptr %0, ptr %stra, align 8
+  %strb = alloca ptr, align 8
+  store ptr %1, ptr %strb, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block4, %entrypoint
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %2 = load ptr, ptr %stra, align 8
+  %3 = load i64, ptr %i, align 4
+  %4 = getelementptr i8, ptr %2, i64 %3
+  %5 = load i8, ptr %4, align 1
+  %ca = alloca i8, align 1
+  store i8 %5, ptr %ca, align 1
+  %6 = load ptr, ptr %strb, align 8
+  %7 = load i64, ptr %i, align 4
+  %8 = getelementptr i8, ptr %6, i64 %7
+  %9 = load i8, ptr %8, align 1
+  %cb = alloca i8, align 1
+  store i8 %9, ptr %cb, align 1
+  %10 = load i8, ptr %ca, align 1
+  %11 = icmp eq i8 %10, 0
+  br i1 %11, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  ret i1 true
+
+then_block:                                       ; preds = %inner_block
+  %12 = load i8, ptr %cb, align 1
+  %13 = icmp eq i8 %12, 0
+  ret i1 %13
+
+merge_block:                                      ; preds = %inner_block
+  %14 = load i8, ptr %cb, align 1
+  %15 = icmp eq i8 %14, 0
+  br i1 %15, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  %16 = load i8, ptr %ca, align 1
+  %17 = icmp eq i8 %16, 0
+  ret i1 %17
+
+merge_block2:                                     ; preds = %merge_block
+  %18 = load i8, ptr %ca, align 1
+  %19 = load i8, ptr %cb, align 1
+  %20 = icmp eq i8 %18, %19
+  %21 = icmp eq i1 %20, false
+  br i1 %21, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret i1 false
+
+merge_block4:                                     ; preds = %merge_block2
+  %22 = load i64, ptr %i, align 4
+  %23 = add i64 %22, 1
+  store i64 %23, ptr %i, align 4
+  br label %while_block
+
+entrypoint5:                                      ; No predecessors!
+  %stra6 = alloca ptr, align 8
+  store ptr %0, ptr %stra6, align 8
+  %strb7 = alloca ptr, align 8
+  store ptr %1, ptr %strb7, align 8
+  %i8 = alloca i64, align 8
+  store i64 0, ptr %i8, align 4
+  br label %while_block9
+
+while_block9:                                     ; preds = %merge_block19, %entrypoint5
+  br i1 true, label %inner_block10, label %outer_block11
+
+inner_block10:                                    ; preds = %while_block9
+  %24 = load ptr, ptr %stra6, align 8
+  %25 = load i64, ptr %i8, align 4
+  %26 = getelementptr i8, ptr %24, i64 %25
+  %27 = load i8, ptr %26, align 1
+  %ca12 = alloca i8, align 1
+  store i8 %27, ptr %ca12, align 1
+  %28 = load ptr, ptr %strb7, align 8
+  %29 = load i64, ptr %i8, align 4
+  %30 = getelementptr i8, ptr %28, i64 %29
+  %31 = load i8, ptr %30, align 1
+  %cb13 = alloca i8, align 1
+  store i8 %31, ptr %cb13, align 1
+  %32 = load i8, ptr %ca12, align 1
+  %33 = icmp eq i8 %32, 0
+  br i1 %33, label %then_block14, label %merge_block15
+
+outer_block11:                                    ; preds = %while_block9
+  ret i1 true
+
+then_block14:                                     ; preds = %inner_block10
+  %34 = load i8, ptr %cb13, align 1
+  %35 = icmp eq i8 %34, 0
+  ret i1 %35
+
+merge_block15:                                    ; preds = %inner_block10
+  %36 = load i8, ptr %cb13, align 1
+  %37 = icmp eq i8 %36, 0
+  br i1 %37, label %then_block16, label %merge_block17
+
+then_block16:                                     ; preds = %merge_block15
+  %38 = load i8, ptr %ca12, align 1
+  %39 = icmp eq i8 %38, 0
+  ret i1 %39
+
+merge_block17:                                    ; preds = %merge_block15
+  %40 = load i8, ptr %ca12, align 1
+  %41 = load i8, ptr %cb13, align 1
+  %42 = icmp eq i8 %40, %41
+  %43 = icmp eq i1 %42, false
+  br i1 %43, label %then_block18, label %merge_block19
+
+then_block18:                                     ; preds = %merge_block17
+  ret i1 false
+
+merge_block19:                                    ; preds = %merge_block17
+  %44 = load i64, ptr %i8, align 4
+  %45 = add i64 %44, 1
+  store i64 %45, ptr %i8, align 4
+  br label %while_block9
+
+entrypoint20:                                     ; No predecessors!
+  %stra21 = alloca ptr, align 8
+  store ptr %0, ptr %stra21, align 8
+  %strb22 = alloca ptr, align 8
+  store ptr %1, ptr %strb22, align 8
+  %i23 = alloca i64, align 8
+  store i64 0, ptr %i23, align 4
+  br label %while_block24
+
+while_block24:                                    ; preds = %merge_block34, %entrypoint20
+  br i1 true, label %inner_block25, label %outer_block26
+
+inner_block25:                                    ; preds = %while_block24
+  %46 = load ptr, ptr %stra21, align 8
+  %47 = load i64, ptr %i23, align 4
+  %48 = getelementptr i8, ptr %46, i64 %47
+  %49 = load i8, ptr %48, align 1
+  %ca27 = alloca i8, align 1
+  store i8 %49, ptr %ca27, align 1
+  %50 = load ptr, ptr %strb22, align 8
+  %51 = load i64, ptr %i23, align 4
+  %52 = getelementptr i8, ptr %50, i64 %51
+  %53 = load i8, ptr %52, align 1
+  %cb28 = alloca i8, align 1
+  store i8 %53, ptr %cb28, align 1
+  %54 = load i8, ptr %ca27, align 1
+  %55 = icmp eq i8 %54, 0
+  br i1 %55, label %then_block29, label %merge_block30
+
+outer_block26:                                    ; preds = %while_block24
+  ret i1 true
+
+then_block29:                                     ; preds = %inner_block25
+  %56 = load i8, ptr %cb28, align 1
+  %57 = icmp eq i8 %56, 0
+  ret i1 %57
+
+merge_block30:                                    ; preds = %inner_block25
+  %58 = load i8, ptr %cb28, align 1
+  %59 = icmp eq i8 %58, 0
+  br i1 %59, label %then_block31, label %merge_block32
+
+then_block31:                                     ; preds = %merge_block30
+  %60 = load i8, ptr %ca27, align 1
+  %61 = icmp eq i8 %60, 0
+  ret i1 %61
+
+merge_block32:                                    ; preds = %merge_block30
+  %62 = load i8, ptr %ca27, align 1
+  %63 = load i8, ptr %cb28, align 1
+  %64 = icmp eq i8 %62, %63
+  %65 = icmp eq i1 %64, false
+  br i1 %65, label %then_block33, label %merge_block34
+
+then_block33:                                     ; preds = %merge_block32
+  ret i1 false
+
+merge_block34:                                    ; preds = %merge_block32
+  %66 = load i64, ptr %i23, align 4
+  %67 = add i64 %66, 1
+  store i64 %67, ptr %i23, align 4
+  br label %while_block24
+
+entrypoint35:                                     ; No predecessors!
+  %stra36 = alloca ptr, align 8
+  store ptr %0, ptr %stra36, align 8
+  %strb37 = alloca ptr, align 8
+  store ptr %1, ptr %strb37, align 8
+  %i38 = alloca i64, align 8
+  store i64 0, ptr %i38, align 4
+  br label %while_block39
+
+while_block39:                                    ; preds = %merge_block49, %entrypoint35
+  br i1 true, label %inner_block40, label %outer_block41
+
+inner_block40:                                    ; preds = %while_block39
+  %68 = load ptr, ptr %stra36, align 8
+  %69 = load i64, ptr %i38, align 4
+  %70 = getelementptr i8, ptr %68, i64 %69
+  %71 = load i8, ptr %70, align 1
+  %ca42 = alloca i8, align 1
+  store i8 %71, ptr %ca42, align 1
+  %72 = load ptr, ptr %strb37, align 8
+  %73 = load i64, ptr %i38, align 4
+  %74 = getelementptr i8, ptr %72, i64 %73
+  %75 = load i8, ptr %74, align 1
+  %cb43 = alloca i8, align 1
+  store i8 %75, ptr %cb43, align 1
+  %76 = load i8, ptr %ca42, align 1
+  %77 = icmp eq i8 %76, 0
+  br i1 %77, label %then_block44, label %merge_block45
+
+outer_block41:                                    ; preds = %while_block39
+  ret i1 true
+
+then_block44:                                     ; preds = %inner_block40
+  %78 = load i8, ptr %cb43, align 1
+  %79 = icmp eq i8 %78, 0
+  ret i1 %79
+
+merge_block45:                                    ; preds = %inner_block40
+  %80 = load i8, ptr %cb43, align 1
+  %81 = icmp eq i8 %80, 0
+  br i1 %81, label %then_block46, label %merge_block47
+
+then_block46:                                     ; preds = %merge_block45
+  %82 = load i8, ptr %ca42, align 1
+  %83 = icmp eq i8 %82, 0
+  ret i1 %83
+
+merge_block47:                                    ; preds = %merge_block45
+  %84 = load i8, ptr %ca42, align 1
+  %85 = load i8, ptr %cb43, align 1
+  %86 = icmp eq i8 %84, %85
+  %87 = icmp eq i1 %86, false
+  br i1 %87, label %then_block48, label %merge_block49
+
+then_block48:                                     ; preds = %merge_block47
+  ret i1 false
+
+merge_block49:                                    ; preds = %merge_block47
+  %88 = load i64, ptr %i38, align 4
+  %89 = add i64 %88, 1
+  store i64 %89, ptr %i38, align 4
+  br label %while_block39
+
+entrypoint50:                                     ; No predecessors!
+  %stra51 = alloca ptr, align 8
+  store ptr %0, ptr %stra51, align 8
+  %strb52 = alloca ptr, align 8
+  store ptr %1, ptr %strb52, align 8
+  %i53 = alloca i64, align 8
+  store i64 0, ptr %i53, align 4
+  br label %while_block54
+
+while_block54:                                    ; preds = %merge_block64, %entrypoint50
+  br i1 true, label %inner_block55, label %outer_block56
+
+inner_block55:                                    ; preds = %while_block54
+  %90 = load ptr, ptr %stra51, align 8
+  %91 = load i64, ptr %i53, align 4
+  %92 = getelementptr i8, ptr %90, i64 %91
+  %93 = load i8, ptr %92, align 1
+  %ca57 = alloca i8, align 1
+  store i8 %93, ptr %ca57, align 1
+  %94 = load ptr, ptr %strb52, align 8
+  %95 = load i64, ptr %i53, align 4
+  %96 = getelementptr i8, ptr %94, i64 %95
+  %97 = load i8, ptr %96, align 1
+  %cb58 = alloca i8, align 1
+  store i8 %97, ptr %cb58, align 1
+  %98 = load i8, ptr %ca57, align 1
+  %99 = icmp eq i8 %98, 0
+  br i1 %99, label %then_block59, label %merge_block60
+
+outer_block56:                                    ; preds = %while_block54
+  ret i1 true
+
+then_block59:                                     ; preds = %inner_block55
+  %100 = load i8, ptr %cb58, align 1
+  %101 = icmp eq i8 %100, 0
+  ret i1 %101
+
+merge_block60:                                    ; preds = %inner_block55
+  %102 = load i8, ptr %cb58, align 1
+  %103 = icmp eq i8 %102, 0
+  br i1 %103, label %then_block61, label %merge_block62
+
+then_block61:                                     ; preds = %merge_block60
+  %104 = load i8, ptr %ca57, align 1
+  %105 = icmp eq i8 %104, 0
+  ret i1 %105
+
+merge_block62:                                    ; preds = %merge_block60
+  %106 = load i8, ptr %ca57, align 1
+  %107 = load i8, ptr %cb58, align 1
+  %108 = icmp eq i8 %106, %107
+  %109 = icmp eq i1 %108, false
+  br i1 %109, label %then_block63, label %merge_block64
+
+then_block63:                                     ; preds = %merge_block62
+  ret i1 false
+
+merge_block64:                                    ; preds = %merge_block62
+  %110 = load i64, ptr %i53, align 4
+  %111 = add i64 %110, 1
+  store i64 %111, ptr %i53, align 4
+  br label %while_block54
+
+entrypoint65:                                     ; No predecessors!
+  %stra66 = alloca ptr, align 8
+  store ptr %0, ptr %stra66, align 8
+  %strb67 = alloca ptr, align 8
+  store ptr %1, ptr %strb67, align 8
+  %i68 = alloca i64, align 8
+  store i64 0, ptr %i68, align 4
+  br label %while_block69
+
+while_block69:                                    ; preds = %merge_block79, %entrypoint65
+  br i1 true, label %inner_block70, label %outer_block71
+
+inner_block70:                                    ; preds = %while_block69
+  %112 = load ptr, ptr %stra66, align 8
+  %113 = load i64, ptr %i68, align 4
+  %114 = getelementptr i8, ptr %112, i64 %113
+  %115 = load i8, ptr %114, align 1
+  %ca72 = alloca i8, align 1
+  store i8 %115, ptr %ca72, align 1
+  %116 = load ptr, ptr %strb67, align 8
+  %117 = load i64, ptr %i68, align 4
+  %118 = getelementptr i8, ptr %116, i64 %117
+  %119 = load i8, ptr %118, align 1
+  %cb73 = alloca i8, align 1
+  store i8 %119, ptr %cb73, align 1
+  %120 = load i8, ptr %ca72, align 1
+  %121 = icmp eq i8 %120, 0
+  br i1 %121, label %then_block74, label %merge_block75
+
+outer_block71:                                    ; preds = %while_block69
+  ret i1 true
+
+then_block74:                                     ; preds = %inner_block70
+  %122 = load i8, ptr %cb73, align 1
+  %123 = icmp eq i8 %122, 0
+  ret i1 %123
+
+merge_block75:                                    ; preds = %inner_block70
+  %124 = load i8, ptr %cb73, align 1
+  %125 = icmp eq i8 %124, 0
+  br i1 %125, label %then_block76, label %merge_block77
+
+then_block76:                                     ; preds = %merge_block75
+  %126 = load i8, ptr %ca72, align 1
+  %127 = icmp eq i8 %126, 0
+  ret i1 %127
+
+merge_block77:                                    ; preds = %merge_block75
+  %128 = load i8, ptr %ca72, align 1
+  %129 = load i8, ptr %cb73, align 1
+  %130 = icmp eq i8 %128, %129
+  %131 = icmp eq i1 %130, false
+  br i1 %131, label %then_block78, label %merge_block79
+
+then_block78:                                     ; preds = %merge_block77
+  ret i1 false
+
+merge_block79:                                    ; preds = %merge_block77
+  %132 = load i64, ptr %i68, align 4
+  %133 = add i64 %132, 1
+  store i64 %133, ptr %i68, align 4
+  br label %while_block69
+
+entrypoint80:                                     ; No predecessors!
+  %stra81 = alloca ptr, align 8
+  store ptr %0, ptr %stra81, align 8
+  %strb82 = alloca ptr, align 8
+  store ptr %1, ptr %strb82, align 8
+  %i83 = alloca i64, align 8
+  store i64 0, ptr %i83, align 4
+  br label %while_block84
+
+while_block84:                                    ; preds = %merge_block94, %entrypoint80
+  br i1 true, label %inner_block85, label %outer_block86
+
+inner_block85:                                    ; preds = %while_block84
+  %134 = load ptr, ptr %stra81, align 8
+  %135 = load i64, ptr %i83, align 4
+  %136 = getelementptr i8, ptr %134, i64 %135
+  %137 = load i8, ptr %136, align 1
+  %ca87 = alloca i8, align 1
+  store i8 %137, ptr %ca87, align 1
+  %138 = load ptr, ptr %strb82, align 8
+  %139 = load i64, ptr %i83, align 4
+  %140 = getelementptr i8, ptr %138, i64 %139
+  %141 = load i8, ptr %140, align 1
+  %cb88 = alloca i8, align 1
+  store i8 %141, ptr %cb88, align 1
+  %142 = load i8, ptr %ca87, align 1
+  %143 = icmp eq i8 %142, 0
+  br i1 %143, label %then_block89, label %merge_block90
+
+outer_block86:                                    ; preds = %while_block84
+  ret i1 true
+
+then_block89:                                     ; preds = %inner_block85
+  %144 = load i8, ptr %cb88, align 1
+  %145 = icmp eq i8 %144, 0
+  ret i1 %145
+
+merge_block90:                                    ; preds = %inner_block85
+  %146 = load i8, ptr %cb88, align 1
+  %147 = icmp eq i8 %146, 0
+  br i1 %147, label %then_block91, label %merge_block92
+
+then_block91:                                     ; preds = %merge_block90
+  %148 = load i8, ptr %ca87, align 1
+  %149 = icmp eq i8 %148, 0
+  ret i1 %149
+
+merge_block92:                                    ; preds = %merge_block90
+  %150 = load i8, ptr %ca87, align 1
+  %151 = load i8, ptr %cb88, align 1
+  %152 = icmp eq i8 %150, %151
+  %153 = icmp eq i1 %152, false
+  br i1 %153, label %then_block93, label %merge_block94
+
+then_block93:                                     ; preds = %merge_block92
+  ret i1 false
+
+merge_block94:                                    ; preds = %merge_block92
+  %154 = load i64, ptr %i83, align 4
+  %155 = add i64 %154, 1
+  store i64 %155, ptr %i83, align 4
+  br label %while_block84
+
+entrypoint95:                                     ; No predecessors!
+  %stra96 = alloca ptr, align 8
+  store ptr %0, ptr %stra96, align 8
+  %strb97 = alloca ptr, align 8
+  store ptr %1, ptr %strb97, align 8
+  %i98 = alloca i64, align 8
+  store i64 0, ptr %i98, align 4
+  br label %while_block99
+
+while_block99:                                    ; preds = %merge_block109, %entrypoint95
+  br i1 true, label %inner_block100, label %outer_block101
+
+inner_block100:                                   ; preds = %while_block99
+  %156 = load ptr, ptr %stra96, align 8
+  %157 = load i64, ptr %i98, align 4
+  %158 = getelementptr i8, ptr %156, i64 %157
+  %159 = load i8, ptr %158, align 1
+  %ca102 = alloca i8, align 1
+  store i8 %159, ptr %ca102, align 1
+  %160 = load ptr, ptr %strb97, align 8
+  %161 = load i64, ptr %i98, align 4
+  %162 = getelementptr i8, ptr %160, i64 %161
+  %163 = load i8, ptr %162, align 1
+  %cb103 = alloca i8, align 1
+  store i8 %163, ptr %cb103, align 1
+  %164 = load i8, ptr %ca102, align 1
+  %165 = icmp eq i8 %164, 0
+  br i1 %165, label %then_block104, label %merge_block105
+
+outer_block101:                                   ; preds = %while_block99
+  ret i1 true
+
+then_block104:                                    ; preds = %inner_block100
+  %166 = load i8, ptr %cb103, align 1
+  %167 = icmp eq i8 %166, 0
+  ret i1 %167
+
+merge_block105:                                   ; preds = %inner_block100
+  %168 = load i8, ptr %cb103, align 1
+  %169 = icmp eq i8 %168, 0
+  br i1 %169, label %then_block106, label %merge_block107
+
+then_block106:                                    ; preds = %merge_block105
+  %170 = load i8, ptr %ca102, align 1
+  %171 = icmp eq i8 %170, 0
+  ret i1 %171
+
+merge_block107:                                   ; preds = %merge_block105
+  %172 = load i8, ptr %ca102, align 1
+  %173 = load i8, ptr %cb103, align 1
+  %174 = icmp eq i8 %172, %173
+  %175 = icmp eq i1 %174, false
+  br i1 %175, label %then_block108, label %merge_block109
+
+then_block108:                                    ; preds = %merge_block107
+  ret i1 false
+
+merge_block109:                                   ; preds = %merge_block107
+  %176 = load i64, ptr %i98, align 4
+  %177 = add i64 %176, 1
+  store i64 %177, ptr %i98, align 4
+  br label %while_block99
+}
+
+define i1 @isdigit(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = icmp sge i8 %1, 48
+  br i1 %2, label %then_block, label %merge_block2
+
+then_block:                                       ; preds = %entrypoint
+  %3 = load i8, ptr %c, align 1
+  %4 = icmp sle i8 %3, 57
+  br i1 %4, label %then_block1, label %merge_block
+
+then_block1:                                      ; preds = %then_block
+  ret i1 true
+
+merge_block:                                      ; preds = %then_block
+  br label %merge_block2
+
+merge_block2:                                     ; preds = %entrypoint, %merge_block
+  ret i1 false
+
+entrypoint3:                                      ; No predecessors!
+  %c4 = alloca i8, align 1
+  store i8 %0, ptr %c4, align 1
+  %5 = load i8, ptr %c4, align 1
+  %6 = icmp sge i8 %5, 48
+  br i1 %6, label %then_block5, label %merge_block8
+
+then_block5:                                      ; preds = %entrypoint3
+  %7 = load i8, ptr %c4, align 1
+  %8 = icmp sle i8 %7, 57
+  br i1 %8, label %then_block6, label %merge_block7
+
+then_block6:                                      ; preds = %then_block5
+  ret i1 true
+
+merge_block7:                                     ; preds = %then_block5
+  br label %merge_block8
+
+merge_block8:                                     ; preds = %entrypoint3, %merge_block7
+  ret i1 false
+
+entrypoint9:                                      ; No predecessors!
+  %c10 = alloca i8, align 1
+  store i8 %0, ptr %c10, align 1
+  %9 = load i8, ptr %c10, align 1
+  %10 = icmp sge i8 %9, 48
+  br i1 %10, label %then_block11, label %merge_block14
+
+then_block11:                                     ; preds = %entrypoint9
+  %11 = load i8, ptr %c10, align 1
+  %12 = icmp sle i8 %11, 57
+  br i1 %12, label %then_block12, label %merge_block13
+
+then_block12:                                     ; preds = %then_block11
+  ret i1 true
+
+merge_block13:                                    ; preds = %then_block11
+  br label %merge_block14
+
+merge_block14:                                    ; preds = %entrypoint9, %merge_block13
+  ret i1 false
+
+entrypoint15:                                     ; No predecessors!
+  %c16 = alloca i8, align 1
+  store i8 %0, ptr %c16, align 1
+  %13 = load i8, ptr %c16, align 1
+  %14 = icmp sge i8 %13, 48
+  br i1 %14, label %then_block17, label %merge_block20
+
+then_block17:                                     ; preds = %entrypoint15
+  %15 = load i8, ptr %c16, align 1
+  %16 = icmp sle i8 %15, 57
+  br i1 %16, label %then_block18, label %merge_block19
+
+then_block18:                                     ; preds = %then_block17
+  ret i1 true
+
+merge_block19:                                    ; preds = %then_block17
+  br label %merge_block20
+
+merge_block20:                                    ; preds = %entrypoint15, %merge_block19
+  ret i1 false
+
+entrypoint21:                                     ; No predecessors!
+  %c22 = alloca i8, align 1
+  store i8 %0, ptr %c22, align 1
+  %17 = load i8, ptr %c22, align 1
+  %18 = icmp sge i8 %17, 48
+  br i1 %18, label %then_block23, label %merge_block26
+
+then_block23:                                     ; preds = %entrypoint21
+  %19 = load i8, ptr %c22, align 1
+  %20 = icmp sle i8 %19, 57
+  br i1 %20, label %then_block24, label %merge_block25
+
+then_block24:                                     ; preds = %then_block23
+  ret i1 true
+
+merge_block25:                                    ; preds = %then_block23
+  br label %merge_block26
+
+merge_block26:                                    ; preds = %entrypoint21, %merge_block25
+  ret i1 false
+
+entrypoint27:                                     ; No predecessors!
+  %c28 = alloca i8, align 1
+  store i8 %0, ptr %c28, align 1
+  %21 = load i8, ptr %c28, align 1
+  %22 = icmp sge i8 %21, 48
+  br i1 %22, label %then_block29, label %merge_block32
+
+then_block29:                                     ; preds = %entrypoint27
+  %23 = load i8, ptr %c28, align 1
+  %24 = icmp sle i8 %23, 57
+  br i1 %24, label %then_block30, label %merge_block31
+
+then_block30:                                     ; preds = %then_block29
+  ret i1 true
+
+merge_block31:                                    ; preds = %then_block29
+  br label %merge_block32
+
+merge_block32:                                    ; preds = %entrypoint27, %merge_block31
+  ret i1 false
+
+entrypoint33:                                     ; No predecessors!
+  %c34 = alloca i8, align 1
+  store i8 %0, ptr %c34, align 1
+  %25 = load i8, ptr %c34, align 1
+  %26 = icmp sge i8 %25, 48
+  br i1 %26, label %then_block35, label %merge_block38
+
+then_block35:                                     ; preds = %entrypoint33
+  %27 = load i8, ptr %c34, align 1
+  %28 = icmp sle i8 %27, 57
+  br i1 %28, label %then_block36, label %merge_block37
+
+then_block36:                                     ; preds = %then_block35
+  ret i1 true
+
+merge_block37:                                    ; preds = %then_block35
+  br label %merge_block38
+
+merge_block38:                                    ; preds = %entrypoint33, %merge_block37
+  ret i1 false
+
+entrypoint39:                                     ; No predecessors!
+  %c40 = alloca i8, align 1
+  store i8 %0, ptr %c40, align 1
+  %29 = load i8, ptr %c40, align 1
+  %30 = icmp sge i8 %29, 48
+  br i1 %30, label %then_block41, label %merge_block44
+
+then_block41:                                     ; preds = %entrypoint39
+  %31 = load i8, ptr %c40, align 1
+  %32 = icmp sle i8 %31, 57
+  br i1 %32, label %then_block42, label %merge_block43
+
+then_block42:                                     ; preds = %then_block41
+  ret i1 true
+
+merge_block43:                                    ; preds = %then_block41
+  br label %merge_block44
+
+merge_block44:                                    ; preds = %entrypoint39, %merge_block43
+  ret i1 false
+}
+
+define i1 @isalpha(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = icmp sge i8 %1, 97
+  br i1 %2, label %then_block, label %merge_block2
+
+then_block:                                       ; preds = %entrypoint
+  %3 = load i8, ptr %c, align 1
+  %4 = icmp sle i8 %3, 122
+  br i1 %4, label %then_block1, label %merge_block
+
+then_block1:                                      ; preds = %then_block
+  ret i1 true
+
+merge_block:                                      ; preds = %then_block
+  br label %merge_block2
+
+merge_block2:                                     ; preds = %entrypoint, %merge_block
+  %5 = load i8, ptr %c, align 1
+  %6 = icmp sge i8 %5, 65
+  br i1 %6, label %then_block3, label %merge_block6
+
+then_block3:                                      ; preds = %merge_block2
+  %7 = load i8, ptr %c, align 1
+  %8 = icmp sle i8 %7, 90
+  br i1 %8, label %then_block4, label %merge_block5
+
+then_block4:                                      ; preds = %then_block3
+  ret i1 true
+
+merge_block5:                                     ; preds = %then_block3
+  br label %merge_block6
+
+merge_block6:                                     ; preds = %merge_block2, %merge_block5
+  ret i1 false
+
+entrypoint7:                                      ; No predecessors!
+  %c8 = alloca i8, align 1
+  store i8 %0, ptr %c8, align 1
+  %9 = load i8, ptr %c8, align 1
+  %10 = icmp sge i8 %9, 97
+  br i1 %10, label %then_block9, label %merge_block12
+
+then_block9:                                      ; preds = %entrypoint7
+  %11 = load i8, ptr %c8, align 1
+  %12 = icmp sle i8 %11, 122
+  br i1 %12, label %then_block10, label %merge_block11
+
+then_block10:                                     ; preds = %then_block9
+  ret i1 true
+
+merge_block11:                                    ; preds = %then_block9
+  br label %merge_block12
+
+merge_block12:                                    ; preds = %entrypoint7, %merge_block11
+  %13 = load i8, ptr %c8, align 1
+  %14 = icmp sge i8 %13, 65
+  br i1 %14, label %then_block13, label %merge_block16
+
+then_block13:                                     ; preds = %merge_block12
+  %15 = load i8, ptr %c8, align 1
+  %16 = icmp sle i8 %15, 90
+  br i1 %16, label %then_block14, label %merge_block15
+
+then_block14:                                     ; preds = %then_block13
+  ret i1 true
+
+merge_block15:                                    ; preds = %then_block13
+  br label %merge_block16
+
+merge_block16:                                    ; preds = %merge_block12, %merge_block15
+  ret i1 false
+
+entrypoint17:                                     ; No predecessors!
+  %c18 = alloca i8, align 1
+  store i8 %0, ptr %c18, align 1
+  %17 = load i8, ptr %c18, align 1
+  %18 = icmp sge i8 %17, 97
+  br i1 %18, label %then_block19, label %merge_block22
+
+then_block19:                                     ; preds = %entrypoint17
+  %19 = load i8, ptr %c18, align 1
+  %20 = icmp sle i8 %19, 122
+  br i1 %20, label %then_block20, label %merge_block21
+
+then_block20:                                     ; preds = %then_block19
+  ret i1 true
+
+merge_block21:                                    ; preds = %then_block19
+  br label %merge_block22
+
+merge_block22:                                    ; preds = %entrypoint17, %merge_block21
+  %21 = load i8, ptr %c18, align 1
+  %22 = icmp sge i8 %21, 65
+  br i1 %22, label %then_block23, label %merge_block26
+
+then_block23:                                     ; preds = %merge_block22
+  %23 = load i8, ptr %c18, align 1
+  %24 = icmp sle i8 %23, 90
+  br i1 %24, label %then_block24, label %merge_block25
+
+then_block24:                                     ; preds = %then_block23
+  ret i1 true
+
+merge_block25:                                    ; preds = %then_block23
+  br label %merge_block26
+
+merge_block26:                                    ; preds = %merge_block22, %merge_block25
+  ret i1 false
+
+entrypoint27:                                     ; No predecessors!
+  %c28 = alloca i8, align 1
+  store i8 %0, ptr %c28, align 1
+  %25 = load i8, ptr %c28, align 1
+  %26 = icmp sge i8 %25, 97
+  br i1 %26, label %then_block29, label %merge_block32
+
+then_block29:                                     ; preds = %entrypoint27
+  %27 = load i8, ptr %c28, align 1
+  %28 = icmp sle i8 %27, 122
+  br i1 %28, label %then_block30, label %merge_block31
+
+then_block30:                                     ; preds = %then_block29
+  ret i1 true
+
+merge_block31:                                    ; preds = %then_block29
+  br label %merge_block32
+
+merge_block32:                                    ; preds = %entrypoint27, %merge_block31
+  %29 = load i8, ptr %c28, align 1
+  %30 = icmp sge i8 %29, 65
+  br i1 %30, label %then_block33, label %merge_block36
+
+then_block33:                                     ; preds = %merge_block32
+  %31 = load i8, ptr %c28, align 1
+  %32 = icmp sle i8 %31, 90
+  br i1 %32, label %then_block34, label %merge_block35
+
+then_block34:                                     ; preds = %then_block33
+  ret i1 true
+
+merge_block35:                                    ; preds = %then_block33
+  br label %merge_block36
+
+merge_block36:                                    ; preds = %merge_block32, %merge_block35
+  ret i1 false
+
+entrypoint37:                                     ; No predecessors!
+  %c38 = alloca i8, align 1
+  store i8 %0, ptr %c38, align 1
+  %33 = load i8, ptr %c38, align 1
+  %34 = icmp sge i8 %33, 97
+  br i1 %34, label %then_block39, label %merge_block42
+
+then_block39:                                     ; preds = %entrypoint37
+  %35 = load i8, ptr %c38, align 1
+  %36 = icmp sle i8 %35, 122
+  br i1 %36, label %then_block40, label %merge_block41
+
+then_block40:                                     ; preds = %then_block39
+  ret i1 true
+
+merge_block41:                                    ; preds = %then_block39
+  br label %merge_block42
+
+merge_block42:                                    ; preds = %entrypoint37, %merge_block41
+  %37 = load i8, ptr %c38, align 1
+  %38 = icmp sge i8 %37, 65
+  br i1 %38, label %then_block43, label %merge_block46
+
+then_block43:                                     ; preds = %merge_block42
+  %39 = load i8, ptr %c38, align 1
+  %40 = icmp sle i8 %39, 90
+  br i1 %40, label %then_block44, label %merge_block45
+
+then_block44:                                     ; preds = %then_block43
+  ret i1 true
+
+merge_block45:                                    ; preds = %then_block43
+  br label %merge_block46
+
+merge_block46:                                    ; preds = %merge_block42, %merge_block45
+  ret i1 false
+
+entrypoint47:                                     ; No predecessors!
+  %c48 = alloca i8, align 1
+  store i8 %0, ptr %c48, align 1
+  %41 = load i8, ptr %c48, align 1
+  %42 = icmp sge i8 %41, 97
+  br i1 %42, label %then_block49, label %merge_block52
+
+then_block49:                                     ; preds = %entrypoint47
+  %43 = load i8, ptr %c48, align 1
+  %44 = icmp sle i8 %43, 122
+  br i1 %44, label %then_block50, label %merge_block51
+
+then_block50:                                     ; preds = %then_block49
+  ret i1 true
+
+merge_block51:                                    ; preds = %then_block49
+  br label %merge_block52
+
+merge_block52:                                    ; preds = %entrypoint47, %merge_block51
+  %45 = load i8, ptr %c48, align 1
+  %46 = icmp sge i8 %45, 65
+  br i1 %46, label %then_block53, label %merge_block56
+
+then_block53:                                     ; preds = %merge_block52
+  %47 = load i8, ptr %c48, align 1
+  %48 = icmp sle i8 %47, 90
+  br i1 %48, label %then_block54, label %merge_block55
+
+then_block54:                                     ; preds = %then_block53
+  ret i1 true
+
+merge_block55:                                    ; preds = %then_block53
+  br label %merge_block56
+
+merge_block56:                                    ; preds = %merge_block52, %merge_block55
+  ret i1 false
+
+entrypoint57:                                     ; No predecessors!
+  %c58 = alloca i8, align 1
+  store i8 %0, ptr %c58, align 1
+  %49 = load i8, ptr %c58, align 1
+  %50 = icmp sge i8 %49, 97
+  br i1 %50, label %then_block59, label %merge_block62
+
+then_block59:                                     ; preds = %entrypoint57
+  %51 = load i8, ptr %c58, align 1
+  %52 = icmp sle i8 %51, 122
+  br i1 %52, label %then_block60, label %merge_block61
+
+then_block60:                                     ; preds = %then_block59
+  ret i1 true
+
+merge_block61:                                    ; preds = %then_block59
+  br label %merge_block62
+
+merge_block62:                                    ; preds = %entrypoint57, %merge_block61
+  %53 = load i8, ptr %c58, align 1
+  %54 = icmp sge i8 %53, 65
+  br i1 %54, label %then_block63, label %merge_block66
+
+then_block63:                                     ; preds = %merge_block62
+  %55 = load i8, ptr %c58, align 1
+  %56 = icmp sle i8 %55, 90
+  br i1 %56, label %then_block64, label %merge_block65
+
+then_block64:                                     ; preds = %then_block63
+  ret i1 true
+
+merge_block65:                                    ; preds = %then_block63
+  br label %merge_block66
+
+merge_block66:                                    ; preds = %merge_block62, %merge_block65
+  ret i1 false
+
+entrypoint67:                                     ; No predecessors!
+  %c68 = alloca i8, align 1
+  store i8 %0, ptr %c68, align 1
+  %57 = load i8, ptr %c68, align 1
+  %58 = icmp sge i8 %57, 97
+  br i1 %58, label %then_block69, label %merge_block72
+
+then_block69:                                     ; preds = %entrypoint67
+  %59 = load i8, ptr %c68, align 1
+  %60 = icmp sle i8 %59, 122
+  br i1 %60, label %then_block70, label %merge_block71
+
+then_block70:                                     ; preds = %then_block69
+  ret i1 true
+
+merge_block71:                                    ; preds = %then_block69
+  br label %merge_block72
+
+merge_block72:                                    ; preds = %entrypoint67, %merge_block71
+  %61 = load i8, ptr %c68, align 1
+  %62 = icmp sge i8 %61, 65
+  br i1 %62, label %then_block73, label %merge_block76
+
+then_block73:                                     ; preds = %merge_block72
+  %63 = load i8, ptr %c68, align 1
+  %64 = icmp sle i8 %63, 90
+  br i1 %64, label %then_block74, label %merge_block75
+
+then_block74:                                     ; preds = %then_block73
+  ret i1 true
+
+merge_block75:                                    ; preds = %then_block73
+  br label %merge_block76
+
+merge_block76:                                    ; preds = %merge_block72, %merge_block75
+  ret i1 false
+}
+
+define i1 @isalphanum(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = call i1 @isalpha(i8 %1)
+  br i1 %2, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret i1 true
+
+merge_block:                                      ; preds = %entrypoint
+  %3 = load i8, ptr %c, align 1
+  %4 = call i1 @isdigit(i8 %3)
+  br i1 %4, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret i1 true
+
+merge_block2:                                     ; preds = %merge_block
+  ret i1 false
+
+entrypoint3:                                      ; No predecessors!
+  %c4 = alloca i8, align 1
+  store i8 %0, ptr %c4, align 1
+  %5 = load i8, ptr %c4, align 1
+  %6 = call i1 @isalpha(i8 %5)
+  br i1 %6, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %entrypoint3
+  ret i1 true
+
+merge_block6:                                     ; preds = %entrypoint3
+  %7 = load i8, ptr %c4, align 1
+  %8 = call i1 @isdigit(i8 %7)
+  br i1 %8, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  ret i1 true
+
+merge_block8:                                     ; preds = %merge_block6
+  ret i1 false
+
+entrypoint9:                                      ; No predecessors!
+  %c10 = alloca i8, align 1
+  store i8 %0, ptr %c10, align 1
+  %9 = load i8, ptr %c10, align 1
+  %10 = call i1 @isalpha(i8 %9)
+  br i1 %10, label %then_block11, label %merge_block12
+
+then_block11:                                     ; preds = %entrypoint9
+  ret i1 true
+
+merge_block12:                                    ; preds = %entrypoint9
+  %11 = load i8, ptr %c10, align 1
+  %12 = call i1 @isdigit(i8 %11)
+  br i1 %12, label %then_block13, label %merge_block14
+
+then_block13:                                     ; preds = %merge_block12
+  ret i1 true
+
+merge_block14:                                    ; preds = %merge_block12
+  ret i1 false
+
+entrypoint15:                                     ; No predecessors!
+  %c16 = alloca i8, align 1
+  store i8 %0, ptr %c16, align 1
+  %13 = load i8, ptr %c16, align 1
+  %14 = call i1 @isalpha(i8 %13)
+  br i1 %14, label %then_block17, label %merge_block18
+
+then_block17:                                     ; preds = %entrypoint15
+  ret i1 true
+
+merge_block18:                                    ; preds = %entrypoint15
+  %15 = load i8, ptr %c16, align 1
+  %16 = call i1 @isdigit(i8 %15)
+  br i1 %16, label %then_block19, label %merge_block20
+
+then_block19:                                     ; preds = %merge_block18
+  ret i1 true
+
+merge_block20:                                    ; preds = %merge_block18
+  ret i1 false
+
+entrypoint21:                                     ; No predecessors!
+  %c22 = alloca i8, align 1
+  store i8 %0, ptr %c22, align 1
+  %17 = load i8, ptr %c22, align 1
+  %18 = call i1 @isalpha(i8 %17)
+  br i1 %18, label %then_block23, label %merge_block24
+
+then_block23:                                     ; preds = %entrypoint21
+  ret i1 true
+
+merge_block24:                                    ; preds = %entrypoint21
+  %19 = load i8, ptr %c22, align 1
+  %20 = call i1 @isdigit(i8 %19)
+  br i1 %20, label %then_block25, label %merge_block26
+
+then_block25:                                     ; preds = %merge_block24
+  ret i1 true
+
+merge_block26:                                    ; preds = %merge_block24
+  ret i1 false
+
+entrypoint27:                                     ; No predecessors!
+  %c28 = alloca i8, align 1
+  store i8 %0, ptr %c28, align 1
+  %21 = load i8, ptr %c28, align 1
+  %22 = call i1 @isalpha(i8 %21)
+  br i1 %22, label %then_block29, label %merge_block30
+
+then_block29:                                     ; preds = %entrypoint27
+  ret i1 true
+
+merge_block30:                                    ; preds = %entrypoint27
+  %23 = load i8, ptr %c28, align 1
+  %24 = call i1 @isdigit(i8 %23)
+  br i1 %24, label %then_block31, label %merge_block32
+
+then_block31:                                     ; preds = %merge_block30
+  ret i1 true
+
+merge_block32:                                    ; preds = %merge_block30
+  ret i1 false
+
+entrypoint33:                                     ; No predecessors!
+  %c34 = alloca i8, align 1
+  store i8 %0, ptr %c34, align 1
+  %25 = load i8, ptr %c34, align 1
+  %26 = call i1 @isalpha(i8 %25)
+  br i1 %26, label %then_block35, label %merge_block36
+
+then_block35:                                     ; preds = %entrypoint33
+  ret i1 true
+
+merge_block36:                                    ; preds = %entrypoint33
+  %27 = load i8, ptr %c34, align 1
+  %28 = call i1 @isdigit(i8 %27)
+  br i1 %28, label %then_block37, label %merge_block38
+
+then_block37:                                     ; preds = %merge_block36
+  ret i1 true
+
+merge_block38:                                    ; preds = %merge_block36
+  ret i1 false
+
+entrypoint39:                                     ; No predecessors!
+  %c40 = alloca i8, align 1
+  store i8 %0, ptr %c40, align 1
+  %29 = load i8, ptr %c40, align 1
+  %30 = call i1 @isalpha(i8 %29)
+  br i1 %30, label %then_block41, label %merge_block42
+
+then_block41:                                     ; preds = %entrypoint39
+  ret i1 true
+
+merge_block42:                                    ; preds = %entrypoint39
+  %31 = load i8, ptr %c40, align 1
+  %32 = call i1 @isdigit(i8 %31)
+  br i1 %32, label %then_block43, label %merge_block44
+
+then_block43:                                     ; preds = %merge_block42
+  ret i1 true
+
+merge_block44:                                    ; preds = %merge_block42
+  ret i1 false
+}
+
+define i1 @iswhitespace(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = icmp eq i8 %1, 32
+  br i1 %2, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret i1 true
+
+merge_block:                                      ; preds = %entrypoint
+  %3 = load i8, ptr %c, align 1
+  %4 = icmp sge i8 %3, 9
+  br i1 %4, label %then_block1, label %merge_block4
+
+then_block1:                                      ; preds = %merge_block
+  %5 = load i8, ptr %c, align 1
+  %6 = icmp sle i8 %5, 13
+  br i1 %6, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %then_block1
+  ret i1 true
+
+merge_block3:                                     ; preds = %then_block1
+  br label %merge_block4
+
+merge_block4:                                     ; preds = %merge_block, %merge_block3
+  ret i1 false
+
+entrypoint5:                                      ; No predecessors!
+  %c6 = alloca i8, align 1
+  store i8 %0, ptr %c6, align 1
+  %7 = load i8, ptr %c6, align 1
+  %8 = icmp eq i8 %7, 32
+  br i1 %8, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %entrypoint5
+  ret i1 true
+
+merge_block8:                                     ; preds = %entrypoint5
+  %9 = load i8, ptr %c6, align 1
+  %10 = icmp sge i8 %9, 9
+  br i1 %10, label %then_block9, label %merge_block12
+
+then_block9:                                      ; preds = %merge_block8
+  %11 = load i8, ptr %c6, align 1
+  %12 = icmp sle i8 %11, 13
+  br i1 %12, label %then_block10, label %merge_block11
+
+then_block10:                                     ; preds = %then_block9
+  ret i1 true
+
+merge_block11:                                    ; preds = %then_block9
+  br label %merge_block12
+
+merge_block12:                                    ; preds = %merge_block8, %merge_block11
+  ret i1 false
+
+entrypoint13:                                     ; No predecessors!
+  %c14 = alloca i8, align 1
+  store i8 %0, ptr %c14, align 1
+  %13 = load i8, ptr %c14, align 1
+  %14 = icmp eq i8 %13, 32
+  br i1 %14, label %then_block15, label %merge_block16
+
+then_block15:                                     ; preds = %entrypoint13
+  ret i1 true
+
+merge_block16:                                    ; preds = %entrypoint13
+  %15 = load i8, ptr %c14, align 1
+  %16 = icmp sge i8 %15, 9
+  br i1 %16, label %then_block17, label %merge_block20
+
+then_block17:                                     ; preds = %merge_block16
+  %17 = load i8, ptr %c14, align 1
+  %18 = icmp sle i8 %17, 13
+  br i1 %18, label %then_block18, label %merge_block19
+
+then_block18:                                     ; preds = %then_block17
+  ret i1 true
+
+merge_block19:                                    ; preds = %then_block17
+  br label %merge_block20
+
+merge_block20:                                    ; preds = %merge_block16, %merge_block19
+  ret i1 false
+
+entrypoint21:                                     ; No predecessors!
+  %c22 = alloca i8, align 1
+  store i8 %0, ptr %c22, align 1
+  %19 = load i8, ptr %c22, align 1
+  %20 = icmp eq i8 %19, 32
+  br i1 %20, label %then_block23, label %merge_block24
+
+then_block23:                                     ; preds = %entrypoint21
+  ret i1 true
+
+merge_block24:                                    ; preds = %entrypoint21
+  %21 = load i8, ptr %c22, align 1
+  %22 = icmp sge i8 %21, 9
+  br i1 %22, label %then_block25, label %merge_block28
+
+then_block25:                                     ; preds = %merge_block24
+  %23 = load i8, ptr %c22, align 1
+  %24 = icmp sle i8 %23, 13
+  br i1 %24, label %then_block26, label %merge_block27
+
+then_block26:                                     ; preds = %then_block25
+  ret i1 true
+
+merge_block27:                                    ; preds = %then_block25
+  br label %merge_block28
+
+merge_block28:                                    ; preds = %merge_block24, %merge_block27
+  ret i1 false
+
+entrypoint29:                                     ; No predecessors!
+  %c30 = alloca i8, align 1
+  store i8 %0, ptr %c30, align 1
+  %25 = load i8, ptr %c30, align 1
+  %26 = icmp eq i8 %25, 32
+  br i1 %26, label %then_block31, label %merge_block32
+
+then_block31:                                     ; preds = %entrypoint29
+  ret i1 true
+
+merge_block32:                                    ; preds = %entrypoint29
+  %27 = load i8, ptr %c30, align 1
+  %28 = icmp sge i8 %27, 9
+  br i1 %28, label %then_block33, label %merge_block36
+
+then_block33:                                     ; preds = %merge_block32
+  %29 = load i8, ptr %c30, align 1
+  %30 = icmp sle i8 %29, 13
+  br i1 %30, label %then_block34, label %merge_block35
+
+then_block34:                                     ; preds = %then_block33
+  ret i1 true
+
+merge_block35:                                    ; preds = %then_block33
+  br label %merge_block36
+
+merge_block36:                                    ; preds = %merge_block32, %merge_block35
+  ret i1 false
+
+entrypoint37:                                     ; No predecessors!
+  %c38 = alloca i8, align 1
+  store i8 %0, ptr %c38, align 1
+  %31 = load i8, ptr %c38, align 1
+  %32 = icmp eq i8 %31, 32
+  br i1 %32, label %then_block39, label %merge_block40
+
+then_block39:                                     ; preds = %entrypoint37
+  ret i1 true
+
+merge_block40:                                    ; preds = %entrypoint37
+  %33 = load i8, ptr %c38, align 1
+  %34 = icmp sge i8 %33, 9
+  br i1 %34, label %then_block41, label %merge_block44
+
+then_block41:                                     ; preds = %merge_block40
+  %35 = load i8, ptr %c38, align 1
+  %36 = icmp sle i8 %35, 13
+  br i1 %36, label %then_block42, label %merge_block43
+
+then_block42:                                     ; preds = %then_block41
+  ret i1 true
+
+merge_block43:                                    ; preds = %then_block41
+  br label %merge_block44
+
+merge_block44:                                    ; preds = %merge_block40, %merge_block43
+  ret i1 false
+
+entrypoint45:                                     ; No predecessors!
+  %c46 = alloca i8, align 1
+  store i8 %0, ptr %c46, align 1
+  %37 = load i8, ptr %c46, align 1
+  %38 = icmp eq i8 %37, 32
+  br i1 %38, label %then_block47, label %merge_block48
+
+then_block47:                                     ; preds = %entrypoint45
+  ret i1 true
+
+merge_block48:                                    ; preds = %entrypoint45
+  %39 = load i8, ptr %c46, align 1
+  %40 = icmp sge i8 %39, 9
+  br i1 %40, label %then_block49, label %merge_block52
+
+then_block49:                                     ; preds = %merge_block48
+  %41 = load i8, ptr %c46, align 1
+  %42 = icmp sle i8 %41, 13
+  br i1 %42, label %then_block50, label %merge_block51
+
+then_block50:                                     ; preds = %then_block49
+  ret i1 true
+
+merge_block51:                                    ; preds = %then_block49
+  br label %merge_block52
+
+merge_block52:                                    ; preds = %merge_block48, %merge_block51
+  ret i1 false
+
+entrypoint53:                                     ; No predecessors!
+  %c54 = alloca i8, align 1
+  store i8 %0, ptr %c54, align 1
+  %43 = load i8, ptr %c54, align 1
+  %44 = icmp eq i8 %43, 32
+  br i1 %44, label %then_block55, label %merge_block56
+
+then_block55:                                     ; preds = %entrypoint53
+  ret i1 true
+
+merge_block56:                                    ; preds = %entrypoint53
+  %45 = load i8, ptr %c54, align 1
+  %46 = icmp sge i8 %45, 9
+  br i1 %46, label %then_block57, label %merge_block60
+
+then_block57:                                     ; preds = %merge_block56
+  %47 = load i8, ptr %c54, align 1
+  %48 = icmp sle i8 %47, 13
+  br i1 %48, label %then_block58, label %merge_block59
+
+then_block58:                                     ; preds = %then_block57
+  ret i1 true
+
+merge_block59:                                    ; preds = %then_block57
+  br label %merge_block60
+
+merge_block60:                                    ; preds = %merge_block56, %merge_block59
+  ret i1 false
+}
+
+define void @assert(i1 %0) {
+entrypoint:
+  %cond = alloca i1, align 1
+  store i1 %0, ptr %cond, align 1
+  %1 = load i1, ptr %cond, align 1
+  %2 = icmp eq i1 %1, false
+  br i1 %2, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  call void (ptr, ...) @printf(ptr @0)
+  call void @exit(i64 1)
+  br label %merge_block
+
+merge_block:                                      ; preds = %entrypoint, %then_block
+  ret void
+
+entrypoint1:                                      ; No predecessors!
+  %cond2 = alloca i1, align 1
+  store i1 %0, ptr %cond2, align 1
+  %3 = load i1, ptr %cond2, align 1
+  %4 = icmp eq i1 %3, false
+  br i1 %4, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %entrypoint1
+  call void (ptr, ...) @printf(ptr @1)
+  call void @exit(i64 1)
+  br label %merge_block4
+
+merge_block4:                                     ; preds = %entrypoint1, %then_block3
+  ret void
+
+entrypoint5:                                      ; No predecessors!
+  %cond6 = alloca i1, align 1
+  store i1 %0, ptr %cond6, align 1
+  %5 = load i1, ptr %cond6, align 1
+  %6 = icmp eq i1 %5, false
+  br i1 %6, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %entrypoint5
+  call void (ptr, ...) @printf(ptr @2)
+  call void @exit(i64 1)
+  br label %merge_block8
+
+merge_block8:                                     ; preds = %entrypoint5, %then_block7
+  ret void
+
+entrypoint9:                                      ; No predecessors!
+  %cond10 = alloca i1, align 1
+  store i1 %0, ptr %cond10, align 1
+  %7 = load i1, ptr %cond10, align 1
+  %8 = icmp eq i1 %7, false
+  br i1 %8, label %then_block11, label %merge_block12
+
+then_block11:                                     ; preds = %entrypoint9
+  call void (ptr, ...) @printf(ptr @3)
+  call void @exit(i64 1)
+  br label %merge_block12
+
+merge_block12:                                    ; preds = %entrypoint9, %then_block11
+  ret void
+
+entrypoint13:                                     ; No predecessors!
+  %cond14 = alloca i1, align 1
+  store i1 %0, ptr %cond14, align 1
+  %9 = load i1, ptr %cond14, align 1
+  %10 = icmp eq i1 %9, false
+  br i1 %10, label %then_block15, label %merge_block16
+
+then_block15:                                     ; preds = %entrypoint13
+  call void (ptr, ...) @printf(ptr @80)
+  call void @exit(i64 1)
+  br label %merge_block16
+
+merge_block16:                                    ; preds = %entrypoint13, %then_block15
+  ret void
+
+entrypoint17:                                     ; No predecessors!
+  %cond18 = alloca i1, align 1
+  store i1 %0, ptr %cond18, align 1
+  %11 = load i1, ptr %cond18, align 1
+  %12 = icmp eq i1 %11, false
+  br i1 %12, label %then_block19, label %merge_block20
+
+then_block19:                                     ; preds = %entrypoint17
+  call void (ptr, ...) @printf(ptr @81)
+  call void @exit(i64 1)
+  br label %merge_block20
+
+merge_block20:                                    ; preds = %entrypoint17, %then_block19
+  ret void
+
+entrypoint21:                                     ; No predecessors!
+  %cond22 = alloca i1, align 1
+  store i1 %0, ptr %cond22, align 1
+  %13 = load i1, ptr %cond22, align 1
+  %14 = icmp eq i1 %13, false
+  br i1 %14, label %then_block23, label %merge_block24
+
+then_block23:                                     ; preds = %entrypoint21
+  call void (ptr, ...) @printf(ptr @166)
+  call void @exit(i64 1)
+  br label %merge_block24
+
+merge_block24:                                    ; preds = %entrypoint21, %then_block23
+  ret void
+
+entrypoint25:                                     ; No predecessors!
+  %cond26 = alloca i1, align 1
+  store i1 %0, ptr %cond26, align 1
+  %15 = load i1, ptr %cond26, align 1
+  %16 = icmp eq i1 %15, false
+  br i1 %16, label %then_block27, label %merge_block28
+
+then_block27:                                     ; preds = %entrypoint25
+  call void (ptr, ...) @printf(ptr @167)
+  call void @exit(i64 1)
+  br label %merge_block28
+
+merge_block28:                                    ; preds = %entrypoint25, %then_block27
+  ret void
+}
+
+declare ptr @calloc(i64, i64)
+
+declare ptr @realloc(ptr, i64)
+
+declare void @free(ptr)
+
+define ptr @arena_init(i64 %0) {
+entrypoint:
+  %size = alloca i64, align 8
+  store i64 %0, ptr %size, align 4
+  %1 = call ptr @calloc(i64 1, i64 16)
+  %a = alloca ptr, align 8
+  store ptr %1, ptr %a, align 8
+  %2 = load ptr, ptr %a, align 8
+  %buf = getelementptr %arena, ptr %2, i32 0, i32 0
+  %3 = load i64, ptr %size, align 4
+  %4 = call ptr @calloc(i64 1, i64 %3)
+  store ptr %4, ptr %buf, align 8
+  %5 = load ptr, ptr %a, align 8
+  %offset = getelementptr %arena, ptr %5, i32 0, i32 1
+  store i64 0, ptr %offset, align 4
+  %6 = load ptr, ptr %a, align 8
+  ret ptr %6
+
+entrypoint1:                                      ; No predecessors!
+  %size2 = alloca i64, align 8
+  store i64 %0, ptr %size2, align 4
+  %7 = call ptr @calloc(i64 1, i64 16)
+  %a3 = alloca ptr, align 8
+  store ptr %7, ptr %a3, align 8
+  %8 = load ptr, ptr %a3, align 8
+  %buf4 = getelementptr %arena.0, ptr %8, i32 0, i32 0
+  %9 = load i64, ptr %size2, align 4
+  %10 = call ptr @calloc(i64 1, i64 %9)
+  store ptr %10, ptr %buf4, align 8
+  %11 = load ptr, ptr %a3, align 8
+  %offset5 = getelementptr %arena.0, ptr %11, i32 0, i32 1
+  store i64 0, ptr %offset5, align 4
+  %12 = load ptr, ptr %a3, align 8
+  ret ptr %12
+
+entrypoint6:                                      ; No predecessors!
+  %size7 = alloca i64, align 8
+  store i64 %0, ptr %size7, align 4
+  %13 = call ptr @calloc(i64 1, i64 16)
+  %a8 = alloca ptr, align 8
+  store ptr %13, ptr %a8, align 8
+  %14 = load ptr, ptr %a8, align 8
+  %buf9 = getelementptr %arena.1, ptr %14, i32 0, i32 0
+  %15 = load i64, ptr %size7, align 4
+  %16 = call ptr @calloc(i64 1, i64 %15)
+  store ptr %16, ptr %buf9, align 8
+  %17 = load ptr, ptr %a8, align 8
+  %offset10 = getelementptr %arena.1, ptr %17, i32 0, i32 1
+  store i64 0, ptr %offset10, align 4
+  %18 = load ptr, ptr %a8, align 8
+  ret ptr %18
+
+entrypoint11:                                     ; No predecessors!
+  %size12 = alloca i64, align 8
+  store i64 %0, ptr %size12, align 4
+  %19 = call ptr @calloc(i64 1, i64 16)
+  %a13 = alloca ptr, align 8
+  store ptr %19, ptr %a13, align 8
+  %20 = load ptr, ptr %a13, align 8
+  %buf14 = getelementptr %arena.4, ptr %20, i32 0, i32 0
+  %21 = load i64, ptr %size12, align 4
+  %22 = call ptr @calloc(i64 1, i64 %21)
+  store ptr %22, ptr %buf14, align 8
+  %23 = load ptr, ptr %a13, align 8
+  %offset15 = getelementptr %arena.4, ptr %23, i32 0, i32 1
+  store i64 0, ptr %offset15, align 4
+  %24 = load ptr, ptr %a13, align 8
+  ret ptr %24
+}
+
+define void @arena_free(ptr %0) {
+entrypoint:
+  %a = alloca ptr, align 8
+  store ptr %0, ptr %a, align 8
+  %1 = load ptr, ptr %a, align 8
+  %buf = getelementptr %arena, ptr %1, i32 0, i32 0
+  %2 = load ptr, ptr %buf, align 8
+  call void @free(ptr %2)
+  %3 = load ptr, ptr %a, align 8
+  call void @free(ptr %3)
+  ret void
+
+entrypoint1:                                      ; No predecessors!
+  %a2 = alloca ptr, align 8
+  store ptr %0, ptr %a2, align 8
+  %4 = load ptr, ptr %a2, align 8
+  %buf3 = getelementptr %arena.0, ptr %4, i32 0, i32 0
+  %5 = load ptr, ptr %buf3, align 8
+  call void @free(ptr %5)
+  %6 = load ptr, ptr %a2, align 8
+  call void @free(ptr %6)
+  ret void
+
+entrypoint4:                                      ; No predecessors!
+  %a5 = alloca ptr, align 8
+  store ptr %0, ptr %a5, align 8
+  %7 = load ptr, ptr %a5, align 8
+  %buf6 = getelementptr %arena.1, ptr %7, i32 0, i32 0
+  %8 = load ptr, ptr %buf6, align 8
+  call void @free(ptr %8)
+  %9 = load ptr, ptr %a5, align 8
+  call void @free(ptr %9)
+  ret void
+
+entrypoint7:                                      ; No predecessors!
+  %a8 = alloca ptr, align 8
+  store ptr %0, ptr %a8, align 8
+  %10 = load ptr, ptr %a8, align 8
+  %buf9 = getelementptr %arena.4, ptr %10, i32 0, i32 0
+  %11 = load ptr, ptr %buf9, align 8
+  call void @free(ptr %11)
+  %12 = load ptr, ptr %a8, align 8
+  call void @free(ptr %12)
+  ret void
+}
+
+define ptr @arena_alloc(ptr %0, i64 %1) {
+entrypoint:
+  %a = alloca ptr, align 8
+  store ptr %0, ptr %a, align 8
+  %size = alloca i64, align 8
+  store i64 %1, ptr %size, align 4
+  %2 = load ptr, ptr %a, align 8
+  %offset = getelementptr %arena, ptr %2, i32 0, i32 1
+  %3 = load i64, ptr %offset, align 4
+  %old_offset = alloca i64, align 8
+  store i64 %3, ptr %old_offset, align 4
+  %4 = load ptr, ptr %a, align 8
+  %offset1 = getelementptr %arena, ptr %4, i32 0, i32 1
+  %5 = load ptr, ptr %a, align 8
+  %offset2 = getelementptr %arena, ptr %5, i32 0, i32 1
+  %6 = load i64, ptr %offset2, align 4
+  %7 = load i64, ptr %size, align 4
+  %8 = add i64 %6, %7
+  store i64 %8, ptr %offset1, align 4
+  %9 = load ptr, ptr %a, align 8
+  %buf = getelementptr %arena, ptr %9, i32 0, i32 0
+  %10 = load ptr, ptr %buf, align 8
+  %11 = load i64, ptr %old_offset, align 4
+  %12 = getelementptr i8, ptr %10, i64 %11
+  ret ptr %12
+
+entrypoint3:                                      ; No predecessors!
+  %a4 = alloca ptr, align 8
+  store ptr %0, ptr %a4, align 8
+  %size5 = alloca i64, align 8
+  store i64 %1, ptr %size5, align 4
+  %13 = load ptr, ptr %a4, align 8
+  %offset6 = getelementptr %arena.0, ptr %13, i32 0, i32 1
+  %14 = load i64, ptr %offset6, align 4
+  %old_offset7 = alloca i64, align 8
+  store i64 %14, ptr %old_offset7, align 4
+  %15 = load ptr, ptr %a4, align 8
+  %offset8 = getelementptr %arena.0, ptr %15, i32 0, i32 1
+  %16 = load ptr, ptr %a4, align 8
+  %offset9 = getelementptr %arena.0, ptr %16, i32 0, i32 1
+  %17 = load i64, ptr %offset9, align 4
+  %18 = load i64, ptr %size5, align 4
+  %19 = add i64 %17, %18
+  store i64 %19, ptr %offset8, align 4
+  %20 = load ptr, ptr %a4, align 8
+  %buf10 = getelementptr %arena.0, ptr %20, i32 0, i32 0
+  %21 = load ptr, ptr %buf10, align 8
+  %22 = load i64, ptr %old_offset7, align 4
+  %23 = getelementptr i8, ptr %21, i64 %22
+  ret ptr %23
+
+entrypoint11:                                     ; No predecessors!
+  %a12 = alloca ptr, align 8
+  store ptr %0, ptr %a12, align 8
+  %size13 = alloca i64, align 8
+  store i64 %1, ptr %size13, align 4
+  %24 = load ptr, ptr %a12, align 8
+  %offset14 = getelementptr %arena.1, ptr %24, i32 0, i32 1
+  %25 = load i64, ptr %offset14, align 4
+  %old_offset15 = alloca i64, align 8
+  store i64 %25, ptr %old_offset15, align 4
+  %26 = load ptr, ptr %a12, align 8
+  %offset16 = getelementptr %arena.1, ptr %26, i32 0, i32 1
+  %27 = load ptr, ptr %a12, align 8
+  %offset17 = getelementptr %arena.1, ptr %27, i32 0, i32 1
+  %28 = load i64, ptr %offset17, align 4
+  %29 = load i64, ptr %size13, align 4
+  %30 = add i64 %28, %29
+  store i64 %30, ptr %offset16, align 4
+  %31 = load ptr, ptr %a12, align 8
+  %buf18 = getelementptr %arena.1, ptr %31, i32 0, i32 0
+  %32 = load ptr, ptr %buf18, align 8
+  %33 = load i64, ptr %old_offset15, align 4
+  %34 = getelementptr i8, ptr %32, i64 %33
+  ret ptr %34
+
+entrypoint19:                                     ; No predecessors!
+  %a20 = alloca ptr, align 8
+  store ptr %0, ptr %a20, align 8
+  %size21 = alloca i64, align 8
+  store i64 %1, ptr %size21, align 4
+  %35 = load ptr, ptr %a20, align 8
+  %offset22 = getelementptr %arena.4, ptr %35, i32 0, i32 1
+  %36 = load i64, ptr %offset22, align 4
+  %old_offset23 = alloca i64, align 8
+  store i64 %36, ptr %old_offset23, align 4
+  %37 = load ptr, ptr %a20, align 8
+  %offset24 = getelementptr %arena.4, ptr %37, i32 0, i32 1
+  %38 = load ptr, ptr %a20, align 8
+  %offset25 = getelementptr %arena.4, ptr %38, i32 0, i32 1
+  %39 = load i64, ptr %offset25, align 4
+  %40 = load i64, ptr %size21, align 4
+  %41 = add i64 %39, %40
+  store i64 %41, ptr %offset24, align 4
+  %42 = load ptr, ptr %a20, align 8
+  %buf26 = getelementptr %arena.4, ptr %42, i32 0, i32 0
+  %43 = load ptr, ptr %buf26, align 8
+  %44 = load i64, ptr %old_offset23, align 4
+  %45 = getelementptr i8, ptr %43, i64 %44
+  ret ptr %45
+}
+
+declare i64 @strlen(ptr)
+
+declare void @memcpy(ptr, ptr, i64)
+
+declare void @sprintf(ptr, ptr, ...)
+
+declare i64 @atoi(ptr)
+
+define i64 @print_tokens(ptr %0, i64 %1) {
+entrypoint:
+  %ts = alloca ptr, align 8
+  store ptr %0, ptr %ts, align 8
+  %ts_len = alloca i64, align 8
+  store i64 %1, ptr %ts_len, align 4
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block103, %entrypoint
+  %2 = load i64, ptr %i, align 4
+  %3 = load i64, ptr %ts_len, align 4
+  %4 = icmp slt i64 %2, %3
+  br i1 %4, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %5 = load ptr, ptr %ts, align 8
+  %6 = load i64, ptr %i, align 4
+  %7 = getelementptr %token, ptr %5, i64 %6
+  %8 = load %token, ptr %7, align 8
+  %to = alloca %token, align 8
+  store %token %8, ptr %to, align 8
+  %type = getelementptr %token, ptr %to, i32 0, i32 0
+  %9 = load i64, ptr %type, align 4
+  %10 = load i64, ptr @TOKEN_IMPORT, align 4
+  %11 = icmp eq i64 %9, %10
+  br i1 %11, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  ret i64 0
+
+then_block:                                       ; preds = %inner_block
+  call void (ptr, ...) @printf(ptr @4)
+  br label %merge_block
+
+merge_block:                                      ; preds = %inner_block, %then_block
+  %type1 = getelementptr %token, ptr %to, i32 0, i32 0
+  %12 = load i64, ptr %type1, align 4
+  %13 = load i64, ptr @TOKEN_LET, align 4
+  %14 = icmp eq i64 %12, %13
+  br i1 %14, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %merge_block
+  call void (ptr, ...) @printf(ptr @5)
+  br label %merge_block3
+
+merge_block3:                                     ; preds = %merge_block, %then_block2
+  %type4 = getelementptr %token, ptr %to, i32 0, i32 0
+  %15 = load i64, ptr %type4, align 4
+  %16 = load i64, ptr @TOKEN_EXTERN, align 4
+  %17 = icmp eq i64 %15, %16
+  br i1 %17, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block3
+  call void (ptr, ...) @printf(ptr @6)
+  br label %merge_block6
+
+merge_block6:                                     ; preds = %merge_block3, %then_block5
+  %type7 = getelementptr %token, ptr %to, i32 0, i32 0
+  %18 = load i64, ptr %type7, align 4
+  %19 = load i64, ptr @TOKEN_IF, align 4
+  %20 = icmp eq i64 %18, %19
+  br i1 %20, label %then_block8, label %merge_block9
+
+then_block8:                                      ; preds = %merge_block6
+  call void (ptr, ...) @printf(ptr @7)
+  br label %merge_block9
+
+merge_block9:                                     ; preds = %merge_block6, %then_block8
+  %type10 = getelementptr %token, ptr %to, i32 0, i32 0
+  %21 = load i64, ptr %type10, align 4
+  %22 = load i64, ptr @TOKEN_WHILE, align 4
+  %23 = icmp eq i64 %21, %22
+  br i1 %23, label %then_block11, label %merge_block12
+
+then_block11:                                     ; preds = %merge_block9
+  call void (ptr, ...) @printf(ptr @8)
+  br label %merge_block12
+
+merge_block12:                                    ; preds = %merge_block9, %then_block11
+  %type13 = getelementptr %token, ptr %to, i32 0, i32 0
+  %24 = load i64, ptr %type13, align 4
+  %25 = load i64, ptr @TOKEN_RETURN, align 4
+  %26 = icmp eq i64 %24, %25
+  br i1 %26, label %then_block14, label %merge_block15
+
+then_block14:                                     ; preds = %merge_block12
+  call void (ptr, ...) @printf(ptr @9)
+  br label %merge_block15
+
+merge_block15:                                    ; preds = %merge_block12, %then_block14
+  %type16 = getelementptr %token, ptr %to, i32 0, i32 0
+  %27 = load i64, ptr %type16, align 4
+  %28 = load i64, ptr @TOKEN_BREAK, align 4
+  %29 = icmp eq i64 %27, %28
+  br i1 %29, label %then_block17, label %merge_block18
+
+then_block17:                                     ; preds = %merge_block15
+  call void (ptr, ...) @printf(ptr @10)
+  br label %merge_block18
+
+merge_block18:                                    ; preds = %merge_block15, %then_block17
+  %type19 = getelementptr %token, ptr %to, i32 0, i32 0
+  %30 = load i64, ptr %type19, align 4
+  %31 = load i64, ptr @TOKEN_CONTINUE, align 4
+  %32 = icmp eq i64 %30, %31
+  br i1 %32, label %then_block20, label %merge_block21
+
+then_block20:                                     ; preds = %merge_block18
+  call void (ptr, ...) @printf(ptr @11)
+  br label %merge_block21
+
+merge_block21:                                    ; preds = %merge_block18, %then_block20
+  %type22 = getelementptr %token, ptr %to, i32 0, i32 0
+  %33 = load i64, ptr %type22, align 4
+  %34 = load i64, ptr @TOKEN_ARROW, align 4
+  %35 = icmp eq i64 %33, %34
+  br i1 %35, label %then_block23, label %merge_block24
+
+then_block23:                                     ; preds = %merge_block21
+  call void (ptr, ...) @printf(ptr @12)
+  br label %merge_block24
+
+merge_block24:                                    ; preds = %merge_block21, %then_block23
+  %type25 = getelementptr %token, ptr %to, i32 0, i32 0
+  %36 = load i64, ptr %type25, align 4
+  %37 = load i64, ptr @TOKEN_STRUCT, align 4
+  %38 = icmp eq i64 %36, %37
+  br i1 %38, label %then_block26, label %merge_block27
+
+then_block26:                                     ; preds = %merge_block24
+  call void (ptr, ...) @printf(ptr @13)
+  br label %merge_block27
+
+merge_block27:                                    ; preds = %merge_block24, %then_block26
+  %type28 = getelementptr %token, ptr %to, i32 0, i32 0
+  %39 = load i64, ptr %type28, align 4
+  %40 = load i64, ptr @TOKEN_TYPE, align 4
+  %41 = icmp eq i64 %39, %40
+  br i1 %41, label %then_block29, label %merge_block30
+
+then_block29:                                     ; preds = %merge_block27
+  call void (ptr, ...) @printf(ptr @14)
+  br label %merge_block30
+
+merge_block30:                                    ; preds = %merge_block27, %then_block29
+  %type31 = getelementptr %token, ptr %to, i32 0, i32 0
+  %42 = load i64, ptr %type31, align 4
+  %43 = load i64, ptr @TOKEN_IDENTIFIER, align 4
+  %44 = icmp eq i64 %42, %43
+  br i1 %44, label %then_block32, label %merge_block33
+
+then_block32:                                     ; preds = %merge_block30
+  %data = getelementptr %token, ptr %to, i32 0, i32 1
+  %45 = load ptr, ptr %data, align 8
+  call void (ptr, ...) @printf(ptr @15, ptr %45)
+  br label %merge_block33
+
+merge_block33:                                    ; preds = %merge_block30, %then_block32
+  %type34 = getelementptr %token, ptr %to, i32 0, i32 0
+  %46 = load i64, ptr %type34, align 4
+  %47 = load i64, ptr @TOKEN_NUMBER, align 4
+  %48 = icmp eq i64 %46, %47
+  br i1 %48, label %then_block35, label %merge_block37
+
+then_block35:                                     ; preds = %merge_block33
+  %data36 = getelementptr %token, ptr %to, i32 0, i32 1
+  %49 = load ptr, ptr %data36, align 8
+  %50 = load i64, ptr %49, align 4
+  call void (ptr, ...) @printf(ptr @16, i64 %50)
+  br label %merge_block37
+
+merge_block37:                                    ; preds = %merge_block33, %then_block35
+  %type38 = getelementptr %token, ptr %to, i32 0, i32 0
+  %51 = load i64, ptr %type38, align 4
+  %52 = load i64, ptr @TOKEN_BOOLEAN, align 4
+  %53 = icmp eq i64 %51, %52
+  br i1 %53, label %then_block39, label %merge_block41
+
+then_block39:                                     ; preds = %merge_block37
+  %data40 = getelementptr %token, ptr %to, i32 0, i32 1
+  %54 = load ptr, ptr %data40, align 8
+  %55 = load i1, ptr %54, align 1
+  call void (ptr, ...) @printf(ptr @17, i1 %55)
+  br label %merge_block41
+
+merge_block41:                                    ; preds = %merge_block37, %then_block39
+  %type42 = getelementptr %token, ptr %to, i32 0, i32 0
+  %56 = load i64, ptr %type42, align 4
+  %57 = load i64, ptr @TOKEN_NULL, align 4
+  %58 = icmp eq i64 %56, %57
+  br i1 %58, label %then_block43, label %merge_block44
+
+then_block43:                                     ; preds = %merge_block41
+  call void (ptr, ...) @printf(ptr @18)
+  br label %merge_block44
+
+merge_block44:                                    ; preds = %merge_block41, %then_block43
+  %type45 = getelementptr %token, ptr %to, i32 0, i32 0
+  %59 = load i64, ptr %type45, align 4
+  %60 = load i64, ptr @TOKEN_CHAR, align 4
+  %61 = icmp eq i64 %59, %60
+  br i1 %61, label %then_block46, label %merge_block48
+
+then_block46:                                     ; preds = %merge_block44
+  %data47 = getelementptr %token, ptr %to, i32 0, i32 1
+  %62 = load ptr, ptr %data47, align 8
+  %63 = load i8, ptr %62, align 1
+  call void (ptr, ...) @printf(ptr @19, i8 %63)
+  br label %merge_block48
+
+merge_block48:                                    ; preds = %merge_block44, %then_block46
+  %type49 = getelementptr %token, ptr %to, i32 0, i32 0
+  %64 = load i64, ptr %type49, align 4
+  %65 = load i64, ptr @TOKEN_STRING, align 4
+  %66 = icmp eq i64 %64, %65
+  br i1 %66, label %then_block50, label %merge_block52
+
+then_block50:                                     ; preds = %merge_block48
+  %data51 = getelementptr %token, ptr %to, i32 0, i32 1
+  %67 = load ptr, ptr %data51, align 8
+  call void (ptr, ...) @printf(ptr @20, ptr %67)
+  br label %merge_block52
+
+merge_block52:                                    ; preds = %merge_block48, %then_block50
+  %type53 = getelementptr %token, ptr %to, i32 0, i32 0
+  %68 = load i64, ptr %type53, align 4
+  %69 = load i64, ptr @TOKEN_EQUALS, align 4
+  %70 = icmp eq i64 %68, %69
+  br i1 %70, label %then_block54, label %merge_block55
+
+then_block54:                                     ; preds = %merge_block52
+  call void (ptr, ...) @printf(ptr @21)
+  br label %merge_block55
+
+merge_block55:                                    ; preds = %merge_block52, %then_block54
+  %type56 = getelementptr %token, ptr %to, i32 0, i32 0
+  %71 = load i64, ptr %type56, align 4
+  %72 = load i64, ptr @TOKEN_PLUS, align 4
+  %73 = icmp eq i64 %71, %72
+  br i1 %73, label %then_block57, label %merge_block58
+
+then_block57:                                     ; preds = %merge_block55
+  call void (ptr, ...) @printf(ptr @22)
+  br label %merge_block58
+
+merge_block58:                                    ; preds = %merge_block55, %then_block57
+  %type59 = getelementptr %token, ptr %to, i32 0, i32 0
+  %74 = load i64, ptr %type59, align 4
+  %75 = load i64, ptr @TOKEN_MINUS, align 4
+  %76 = icmp eq i64 %74, %75
+  br i1 %76, label %then_block60, label %merge_block61
+
+then_block60:                                     ; preds = %merge_block58
+  call void (ptr, ...) @printf(ptr @23)
+  br label %merge_block61
+
+merge_block61:                                    ; preds = %merge_block58, %then_block60
+  %type62 = getelementptr %token, ptr %to, i32 0, i32 0
+  %77 = load i64, ptr %type62, align 4
+  %78 = load i64, ptr @TOKEN_MUL, align 4
+  %79 = icmp eq i64 %77, %78
+  br i1 %79, label %then_block63, label %merge_block64
+
+then_block63:                                     ; preds = %merge_block61
+  call void (ptr, ...) @printf(ptr @24)
+  br label %merge_block64
+
+merge_block64:                                    ; preds = %merge_block61, %then_block63
+  %type65 = getelementptr %token, ptr %to, i32 0, i32 0
+  %80 = load i64, ptr %type65, align 4
+  %81 = load i64, ptr @TOKEN_DIV, align 4
+  %82 = icmp eq i64 %80, %81
+  br i1 %82, label %then_block66, label %merge_block67
+
+then_block66:                                     ; preds = %merge_block64
+  call void (ptr, ...) @printf(ptr @25)
+  br label %merge_block67
+
+merge_block67:                                    ; preds = %merge_block64, %then_block66
+  %type68 = getelementptr %token, ptr %to, i32 0, i32 0
+  %83 = load i64, ptr %type68, align 4
+  %84 = load i64, ptr @TOKEN_MOD, align 4
+  %85 = icmp eq i64 %83, %84
+  br i1 %85, label %then_block69, label %merge_block70
+
+then_block69:                                     ; preds = %merge_block67
+  call void (ptr, ...) @printf(ptr @26)
+  br label %merge_block70
+
+merge_block70:                                    ; preds = %merge_block67, %then_block69
+  %type71 = getelementptr %token, ptr %to, i32 0, i32 0
+  %86 = load i64, ptr %type71, align 4
+  %87 = load i64, ptr @TOKEN_BANG, align 4
+  %88 = icmp eq i64 %86, %87
+  br i1 %88, label %then_block72, label %merge_block73
+
+then_block72:                                     ; preds = %merge_block70
+  call void (ptr, ...) @printf(ptr @27)
+  br label %merge_block73
+
+merge_block73:                                    ; preds = %merge_block70, %then_block72
+  %type74 = getelementptr %token, ptr %to, i32 0, i32 0
+  %89 = load i64, ptr %type74, align 4
+  %90 = load i64, ptr @TOKEN_LESS, align 4
+  %91 = icmp eq i64 %89, %90
+  br i1 %91, label %then_block75, label %merge_block76
+
+then_block75:                                     ; preds = %merge_block73
+  call void (ptr, ...) @printf(ptr @28)
+  br label %merge_block76
+
+merge_block76:                                    ; preds = %merge_block73, %then_block75
+  %type77 = getelementptr %token, ptr %to, i32 0, i32 0
+  %92 = load i64, ptr %type77, align 4
+  %93 = load i64, ptr @TOKEN_GREATER, align 4
+  %94 = icmp eq i64 %92, %93
+  br i1 %94, label %then_block78, label %merge_block79
+
+then_block78:                                     ; preds = %merge_block76
+  call void (ptr, ...) @printf(ptr @29)
+  br label %merge_block79
+
+merge_block79:                                    ; preds = %merge_block76, %then_block78
+  %type80 = getelementptr %token, ptr %to, i32 0, i32 0
+  %95 = load i64, ptr %type80, align 4
+  %96 = load i64, ptr @TOKEN_DOT, align 4
+  %97 = icmp eq i64 %95, %96
+  br i1 %97, label %then_block81, label %merge_block82
+
+then_block81:                                     ; preds = %merge_block79
+  call void (ptr, ...) @printf(ptr @30)
+  br label %merge_block82
+
+merge_block82:                                    ; preds = %merge_block79, %then_block81
+  %type83 = getelementptr %token, ptr %to, i32 0, i32 0
+  %98 = load i64, ptr %type83, align 4
+  %99 = load i64, ptr @TOKEN_SEMICOLON, align 4
+  %100 = icmp eq i64 %98, %99
+  br i1 %100, label %then_block84, label %merge_block85
+
+then_block84:                                     ; preds = %merge_block82
+  call void (ptr, ...) @printf(ptr @31)
+  br label %merge_block85
+
+merge_block85:                                    ; preds = %merge_block82, %then_block84
+  %type86 = getelementptr %token, ptr %to, i32 0, i32 0
+  %101 = load i64, ptr %type86, align 4
+  %102 = load i64, ptr @TOKEN_COMMA, align 4
+  %103 = icmp eq i64 %101, %102
+  br i1 %103, label %then_block87, label %merge_block88
+
+then_block87:                                     ; preds = %merge_block85
+  call void (ptr, ...) @printf(ptr @32)
+  br label %merge_block88
+
+merge_block88:                                    ; preds = %merge_block85, %then_block87
+  %type89 = getelementptr %token, ptr %to, i32 0, i32 0
+  %104 = load i64, ptr %type89, align 4
+  %105 = load i64, ptr @TOKEN_COLON, align 4
+  %106 = icmp eq i64 %104, %105
+  br i1 %106, label %then_block90, label %merge_block91
+
+then_block90:                                     ; preds = %merge_block88
+  call void (ptr, ...) @printf(ptr @33)
+  br label %merge_block91
+
+merge_block91:                                    ; preds = %merge_block88, %then_block90
+  %type92 = getelementptr %token, ptr %to, i32 0, i32 0
+  %107 = load i64, ptr %type92, align 4
+  %108 = load i64, ptr @TOKEN_LPAREN, align 4
+  %109 = icmp eq i64 %107, %108
+  br i1 %109, label %then_block93, label %merge_block94
+
+then_block93:                                     ; preds = %merge_block91
+  call void (ptr, ...) @printf(ptr @34)
+  br label %merge_block94
+
+merge_block94:                                    ; preds = %merge_block91, %then_block93
+  %type95 = getelementptr %token, ptr %to, i32 0, i32 0
+  %110 = load i64, ptr %type95, align 4
+  %111 = load i64, ptr @TOKEN_RPAREN, align 4
+  %112 = icmp eq i64 %110, %111
+  br i1 %112, label %then_block96, label %merge_block97
+
+then_block96:                                     ; preds = %merge_block94
+  call void (ptr, ...) @printf(ptr @35)
+  br label %merge_block97
+
+merge_block97:                                    ; preds = %merge_block94, %then_block96
+  %type98 = getelementptr %token, ptr %to, i32 0, i32 0
+  %113 = load i64, ptr %type98, align 4
+  %114 = load i64, ptr @TOKEN_LBRACE, align 4
+  %115 = icmp eq i64 %113, %114
+  br i1 %115, label %then_block99, label %merge_block100
+
+then_block99:                                     ; preds = %merge_block97
+  call void (ptr, ...) @printf(ptr @36)
+  br label %merge_block100
+
+merge_block100:                                   ; preds = %merge_block97, %then_block99
+  %type101 = getelementptr %token, ptr %to, i32 0, i32 0
+  %116 = load i64, ptr %type101, align 4
+  %117 = load i64, ptr @TOKEN_RBRACE, align 4
+  %118 = icmp eq i64 %116, %117
+  br i1 %118, label %then_block102, label %merge_block103
+
+then_block102:                                    ; preds = %merge_block100
+  call void (ptr, ...) @printf(ptr @37)
+  br label %merge_block103
+
+merge_block103:                                   ; preds = %merge_block100, %then_block102
+  %119 = load i64, ptr %i, align 4
+  %120 = add i64 %119, 1
+  store i64 %120, ptr %i, align 4
+  br label %while_block
+
+entrypoint104:                                    ; No predecessors!
+  %ts105 = alloca ptr, align 8
+  store ptr %0, ptr %ts105, align 8
+  %ts_len106 = alloca i64, align 8
+  store i64 %1, ptr %ts_len106, align 4
+  %i107 = alloca i64, align 8
+  store i64 0, ptr %i107, align 4
+  br label %while_block108
+
+while_block108:                                   ; preds = %merge_block218, %entrypoint104
+  %121 = load i64, ptr %i107, align 4
+  %122 = load i64, ptr %ts_len106, align 4
+  %123 = icmp slt i64 %121, %122
+  br i1 %123, label %inner_block109, label %outer_block110
+
+inner_block109:                                   ; preds = %while_block108
+  %124 = load ptr, ptr %ts105, align 8
+  %125 = load i64, ptr %i107, align 4
+  %126 = getelementptr %token.2, ptr %124, i64 %125
+  %127 = load %token.2, ptr %126, align 8
+  %to111 = alloca %token.2, align 8
+  store %token.2 %127, ptr %to111, align 8
+  %type112 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %128 = load i64, ptr %type112, align 4
+  %129 = load i64, ptr @TOKEN_IMPORT.4, align 4
+  %130 = icmp eq i64 %128, %129
+  br i1 %130, label %then_block113, label %merge_block114
+
+outer_block110:                                   ; preds = %while_block108
+  ret i64 0
+
+then_block113:                                    ; preds = %inner_block109
+  call void (ptr, ...) @printf(ptr @82)
+  br label %merge_block114
+
+merge_block114:                                   ; preds = %inner_block109, %then_block113
+  %type115 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %131 = load i64, ptr %type115, align 4
+  %132 = load i64, ptr @TOKEN_LET.5, align 4
+  %133 = icmp eq i64 %131, %132
+  br i1 %133, label %then_block116, label %merge_block117
+
+then_block116:                                    ; preds = %merge_block114
+  call void (ptr, ...) @printf(ptr @83)
+  br label %merge_block117
+
+merge_block117:                                   ; preds = %merge_block114, %then_block116
+  %type118 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %134 = load i64, ptr %type118, align 4
+  %135 = load i64, ptr @TOKEN_EXTERN.6, align 4
+  %136 = icmp eq i64 %134, %135
+  br i1 %136, label %then_block119, label %merge_block120
+
+then_block119:                                    ; preds = %merge_block117
+  call void (ptr, ...) @printf(ptr @84)
+  br label %merge_block120
+
+merge_block120:                                   ; preds = %merge_block117, %then_block119
+  %type121 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %137 = load i64, ptr %type121, align 4
+  %138 = load i64, ptr @TOKEN_IF.7, align 4
+  %139 = icmp eq i64 %137, %138
+  br i1 %139, label %then_block122, label %merge_block123
+
+then_block122:                                    ; preds = %merge_block120
+  call void (ptr, ...) @printf(ptr @85)
+  br label %merge_block123
+
+merge_block123:                                   ; preds = %merge_block120, %then_block122
+  %type124 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %140 = load i64, ptr %type124, align 4
+  %141 = load i64, ptr @TOKEN_WHILE.8, align 4
+  %142 = icmp eq i64 %140, %141
+  br i1 %142, label %then_block125, label %merge_block126
+
+then_block125:                                    ; preds = %merge_block123
+  call void (ptr, ...) @printf(ptr @86)
+  br label %merge_block126
+
+merge_block126:                                   ; preds = %merge_block123, %then_block125
+  %type127 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %143 = load i64, ptr %type127, align 4
+  %144 = load i64, ptr @TOKEN_RETURN.9, align 4
+  %145 = icmp eq i64 %143, %144
+  br i1 %145, label %then_block128, label %merge_block129
+
+then_block128:                                    ; preds = %merge_block126
+  call void (ptr, ...) @printf(ptr @87)
+  br label %merge_block129
+
+merge_block129:                                   ; preds = %merge_block126, %then_block128
+  %type130 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %146 = load i64, ptr %type130, align 4
+  %147 = load i64, ptr @TOKEN_BREAK.10, align 4
+  %148 = icmp eq i64 %146, %147
+  br i1 %148, label %then_block131, label %merge_block132
+
+then_block131:                                    ; preds = %merge_block129
+  call void (ptr, ...) @printf(ptr @88)
+  br label %merge_block132
+
+merge_block132:                                   ; preds = %merge_block129, %then_block131
+  %type133 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %149 = load i64, ptr %type133, align 4
+  %150 = load i64, ptr @TOKEN_CONTINUE.11, align 4
+  %151 = icmp eq i64 %149, %150
+  br i1 %151, label %then_block134, label %merge_block135
+
+then_block134:                                    ; preds = %merge_block132
+  call void (ptr, ...) @printf(ptr @89)
+  br label %merge_block135
+
+merge_block135:                                   ; preds = %merge_block132, %then_block134
+  %type136 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %152 = load i64, ptr %type136, align 4
+  %153 = load i64, ptr @TOKEN_ARROW.12, align 4
+  %154 = icmp eq i64 %152, %153
+  br i1 %154, label %then_block137, label %merge_block138
+
+then_block137:                                    ; preds = %merge_block135
+  call void (ptr, ...) @printf(ptr @90)
+  br label %merge_block138
+
+merge_block138:                                   ; preds = %merge_block135, %then_block137
+  %type139 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %155 = load i64, ptr %type139, align 4
+  %156 = load i64, ptr @TOKEN_STRUCT.13, align 4
+  %157 = icmp eq i64 %155, %156
+  br i1 %157, label %then_block140, label %merge_block141
+
+then_block140:                                    ; preds = %merge_block138
+  call void (ptr, ...) @printf(ptr @91)
+  br label %merge_block141
+
+merge_block141:                                   ; preds = %merge_block138, %then_block140
+  %type142 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %158 = load i64, ptr %type142, align 4
+  %159 = load i64, ptr @TOKEN_TYPE.14, align 4
+  %160 = icmp eq i64 %158, %159
+  br i1 %160, label %then_block143, label %merge_block144
+
+then_block143:                                    ; preds = %merge_block141
+  call void (ptr, ...) @printf(ptr @92)
+  br label %merge_block144
+
+merge_block144:                                   ; preds = %merge_block141, %then_block143
+  %type145 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %161 = load i64, ptr %type145, align 4
+  %162 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %163 = icmp eq i64 %161, %162
+  br i1 %163, label %then_block146, label %merge_block148
+
+then_block146:                                    ; preds = %merge_block144
+  %data147 = getelementptr %token.2, ptr %to111, i32 0, i32 1
+  %164 = load ptr, ptr %data147, align 8
+  call void (ptr, ...) @printf(ptr @93, ptr %164)
+  br label %merge_block148
+
+merge_block148:                                   ; preds = %merge_block144, %then_block146
+  %type149 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %165 = load i64, ptr %type149, align 4
+  %166 = load i64, ptr @TOKEN_NUMBER.16, align 4
+  %167 = icmp eq i64 %165, %166
+  br i1 %167, label %then_block150, label %merge_block152
+
+then_block150:                                    ; preds = %merge_block148
+  %data151 = getelementptr %token.2, ptr %to111, i32 0, i32 1
+  %168 = load ptr, ptr %data151, align 8
+  %169 = load i64, ptr %168, align 4
+  call void (ptr, ...) @printf(ptr @94, i64 %169)
+  br label %merge_block152
+
+merge_block152:                                   ; preds = %merge_block148, %then_block150
+  %type153 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %170 = load i64, ptr %type153, align 4
+  %171 = load i64, ptr @TOKEN_BOOLEAN.17, align 4
+  %172 = icmp eq i64 %170, %171
+  br i1 %172, label %then_block154, label %merge_block156
+
+then_block154:                                    ; preds = %merge_block152
+  %data155 = getelementptr %token.2, ptr %to111, i32 0, i32 1
+  %173 = load ptr, ptr %data155, align 8
+  %174 = load i1, ptr %173, align 1
+  call void (ptr, ...) @printf(ptr @95, i1 %174)
+  br label %merge_block156
+
+merge_block156:                                   ; preds = %merge_block152, %then_block154
+  %type157 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %175 = load i64, ptr %type157, align 4
+  %176 = load i64, ptr @TOKEN_NULL.18, align 4
+  %177 = icmp eq i64 %175, %176
+  br i1 %177, label %then_block158, label %merge_block159
+
+then_block158:                                    ; preds = %merge_block156
+  call void (ptr, ...) @printf(ptr @96)
+  br label %merge_block159
+
+merge_block159:                                   ; preds = %merge_block156, %then_block158
+  %type160 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %178 = load i64, ptr %type160, align 4
+  %179 = load i64, ptr @TOKEN_CHAR.19, align 4
+  %180 = icmp eq i64 %178, %179
+  br i1 %180, label %then_block161, label %merge_block163
+
+then_block161:                                    ; preds = %merge_block159
+  %data162 = getelementptr %token.2, ptr %to111, i32 0, i32 1
+  %181 = load ptr, ptr %data162, align 8
+  %182 = load i8, ptr %181, align 1
+  call void (ptr, ...) @printf(ptr @97, i8 %182)
+  br label %merge_block163
+
+merge_block163:                                   ; preds = %merge_block159, %then_block161
+  %type164 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %183 = load i64, ptr %type164, align 4
+  %184 = load i64, ptr @TOKEN_STRING.20, align 4
+  %185 = icmp eq i64 %183, %184
+  br i1 %185, label %then_block165, label %merge_block167
+
+then_block165:                                    ; preds = %merge_block163
+  %data166 = getelementptr %token.2, ptr %to111, i32 0, i32 1
+  %186 = load ptr, ptr %data166, align 8
+  call void (ptr, ...) @printf(ptr @98, ptr %186)
+  br label %merge_block167
+
+merge_block167:                                   ; preds = %merge_block163, %then_block165
+  %type168 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %187 = load i64, ptr %type168, align 4
+  %188 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %189 = icmp eq i64 %187, %188
+  br i1 %189, label %then_block169, label %merge_block170
+
+then_block169:                                    ; preds = %merge_block167
+  call void (ptr, ...) @printf(ptr @99)
+  br label %merge_block170
+
+merge_block170:                                   ; preds = %merge_block167, %then_block169
+  %type171 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %190 = load i64, ptr %type171, align 4
+  %191 = load i64, ptr @TOKEN_PLUS.22, align 4
+  %192 = icmp eq i64 %190, %191
+  br i1 %192, label %then_block172, label %merge_block173
+
+then_block172:                                    ; preds = %merge_block170
+  call void (ptr, ...) @printf(ptr @100)
+  br label %merge_block173
+
+merge_block173:                                   ; preds = %merge_block170, %then_block172
+  %type174 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %193 = load i64, ptr %type174, align 4
+  %194 = load i64, ptr @TOKEN_MINUS.23, align 4
+  %195 = icmp eq i64 %193, %194
+  br i1 %195, label %then_block175, label %merge_block176
+
+then_block175:                                    ; preds = %merge_block173
+  call void (ptr, ...) @printf(ptr @101)
+  br label %merge_block176
+
+merge_block176:                                   ; preds = %merge_block173, %then_block175
+  %type177 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %196 = load i64, ptr %type177, align 4
+  %197 = load i64, ptr @TOKEN_MUL.24, align 4
+  %198 = icmp eq i64 %196, %197
+  br i1 %198, label %then_block178, label %merge_block179
+
+then_block178:                                    ; preds = %merge_block176
+  call void (ptr, ...) @printf(ptr @102)
+  br label %merge_block179
+
+merge_block179:                                   ; preds = %merge_block176, %then_block178
+  %type180 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %199 = load i64, ptr %type180, align 4
+  %200 = load i64, ptr @TOKEN_DIV.25, align 4
+  %201 = icmp eq i64 %199, %200
+  br i1 %201, label %then_block181, label %merge_block182
+
+then_block181:                                    ; preds = %merge_block179
+  call void (ptr, ...) @printf(ptr @103)
+  br label %merge_block182
+
+merge_block182:                                   ; preds = %merge_block179, %then_block181
+  %type183 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %202 = load i64, ptr %type183, align 4
+  %203 = load i64, ptr @TOKEN_MOD.26, align 4
+  %204 = icmp eq i64 %202, %203
+  br i1 %204, label %then_block184, label %merge_block185
+
+then_block184:                                    ; preds = %merge_block182
+  call void (ptr, ...) @printf(ptr @104)
+  br label %merge_block185
+
+merge_block185:                                   ; preds = %merge_block182, %then_block184
+  %type186 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %205 = load i64, ptr %type186, align 4
+  %206 = load i64, ptr @TOKEN_BANG.27, align 4
+  %207 = icmp eq i64 %205, %206
+  br i1 %207, label %then_block187, label %merge_block188
+
+then_block187:                                    ; preds = %merge_block185
+  call void (ptr, ...) @printf(ptr @105)
+  br label %merge_block188
+
+merge_block188:                                   ; preds = %merge_block185, %then_block187
+  %type189 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %208 = load i64, ptr %type189, align 4
+  %209 = load i64, ptr @TOKEN_LESS.28, align 4
+  %210 = icmp eq i64 %208, %209
+  br i1 %210, label %then_block190, label %merge_block191
+
+then_block190:                                    ; preds = %merge_block188
+  call void (ptr, ...) @printf(ptr @106)
+  br label %merge_block191
+
+merge_block191:                                   ; preds = %merge_block188, %then_block190
+  %type192 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %211 = load i64, ptr %type192, align 4
+  %212 = load i64, ptr @TOKEN_GREATER.29, align 4
+  %213 = icmp eq i64 %211, %212
+  br i1 %213, label %then_block193, label %merge_block194
+
+then_block193:                                    ; preds = %merge_block191
+  call void (ptr, ...) @printf(ptr @107)
+  br label %merge_block194
+
+merge_block194:                                   ; preds = %merge_block191, %then_block193
+  %type195 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %214 = load i64, ptr %type195, align 4
+  %215 = load i64, ptr @TOKEN_DOT.30, align 4
+  %216 = icmp eq i64 %214, %215
+  br i1 %216, label %then_block196, label %merge_block197
+
+then_block196:                                    ; preds = %merge_block194
+  call void (ptr, ...) @printf(ptr @108)
+  br label %merge_block197
+
+merge_block197:                                   ; preds = %merge_block194, %then_block196
+  %type198 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %217 = load i64, ptr %type198, align 4
+  %218 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %219 = icmp eq i64 %217, %218
+  br i1 %219, label %then_block199, label %merge_block200
+
+then_block199:                                    ; preds = %merge_block197
+  call void (ptr, ...) @printf(ptr @109)
+  br label %merge_block200
+
+merge_block200:                                   ; preds = %merge_block197, %then_block199
+  %type201 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %220 = load i64, ptr %type201, align 4
+  %221 = load i64, ptr @TOKEN_COMMA.32, align 4
+  %222 = icmp eq i64 %220, %221
+  br i1 %222, label %then_block202, label %merge_block203
+
+then_block202:                                    ; preds = %merge_block200
+  call void (ptr, ...) @printf(ptr @110)
+  br label %merge_block203
+
+merge_block203:                                   ; preds = %merge_block200, %then_block202
+  %type204 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %223 = load i64, ptr %type204, align 4
+  %224 = load i64, ptr @TOKEN_COLON.33, align 4
+  %225 = icmp eq i64 %223, %224
+  br i1 %225, label %then_block205, label %merge_block206
+
+then_block205:                                    ; preds = %merge_block203
+  call void (ptr, ...) @printf(ptr @111)
+  br label %merge_block206
+
+merge_block206:                                   ; preds = %merge_block203, %then_block205
+  %type207 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %226 = load i64, ptr %type207, align 4
+  %227 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  %228 = icmp eq i64 %226, %227
+  br i1 %228, label %then_block208, label %merge_block209
+
+then_block208:                                    ; preds = %merge_block206
+  call void (ptr, ...) @printf(ptr @112)
+  br label %merge_block209
+
+merge_block209:                                   ; preds = %merge_block206, %then_block208
+  %type210 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %229 = load i64, ptr %type210, align 4
+  %230 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  %231 = icmp eq i64 %229, %230
+  br i1 %231, label %then_block211, label %merge_block212
+
+then_block211:                                    ; preds = %merge_block209
+  call void (ptr, ...) @printf(ptr @113)
+  br label %merge_block212
+
+merge_block212:                                   ; preds = %merge_block209, %then_block211
+  %type213 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %232 = load i64, ptr %type213, align 4
+  %233 = load i64, ptr @TOKEN_LBRACE.36, align 4
+  %234 = icmp eq i64 %232, %233
+  br i1 %234, label %then_block214, label %merge_block215
+
+then_block214:                                    ; preds = %merge_block212
+  call void (ptr, ...) @printf(ptr @114)
+  br label %merge_block215
+
+merge_block215:                                   ; preds = %merge_block212, %then_block214
+  %type216 = getelementptr %token.2, ptr %to111, i32 0, i32 0
+  %235 = load i64, ptr %type216, align 4
+  %236 = load i64, ptr @TOKEN_RBRACE.37, align 4
+  %237 = icmp eq i64 %235, %236
+  br i1 %237, label %then_block217, label %merge_block218
+
+then_block217:                                    ; preds = %merge_block215
+  call void (ptr, ...) @printf(ptr @115)
+  br label %merge_block218
+
+merge_block218:                                   ; preds = %merge_block215, %then_block217
+  %238 = load i64, ptr %i107, align 4
+  %239 = add i64 %238, 1
+  store i64 %239, ptr %i107, align 4
+  br label %while_block108
+}
+
+define void @tokenizer_skip_whitespace(ptr %0) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block3, %entrypoint
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %1 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %1, i32 0, i32 2
+  %2 = load i64, ptr %offset, align 4
+  %3 = load ptr, ptr %t, align 8
+  %buf_len = getelementptr %tokenizer, ptr %3, i32 0, i32 1
+  %4 = load i64, ptr %buf_len, align 4
+  %5 = icmp sge i64 %2, %4
+  br i1 %5, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  ret void
+
+then_block:                                       ; preds = %inner_block
+  ret void
+
+merge_block:                                      ; preds = %inner_block
+  %6 = load ptr, ptr %t, align 8
+  %buf = getelementptr %tokenizer, ptr %6, i32 0, i32 0
+  %7 = load ptr, ptr %buf, align 8
+  %8 = load ptr, ptr %t, align 8
+  %offset1 = getelementptr %tokenizer, ptr %8, i32 0, i32 2
+  %9 = load i64, ptr %offset1, align 4
+  %10 = getelementptr i8, ptr %7, i64 %9
+  %11 = load i8, ptr %10, align 1
+  %c = alloca i8, align 1
+  store i8 %11, ptr %c, align 1
+  %12 = load i8, ptr %c, align 1
+  %13 = call i1 @iswhitespace(i8 %12)
+  %14 = icmp eq i1 %13, false
+  br i1 %14, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %merge_block
+  ret void
+
+merge_block3:                                     ; preds = %merge_block
+  %15 = load ptr, ptr %t, align 8
+  %offset4 = getelementptr %tokenizer, ptr %15, i32 0, i32 2
+  %16 = load ptr, ptr %t, align 8
+  %offset5 = getelementptr %tokenizer, ptr %16, i32 0, i32 2
+  %17 = load i64, ptr %offset5, align 4
+  %18 = add i64 %17, 1
+  store i64 %18, ptr %offset4, align 4
+  br label %while_block
+
+entrypoint6:                                      ; No predecessors!
+  %t7 = alloca ptr, align 8
+  store ptr %0, ptr %t7, align 8
+  br label %while_block8
+
+while_block8:                                     ; preds = %merge_block19, %entrypoint6
+  br i1 true, label %inner_block9, label %outer_block10
+
+inner_block9:                                     ; preds = %while_block8
+  %19 = load ptr, ptr %t7, align 8
+  %offset11 = getelementptr %tokenizer.3, ptr %19, i32 0, i32 2
+  %20 = load i64, ptr %offset11, align 4
+  %21 = load ptr, ptr %t7, align 8
+  %buf_len12 = getelementptr %tokenizer.3, ptr %21, i32 0, i32 1
+  %22 = load i64, ptr %buf_len12, align 4
+  %23 = icmp sge i64 %20, %22
+  br i1 %23, label %then_block13, label %merge_block14
+
+outer_block10:                                    ; preds = %while_block8
+  ret void
+
+then_block13:                                     ; preds = %inner_block9
+  ret void
+
+merge_block14:                                    ; preds = %inner_block9
+  %24 = load ptr, ptr %t7, align 8
+  %buf15 = getelementptr %tokenizer.3, ptr %24, i32 0, i32 0
+  %25 = load ptr, ptr %buf15, align 8
+  %26 = load ptr, ptr %t7, align 8
+  %offset16 = getelementptr %tokenizer.3, ptr %26, i32 0, i32 2
+  %27 = load i64, ptr %offset16, align 4
+  %28 = getelementptr i8, ptr %25, i64 %27
+  %29 = load i8, ptr %28, align 1
+  %c17 = alloca i8, align 1
+  store i8 %29, ptr %c17, align 1
+  %30 = load i8, ptr %c17, align 1
+  %31 = call i1 @iswhitespace(i8 %30)
+  %32 = icmp eq i1 %31, false
+  br i1 %32, label %then_block18, label %merge_block19
+
+then_block18:                                     ; preds = %merge_block14
+  ret void
+
+merge_block19:                                    ; preds = %merge_block14
+  %33 = load ptr, ptr %t7, align 8
+  %offset20 = getelementptr %tokenizer.3, ptr %33, i32 0, i32 2
+  %34 = load ptr, ptr %t7, align 8
+  %offset21 = getelementptr %tokenizer.3, ptr %34, i32 0, i32 2
+  %35 = load i64, ptr %offset21, align 4
+  %36 = add i64 %35, 1
+  store i64 %36, ptr %offset20, align 4
+  br label %while_block8
+}
+
+define i1 @tokenizer_accept_string(ptr %0, ptr %1) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %str = alloca ptr, align 8
+  store ptr %1, ptr %str, align 8
+  %2 = load ptr, ptr %str, align 8
+  %3 = call i64 @strlen(ptr %2)
+  %str_len = alloca i64, align 8
+  store i64 %3, ptr %str_len, align 4
+  %4 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %4, i32 0, i32 2
+  %5 = load i64, ptr %offset, align 4
+  %6 = load i64, ptr %str_len, align 4
+  %7 = add i64 %5, %6
+  %8 = load ptr, ptr %t, align 8
+  %buf_len = getelementptr %tokenizer, ptr %8, i32 0, i32 1
+  %9 = load i64, ptr %buf_len, align 4
+  %10 = icmp sgt i64 %7, %9
+  br i1 %10, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret i1 false
+
+merge_block:                                      ; preds = %entrypoint
+  %11 = load ptr, ptr %t, align 8
+  %arena = getelementptr %tokenizer, ptr %11, i32 0, i32 3
+  %12 = load ptr, ptr %arena, align 8
+  %13 = call ptr @arena_alloc(ptr %12, i64 1000)
+  %s = alloca ptr, align 8
+  store ptr %13, ptr %s, align 8
+  %14 = load ptr, ptr %s, align 8
+  %15 = load ptr, ptr %t, align 8
+  %buf = getelementptr %tokenizer, ptr %15, i32 0, i32 0
+  %16 = load ptr, ptr %buf, align 8
+  %17 = load ptr, ptr %t, align 8
+  %offset1 = getelementptr %tokenizer, ptr %17, i32 0, i32 2
+  %18 = load i64, ptr %offset1, align 4
+  %19 = getelementptr i8, ptr %16, i64 %18
+  %20 = load i64, ptr %str_len, align 4
+  call void @memcpy(ptr %14, ptr %19, i64 %20)
+  %21 = load ptr, ptr %s, align 8
+  %22 = load ptr, ptr %str, align 8
+  %23 = call i1 @strcmp(ptr %21, ptr %22)
+  br i1 %23, label %then_block2, label %merge_block5
+
+then_block2:                                      ; preds = %merge_block
+  %24 = load ptr, ptr %t, align 8
+  %offset3 = getelementptr %tokenizer, ptr %24, i32 0, i32 2
+  %25 = load ptr, ptr %t, align 8
+  %offset4 = getelementptr %tokenizer, ptr %25, i32 0, i32 2
+  %26 = load i64, ptr %offset4, align 4
+  %27 = load i64, ptr %str_len, align 4
+  %28 = add i64 %26, %27
+  store i64 %28, ptr %offset3, align 4
+  ret i1 true
+
+merge_block5:                                     ; preds = %merge_block
+  ret i1 false
+
+entrypoint6:                                      ; No predecessors!
+  %t7 = alloca ptr, align 8
+  store ptr %0, ptr %t7, align 8
+  %str8 = alloca ptr, align 8
+  store ptr %1, ptr %str8, align 8
+  %29 = load ptr, ptr %str8, align 8
+  %30 = call i64 @strlen(ptr %29)
+  %str_len9 = alloca i64, align 8
+  store i64 %30, ptr %str_len9, align 4
+  %31 = load ptr, ptr %t7, align 8
+  %offset10 = getelementptr %tokenizer.3, ptr %31, i32 0, i32 2
+  %32 = load i64, ptr %offset10, align 4
+  %33 = load i64, ptr %str_len9, align 4
+  %34 = add i64 %32, %33
+  %35 = load ptr, ptr %t7, align 8
+  %buf_len11 = getelementptr %tokenizer.3, ptr %35, i32 0, i32 1
+  %36 = load i64, ptr %buf_len11, align 4
+  %37 = icmp sgt i64 %34, %36
+  br i1 %37, label %then_block12, label %merge_block13
+
+then_block12:                                     ; preds = %entrypoint6
+  ret i1 false
+
+merge_block13:                                    ; preds = %entrypoint6
+  %38 = load ptr, ptr %t7, align 8
+  %arena14 = getelementptr %tokenizer.3, ptr %38, i32 0, i32 3
+  %39 = load ptr, ptr %arena14, align 8
+  %40 = call ptr @arena_alloc(ptr %39, i64 1000)
+  %s15 = alloca ptr, align 8
+  store ptr %40, ptr %s15, align 8
+  %41 = load ptr, ptr %s15, align 8
+  %42 = load ptr, ptr %t7, align 8
+  %buf16 = getelementptr %tokenizer.3, ptr %42, i32 0, i32 0
+  %43 = load ptr, ptr %buf16, align 8
+  %44 = load ptr, ptr %t7, align 8
+  %offset17 = getelementptr %tokenizer.3, ptr %44, i32 0, i32 2
+  %45 = load i64, ptr %offset17, align 4
+  %46 = getelementptr i8, ptr %43, i64 %45
+  %47 = load i64, ptr %str_len9, align 4
+  call void @memcpy(ptr %41, ptr %46, i64 %47)
+  %48 = load ptr, ptr %s15, align 8
+  %49 = load ptr, ptr %str8, align 8
+  %50 = call i1 @strcmp(ptr %48, ptr %49)
+  br i1 %50, label %then_block18, label %merge_block21
+
+then_block18:                                     ; preds = %merge_block13
+  %51 = load ptr, ptr %t7, align 8
+  %offset19 = getelementptr %tokenizer.3, ptr %51, i32 0, i32 2
+  %52 = load ptr, ptr %t7, align 8
+  %offset20 = getelementptr %tokenizer.3, ptr %52, i32 0, i32 2
+  %53 = load i64, ptr %offset20, align 4
+  %54 = load i64, ptr %str_len9, align 4
+  %55 = add i64 %53, %54
+  store i64 %55, ptr %offset19, align 4
+  ret i1 true
+
+merge_block21:                                    ; preds = %merge_block13
+  ret i1 false
+}
+
+define ptr @tokenizer_consume_until_condition(ptr %0, ptr %1) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %condition = alloca ptr, align 8
+  store ptr %1, ptr %condition, align 8
+  %2 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %2, i32 0, i32 2
+  %3 = load i64, ptr %offset, align 4
+  %start = alloca i64, align 8
+  store i64 %3, ptr %start, align 4
+  %4 = load ptr, ptr %t, align 8
+  %arena = getelementptr %tokenizer, ptr %4, i32 0, i32 3
+  %5 = load ptr, ptr %arena, align 8
+  %6 = call ptr @arena_alloc(ptr %5, i64 1000)
+  %res = alloca ptr, align 8
+  store ptr %6, ptr %res, align 8
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block22, %merge_block18, %entrypoint
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %7 = load ptr, ptr %t, align 8
+  %offset1 = getelementptr %tokenizer, ptr %7, i32 0, i32 2
+  %8 = load i64, ptr %offset1, align 4
+  %9 = load ptr, ptr %t, align 8
+  %buf_len = getelementptr %tokenizer, ptr %9, i32 0, i32 1
+  %10 = load i64, ptr %buf_len, align 4
+  %11 = icmp sge i64 %8, %10
+  br i1 %11, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  ret ptr null
+
+then_block:                                       ; preds = %inner_block
+  %12 = load ptr, ptr %res, align 8
+  ret ptr %12
+
+merge_block:                                      ; preds = %inner_block
+  %13 = load ptr, ptr %t, align 8
+  %buf = getelementptr %tokenizer, ptr %13, i32 0, i32 0
+  %14 = load ptr, ptr %buf, align 8
+  %15 = load ptr, ptr %t, align 8
+  %offset2 = getelementptr %tokenizer, ptr %15, i32 0, i32 2
+  %16 = load i64, ptr %offset2, align 4
+  %17 = getelementptr i8, ptr %14, i64 %16
+  %18 = load i8, ptr %17, align 1
+  %c = alloca i8, align 1
+  store i8 %18, ptr %c, align 1
+  %19 = load ptr, ptr %t, align 8
+  %offset3 = getelementptr %tokenizer, ptr %19, i32 0, i32 2
+  %20 = load i64, ptr %offset3, align 4
+  %offset4 = alloca i64, align 8
+  store i64 %20, ptr %offset4, align 4
+  %21 = load i8, ptr %c, align 1
+  %22 = icmp eq i8 %21, 92
+  br i1 %22, label %then_block5, label %merge_block20
+
+then_block5:                                      ; preds = %merge_block
+  %23 = load ptr, ptr %t, align 8
+  %buf6 = getelementptr %tokenizer, ptr %23, i32 0, i32 0
+  %24 = load ptr, ptr %buf6, align 8
+  %25 = load i64, ptr %offset4, align 4
+  %26 = add i64 %25, 1
+  %27 = getelementptr i8, ptr %24, i64 %26
+  %28 = load i8, ptr %27, align 1
+  %next_c = alloca i8, align 1
+  store i8 %28, ptr %next_c, align 1
+  %any = alloca i1, align 1
+  store i1 false, ptr %any, align 1
+  %29 = load i8, ptr %next_c, align 1
+  %30 = icmp eq i8 %29, 110
+  br i1 %30, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %then_block5
+  %31 = load ptr, ptr %res, align 8
+  %32 = load i64, ptr %offset4, align 4
+  %33 = load i64, ptr %start, align 4
+  %34 = sub i64 %32, %33
+  %35 = getelementptr i8, ptr %31, i64 %34
+  store i8 10, ptr %35, align 1
+  store i1 true, ptr %any, align 1
+  br label %merge_block8
+
+merge_block8:                                     ; preds = %then_block5, %then_block7
+  %36 = load i8, ptr %next_c, align 1
+  %37 = icmp eq i8 %36, 116
+  br i1 %37, label %then_block9, label %merge_block10
+
+then_block9:                                      ; preds = %merge_block8
+  %38 = load ptr, ptr %res, align 8
+  %39 = load i64, ptr %offset4, align 4
+  %40 = load i64, ptr %start, align 4
+  %41 = sub i64 %39, %40
+  %42 = getelementptr i8, ptr %38, i64 %41
+  store i8 9, ptr %42, align 1
+  store i1 true, ptr %any, align 1
+  br label %merge_block10
+
+merge_block10:                                    ; preds = %merge_block8, %then_block9
+  %43 = load i8, ptr %next_c, align 1
+  %44 = icmp eq i8 %43, 114
+  br i1 %44, label %then_block11, label %merge_block12
+
+then_block11:                                     ; preds = %merge_block10
+  %45 = load ptr, ptr %res, align 8
+  %46 = load i64, ptr %offset4, align 4
+  %47 = load i64, ptr %start, align 4
+  %48 = sub i64 %46, %47
+  %49 = getelementptr i8, ptr %45, i64 %48
+  store i8 13, ptr %49, align 1
+  store i1 true, ptr %any, align 1
+  br label %merge_block12
+
+merge_block12:                                    ; preds = %merge_block10, %then_block11
+  %50 = load i8, ptr %next_c, align 1
+  %51 = icmp eq i8 %50, 48
+  br i1 %51, label %then_block13, label %merge_block14
+
+then_block13:                                     ; preds = %merge_block12
+  %52 = load ptr, ptr %res, align 8
+  %53 = load i64, ptr %offset4, align 4
+  %54 = load i64, ptr %start, align 4
+  %55 = sub i64 %53, %54
+  %56 = getelementptr i8, ptr %52, i64 %55
+  store i8 0, ptr %56, align 1
+  store i1 true, ptr %any, align 1
+  br label %merge_block14
+
+merge_block14:                                    ; preds = %merge_block12, %then_block13
+  %57 = load i8, ptr %next_c, align 1
+  %58 = icmp eq i8 %57, 92
+  br i1 %58, label %then_block15, label %merge_block16
+
+then_block15:                                     ; preds = %merge_block14
+  %59 = load ptr, ptr %res, align 8
+  %60 = load i64, ptr %offset4, align 4
+  %61 = load i64, ptr %start, align 4
+  %62 = sub i64 %60, %61
+  %63 = getelementptr i8, ptr %59, i64 %62
+  store i8 92, ptr %63, align 1
+  store i1 true, ptr %any, align 1
+  br label %merge_block16
+
+merge_block16:                                    ; preds = %merge_block14, %then_block15
+  %64 = load i1, ptr %any, align 1
+  %65 = icmp eq i1 %64, false
+  br i1 %65, label %then_block17, label %merge_block18
+
+then_block17:                                     ; preds = %merge_block16
+  %66 = load ptr, ptr %res, align 8
+  %67 = load i64, ptr %offset4, align 4
+  %68 = load i64, ptr %start, align 4
+  %69 = sub i64 %67, %68
+  %70 = getelementptr i8, ptr %66, i64 %69
+  %71 = load i8, ptr %next_c, align 1
+  store i8 %71, ptr %70, align 1
+  br label %merge_block18
+
+merge_block18:                                    ; preds = %merge_block16, %then_block17
+  %72 = load i64, ptr %offset4, align 4
+  %73 = add i64 %72, 1
+  store i64 %73, ptr %offset4, align 4
+  %74 = load i64, ptr %offset4, align 4
+  %75 = add i64 %74, 1
+  store i64 %75, ptr %offset4, align 4
+  %76 = load ptr, ptr %t, align 8
+  %offset19 = getelementptr %tokenizer, ptr %76, i32 0, i32 2
+  %77 = load i64, ptr %offset4, align 4
+  store i64 %77, ptr %offset19, align 4
+  br label %while_block
+
+merge_block20:                                    ; preds = %merge_block
+  %78 = load ptr, ptr %condition, align 8
+  %79 = load i8, ptr %c, align 1
+  %80 = call i1 %78(i8 %79)
+  br i1 %80, label %then_block21, label %merge_block22
+
+then_block21:                                     ; preds = %merge_block20
+  %81 = load ptr, ptr %res, align 8
+  ret ptr %81
+
+merge_block22:                                    ; preds = %merge_block20
+  %82 = load ptr, ptr %res, align 8
+  %83 = load i64, ptr %offset4, align 4
+  %84 = load i64, ptr %start, align 4
+  %85 = sub i64 %83, %84
+  %86 = getelementptr i8, ptr %82, i64 %85
+  %87 = load i8, ptr %c, align 1
+  store i8 %87, ptr %86, align 1
+  %88 = load ptr, ptr %res, align 8
+  %89 = load i64, ptr %offset4, align 4
+  %90 = load i64, ptr %start, align 4
+  %91 = sub i64 %89, %90
+  %92 = add i64 %91, 1
+  %93 = getelementptr i8, ptr %88, i64 %92
+  store i8 0, ptr %93, align 1
+  %94 = load i64, ptr %offset4, align 4
+  %95 = add i64 %94, 1
+  store i64 %95, ptr %offset4, align 4
+  %96 = load ptr, ptr %t, align 8
+  %offset23 = getelementptr %tokenizer, ptr %96, i32 0, i32 2
+  %97 = load i64, ptr %offset4, align 4
+  store i64 %97, ptr %offset23, align 4
+  br label %while_block
+
+entrypoint24:                                     ; No predecessors!
+  %t25 = alloca ptr, align 8
+  store ptr %0, ptr %t25, align 8
+  %condition26 = alloca ptr, align 8
+  store ptr %1, ptr %condition26, align 8
+  %98 = load ptr, ptr %t25, align 8
+  %offset27 = getelementptr %tokenizer.3, ptr %98, i32 0, i32 2
+  %99 = load i64, ptr %offset27, align 4
+  %start28 = alloca i64, align 8
+  store i64 %99, ptr %start28, align 4
+  %100 = load ptr, ptr %t25, align 8
+  %arena29 = getelementptr %tokenizer.3, ptr %100, i32 0, i32 3
+  %101 = load ptr, ptr %arena29, align 8
+  %102 = call ptr @arena_alloc(ptr %101, i64 1000)
+  %res30 = alloca ptr, align 8
+  store ptr %102, ptr %res30, align 8
+  br label %while_block31
+
+while_block31:                                    ; preds = %merge_block62, %merge_block58, %entrypoint24
+  br i1 true, label %inner_block32, label %outer_block33
+
+inner_block32:                                    ; preds = %while_block31
+  %103 = load ptr, ptr %t25, align 8
+  %offset34 = getelementptr %tokenizer.3, ptr %103, i32 0, i32 2
+  %104 = load i64, ptr %offset34, align 4
+  %105 = load ptr, ptr %t25, align 8
+  %buf_len35 = getelementptr %tokenizer.3, ptr %105, i32 0, i32 1
+  %106 = load i64, ptr %buf_len35, align 4
+  %107 = icmp sge i64 %104, %106
+  br i1 %107, label %then_block36, label %merge_block37
+
+outer_block33:                                    ; preds = %while_block31
+  ret ptr null
+
+then_block36:                                     ; preds = %inner_block32
+  %108 = load ptr, ptr %res30, align 8
+  ret ptr %108
+
+merge_block37:                                    ; preds = %inner_block32
+  %109 = load ptr, ptr %t25, align 8
+  %buf38 = getelementptr %tokenizer.3, ptr %109, i32 0, i32 0
+  %110 = load ptr, ptr %buf38, align 8
+  %111 = load ptr, ptr %t25, align 8
+  %offset39 = getelementptr %tokenizer.3, ptr %111, i32 0, i32 2
+  %112 = load i64, ptr %offset39, align 4
+  %113 = getelementptr i8, ptr %110, i64 %112
+  %114 = load i8, ptr %113, align 1
+  %c40 = alloca i8, align 1
+  store i8 %114, ptr %c40, align 1
+  %115 = load ptr, ptr %t25, align 8
+  %offset41 = getelementptr %tokenizer.3, ptr %115, i32 0, i32 2
+  %116 = load i64, ptr %offset41, align 4
+  %offset42 = alloca i64, align 8
+  store i64 %116, ptr %offset42, align 4
+  %117 = load i8, ptr %c40, align 1
+  %118 = icmp eq i8 %117, 92
+  br i1 %118, label %then_block43, label %merge_block60
+
+then_block43:                                     ; preds = %merge_block37
+  %119 = load ptr, ptr %t25, align 8
+  %buf44 = getelementptr %tokenizer.3, ptr %119, i32 0, i32 0
+  %120 = load ptr, ptr %buf44, align 8
+  %121 = load i64, ptr %offset42, align 4
+  %122 = add i64 %121, 1
+  %123 = getelementptr i8, ptr %120, i64 %122
+  %124 = load i8, ptr %123, align 1
+  %next_c45 = alloca i8, align 1
+  store i8 %124, ptr %next_c45, align 1
+  %any46 = alloca i1, align 1
+  store i1 false, ptr %any46, align 1
+  %125 = load i8, ptr %next_c45, align 1
+  %126 = icmp eq i8 %125, 110
+  br i1 %126, label %then_block47, label %merge_block48
+
+then_block47:                                     ; preds = %then_block43
+  %127 = load ptr, ptr %res30, align 8
+  %128 = load i64, ptr %offset42, align 4
+  %129 = load i64, ptr %start28, align 4
+  %130 = sub i64 %128, %129
+  %131 = getelementptr i8, ptr %127, i64 %130
+  store i8 10, ptr %131, align 1
+  store i1 true, ptr %any46, align 1
+  br label %merge_block48
+
+merge_block48:                                    ; preds = %then_block43, %then_block47
+  %132 = load i8, ptr %next_c45, align 1
+  %133 = icmp eq i8 %132, 116
+  br i1 %133, label %then_block49, label %merge_block50
+
+then_block49:                                     ; preds = %merge_block48
+  %134 = load ptr, ptr %res30, align 8
+  %135 = load i64, ptr %offset42, align 4
+  %136 = load i64, ptr %start28, align 4
+  %137 = sub i64 %135, %136
+  %138 = getelementptr i8, ptr %134, i64 %137
+  store i8 9, ptr %138, align 1
+  store i1 true, ptr %any46, align 1
+  br label %merge_block50
+
+merge_block50:                                    ; preds = %merge_block48, %then_block49
+  %139 = load i8, ptr %next_c45, align 1
+  %140 = icmp eq i8 %139, 114
+  br i1 %140, label %then_block51, label %merge_block52
+
+then_block51:                                     ; preds = %merge_block50
+  %141 = load ptr, ptr %res30, align 8
+  %142 = load i64, ptr %offset42, align 4
+  %143 = load i64, ptr %start28, align 4
+  %144 = sub i64 %142, %143
+  %145 = getelementptr i8, ptr %141, i64 %144
+  store i8 13, ptr %145, align 1
+  store i1 true, ptr %any46, align 1
+  br label %merge_block52
+
+merge_block52:                                    ; preds = %merge_block50, %then_block51
+  %146 = load i8, ptr %next_c45, align 1
+  %147 = icmp eq i8 %146, 48
+  br i1 %147, label %then_block53, label %merge_block54
+
+then_block53:                                     ; preds = %merge_block52
+  %148 = load ptr, ptr %res30, align 8
+  %149 = load i64, ptr %offset42, align 4
+  %150 = load i64, ptr %start28, align 4
+  %151 = sub i64 %149, %150
+  %152 = getelementptr i8, ptr %148, i64 %151
+  store i8 0, ptr %152, align 1
+  store i1 true, ptr %any46, align 1
+  br label %merge_block54
+
+merge_block54:                                    ; preds = %merge_block52, %then_block53
+  %153 = load i8, ptr %next_c45, align 1
+  %154 = icmp eq i8 %153, 92
+  br i1 %154, label %then_block55, label %merge_block56
+
+then_block55:                                     ; preds = %merge_block54
+  %155 = load ptr, ptr %res30, align 8
+  %156 = load i64, ptr %offset42, align 4
+  %157 = load i64, ptr %start28, align 4
+  %158 = sub i64 %156, %157
+  %159 = getelementptr i8, ptr %155, i64 %158
+  store i8 92, ptr %159, align 1
+  store i1 true, ptr %any46, align 1
+  br label %merge_block56
+
+merge_block56:                                    ; preds = %merge_block54, %then_block55
+  %160 = load i1, ptr %any46, align 1
+  %161 = icmp eq i1 %160, false
+  br i1 %161, label %then_block57, label %merge_block58
+
+then_block57:                                     ; preds = %merge_block56
+  %162 = load ptr, ptr %res30, align 8
+  %163 = load i64, ptr %offset42, align 4
+  %164 = load i64, ptr %start28, align 4
+  %165 = sub i64 %163, %164
+  %166 = getelementptr i8, ptr %162, i64 %165
+  %167 = load i8, ptr %next_c45, align 1
+  store i8 %167, ptr %166, align 1
+  br label %merge_block58
+
+merge_block58:                                    ; preds = %merge_block56, %then_block57
+  %168 = load i64, ptr %offset42, align 4
+  %169 = add i64 %168, 1
+  store i64 %169, ptr %offset42, align 4
+  %170 = load i64, ptr %offset42, align 4
+  %171 = add i64 %170, 1
+  store i64 %171, ptr %offset42, align 4
+  %172 = load ptr, ptr %t25, align 8
+  %offset59 = getelementptr %tokenizer.3, ptr %172, i32 0, i32 2
+  %173 = load i64, ptr %offset42, align 4
+  store i64 %173, ptr %offset59, align 4
+  br label %while_block31
+
+merge_block60:                                    ; preds = %merge_block37
+  %174 = load ptr, ptr %condition26, align 8
+  %175 = load i8, ptr %c40, align 1
+  %176 = call i1 %174(i8 %175)
+  br i1 %176, label %then_block61, label %merge_block62
+
+then_block61:                                     ; preds = %merge_block60
+  %177 = load ptr, ptr %res30, align 8
+  ret ptr %177
+
+merge_block62:                                    ; preds = %merge_block60
+  %178 = load ptr, ptr %res30, align 8
+  %179 = load i64, ptr %offset42, align 4
+  %180 = load i64, ptr %start28, align 4
+  %181 = sub i64 %179, %180
+  %182 = getelementptr i8, ptr %178, i64 %181
+  %183 = load i8, ptr %c40, align 1
+  store i8 %183, ptr %182, align 1
+  %184 = load ptr, ptr %res30, align 8
+  %185 = load i64, ptr %offset42, align 4
+  %186 = load i64, ptr %start28, align 4
+  %187 = sub i64 %185, %186
+  %188 = add i64 %187, 1
+  %189 = getelementptr i8, ptr %184, i64 %188
+  store i8 0, ptr %189, align 1
+  %190 = load i64, ptr %offset42, align 4
+  %191 = add i64 %190, 1
+  store i64 %191, ptr %offset42, align 4
+  %192 = load ptr, ptr %t25, align 8
+  %offset63 = getelementptr %tokenizer.3, ptr %192, i32 0, i32 2
+  %193 = load i64, ptr %offset42, align 4
+  store i64 %193, ptr %offset63, align 4
+  br label %while_block31
+}
+
+define ptr @tokenizer_accept_int_type(ptr %0) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %1 = load ptr, ptr %t, align 8
+  %2 = call ptr @tokenizer_consume_until_condition(ptr %1, ptr @unnamed_func)
+  %string = alloca ptr, align 8
+  store ptr %2, ptr %string, align 8
+  %3 = load ptr, ptr %string, align 8
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %string, align 8
+  %6 = call i64 @strlen(ptr %5)
+  %7 = icmp eq i64 %6, 0
+  br i1 %7, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %8 = load ptr, ptr %t, align 8
+  %arena = getelementptr %tokenizer, ptr %8, i32 0, i32 3
+  %9 = load ptr, ptr %arena, align 8
+  %10 = call ptr @arena_alloc(ptr %9, i64 8)
+  %x = alloca ptr, align 8
+  store ptr %10, ptr %x, align 8
+  %11 = load ptr, ptr %string, align 8
+  %12 = call i64 @atoi(ptr %11)
+  %13 = load ptr, ptr %x, align 8
+  store i64 %12, ptr %13, align 4
+  %14 = load ptr, ptr %x, align 8
+  ret ptr %14
+
+entrypoint3:                                      ; No predecessors!
+  %t4 = alloca ptr, align 8
+  store ptr %0, ptr %t4, align 8
+  %15 = load ptr, ptr %t4, align 8
+  %16 = call ptr @tokenizer_consume_until_condition(ptr %15, ptr @unnamed_func.38)
+  %string5 = alloca ptr, align 8
+  store ptr %16, ptr %string5, align 8
+  %17 = load ptr, ptr %string5, align 8
+  %18 = icmp eq ptr %17, null
+  br i1 %18, label %then_block6, label %merge_block7
+
+then_block6:                                      ; preds = %entrypoint3
+  ret ptr null
+
+merge_block7:                                     ; preds = %entrypoint3
+  %19 = load ptr, ptr %string5, align 8
+  %20 = call i64 @strlen(ptr %19)
+  %21 = icmp eq i64 %20, 0
+  br i1 %21, label %then_block8, label %merge_block9
+
+then_block8:                                      ; preds = %merge_block7
+  ret ptr null
+
+merge_block9:                                     ; preds = %merge_block7
+  %22 = load ptr, ptr %t4, align 8
+  %arena10 = getelementptr %tokenizer.3, ptr %22, i32 0, i32 3
+  %23 = load ptr, ptr %arena10, align 8
+  %24 = call ptr @arena_alloc(ptr %23, i64 8)
+  %x11 = alloca ptr, align 8
+  store ptr %24, ptr %x11, align 8
+  %25 = load ptr, ptr %string5, align 8
+  %26 = call i64 @atoi(ptr %25)
+  %27 = load ptr, ptr %x11, align 8
+  store i64 %26, ptr %27, align 4
+  %28 = load ptr, ptr %x11, align 8
+  ret ptr %28
+}
+
+define i1 @unnamed_func(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = call i1 @isdigit(i8 %1)
+  %3 = icmp eq i1 %2, false
+  ret i1 %3
+}
+
+define ptr @tokenizer_accept_char_type(ptr %0) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %1 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %1, i32 0, i32 2
+  %2 = load i64, ptr %offset, align 4
+  %prev_offset = alloca i64, align 8
+  store i64 %2, ptr %prev_offset, align 4
+  %3 = load ptr, ptr %t, align 8
+  %4 = call i1 @tokenizer_accept_string(ptr %3, ptr @38)
+  %5 = icmp eq i1 %4, false
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %6 = load ptr, ptr %t, align 8
+  %offset1 = getelementptr %tokenizer, ptr %6, i32 0, i32 2
+  %7 = load i64, ptr %prev_offset, align 4
+  store i64 %7, ptr %offset1, align 4
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %8 = load ptr, ptr %t, align 8
+  %9 = call ptr @tokenizer_consume_until_condition(ptr %8, ptr @unnamed_func.1)
+  %string = alloca ptr, align 8
+  store ptr %9, ptr %string, align 8
+  %10 = load ptr, ptr %t, align 8
+  %11 = call i1 @tokenizer_accept_string(ptr %10, ptr @39)
+  %12 = icmp eq i1 %11, false
+  br i1 %12, label %then_block2, label %merge_block4
+
+then_block2:                                      ; preds = %merge_block
+  %13 = load ptr, ptr %t, align 8
+  %offset3 = getelementptr %tokenizer, ptr %13, i32 0, i32 2
+  %14 = load i64, ptr %prev_offset, align 4
+  store i64 %14, ptr %offset3, align 4
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block
+  %15 = load ptr, ptr %string, align 8
+  ret ptr %15
+
+entrypoint5:                                      ; No predecessors!
+  %t6 = alloca ptr, align 8
+  store ptr %0, ptr %t6, align 8
+  %16 = load ptr, ptr %t6, align 8
+  %offset7 = getelementptr %tokenizer.3, ptr %16, i32 0, i32 2
+  %17 = load i64, ptr %offset7, align 4
+  %prev_offset8 = alloca i64, align 8
+  store i64 %17, ptr %prev_offset8, align 4
+  %18 = load ptr, ptr %t6, align 8
+  %19 = call i1 @tokenizer_accept_string(ptr %18, ptr @116)
+  %20 = icmp eq i1 %19, false
+  br i1 %20, label %then_block9, label %merge_block11
+
+then_block9:                                      ; preds = %entrypoint5
+  %21 = load ptr, ptr %t6, align 8
+  %offset10 = getelementptr %tokenizer.3, ptr %21, i32 0, i32 2
+  %22 = load i64, ptr %prev_offset8, align 4
+  store i64 %22, ptr %offset10, align 4
+  ret ptr null
+
+merge_block11:                                    ; preds = %entrypoint5
+  %23 = load ptr, ptr %t6, align 8
+  %24 = call ptr @tokenizer_consume_until_condition(ptr %23, ptr @unnamed_func.39)
+  %string12 = alloca ptr, align 8
+  store ptr %24, ptr %string12, align 8
+  %25 = load ptr, ptr %t6, align 8
+  %26 = call i1 @tokenizer_accept_string(ptr %25, ptr @117)
+  %27 = icmp eq i1 %26, false
+  br i1 %27, label %then_block13, label %merge_block15
+
+then_block13:                                     ; preds = %merge_block11
+  %28 = load ptr, ptr %t6, align 8
+  %offset14 = getelementptr %tokenizer.3, ptr %28, i32 0, i32 2
+  %29 = load i64, ptr %prev_offset8, align 4
+  store i64 %29, ptr %offset14, align 4
+  ret ptr null
+
+merge_block15:                                    ; preds = %merge_block11
+  %30 = load ptr, ptr %string12, align 8
+  ret ptr %30
+}
+
+define i1 @unnamed_func.1(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = icmp eq i8 %1, 39
+  ret i1 %2
+}
+
+define ptr @tokenizer_accept_string_type(ptr %0) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %1 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %1, i32 0, i32 2
+  %2 = load i64, ptr %offset, align 4
+  %prev_offset = alloca i64, align 8
+  store i64 %2, ptr %prev_offset, align 4
+  %3 = load ptr, ptr %t, align 8
+  %4 = call i1 @tokenizer_accept_string(ptr %3, ptr @40)
+  %5 = icmp eq i1 %4, false
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %6 = load ptr, ptr %t, align 8
+  %offset1 = getelementptr %tokenizer, ptr %6, i32 0, i32 2
+  %7 = load i64, ptr %prev_offset, align 4
+  store i64 %7, ptr %offset1, align 4
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %8 = load ptr, ptr %t, align 8
+  %9 = call ptr @tokenizer_consume_until_condition(ptr %8, ptr @unnamed_func.2)
+  %string = alloca ptr, align 8
+  store ptr %9, ptr %string, align 8
+  %10 = load ptr, ptr %t, align 8
+  %11 = call i1 @tokenizer_accept_string(ptr %10, ptr @41)
+  %12 = icmp eq i1 %11, false
+  br i1 %12, label %then_block2, label %merge_block4
+
+then_block2:                                      ; preds = %merge_block
+  %13 = load ptr, ptr %t, align 8
+  %offset3 = getelementptr %tokenizer, ptr %13, i32 0, i32 2
+  %14 = load i64, ptr %prev_offset, align 4
+  store i64 %14, ptr %offset3, align 4
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block
+  %15 = load ptr, ptr %string, align 8
+  ret ptr %15
+
+entrypoint5:                                      ; No predecessors!
+  %t6 = alloca ptr, align 8
+  store ptr %0, ptr %t6, align 8
+  %16 = load ptr, ptr %t6, align 8
+  %offset7 = getelementptr %tokenizer.3, ptr %16, i32 0, i32 2
+  %17 = load i64, ptr %offset7, align 4
+  %prev_offset8 = alloca i64, align 8
+  store i64 %17, ptr %prev_offset8, align 4
+  %18 = load ptr, ptr %t6, align 8
+  %19 = call i1 @tokenizer_accept_string(ptr %18, ptr @118)
+  %20 = icmp eq i1 %19, false
+  br i1 %20, label %then_block9, label %merge_block11
+
+then_block9:                                      ; preds = %entrypoint5
+  %21 = load ptr, ptr %t6, align 8
+  %offset10 = getelementptr %tokenizer.3, ptr %21, i32 0, i32 2
+  %22 = load i64, ptr %prev_offset8, align 4
+  store i64 %22, ptr %offset10, align 4
+  ret ptr null
+
+merge_block11:                                    ; preds = %entrypoint5
+  %23 = load ptr, ptr %t6, align 8
+  %24 = call ptr @tokenizer_consume_until_condition(ptr %23, ptr @unnamed_func.40)
+  %string12 = alloca ptr, align 8
+  store ptr %24, ptr %string12, align 8
+  %25 = load ptr, ptr %t6, align 8
+  %26 = call i1 @tokenizer_accept_string(ptr %25, ptr @119)
+  %27 = icmp eq i1 %26, false
+  br i1 %27, label %then_block13, label %merge_block15
+
+then_block13:                                     ; preds = %merge_block11
+  %28 = load ptr, ptr %t6, align 8
+  %offset14 = getelementptr %tokenizer.3, ptr %28, i32 0, i32 2
+  %29 = load i64, ptr %prev_offset8, align 4
+  store i64 %29, ptr %offset14, align 4
+  ret ptr null
+
+merge_block15:                                    ; preds = %merge_block11
+  %30 = load ptr, ptr %string12, align 8
+  ret ptr %30
+}
+
+define i1 @unnamed_func.2(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = icmp eq i8 %1, 34
+  ret i1 %2
+}
+
+define void @tokenizer_skip_comments(ptr %0) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %1 = load ptr, ptr %t, align 8
+  %2 = call i1 @tokenizer_accept_string(ptr %1, ptr @42)
+  %3 = icmp eq i1 %2, false
+  br i1 %3, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret void
+
+merge_block:                                      ; preds = %entrypoint
+  br label %while_block
+
+while_block:                                      ; preds = %inner_block, %merge_block
+  %4 = load ptr, ptr %t, align 8
+  %5 = call i1 @tokenizer_accept_string(ptr %4, ptr @43)
+  %6 = icmp eq i1 %5, false
+  br i1 %6, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %7 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %7, i32 0, i32 2
+  %8 = load ptr, ptr %t, align 8
+  %offset1 = getelementptr %tokenizer, ptr %8, i32 0, i32 2
+  %9 = load i64, ptr %offset1, align 4
+  %10 = add i64 %9, 1
+  store i64 %10, ptr %offset, align 4
+  br label %while_block
+
+outer_block:                                      ; preds = %while_block
+  ret void
+
+entrypoint2:                                      ; No predecessors!
+  %t3 = alloca ptr, align 8
+  store ptr %0, ptr %t3, align 8
+  %11 = load ptr, ptr %t3, align 8
+  %12 = call i1 @tokenizer_accept_string(ptr %11, ptr @120)
+  %13 = icmp eq i1 %12, false
+  br i1 %13, label %then_block4, label %merge_block5
+
+then_block4:                                      ; preds = %entrypoint2
+  ret void
+
+merge_block5:                                     ; preds = %entrypoint2
+  br label %while_block6
+
+while_block6:                                     ; preds = %inner_block7, %merge_block5
+  %14 = load ptr, ptr %t3, align 8
+  %15 = call i1 @tokenizer_accept_string(ptr %14, ptr @121)
+  %16 = icmp eq i1 %15, false
+  br i1 %16, label %inner_block7, label %outer_block8
+
+inner_block7:                                     ; preds = %while_block6
+  %17 = load ptr, ptr %t3, align 8
+  %offset9 = getelementptr %tokenizer.3, ptr %17, i32 0, i32 2
+  %18 = load ptr, ptr %t3, align 8
+  %offset10 = getelementptr %tokenizer.3, ptr %18, i32 0, i32 2
+  %19 = load i64, ptr %offset10, align 4
+  %20 = add i64 %19, 1
+  store i64 %20, ptr %offset9, align 4
+  br label %while_block6
+
+outer_block8:                                     ; preds = %while_block6
+  ret void
+}
+
+define ptr @tokenizer_next(ptr %0) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %1 = load ptr, ptr %t, align 8
+  call void @tokenizer_skip_whitespace(ptr %1)
+  %2 = load ptr, ptr %t, align 8
+  call void @tokenizer_skip_comments(ptr %2)
+  %3 = load ptr, ptr %t, align 8
+  call void @tokenizer_skip_whitespace(ptr %3)
+  %4 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %4, i32 0, i32 2
+  %5 = load i64, ptr %offset, align 4
+  %6 = load ptr, ptr %t, align 8
+  %buf_len = getelementptr %tokenizer, ptr %6, i32 0, i32 1
+  %7 = load i64, ptr %buf_len, align 4
+  %8 = icmp sge i64 %5, %7
+  br i1 %8, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %9 = load ptr, ptr %t, align 8
+  %arena = getelementptr %tokenizer, ptr %9, i32 0, i32 3
+  %10 = load ptr, ptr %arena, align 8
+  %11 = call ptr @arena_alloc(ptr %10, i64 16)
+  %to = alloca ptr, align 8
+  store ptr %11, ptr %to, align 8
+  %12 = load ptr, ptr %t, align 8
+  %13 = call i1 @tokenizer_accept_string(ptr %12, ptr @44)
+  br i1 %13, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  %14 = load ptr, ptr %to, align 8
+  %type = getelementptr %token, ptr %14, i32 0, i32 0
+  %15 = load i64, ptr @TOKEN_IMPORT, align 4
+  store i64 %15, ptr %type, align 4
+  %16 = load ptr, ptr %to, align 8
+  ret ptr %16
+
+merge_block2:                                     ; preds = %merge_block
+  %17 = load ptr, ptr %t, align 8
+  %18 = call i1 @tokenizer_accept_string(ptr %17, ptr @45)
+  br i1 %18, label %then_block3, label %merge_block5
+
+then_block3:                                      ; preds = %merge_block2
+  %19 = load ptr, ptr %to, align 8
+  %type4 = getelementptr %token, ptr %19, i32 0, i32 0
+  %20 = load i64, ptr @TOKEN_LET, align 4
+  store i64 %20, ptr %type4, align 4
+  %21 = load ptr, ptr %to, align 8
+  ret ptr %21
+
+merge_block5:                                     ; preds = %merge_block2
+  %22 = load ptr, ptr %t, align 8
+  %23 = call i1 @tokenizer_accept_string(ptr %22, ptr @46)
+  br i1 %23, label %then_block6, label %merge_block8
+
+then_block6:                                      ; preds = %merge_block5
+  %24 = load ptr, ptr %to, align 8
+  %type7 = getelementptr %token, ptr %24, i32 0, i32 0
+  %25 = load i64, ptr @TOKEN_EXTERN, align 4
+  store i64 %25, ptr %type7, align 4
+  %26 = load ptr, ptr %to, align 8
+  ret ptr %26
+
+merge_block8:                                     ; preds = %merge_block5
+  %27 = load ptr, ptr %t, align 8
+  %28 = call i1 @tokenizer_accept_string(ptr %27, ptr @47)
+  br i1 %28, label %then_block9, label %merge_block11
+
+then_block9:                                      ; preds = %merge_block8
+  %29 = load ptr, ptr %to, align 8
+  %type10 = getelementptr %token, ptr %29, i32 0, i32 0
+  %30 = load i64, ptr @TOKEN_IF, align 4
+  store i64 %30, ptr %type10, align 4
+  %31 = load ptr, ptr %to, align 8
+  ret ptr %31
+
+merge_block11:                                    ; preds = %merge_block8
+  %32 = load ptr, ptr %t, align 8
+  %33 = call i1 @tokenizer_accept_string(ptr %32, ptr @48)
+  br i1 %33, label %then_block12, label %merge_block14
+
+then_block12:                                     ; preds = %merge_block11
+  %34 = load ptr, ptr %to, align 8
+  %type13 = getelementptr %token, ptr %34, i32 0, i32 0
+  %35 = load i64, ptr @TOKEN_WHILE, align 4
+  store i64 %35, ptr %type13, align 4
+  %36 = load ptr, ptr %to, align 8
+  ret ptr %36
+
+merge_block14:                                    ; preds = %merge_block11
+  %37 = load ptr, ptr %t, align 8
+  %38 = call i1 @tokenizer_accept_string(ptr %37, ptr @49)
+  br i1 %38, label %then_block15, label %merge_block17
+
+then_block15:                                     ; preds = %merge_block14
+  %39 = load ptr, ptr %to, align 8
+  %type16 = getelementptr %token, ptr %39, i32 0, i32 0
+  %40 = load i64, ptr @TOKEN_RETURN, align 4
+  store i64 %40, ptr %type16, align 4
+  %41 = load ptr, ptr %to, align 8
+  ret ptr %41
+
+merge_block17:                                    ; preds = %merge_block14
+  %42 = load ptr, ptr %t, align 8
+  %43 = call i1 @tokenizer_accept_string(ptr %42, ptr @50)
+  br i1 %43, label %then_block18, label %merge_block20
+
+then_block18:                                     ; preds = %merge_block17
+  %44 = load ptr, ptr %to, align 8
+  %type19 = getelementptr %token, ptr %44, i32 0, i32 0
+  %45 = load i64, ptr @TOKEN_BREAK, align 4
+  store i64 %45, ptr %type19, align 4
+  %46 = load ptr, ptr %to, align 8
+  ret ptr %46
+
+merge_block20:                                    ; preds = %merge_block17
+  %47 = load ptr, ptr %t, align 8
+  %48 = call i1 @tokenizer_accept_string(ptr %47, ptr @51)
+  br i1 %48, label %then_block21, label %merge_block23
+
+then_block21:                                     ; preds = %merge_block20
+  %49 = load ptr, ptr %to, align 8
+  %type22 = getelementptr %token, ptr %49, i32 0, i32 0
+  %50 = load i64, ptr @TOKEN_CONTINUE, align 4
+  store i64 %50, ptr %type22, align 4
+  %51 = load ptr, ptr %to, align 8
+  ret ptr %51
+
+merge_block23:                                    ; preds = %merge_block20
+  %52 = load ptr, ptr %t, align 8
+  %53 = call i1 @tokenizer_accept_string(ptr %52, ptr @52)
+  br i1 %53, label %then_block24, label %merge_block28
+
+then_block24:                                     ; preds = %merge_block23
+  %54 = load ptr, ptr %to, align 8
+  %type25 = getelementptr %token, ptr %54, i32 0, i32 0
+  %55 = load i64, ptr @TOKEN_BOOLEAN, align 4
+  store i64 %55, ptr %type25, align 4
+  %56 = load ptr, ptr %t, align 8
+  %arena26 = getelementptr %tokenizer, ptr %56, i32 0, i32 3
+  %57 = load ptr, ptr %arena26, align 8
+  %58 = call ptr @arena_alloc(ptr %57, i64 1)
+  %data = alloca ptr, align 8
+  store ptr %58, ptr %data, align 8
+  %59 = load ptr, ptr %data, align 8
+  store i1 true, ptr %59, align 1
+  %60 = load ptr, ptr %to, align 8
+  %data27 = getelementptr %token, ptr %60, i32 0, i32 1
+  %61 = load ptr, ptr %data, align 8
+  store ptr %61, ptr %data27, align 8
+  %62 = load ptr, ptr %to, align 8
+  ret ptr %62
+
+merge_block28:                                    ; preds = %merge_block23
+  %63 = load ptr, ptr %t, align 8
+  %64 = call i1 @tokenizer_accept_string(ptr %63, ptr @53)
+  br i1 %64, label %then_block29, label %merge_block34
+
+then_block29:                                     ; preds = %merge_block28
+  %65 = load ptr, ptr %to, align 8
+  %type30 = getelementptr %token, ptr %65, i32 0, i32 0
+  %66 = load i64, ptr @TOKEN_BOOLEAN, align 4
+  store i64 %66, ptr %type30, align 4
+  %67 = load ptr, ptr %t, align 8
+  %arena31 = getelementptr %tokenizer, ptr %67, i32 0, i32 3
+  %68 = load ptr, ptr %arena31, align 8
+  %69 = call ptr @arena_alloc(ptr %68, i64 1)
+  %data32 = alloca ptr, align 8
+  store ptr %69, ptr %data32, align 8
+  %70 = load ptr, ptr %data32, align 8
+  store i1 false, ptr %70, align 1
+  %71 = load ptr, ptr %to, align 8
+  %data33 = getelementptr %token, ptr %71, i32 0, i32 1
+  %72 = load ptr, ptr %data32, align 8
+  store ptr %72, ptr %data33, align 8
+  %73 = load ptr, ptr %to, align 8
+  ret ptr %73
+
+merge_block34:                                    ; preds = %merge_block28
+  %74 = load ptr, ptr %t, align 8
+  %75 = call i1 @tokenizer_accept_string(ptr %74, ptr @54)
+  br i1 %75, label %then_block35, label %merge_block37
+
+then_block35:                                     ; preds = %merge_block34
+  %76 = load ptr, ptr %to, align 8
+  %type36 = getelementptr %token, ptr %76, i32 0, i32 0
+  %77 = load i64, ptr @TOKEN_NULL, align 4
+  store i64 %77, ptr %type36, align 4
+  %78 = load ptr, ptr %to, align 8
+  ret ptr %78
+
+merge_block37:                                    ; preds = %merge_block34
+  %79 = load ptr, ptr %t, align 8
+  %80 = call i1 @tokenizer_accept_string(ptr %79, ptr @55)
+  br i1 %80, label %then_block38, label %merge_block40
+
+then_block38:                                     ; preds = %merge_block37
+  %81 = load ptr, ptr %to, align 8
+  %type39 = getelementptr %token, ptr %81, i32 0, i32 0
+  %82 = load i64, ptr @TOKEN_STRUCT, align 4
+  store i64 %82, ptr %type39, align 4
+  %83 = load ptr, ptr %to, align 8
+  ret ptr %83
+
+merge_block40:                                    ; preds = %merge_block37
+  %84 = load ptr, ptr %t, align 8
+  %85 = call i1 @tokenizer_accept_string(ptr %84, ptr @56)
+  br i1 %85, label %then_block41, label %merge_block43
+
+then_block41:                                     ; preds = %merge_block40
+  %86 = load ptr, ptr %to, align 8
+  %type42 = getelementptr %token, ptr %86, i32 0, i32 0
+  %87 = load i64, ptr @TOKEN_TYPE, align 4
+  store i64 %87, ptr %type42, align 4
+  %88 = load ptr, ptr %to, align 8
+  ret ptr %88
+
+merge_block43:                                    ; preds = %merge_block40
+  %89 = load ptr, ptr %t, align 8
+  %90 = call i1 @tokenizer_accept_string(ptr %89, ptr @57)
+  br i1 %90, label %then_block44, label %merge_block46
+
+then_block44:                                     ; preds = %merge_block43
+  %91 = load ptr, ptr %to, align 8
+  %type45 = getelementptr %token, ptr %91, i32 0, i32 0
+  %92 = load i64, ptr @TOKEN_ARROW, align 4
+  store i64 %92, ptr %type45, align 4
+  %93 = load ptr, ptr %to, align 8
+  ret ptr %93
+
+merge_block46:                                    ; preds = %merge_block43
+  %94 = load ptr, ptr %t, align 8
+  %95 = call i1 @tokenizer_accept_string(ptr %94, ptr @58)
+  br i1 %95, label %then_block47, label %merge_block49
+
+then_block47:                                     ; preds = %merge_block46
+  %96 = load ptr, ptr %to, align 8
+  %type48 = getelementptr %token, ptr %96, i32 0, i32 0
+  %97 = load i64, ptr @TOKEN_SEMICOLON, align 4
+  store i64 %97, ptr %type48, align 4
+  %98 = load ptr, ptr %to, align 8
+  ret ptr %98
+
+merge_block49:                                    ; preds = %merge_block46
+  %99 = load ptr, ptr %t, align 8
+  %100 = call i1 @tokenizer_accept_string(ptr %99, ptr @59)
+  br i1 %100, label %then_block50, label %merge_block52
+
+then_block50:                                     ; preds = %merge_block49
+  %101 = load ptr, ptr %to, align 8
+  %type51 = getelementptr %token, ptr %101, i32 0, i32 0
+  %102 = load i64, ptr @TOKEN_COMMA, align 4
+  store i64 %102, ptr %type51, align 4
+  %103 = load ptr, ptr %to, align 8
+  ret ptr %103
+
+merge_block52:                                    ; preds = %merge_block49
+  %104 = load ptr, ptr %t, align 8
+  %105 = call i1 @tokenizer_accept_string(ptr %104, ptr @60)
+  br i1 %105, label %then_block53, label %merge_block55
+
+then_block53:                                     ; preds = %merge_block52
+  %106 = load ptr, ptr %to, align 8
+  %type54 = getelementptr %token, ptr %106, i32 0, i32 0
+  %107 = load i64, ptr @TOKEN_COLON, align 4
+  store i64 %107, ptr %type54, align 4
+  %108 = load ptr, ptr %to, align 8
+  ret ptr %108
+
+merge_block55:                                    ; preds = %merge_block52
+  %109 = load ptr, ptr %t, align 8
+  %110 = call i1 @tokenizer_accept_string(ptr %109, ptr @61)
+  br i1 %110, label %then_block56, label %merge_block58
+
+then_block56:                                     ; preds = %merge_block55
+  %111 = load ptr, ptr %to, align 8
+  %type57 = getelementptr %token, ptr %111, i32 0, i32 0
+  %112 = load i64, ptr @TOKEN_LPAREN, align 4
+  store i64 %112, ptr %type57, align 4
+  %113 = load ptr, ptr %to, align 8
+  ret ptr %113
+
+merge_block58:                                    ; preds = %merge_block55
+  %114 = load ptr, ptr %t, align 8
+  %115 = call i1 @tokenizer_accept_string(ptr %114, ptr @62)
+  br i1 %115, label %then_block59, label %merge_block61
+
+then_block59:                                     ; preds = %merge_block58
+  %116 = load ptr, ptr %to, align 8
+  %type60 = getelementptr %token, ptr %116, i32 0, i32 0
+  %117 = load i64, ptr @TOKEN_RPAREN, align 4
+  store i64 %117, ptr %type60, align 4
+  %118 = load ptr, ptr %to, align 8
+  ret ptr %118
+
+merge_block61:                                    ; preds = %merge_block58
+  %119 = load ptr, ptr %t, align 8
+  %120 = call i1 @tokenizer_accept_string(ptr %119, ptr @63)
+  br i1 %120, label %then_block62, label %merge_block64
+
+then_block62:                                     ; preds = %merge_block61
+  %121 = load ptr, ptr %to, align 8
+  %type63 = getelementptr %token, ptr %121, i32 0, i32 0
+  %122 = load i64, ptr @TOKEN_LBRACE, align 4
+  store i64 %122, ptr %type63, align 4
+  %123 = load ptr, ptr %to, align 8
+  ret ptr %123
+
+merge_block64:                                    ; preds = %merge_block61
+  %124 = load ptr, ptr %t, align 8
+  %125 = call i1 @tokenizer_accept_string(ptr %124, ptr @64)
+  br i1 %125, label %then_block65, label %merge_block67
+
+then_block65:                                     ; preds = %merge_block64
+  %126 = load ptr, ptr %to, align 8
+  %type66 = getelementptr %token, ptr %126, i32 0, i32 0
+  %127 = load i64, ptr @TOKEN_RBRACE, align 4
+  store i64 %127, ptr %type66, align 4
+  %128 = load ptr, ptr %to, align 8
+  ret ptr %128
+
+merge_block67:                                    ; preds = %merge_block64
+  %129 = load ptr, ptr %t, align 8
+  %130 = call i1 @tokenizer_accept_string(ptr %129, ptr @65)
+  br i1 %130, label %then_block68, label %merge_block70
+
+then_block68:                                     ; preds = %merge_block67
+  %131 = load ptr, ptr %to, align 8
+  %type69 = getelementptr %token, ptr %131, i32 0, i32 0
+  %132 = load i64, ptr @TOKEN_EQUALS, align 4
+  store i64 %132, ptr %type69, align 4
+  %133 = load ptr, ptr %to, align 8
+  ret ptr %133
+
+merge_block70:                                    ; preds = %merge_block67
+  %134 = load ptr, ptr %t, align 8
+  %135 = call i1 @tokenizer_accept_string(ptr %134, ptr @66)
+  br i1 %135, label %then_block71, label %merge_block73
+
+then_block71:                                     ; preds = %merge_block70
+  %136 = load ptr, ptr %to, align 8
+  %type72 = getelementptr %token, ptr %136, i32 0, i32 0
+  %137 = load i64, ptr @TOKEN_PLUS, align 4
+  store i64 %137, ptr %type72, align 4
+  %138 = load ptr, ptr %to, align 8
+  ret ptr %138
+
+merge_block73:                                    ; preds = %merge_block70
+  %139 = load ptr, ptr %t, align 8
+  %140 = call i1 @tokenizer_accept_string(ptr %139, ptr @67)
+  br i1 %140, label %then_block74, label %merge_block76
+
+then_block74:                                     ; preds = %merge_block73
+  %141 = load ptr, ptr %to, align 8
+  %type75 = getelementptr %token, ptr %141, i32 0, i32 0
+  %142 = load i64, ptr @TOKEN_MINUS, align 4
+  store i64 %142, ptr %type75, align 4
+  %143 = load ptr, ptr %to, align 8
+  ret ptr %143
+
+merge_block76:                                    ; preds = %merge_block73
+  %144 = load ptr, ptr %t, align 8
+  %145 = call i1 @tokenizer_accept_string(ptr %144, ptr @68)
+  br i1 %145, label %then_block77, label %merge_block79
+
+then_block77:                                     ; preds = %merge_block76
+  %146 = load ptr, ptr %to, align 8
+  %type78 = getelementptr %token, ptr %146, i32 0, i32 0
+  %147 = load i64, ptr @TOKEN_MUL, align 4
+  store i64 %147, ptr %type78, align 4
+  %148 = load ptr, ptr %to, align 8
+  ret ptr %148
+
+merge_block79:                                    ; preds = %merge_block76
+  %149 = load ptr, ptr %t, align 8
+  %150 = call i1 @tokenizer_accept_string(ptr %149, ptr @69)
+  br i1 %150, label %then_block80, label %merge_block82
+
+then_block80:                                     ; preds = %merge_block79
+  %151 = load ptr, ptr %to, align 8
+  %type81 = getelementptr %token, ptr %151, i32 0, i32 0
+  %152 = load i64, ptr @TOKEN_DIV, align 4
+  store i64 %152, ptr %type81, align 4
+  %153 = load ptr, ptr %to, align 8
+  ret ptr %153
+
+merge_block82:                                    ; preds = %merge_block79
+  %154 = load ptr, ptr %t, align 8
+  %155 = call i1 @tokenizer_accept_string(ptr %154, ptr @70)
+  br i1 %155, label %then_block83, label %merge_block85
+
+then_block83:                                     ; preds = %merge_block82
+  %156 = load ptr, ptr %to, align 8
+  %type84 = getelementptr %token, ptr %156, i32 0, i32 0
+  %157 = load i64, ptr @TOKEN_MOD, align 4
+  store i64 %157, ptr %type84, align 4
+  %158 = load ptr, ptr %to, align 8
+  ret ptr %158
+
+merge_block85:                                    ; preds = %merge_block82
+  %159 = load ptr, ptr %t, align 8
+  %160 = call i1 @tokenizer_accept_string(ptr %159, ptr @71)
+  br i1 %160, label %then_block86, label %merge_block88
+
+then_block86:                                     ; preds = %merge_block85
+  %161 = load ptr, ptr %to, align 8
+  %type87 = getelementptr %token, ptr %161, i32 0, i32 0
+  %162 = load i64, ptr @TOKEN_BANG, align 4
+  store i64 %162, ptr %type87, align 4
+  %163 = load ptr, ptr %to, align 8
+  ret ptr %163
+
+merge_block88:                                    ; preds = %merge_block85
+  %164 = load ptr, ptr %t, align 8
+  %165 = call i1 @tokenizer_accept_string(ptr %164, ptr @72)
+  br i1 %165, label %then_block89, label %merge_block91
+
+then_block89:                                     ; preds = %merge_block88
+  %166 = load ptr, ptr %to, align 8
+  %type90 = getelementptr %token, ptr %166, i32 0, i32 0
+  %167 = load i64, ptr @TOKEN_LESS, align 4
+  store i64 %167, ptr %type90, align 4
+  %168 = load ptr, ptr %to, align 8
+  ret ptr %168
+
+merge_block91:                                    ; preds = %merge_block88
+  %169 = load ptr, ptr %t, align 8
+  %170 = call i1 @tokenizer_accept_string(ptr %169, ptr @73)
+  br i1 %170, label %then_block92, label %merge_block94
+
+then_block92:                                     ; preds = %merge_block91
+  %171 = load ptr, ptr %to, align 8
+  %type93 = getelementptr %token, ptr %171, i32 0, i32 0
+  %172 = load i64, ptr @TOKEN_GREATER, align 4
+  store i64 %172, ptr %type93, align 4
+  %173 = load ptr, ptr %to, align 8
+  ret ptr %173
+
+merge_block94:                                    ; preds = %merge_block91
+  %174 = load ptr, ptr %t, align 8
+  %175 = call i1 @tokenizer_accept_string(ptr %174, ptr @74)
+  br i1 %175, label %then_block95, label %merge_block97
+
+then_block95:                                     ; preds = %merge_block94
+  %176 = load ptr, ptr %to, align 8
+  %type96 = getelementptr %token, ptr %176, i32 0, i32 0
+  %177 = load i64, ptr @TOKEN_DOT, align 4
+  store i64 %177, ptr %type96, align 4
+  %178 = load ptr, ptr %to, align 8
+  ret ptr %178
+
+merge_block97:                                    ; preds = %merge_block94
+  %179 = load ptr, ptr %t, align 8
+  %180 = call ptr @tokenizer_accept_int_type(ptr %179)
+  %maybe_int = alloca ptr, align 8
+  store ptr %180, ptr %maybe_int, align 8
+  %181 = load ptr, ptr %maybe_int, align 8
+  %182 = icmp ne ptr %181, null
+  br i1 %182, label %then_block98, label %merge_block101
+
+then_block98:                                     ; preds = %merge_block97
+  %183 = load ptr, ptr %to, align 8
+  %type99 = getelementptr %token, ptr %183, i32 0, i32 0
+  %184 = load i64, ptr @TOKEN_NUMBER, align 4
+  store i64 %184, ptr %type99, align 4
+  %185 = load ptr, ptr %to, align 8
+  %data100 = getelementptr %token, ptr %185, i32 0, i32 1
+  %186 = load ptr, ptr %maybe_int, align 8
+  store ptr %186, ptr %data100, align 8
+  %187 = load ptr, ptr %to, align 8
+  ret ptr %187
+
+merge_block101:                                   ; preds = %merge_block97
+  %188 = load ptr, ptr %t, align 8
+  %189 = call ptr @tokenizer_accept_char_type(ptr %188)
+  %maybe_char = alloca ptr, align 8
+  store ptr %189, ptr %maybe_char, align 8
+  %190 = load ptr, ptr %maybe_char, align 8
+  %191 = icmp ne ptr %190, null
+  br i1 %191, label %then_block102, label %merge_block105
+
+then_block102:                                    ; preds = %merge_block101
+  %192 = load ptr, ptr %to, align 8
+  %type103 = getelementptr %token, ptr %192, i32 0, i32 0
+  %193 = load i64, ptr @TOKEN_CHAR, align 4
+  store i64 %193, ptr %type103, align 4
+  %194 = load ptr, ptr %to, align 8
+  %data104 = getelementptr %token, ptr %194, i32 0, i32 1
+  %195 = load ptr, ptr %maybe_char, align 8
+  store ptr %195, ptr %data104, align 8
+  %196 = load ptr, ptr %to, align 8
+  ret ptr %196
+
+merge_block105:                                   ; preds = %merge_block101
+  %197 = load ptr, ptr %t, align 8
+  %198 = call ptr @tokenizer_accept_string_type(ptr %197)
+  %maybe_string = alloca ptr, align 8
+  store ptr %198, ptr %maybe_string, align 8
+  %199 = load ptr, ptr %maybe_string, align 8
+  %200 = icmp ne ptr %199, null
+  br i1 %200, label %then_block106, label %merge_block109
+
+then_block106:                                    ; preds = %merge_block105
+  %201 = load ptr, ptr %to, align 8
+  %type107 = getelementptr %token, ptr %201, i32 0, i32 0
+  %202 = load i64, ptr @TOKEN_STRING, align 4
+  store i64 %202, ptr %type107, align 4
+  %203 = load ptr, ptr %to, align 8
+  %data108 = getelementptr %token, ptr %203, i32 0, i32 1
+  %204 = load ptr, ptr %maybe_string, align 8
+  store ptr %204, ptr %data108, align 8
+  %205 = load ptr, ptr %to, align 8
+  ret ptr %205
+
+merge_block109:                                   ; preds = %merge_block105
+  %206 = load ptr, ptr %t, align 8
+  %207 = call ptr @tokenizer_consume_until_condition(ptr %206, ptr @unnamed_func.3)
+  %string = alloca ptr, align 8
+  store ptr %207, ptr %string, align 8
+  %208 = load ptr, ptr %string, align 8
+  %209 = call i64 @strlen(ptr %208)
+  %210 = icmp eq i64 %209, 0
+  br i1 %210, label %then_block110, label %merge_block111
+
+then_block110:                                    ; preds = %merge_block109
+  call void (ptr, ...) @printf(ptr @75)
+  ret ptr null
+
+merge_block111:                                   ; preds = %merge_block109
+  %211 = load ptr, ptr %to, align 8
+  %type112 = getelementptr %token, ptr %211, i32 0, i32 0
+  %212 = load i64, ptr @TOKEN_IDENTIFIER, align 4
+  store i64 %212, ptr %type112, align 4
+  %213 = load ptr, ptr %to, align 8
+  %data113 = getelementptr %token, ptr %213, i32 0, i32 1
+  %214 = load ptr, ptr %string, align 8
+  store ptr %214, ptr %data113, align 8
+  %215 = load ptr, ptr %to, align 8
+  ret ptr %215
+
+entrypoint114:                                    ; No predecessors!
+  %t115 = alloca ptr, align 8
+  store ptr %0, ptr %t115, align 8
+  %216 = load ptr, ptr %t115, align 8
+  call void @tokenizer_skip_whitespace(ptr %216)
+  %217 = load ptr, ptr %t115, align 8
+  call void @tokenizer_skip_comments(ptr %217)
+  %218 = load ptr, ptr %t115, align 8
+  call void @tokenizer_skip_whitespace(ptr %218)
+  %219 = load ptr, ptr %t115, align 8
+  %offset116 = getelementptr %tokenizer.3, ptr %219, i32 0, i32 2
+  %220 = load i64, ptr %offset116, align 4
+  %221 = load ptr, ptr %t115, align 8
+  %buf_len117 = getelementptr %tokenizer.3, ptr %221, i32 0, i32 1
+  %222 = load i64, ptr %buf_len117, align 4
+  %223 = icmp sge i64 %220, %222
+  br i1 %223, label %then_block118, label %merge_block119
+
+then_block118:                                    ; preds = %entrypoint114
+  ret ptr null
+
+merge_block119:                                   ; preds = %entrypoint114
+  %224 = load ptr, ptr %t115, align 8
+  %arena120 = getelementptr %tokenizer.3, ptr %224, i32 0, i32 3
+  %225 = load ptr, ptr %arena120, align 8
+  %226 = call ptr @arena_alloc(ptr %225, i64 16)
+  %to121 = alloca ptr, align 8
+  store ptr %226, ptr %to121, align 8
+  %227 = load ptr, ptr %t115, align 8
+  %228 = call i1 @tokenizer_accept_string(ptr %227, ptr @122)
+  br i1 %228, label %then_block122, label %merge_block124
+
+then_block122:                                    ; preds = %merge_block119
+  %229 = load ptr, ptr %to121, align 8
+  %type123 = getelementptr %token.2, ptr %229, i32 0, i32 0
+  %230 = load i64, ptr @TOKEN_IMPORT.4, align 4
+  store i64 %230, ptr %type123, align 4
+  %231 = load ptr, ptr %to121, align 8
+  ret ptr %231
+
+merge_block124:                                   ; preds = %merge_block119
+  %232 = load ptr, ptr %t115, align 8
+  %233 = call i1 @tokenizer_accept_string(ptr %232, ptr @123)
+  br i1 %233, label %then_block125, label %merge_block127
+
+then_block125:                                    ; preds = %merge_block124
+  %234 = load ptr, ptr %to121, align 8
+  %type126 = getelementptr %token.2, ptr %234, i32 0, i32 0
+  %235 = load i64, ptr @TOKEN_LET.5, align 4
+  store i64 %235, ptr %type126, align 4
+  %236 = load ptr, ptr %to121, align 8
+  ret ptr %236
+
+merge_block127:                                   ; preds = %merge_block124
+  %237 = load ptr, ptr %t115, align 8
+  %238 = call i1 @tokenizer_accept_string(ptr %237, ptr @124)
+  br i1 %238, label %then_block128, label %merge_block130
+
+then_block128:                                    ; preds = %merge_block127
+  %239 = load ptr, ptr %to121, align 8
+  %type129 = getelementptr %token.2, ptr %239, i32 0, i32 0
+  %240 = load i64, ptr @TOKEN_EXTERN.6, align 4
+  store i64 %240, ptr %type129, align 4
+  %241 = load ptr, ptr %to121, align 8
+  ret ptr %241
+
+merge_block130:                                   ; preds = %merge_block127
+  %242 = load ptr, ptr %t115, align 8
+  %243 = call i1 @tokenizer_accept_string(ptr %242, ptr @125)
+  br i1 %243, label %then_block131, label %merge_block133
+
+then_block131:                                    ; preds = %merge_block130
+  %244 = load ptr, ptr %to121, align 8
+  %type132 = getelementptr %token.2, ptr %244, i32 0, i32 0
+  %245 = load i64, ptr @TOKEN_IF.7, align 4
+  store i64 %245, ptr %type132, align 4
+  %246 = load ptr, ptr %to121, align 8
+  ret ptr %246
+
+merge_block133:                                   ; preds = %merge_block130
+  %247 = load ptr, ptr %t115, align 8
+  %248 = call i1 @tokenizer_accept_string(ptr %247, ptr @126)
+  br i1 %248, label %then_block134, label %merge_block136
+
+then_block134:                                    ; preds = %merge_block133
+  %249 = load ptr, ptr %to121, align 8
+  %type135 = getelementptr %token.2, ptr %249, i32 0, i32 0
+  %250 = load i64, ptr @TOKEN_WHILE.8, align 4
+  store i64 %250, ptr %type135, align 4
+  %251 = load ptr, ptr %to121, align 8
+  ret ptr %251
+
+merge_block136:                                   ; preds = %merge_block133
+  %252 = load ptr, ptr %t115, align 8
+  %253 = call i1 @tokenizer_accept_string(ptr %252, ptr @127)
+  br i1 %253, label %then_block137, label %merge_block139
+
+then_block137:                                    ; preds = %merge_block136
+  %254 = load ptr, ptr %to121, align 8
+  %type138 = getelementptr %token.2, ptr %254, i32 0, i32 0
+  %255 = load i64, ptr @TOKEN_RETURN.9, align 4
+  store i64 %255, ptr %type138, align 4
+  %256 = load ptr, ptr %to121, align 8
+  ret ptr %256
+
+merge_block139:                                   ; preds = %merge_block136
+  %257 = load ptr, ptr %t115, align 8
+  %258 = call i1 @tokenizer_accept_string(ptr %257, ptr @128)
+  br i1 %258, label %then_block140, label %merge_block142
+
+then_block140:                                    ; preds = %merge_block139
+  %259 = load ptr, ptr %to121, align 8
+  %type141 = getelementptr %token.2, ptr %259, i32 0, i32 0
+  %260 = load i64, ptr @TOKEN_BREAK.10, align 4
+  store i64 %260, ptr %type141, align 4
+  %261 = load ptr, ptr %to121, align 8
+  ret ptr %261
+
+merge_block142:                                   ; preds = %merge_block139
+  %262 = load ptr, ptr %t115, align 8
+  %263 = call i1 @tokenizer_accept_string(ptr %262, ptr @129)
+  br i1 %263, label %then_block143, label %merge_block145
+
+then_block143:                                    ; preds = %merge_block142
+  %264 = load ptr, ptr %to121, align 8
+  %type144 = getelementptr %token.2, ptr %264, i32 0, i32 0
+  %265 = load i64, ptr @TOKEN_CONTINUE.11, align 4
+  store i64 %265, ptr %type144, align 4
+  %266 = load ptr, ptr %to121, align 8
+  ret ptr %266
+
+merge_block145:                                   ; preds = %merge_block142
+  %267 = load ptr, ptr %t115, align 8
+  %268 = call i1 @tokenizer_accept_string(ptr %267, ptr @130)
+  br i1 %268, label %then_block146, label %merge_block151
+
+then_block146:                                    ; preds = %merge_block145
+  %269 = load ptr, ptr %to121, align 8
+  %type147 = getelementptr %token.2, ptr %269, i32 0, i32 0
+  %270 = load i64, ptr @TOKEN_BOOLEAN.17, align 4
+  store i64 %270, ptr %type147, align 4
+  %271 = load ptr, ptr %t115, align 8
+  %arena148 = getelementptr %tokenizer.3, ptr %271, i32 0, i32 3
+  %272 = load ptr, ptr %arena148, align 8
+  %273 = call ptr @arena_alloc(ptr %272, i64 1)
+  %data149 = alloca ptr, align 8
+  store ptr %273, ptr %data149, align 8
+  %274 = load ptr, ptr %data149, align 8
+  store i1 true, ptr %274, align 1
+  %275 = load ptr, ptr %to121, align 8
+  %data150 = getelementptr %token.2, ptr %275, i32 0, i32 1
+  %276 = load ptr, ptr %data149, align 8
+  store ptr %276, ptr %data150, align 8
+  %277 = load ptr, ptr %to121, align 8
+  ret ptr %277
+
+merge_block151:                                   ; preds = %merge_block145
+  %278 = load ptr, ptr %t115, align 8
+  %279 = call i1 @tokenizer_accept_string(ptr %278, ptr @131)
+  br i1 %279, label %then_block152, label %merge_block157
+
+then_block152:                                    ; preds = %merge_block151
+  %280 = load ptr, ptr %to121, align 8
+  %type153 = getelementptr %token.2, ptr %280, i32 0, i32 0
+  %281 = load i64, ptr @TOKEN_BOOLEAN.17, align 4
+  store i64 %281, ptr %type153, align 4
+  %282 = load ptr, ptr %t115, align 8
+  %arena154 = getelementptr %tokenizer.3, ptr %282, i32 0, i32 3
+  %283 = load ptr, ptr %arena154, align 8
+  %284 = call ptr @arena_alloc(ptr %283, i64 1)
+  %data155 = alloca ptr, align 8
+  store ptr %284, ptr %data155, align 8
+  %285 = load ptr, ptr %data155, align 8
+  store i1 false, ptr %285, align 1
+  %286 = load ptr, ptr %to121, align 8
+  %data156 = getelementptr %token.2, ptr %286, i32 0, i32 1
+  %287 = load ptr, ptr %data155, align 8
+  store ptr %287, ptr %data156, align 8
+  %288 = load ptr, ptr %to121, align 8
+  ret ptr %288
+
+merge_block157:                                   ; preds = %merge_block151
+  %289 = load ptr, ptr %t115, align 8
+  %290 = call i1 @tokenizer_accept_string(ptr %289, ptr @132)
+  br i1 %290, label %then_block158, label %merge_block160
+
+then_block158:                                    ; preds = %merge_block157
+  %291 = load ptr, ptr %to121, align 8
+  %type159 = getelementptr %token.2, ptr %291, i32 0, i32 0
+  %292 = load i64, ptr @TOKEN_NULL.18, align 4
+  store i64 %292, ptr %type159, align 4
+  %293 = load ptr, ptr %to121, align 8
+  ret ptr %293
+
+merge_block160:                                   ; preds = %merge_block157
+  %294 = load ptr, ptr %t115, align 8
+  %295 = call i1 @tokenizer_accept_string(ptr %294, ptr @133)
+  br i1 %295, label %then_block161, label %merge_block163
+
+then_block161:                                    ; preds = %merge_block160
+  %296 = load ptr, ptr %to121, align 8
+  %type162 = getelementptr %token.2, ptr %296, i32 0, i32 0
+  %297 = load i64, ptr @TOKEN_STRUCT.13, align 4
+  store i64 %297, ptr %type162, align 4
+  %298 = load ptr, ptr %to121, align 8
+  ret ptr %298
+
+merge_block163:                                   ; preds = %merge_block160
+  %299 = load ptr, ptr %t115, align 8
+  %300 = call i1 @tokenizer_accept_string(ptr %299, ptr @134)
+  br i1 %300, label %then_block164, label %merge_block166
+
+then_block164:                                    ; preds = %merge_block163
+  %301 = load ptr, ptr %to121, align 8
+  %type165 = getelementptr %token.2, ptr %301, i32 0, i32 0
+  %302 = load i64, ptr @TOKEN_TYPE.14, align 4
+  store i64 %302, ptr %type165, align 4
+  %303 = load ptr, ptr %to121, align 8
+  ret ptr %303
+
+merge_block166:                                   ; preds = %merge_block163
+  %304 = load ptr, ptr %t115, align 8
+  %305 = call i1 @tokenizer_accept_string(ptr %304, ptr @135)
+  br i1 %305, label %then_block167, label %merge_block169
+
+then_block167:                                    ; preds = %merge_block166
+  %306 = load ptr, ptr %to121, align 8
+  %type168 = getelementptr %token.2, ptr %306, i32 0, i32 0
+  %307 = load i64, ptr @TOKEN_ARROW.12, align 4
+  store i64 %307, ptr %type168, align 4
+  %308 = load ptr, ptr %to121, align 8
+  ret ptr %308
+
+merge_block169:                                   ; preds = %merge_block166
+  %309 = load ptr, ptr %t115, align 8
+  %310 = call i1 @tokenizer_accept_string(ptr %309, ptr @136)
+  br i1 %310, label %then_block170, label %merge_block172
+
+then_block170:                                    ; preds = %merge_block169
+  %311 = load ptr, ptr %to121, align 8
+  %type171 = getelementptr %token.2, ptr %311, i32 0, i32 0
+  %312 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  store i64 %312, ptr %type171, align 4
+  %313 = load ptr, ptr %to121, align 8
+  ret ptr %313
+
+merge_block172:                                   ; preds = %merge_block169
+  %314 = load ptr, ptr %t115, align 8
+  %315 = call i1 @tokenizer_accept_string(ptr %314, ptr @137)
+  br i1 %315, label %then_block173, label %merge_block175
+
+then_block173:                                    ; preds = %merge_block172
+  %316 = load ptr, ptr %to121, align 8
+  %type174 = getelementptr %token.2, ptr %316, i32 0, i32 0
+  %317 = load i64, ptr @TOKEN_COMMA.32, align 4
+  store i64 %317, ptr %type174, align 4
+  %318 = load ptr, ptr %to121, align 8
+  ret ptr %318
+
+merge_block175:                                   ; preds = %merge_block172
+  %319 = load ptr, ptr %t115, align 8
+  %320 = call i1 @tokenizer_accept_string(ptr %319, ptr @138)
+  br i1 %320, label %then_block176, label %merge_block178
+
+then_block176:                                    ; preds = %merge_block175
+  %321 = load ptr, ptr %to121, align 8
+  %type177 = getelementptr %token.2, ptr %321, i32 0, i32 0
+  %322 = load i64, ptr @TOKEN_COLON.33, align 4
+  store i64 %322, ptr %type177, align 4
+  %323 = load ptr, ptr %to121, align 8
+  ret ptr %323
+
+merge_block178:                                   ; preds = %merge_block175
+  %324 = load ptr, ptr %t115, align 8
+  %325 = call i1 @tokenizer_accept_string(ptr %324, ptr @139)
+  br i1 %325, label %then_block179, label %merge_block181
+
+then_block179:                                    ; preds = %merge_block178
+  %326 = load ptr, ptr %to121, align 8
+  %type180 = getelementptr %token.2, ptr %326, i32 0, i32 0
+  %327 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  store i64 %327, ptr %type180, align 4
+  %328 = load ptr, ptr %to121, align 8
+  ret ptr %328
+
+merge_block181:                                   ; preds = %merge_block178
+  %329 = load ptr, ptr %t115, align 8
+  %330 = call i1 @tokenizer_accept_string(ptr %329, ptr @140)
+  br i1 %330, label %then_block182, label %merge_block184
+
+then_block182:                                    ; preds = %merge_block181
+  %331 = load ptr, ptr %to121, align 8
+  %type183 = getelementptr %token.2, ptr %331, i32 0, i32 0
+  %332 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  store i64 %332, ptr %type183, align 4
+  %333 = load ptr, ptr %to121, align 8
+  ret ptr %333
+
+merge_block184:                                   ; preds = %merge_block181
+  %334 = load ptr, ptr %t115, align 8
+  %335 = call i1 @tokenizer_accept_string(ptr %334, ptr @141)
+  br i1 %335, label %then_block185, label %merge_block187
+
+then_block185:                                    ; preds = %merge_block184
+  %336 = load ptr, ptr %to121, align 8
+  %type186 = getelementptr %token.2, ptr %336, i32 0, i32 0
+  %337 = load i64, ptr @TOKEN_LBRACE.36, align 4
+  store i64 %337, ptr %type186, align 4
+  %338 = load ptr, ptr %to121, align 8
+  ret ptr %338
+
+merge_block187:                                   ; preds = %merge_block184
+  %339 = load ptr, ptr %t115, align 8
+  %340 = call i1 @tokenizer_accept_string(ptr %339, ptr @142)
+  br i1 %340, label %then_block188, label %merge_block190
+
+then_block188:                                    ; preds = %merge_block187
+  %341 = load ptr, ptr %to121, align 8
+  %type189 = getelementptr %token.2, ptr %341, i32 0, i32 0
+  %342 = load i64, ptr @TOKEN_RBRACE.37, align 4
+  store i64 %342, ptr %type189, align 4
+  %343 = load ptr, ptr %to121, align 8
+  ret ptr %343
+
+merge_block190:                                   ; preds = %merge_block187
+  %344 = load ptr, ptr %t115, align 8
+  %345 = call i1 @tokenizer_accept_string(ptr %344, ptr @143)
+  br i1 %345, label %then_block191, label %merge_block193
+
+then_block191:                                    ; preds = %merge_block190
+  %346 = load ptr, ptr %to121, align 8
+  %type192 = getelementptr %token.2, ptr %346, i32 0, i32 0
+  %347 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  store i64 %347, ptr %type192, align 4
+  %348 = load ptr, ptr %to121, align 8
+  ret ptr %348
+
+merge_block193:                                   ; preds = %merge_block190
+  %349 = load ptr, ptr %t115, align 8
+  %350 = call i1 @tokenizer_accept_string(ptr %349, ptr @144)
+  br i1 %350, label %then_block194, label %merge_block196
+
+then_block194:                                    ; preds = %merge_block193
+  %351 = load ptr, ptr %to121, align 8
+  %type195 = getelementptr %token.2, ptr %351, i32 0, i32 0
+  %352 = load i64, ptr @TOKEN_PLUS.22, align 4
+  store i64 %352, ptr %type195, align 4
+  %353 = load ptr, ptr %to121, align 8
+  ret ptr %353
+
+merge_block196:                                   ; preds = %merge_block193
+  %354 = load ptr, ptr %t115, align 8
+  %355 = call i1 @tokenizer_accept_string(ptr %354, ptr @145)
+  br i1 %355, label %then_block197, label %merge_block199
+
+then_block197:                                    ; preds = %merge_block196
+  %356 = load ptr, ptr %to121, align 8
+  %type198 = getelementptr %token.2, ptr %356, i32 0, i32 0
+  %357 = load i64, ptr @TOKEN_MINUS.23, align 4
+  store i64 %357, ptr %type198, align 4
+  %358 = load ptr, ptr %to121, align 8
+  ret ptr %358
+
+merge_block199:                                   ; preds = %merge_block196
+  %359 = load ptr, ptr %t115, align 8
+  %360 = call i1 @tokenizer_accept_string(ptr %359, ptr @146)
+  br i1 %360, label %then_block200, label %merge_block202
+
+then_block200:                                    ; preds = %merge_block199
+  %361 = load ptr, ptr %to121, align 8
+  %type201 = getelementptr %token.2, ptr %361, i32 0, i32 0
+  %362 = load i64, ptr @TOKEN_MUL.24, align 4
+  store i64 %362, ptr %type201, align 4
+  %363 = load ptr, ptr %to121, align 8
+  ret ptr %363
+
+merge_block202:                                   ; preds = %merge_block199
+  %364 = load ptr, ptr %t115, align 8
+  %365 = call i1 @tokenizer_accept_string(ptr %364, ptr @147)
+  br i1 %365, label %then_block203, label %merge_block205
+
+then_block203:                                    ; preds = %merge_block202
+  %366 = load ptr, ptr %to121, align 8
+  %type204 = getelementptr %token.2, ptr %366, i32 0, i32 0
+  %367 = load i64, ptr @TOKEN_DIV.25, align 4
+  store i64 %367, ptr %type204, align 4
+  %368 = load ptr, ptr %to121, align 8
+  ret ptr %368
+
+merge_block205:                                   ; preds = %merge_block202
+  %369 = load ptr, ptr %t115, align 8
+  %370 = call i1 @tokenizer_accept_string(ptr %369, ptr @148)
+  br i1 %370, label %then_block206, label %merge_block208
+
+then_block206:                                    ; preds = %merge_block205
+  %371 = load ptr, ptr %to121, align 8
+  %type207 = getelementptr %token.2, ptr %371, i32 0, i32 0
+  %372 = load i64, ptr @TOKEN_MOD.26, align 4
+  store i64 %372, ptr %type207, align 4
+  %373 = load ptr, ptr %to121, align 8
+  ret ptr %373
+
+merge_block208:                                   ; preds = %merge_block205
+  %374 = load ptr, ptr %t115, align 8
+  %375 = call i1 @tokenizer_accept_string(ptr %374, ptr @149)
+  br i1 %375, label %then_block209, label %merge_block211
+
+then_block209:                                    ; preds = %merge_block208
+  %376 = load ptr, ptr %to121, align 8
+  %type210 = getelementptr %token.2, ptr %376, i32 0, i32 0
+  %377 = load i64, ptr @TOKEN_BANG.27, align 4
+  store i64 %377, ptr %type210, align 4
+  %378 = load ptr, ptr %to121, align 8
+  ret ptr %378
+
+merge_block211:                                   ; preds = %merge_block208
+  %379 = load ptr, ptr %t115, align 8
+  %380 = call i1 @tokenizer_accept_string(ptr %379, ptr @150)
+  br i1 %380, label %then_block212, label %merge_block214
+
+then_block212:                                    ; preds = %merge_block211
+  %381 = load ptr, ptr %to121, align 8
+  %type213 = getelementptr %token.2, ptr %381, i32 0, i32 0
+  %382 = load i64, ptr @TOKEN_LESS.28, align 4
+  store i64 %382, ptr %type213, align 4
+  %383 = load ptr, ptr %to121, align 8
+  ret ptr %383
+
+merge_block214:                                   ; preds = %merge_block211
+  %384 = load ptr, ptr %t115, align 8
+  %385 = call i1 @tokenizer_accept_string(ptr %384, ptr @151)
+  br i1 %385, label %then_block215, label %merge_block217
+
+then_block215:                                    ; preds = %merge_block214
+  %386 = load ptr, ptr %to121, align 8
+  %type216 = getelementptr %token.2, ptr %386, i32 0, i32 0
+  %387 = load i64, ptr @TOKEN_GREATER.29, align 4
+  store i64 %387, ptr %type216, align 4
+  %388 = load ptr, ptr %to121, align 8
+  ret ptr %388
+
+merge_block217:                                   ; preds = %merge_block214
+  %389 = load ptr, ptr %t115, align 8
+  %390 = call i1 @tokenizer_accept_string(ptr %389, ptr @152)
+  br i1 %390, label %then_block218, label %merge_block220
+
+then_block218:                                    ; preds = %merge_block217
+  %391 = load ptr, ptr %to121, align 8
+  %type219 = getelementptr %token.2, ptr %391, i32 0, i32 0
+  %392 = load i64, ptr @TOKEN_DOT.30, align 4
+  store i64 %392, ptr %type219, align 4
+  %393 = load ptr, ptr %to121, align 8
+  ret ptr %393
+
+merge_block220:                                   ; preds = %merge_block217
+  %394 = load ptr, ptr %t115, align 8
+  %395 = call ptr @tokenizer_accept_int_type(ptr %394)
+  %maybe_int221 = alloca ptr, align 8
+  store ptr %395, ptr %maybe_int221, align 8
+  %396 = load ptr, ptr %maybe_int221, align 8
+  %397 = icmp ne ptr %396, null
+  br i1 %397, label %then_block222, label %merge_block225
+
+then_block222:                                    ; preds = %merge_block220
+  %398 = load ptr, ptr %to121, align 8
+  %type223 = getelementptr %token.2, ptr %398, i32 0, i32 0
+  %399 = load i64, ptr @TOKEN_NUMBER.16, align 4
+  store i64 %399, ptr %type223, align 4
+  %400 = load ptr, ptr %to121, align 8
+  %data224 = getelementptr %token.2, ptr %400, i32 0, i32 1
+  %401 = load ptr, ptr %maybe_int221, align 8
+  store ptr %401, ptr %data224, align 8
+  %402 = load ptr, ptr %to121, align 8
+  ret ptr %402
+
+merge_block225:                                   ; preds = %merge_block220
+  %403 = load ptr, ptr %t115, align 8
+  %404 = call ptr @tokenizer_accept_char_type(ptr %403)
+  %maybe_char226 = alloca ptr, align 8
+  store ptr %404, ptr %maybe_char226, align 8
+  %405 = load ptr, ptr %maybe_char226, align 8
+  %406 = icmp ne ptr %405, null
+  br i1 %406, label %then_block227, label %merge_block230
+
+then_block227:                                    ; preds = %merge_block225
+  %407 = load ptr, ptr %to121, align 8
+  %type228 = getelementptr %token.2, ptr %407, i32 0, i32 0
+  %408 = load i64, ptr @TOKEN_CHAR.19, align 4
+  store i64 %408, ptr %type228, align 4
+  %409 = load ptr, ptr %to121, align 8
+  %data229 = getelementptr %token.2, ptr %409, i32 0, i32 1
+  %410 = load ptr, ptr %maybe_char226, align 8
+  store ptr %410, ptr %data229, align 8
+  %411 = load ptr, ptr %to121, align 8
+  ret ptr %411
+
+merge_block230:                                   ; preds = %merge_block225
+  %412 = load ptr, ptr %t115, align 8
+  %413 = call ptr @tokenizer_accept_string_type(ptr %412)
+  %maybe_string231 = alloca ptr, align 8
+  store ptr %413, ptr %maybe_string231, align 8
+  %414 = load ptr, ptr %maybe_string231, align 8
+  %415 = icmp ne ptr %414, null
+  br i1 %415, label %then_block232, label %merge_block235
+
+then_block232:                                    ; preds = %merge_block230
+  %416 = load ptr, ptr %to121, align 8
+  %type233 = getelementptr %token.2, ptr %416, i32 0, i32 0
+  %417 = load i64, ptr @TOKEN_STRING.20, align 4
+  store i64 %417, ptr %type233, align 4
+  %418 = load ptr, ptr %to121, align 8
+  %data234 = getelementptr %token.2, ptr %418, i32 0, i32 1
+  %419 = load ptr, ptr %maybe_string231, align 8
+  store ptr %419, ptr %data234, align 8
+  %420 = load ptr, ptr %to121, align 8
+  ret ptr %420
+
+merge_block235:                                   ; preds = %merge_block230
+  %421 = load ptr, ptr %t115, align 8
+  %422 = call ptr @tokenizer_consume_until_condition(ptr %421, ptr @unnamed_func.41)
+  %string236 = alloca ptr, align 8
+  store ptr %422, ptr %string236, align 8
+  %423 = load ptr, ptr %string236, align 8
+  %424 = call i64 @strlen(ptr %423)
+  %425 = icmp eq i64 %424, 0
+  br i1 %425, label %then_block237, label %merge_block238
+
+then_block237:                                    ; preds = %merge_block235
+  call void (ptr, ...) @printf(ptr @153)
+  ret ptr null
+
+merge_block238:                                   ; preds = %merge_block235
+  %426 = load ptr, ptr %to121, align 8
+  %type239 = getelementptr %token.2, ptr %426, i32 0, i32 0
+  %427 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  store i64 %427, ptr %type239, align 4
+  %428 = load ptr, ptr %to121, align 8
+  %data240 = getelementptr %token.2, ptr %428, i32 0, i32 1
+  %429 = load ptr, ptr %string236, align 8
+  store ptr %429, ptr %data240, align 8
+  %430 = load ptr, ptr %to121, align 8
+  ret ptr %430
+}
+
+define i1 @unnamed_func.3(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = call i1 @isalphanum(i8 %1)
+  br i1 %2, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret i1 false
+
+merge_block:                                      ; preds = %entrypoint
+  %3 = load i8, ptr %c, align 1
+  %4 = icmp eq i8 %3, 95
+  br i1 %4, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret i1 false
+
+merge_block2:                                     ; preds = %merge_block
+  ret i1 true
+}
+
+define ptr @tokenizer_init(ptr %0, %slice %1) {
+entrypoint:
+  %alloc = alloca ptr, align 8
+  store ptr %0, ptr %alloc, align 8
+  %file = alloca %slice, align 8
+  store %slice %1, ptr %file, align 8
+  %2 = load ptr, ptr %alloc, align 8
+  %3 = call ptr @arena_alloc(ptr %2, i64 32)
+  %t = alloca ptr, align 8
+  store ptr %3, ptr %t, align 8
+  %4 = load ptr, ptr %t, align 8
+  %arena = getelementptr %tokenizer, ptr %4, i32 0, i32 3
+  %5 = load ptr, ptr %alloc, align 8
+  store ptr %5, ptr %arena, align 8
+  %6 = load ptr, ptr %t, align 8
+  %offset = getelementptr %tokenizer, ptr %6, i32 0, i32 2
+  store i64 0, ptr %offset, align 4
+  %7 = load ptr, ptr %t, align 8
+  %buf = getelementptr %tokenizer, ptr %7, i32 0, i32 0
+  %data = getelementptr %slice, ptr %file, i32 0, i32 0
+  %8 = load ptr, ptr %data, align 8
+  store ptr %8, ptr %buf, align 8
+  %9 = load ptr, ptr %t, align 8
+  %buf_len = getelementptr %tokenizer, ptr %9, i32 0, i32 1
+  %data_len = getelementptr %slice, ptr %file, i32 0, i32 1
+  %10 = load i64, ptr %data_len, align 4
+  store i64 %10, ptr %buf_len, align 4
+  %11 = load ptr, ptr %t, align 8
+  %buf_len1 = getelementptr %tokenizer, ptr %11, i32 0, i32 1
+  %12 = load i64, ptr %buf_len1, align 4
+  call void (ptr, ...) @printf(ptr @76, i64 %12)
+  %13 = load ptr, ptr %t, align 8
+  %buf2 = getelementptr %tokenizer, ptr %13, i32 0, i32 0
+  %14 = load ptr, ptr %buf2, align 8
+  call void (ptr, ...) @printf(ptr @77, ptr %14)
+  %15 = load ptr, ptr %t, align 8
+  ret ptr %15
+
+entrypoint3:                                      ; No predecessors!
+  %alloc4 = alloca ptr, align 8
+  store ptr %0, ptr %alloc4, align 8
+  %file5 = alloca %slice, align 8
+  store %slice %1, ptr %file5, align 8
+  %16 = load ptr, ptr %alloc4, align 8
+  %17 = call ptr @arena_alloc(ptr %16, i64 32)
+  %t6 = alloca ptr, align 8
+  store ptr %17, ptr %t6, align 8
+  %18 = load ptr, ptr %t6, align 8
+  %arena7 = getelementptr %tokenizer.3, ptr %18, i32 0, i32 3
+  %19 = load ptr, ptr %alloc4, align 8
+  store ptr %19, ptr %arena7, align 8
+  %20 = load ptr, ptr %t6, align 8
+  %offset8 = getelementptr %tokenizer.3, ptr %20, i32 0, i32 2
+  store i64 0, ptr %offset8, align 4
+  %21 = load ptr, ptr %t6, align 8
+  %buf9 = getelementptr %tokenizer.3, ptr %21, i32 0, i32 0
+  %data10 = getelementptr %slice, ptr %file5, i32 0, i32 0
+  %22 = load ptr, ptr %data10, align 8
+  store ptr %22, ptr %buf9, align 8
+  %23 = load ptr, ptr %t6, align 8
+  %buf_len11 = getelementptr %tokenizer.3, ptr %23, i32 0, i32 1
+  %data_len12 = getelementptr %slice, ptr %file5, i32 0, i32 1
+  %24 = load i64, ptr %data_len12, align 4
+  store i64 %24, ptr %buf_len11, align 4
+  %25 = load ptr, ptr %t6, align 8
+  %buf_len13 = getelementptr %tokenizer.3, ptr %25, i32 0, i32 1
+  %26 = load i64, ptr %buf_len13, align 4
+  call void (ptr, ...) @printf(ptr @154, i64 %26)
+  %27 = load ptr, ptr %t6, align 8
+  %buf14 = getelementptr %tokenizer.3, ptr %27, i32 0, i32 0
+  %28 = load ptr, ptr %buf14, align 8
+  call void (ptr, ...) @printf(ptr @155, ptr %28)
+  %29 = load ptr, ptr %t6, align 8
+  ret ptr %29
+}
+
+define %slice @tokenizer_tokenize(ptr %0) {
+entrypoint:
+  %t = alloca ptr, align 8
+  store ptr %0, ptr %t, align 8
+  %1 = load ptr, ptr %t, align 8
+  %arena = getelementptr %tokenizer, ptr %1, i32 0, i32 3
+  %2 = load ptr, ptr %arena, align 8
+  %3 = call ptr @arena_alloc(ptr %2, i64 640000)
+  %tokens = alloca ptr, align 8
+  store ptr %3, ptr %tokens, align 8
+  %tokens_len = alloca i64, align 8
+  store i64 0, ptr %tokens_len, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block, %entrypoint
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %4 = load ptr, ptr %t, align 8
+  %5 = call ptr @tokenizer_next(ptr %4)
+  %tk = alloca ptr, align 8
+  store ptr %5, ptr %tk, align 8
+  %6 = load ptr, ptr %tk, align 8
+  %7 = icmp eq ptr %6, null
+  br i1 %7, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %then_block, %while_block
+  %8 = load i64, ptr %tokens_len, align 4
+  call void (ptr, ...) @printf(ptr @79, i64 %8)
+  %9 = load ptr, ptr %tokens, align 8
+  %10 = load i64, ptr %tokens_len, align 4
+  %11 = call i64 @print_tokens(ptr %9, i64 %10)
+  %res = alloca %slice, align 8
+  %data = getelementptr %slice, ptr %res, i32 0, i32 0
+  %12 = load ptr, ptr %tokens, align 8
+  store ptr %12, ptr %data, align 8
+  %data_len = getelementptr %slice, ptr %res, i32 0, i32 1
+  %13 = load i64, ptr %tokens_len, align 4
+  store i64 %13, ptr %data_len, align 4
+  %14 = load %slice, ptr %res, align 8
+  ret %slice %14
+
+then_block:                                       ; preds = %inner_block
+  br label %outer_block
+
+merge_block:                                      ; preds = %inner_block
+  %15 = load ptr, ptr %tk, align 8
+  %type = getelementptr %token, ptr %15, i32 0, i32 0
+  %16 = load i64, ptr %type, align 4
+  call void (ptr, ...) @printf(ptr @78, i64 %16)
+  %17 = load ptr, ptr %tokens, align 8
+  %18 = load i64, ptr %tokens_len, align 4
+  %19 = getelementptr %token, ptr %17, i64 %18
+  %20 = load ptr, ptr %tk, align 8
+  %21 = load %token, ptr %20, align 8
+  store %token %21, ptr %19, align 8
+  %22 = load i64, ptr %tokens_len, align 4
+  %23 = add i64 %22, 1
+  store i64 %23, ptr %tokens_len, align 4
+  br label %while_block
+
+entrypoint1:                                      ; No predecessors!
+  %t2 = alloca ptr, align 8
+  store ptr %0, ptr %t2, align 8
+  %24 = load ptr, ptr %t2, align 8
+  %arena3 = getelementptr %tokenizer.3, ptr %24, i32 0, i32 3
+  %25 = load ptr, ptr %arena3, align 8
+  %26 = call ptr @arena_alloc(ptr %25, i64 640000)
+  %tokens4 = alloca ptr, align 8
+  store ptr %26, ptr %tokens4, align 8
+  %tokens_len5 = alloca i64, align 8
+  store i64 0, ptr %tokens_len5, align 4
+  br label %while_block6
+
+while_block6:                                     ; preds = %merge_block11, %entrypoint1
+  br i1 true, label %inner_block7, label %outer_block8
+
+inner_block7:                                     ; preds = %while_block6
+  %27 = load ptr, ptr %t2, align 8
+  %28 = call ptr @tokenizer_next(ptr %27)
+  %tk9 = alloca ptr, align 8
+  store ptr %28, ptr %tk9, align 8
+  %29 = load ptr, ptr %tk9, align 8
+  %30 = icmp eq ptr %29, null
+  br i1 %30, label %then_block10, label %merge_block11
+
+outer_block8:                                     ; preds = %then_block10, %while_block6
+  %31 = load i64, ptr %tokens_len5, align 4
+  call void (ptr, ...) @printf(ptr @157, i64 %31)
+  %32 = load ptr, ptr %tokens4, align 8
+  %33 = load i64, ptr %tokens_len5, align 4
+  %34 = call i64 @print_tokens(ptr %32, i64 %33)
+  %res13 = alloca %slice, align 8
+  %data14 = getelementptr %slice, ptr %res13, i32 0, i32 0
+  %35 = load ptr, ptr %tokens4, align 8
+  store ptr %35, ptr %data14, align 8
+  %data_len15 = getelementptr %slice, ptr %res13, i32 0, i32 1
+  %36 = load i64, ptr %tokens_len5, align 4
+  store i64 %36, ptr %data_len15, align 4
+  %37 = load %slice, ptr %res13, align 8
+  ret %slice %37
+
+then_block10:                                     ; preds = %inner_block7
+  br label %outer_block8
+
+merge_block11:                                    ; preds = %inner_block7
+  %38 = load ptr, ptr %tk9, align 8
+  %type12 = getelementptr %token.2, ptr %38, i32 0, i32 0
+  %39 = load i64, ptr %type12, align 4
+  call void (ptr, ...) @printf(ptr @156, i64 %39)
+  %40 = load ptr, ptr %tokens4, align 8
+  %41 = load i64, ptr %tokens_len5, align 4
+  %42 = getelementptr %token.2, ptr %40, i64 %41
+  %43 = load ptr, ptr %tk9, align 8
+  %44 = load %token.2, ptr %43, align 8
+  store %token.2 %44, ptr %42, align 8
+  %45 = load i64, ptr %tokens_len5, align 4
+  %46 = add i64 %45, 1
+  store i64 %46, ptr %tokens_len5, align 4
+  br label %while_block6
+}
+
+define i1 @unnamed_func.38(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = call i1 @isdigit(i8 %1)
+  %3 = icmp eq i1 %2, false
+  ret i1 %3
+}
+
+define i1 @unnamed_func.39(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = icmp eq i8 %1, 39
+  ret i1 %2
+}
+
+define i1 @unnamed_func.40(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = icmp eq i8 %1, 34
+  ret i1 %2
+}
+
+define i1 @unnamed_func.41(i8 %0) {
+entrypoint:
+  %c = alloca i8, align 1
+  store i8 %0, ptr %c, align 1
+  %1 = load i8, ptr %c, align 1
+  %2 = call i1 @isalphanum(i8 %1)
+  br i1 %2, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret i1 false
+
+merge_block:                                      ; preds = %entrypoint
+  %3 = load i8, ptr %c, align 1
+  %4 = icmp eq i8 %3, 95
+  br i1 %4, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret i1 false
+
+merge_block2:                                     ; preds = %merge_block
+  ret i1 true
+}
+
+declare ptr @fopen(ptr, ptr)
+
+declare void @fgets(ptr, i64, ptr)
+
+declare i1 @feof(ptr)
+
+declare i64 @fseek(ptr, i64, i64)
+
+declare i64 @lseek(i64, i64, i64)
+
+declare i64 @ftell(ptr)
+
+declare i64 @fread(ptr, i64, i64, ptr)
+
+declare ptr @fclose(ptr)
+
+declare ptr @strcpy(ptr, ptr)
+
+declare ptr @dirname(ptr)
+
+declare i64 @open(ptr, i64)
+
+declare i64 @openat(i64, ptr, i64)
+
+declare i64 @read(i64, ptr, i64)
+
+declare ptr @realpath(ptr, ptr)
+
+declare i64 @snprintf(ptr, i64, ptr, ptr, ptr)
+
+define ptr @parser_parse_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_accept_parse(ptr %1, ptr @parser_parse_cast_statement)
+  %fn_call = alloca ptr, align 8
+  store ptr %2, ptr %fn_call, align 8
+  %3 = load ptr, ptr %fn_call, align 8
+  %4 = icmp ne ptr %3, null
+  br i1 %4, label %then_block, label %merge_block2
+
+then_block:                                       ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block
+
+then_block1:                                      ; preds = %then_block
+  ret ptr null
+
+merge_block:                                      ; preds = %then_block
+  %9 = load ptr, ptr %fn_call, align 8
+  ret ptr %9
+
+merge_block2:                                     ; preds = %entrypoint
+  %10 = load ptr, ptr %p, align 8
+  %11 = call ptr @parser_accept_parse(ptr %10, ptr @parser_parse_sizeof_statement)
+  %fn_call3 = alloca ptr, align 8
+  store ptr %11, ptr %fn_call3, align 8
+  %12 = load ptr, ptr %fn_call3, align 8
+  %13 = icmp ne ptr %12, null
+  br i1 %13, label %then_block4, label %merge_block7
+
+then_block4:                                      ; preds = %merge_block2
+  %14 = load ptr, ptr %p, align 8
+  %15 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %16 = call ptr @parser_accept_token(ptr %14, i64 %15)
+  %17 = icmp eq ptr %16, null
+  br i1 %17, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %then_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %then_block4
+  %18 = load ptr, ptr %fn_call3, align 8
+  ret ptr %18
+
+merge_block7:                                     ; preds = %merge_block2
+  %19 = load ptr, ptr %p, align 8
+  %20 = call ptr @parser_accept_parse(ptr %19, ptr @parse_function_call_statement)
+  %fn_call8 = alloca ptr, align 8
+  store ptr %20, ptr %fn_call8, align 8
+  %21 = load ptr, ptr %fn_call8, align 8
+  %22 = icmp ne ptr %21, null
+  br i1 %22, label %then_block9, label %merge_block12
+
+then_block9:                                      ; preds = %merge_block7
+  %23 = load ptr, ptr %p, align 8
+  %24 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %25 = call ptr @parser_accept_token(ptr %23, i64 %24)
+  %26 = icmp eq ptr %25, null
+  br i1 %26, label %then_block10, label %merge_block11
+
+then_block10:                                     ; preds = %then_block9
+  ret ptr null
+
+merge_block11:                                    ; preds = %then_block9
+  %27 = load ptr, ptr %fn_call8, align 8
+  ret ptr %27
+
+merge_block12:                                    ; preds = %merge_block7
+  %28 = load ptr, ptr %p, align 8
+  %29 = call ptr @parser_accept_parse(ptr %28, ptr @parse_assignment_statement)
+  %assignment = alloca ptr, align 8
+  store ptr %29, ptr %assignment, align 8
+  %30 = load ptr, ptr %assignment, align 8
+  %31 = icmp ne ptr %30, null
+  br i1 %31, label %then_block13, label %merge_block16
+
+then_block13:                                     ; preds = %merge_block12
+  %32 = load ptr, ptr %p, align 8
+  %33 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %34 = call ptr @parser_accept_token(ptr %32, i64 %33)
+  %35 = icmp eq ptr %34, null
+  br i1 %35, label %then_block14, label %merge_block15
+
+then_block14:                                     ; preds = %then_block13
+  ret ptr null
+
+merge_block15:                                    ; preds = %then_block13
+  %36 = load ptr, ptr %assignment, align 8
+  ret ptr %36
+
+merge_block16:                                    ; preds = %merge_block12
+  %37 = load ptr, ptr %p, align 8
+  %38 = call ptr @parser_accept_parse(ptr %37, ptr @parser_parse_return_statement)
+  %retu = alloca ptr, align 8
+  store ptr %38, ptr %retu, align 8
+  %39 = load ptr, ptr %retu, align 8
+  %40 = icmp ne ptr %39, null
+  br i1 %40, label %then_block17, label %merge_block20
+
+then_block17:                                     ; preds = %merge_block16
+  %41 = load ptr, ptr %p, align 8
+  %42 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %43 = call ptr @parser_accept_token(ptr %41, i64 %42)
+  %44 = icmp eq ptr %43, null
+  br i1 %44, label %then_block18, label %merge_block19
+
+then_block18:                                     ; preds = %then_block17
+  ret ptr null
+
+merge_block19:                                    ; preds = %then_block17
+  %45 = load ptr, ptr %retu, align 8
+  ret ptr %45
+
+merge_block20:                                    ; preds = %merge_block16
+  %46 = load ptr, ptr %p, align 8
+  %47 = call ptr @parser_accept_parse(ptr %46, ptr @parser_parse_import_declaration)
+  %retu21 = alloca ptr, align 8
+  store ptr %47, ptr %retu21, align 8
+  %48 = load ptr, ptr %retu21, align 8
+  %49 = icmp ne ptr %48, null
+  br i1 %49, label %then_block22, label %merge_block25
+
+then_block22:                                     ; preds = %merge_block20
+  %50 = load ptr, ptr %p, align 8
+  %51 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %52 = call ptr @parser_accept_token(ptr %50, i64 %51)
+  %53 = icmp eq ptr %52, null
+  br i1 %53, label %then_block23, label %merge_block24
+
+then_block23:                                     ; preds = %then_block22
+  ret ptr null
+
+merge_block24:                                    ; preds = %then_block22
+  %54 = load ptr, ptr %retu21, align 8
+  ret ptr %54
+
+merge_block25:                                    ; preds = %merge_block20
+  %55 = load ptr, ptr %p, align 8
+  %56 = call ptr @parser_accept_parse(ptr %55, ptr @parser_parse_extern_declaration)
+  %retu26 = alloca ptr, align 8
+  store ptr %56, ptr %retu26, align 8
+  %57 = load ptr, ptr %retu26, align 8
+  %58 = icmp ne ptr %57, null
+  br i1 %58, label %then_block27, label %merge_block30
+
+then_block27:                                     ; preds = %merge_block25
+  %59 = load ptr, ptr %p, align 8
+  %60 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %61 = call ptr @parser_accept_token(ptr %59, i64 %60)
+  %62 = icmp eq ptr %61, null
+  br i1 %62, label %then_block28, label %merge_block29
+
+then_block28:                                     ; preds = %then_block27
+  ret ptr null
+
+merge_block29:                                    ; preds = %then_block27
+  %63 = load ptr, ptr %retu26, align 8
+  ret ptr %63
+
+merge_block30:                                    ; preds = %merge_block25
+  %64 = load ptr, ptr %p, align 8
+  %65 = call ptr @parser_accept_parse(ptr %64, ptr @parser_parse_if_statement)
+  %retu31 = alloca ptr, align 8
+  store ptr %65, ptr %retu31, align 8
+  %66 = load ptr, ptr %retu31, align 8
+  %67 = icmp ne ptr %66, null
+  br i1 %67, label %then_block32, label %merge_block35
+
+then_block32:                                     ; preds = %merge_block30
+  %68 = load ptr, ptr %p, align 8
+  %69 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %70 = call ptr @parser_accept_token(ptr %68, i64 %69)
+  %71 = icmp eq ptr %70, null
+  br i1 %71, label %then_block33, label %merge_block34
+
+then_block33:                                     ; preds = %then_block32
+  ret ptr null
+
+merge_block34:                                    ; preds = %then_block32
+  %72 = load ptr, ptr %retu31, align 8
+  ret ptr %72
+
+merge_block35:                                    ; preds = %merge_block30
+  %73 = load ptr, ptr %p, align 8
+  %74 = call ptr @parser_accept_parse(ptr %73, ptr @parser_parse_while_statement)
+  %retu36 = alloca ptr, align 8
+  store ptr %74, ptr %retu36, align 8
+  %75 = load ptr, ptr %retu36, align 8
+  %76 = icmp ne ptr %75, null
+  br i1 %76, label %then_block37, label %merge_block40
+
+then_block37:                                     ; preds = %merge_block35
+  %77 = load ptr, ptr %p, align 8
+  %78 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %79 = call ptr @parser_accept_token(ptr %77, i64 %78)
+  %80 = icmp eq ptr %79, null
+  br i1 %80, label %then_block38, label %merge_block39
+
+then_block38:                                     ; preds = %then_block37
+  ret ptr null
+
+merge_block39:                                    ; preds = %then_block37
+  %81 = load ptr, ptr %retu36, align 8
+  ret ptr %81
+
+merge_block40:                                    ; preds = %merge_block35
+  %82 = load ptr, ptr %p, align 8
+  %83 = call ptr @parser_accept_parse(ptr %82, ptr @unnamed_func.47)
+  %retu41 = alloca ptr, align 8
+  store ptr %83, ptr %retu41, align 8
+  %84 = load ptr, ptr %retu41, align 8
+  %85 = icmp ne ptr %84, null
+  br i1 %85, label %then_block42, label %merge_block45
+
+then_block42:                                     ; preds = %merge_block40
+  %86 = load ptr, ptr %p, align 8
+  %87 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %88 = call ptr @parser_accept_token(ptr %86, i64 %87)
+  %89 = icmp eq ptr %88, null
+  br i1 %89, label %then_block43, label %merge_block44
+
+then_block43:                                     ; preds = %then_block42
+  ret ptr null
+
+merge_block44:                                    ; preds = %then_block42
+  %90 = load ptr, ptr %retu41, align 8
+  ret ptr %90
+
+merge_block45:                                    ; preds = %merge_block40
+  %91 = load ptr, ptr %p, align 8
+  %92 = call ptr @parser_accept_parse(ptr %91, ptr @unnamed_func.48)
+  %retu46 = alloca ptr, align 8
+  store ptr %92, ptr %retu46, align 8
+  %93 = load ptr, ptr %retu46, align 8
+  %94 = icmp ne ptr %93, null
+  br i1 %94, label %then_block47, label %merge_block50
+
+then_block47:                                     ; preds = %merge_block45
+  %95 = load ptr, ptr %p, align 8
+  %96 = load i64, ptr @TOKEN_SEMICOLON.31, align 4
+  %97 = call ptr @parser_accept_token(ptr %95, i64 %96)
+  %98 = icmp eq ptr %97, null
+  br i1 %98, label %then_block48, label %merge_block49
+
+then_block48:                                     ; preds = %then_block47
+  ret ptr null
+
+merge_block49:                                    ; preds = %then_block47
+  %99 = load ptr, ptr %retu46, align 8
+  ret ptr %99
+
+merge_block50:                                    ; preds = %merge_block45
+  call void (ptr, ...) @printf(ptr @165)
+  ret ptr null
+}
+
+define ptr @parser_parse_expression(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_accept_parse(ptr %1, ptr @parser_parse_equality_expression)
+  %ex = alloca ptr, align 8
+  store ptr %2, ptr %ex, align 8
+  %3 = load ptr, ptr %ex, align 8
+  %4 = icmp ne ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %5 = load ptr, ptr %ex, align 8
+  ret ptr %5
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %p, align 8
+  %7 = call ptr @parser_accept_parse(ptr %6, ptr @parser_parse_additive_expression)
+  %ax = alloca ptr, align 8
+  store ptr %7, ptr %ax, align 8
+  %8 = load ptr, ptr %ax, align 8
+  %9 = icmp ne ptr %8, null
+  br i1 %9, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  %10 = load ptr, ptr %ax, align 8
+  ret ptr %10
+
+merge_block2:                                     ; preds = %merge_block
+  ret ptr null
+}
+
+define ptr @parse_function_call_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %ident = alloca ptr, align 8
+  store ptr %3, ptr %ident, align 8
+  %4 = load ptr, ptr %p, align 8
+  %5 = call ptr @parser_accept_parse(ptr %4, ptr @parser_parse_function_definition)
+  %fn_def = alloca ptr, align 8
+  store ptr %5, ptr %fn_def, align 8
+  %6 = load ptr, ptr %ident, align 8
+  %7 = icmp eq ptr %6, null
+  br i1 %7, label %then_block, label %merge_block2
+
+then_block:                                       ; preds = %entrypoint
+  %8 = load ptr, ptr %fn_def, align 8
+  %9 = icmp eq ptr %8, null
+  br i1 %9, label %then_block1, label %merge_block
+
+then_block1:                                      ; preds = %then_block
+  ret ptr null
+
+merge_block:                                      ; preds = %then_block
+  br label %merge_block2
+
+merge_block2:                                     ; preds = %entrypoint, %merge_block
+  %10 = load ptr, ptr %p, align 8
+  %11 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  %12 = call ptr @parser_accept_token(ptr %10, i64 %11)
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %14 = load ptr, ptr %p, align 8
+  %15 = call ptr @parser_parse_function_arguments(ptr %14)
+  %arguments = alloca ptr, align 8
+  store ptr %15, ptr %arguments, align 8
+  %16 = load ptr, ptr %arguments, align 8
+  %17 = icmp eq ptr %16, null
+  br i1 %17, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %18 = load ptr, ptr %p, align 8
+  %19 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  %20 = call ptr @parser_accept_token(ptr %18, i64 %19)
+  %21 = icmp eq ptr %20, null
+  br i1 %21, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  ret ptr null
+
+merge_block8:                                     ; preds = %merge_block6
+  %22 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %22, i32 0, i32 3
+  %23 = load ptr, ptr %arena, align 8
+  %24 = call ptr @arena_alloc(ptr %23, i64 24)
+  %d = alloca ptr, align 8
+  store ptr %24, ptr %d, align 8
+  %25 = load ptr, ptr %d, align 8
+  %arguments9 = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %25, i32 0, i32 1
+  %26 = load ptr, ptr %arguments, align 8
+  %data = getelementptr %slice, ptr %26, i32 0, i32 0
+  %27 = load ptr, ptr %data, align 8
+  store ptr %27, ptr %arguments9, align 8
+  %28 = load ptr, ptr %d, align 8
+  %arguments_len = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %28, i32 0, i32 2
+  %29 = load ptr, ptr %arguments, align 8
+  %data_len = getelementptr %slice, ptr %29, i32 0, i32 1
+  %30 = load i64, ptr %data_len, align 4
+  store i64 %30, ptr %arguments_len, align 4
+  %31 = load ptr, ptr %fn_def, align 8
+  %32 = icmp ne ptr %31, null
+  br i1 %32, label %then_block10, label %merge_block11
+
+then_block10:                                     ; preds = %merge_block8
+  %33 = load ptr, ptr %d, align 8
+  %expression = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %33, i32 0, i32 0
+  %34 = load ptr, ptr %fn_def, align 8
+  store ptr %34, ptr %expression, align 8
+  br label %merge_block11
+
+merge_block11:                                    ; preds = %merge_block8, %then_block10
+  %35 = load ptr, ptr %fn_def, align 8
+  %36 = icmp eq ptr %35, null
+  br i1 %36, label %then_block12, label %merge_block19
+
+then_block12:                                     ; preds = %merge_block11
+  %37 = load ptr, ptr %p, align 8
+  %arena13 = getelementptr %parser, ptr %37, i32 0, i32 3
+  %38 = load ptr, ptr %arena13, align 8
+  %39 = call ptr @arena_alloc(ptr %38, i64 16)
+  %expression_data = alloca ptr, align 8
+  store ptr %39, ptr %expression_data, align 8
+  %40 = load ptr, ptr %expression_data, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %40, i32 0, i32 0
+  %41 = load ptr, ptr %ident, align 8
+  %data14 = getelementptr %token.2, ptr %41, i32 0, i32 1
+  %42 = load ptr, ptr %data14, align 8
+  store ptr %42, ptr %name, align 8
+  %43 = load ptr, ptr %p, align 8
+  %arena15 = getelementptr %parser, ptr %43, i32 0, i32 3
+  %44 = load ptr, ptr %arena15, align 8
+  %45 = call ptr @arena_alloc(ptr %44, i64 16)
+  %expression16 = alloca ptr, align 8
+  store ptr %45, ptr %expression16, align 8
+  %46 = load ptr, ptr %expression16, align 8
+  %type = getelementptr %Node, ptr %46, i32 0, i32 0
+  %47 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  store i64 %47, ptr %type, align 4
+  %48 = load ptr, ptr %expression16, align 8
+  %data17 = getelementptr %Node, ptr %48, i32 0, i32 1
+  %49 = load ptr, ptr %expression_data, align 8
+  store ptr %49, ptr %data17, align 8
+  %50 = load ptr, ptr %d, align 8
+  %expression18 = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %50, i32 0, i32 0
+  %51 = load ptr, ptr %expression16, align 8
+  store ptr %51, ptr %expression18, align 8
+  br label %merge_block19
+
+merge_block19:                                    ; preds = %merge_block11, %then_block12
+  %n = alloca %Node, align 8
+  %type20 = getelementptr %Node, ptr %n, i32 0, i32 0
+  %52 = load i64, ptr @NODE_FUNCTION_CALL_STATEMENT, align 4
+  store i64 %52, ptr %type20, align 4
+  %data21 = getelementptr %Node, ptr %n, i32 0, i32 1
+  %53 = load ptr, ptr %d, align 8
+  store ptr %53, ptr %data21, align 8
+  %54 = load ptr, ptr %p, align 8
+  %55 = load %Node, ptr %n, align 8
+  %56 = call ptr @create_node(ptr %54, %Node %55)
+  ret ptr %56
+}
+
+define ptr @parser_parse_additive_expression(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_parse_multiplicative_expression(ptr %1)
+  %lhs = alloca ptr, align 8
+  store ptr %2, ptr %lhs, align 8
+  %3 = load ptr, ptr %lhs, align 8
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block6, %merge_block
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %5 = load ptr, ptr %p, align 8
+  %6 = load i64, ptr @TOKEN_PLUS.22, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %plus = alloca ptr, align 8
+  store ptr %7, ptr %plus, align 8
+  %8 = load ptr, ptr %p, align 8
+  %9 = load i64, ptr @TOKEN_MINUS.23, align 4
+  %10 = call ptr @parser_accept_token(ptr %8, i64 %9)
+  %minus = alloca ptr, align 8
+  store ptr %10, ptr %minus, align 8
+  %11 = load ptr, ptr %plus, align 8
+  %12 = icmp eq ptr %11, null
+  br i1 %12, label %then_block1, label %merge_block4
+
+outer_block:                                      ; preds = %then_block2, %while_block
+  %13 = load ptr, ptr %lhs, align 8
+  ret ptr %13
+
+then_block1:                                      ; preds = %inner_block
+  %14 = load ptr, ptr %minus, align 8
+  %15 = icmp eq ptr %14, null
+  br i1 %15, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %then_block1
+  br label %outer_block
+
+merge_block3:                                     ; preds = %then_block1
+  br label %merge_block4
+
+merge_block4:                                     ; preds = %inner_block, %merge_block3
+  %16 = load ptr, ptr %p, align 8
+  %17 = call ptr @parser_parse_multiplicative_expression(ptr %16)
+  %rhs = alloca ptr, align 8
+  store ptr %17, ptr %rhs, align 8
+  %18 = load ptr, ptr %rhs, align 8
+  %19 = icmp eq ptr %18, null
+  br i1 %19, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %20 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %20, i32 0, i32 3
+  %21 = load ptr, ptr %arena, align 8
+  %22 = call ptr @arena_alloc(ptr %21, i64 24)
+  %new_lhs_data = alloca ptr, align 8
+  store ptr %22, ptr %new_lhs_data, align 8
+  %23 = load ptr, ptr %new_lhs_data, align 8
+  %addition = getelementptr %NODE_ADDITIVE_EXPRESSION_DATA, ptr %23, i32 0, i32 0
+  %24 = load ptr, ptr %plus, align 8
+  %25 = icmp ne ptr %24, null
+  store i1 %25, ptr %addition, align 1
+  %26 = load ptr, ptr %new_lhs_data, align 8
+  %lhs7 = getelementptr %NODE_ADDITIVE_EXPRESSION_DATA, ptr %26, i32 0, i32 1
+  %27 = load ptr, ptr %lhs, align 8
+  store ptr %27, ptr %lhs7, align 8
+  %28 = load ptr, ptr %new_lhs_data, align 8
+  %rhs8 = getelementptr %NODE_ADDITIVE_EXPRESSION_DATA, ptr %28, i32 0, i32 2
+  %29 = load ptr, ptr %rhs, align 8
+  store ptr %29, ptr %rhs8, align 8
+  %new_lhs = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %new_lhs, i32 0, i32 0
+  %30 = load i64, ptr @NODE_ADDITIVE_EXPRESSION, align 4
+  store i64 %30, ptr %type, align 4
+  %data = getelementptr %Node, ptr %new_lhs, i32 0, i32 1
+  %31 = load ptr, ptr %new_lhs_data, align 8
+  store ptr %31, ptr %data, align 8
+  %32 = load ptr, ptr %p, align 8
+  %33 = load %Node, ptr %new_lhs, align 8
+  %34 = call ptr @create_node(ptr %32, %Node %33)
+  store ptr %34, ptr %lhs, align 8
+  br label %while_block
+}
+
+define ptr @parser_init(ptr %0, i64 %1, ptr %2, ptr %3) {
+entrypoint:
+  %ts = alloca ptr, align 8
+  store ptr %0, ptr %ts, align 8
+  %ts_len = alloca i64, align 8
+  store i64 %1, ptr %ts_len, align 4
+  %ar = alloca ptr, align 8
+  store ptr %2, ptr %ar, align 8
+  %filename = alloca ptr, align 8
+  store ptr %3, ptr %filename, align 8
+  %4 = load ptr, ptr %ar, align 8
+  %5 = call ptr @arena_alloc(ptr %4, i64 40)
+  %p = alloca ptr, align 8
+  store ptr %5, ptr %p, align 8
+  %6 = load ptr, ptr %p, align 8
+  %tokens = getelementptr %parser, ptr %6, i32 0, i32 0
+  %7 = load ptr, ptr %ts, align 8
+  store ptr %7, ptr %tokens, align 8
+  %8 = load ptr, ptr %p, align 8
+  %tokens_len = getelementptr %parser, ptr %8, i32 0, i32 1
+  %9 = load i64, ptr %ts_len, align 4
+  store i64 %9, ptr %tokens_len, align 4
+  %10 = load ptr, ptr %p, align 8
+  %offset = getelementptr %parser, ptr %10, i32 0, i32 2
+  store i64 0, ptr %offset, align 4
+  %11 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %11, i32 0, i32 3
+  %12 = load ptr, ptr %ar, align 8
+  store ptr %12, ptr %arena, align 8
+  %13 = load ptr, ptr %p, align 8
+  %filename1 = getelementptr %parser, ptr %13, i32 0, i32 4
+  %14 = load ptr, ptr %filename, align 8
+  store ptr %14, ptr %filename1, align 8
+  %15 = load ptr, ptr %p, align 8
+  ret ptr %15
+}
+
+define ptr @create_node(ptr %0, %Node %1) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %n = alloca %Node, align 8
+  store %Node %1, ptr %n, align 8
+  %2 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %2, i32 0, i32 3
+  %3 = load ptr, ptr %arena, align 8
+  %4 = call ptr @arena_alloc(ptr %3, i64 16)
+  %res = alloca ptr, align 8
+  store ptr %4, ptr %res, align 8
+  %5 = load %Node, ptr %n, align 8
+  %6 = load ptr, ptr %res, align 8
+  store %Node %5, ptr %6, align 8
+  %7 = load ptr, ptr %res, align 8
+  ret ptr %7
+
+entrypoint1:                                      ; No predecessors!
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %n2 = alloca %Node, align 8
+  store %Node %1, ptr %n2, align 8
+  %8 = load ptr, ptr %c, align 8
+  %arena3 = getelementptr %codegen, ptr %8, i32 0, i32 3
+  %9 = load ptr, ptr %arena3, align 8
+  %10 = call ptr @arena_alloc(ptr %9, i64 16)
+  %res4 = alloca ptr, align 8
+  store ptr %10, ptr %res4, align 8
+  %11 = load %Node, ptr %n2, align 8
+  %12 = load ptr, ptr %res4, align 8
+  store %Node %11, ptr %12, align 8
+  %13 = load ptr, ptr %res4, align 8
+  ret ptr %13
+}
+
+define ptr @parser_peek_token(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %offset = getelementptr %parser, ptr %1, i32 0, i32 2
+  %2 = load i64, ptr %offset, align 4
+  %3 = load ptr, ptr %p, align 8
+  %tokens_len = getelementptr %parser, ptr %3, i32 0, i32 1
+  %4 = load i64, ptr %tokens_len, align 4
+  %5 = icmp sge i64 %2, %4
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %p, align 8
+  %tokens = getelementptr %parser, ptr %6, i32 0, i32 0
+  %7 = load ptr, ptr %tokens, align 8
+  %8 = load ptr, ptr %p, align 8
+  %offset1 = getelementptr %parser, ptr %8, i32 0, i32 2
+  %9 = load i64, ptr %offset1, align 4
+  %10 = getelementptr %token.2, ptr %7, i64 %9
+  ret ptr %10
+}
+
+define ptr @parser_consume_token(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %offset = getelementptr %parser, ptr %1, i32 0, i32 2
+  %2 = load i64, ptr %offset, align 4
+  %3 = load ptr, ptr %p, align 8
+  %tokens_len = getelementptr %parser, ptr %3, i32 0, i32 1
+  %4 = load i64, ptr %tokens_len, align 4
+  %5 = icmp sge i64 %2, %4
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %p, align 8
+  %tokens = getelementptr %parser, ptr %6, i32 0, i32 0
+  %7 = load ptr, ptr %tokens, align 8
+  %8 = load ptr, ptr %p, align 8
+  %offset1 = getelementptr %parser, ptr %8, i32 0, i32 2
+  %9 = load i64, ptr %offset1, align 4
+  %10 = getelementptr %token.2, ptr %7, i64 %9
+  %t = alloca ptr, align 8
+  store ptr %10, ptr %t, align 8
+  %11 = load ptr, ptr %p, align 8
+  %offset2 = getelementptr %parser, ptr %11, i32 0, i32 2
+  %12 = load ptr, ptr %p, align 8
+  %offset3 = getelementptr %parser, ptr %12, i32 0, i32 2
+  %13 = load i64, ptr %offset3, align 4
+  %14 = add i64 %13, 1
+  store i64 %14, ptr %offset2, align 4
+  %15 = load ptr, ptr %t, align 8
+  ret ptr %15
+}
+
+define ptr @parser_accept_token(ptr %0, i64 %1) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %t = alloca i64, align 8
+  store i64 %1, ptr %t, align 4
+  %2 = load ptr, ptr %p, align 8
+  %3 = call ptr @parser_peek_token(ptr %2)
+  %curr_token = alloca ptr, align 8
+  store ptr %3, ptr %curr_token, align 8
+  %4 = load ptr, ptr %curr_token, align 8
+  %5 = icmp eq ptr %4, null
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %curr_token, align 8
+  %type = getelementptr %token.2, ptr %6, i32 0, i32 0
+  %7 = load i64, ptr %type, align 4
+  %8 = load i64, ptr %t, align 4
+  %9 = icmp eq i64 %7, %8
+  br i1 %9, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  %10 = load ptr, ptr %p, align 8
+  %11 = call ptr @parser_consume_token(ptr %10)
+  ret ptr %11
+
+merge_block2:                                     ; preds = %merge_block
+  ret ptr null
+}
+
+define ptr @parser_accept_parse(ptr %0, ptr %1) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %parsing_func = alloca ptr, align 8
+  store ptr %1, ptr %parsing_func, align 8
+  %2 = load ptr, ptr %p, align 8
+  %offset = getelementptr %parser, ptr %2, i32 0, i32 2
+  %3 = load i64, ptr %offset, align 4
+  %prev_offset = alloca i64, align 8
+  store i64 %3, ptr %prev_offset, align 4
+  %4 = load ptr, ptr %parsing_func, align 8
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr %4(ptr %5)
+  %node = alloca ptr, align 8
+  store ptr %6, ptr %node, align 8
+  %7 = load ptr, ptr %node, align 8
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %9 = load ptr, ptr %p, align 8
+  %offset1 = getelementptr %parser, ptr %9, i32 0, i32 2
+  %10 = load i64, ptr %prev_offset, align 4
+  store i64 %10, ptr %offset1, align 4
+  br label %merge_block
+
+merge_block:                                      ; preds = %entrypoint, %then_block
+  %11 = load ptr, ptr %node, align 8
+  ret ptr %11
+}
+
+define ptr @parser_parse_return_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_RETURN.9, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr @parser_accept_parse(ptr %5, ptr @parser_parse_expression)
+  %maybe_expr = alloca ptr, align 8
+  store ptr %6, ptr %maybe_expr, align 8
+  %7 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %7, i32 0, i32 3
+  %8 = load ptr, ptr %arena, align 8
+  %9 = call ptr @arena_alloc(ptr %8, i64 8)
+  %d = alloca ptr, align 8
+  store ptr %9, ptr %d, align 8
+  %10 = load ptr, ptr %d, align 8
+  %expression = getelementptr %NODE_RETURN_STATEMENT_DATA, ptr %10, i32 0, i32 0
+  %11 = load ptr, ptr %maybe_expr, align 8
+  store ptr %11, ptr %expression, align 8
+  %r = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %r, i32 0, i32 0
+  %12 = load i64, ptr @NODE_RETURN_STATEMENT, align 4
+  store i64 %12, ptr %type, align 4
+  %data = getelementptr %Node, ptr %r, i32 0, i32 1
+  %13 = load ptr, ptr %d, align 8
+  store ptr %13, ptr %data, align 8
+  %14 = load ptr, ptr %p, align 8
+  %15 = load %Node, ptr %r, align 8
+  %16 = call ptr @create_node(ptr %14, %Node %15)
+  ret ptr %16
+}
+
+define ptr @parser_parse_type(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_accept_parse(ptr %1, ptr @parser_parse_function_type)
+  %typ = alloca ptr, align 8
+  store ptr %2, ptr %typ, align 8
+  %3 = load ptr, ptr %typ, align 8
+  %4 = icmp ne ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %5 = load ptr, ptr %typ, align 8
+  ret ptr %5
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %p, align 8
+  %7 = call ptr @parser_consume_token(ptr %6)
+  %to = alloca ptr, align 8
+  store ptr %7, ptr %to, align 8
+  %8 = load ptr, ptr %to, align 8
+  %9 = icmp ne ptr %8, null
+  call void @assert(i1 %9)
+  %10 = load ptr, ptr %to, align 8
+  %type = getelementptr %token.2, ptr %10, i32 0, i32 0
+  %11 = load i64, ptr %type, align 4
+  %12 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %13 = icmp eq i64 %11, %12
+  br i1 %13, label %then_block1, label %merge_block4
+
+then_block1:                                      ; preds = %merge_block
+  %14 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %14, i32 0, i32 3
+  %15 = load ptr, ptr %arena, align 8
+  %16 = call ptr @arena_alloc(ptr %15, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %16, ptr %d, align 8
+  %17 = load ptr, ptr %d, align 8
+  %name = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %17, i32 0, i32 0
+  %18 = load ptr, ptr %to, align 8
+  %data = getelementptr %token.2, ptr %18, i32 0, i32 1
+  %19 = load ptr, ptr %data, align 8
+  store ptr %19, ptr %name, align 8
+  %20 = load ptr, ptr %d, align 8
+  %underlying_type = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %20, i32 0, i32 1
+  store ptr null, ptr %underlying_type, align 8
+  %r = alloca %Node, align 8
+  %type2 = getelementptr %Node, ptr %r, i32 0, i32 0
+  %21 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %21, ptr %type2, align 4
+  %data3 = getelementptr %Node, ptr %r, i32 0, i32 1
+  %22 = load ptr, ptr %d, align 8
+  store ptr %22, ptr %data3, align 8
+  %23 = load ptr, ptr %p, align 8
+  %24 = load %Node, ptr %r, align 8
+  %25 = call ptr @create_node(ptr %23, %Node %24)
+  ret ptr %25
+
+merge_block4:                                     ; preds = %merge_block
+  %26 = load ptr, ptr %to, align 8
+  %type5 = getelementptr %token.2, ptr %26, i32 0, i32 0
+  %27 = load i64, ptr %type5, align 4
+  %28 = load i64, ptr @TOKEN_MUL.24, align 4
+  %29 = icmp eq i64 %27, %28
+  br i1 %29, label %then_block6, label %merge_block13
+
+then_block6:                                      ; preds = %merge_block4
+  %30 = load ptr, ptr %p, align 8
+  %arena7 = getelementptr %parser, ptr %30, i32 0, i32 3
+  %31 = load ptr, ptr %arena7, align 8
+  %32 = call ptr @arena_alloc(ptr %31, i64 8)
+  %d8 = alloca ptr, align 8
+  store ptr %32, ptr %d8, align 8
+  %33 = load ptr, ptr %d8, align 8
+  %type9 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %33, i32 0, i32 0
+  %34 = load ptr, ptr %p, align 8
+  %35 = call ptr @parser_parse_type(ptr %34)
+  store ptr %35, ptr %type9, align 8
+  %r10 = alloca %Node, align 8
+  %type11 = getelementptr %Node, ptr %r10, i32 0, i32 0
+  %36 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  store i64 %36, ptr %type11, align 4
+  %data12 = getelementptr %Node, ptr %r10, i32 0, i32 1
+  %37 = load ptr, ptr %d8, align 8
+  store ptr %37, ptr %data12, align 8
+  %38 = load ptr, ptr %p, align 8
+  %39 = load %Node, ptr %r10, align 8
+  %40 = call ptr @create_node(ptr %38, %Node %39)
+  ret ptr %40
+
+merge_block13:                                    ; preds = %merge_block4
+  ret ptr null
+}
+
+define ptr @parser_parse_cast_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %ident = alloca ptr, align 8
+  store ptr %3, ptr %ident, align 8
+  %4 = load ptr, ptr %ident, align 8
+  %5 = icmp eq ptr %4, null
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %ident, align 8
+  %data = getelementptr %token.2, ptr %6, i32 0, i32 1
+  %7 = load ptr, ptr %data, align 8
+  %8 = call i1 @strcmp(ptr %7, ptr @158)
+  %9 = icmp eq i1 %8, false
+  br i1 %9, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %10 = load ptr, ptr %p, align 8
+  %11 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  %12 = call ptr @parser_accept_token(ptr %10, i64 %11)
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %14 = load ptr, ptr %p, align 8
+  %15 = call ptr @parser_parse_type(ptr %14)
+  %typ = alloca ptr, align 8
+  store ptr %15, ptr %typ, align 8
+  %16 = load ptr, ptr %typ, align 8
+  %17 = icmp eq ptr %16, null
+  br i1 %17, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %18 = load ptr, ptr %p, align 8
+  %19 = load i64, ptr @TOKEN_COMMA.32, align 4
+  %20 = call ptr @parser_accept_token(ptr %18, i64 %19)
+  %21 = icmp eq ptr %20, null
+  br i1 %21, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  ret ptr null
+
+merge_block8:                                     ; preds = %merge_block6
+  %22 = load ptr, ptr %p, align 8
+  %23 = call ptr @parser_parse_expression(ptr %22)
+  %expression = alloca ptr, align 8
+  store ptr %23, ptr %expression, align 8
+  %24 = load ptr, ptr %expression, align 8
+  %25 = icmp eq ptr %24, null
+  br i1 %25, label %then_block9, label %merge_block10
+
+then_block9:                                      ; preds = %merge_block8
+  ret ptr null
+
+merge_block10:                                    ; preds = %merge_block8
+  %26 = load ptr, ptr %p, align 8
+  %27 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  %28 = call ptr @parser_accept_token(ptr %26, i64 %27)
+  %29 = icmp eq ptr %28, null
+  br i1 %29, label %then_block11, label %merge_block12
+
+then_block11:                                     ; preds = %merge_block10
+  ret ptr null
+
+merge_block12:                                    ; preds = %merge_block10
+  %30 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %30, i32 0, i32 3
+  %31 = load ptr, ptr %arena, align 8
+  %32 = call ptr @arena_alloc(ptr %31, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %32, ptr %d, align 8
+  %33 = load ptr, ptr %d, align 8
+  %typ13 = getelementptr %NODE_CAST_STATEMENT_DATA, ptr %33, i32 0, i32 0
+  %34 = load ptr, ptr %typ, align 8
+  store ptr %34, ptr %typ13, align 8
+  %35 = load ptr, ptr %d, align 8
+  %expression14 = getelementptr %NODE_CAST_STATEMENT_DATA, ptr %35, i32 0, i32 1
+  %36 = load ptr, ptr %expression, align 8
+  store ptr %36, ptr %expression14, align 8
+  %r = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %r, i32 0, i32 0
+  %37 = load i64, ptr @NODE_CAST_STATEMENT, align 4
+  store i64 %37, ptr %type, align 4
+  %data15 = getelementptr %Node, ptr %r, i32 0, i32 1
+  %38 = load ptr, ptr %d, align 8
+  store ptr %38, ptr %data15, align 8
+  %39 = load ptr, ptr %p, align 8
+  %40 = load %Node, ptr %r, align 8
+  %41 = call ptr @create_node(ptr %39, %Node %40)
+  ret ptr %41
+}
+
+define ptr @parser_parse_sizeof_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %ident = alloca ptr, align 8
+  store ptr %3, ptr %ident, align 8
+  %4 = load ptr, ptr %ident, align 8
+  %5 = icmp eq ptr %4, null
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %ident, align 8
+  %data = getelementptr %token.2, ptr %6, i32 0, i32 1
+  %7 = load ptr, ptr %data, align 8
+  %8 = call i1 @strcmp(ptr %7, ptr @159)
+  %9 = icmp eq i1 %8, false
+  br i1 %9, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %10 = load ptr, ptr %p, align 8
+  %11 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  %12 = call ptr @parser_accept_token(ptr %10, i64 %11)
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %14 = load ptr, ptr %p, align 8
+  %15 = call ptr @parser_parse_type(ptr %14)
+  %typ = alloca ptr, align 8
+  store ptr %15, ptr %typ, align 8
+  %16 = load ptr, ptr %typ, align 8
+  %17 = icmp eq ptr %16, null
+  br i1 %17, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %18 = load ptr, ptr %p, align 8
+  %19 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  %20 = call ptr @parser_accept_token(ptr %18, i64 %19)
+  %21 = icmp eq ptr %20, null
+  br i1 %21, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  ret ptr null
+
+merge_block8:                                     ; preds = %merge_block6
+  %22 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %22, i32 0, i32 3
+  %23 = load ptr, ptr %arena, align 8
+  %24 = call ptr @arena_alloc(ptr %23, i64 8)
+  %d = alloca ptr, align 8
+  store ptr %24, ptr %d, align 8
+  %25 = load ptr, ptr %d, align 8
+  %typ9 = getelementptr %NODE_SIZEOF_STATEMENT_DATA, ptr %25, i32 0, i32 0
+  %26 = load ptr, ptr %typ, align 8
+  store ptr %26, ptr %typ9, align 8
+  %r = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %r, i32 0, i32 0
+  %27 = load i64, ptr @NODE_SIZEOF_STATEMENT, align 4
+  store i64 %27, ptr %type, align 4
+  %data10 = getelementptr %Node, ptr %r, i32 0, i32 1
+  %28 = load ptr, ptr %d, align 8
+  store ptr %28, ptr %data10, align 8
+  %29 = load ptr, ptr %p, align 8
+  %30 = load %Node, ptr %r, align 8
+  %31 = call ptr @create_node(ptr %29, %Node %30)
+  ret ptr %31
+}
+
+define ptr @parser_parse_function_type(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %5, i32 0, i32 3
+  %6 = load ptr, ptr %arena, align 8
+  %7 = call ptr @arena_alloc(ptr %6, i64 160)
+  %parameters = alloca ptr, align 8
+  store ptr %7, ptr %parameters, align 8
+  %parameters_len = alloca i64, align 8
+  store i64 0, ptr %parameters_len, align 4
+  %first = alloca i1, align 1
+  store i1 true, ptr %first, align 1
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block4, %merge_block
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %8 = load i1, ptr %first, align 1
+  %9 = icmp eq i1 %8, false
+  br i1 %9, label %then_block1, label %merge_block2
+
+outer_block:                                      ; preds = %then_block3, %while_block
+  %10 = load ptr, ptr %p, align 8
+  %11 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  %12 = call ptr @parser_accept_token(ptr %10, i64 %11)
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block5, label %merge_block6
+
+then_block1:                                      ; preds = %inner_block
+  %14 = load ptr, ptr %p, align 8
+  %15 = load i64, ptr @TOKEN_COMMA.32, align 4
+  %16 = call ptr @parser_accept_token(ptr %14, i64 %15)
+  br label %merge_block2
+
+merge_block2:                                     ; preds = %inner_block, %then_block1
+  store i1 false, ptr %first, align 1
+  %17 = load ptr, ptr %p, align 8
+  %18 = call ptr @parser_accept_parse(ptr %17, ptr @parser_parse_type)
+  %type_annotation = alloca ptr, align 8
+  store ptr %18, ptr %type_annotation, align 8
+  %19 = load ptr, ptr %type_annotation, align 8
+  %20 = icmp eq ptr %19, null
+  br i1 %20, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  br label %outer_block
+
+merge_block4:                                     ; preds = %merge_block2
+  %21 = load ptr, ptr %parameters, align 8
+  %22 = load i64, ptr %parameters_len, align 4
+  %23 = getelementptr ptr, ptr %21, i64 %22
+  %24 = load ptr, ptr %type_annotation, align 8
+  store ptr %24, ptr %23, align 8
+  %25 = load i64, ptr %parameters_len, align 4
+  %26 = add i64 %25, 1
+  store i64 %26, ptr %parameters_len, align 4
+  br label %while_block
+
+then_block5:                                      ; preds = %outer_block
+  ret ptr null
+
+merge_block6:                                     ; preds = %outer_block
+  %27 = load ptr, ptr %p, align 8
+  %28 = load i64, ptr @TOKEN_ARROW.12, align 4
+  %29 = call ptr @parser_accept_token(ptr %27, i64 %28)
+  %30 = icmp eq ptr %29, null
+  br i1 %30, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  ret ptr null
+
+merge_block8:                                     ; preds = %merge_block6
+  %31 = load ptr, ptr %p, align 8
+  %32 = call ptr @parser_parse_type(ptr %31)
+  %retur_typ = alloca ptr, align 8
+  store ptr %32, ptr %retur_typ, align 8
+  %33 = load ptr, ptr %retur_typ, align 8
+  %34 = icmp eq ptr %33, null
+  br i1 %34, label %then_block9, label %merge_block10
+
+then_block9:                                      ; preds = %merge_block8
+  ret ptr null
+
+merge_block10:                                    ; preds = %merge_block8
+  %35 = load ptr, ptr %p, align 8
+  %arena11 = getelementptr %parser, ptr %35, i32 0, i32 3
+  %36 = load ptr, ptr %arena11, align 8
+  %37 = call ptr @arena_alloc(ptr %36, i64 24)
+  %d = alloca ptr, align 8
+  store ptr %37, ptr %d, align 8
+  %38 = load ptr, ptr %d, align 8
+  %parameters12 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %38, i32 0, i32 0
+  %39 = load ptr, ptr %parameters, align 8
+  store ptr %39, ptr %parameters12, align 8
+  %40 = load ptr, ptr %d, align 8
+  %parameters_len13 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %40, i32 0, i32 1
+  %41 = load i64, ptr %parameters_len, align 4
+  store i64 %41, ptr %parameters_len13, align 4
+  %42 = load ptr, ptr %d, align 8
+  %retur_type = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %42, i32 0, i32 2
+  %43 = load ptr, ptr %retur_typ, align 8
+  store ptr %43, ptr %retur_type, align 8
+  %r = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %r, i32 0, i32 0
+  %44 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  store i64 %44, ptr %type, align 4
+  %data = getelementptr %Node, ptr %r, i32 0, i32 1
+  %45 = load ptr, ptr %d, align 8
+  store ptr %45, ptr %data, align 8
+  %46 = load ptr, ptr %p, align 8
+  %47 = load %Node, ptr %r, align 8
+  %48 = call ptr @create_node(ptr %46, %Node %47)
+  ret ptr %48
+}
+
+define ptr @parser_parse_if_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_IF.7, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr @parser_parse_expression(ptr %5)
+  %expression = alloca ptr, align 8
+  store ptr %6, ptr %expression, align 8
+  %7 = load ptr, ptr %expression, align 8
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %9 = load ptr, ptr %p, align 8
+  %10 = load i64, ptr @TOKEN_LBRACE.36, align 4
+  %11 = call ptr @parser_accept_token(ptr %9, i64 %10)
+  %12 = icmp eq ptr %11, null
+  br i1 %12, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %13 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %13, i32 0, i32 3
+  %14 = load ptr, ptr %arena, align 8
+  %15 = call ptr @arena_alloc(ptr %14, i64 800)
+  %statements = alloca ptr, align 8
+  store ptr %15, ptr %statements, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block6, %merge_block4
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %16 = load ptr, ptr %p, align 8
+  %17 = call ptr @parser_accept_parse(ptr %16, ptr @parser_parse_statement)
+  %n = alloca ptr, align 8
+  store ptr %17, ptr %n, align 8
+  %18 = load ptr, ptr %n, align 8
+  %19 = icmp eq ptr %18, null
+  br i1 %19, label %then_block5, label %merge_block6
+
+outer_block:                                      ; preds = %then_block5, %while_block
+  %20 = load ptr, ptr %p, align 8
+  %21 = load i64, ptr @TOKEN_RBRACE.37, align 4
+  %22 = call ptr @parser_accept_token(ptr %20, i64 %21)
+  %23 = icmp eq ptr %22, null
+  br i1 %23, label %then_block7, label %merge_block8
+
+then_block5:                                      ; preds = %inner_block
+  br label %outer_block
+
+merge_block6:                                     ; preds = %inner_block
+  %24 = load ptr, ptr %statements, align 8
+  %25 = load i64, ptr %i, align 4
+  %26 = getelementptr ptr, ptr %24, i64 %25
+  %27 = load ptr, ptr %n, align 8
+  store ptr %27, ptr %26, align 8
+  %28 = load i64, ptr %i, align 4
+  %29 = add i64 %28, 1
+  store i64 %29, ptr %i, align 4
+  br label %while_block
+
+then_block7:                                      ; preds = %outer_block
+  ret ptr null
+
+merge_block8:                                     ; preds = %outer_block
+  %30 = load ptr, ptr %p, align 8
+  %arena9 = getelementptr %parser, ptr %30, i32 0, i32 3
+  %31 = load ptr, ptr %arena9, align 8
+  %32 = call ptr @arena_alloc(ptr %31, i64 24)
+  %dd = alloca ptr, align 8
+  store ptr %32, ptr %dd, align 8
+  %33 = load ptr, ptr %dd, align 8
+  %condition = getelementptr %NODE_IF_STATEMENT_DATA, ptr %33, i32 0, i32 0
+  %34 = load ptr, ptr %expression, align 8
+  store ptr %34, ptr %condition, align 8
+  %35 = load ptr, ptr %dd, align 8
+  %statements10 = getelementptr %NODE_IF_STATEMENT_DATA, ptr %35, i32 0, i32 1
+  %36 = load ptr, ptr %statements, align 8
+  store ptr %36, ptr %statements10, align 8
+  %37 = load ptr, ptr %dd, align 8
+  %statements_len = getelementptr %NODE_IF_STATEMENT_DATA, ptr %37, i32 0, i32 2
+  %38 = load i64, ptr %i, align 4
+  store i64 %38, ptr %statements_len, align 4
+  %r = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %r, i32 0, i32 0
+  %39 = load i64, ptr @NODE_IF_STATEMENT, align 4
+  store i64 %39, ptr %type, align 4
+  %data = getelementptr %Node, ptr %r, i32 0, i32 1
+  %40 = load ptr, ptr %dd, align 8
+  store ptr %40, ptr %data, align 8
+  %41 = load ptr, ptr %p, align 8
+  %42 = load %Node, ptr %r, align 8
+  %43 = call ptr @create_node(ptr %41, %Node %42)
+  ret ptr %43
+}
+
+define ptr @parser_parse_while_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_WHILE.8, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr @parser_parse_expression(ptr %5)
+  %expression = alloca ptr, align 8
+  store ptr %6, ptr %expression, align 8
+  %7 = load ptr, ptr %expression, align 8
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %9 = load ptr, ptr %p, align 8
+  %10 = load i64, ptr @TOKEN_LBRACE.36, align 4
+  %11 = call ptr @parser_accept_token(ptr %9, i64 %10)
+  %12 = icmp eq ptr %11, null
+  br i1 %12, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %13 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %13, i32 0, i32 3
+  %14 = load ptr, ptr %arena, align 8
+  %15 = call ptr @arena_alloc(ptr %14, i64 800)
+  %statements = alloca ptr, align 8
+  store ptr %15, ptr %statements, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block6, %merge_block4
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %16 = load ptr, ptr %p, align 8
+  %17 = call ptr @parser_accept_parse(ptr %16, ptr @parser_parse_statement)
+  %n = alloca ptr, align 8
+  store ptr %17, ptr %n, align 8
+  %18 = load ptr, ptr %n, align 8
+  %19 = icmp eq ptr %18, null
+  br i1 %19, label %then_block5, label %merge_block6
+
+outer_block:                                      ; preds = %then_block5, %while_block
+  %20 = load ptr, ptr %p, align 8
+  %21 = load i64, ptr @TOKEN_RBRACE.37, align 4
+  %22 = call ptr @parser_accept_token(ptr %20, i64 %21)
+  %23 = icmp eq ptr %22, null
+  br i1 %23, label %then_block7, label %merge_block8
+
+then_block5:                                      ; preds = %inner_block
+  br label %outer_block
+
+merge_block6:                                     ; preds = %inner_block
+  %24 = load ptr, ptr %statements, align 8
+  %25 = load i64, ptr %i, align 4
+  %26 = getelementptr ptr, ptr %24, i64 %25
+  %27 = load ptr, ptr %n, align 8
+  store ptr %27, ptr %26, align 8
+  %28 = load i64, ptr %i, align 4
+  %29 = add i64 %28, 1
+  store i64 %29, ptr %i, align 4
+  br label %while_block
+
+then_block7:                                      ; preds = %outer_block
+  ret ptr null
+
+merge_block8:                                     ; preds = %outer_block
+  %30 = load ptr, ptr %p, align 8
+  %arena9 = getelementptr %parser, ptr %30, i32 0, i32 3
+  %31 = load ptr, ptr %arena9, align 8
+  %32 = call ptr @arena_alloc(ptr %31, i64 24)
+  %dd = alloca ptr, align 8
+  store ptr %32, ptr %dd, align 8
+  %33 = load ptr, ptr %dd, align 8
+  %condition = getelementptr %NODE_WHILE_STATEMENT_DATA, ptr %33, i32 0, i32 0
+  %34 = load ptr, ptr %expression, align 8
+  store ptr %34, ptr %condition, align 8
+  %35 = load ptr, ptr %dd, align 8
+  %statements10 = getelementptr %NODE_WHILE_STATEMENT_DATA, ptr %35, i32 0, i32 1
+  %36 = load ptr, ptr %statements, align 8
+  store ptr %36, ptr %statements10, align 8
+  %37 = load ptr, ptr %dd, align 8
+  %statements_len = getelementptr %NODE_WHILE_STATEMENT_DATA, ptr %37, i32 0, i32 2
+  %38 = load i64, ptr %i, align 4
+  store i64 %38, ptr %statements_len, align 4
+  %r = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %r, i32 0, i32 0
+  %39 = load i64, ptr @NODE_WHILE_STATEMENT, align 4
+  store i64 %39, ptr %type, align 4
+  %data = getelementptr %Node, ptr %r, i32 0, i32 1
+  %40 = load ptr, ptr %dd, align 8
+  store ptr %40, ptr %data, align 8
+  %41 = load ptr, ptr %p, align 8
+  %42 = load %Node, ptr %r, align 8
+  %43 = call ptr @create_node(ptr %41, %Node %42)
+  ret ptr %43
+}
+
+define ptr @parser_parse_extern_declaration(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_EXTERN.6, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %ident = alloca ptr, align 8
+  store ptr %7, ptr %ident, align 8
+  %8 = load ptr, ptr %ident, align 8
+  %9 = icmp eq ptr %8, null
+  br i1 %9, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %10 = load ptr, ptr %p, align 8
+  %11 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %12 = call ptr @parser_accept_token(ptr %10, i64 %11)
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %14 = load ptr, ptr %p, align 8
+  %15 = call ptr @parser_parse_type(ptr %14)
+  %typ = alloca ptr, align 8
+  store ptr %15, ptr %typ, align 8
+  %16 = load ptr, ptr %typ, align 8
+  %17 = icmp eq ptr %16, null
+  br i1 %17, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %18 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %18, i32 0, i32 3
+  %19 = load ptr, ptr %arena, align 8
+  %20 = call ptr @arena_alloc(ptr %19, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %20, ptr %d, align 8
+  %21 = load ptr, ptr %d, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %21, i32 0, i32 0
+  %22 = load ptr, ptr %ident, align 8
+  %data = getelementptr %token.2, ptr %22, i32 0, i32 1
+  %23 = load ptr, ptr %data, align 8
+  store ptr %23, ptr %name, align 8
+  %24 = load ptr, ptr %d, align 8
+  %type = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %24, i32 0, i32 1
+  store ptr null, ptr %type, align 8
+  %n = alloca %Node, align 8
+  %type7 = getelementptr %Node, ptr %n, i32 0, i32 0
+  %25 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  store i64 %25, ptr %type7, align 4
+  %data8 = getelementptr %Node, ptr %n, i32 0, i32 1
+  %26 = load ptr, ptr %d, align 8
+  store ptr %26, ptr %data8, align 8
+  %27 = load ptr, ptr %p, align 8
+  %arena9 = getelementptr %parser, ptr %27, i32 0, i32 3
+  %28 = load ptr, ptr %arena9, align 8
+  %29 = call ptr @arena_alloc(ptr %28, i64 24)
+  %dd = alloca ptr, align 8
+  store ptr %29, ptr %dd, align 8
+  %30 = load ptr, ptr %dd, align 8
+  %is_declaration = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %30, i32 0, i32 0
+  store i1 false, ptr %is_declaration, align 1
+  %31 = load ptr, ptr %dd, align 8
+  %is_dereference = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %31, i32 0, i32 1
+  store i1 false, ptr %is_dereference, align 1
+  %32 = load ptr, ptr %dd, align 8
+  %lhs = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %32, i32 0, i32 2
+  %33 = load ptr, ptr %p, align 8
+  %34 = load %Node, ptr %n, align 8
+  %35 = call ptr @create_node(ptr %33, %Node %34)
+  store ptr %35, ptr %lhs, align 8
+  %36 = load ptr, ptr %dd, align 8
+  %rhs = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %36, i32 0, i32 3
+  %37 = load ptr, ptr %typ, align 8
+  store ptr %37, ptr %rhs, align 8
+  %r = alloca %Node, align 8
+  %type10 = getelementptr %Node, ptr %r, i32 0, i32 0
+  %38 = load i64, ptr @NODE_ASSIGNMENT_STATEMENT, align 4
+  store i64 %38, ptr %type10, align 4
+  %data11 = getelementptr %Node, ptr %r, i32 0, i32 1
+  %39 = load ptr, ptr %dd, align 8
+  store ptr %39, ptr %data11, align 8
+  %40 = load ptr, ptr %p, align 8
+  %41 = load %Node, ptr %r, align 8
+  %42 = call ptr @create_node(ptr %40, %Node %41)
+  ret ptr %42
+}
+
+define ptr @parser_parse_function_parameters(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %1, i32 0, i32 3
+  %2 = load ptr, ptr %arena, align 8
+  %3 = call ptr @arena_alloc(ptr %2, i64 160)
+  %node_list = alloca ptr, align 8
+  store ptr %3, ptr %node_list, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block6, %entrypoint
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %4 = load i64, ptr %i, align 4
+  %5 = icmp ne i64 %4, 0
+  br i1 %5, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %then_block1, %while_block
+  %6 = load ptr, ptr %p, align 8
+  %arena10 = getelementptr %parser, ptr %6, i32 0, i32 3
+  %7 = load ptr, ptr %arena10, align 8
+  %8 = call ptr @arena_alloc(ptr %7, i64 16)
+  %s = alloca ptr, align 8
+  store ptr %8, ptr %s, align 8
+  %9 = load ptr, ptr %s, align 8
+  %data11 = getelementptr %slice, ptr %9, i32 0, i32 0
+  %10 = load ptr, ptr %node_list, align 8
+  store ptr %10, ptr %data11, align 8
+  %11 = load ptr, ptr %s, align 8
+  %data_len = getelementptr %slice, ptr %11, i32 0, i32 1
+  %12 = load i64, ptr %i, align 4
+  store i64 %12, ptr %data_len, align 4
+  %13 = load ptr, ptr %s, align 8
+  ret ptr %13
+
+then_block:                                       ; preds = %inner_block
+  %14 = load ptr, ptr %p, align 8
+  %15 = load i64, ptr @TOKEN_COMMA.32, align 4
+  %16 = call ptr @parser_accept_token(ptr %14, i64 %15)
+  br label %merge_block
+
+merge_block:                                      ; preds = %inner_block, %then_block
+  %17 = load ptr, ptr %p, align 8
+  %18 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %19 = call ptr @parser_accept_token(ptr %17, i64 %18)
+  %ident = alloca ptr, align 8
+  store ptr %19, ptr %ident, align 8
+  %20 = load ptr, ptr %ident, align 8
+  %21 = icmp eq ptr %20, null
+  br i1 %21, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  br label %outer_block
+
+merge_block2:                                     ; preds = %merge_block
+  %22 = load ptr, ptr %p, align 8
+  %23 = load i64, ptr @TOKEN_COLON.33, align 4
+  %24 = call ptr @parser_accept_token(ptr %22, i64 %23)
+  %25 = icmp eq ptr %24, null
+  br i1 %25, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %26 = load ptr, ptr %p, align 8
+  %27 = call ptr @parser_parse_type(ptr %26)
+  %type_annotation = alloca ptr, align 8
+  store ptr %27, ptr %type_annotation, align 8
+  %28 = load ptr, ptr %type_annotation, align 8
+  %29 = icmp eq ptr %28, null
+  br i1 %29, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %30 = load ptr, ptr %p, align 8
+  %arena7 = getelementptr %parser, ptr %30, i32 0, i32 3
+  %31 = load ptr, ptr %arena7, align 8
+  %32 = call ptr @arena_alloc(ptr %31, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %32, ptr %d, align 8
+  %33 = load ptr, ptr %d, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %33, i32 0, i32 0
+  %34 = load ptr, ptr %ident, align 8
+  %data = getelementptr %token.2, ptr %34, i32 0, i32 1
+  %35 = load ptr, ptr %data, align 8
+  store ptr %35, ptr %name, align 8
+  %36 = load ptr, ptr %d, align 8
+  %type = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %36, i32 0, i32 1
+  %37 = load ptr, ptr %type_annotation, align 8
+  store ptr %37, ptr %type, align 8
+  %n = alloca %Node, align 8
+  %type8 = getelementptr %Node, ptr %n, i32 0, i32 0
+  %38 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  store i64 %38, ptr %type8, align 4
+  %data9 = getelementptr %Node, ptr %n, i32 0, i32 1
+  %39 = load ptr, ptr %d, align 8
+  store ptr %39, ptr %data9, align 8
+  %40 = load ptr, ptr %node_list, align 8
+  %41 = load i64, ptr %i, align 4
+  %42 = getelementptr ptr, ptr %40, i64 %41
+  %43 = load ptr, ptr %p, align 8
+  %44 = load %Node, ptr %n, align 8
+  %45 = call ptr @create_node(ptr %43, %Node %44)
+  store ptr %45, ptr %42, align 8
+  %46 = load i64, ptr %i, align 4
+  %47 = add i64 %46, 1
+  store i64 %47, ptr %i, align 4
+  br label %while_block
+}
+
+define ptr @parser_parse_type_definition(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_TYPE.14, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr @parser_parse_type(ptr %5)
+  %typ = alloca ptr, align 8
+  store ptr %6, ptr %typ, align 8
+  %7 = load ptr, ptr %typ, align 8
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %9 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %9, i32 0, i32 3
+  %10 = load ptr, ptr %arena, align 8
+  %11 = call ptr @arena_alloc(ptr %10, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %11, ptr %d, align 8
+  %12 = load ptr, ptr %d, align 8
+  %name = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %12, i32 0, i32 0
+  store ptr @160, ptr %name, align 8
+  %13 = load ptr, ptr %d, align 8
+  %underlying_type = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %13, i32 0, i32 1
+  %14 = load ptr, ptr %typ, align 8
+  store ptr %14, ptr %underlying_type, align 8
+  %r = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %r, i32 0, i32 0
+  %15 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %15, ptr %type, align 4
+  %data = getelementptr %Node, ptr %r, i32 0, i32 1
+  %16 = load ptr, ptr %d, align 8
+  store ptr %16, ptr %data, align 8
+  %17 = load ptr, ptr %p, align 8
+  %18 = load %Node, ptr %r, align 8
+  %19 = call ptr @create_node(ptr %17, %Node %18)
+  ret ptr %19
+}
+
+define ptr @parser_parse_struct_definition(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_STRUCT.13, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = load i64, ptr @TOKEN_LBRACE.36, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %9 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %9, i32 0, i32 3
+  %10 = load ptr, ptr %arena, align 8
+  %11 = call ptr @arena_alloc(ptr %10, i64 160)
+  %fields = alloca ptr, align 8
+  store ptr %11, ptr %fields, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block4, %merge_block2
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %12 = load ptr, ptr %p, align 8
+  %13 = call ptr @parser_accept_parse(ptr %12, ptr @unnamed_func.42)
+  %field = alloca ptr, align 8
+  store ptr %13, ptr %field, align 8
+  %14 = load ptr, ptr %field, align 8
+  %15 = icmp eq ptr %14, null
+  br i1 %15, label %then_block3, label %merge_block4
+
+outer_block:                                      ; preds = %then_block3, %while_block
+  %16 = load ptr, ptr %p, align 8
+  %17 = load i64, ptr @TOKEN_RBRACE.37, align 4
+  %18 = call ptr @parser_accept_token(ptr %16, i64 %17)
+  %19 = icmp eq ptr %18, null
+  br i1 %19, label %then_block5, label %merge_block6
+
+then_block3:                                      ; preds = %inner_block
+  br label %outer_block
+
+merge_block4:                                     ; preds = %inner_block
+  %20 = load ptr, ptr %p, align 8
+  %21 = load i64, ptr @TOKEN_COMMA.32, align 4
+  %22 = call ptr @parser_accept_token(ptr %20, i64 %21)
+  %23 = load ptr, ptr %fields, align 8
+  %24 = load i64, ptr %i, align 4
+  %25 = getelementptr ptr, ptr %23, i64 %24
+  %26 = load ptr, ptr %field, align 8
+  store ptr %26, ptr %25, align 8
+  %27 = load i64, ptr %i, align 4
+  %28 = add i64 %27, 1
+  store i64 %28, ptr %i, align 4
+  br label %while_block
+
+then_block5:                                      ; preds = %outer_block
+  ret ptr null
+
+merge_block6:                                     ; preds = %outer_block
+  %29 = load ptr, ptr %p, align 8
+  %arena7 = getelementptr %parser, ptr %29, i32 0, i32 3
+  %30 = load ptr, ptr %arena7, align 8
+  %31 = call ptr @arena_alloc(ptr %30, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %31, ptr %d, align 8
+  %32 = load ptr, ptr %d, align 8
+  %fields8 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %32, i32 0, i32 0
+  %33 = load ptr, ptr %fields, align 8
+  store ptr %33, ptr %fields8, align 8
+  %34 = load ptr, ptr %d, align 8
+  %fields_len = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %34, i32 0, i32 1
+  %35 = load i64, ptr %i, align 4
+  store i64 %35, ptr %fields_len, align 4
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %36 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  store i64 %36, ptr %type, align 4
+  %data = getelementptr %Node, ptr %n, i32 0, i32 1
+  %37 = load ptr, ptr %d, align 8
+  store ptr %37, ptr %data, align 8
+  %38 = load ptr, ptr %p, align 8
+  %39 = load %Node, ptr %n, align 8
+  %40 = call ptr @create_node(ptr %38, %Node %39)
+  ret ptr %40
+}
+
+define ptr @unnamed_func.42(ptr %0) {
+entrypoint:
+  %ip = alloca ptr, align 8
+  store ptr %0, ptr %ip, align 8
+  %1 = load ptr, ptr %ip, align 8
+  %2 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %ident = alloca ptr, align 8
+  store ptr %3, ptr %ident, align 8
+  %4 = load ptr, ptr %ident, align 8
+  %5 = icmp eq ptr %4, null
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %ip, align 8
+  %7 = load i64, ptr @TOKEN_COLON.33, align 4
+  %8 = call ptr @parser_accept_token(ptr %6, i64 %7)
+  %9 = icmp eq ptr %8, null
+  br i1 %9, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %10 = load ptr, ptr %ip, align 8
+  %11 = call ptr @parser_parse_type(ptr %10)
+  %typ_annotation = alloca ptr, align 8
+  store ptr %11, ptr %typ_annotation, align 8
+  %12 = load ptr, ptr %typ_annotation, align 8
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %14 = load ptr, ptr %typ_annotation, align 8
+  %type = getelementptr %Node, ptr %14, i32 0, i32 0
+  %15 = load i64, ptr %type, align 4
+  call void (ptr, ...) @printf(ptr @161, i64 %15)
+  %16 = load ptr, ptr %ip, align 8
+  %arena = getelementptr %parser, ptr %16, i32 0, i32 3
+  %17 = load ptr, ptr %arena, align 8
+  %18 = call ptr @arena_alloc(ptr %17, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %18, ptr %d, align 8
+  %19 = load ptr, ptr %d, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %19, i32 0, i32 0
+  %20 = load ptr, ptr %ident, align 8
+  %data = getelementptr %token.2, ptr %20, i32 0, i32 1
+  %21 = load ptr, ptr %data, align 8
+  store ptr %21, ptr %name, align 8
+  %22 = load ptr, ptr %d, align 8
+  %type5 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %22, i32 0, i32 1
+  %23 = load ptr, ptr %typ_annotation, align 8
+  store ptr %23, ptr %type5, align 8
+  %n = alloca %Node, align 8
+  %type6 = getelementptr %Node, ptr %n, i32 0, i32 0
+  %24 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  store i64 %24, ptr %type6, align 4
+  %data7 = getelementptr %Node, ptr %n, i32 0, i32 1
+  %25 = load ptr, ptr %d, align 8
+  store ptr %25, ptr %data7, align 8
+  %26 = load ptr, ptr %ip, align 8
+  %27 = load %Node, ptr %n, align 8
+  %28 = call ptr @create_node(ptr %26, %Node %27)
+  ret ptr %28
+}
+
+define ptr @parser_parse_function_definition(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr @parser_parse_function_parameters(ptr %5)
+  %params = alloca ptr, align 8
+  store ptr %6, ptr %params, align 8
+  %7 = load ptr, ptr %params, align 8
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %9 = load ptr, ptr %p, align 8
+  %10 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  %11 = call ptr @parser_accept_token(ptr %9, i64 %10)
+  %12 = icmp eq ptr %11, null
+  br i1 %12, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %13 = load ptr, ptr %p, align 8
+  %14 = load i64, ptr @TOKEN_ARROW.12, align 4
+  %15 = call ptr @parser_accept_token(ptr %13, i64 %14)
+  %16 = icmp eq ptr %15, null
+  br i1 %16, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %17 = load ptr, ptr %p, align 8
+  %18 = call ptr @parser_parse_type(ptr %17)
+  %retur_type = alloca ptr, align 8
+  store ptr %18, ptr %retur_type, align 8
+  %19 = load ptr, ptr %retur_type, align 8
+  %20 = icmp eq ptr %19, null
+  br i1 %20, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  ret ptr null
+
+merge_block8:                                     ; preds = %merge_block6
+  %21 = load ptr, ptr %p, align 8
+  %22 = load i64, ptr @TOKEN_LBRACE.36, align 4
+  %23 = call ptr @parser_accept_token(ptr %21, i64 %22)
+  %24 = icmp eq ptr %23, null
+  br i1 %24, label %then_block9, label %merge_block10
+
+then_block9:                                      ; preds = %merge_block8
+  ret ptr null
+
+merge_block10:                                    ; preds = %merge_block8
+  %25 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %25, i32 0, i32 3
+  %26 = load ptr, ptr %arena, align 8
+  %27 = call ptr @arena_alloc(ptr %26, i64 800)
+  %statements = alloca ptr, align 8
+  store ptr %27, ptr %statements, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block12, %merge_block10
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %28 = load ptr, ptr %p, align 8
+  %29 = call ptr @parser_accept_parse(ptr %28, ptr @parser_parse_statement)
+  %n = alloca ptr, align 8
+  store ptr %29, ptr %n, align 8
+  %30 = load ptr, ptr %n, align 8
+  %31 = icmp eq ptr %30, null
+  br i1 %31, label %then_block11, label %merge_block12
+
+outer_block:                                      ; preds = %then_block11, %while_block
+  %32 = load ptr, ptr %p, align 8
+  %33 = load i64, ptr @TOKEN_RBRACE.37, align 4
+  %34 = call ptr @parser_accept_token(ptr %32, i64 %33)
+  %35 = icmp eq ptr %34, null
+  br i1 %35, label %then_block13, label %merge_block14
+
+then_block11:                                     ; preds = %inner_block
+  br label %outer_block
+
+merge_block12:                                    ; preds = %inner_block
+  %36 = load ptr, ptr %statements, align 8
+  %37 = load i64, ptr %i, align 4
+  %38 = getelementptr ptr, ptr %36, i64 %37
+  %39 = load ptr, ptr %n, align 8
+  store ptr %39, ptr %38, align 8
+  %40 = load i64, ptr %i, align 4
+  %41 = add i64 %40, 1
+  store i64 %41, ptr %i, align 4
+  br label %while_block
+
+then_block13:                                     ; preds = %outer_block
+  ret ptr null
+
+merge_block14:                                    ; preds = %outer_block
+  %42 = load ptr, ptr %p, align 8
+  %arena15 = getelementptr %parser, ptr %42, i32 0, i32 3
+  %43 = load ptr, ptr %arena15, align 8
+  %44 = call ptr @arena_alloc(ptr %43, i64 40)
+  %d = alloca ptr, align 8
+  store ptr %44, ptr %d, align 8
+  %45 = load ptr, ptr %d, align 8
+  %statements16 = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %45, i32 0, i32 0
+  %46 = load ptr, ptr %statements, align 8
+  store ptr %46, ptr %statements16, align 8
+  %47 = load ptr, ptr %d, align 8
+  %statements_len = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %47, i32 0, i32 1
+  %48 = load i64, ptr %i, align 4
+  store i64 %48, ptr %statements_len, align 4
+  %49 = load ptr, ptr %d, align 8
+  %parameters = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %49, i32 0, i32 2
+  %50 = load ptr, ptr %params, align 8
+  %data = getelementptr %slice, ptr %50, i32 0, i32 0
+  %51 = load ptr, ptr %data, align 8
+  store ptr %51, ptr %parameters, align 8
+  %52 = load ptr, ptr %d, align 8
+  %parameters_len = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %52, i32 0, i32 3
+  %53 = load ptr, ptr %params, align 8
+  %data_len = getelementptr %slice, ptr %53, i32 0, i32 1
+  %54 = load i64, ptr %data_len, align 4
+  store i64 %54, ptr %parameters_len, align 4
+  %55 = load ptr, ptr %d, align 8
+  %retur_type17 = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %55, i32 0, i32 4
+  %56 = load ptr, ptr %retur_type, align 8
+  store ptr %56, ptr %retur_type17, align 8
+  %n18 = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n18, i32 0, i32 0
+  %57 = load i64, ptr @NODE_FUNCTION_DEFINITION, align 4
+  store i64 %57, ptr %type, align 4
+  %data19 = getelementptr %Node, ptr %n18, i32 0, i32 1
+  %58 = load ptr, ptr %d, align 8
+  store ptr %58, ptr %data19, align 8
+  %59 = load ptr, ptr %p, align 8
+  %60 = load %Node, ptr %n18, align 8
+  %61 = call ptr @create_node(ptr %59, %Node %60)
+  ret ptr %61
+}
+
+define ptr @parser_parse_struct_instanciation(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %typ = alloca ptr, align 8
+  store ptr %3, ptr %typ, align 8
+  %4 = load ptr, ptr %typ, align 8
+  %5 = icmp eq ptr %4, null
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %p, align 8
+  %7 = load i64, ptr @TOKEN_LBRACE.36, align 4
+  %8 = call ptr @parser_accept_token(ptr %6, i64 %7)
+  %9 = icmp eq ptr %8, null
+  br i1 %9, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %10 = load ptr, ptr %p, align 8
+  %11 = load i64, ptr @TOKEN_RBRACE.37, align 4
+  %12 = call ptr @parser_accept_token(ptr %10, i64 %11)
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %14 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %14, i32 0, i32 3
+  %15 = load ptr, ptr %arena, align 8
+  %16 = call ptr @arena_alloc(ptr %15, i64 8)
+  %d = alloca ptr, align 8
+  store ptr %16, ptr %d, align 8
+  %17 = load ptr, ptr %d, align 8
+  %typ5 = getelementptr %NODE_STRUCT_INSTANCIATION_DATA, ptr %17, i32 0, i32 0
+  %18 = load ptr, ptr %typ, align 8
+  %data = getelementptr %token.2, ptr %18, i32 0, i32 1
+  %19 = load ptr, ptr %data, align 8
+  store ptr %19, ptr %typ5, align 8
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %20 = load i64, ptr @NODE_STRUCT_INSTANCIATION, align 4
+  store i64 %20, ptr %type, align 4
+  %data6 = getelementptr %Node, ptr %n, i32 0, i32 1
+  %21 = load ptr, ptr %d, align 8
+  store ptr %21, ptr %data6, align 8
+  %22 = load ptr, ptr %p, align 8
+  %23 = load %Node, ptr %n, align 8
+  %24 = call ptr @create_node(ptr %22, %Node %23)
+  ret ptr %24
+}
+
+define ptr @parser_parse_primary_expression(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_accept_parse(ptr %1, ptr @parser_parse_function_definition)
+  %stmt = alloca ptr, align 8
+  store ptr %2, ptr %stmt, align 8
+  %3 = load ptr, ptr %stmt, align 8
+  %4 = icmp ne ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %5 = load ptr, ptr %stmt, align 8
+  ret ptr %5
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %p, align 8
+  %7 = call ptr @parser_accept_parse(ptr %6, ptr @parser_parse_type_definition)
+  %stmt1 = alloca ptr, align 8
+  store ptr %7, ptr %stmt1, align 8
+  %8 = load ptr, ptr %stmt1, align 8
+  %9 = icmp ne ptr %8, null
+  br i1 %9, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %merge_block
+  %10 = load ptr, ptr %stmt1, align 8
+  ret ptr %10
+
+merge_block3:                                     ; preds = %merge_block
+  %11 = load ptr, ptr %p, align 8
+  %12 = call ptr @parser_accept_parse(ptr %11, ptr @parser_parse_struct_definition)
+  %stmt4 = alloca ptr, align 8
+  store ptr %12, ptr %stmt4, align 8
+  %13 = load ptr, ptr %stmt4, align 8
+  %14 = icmp ne ptr %13, null
+  br i1 %14, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block3
+  %15 = load ptr, ptr %stmt4, align 8
+  ret ptr %15
+
+merge_block6:                                     ; preds = %merge_block3
+  %16 = load ptr, ptr %p, align 8
+  %17 = call ptr @parser_accept_parse(ptr %16, ptr @parser_parse_struct_instanciation)
+  %stmt7 = alloca ptr, align 8
+  store ptr %17, ptr %stmt7, align 8
+  %18 = load ptr, ptr %stmt7, align 8
+  %19 = icmp ne ptr %18, null
+  br i1 %19, label %then_block8, label %merge_block9
+
+then_block8:                                      ; preds = %merge_block6
+  %20 = load ptr, ptr %stmt7, align 8
+  ret ptr %20
+
+merge_block9:                                     ; preds = %merge_block6
+  %21 = load ptr, ptr %p, align 8
+  %22 = load i64, ptr @TOKEN_LPAREN.34, align 4
+  %23 = call ptr @parser_accept_token(ptr %21, i64 %22)
+  %24 = icmp ne ptr %23, null
+  br i1 %24, label %then_block10, label %merge_block15
+
+then_block10:                                     ; preds = %merge_block9
+  %25 = load ptr, ptr %p, align 8
+  %26 = call ptr @parser_parse_expression(ptr %25)
+  %expr = alloca ptr, align 8
+  store ptr %26, ptr %expr, align 8
+  %27 = load ptr, ptr %expr, align 8
+  %28 = icmp eq ptr %27, null
+  br i1 %28, label %then_block11, label %merge_block12
+
+then_block11:                                     ; preds = %then_block10
+  ret ptr null
+
+merge_block12:                                    ; preds = %then_block10
+  %29 = load ptr, ptr %p, align 8
+  %30 = load i64, ptr @TOKEN_RPAREN.35, align 4
+  %31 = call ptr @parser_accept_token(ptr %29, i64 %30)
+  %32 = icmp eq ptr %31, null
+  br i1 %32, label %then_block13, label %merge_block14
+
+then_block13:                                     ; preds = %merge_block12
+  ret ptr null
+
+merge_block14:                                    ; preds = %merge_block12
+  %33 = load ptr, ptr %expr, align 8
+  ret ptr %33
+
+merge_block15:                                    ; preds = %merge_block9
+  %34 = load ptr, ptr %p, align 8
+  %35 = call ptr @parser_consume_token(ptr %34)
+  %tok = alloca ptr, align 8
+  store ptr %35, ptr %tok, align 8
+  %36 = load ptr, ptr %tok, align 8
+  %37 = icmp eq ptr %36, null
+  br i1 %37, label %then_block16, label %merge_block17
+
+then_block16:                                     ; preds = %merge_block15
+  call void (ptr, ...) @printf(ptr @162)
+  ret ptr null
+
+merge_block17:                                    ; preds = %merge_block15
+  %38 = load ptr, ptr %tok, align 8
+  %type = getelementptr %token.2, ptr %38, i32 0, i32 0
+  %39 = load i64, ptr %type, align 4
+  %40 = load i64, ptr @TOKEN_NULL.18, align 4
+  %41 = icmp eq i64 %39, %40
+  br i1 %41, label %then_block18, label %merge_block20
+
+then_block18:                                     ; preds = %merge_block17
+  %n = alloca %Node, align 8
+  %type19 = getelementptr %Node, ptr %n, i32 0, i32 0
+  %42 = load i64, ptr @NODE_PRIMARY_EXPRESSION_NULL, align 4
+  store i64 %42, ptr %type19, align 4
+  %43 = load ptr, ptr %p, align 8
+  %44 = load %Node, ptr %n, align 8
+  %45 = call ptr @create_node(ptr %43, %Node %44)
+  ret ptr %45
+
+merge_block20:                                    ; preds = %merge_block17
+  %46 = load ptr, ptr %tok, align 8
+  %type21 = getelementptr %token.2, ptr %46, i32 0, i32 0
+  %47 = load i64, ptr %type21, align 4
+  %48 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %49 = icmp eq i64 %47, %48
+  br i1 %49, label %then_block22, label %merge_block27
+
+then_block22:                                     ; preds = %merge_block20
+  %50 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %50, i32 0, i32 3
+  %51 = load ptr, ptr %arena, align 8
+  %52 = call ptr @arena_alloc(ptr %51, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %52, ptr %d, align 8
+  %53 = load ptr, ptr %d, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %53, i32 0, i32 0
+  %54 = load ptr, ptr %tok, align 8
+  %data = getelementptr %token.2, ptr %54, i32 0, i32 1
+  %55 = load ptr, ptr %data, align 8
+  store ptr %55, ptr %name, align 8
+  %56 = load ptr, ptr %d, align 8
+  %type23 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %56, i32 0, i32 1
+  store ptr null, ptr %type23, align 8
+  %n24 = alloca %Node, align 8
+  %type25 = getelementptr %Node, ptr %n24, i32 0, i32 0
+  %57 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  store i64 %57, ptr %type25, align 4
+  %data26 = getelementptr %Node, ptr %n24, i32 0, i32 1
+  %58 = load ptr, ptr %d, align 8
+  store ptr %58, ptr %data26, align 8
+  %59 = load ptr, ptr %p, align 8
+  %60 = load %Node, ptr %n24, align 8
+  %61 = call ptr @create_node(ptr %59, %Node %60)
+  ret ptr %61
+
+merge_block27:                                    ; preds = %merge_block20
+  %62 = load ptr, ptr %tok, align 8
+  %type28 = getelementptr %token.2, ptr %62, i32 0, i32 0
+  %63 = load i64, ptr %type28, align 4
+  %64 = load i64, ptr @TOKEN_NUMBER.16, align 4
+  %65 = icmp eq i64 %63, %64
+  br i1 %65, label %then_block29, label %merge_block36
+
+then_block29:                                     ; preds = %merge_block27
+  %66 = load ptr, ptr %p, align 8
+  %arena30 = getelementptr %parser, ptr %66, i32 0, i32 3
+  %67 = load ptr, ptr %arena30, align 8
+  %68 = call ptr @arena_alloc(ptr %67, i64 8)
+  %d31 = alloca ptr, align 8
+  store ptr %68, ptr %d31, align 8
+  %69 = load ptr, ptr %d31, align 8
+  %value = getelementptr %NODE_PRIMARY_EXPRESSION_NUMBER_DATA, ptr %69, i32 0, i32 0
+  %70 = load ptr, ptr %tok, align 8
+  %data32 = getelementptr %token.2, ptr %70, i32 0, i32 1
+  %71 = load ptr, ptr %data32, align 8
+  %72 = load i64, ptr %71, align 4
+  store i64 %72, ptr %value, align 4
+  %n33 = alloca %Node, align 8
+  %type34 = getelementptr %Node, ptr %n33, i32 0, i32 0
+  %73 = load i64, ptr @NODE_PRIMARY_EXPRESSION_NUMBER, align 4
+  store i64 %73, ptr %type34, align 4
+  %data35 = getelementptr %Node, ptr %n33, i32 0, i32 1
+  %74 = load ptr, ptr %d31, align 8
+  store ptr %74, ptr %data35, align 8
+  %75 = load ptr, ptr %p, align 8
+  %76 = load %Node, ptr %n33, align 8
+  %77 = call ptr @create_node(ptr %75, %Node %76)
+  ret ptr %77
+
+merge_block36:                                    ; preds = %merge_block27
+  %78 = load ptr, ptr %tok, align 8
+  %type37 = getelementptr %token.2, ptr %78, i32 0, i32 0
+  %79 = load i64, ptr %type37, align 4
+  %80 = load i64, ptr @TOKEN_BOOLEAN.17, align 4
+  %81 = icmp eq i64 %79, %80
+  br i1 %81, label %then_block38, label %merge_block46
+
+then_block38:                                     ; preds = %merge_block36
+  %82 = load ptr, ptr %p, align 8
+  %arena39 = getelementptr %parser, ptr %82, i32 0, i32 3
+  %83 = load ptr, ptr %arena39, align 8
+  %84 = call ptr @arena_alloc(ptr %83, i64 1)
+  %d40 = alloca ptr, align 8
+  store ptr %84, ptr %d40, align 8
+  %85 = load ptr, ptr %d40, align 8
+  %value41 = getelementptr %NODE_PRIMARY_EXPRESSION_BOOLEAN_DATA, ptr %85, i32 0, i32 0
+  %86 = load ptr, ptr %tok, align 8
+  %data42 = getelementptr %token.2, ptr %86, i32 0, i32 1
+  %87 = load ptr, ptr %data42, align 8
+  %88 = load i1, ptr %87, align 1
+  store i1 %88, ptr %value41, align 1
+  %n43 = alloca %Node, align 8
+  %type44 = getelementptr %Node, ptr %n43, i32 0, i32 0
+  %89 = load i64, ptr @NODE_PRIMARY_EXPRESSION_BOOLEAN, align 4
+  store i64 %89, ptr %type44, align 4
+  %data45 = getelementptr %Node, ptr %n43, i32 0, i32 1
+  %90 = load ptr, ptr %d40, align 8
+  store ptr %90, ptr %data45, align 8
+  %91 = load ptr, ptr %p, align 8
+  %92 = load %Node, ptr %n43, align 8
+  %93 = call ptr @create_node(ptr %91, %Node %92)
+  ret ptr %93
+
+merge_block46:                                    ; preds = %merge_block36
+  %94 = load ptr, ptr %tok, align 8
+  %type47 = getelementptr %token.2, ptr %94, i32 0, i32 0
+  %95 = load i64, ptr %type47, align 4
+  %96 = load i64, ptr @TOKEN_CHAR.19, align 4
+  %97 = icmp eq i64 %95, %96
+  br i1 %97, label %then_block48, label %merge_block56
+
+then_block48:                                     ; preds = %merge_block46
+  %98 = load ptr, ptr %p, align 8
+  %arena49 = getelementptr %parser, ptr %98, i32 0, i32 3
+  %99 = load ptr, ptr %arena49, align 8
+  %100 = call ptr @arena_alloc(ptr %99, i64 1)
+  %d50 = alloca ptr, align 8
+  store ptr %100, ptr %d50, align 8
+  %101 = load ptr, ptr %d50, align 8
+  %value51 = getelementptr %NODE_PRIMARY_EXPRESSION_CHAR_DATA, ptr %101, i32 0, i32 0
+  %102 = load ptr, ptr %tok, align 8
+  %data52 = getelementptr %token.2, ptr %102, i32 0, i32 1
+  %103 = load ptr, ptr %data52, align 8
+  %104 = load i8, ptr %103, align 1
+  store i8 %104, ptr %value51, align 1
+  %n53 = alloca %Node, align 8
+  %type54 = getelementptr %Node, ptr %n53, i32 0, i32 0
+  %105 = load i64, ptr @NODE_PRIMARY_EXPRESSION_CHAR, align 4
+  store i64 %105, ptr %type54, align 4
+  %data55 = getelementptr %Node, ptr %n53, i32 0, i32 1
+  %106 = load ptr, ptr %d50, align 8
+  store ptr %106, ptr %data55, align 8
+  %107 = load ptr, ptr %p, align 8
+  %108 = load %Node, ptr %n53, align 8
+  %109 = call ptr @create_node(ptr %107, %Node %108)
+  ret ptr %109
+
+merge_block56:                                    ; preds = %merge_block46
+  %110 = load ptr, ptr %tok, align 8
+  %type57 = getelementptr %token.2, ptr %110, i32 0, i32 0
+  %111 = load i64, ptr %type57, align 4
+  %112 = load i64, ptr @TOKEN_STRING.20, align 4
+  %113 = icmp eq i64 %111, %112
+  br i1 %113, label %then_block58, label %merge_block66
+
+then_block58:                                     ; preds = %merge_block56
+  %114 = load ptr, ptr %p, align 8
+  %arena59 = getelementptr %parser, ptr %114, i32 0, i32 3
+  %115 = load ptr, ptr %arena59, align 8
+  %116 = call ptr @arena_alloc(ptr %115, i64 8)
+  %d60 = alloca ptr, align 8
+  store ptr %116, ptr %d60, align 8
+  %117 = load ptr, ptr %d60, align 8
+  %value61 = getelementptr %NODE_PRIMARY_EXPRESSION_STRING_DATA, ptr %117, i32 0, i32 0
+  %118 = load ptr, ptr %tok, align 8
+  %data62 = getelementptr %token.2, ptr %118, i32 0, i32 1
+  %119 = load ptr, ptr %data62, align 8
+  store ptr %119, ptr %value61, align 8
+  %n63 = alloca %Node, align 8
+  %type64 = getelementptr %Node, ptr %n63, i32 0, i32 0
+  %120 = load i64, ptr @NODE_PRIMARY_EXPRESSION_STRING, align 4
+  store i64 %120, ptr %type64, align 4
+  %data65 = getelementptr %Node, ptr %n63, i32 0, i32 1
+  %121 = load ptr, ptr %d60, align 8
+  store ptr %121, ptr %data65, align 8
+  %122 = load ptr, ptr %p, align 8
+  %123 = load %Node, ptr %n63, align 8
+  %124 = call ptr @create_node(ptr %122, %Node %123)
+  ret ptr %124
+
+merge_block66:                                    ; preds = %merge_block56
+  ret ptr null
+}
+
+define ptr @parser_parse_field_access(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_parse_primary_expression(ptr %1)
+  %expression = alloca ptr, align 8
+  store ptr %2, ptr %expression, align 8
+  %3 = load ptr, ptr %expression, align 8
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = load i64, ptr @TOKEN_DOT.30, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %9 = load ptr, ptr %p, align 8
+  %10 = load i64, ptr @TOKEN_IDENTIFIER.15, align 4
+  %11 = call ptr @parser_accept_token(ptr %9, i64 %10)
+  %ident = alloca ptr, align 8
+  store ptr %11, ptr %ident, align 8
+  %12 = load ptr, ptr %ident, align 8
+  %13 = icmp eq ptr %12, null
+  br i1 %13, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %14 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %14, i32 0, i32 3
+  %15 = load ptr, ptr %arena, align 8
+  %16 = call ptr @arena_alloc(ptr %15, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %16, ptr %d, align 8
+  %17 = load ptr, ptr %d, align 8
+  %expression5 = getelementptr %NODE_FIELD_ACCESS_DATA, ptr %17, i32 0, i32 0
+  %18 = load ptr, ptr %expression, align 8
+  store ptr %18, ptr %expression5, align 8
+  %19 = load ptr, ptr %d, align 8
+  %name = getelementptr %NODE_FIELD_ACCESS_DATA, ptr %19, i32 0, i32 1
+  %20 = load ptr, ptr %ident, align 8
+  %data = getelementptr %token.2, ptr %20, i32 0, i32 1
+  %21 = load ptr, ptr %data, align 8
+  store ptr %21, ptr %name, align 8
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %22 = load i64, ptr @NODE_FIELD_ACCESS, align 4
+  store i64 %22, ptr %type, align 4
+  %data6 = getelementptr %Node, ptr %n, i32 0, i32 1
+  %23 = load ptr, ptr %d, align 8
+  store ptr %23, ptr %data6, align 8
+  %24 = load ptr, ptr %p, align 8
+  %25 = load %Node, ptr %n, align 8
+  %26 = call ptr @create_node(ptr %24, %Node %25)
+  ret ptr %26
+}
+
+define ptr @parser_parse_equality_expression(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_parse_additive_expression(ptr %1)
+  %lhs = alloca ptr, align 8
+  store ptr %2, ptr %lhs, align 8
+  %3 = load ptr, ptr %lhs, align 8
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %typ = alloca i64, align 8
+  store i64 -1, ptr %typ, align 4
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr @parser_accept_parse(ptr %5, ptr @unnamed_func.43)
+  %ex = alloca ptr, align 8
+  store ptr %6, ptr %ex, align 8
+  %7 = load ptr, ptr %ex, align 8
+  %8 = icmp ne ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  %9 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_EQ, align 4
+  store i64 %9, ptr %typ, align 4
+  br label %merge_block2
+
+merge_block2:                                     ; preds = %merge_block, %then_block1
+  %10 = load i64, ptr %typ, align 4
+  %11 = icmp eq i64 %10, -1
+  br i1 %11, label %then_block3, label %merge_block6
+
+then_block3:                                      ; preds = %merge_block2
+  %12 = load ptr, ptr %p, align 8
+  %13 = call ptr @parser_accept_parse(ptr %12, ptr @unnamed_func.44)
+  store ptr %13, ptr %ex, align 8
+  %14 = load ptr, ptr %ex, align 8
+  %15 = icmp ne ptr %14, null
+  br i1 %15, label %then_block4, label %merge_block5
+
+then_block4:                                      ; preds = %then_block3
+  %16 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_NE, align 4
+  store i64 %16, ptr %typ, align 4
+  br label %merge_block5
+
+merge_block5:                                     ; preds = %then_block3, %then_block4
+  br label %merge_block6
+
+merge_block6:                                     ; preds = %merge_block2, %merge_block5
+  %17 = load i64, ptr %typ, align 4
+  %18 = icmp eq i64 %17, -1
+  br i1 %18, label %then_block7, label %merge_block10
+
+then_block7:                                      ; preds = %merge_block6
+  %19 = load ptr, ptr %p, align 8
+  %20 = call ptr @parser_accept_parse(ptr %19, ptr @unnamed_func.45)
+  store ptr %20, ptr %ex, align 8
+  %21 = load ptr, ptr %ex, align 8
+  %22 = icmp ne ptr %21, null
+  br i1 %22, label %then_block8, label %merge_block9
+
+then_block8:                                      ; preds = %then_block7
+  %23 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_LE, align 4
+  store i64 %23, ptr %typ, align 4
+  br label %merge_block9
+
+merge_block9:                                     ; preds = %then_block7, %then_block8
+  br label %merge_block10
+
+merge_block10:                                    ; preds = %merge_block6, %merge_block9
+  %24 = load i64, ptr %typ, align 4
+  %25 = icmp eq i64 %24, -1
+  br i1 %25, label %then_block11, label %merge_block14
+
+then_block11:                                     ; preds = %merge_block10
+  %26 = load ptr, ptr %p, align 8
+  %27 = call ptr @parser_accept_parse(ptr %26, ptr @unnamed_func.46)
+  store ptr %27, ptr %ex, align 8
+  %28 = load ptr, ptr %ex, align 8
+  %29 = icmp ne ptr %28, null
+  br i1 %29, label %then_block12, label %merge_block13
+
+then_block12:                                     ; preds = %then_block11
+  %30 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_GE, align 4
+  store i64 %30, ptr %typ, align 4
+  br label %merge_block13
+
+merge_block13:                                    ; preds = %then_block11, %then_block12
+  br label %merge_block14
+
+merge_block14:                                    ; preds = %merge_block10, %merge_block13
+  %31 = load i64, ptr %typ, align 4
+  %32 = icmp eq i64 %31, -1
+  br i1 %32, label %then_block15, label %merge_block18
+
+then_block15:                                     ; preds = %merge_block14
+  %33 = load ptr, ptr %p, align 8
+  %34 = load i64, ptr @TOKEN_LESS.28, align 4
+  %35 = call ptr @parser_accept_token(ptr %33, i64 %34)
+  %36 = icmp ne ptr %35, null
+  br i1 %36, label %then_block16, label %merge_block17
+
+then_block16:                                     ; preds = %then_block15
+  %37 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_LT, align 4
+  store i64 %37, ptr %typ, align 4
+  br label %merge_block17
+
+merge_block17:                                    ; preds = %then_block15, %then_block16
+  br label %merge_block18
+
+merge_block18:                                    ; preds = %merge_block14, %merge_block17
+  %38 = load i64, ptr %typ, align 4
+  %39 = icmp eq i64 %38, -1
+  br i1 %39, label %then_block19, label %merge_block22
+
+then_block19:                                     ; preds = %merge_block18
+  %40 = load ptr, ptr %p, align 8
+  %41 = load i64, ptr @TOKEN_GREATER.29, align 4
+  %42 = call ptr @parser_accept_token(ptr %40, i64 %41)
+  %43 = icmp ne ptr %42, null
+  br i1 %43, label %then_block20, label %merge_block21
+
+then_block20:                                     ; preds = %then_block19
+  %44 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_GT, align 4
+  store i64 %44, ptr %typ, align 4
+  br label %merge_block21
+
+merge_block21:                                    ; preds = %then_block19, %then_block20
+  br label %merge_block22
+
+merge_block22:                                    ; preds = %merge_block18, %merge_block21
+  %45 = load i64, ptr %typ, align 4
+  %46 = icmp eq i64 %45, -1
+  br i1 %46, label %then_block23, label %merge_block24
+
+then_block23:                                     ; preds = %merge_block22
+  ret ptr null
+
+merge_block24:                                    ; preds = %merge_block22
+  %47 = load ptr, ptr %p, align 8
+  %48 = call ptr @parser_parse_additive_expression(ptr %47)
+  %rhs = alloca ptr, align 8
+  store ptr %48, ptr %rhs, align 8
+  %49 = load ptr, ptr %rhs, align 8
+  %50 = icmp eq ptr %49, null
+  br i1 %50, label %then_block25, label %merge_block26
+
+then_block25:                                     ; preds = %merge_block24
+  ret ptr null
+
+merge_block26:                                    ; preds = %merge_block24
+  %51 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %51, i32 0, i32 3
+  %52 = load ptr, ptr %arena, align 8
+  %53 = call ptr @arena_alloc(ptr %52, i64 24)
+  %d = alloca ptr, align 8
+  store ptr %53, ptr %d, align 8
+  %54 = load ptr, ptr %d, align 8
+  %lhs27 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %54, i32 0, i32 0
+  %55 = load ptr, ptr %lhs, align 8
+  store ptr %55, ptr %lhs27, align 8
+  %56 = load ptr, ptr %d, align 8
+  %rhs28 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %56, i32 0, i32 1
+  %57 = load ptr, ptr %rhs, align 8
+  store ptr %57, ptr %rhs28, align 8
+  %58 = load ptr, ptr %d, align 8
+  %typ29 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %58, i32 0, i32 2
+  %59 = load i64, ptr %typ, align 4
+  store i64 %59, ptr %typ29, align 4
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %60 = load i64, ptr @NODE_EQUALITY_EXPRESSION, align 4
+  store i64 %60, ptr %type, align 4
+  %data = getelementptr %Node, ptr %n, i32 0, i32 1
+  %61 = load ptr, ptr %d, align 8
+  store ptr %61, ptr %data, align 8
+  %62 = load ptr, ptr %p, align 8
+  %63 = load %Node, ptr %n, align 8
+  %64 = call ptr @create_node(ptr %62, %Node %63)
+  ret ptr %64
+}
+
+define ptr @unnamed_func.43(ptr %0) {
+entrypoint:
+  %ip = alloca ptr, align 8
+  store ptr %0, ptr %ip, align 8
+  %1 = load ptr, ptr %ip, align 8
+  %2 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %ip, align 8
+  %6 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %n = alloca %Node, align 8
+  %9 = load ptr, ptr %ip, align 8
+  %10 = load %Node, ptr %n, align 8
+  %11 = call ptr @create_node(ptr %9, %Node %10)
+  ret ptr %11
+}
+
+define ptr @unnamed_func.44(ptr %0) {
+entrypoint:
+  %ip = alloca ptr, align 8
+  store ptr %0, ptr %ip, align 8
+  %1 = load ptr, ptr %ip, align 8
+  %2 = load i64, ptr @TOKEN_BANG.27, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %ip, align 8
+  %6 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %n = alloca %Node, align 8
+  %9 = load ptr, ptr %ip, align 8
+  %10 = load %Node, ptr %n, align 8
+  %11 = call ptr @create_node(ptr %9, %Node %10)
+  ret ptr %11
+}
+
+define ptr @unnamed_func.45(ptr %0) {
+entrypoint:
+  %ip = alloca ptr, align 8
+  store ptr %0, ptr %ip, align 8
+  %1 = load ptr, ptr %ip, align 8
+  %2 = load i64, ptr @TOKEN_LESS.28, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %ip, align 8
+  %6 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %n = alloca %Node, align 8
+  %9 = load ptr, ptr %ip, align 8
+  %10 = load %Node, ptr %n, align 8
+  %11 = call ptr @create_node(ptr %9, %Node %10)
+  ret ptr %11
+}
+
+define ptr @unnamed_func.46(ptr %0) {
+entrypoint:
+  %ip = alloca ptr, align 8
+  store ptr %0, ptr %ip, align 8
+  %1 = load ptr, ptr %ip, align 8
+  %2 = load i64, ptr @TOKEN_GREATER.29, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %ip, align 8
+  %6 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %n = alloca %Node, align 8
+  %9 = load ptr, ptr %ip, align 8
+  %10 = load %Node, ptr %n, align 8
+  %11 = call ptr @create_node(ptr %9, %Node %10)
+  ret ptr %11
+}
+
+define ptr @parser_parse_postfix_expression(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_accept_parse(ptr %1, ptr @parser_parse_cast_statement)
+  %ex = alloca ptr, align 8
+  store ptr %2, ptr %ex, align 8
+  %3 = load ptr, ptr %ex, align 8
+  %4 = icmp ne ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %5 = load ptr, ptr %ex, align 8
+  ret ptr %5
+
+merge_block:                                      ; preds = %entrypoint
+  %6 = load ptr, ptr %p, align 8
+  %7 = call ptr @parser_accept_parse(ptr %6, ptr @parser_parse_sizeof_statement)
+  %ex1 = alloca ptr, align 8
+  store ptr %7, ptr %ex1, align 8
+  %8 = load ptr, ptr %ex1, align 8
+  %9 = icmp ne ptr %8, null
+  br i1 %9, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %merge_block
+  %10 = load ptr, ptr %ex1, align 8
+  ret ptr %10
+
+merge_block3:                                     ; preds = %merge_block
+  %11 = load ptr, ptr %p, align 8
+  %12 = call ptr @parser_accept_parse(ptr %11, ptr @parse_function_call_statement)
+  %ex4 = alloca ptr, align 8
+  store ptr %12, ptr %ex4, align 8
+  %13 = load ptr, ptr %ex4, align 8
+  %14 = icmp ne ptr %13, null
+  br i1 %14, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block3
+  %15 = load ptr, ptr %ex4, align 8
+  ret ptr %15
+
+merge_block6:                                     ; preds = %merge_block3
+  %16 = load ptr, ptr %p, align 8
+  %17 = call ptr @parser_accept_parse(ptr %16, ptr @parser_parse_field_access)
+  %ex7 = alloca ptr, align 8
+  store ptr %17, ptr %ex7, align 8
+  %18 = load ptr, ptr %ex7, align 8
+  %19 = icmp ne ptr %18, null
+  br i1 %19, label %then_block8, label %merge_block9
+
+then_block8:                                      ; preds = %merge_block6
+  %20 = load ptr, ptr %ex7, align 8
+  ret ptr %20
+
+merge_block9:                                     ; preds = %merge_block6
+  %21 = load ptr, ptr %p, align 8
+  %22 = call ptr @parser_parse_primary_expression(ptr %21)
+  ret ptr %22
+}
+
+define ptr @parser_parse_unary_expression(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %typ = alloca i64, align 8
+  store i64 -1, ptr %typ, align 4
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_BANG.27, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp ne ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %5 = load i64, ptr @UNARY_EXPRESSION_TYPE_NOT, align 4
+  store i64 %5, ptr %typ, align 4
+  br label %merge_block
+
+merge_block:                                      ; preds = %entrypoint, %then_block
+  %6 = load i64, ptr %typ, align 4
+  %7 = icmp eq i64 %6, -1
+  br i1 %7, label %then_block1, label %merge_block4
+
+then_block1:                                      ; preds = %merge_block
+  %8 = load ptr, ptr %p, align 8
+  %9 = load i64, ptr @TOKEN_MINUS.23, align 4
+  %10 = call ptr @parser_accept_token(ptr %8, i64 %9)
+  %11 = icmp ne ptr %10, null
+  br i1 %11, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %then_block1
+  %12 = load i64, ptr @UNARY_EXPRESSION_TYPE_MINUS, align 4
+  store i64 %12, ptr %typ, align 4
+  br label %merge_block3
+
+merge_block3:                                     ; preds = %then_block1, %then_block2
+  br label %merge_block4
+
+merge_block4:                                     ; preds = %merge_block, %merge_block3
+  %13 = load i64, ptr %typ, align 4
+  %14 = icmp eq i64 %13, -1
+  br i1 %14, label %then_block5, label %merge_block8
+
+then_block5:                                      ; preds = %merge_block4
+  %15 = load ptr, ptr %p, align 8
+  %16 = load i64, ptr @TOKEN_MUL.24, align 4
+  %17 = call ptr @parser_accept_token(ptr %15, i64 %16)
+  %18 = icmp ne ptr %17, null
+  br i1 %18, label %then_block6, label %merge_block7
+
+then_block6:                                      ; preds = %then_block5
+  %19 = load i64, ptr @UNARY_EXPRESSION_TYPE_STAR, align 4
+  store i64 %19, ptr %typ, align 4
+  br label %merge_block7
+
+merge_block7:                                     ; preds = %then_block5, %then_block6
+  br label %merge_block8
+
+merge_block8:                                     ; preds = %merge_block4, %merge_block7
+  %20 = load i64, ptr %typ, align 4
+  %21 = icmp eq i64 %20, -1
+  br i1 %21, label %then_block9, label %merge_block10
+
+then_block9:                                      ; preds = %merge_block8
+  %22 = load ptr, ptr %p, align 8
+  %23 = call ptr @parser_parse_postfix_expression(ptr %22)
+  ret ptr %23
+
+merge_block10:                                    ; preds = %merge_block8
+  %24 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %24, i32 0, i32 3
+  %25 = load ptr, ptr %arena, align 8
+  %26 = call ptr @arena_alloc(ptr %25, i64 16)
+  %new_lhs_data = alloca ptr, align 8
+  store ptr %26, ptr %new_lhs_data, align 8
+  %27 = load ptr, ptr %new_lhs_data, align 8
+  %typ11 = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %27, i32 0, i32 0
+  %28 = load i64, ptr %typ, align 4
+  store i64 %28, ptr %typ11, align 4
+  %29 = load ptr, ptr %p, align 8
+  %30 = call ptr @parser_parse_unary_expression(ptr %29)
+  %e = alloca ptr, align 8
+  store ptr %30, ptr %e, align 8
+  %31 = load ptr, ptr %e, align 8
+  %32 = icmp eq ptr %31, null
+  br i1 %32, label %then_block12, label %merge_block13
+
+then_block12:                                     ; preds = %merge_block10
+  ret ptr null
+
+merge_block13:                                    ; preds = %merge_block10
+  %33 = load ptr, ptr %new_lhs_data, align 8
+  %expression = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %33, i32 0, i32 1
+  %34 = load ptr, ptr %e, align 8
+  store ptr %34, ptr %expression, align 8
+  %new_lhs = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %new_lhs, i32 0, i32 0
+  %35 = load i64, ptr @NODE_UNARY_EXPRESSION, align 4
+  store i64 %35, ptr %type, align 4
+  %data = getelementptr %Node, ptr %new_lhs, i32 0, i32 1
+  %36 = load ptr, ptr %new_lhs_data, align 8
+  store ptr %36, ptr %data, align 8
+  %37 = load ptr, ptr %p, align 8
+  %38 = load %Node, ptr %new_lhs, align 8
+  %39 = call ptr @create_node(ptr %37, %Node %38)
+  ret ptr %39
+}
+
+define ptr @parser_parse_multiplicative_expression(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parser_parse_unary_expression(ptr %1)
+  %lhs = alloca ptr, align 8
+  store ptr %2, ptr %lhs, align 8
+  %3 = load ptr, ptr %lhs, align 8
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block10, %merge_block
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %typ = alloca i64, align 8
+  store i64 -1, ptr %typ, align 4
+  %5 = load ptr, ptr %p, align 8
+  %6 = load i64, ptr @TOKEN_MUL.24, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp ne ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+outer_block:                                      ; preds = %then_block7, %while_block
+  %9 = load ptr, ptr %lhs, align 8
+  ret ptr %9
+
+then_block1:                                      ; preds = %inner_block
+  %10 = load i64, ptr @MULTIPLICATIVE_EXPRESSION_TYPE_MUL, align 4
+  store i64 %10, ptr %typ, align 4
+  br label %merge_block2
+
+merge_block2:                                     ; preds = %inner_block, %then_block1
+  %11 = load ptr, ptr %p, align 8
+  %12 = load i64, ptr @TOKEN_DIV.25, align 4
+  %13 = call ptr @parser_accept_token(ptr %11, i64 %12)
+  %14 = icmp ne ptr %13, null
+  br i1 %14, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  %15 = load i64, ptr @MULTIPLICATIVE_EXPRESSION_TYPE_DIV, align 4
+  store i64 %15, ptr %typ, align 4
+  br label %merge_block4
+
+merge_block4:                                     ; preds = %merge_block2, %then_block3
+  %16 = load ptr, ptr %p, align 8
+  %17 = load i64, ptr @TOKEN_MOD.26, align 4
+  %18 = call ptr @parser_accept_token(ptr %16, i64 %17)
+  %19 = icmp ne ptr %18, null
+  br i1 %19, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  %20 = load i64, ptr @MULTIPLICATIVE_EXPRESSION_TYPE_MOD, align 4
+  store i64 %20, ptr %typ, align 4
+  br label %merge_block6
+
+merge_block6:                                     ; preds = %merge_block4, %then_block5
+  %21 = load i64, ptr %typ, align 4
+  %22 = icmp eq i64 %21, -1
+  br i1 %22, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  br label %outer_block
+
+merge_block8:                                     ; preds = %merge_block6
+  %23 = load ptr, ptr %p, align 8
+  %24 = call ptr @parser_parse_unary_expression(ptr %23)
+  %rhs = alloca ptr, align 8
+  store ptr %24, ptr %rhs, align 8
+  %25 = load ptr, ptr %rhs, align 8
+  %26 = icmp eq ptr %25, null
+  br i1 %26, label %then_block9, label %merge_block10
+
+then_block9:                                      ; preds = %merge_block8
+  ret ptr null
+
+merge_block10:                                    ; preds = %merge_block8
+  %27 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %27, i32 0, i32 3
+  %28 = load ptr, ptr %arena, align 8
+  %29 = call ptr @arena_alloc(ptr %28, i64 24)
+  %new_lhs_data = alloca ptr, align 8
+  store ptr %29, ptr %new_lhs_data, align 8
+  %30 = load ptr, ptr %new_lhs_data, align 8
+  %lhs11 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %30, i32 0, i32 0
+  %31 = load ptr, ptr %lhs, align 8
+  store ptr %31, ptr %lhs11, align 8
+  %32 = load ptr, ptr %new_lhs_data, align 8
+  %rhs12 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %32, i32 0, i32 1
+  %33 = load ptr, ptr %rhs, align 8
+  store ptr %33, ptr %rhs12, align 8
+  %34 = load ptr, ptr %new_lhs_data, align 8
+  %typ13 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %34, i32 0, i32 2
+  %35 = load i64, ptr %typ, align 4
+  store i64 %35, ptr %typ13, align 4
+  %new_lhs = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %new_lhs, i32 0, i32 0
+  %36 = load i64, ptr @NODE_MULTIPLICATIVE_EXPRESSION, align 4
+  store i64 %36, ptr %type, align 4
+  %data = getelementptr %Node, ptr %new_lhs, i32 0, i32 1
+  %37 = load ptr, ptr %new_lhs_data, align 8
+  store ptr %37, ptr %data, align 8
+  %38 = load ptr, ptr %p, align 8
+  %39 = load %Node, ptr %new_lhs, align 8
+  %40 = call ptr @create_node(ptr %38, %Node %39)
+  store ptr %40, ptr %lhs, align 8
+  br label %while_block
+}
+
+define ptr @parse_assignment_statement(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %is_declaration = alloca i1, align 1
+  store i1 false, ptr %is_declaration, align 1
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_LET.5, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp ne ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  store i1 true, ptr %is_declaration, align 1
+  br label %merge_block
+
+merge_block:                                      ; preds = %entrypoint, %then_block
+  %is_dereference = alloca i1, align 1
+  store i1 false, ptr %is_dereference, align 1
+  %5 = load ptr, ptr %p, align 8
+  %6 = load i64, ptr @TOKEN_MUL.24, align 4
+  %7 = call ptr @parser_accept_token(ptr %5, i64 %6)
+  %8 = icmp ne ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  store i1 true, ptr %is_dereference, align 1
+  br label %merge_block2
+
+merge_block2:                                     ; preds = %merge_block, %then_block1
+  %9 = load ptr, ptr %p, align 8
+  %10 = call ptr @parser_parse_expression(ptr %9)
+  %lhs = alloca ptr, align 8
+  store ptr %10, ptr %lhs, align 8
+  %11 = load ptr, ptr %lhs, align 8
+  %12 = icmp eq ptr %11, null
+  br i1 %12, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  ret ptr null
+
+merge_block4:                                     ; preds = %merge_block2
+  %13 = load ptr, ptr %p, align 8
+  %14 = load i64, ptr @TOKEN_EQUALS.21, align 4
+  %15 = call ptr @parser_accept_token(ptr %13, i64 %14)
+  %16 = icmp eq ptr %15, null
+  br i1 %16, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block4
+  ret ptr null
+
+merge_block6:                                     ; preds = %merge_block4
+  %17 = load ptr, ptr %p, align 8
+  %18 = call ptr @parser_parse_expression(ptr %17)
+  %rhs = alloca ptr, align 8
+  store ptr %18, ptr %rhs, align 8
+  %19 = load ptr, ptr %rhs, align 8
+  %20 = icmp eq ptr %19, null
+  br i1 %20, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block6
+  ret ptr null
+
+merge_block8:                                     ; preds = %merge_block6
+  %21 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %21, i32 0, i32 3
+  %22 = load ptr, ptr %arena, align 8
+  %23 = call ptr @arena_alloc(ptr %22, i64 24)
+  %d = alloca ptr, align 8
+  store ptr %23, ptr %d, align 8
+  %24 = load ptr, ptr %d, align 8
+  %is_declaration9 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %24, i32 0, i32 0
+  %25 = load i1, ptr %is_declaration, align 1
+  store i1 %25, ptr %is_declaration9, align 1
+  %26 = load ptr, ptr %d, align 8
+  %is_dereference10 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %26, i32 0, i32 1
+  %27 = load i1, ptr %is_dereference, align 1
+  store i1 %27, ptr %is_dereference10, align 1
+  %28 = load ptr, ptr %d, align 8
+  %lhs11 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %28, i32 0, i32 2
+  %29 = load ptr, ptr %lhs, align 8
+  store ptr %29, ptr %lhs11, align 8
+  %30 = load ptr, ptr %d, align 8
+  %rhs12 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %30, i32 0, i32 3
+  %31 = load ptr, ptr %rhs, align 8
+  store ptr %31, ptr %rhs12, align 8
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %32 = load i64, ptr @NODE_ASSIGNMENT_STATEMENT, align 4
+  store i64 %32, ptr %type, align 4
+  %data = getelementptr %Node, ptr %n, i32 0, i32 1
+  %33 = load ptr, ptr %d, align 8
+  store ptr %33, ptr %data, align 8
+  %34 = load ptr, ptr %p, align 8
+  %35 = load %Node, ptr %n, align 8
+  %36 = call ptr @create_node(ptr %34, %Node %35)
+  ret ptr %36
+}
+
+define ptr @parse(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = call ptr @parse_program(ptr %1)
+  ret ptr %2
+}
+
+define ptr @parser_parse_import_declaration(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %2 = load i64, ptr @TOKEN_IMPORT.4, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %5 = load ptr, ptr %p, align 8
+  %6 = call ptr @parser_parse_primary_expression(ptr %5)
+  %expr = alloca ptr, align 8
+  store ptr %6, ptr %expr, align 8
+  %7 = load ptr, ptr %expr, align 8
+  %8 = icmp eq ptr %7, null
+  br i1 %8, label %then_block1, label %merge_block2
+
+then_block1:                                      ; preds = %merge_block
+  ret ptr null
+
+merge_block2:                                     ; preds = %merge_block
+  %9 = load ptr, ptr %expr, align 8
+  %type = getelementptr %Node, ptr %9, i32 0, i32 0
+  %10 = load i64, ptr %type, align 4
+  %11 = load i64, ptr @NODE_PRIMARY_EXPRESSION_STRING, align 4
+  %12 = icmp eq i64 %10, %11
+  call void @assert(i1 %12)
+  %13 = load ptr, ptr %expr, align 8
+  %data = getelementptr %Node, ptr %13, i32 0, i32 1
+  %14 = load ptr, ptr %data, align 8
+  %value = getelementptr %NODE_PRIMARY_EXPRESSION_STRING_DATA, ptr %14, i32 0, i32 0
+  %15 = load ptr, ptr %value, align 8
+  %impor_filename = alloca ptr, align 8
+  store ptr %15, ptr %impor_filename, align 8
+  %16 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %16, i32 0, i32 3
+  %17 = load ptr, ptr %arena, align 8
+  %18 = call ptr @arena_alloc(ptr %17, i64 70)
+  %current_file = alloca ptr, align 8
+  store ptr %18, ptr %current_file, align 8
+  %19 = load ptr, ptr %current_file, align 8
+  %20 = load ptr, ptr %p, align 8
+  %filename = getelementptr %parser, ptr %20, i32 0, i32 4
+  %21 = load ptr, ptr %filename, align 8
+  %22 = call ptr @strcpy(ptr %19, ptr %21)
+  %23 = load ptr, ptr %impor_filename, align 8
+  %24 = load i8, ptr %23, align 1
+  %25 = icmp eq i8 %24, 33
+  br i1 %25, label %then_block3, label %merge_block5
+
+then_block3:                                      ; preds = %merge_block2
+  %26 = load ptr, ptr %p, align 8
+  %arena4 = getelementptr %parser, ptr %26, i32 0, i32 3
+  %27 = load ptr, ptr %arena4, align 8
+  %28 = call ptr @arena_alloc(ptr %27, i64 70)
+  %buf = alloca ptr, align 8
+  store ptr %28, ptr %buf, align 8
+  %29 = load ptr, ptr %buf, align 8
+  %30 = load ptr, ptr %impor_filename, align 8
+  %31 = getelementptr i8, ptr %30, i64 1
+  call void (ptr, ptr, ...) @sprintf(ptr %29, ptr @163, ptr %31)
+  %32 = load ptr, ptr %buf, align 8
+  store ptr %32, ptr %impor_filename, align 8
+  store ptr @164, ptr %current_file, align 8
+  br label %merge_block5
+
+merge_block5:                                     ; preds = %merge_block2, %then_block3
+  %33 = load ptr, ptr %current_file, align 8
+  %34 = call ptr @dirname(ptr %33)
+  %dirpath = alloca ptr, align 8
+  store ptr %34, ptr %dirpath, align 8
+  %35 = load ptr, ptr %dirpath, align 8
+  %36 = call i64 @open(ptr %35, i64 0)
+  %dir = alloca i64, align 8
+  store i64 %36, ptr %dir, align 4
+  %37 = load i64, ptr %dir, align 4
+  %38 = icmp ne i64 %37, -1
+  call void @assert(i1 %38)
+  %39 = load i64, ptr %dir, align 4
+  %40 = load ptr, ptr %impor_filename, align 8
+  %41 = call i64 @openat(i64 %39, ptr %40, i64 0)
+  %file = alloca i64, align 8
+  store i64 %41, ptr %file, align 4
+  %42 = load i64, ptr %file, align 4
+  %43 = icmp ne i64 %42, -1
+  call void @assert(i1 %43)
+  %44 = load i64, ptr %file, align 4
+  %45 = call i64 @lseek(i64 %44, i64 0, i64 2)
+  %file_size = alloca i64, align 8
+  store i64 %45, ptr %file_size, align 4
+  %46 = load i64, ptr %file, align 4
+  %47 = call i64 @lseek(i64 %46, i64 0, i64 0)
+  %48 = load ptr, ptr %p, align 8
+  %arena6 = getelementptr %parser, ptr %48, i32 0, i32 3
+  %49 = load ptr, ptr %arena6, align 8
+  %50 = load i64, ptr %file_size, align 4
+  %51 = add i64 %50, 1
+  %52 = call ptr @arena_alloc(ptr %49, i64 %51)
+  %file_contents = alloca ptr, align 8
+  store ptr %52, ptr %file_contents, align 8
+  %53 = load i64, ptr %file, align 4
+  %54 = load ptr, ptr %file_contents, align 8
+  %55 = load i64, ptr %file_size, align 4
+  %56 = call i64 @read(i64 %53, ptr %54, i64 %55)
+  %bytes_read = alloca i64, align 8
+  store i64 %56, ptr %bytes_read, align 4
+  %57 = load ptr, ptr %file_contents, align 8
+  %58 = load i64, ptr %bytes_read, align 4
+  %59 = getelementptr i8, ptr %57, i64 %58
+  store i8 0, ptr %59, align 1
+  %f = alloca %slice, align 8
+  %data7 = getelementptr %slice, ptr %f, i32 0, i32 0
+  %60 = load ptr, ptr %file_contents, align 8
+  store ptr %60, ptr %data7, align 8
+  %data_len = getelementptr %slice, ptr %f, i32 0, i32 1
+  %61 = load i64, ptr %file_size, align 4
+  store i64 %61, ptr %data_len, align 4
+  %62 = load ptr, ptr %p, align 8
+  %arena8 = getelementptr %parser, ptr %62, i32 0, i32 3
+  %63 = load ptr, ptr %arena8, align 8
+  %64 = load %slice, ptr %f, align 8
+  %65 = call ptr @tokenizer_init(ptr %63, %slice %64)
+  %inner_tokenizer = alloca ptr, align 8
+  store ptr %65, ptr %inner_tokenizer, align 8
+  %66 = load ptr, ptr %inner_tokenizer, align 8
+  %67 = call %slice @tokenizer_tokenize(ptr %66)
+  %tokens = alloca %slice, align 8
+  store %slice %67, ptr %tokens, align 8
+  %68 = load ptr, ptr %p, align 8
+  %arena9 = getelementptr %parser, ptr %68, i32 0, i32 3
+  %69 = load ptr, ptr %arena9, align 8
+  %70 = call ptr @arena_alloc(ptr %69, i64 90)
+  %buf2 = alloca ptr, align 8
+  store ptr %70, ptr %buf2, align 8
+  %71 = load ptr, ptr %buf2, align 8
+  %72 = load ptr, ptr %dirpath, align 8
+  %73 = call ptr @strcpy(ptr %71, ptr %72)
+  %74 = load ptr, ptr %buf2, align 8
+  %75 = load ptr, ptr %dirpath, align 8
+  %76 = call i64 @strlen(ptr %75)
+  %77 = getelementptr i8, ptr %74, i64 %76
+  store i8 47, ptr %77, align 1
+  %78 = load ptr, ptr %buf2, align 8
+  %79 = load ptr, ptr %dirpath, align 8
+  %80 = call i64 @strlen(ptr %79)
+  %81 = add i64 %80, 1
+  %82 = getelementptr i8, ptr %78, i64 %81
+  %83 = load ptr, ptr %impor_filename, align 8
+  %84 = call ptr @strcpy(ptr %82, ptr %83)
+  %85 = load ptr, ptr %buf2, align 8
+  %86 = call ptr @realpath(ptr %85, ptr null)
+  %full_path = alloca ptr, align 8
+  store ptr %86, ptr %full_path, align 8
+  %data10 = getelementptr %slice, ptr %tokens, i32 0, i32 0
+  %87 = load ptr, ptr %data10, align 8
+  %data_len11 = getelementptr %slice, ptr %tokens, i32 0, i32 1
+  %88 = load i64, ptr %data_len11, align 4
+  %89 = load ptr, ptr %p, align 8
+  %arena12 = getelementptr %parser, ptr %89, i32 0, i32 3
+  %90 = load ptr, ptr %arena12, align 8
+  %91 = load ptr, ptr %full_path, align 8
+  %92 = call ptr @parser_init(ptr %87, i64 %88, ptr %90, ptr %91)
+  %inner_parser = alloca ptr, align 8
+  store ptr %92, ptr %inner_parser, align 8
+  %93 = load ptr, ptr %inner_parser, align 8
+  %94 = call ptr @parse(ptr %93)
+  %ast = alloca ptr, align 8
+  store ptr %94, ptr %ast, align 8
+  %95 = load ptr, ptr %p, align 8
+  %arena13 = getelementptr %parser, ptr %95, i32 0, i32 3
+  %96 = load ptr, ptr %arena13, align 8
+  %97 = call ptr @arena_alloc(ptr %96, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %97, ptr %d, align 8
+  %98 = load ptr, ptr %d, align 8
+  %filename14 = getelementptr %NODE_IMPORT_DECLARATION_DATA, ptr %98, i32 0, i32 0
+  %99 = load ptr, ptr %impor_filename, align 8
+  store ptr %99, ptr %filename14, align 8
+  %100 = load ptr, ptr %d, align 8
+  %program = getelementptr %NODE_IMPORT_DECLARATION_DATA, ptr %100, i32 0, i32 1
+  %101 = load ptr, ptr %ast, align 8
+  store ptr %101, ptr %program, align 8
+  %n = alloca %Node, align 8
+  %type15 = getelementptr %Node, ptr %n, i32 0, i32 0
+  %102 = load i64, ptr @NODE_IMPORT_DECLARATION, align 4
+  store i64 %102, ptr %type15, align 4
+  %data16 = getelementptr %Node, ptr %n, i32 0, i32 1
+  %103 = load ptr, ptr %d, align 8
+  store ptr %103, ptr %data16, align 8
+  %104 = load ptr, ptr %p, align 8
+  %105 = load %Node, ptr %n, align 8
+  %106 = call ptr @create_node(ptr %104, %Node %105)
+  ret ptr %106
+}
+
+define ptr @parser_parse_function_arguments(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %1, i32 0, i32 3
+  %2 = load ptr, ptr %arena, align 8
+  %3 = call ptr @arena_alloc(ptr %2, i64 160)
+  %node_list = alloca ptr, align 8
+  store ptr %3, ptr %node_list, align 8
+  %first = alloca i1, align 1
+  store i1 true, ptr %first, align 1
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block3, %entrypoint
+  br i1 true, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %4 = load i1, ptr %first, align 1
+  %5 = icmp eq i1 %4, false
+  br i1 %5, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  %6 = load ptr, ptr %p, align 8
+  %arena4 = getelementptr %parser, ptr %6, i32 0, i32 3
+  %7 = load ptr, ptr %arena4, align 8
+  %8 = call ptr @arena_alloc(ptr %7, i64 16)
+  %s5 = alloca ptr, align 8
+  store ptr %8, ptr %s5, align 8
+  %9 = load ptr, ptr %s5, align 8
+  %data6 = getelementptr %slice, ptr %9, i32 0, i32 0
+  %10 = load ptr, ptr %node_list, align 8
+  store ptr %10, ptr %data6, align 8
+  %11 = load ptr, ptr %s5, align 8
+  %data_len7 = getelementptr %slice, ptr %11, i32 0, i32 1
+  %12 = load i64, ptr %i, align 4
+  store i64 %12, ptr %data_len7, align 4
+  %13 = load ptr, ptr %s5, align 8
+  ret ptr %13
+
+then_block:                                       ; preds = %inner_block
+  %14 = load ptr, ptr %p, align 8
+  %15 = load i64, ptr @TOKEN_COMMA.32, align 4
+  %16 = call ptr @parser_accept_token(ptr %14, i64 %15)
+  br label %merge_block
+
+merge_block:                                      ; preds = %inner_block, %then_block
+  store i1 false, ptr %first, align 1
+  %17 = load ptr, ptr %p, align 8
+  %18 = call ptr @parser_accept_parse(ptr %17, ptr @parser_parse_expression)
+  %maybe_expr = alloca ptr, align 8
+  store ptr %18, ptr %maybe_expr, align 8
+  %19 = load ptr, ptr %maybe_expr, align 8
+  %20 = icmp eq ptr %19, null
+  br i1 %20, label %then_block1, label %merge_block3
+
+then_block1:                                      ; preds = %merge_block
+  %21 = load ptr, ptr %p, align 8
+  %arena2 = getelementptr %parser, ptr %21, i32 0, i32 3
+  %22 = load ptr, ptr %arena2, align 8
+  %23 = call ptr @arena_alloc(ptr %22, i64 16)
+  %s = alloca ptr, align 8
+  store ptr %23, ptr %s, align 8
+  %24 = load ptr, ptr %s, align 8
+  %data = getelementptr %slice, ptr %24, i32 0, i32 0
+  %25 = load ptr, ptr %node_list, align 8
+  store ptr %25, ptr %data, align 8
+  %26 = load ptr, ptr %s, align 8
+  %data_len = getelementptr %slice, ptr %26, i32 0, i32 1
+  %27 = load i64, ptr %i, align 4
+  store i64 %27, ptr %data_len, align 4
+  %28 = load ptr, ptr %s, align 8
+  ret ptr %28
+
+merge_block3:                                     ; preds = %merge_block
+  %29 = load ptr, ptr %node_list, align 8
+  %30 = load i64, ptr %i, align 4
+  %31 = getelementptr ptr, ptr %29, i64 %30
+  %32 = load ptr, ptr %maybe_expr, align 8
+  store ptr %32, ptr %31, align 8
+  %33 = load i64, ptr %i, align 4
+  %34 = add i64 %33, 1
+  store i64 %34, ptr %i, align 4
+  br label %while_block
+}
+
+define ptr @unnamed_func.47(ptr %0) {
+entrypoint:
+  %ip = alloca ptr, align 8
+  store ptr %0, ptr %ip, align 8
+  %1 = load ptr, ptr %ip, align 8
+  %2 = load i64, ptr @TOKEN_BREAK.10, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %5 = load i64, ptr @NODE_BREAK_STATEMENT, align 4
+  store i64 %5, ptr %type, align 4
+  %6 = load ptr, ptr %ip, align 8
+  %7 = load %Node, ptr %n, align 8
+  %8 = call ptr @create_node(ptr %6, %Node %7)
+  ret ptr %8
+}
+
+define ptr @unnamed_func.48(ptr %0) {
+entrypoint:
+  %ip = alloca ptr, align 8
+  store ptr %0, ptr %ip, align 8
+  %1 = load ptr, ptr %ip, align 8
+  %2 = load i64, ptr @TOKEN_CONTINUE.11, align 4
+  %3 = call ptr @parser_accept_token(ptr %1, i64 %2)
+  %4 = icmp eq ptr %3, null
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  ret ptr null
+
+merge_block:                                      ; preds = %entrypoint
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %5 = load i64, ptr @NODE_CONTINUE_STATEMENT, align 4
+  store i64 %5, ptr %type, align 4
+  %6 = load ptr, ptr %ip, align 8
+  %7 = load %Node, ptr %n, align 8
+  %8 = call ptr @create_node(ptr %6, %Node %7)
+  ret ptr %8
+}
+
+define ptr @parse_program(ptr %0) {
+entrypoint:
+  %p = alloca ptr, align 8
+  store ptr %0, ptr %p, align 8
+  %1 = load ptr, ptr %p, align 8
+  %arena = getelementptr %parser, ptr %1, i32 0, i32 3
+  %2 = load ptr, ptr %arena, align 8
+  %3 = call ptr @arena_alloc(ptr %2, i64 400000)
+  %nodes = alloca ptr, align 8
+  store ptr %3, ptr %nodes, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %inner_block, %entrypoint
+  %4 = load ptr, ptr %p, align 8
+  %offset = getelementptr %parser, ptr %4, i32 0, i32 2
+  %5 = load i64, ptr %offset, align 4
+  %6 = load ptr, ptr %p, align 8
+  %tokens_len = getelementptr %parser, ptr %6, i32 0, i32 1
+  %7 = load i64, ptr %tokens_len, align 4
+  %8 = icmp slt i64 %5, %7
+  br i1 %8, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %9 = load ptr, ptr %p, align 8
+  %10 = call ptr @parser_parse_statement(ptr %9)
+  %s = alloca ptr, align 8
+  store ptr %10, ptr %s, align 8
+  %11 = load ptr, ptr %s, align 8
+  %12 = icmp ne ptr %11, null
+  call void @assert(i1 %12)
+  %13 = load ptr, ptr %nodes, align 8
+  %14 = load i64, ptr %i, align 4
+  %15 = getelementptr ptr, ptr %13, i64 %14
+  %16 = load ptr, ptr %s, align 8
+  store ptr %16, ptr %15, align 8
+  %17 = load i64, ptr %i, align 4
+  %18 = add i64 %17, 1
+  store i64 %18, ptr %i, align 4
+  br label %while_block
+
+outer_block:                                      ; preds = %while_block
+  %19 = load ptr, ptr %p, align 8
+  %arena1 = getelementptr %parser, ptr %19, i32 0, i32 3
+  %20 = load ptr, ptr %arena1, align 8
+  %21 = call ptr @arena_alloc(ptr %20, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %21, ptr %d, align 8
+  %22 = load ptr, ptr %d, align 8
+  %statements = getelementptr %NODE_PROGRAM_DATA, ptr %22, i32 0, i32 0
+  %23 = load ptr, ptr %nodes, align 8
+  store ptr %23, ptr %statements, align 8
+  %24 = load ptr, ptr %d, align 8
+  %statements_len = getelementptr %NODE_PROGRAM_DATA, ptr %24, i32 0, i32 1
+  %25 = load i64, ptr %i, align 4
+  store i64 %25, ptr %statements_len, align 4
+  %n = alloca %Node, align 8
+  %type = getelementptr %Node, ptr %n, i32 0, i32 0
+  %26 = load i64, ptr @NODE_PROGRAM, align 4
+  store i64 %26, ptr %type, align 4
+  %data = getelementptr %Node, ptr %n, i32 0, i32 1
+  %27 = load ptr, ptr %d, align 8
+  store ptr %27, ptr %data, align 8
+  %28 = load ptr, ptr %p, align 8
+  %29 = load %Node, ptr %n, align 8
+  %30 = call ptr @create_node(ptr %28, %Node %29)
+  ret ptr %30
+}
+
+define i64 @simple_hash(ptr %0, i64 %1) {
+entrypoint:
+  %key = alloca ptr, align 8
+  store ptr %0, ptr %key, align 8
+  %bucket_count = alloca i64, align 8
+  store i64 %1, ptr %bucket_count, align 4
+  ret i64 0
+}
+
+define ptr @hashmap_init(i64 %0, ptr %1) {
+entrypoint:
+  %bucket_count = alloca i64, align 8
+  store i64 %0, ptr %bucket_count, align 4
+  %alloc = alloca ptr, align 8
+  store ptr %1, ptr %alloc, align 8
+  %2 = load ptr, ptr %alloc, align 8
+  %3 = call ptr @arena_alloc(ptr %2, i64 24)
+  %map = alloca ptr, align 8
+  store ptr %3, ptr %map, align 8
+  %4 = load ptr, ptr %map, align 8
+  %buckets = getelementptr %HashMap, ptr %4, i32 0, i32 0
+  %5 = load ptr, ptr %alloc, align 8
+  %6 = load i64, ptr %bucket_count, align 4
+  %7 = mul i64 8, %6
+  %8 = call ptr @arena_alloc(ptr %5, i64 %7)
+  store ptr %8, ptr %buckets, align 8
+  %9 = load ptr, ptr %map, align 8
+  %bucket_count1 = getelementptr %HashMap, ptr %9, i32 0, i32 1
+  %10 = load i64, ptr %bucket_count, align 4
+  store i64 %10, ptr %bucket_count1, align 4
+  %11 = load ptr, ptr %map, align 8
+  %arena = getelementptr %HashMap, ptr %11, i32 0, i32 2
+  %12 = load ptr, ptr %alloc, align 8
+  store ptr %12, ptr %arena, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %inner_block, %entrypoint
+  %13 = load i64, ptr %i, align 4
+  %14 = load i64, ptr %bucket_count, align 4
+  %15 = icmp slt i64 %13, %14
+  br i1 %15, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %16 = load ptr, ptr %map, align 8
+  %buckets2 = getelementptr %HashMap, ptr %16, i32 0, i32 0
+  %17 = load ptr, ptr %buckets2, align 8
+  %18 = load i64, ptr %i, align 4
+  %19 = getelementptr ptr, ptr %17, i64 %18
+  store ptr null, ptr %19, align 8
+  %20 = load i64, ptr %i, align 4
+  %21 = add i64 %20, 1
+  store i64 %21, ptr %i, align 4
+  br label %while_block
+
+outer_block:                                      ; preds = %while_block
+  %22 = load ptr, ptr %map, align 8
+  ret ptr %22
+}
+
+define void @hashmap_put(ptr %0, ptr %1, ptr %2) {
+entrypoint:
+  %map = alloca ptr, align 8
+  store ptr %0, ptr %map, align 8
+  %key = alloca ptr, align 8
+  store ptr %1, ptr %key, align 8
+  %value = alloca ptr, align 8
+  store ptr %2, ptr %value, align 8
+  %3 = load ptr, ptr %key, align 8
+  %4 = load ptr, ptr %map, align 8
+  %bucket_count = getelementptr %HashMap, ptr %4, i32 0, i32 1
+  %5 = load i64, ptr %bucket_count, align 4
+  %6 = call i64 @simple_hash(ptr %3, i64 %5)
+  %bucket_index = alloca i64, align 8
+  store i64 %6, ptr %bucket_index, align 4
+  %7 = load ptr, ptr %map, align 8
+  %buckets = getelementptr %HashMap, ptr %7, i32 0, i32 0
+  %8 = load ptr, ptr %buckets, align 8
+  %9 = load i64, ptr %bucket_index, align 4
+  %10 = getelementptr ptr, ptr %8, i64 %9
+  %11 = load ptr, ptr %10, align 8
+  %bucket = alloca ptr, align 8
+  store ptr %11, ptr %bucket, align 8
+  %12 = load ptr, ptr %bucket, align 8
+  %current = alloca ptr, align 8
+  store ptr %12, ptr %current, align 8
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block, %entrypoint
+  %13 = load ptr, ptr %current, align 8
+  %14 = icmp ne ptr %13, null
+  br i1 %14, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %15 = load ptr, ptr %current, align 8
+  %key1 = getelementptr %HashMapEntry, ptr %15, i32 0, i32 0
+  %16 = load ptr, ptr %key1, align 8
+  %17 = load ptr, ptr %key, align 8
+  %18 = call i1 @strcmp(ptr %16, ptr %17)
+  br i1 %18, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  %19 = load ptr, ptr %map, align 8
+  %arena = getelementptr %HashMap, ptr %19, i32 0, i32 2
+  %20 = load ptr, ptr %arena, align 8
+  %21 = call ptr @arena_alloc(ptr %20, i64 24)
+  %new_entry = alloca ptr, align 8
+  store ptr %21, ptr %new_entry, align 8
+  %22 = load ptr, ptr %new_entry, align 8
+  %key3 = getelementptr %HashMapEntry, ptr %22, i32 0, i32 0
+  %23 = load ptr, ptr %key, align 8
+  store ptr %23, ptr %key3, align 8
+  %24 = load ptr, ptr %new_entry, align 8
+  %value4 = getelementptr %HashMapEntry, ptr %24, i32 0, i32 1
+  %25 = load ptr, ptr %value, align 8
+  store ptr %25, ptr %value4, align 8
+  %26 = load ptr, ptr %new_entry, align 8
+  %next5 = getelementptr %HashMapEntry, ptr %26, i32 0, i32 2
+  %27 = load ptr, ptr %bucket, align 8
+  store ptr %27, ptr %next5, align 8
+  %28 = load ptr, ptr %map, align 8
+  %buckets6 = getelementptr %HashMap, ptr %28, i32 0, i32 0
+  %29 = load ptr, ptr %buckets6, align 8
+  %30 = load i64, ptr %bucket_index, align 4
+  %31 = getelementptr ptr, ptr %29, i64 %30
+  %32 = load ptr, ptr %new_entry, align 8
+  store ptr %32, ptr %31, align 8
+  ret void
+
+then_block:                                       ; preds = %inner_block
+  %33 = load ptr, ptr %current, align 8
+  %value2 = getelementptr %HashMapEntry, ptr %33, i32 0, i32 1
+  %34 = load ptr, ptr %value, align 8
+  store ptr %34, ptr %value2, align 8
+  ret void
+
+merge_block:                                      ; preds = %inner_block
+  %35 = load ptr, ptr %current, align 8
+  %next = getelementptr %HashMapEntry, ptr %35, i32 0, i32 2
+  %36 = load ptr, ptr %next, align 8
+  store ptr %36, ptr %current, align 8
+  br label %while_block
+}
+
+define ptr @hashmap_get(ptr %0, ptr %1) {
+entrypoint:
+  %map = alloca ptr, align 8
+  store ptr %0, ptr %map, align 8
+  %key = alloca ptr, align 8
+  store ptr %1, ptr %key, align 8
+  %2 = load ptr, ptr %key, align 8
+  %3 = load ptr, ptr %map, align 8
+  %bucket_count = getelementptr %HashMap, ptr %3, i32 0, i32 1
+  %4 = load i64, ptr %bucket_count, align 4
+  %5 = call i64 @simple_hash(ptr %2, i64 %4)
+  %bucket_index = alloca i64, align 8
+  store i64 %5, ptr %bucket_index, align 4
+  %6 = load ptr, ptr %map, align 8
+  %buckets = getelementptr %HashMap, ptr %6, i32 0, i32 0
+  %7 = load ptr, ptr %buckets, align 8
+  %8 = load i64, ptr %bucket_index, align 4
+  %9 = getelementptr ptr, ptr %7, i64 %8
+  %10 = load ptr, ptr %9, align 8
+  %current = alloca ptr, align 8
+  store ptr %10, ptr %current, align 8
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block, %entrypoint
+  %11 = load ptr, ptr %current, align 8
+  %12 = icmp ne ptr %11, null
+  br i1 %12, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %13 = load ptr, ptr %current, align 8
+  %key1 = getelementptr %HashMapEntry, ptr %13, i32 0, i32 0
+  %14 = load ptr, ptr %key1, align 8
+  %15 = load ptr, ptr %key, align 8
+  %16 = call i1 @strcmp(ptr %14, ptr %15)
+  br i1 %16, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  ret ptr null
+
+then_block:                                       ; preds = %inner_block
+  %17 = load ptr, ptr %current, align 8
+  %value = getelementptr %HashMapEntry, ptr %17, i32 0, i32 1
+  %18 = load ptr, ptr %value, align 8
+  ret ptr %18
+
+merge_block:                                      ; preds = %inner_block
+  %19 = load ptr, ptr %current, align 8
+  %next = getelementptr %HashMapEntry, ptr %19, i32 0, i32 2
+  %20 = load ptr, ptr %next, align 8
+  store ptr %20, ptr %current, align 8
+  br label %while_block
+}
+
+declare void @LLVMInitializeAArch64TargetInfo()
+
+declare void @LLVMInitializeAMDGPUTargetInfo()
+
+declare void @LLVMInitializeARMTargetInfo()
+
+declare void @LLVMInitializeAVRTargetInfo()
+
+declare void @LLVMInitializeBPFTargetInfo()
+
+declare void @LLVMInitializeHexagonTargetInfo()
+
+declare void @LLVMInitializeLanaiTargetInfo()
+
+declare void @LLVMInitializeLoongArchTargetInfo()
+
+declare void @LLVMInitializeMipsTargetInfo()
+
+declare void @LLVMInitializeMSP430TargetInfo()
+
+declare void @LLVMInitializeNVPTXTargetInfo()
+
+declare void @LLVMInitializePowerPCTargetInfo()
+
+declare void @LLVMInitializeRISCVTargetInfo()
+
+declare void @LLVMInitializeSparcTargetInfo()
+
+declare void @LLVMInitializeSystemZTargetInfo()
+
+declare void @LLVMInitializeVETargetInfo()
+
+declare void @LLVMInitializeWebAssemblyTargetInfo()
+
+declare void @LLVMInitializeX86TargetInfo()
+
+declare void @LLVMInitializeXCoreTargetInfo()
+
+define void @LLVMInitializeAllTargetInfos() {
+entrypoint:
+  call void @LLVMInitializeAArch64TargetInfo()
+  call void @LLVMInitializeAMDGPUTargetInfo()
+  call void @LLVMInitializeARMTargetInfo()
+  call void @LLVMInitializeAVRTargetInfo()
+  call void @LLVMInitializeBPFTargetInfo()
+  call void @LLVMInitializeHexagonTargetInfo()
+  call void @LLVMInitializeLanaiTargetInfo()
+  call void @LLVMInitializeLoongArchTargetInfo()
+  call void @LLVMInitializeMipsTargetInfo()
+  call void @LLVMInitializeMSP430TargetInfo()
+  call void @LLVMInitializeNVPTXTargetInfo()
+  call void @LLVMInitializePowerPCTargetInfo()
+  call void @LLVMInitializeRISCVTargetInfo()
+  call void @LLVMInitializeSparcTargetInfo()
+  call void @LLVMInitializeSystemZTargetInfo()
+  call void @LLVMInitializeVETargetInfo()
+  call void @LLVMInitializeWebAssemblyTargetInfo()
+  call void @LLVMInitializeX86TargetInfo()
+  call void @LLVMInitializeXCoreTargetInfo()
+  ret void
+}
+
+declare void @LLVMInitializeAArch64Target()
+
+declare void @LLVMInitializeAMDGPUTarget()
+
+declare void @LLVMInitializeARMTarget()
+
+declare void @LLVMInitializeAVRTarget()
+
+declare void @LLVMInitializeBPFTarget()
+
+declare void @LLVMInitializeHexagonTarget()
+
+declare void @LLVMInitializeLanaiTarget()
+
+declare void @LLVMInitializeLoongArchTarget()
+
+declare void @LLVMInitializeMipsTarget()
+
+declare void @LLVMInitializeMSP430Target()
+
+declare void @LLVMInitializeNVPTXTarget()
+
+declare void @LLVMInitializePowerPCTarget()
+
+declare void @LLVMInitializeRISCVTarget()
+
+declare void @LLVMInitializeSparcTarget()
+
+declare void @LLVMInitializeSystemZTarget()
+
+declare void @LLVMInitializeVETarget()
+
+declare void @LLVMInitializeWebAssemblyTarget()
+
+declare void @LLVMInitializeX86Target()
+
+declare void @LLVMInitializeXCoreTarget()
+
+define void @LLVMInitializeAllTargets() {
+entrypoint:
+  call void @LLVMInitializeAArch64Target()
+  call void @LLVMInitializeAMDGPUTarget()
+  call void @LLVMInitializeARMTarget()
+  call void @LLVMInitializeAVRTarget()
+  call void @LLVMInitializeBPFTarget()
+  call void @LLVMInitializeHexagonTarget()
+  call void @LLVMInitializeLanaiTarget()
+  call void @LLVMInitializeLoongArchTarget()
+  call void @LLVMInitializeMipsTarget()
+  call void @LLVMInitializeMSP430Target()
+  call void @LLVMInitializeNVPTXTarget()
+  call void @LLVMInitializePowerPCTarget()
+  call void @LLVMInitializeRISCVTarget()
+  call void @LLVMInitializeSparcTarget()
+  call void @LLVMInitializeSystemZTarget()
+  call void @LLVMInitializeVETarget()
+  call void @LLVMInitializeWebAssemblyTarget()
+  call void @LLVMInitializeX86Target()
+  call void @LLVMInitializeXCoreTarget()
+  ret void
+}
+
+declare void @LLVMInitializeAArch64TargetMC()
+
+declare void @LLVMInitializeAMDGPUTargetMC()
+
+declare void @LLVMInitializeARMTargetMC()
+
+declare void @LLVMInitializeAVRTargetMC()
+
+declare void @LLVMInitializeBPFTargetMC()
+
+declare void @LLVMInitializeHexagonTargetMC()
+
+declare void @LLVMInitializeLanaiTargetMC()
+
+declare void @LLVMInitializeLoongArchTargetMC()
+
+declare void @LLVMInitializeMipsTargetMC()
+
+declare void @LLVMInitializeMSP430TargetMC()
+
+declare void @LLVMInitializeNVPTXTargetMC()
+
+declare void @LLVMInitializePowerPCTargetMC()
+
+declare void @LLVMInitializeRISCVTargetMC()
+
+declare void @LLVMInitializeSparcTargetMC()
+
+declare void @LLVMInitializeSystemZTargetMC()
+
+declare void @LLVMInitializeVETargetMC()
+
+declare void @LLVMInitializeWebAssemblyTargetMC()
+
+declare void @LLVMInitializeX86TargetMC()
+
+declare void @LLVMInitializeXCoreTargetMC()
+
+define void @LLVMInitializeAllTargetMCs() {
+entrypoint:
+  call void @LLVMInitializeAArch64TargetMC()
+  call void @LLVMInitializeAMDGPUTargetMC()
+  call void @LLVMInitializeARMTargetMC()
+  call void @LLVMInitializeAVRTargetMC()
+  call void @LLVMInitializeBPFTargetMC()
+  call void @LLVMInitializeHexagonTargetMC()
+  call void @LLVMInitializeLanaiTargetMC()
+  call void @LLVMInitializeLoongArchTargetMC()
+  call void @LLVMInitializeMipsTargetMC()
+  call void @LLVMInitializeMSP430TargetMC()
+  call void @LLVMInitializeNVPTXTargetMC()
+  call void @LLVMInitializePowerPCTargetMC()
+  call void @LLVMInitializeRISCVTargetMC()
+  call void @LLVMInitializeSparcTargetMC()
+  call void @LLVMInitializeSystemZTargetMC()
+  call void @LLVMInitializeVETargetMC()
+  call void @LLVMInitializeWebAssemblyTargetMC()
+  call void @LLVMInitializeX86TargetMC()
+  call void @LLVMInitializeXCoreTargetMC()
+  ret void
+}
+
+declare void @LLVMInitializeAArch64AsmPrinter()
+
+declare void @LLVMInitializeAMDGPUAsmPrinter()
+
+declare void @LLVMInitializeARMAsmPrinter()
+
+declare void @LLVMInitializeAVRAsmPrinter()
+
+declare void @LLVMInitializeBPFAsmPrinter()
+
+declare void @LLVMInitializeHexagonAsmPrinter()
+
+declare void @LLVMInitializeLanaiAsmPrinter()
+
+declare void @LLVMInitializeLoongArchAsmPrinter()
+
+declare void @LLVMInitializeMipsAsmPrinter()
+
+declare void @LLVMInitializeMSP430AsmPrinter()
+
+declare void @LLVMInitializeNVPTXAsmPrinter()
+
+declare void @LLVMInitializePowerPCAsmPrinter()
+
+declare void @LLVMInitializeRISCVAsmPrinter()
+
+declare void @LLVMInitializeSparcAsmPrinter()
+
+declare void @LLVMInitializeSystemZAsmPrinter()
+
+declare void @LLVMInitializeVEAsmPrinter()
+
+declare void @LLVMInitializeWebAssemblyAsmPrinter()
+
+declare void @LLVMInitializeX86AsmPrinter()
+
+declare void @LLVMInitializeXCoreAsmPrinter()
+
+define void @LLVMInitializeAllAsmPrinters() {
+entrypoint:
+  call void @LLVMInitializeAArch64AsmPrinter()
+  call void @LLVMInitializeAMDGPUAsmPrinter()
+  call void @LLVMInitializeARMAsmPrinter()
+  call void @LLVMInitializeAVRAsmPrinter()
+  call void @LLVMInitializeBPFAsmPrinter()
+  call void @LLVMInitializeHexagonAsmPrinter()
+  call void @LLVMInitializeLanaiAsmPrinter()
+  call void @LLVMInitializeLoongArchAsmPrinter()
+  call void @LLVMInitializeMipsAsmPrinter()
+  call void @LLVMInitializeMSP430AsmPrinter()
+  call void @LLVMInitializeNVPTXAsmPrinter()
+  call void @LLVMInitializePowerPCAsmPrinter()
+  call void @LLVMInitializeRISCVAsmPrinter()
+  call void @LLVMInitializeSparcAsmPrinter()
+  call void @LLVMInitializeSystemZAsmPrinter()
+  call void @LLVMInitializeVEAsmPrinter()
+  call void @LLVMInitializeWebAssemblyAsmPrinter()
+  call void @LLVMInitializeX86AsmPrinter()
+  call void @LLVMInitializeXCoreAsmPrinter()
+  ret void
+}
+
+declare void @LLVMInitializeAArch64AsmParser()
+
+declare void @LLVMInitializeAMDGPUAsmParser()
+
+declare void @LLVMInitializeARMAsmParser()
+
+declare void @LLVMInitializeAVRAsmParser()
+
+declare void @LLVMInitializeBPFAsmParser()
+
+declare void @LLVMInitializeHexagonAsmParser()
+
+declare void @LLVMInitializeLanaiAsmParser()
+
+declare void @LLVMInitializeLoongArchAsmParser()
+
+declare void @LLVMInitializeMipsAsmParser()
+
+declare void @LLVMInitializeMSP430AsmParser()
+
+declare void @LLVMInitializePowerPCAsmParser()
+
+declare void @LLVMInitializeRISCVAsmParser()
+
+declare void @LLVMInitializeSparcAsmParser()
+
+declare void @LLVMInitializeSystemZAsmParser()
+
+declare void @LLVMInitializeVEAsmParser()
+
+declare void @LLVMInitializeWebAssemblyAsmParser()
+
+declare void @LLVMInitializeX86AsmParser()
+
+define void @LLVMInitializeAllAsmParsers() {
+entrypoint:
+  call void @LLVMInitializeAArch64AsmParser()
+  call void @LLVMInitializeAMDGPUAsmParser()
+  call void @LLVMInitializeARMAsmParser()
+  call void @LLVMInitializeAVRAsmParser()
+  call void @LLVMInitializeBPFAsmParser()
+  call void @LLVMInitializeHexagonAsmParser()
+  call void @LLVMInitializeLanaiAsmParser()
+  call void @LLVMInitializeLoongArchAsmParser()
+  call void @LLVMInitializeMipsAsmParser()
+  call void @LLVMInitializeMSP430AsmParser()
+  call void @LLVMInitializePowerPCAsmParser()
+  call void @LLVMInitializeRISCVAsmParser()
+  call void @LLVMInitializeSparcAsmParser()
+  call void @LLVMInitializeSystemZAsmParser()
+  call void @LLVMInitializeVEAsmParser()
+  call void @LLVMInitializeWebAssemblyAsmParser()
+  call void @LLVMInitializeX86AsmParser()
+  ret void
+}
+
+declare void @LLVMInitializeAArch64Disassembler()
+
+declare void @LLVMInitializeAMDGPUDisassembler()
+
+declare void @LLVMInitializeARMDisassembler()
+
+declare void @LLVMInitializeAVRDisassembler()
+
+declare void @LLVMInitializeBPFDisassembler()
+
+declare void @LLVMInitializeHexagonDisassembler()
+
+declare void @LLVMInitializeLanaiDisassembler()
+
+declare void @LLVMInitializeLoongArchDisassembler()
+
+declare void @LLVMInitializeMipsDisassembler()
+
+declare void @LLVMInitializeMSP430Disassembler()
+
+declare void @LLVMInitializePowerPCDisassembler()
+
+declare void @LLVMInitializeRISCVDisassembler()
+
+declare void @LLVMInitializeSparcDisassembler()
+
+declare void @LLVMInitializeSystemZDisassembler()
+
+declare void @LLVMInitializeVEDisassembler()
+
+declare void @LLVMInitializeWebAssemblyDisassembler()
+
+declare void @LLVMInitializeX86Disassembler()
+
+declare void @LLVMInitializeXCoreDisassembler()
+
+define void @LLVMInitializeAllDisassemblers() {
+entrypoint:
+  call void @LLVMInitializeAArch64Disassembler()
+  call void @LLVMInitializeAMDGPUDisassembler()
+  call void @LLVMInitializeARMDisassembler()
+  call void @LLVMInitializeAVRDisassembler()
+  call void @LLVMInitializeBPFDisassembler()
+  call void @LLVMInitializeHexagonDisassembler()
+  call void @LLVMInitializeLanaiDisassembler()
+  call void @LLVMInitializeLoongArchDisassembler()
+  call void @LLVMInitializeMipsDisassembler()
+  call void @LLVMInitializeMSP430Disassembler()
+  call void @LLVMInitializePowerPCDisassembler()
+  call void @LLVMInitializeRISCVDisassembler()
+  call void @LLVMInitializeSparcDisassembler()
+  call void @LLVMInitializeSystemZDisassembler()
+  call void @LLVMInitializeVEDisassembler()
+  call void @LLVMInitializeWebAssemblyDisassembler()
+  call void @LLVMInitializeX86Disassembler()
+  call void @LLVMInitializeXCoreDisassembler()
+  ret void
+}
+
+declare ptr @LLVMGetModuleDataLayout(ptr)
+
+declare ptr @LLVMConstInt(ptr, i64, i64)
+
+declare ptr @LLVMConstNull(ptr)
+
+declare ptr @LLVMInt64Type()
+
+declare ptr @LLVMInt32Type()
+
+declare ptr @LLVMInt1Type()
+
+declare ptr @LLVMInt8Type()
+
+declare ptr @LLVMVoidType()
+
+declare ptr @LLVMModuleCreateWithName(ptr)
+
+declare ptr @LLVMGetGlobalContext()
+
+declare ptr @LLVMCreateBuilder()
+
+declare void @LLVMDisposeModule(ptr)
+
+declare void @LLVMShutdown()
+
+declare void @LLVMDisposeBuilder(ptr)
+
+declare ptr @LLVMGetInsertBlock(ptr)
+
+declare void @LLVMDumpModule(ptr)
+
+declare i64 @LLVMPrintModuleToFile(ptr, ptr, ptr)
+
+declare ptr @LLVMGetDefaultTargetTriple()
+
+declare i64 @LLVMGetTargetFromTriple(ptr, ptr, ptr)
+
+declare void @LLVMDisposeMessage(ptr)
+
+declare ptr @LLVMCreateTargetMachine(ptr, ptr, ptr, ptr, i64, i64, i64)
+
+declare void @LLVMDisposeTargetMachine(ptr)
+
+declare i64 @LLVMVerifyModule(ptr, i64, ptr)
+
+declare i64 @LLVMTargetMachineEmitToFile(ptr, ptr, ptr, i64, ptr)
+
+declare ptr @LLVMFunctionType(ptr, ptr, i64, i64)
+
+declare ptr @LLVMAddFunction(ptr, ptr, ptr)
+
+declare ptr @LLVMAppendBasicBlock(ptr, ptr)
+
+declare void @LLVMPositionBuilderAtEnd(ptr, ptr)
+
+declare void @LLVMGetParams(ptr, ptr)
+
+declare void @LLVMBuildRetVoid(ptr)
+
+declare void @LLVMBuildRet(ptr, ptr)
+
+declare ptr @LLVMPointerType(ptr, i64)
+
+declare ptr @LLVMBuildCall2(ptr, ptr, ptr, ptr, i64, ptr)
+
+declare ptr @LLVMBuildGlobalStringPtr(ptr, ptr, ptr)
+
+declare ptr @LLVMBuildAlloca(ptr, ptr, ptr)
+
+declare ptr @LLVMBuildStore(ptr, ptr, ptr)
+
+declare ptr @LLVMBuildLoad2(ptr, ptr, ptr, ptr)
+
+declare ptr @LLVMGetLastInstruction(ptr)
+
+declare ptr @LLVMBuildBr(ptr, ptr)
+
+declare ptr @LLVMIsATerminatorInst(ptr)
+
+declare ptr @LLVMBuildCondBr(ptr, ptr, ptr, ptr)
+
+declare ptr @LLVMBuildICmp(ptr, i64, ptr, ptr, ptr)
+
+declare ptr @LLVMBuildNeg(ptr, ptr, ptr)
+
+declare ptr @LLVMBuildSub(ptr, ptr, ptr, ptr)
+
+declare ptr @LLVMBuildAdd(ptr, ptr, ptr, ptr)
+
+declare ptr @LLVMBuildMul(ptr, ptr, ptr, ptr)
+
+declare ptr @LLVMBuildSDiv(ptr, ptr, ptr, ptr)
+
+declare ptr @LLVMBuildSRem(ptr, ptr, ptr, ptr)
+
+declare ptr @LLVMBuildGEP2(ptr, ptr, ptr, ptr, i64, ptr)
+
+declare ptr @LLVMAddGlobal(ptr, ptr, ptr)
+
+declare void @LLVMSetInitializer(ptr, ptr)
+
+declare i64 @LLVMGetValueKind(ptr)
+
+declare i64 @LLVMStoreSizeOfType(ptr, ptr)
+
+declare ptr @LLVMStructCreateNamed(ptr, ptr)
+
+declare void @LLVMStructSetBody(ptr, ptr, i64, i64)
+
+define void @environment_create_scope(ptr %0) {
+entrypoint:
+  %e = alloca ptr, align 8
+  store ptr %0, ptr %e, align 8
+  %1 = load ptr, ptr %e, align 8
+  %arena = getelementptr %Environment, ptr %1, i32 0, i32 2
+  %2 = load ptr, ptr %arena, align 8
+  %3 = call ptr @arena_alloc(ptr %2, i64 8)
+  %scope = alloca ptr, align 8
+  store ptr %3, ptr %scope, align 8
+  %4 = load ptr, ptr %scope, align 8
+  %variables = getelementptr %Scope, ptr %4, i32 0, i32 0
+  %5 = load ptr, ptr %e, align 8
+  %arena1 = getelementptr %Environment, ptr %5, i32 0, i32 2
+  %6 = load ptr, ptr %arena1, align 8
+  %7 = call ptr @hashmap_init(i64 16, ptr %6)
+  store ptr %7, ptr %variables, align 8
+  %8 = load ptr, ptr %e, align 8
+  %scope_stack = getelementptr %Environment, ptr %8, i32 0, i32 0
+  %9 = load ptr, ptr %scope_stack, align 8
+  %10 = load ptr, ptr %e, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %10, i32 0, i32 1
+  %11 = load i64, ptr %scope_stack_len, align 4
+  %12 = getelementptr ptr, ptr %9, i64 %11
+  %13 = load ptr, ptr %scope, align 8
+  store ptr %13, ptr %12, align 8
+  %14 = load ptr, ptr %e, align 8
+  %scope_stack_len2 = getelementptr %Environment, ptr %14, i32 0, i32 1
+  %15 = load ptr, ptr %e, align 8
+  %scope_stack_len3 = getelementptr %Environment, ptr %15, i32 0, i32 1
+  %16 = load i64, ptr %scope_stack_len3, align 4
+  %17 = add i64 %16, 1
+  store i64 %17, ptr %scope_stack_len2, align 4
+  ret void
+}
+
+define void @environment_drop_scope(ptr %0) {
+entrypoint:
+  %e = alloca ptr, align 8
+  store ptr %0, ptr %e, align 8
+  %1 = load ptr, ptr %e, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %1, i32 0, i32 1
+  %2 = load ptr, ptr %e, align 8
+  %scope_stack_len1 = getelementptr %Environment, ptr %2, i32 0, i32 1
+  %3 = load i64, ptr %scope_stack_len1, align 4
+  %4 = sub i64 %3, 1
+  store i64 %4, ptr %scope_stack_len, align 4
+  ret void
+}
+
+define ptr @environment_get_variable(ptr %0, ptr %1) {
+entrypoint:
+  %e = alloca ptr, align 8
+  store ptr %0, ptr %e, align 8
+  %name = alloca ptr, align 8
+  store ptr %1, ptr %name, align 8
+  %2 = load ptr, ptr %e, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %2, i32 0, i32 1
+  %3 = load i64, ptr %scope_stack_len, align 4
+  %i = alloca i64, align 8
+  store i64 %3, ptr %i, align 4
+  %variable = alloca ptr, align 8
+  store ptr null, ptr %variable, align 8
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block3, %entrypoint
+  %4 = load i64, ptr %i, align 4
+  %5 = icmp sgt i64 %4, 0
+  br i1 %5, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %6 = load i64, ptr %i, align 4
+  %7 = sub i64 %6, 1
+  store i64 %7, ptr %i, align 4
+  %8 = load ptr, ptr %e, align 8
+  %scope_stack = getelementptr %Environment, ptr %8, i32 0, i32 0
+  %9 = load ptr, ptr %scope_stack, align 8
+  %10 = load i64, ptr %i, align 4
+  %11 = getelementptr ptr, ptr %9, i64 %10
+  %12 = load ptr, ptr %11, align 8
+  %scope = alloca ptr, align 8
+  store ptr %12, ptr %scope, align 8
+  %13 = load ptr, ptr %scope, align 8
+  %14 = icmp ne ptr %13, null
+  call void @assert(i1 %14)
+  %15 = load ptr, ptr %scope, align 8
+  %variables = getelementptr %Scope, ptr %15, i32 0, i32 0
+  %16 = load ptr, ptr %variables, align 8
+  %17 = load ptr, ptr %name, align 8
+  %18 = call ptr @hashmap_get(ptr %16, ptr %17)
+  %v = alloca ptr, align 8
+  store ptr %18, ptr %v, align 8
+  %19 = load ptr, ptr %v, align 8
+  %20 = icmp ne ptr %19, null
+  br i1 %20, label %then_block, label %merge_block3
+
+outer_block:                                      ; preds = %while_block
+  %21 = load ptr, ptr %variable, align 8
+  ret ptr %21
+
+then_block:                                       ; preds = %inner_block
+  %22 = load ptr, ptr %variable, align 8
+  %23 = icmp eq ptr %22, null
+  br i1 %23, label %then_block1, label %merge_block
+
+then_block1:                                      ; preds = %then_block
+  %24 = load ptr, ptr %v, align 8
+  store ptr %24, ptr %variable, align 8
+  br label %merge_block
+
+merge_block:                                      ; preds = %then_block, %then_block1
+  %25 = load ptr, ptr %e, align 8
+  %arena = getelementptr %Environment, ptr %25, i32 0, i32 2
+  %26 = load ptr, ptr %arena, align 8
+  %27 = call ptr @arena_alloc(ptr %26, i64 8)
+  %stack_level = alloca ptr, align 8
+  store ptr %27, ptr %stack_level, align 8
+  %28 = load ptr, ptr %stack_level, align 8
+  %29 = load i64, ptr %i, align 4
+  store i64 %29, ptr %28, align 4
+  %30 = load ptr, ptr %variable, align 8
+  %stack_level2 = getelementptr %Variable, ptr %30, i32 0, i32 4
+  %31 = load ptr, ptr %stack_level, align 8
+  store ptr %31, ptr %stack_level2, align 8
+  br label %merge_block3
+
+merge_block3:                                     ; preds = %inner_block, %merge_block
+  br label %while_block
+}
+
+define void @environment_add_variable(ptr %0, ptr %1, ptr %2) {
+entrypoint:
+  %e = alloca ptr, align 8
+  store ptr %0, ptr %e, align 8
+  %name = alloca ptr, align 8
+  store ptr %1, ptr %name, align 8
+  %variable = alloca ptr, align 8
+  store ptr %2, ptr %variable, align 8
+  %3 = load ptr, ptr %e, align 8
+  %scope_stack = getelementptr %Environment, ptr %3, i32 0, i32 0
+  %4 = load ptr, ptr %scope_stack, align 8
+  %5 = load ptr, ptr %e, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %5, i32 0, i32 1
+  %6 = load i64, ptr %scope_stack_len, align 4
+  %7 = sub i64 %6, 1
+  %8 = getelementptr ptr, ptr %4, i64 %7
+  %9 = load ptr, ptr %8, align 8
+  %top_scope = alloca ptr, align 8
+  store ptr %9, ptr %top_scope, align 8
+  %10 = load ptr, ptr %top_scope, align 8
+  %variables = getelementptr %Scope, ptr %10, i32 0, i32 0
+  %11 = load ptr, ptr %variables, align 8
+  %12 = load ptr, ptr %name, align 8
+  %13 = load ptr, ptr %variable, align 8
+  call void @hashmap_put(ptr %11, ptr %12, ptr %13)
+  ret void
+}
+
+define void @environment_set_variable(ptr %0, ptr %1, ptr %2) {
+entrypoint:
+  %e = alloca ptr, align 8
+  store ptr %0, ptr %e, align 8
+  %name = alloca ptr, align 8
+  store ptr %1, ptr %name, align 8
+  %variable = alloca ptr, align 8
+  store ptr %2, ptr %variable, align 8
+  %3 = load ptr, ptr %e, align 8
+  %4 = load ptr, ptr %name, align 8
+  %5 = call ptr @environment_get_variable(ptr %3, ptr %4)
+  %existing = alloca ptr, align 8
+  store ptr %5, ptr %existing, align 8
+  %6 = load ptr, ptr %existing, align 8
+  %7 = load ptr, ptr %variable, align 8
+  %8 = load %Variable, ptr %7, align 8
+  store %Variable %8, ptr %6, align 8
+  ret void
+}
+
+define ptr @environment_init(ptr %0) {
+entrypoint:
+  %alloc = alloca ptr, align 8
+  store ptr %0, ptr %alloc, align 8
+  %1 = load ptr, ptr %alloc, align 8
+  %2 = call ptr @arena_alloc(ptr %1, i64 24)
+  %e = alloca ptr, align 8
+  store ptr %2, ptr %e, align 8
+  %3 = load ptr, ptr %e, align 8
+  %scope_stack = getelementptr %Environment, ptr %3, i32 0, i32 0
+  %4 = load ptr, ptr %alloc, align 8
+  %5 = call ptr @arena_alloc(ptr %4, i64 320)
+  store ptr %5, ptr %scope_stack, align 8
+  %6 = load ptr, ptr %e, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %6, i32 0, i32 1
+  store i64 0, ptr %scope_stack_len, align 4
+  %7 = load ptr, ptr %e, align 8
+  %arena = getelementptr %Environment, ptr %7, i32 0, i32 2
+  %8 = load ptr, ptr %alloc, align 8
+  store ptr %8, ptr %arena, align 8
+  %9 = load ptr, ptr %e, align 8
+  call void @environment_create_scope(ptr %9)
+  %10 = load ptr, ptr %e, align 8
+  ret ptr %10
+}
+
+define ptr @codegen_init(ptr %0) {
+entrypoint:
+  %alloc = alloca ptr, align 8
+  store ptr %0, ptr %alloc, align 8
+  call void @LLVMInitializeAllTargetInfos()
+  call void @LLVMInitializeAllTargetMCs()
+  call void @LLVMInitializeAllTargets()
+  call void @LLVMInitializeAllAsmPrinters()
+  call void @LLVMInitializeAllAsmParsers()
+  %1 = call ptr @LLVMModuleCreateWithName(ptr @169)
+  %module = alloca ptr, align 8
+  store ptr %1, ptr %module, align 8
+  %2 = call ptr @LLVMGetGlobalContext()
+  %context = alloca ptr, align 8
+  store ptr %2, ptr %context, align 8
+  %3 = call ptr @LLVMCreateBuilder()
+  %builder = alloca ptr, align 8
+  store ptr %3, ptr %builder, align 8
+  %4 = load ptr, ptr %alloc, align 8
+  %5 = call ptr @arena_alloc(ptr %4, i64 80)
+  %c = alloca ptr, align 8
+  store ptr %5, ptr %c, align 8
+  %6 = load ptr, ptr %c, align 8
+  %llvm_module = getelementptr %codegen, ptr %6, i32 0, i32 0
+  %7 = load ptr, ptr %module, align 8
+  store ptr %7, ptr %llvm_module, align 8
+  %8 = load ptr, ptr %c, align 8
+  %llvm_target_data = getelementptr %codegen, ptr %8, i32 0, i32 9
+  %9 = load ptr, ptr %module, align 8
+  %10 = call ptr @LLVMGetModuleDataLayout(ptr %9)
+  store ptr %10, ptr %llvm_target_data, align 8
+  %11 = load ptr, ptr %c, align 8
+  %llvm_context = getelementptr %codegen, ptr %11, i32 0, i32 1
+  %12 = load ptr, ptr %context, align 8
+  store ptr %12, ptr %llvm_context, align 8
+  %13 = load ptr, ptr %c, align 8
+  %builder1 = getelementptr %codegen, ptr %13, i32 0, i32 2
+  %14 = load ptr, ptr %builder, align 8
+  store ptr %14, ptr %builder1, align 8
+  %15 = load ptr, ptr %c, align 8
+  %arena = getelementptr %codegen, ptr %15, i32 0, i32 3
+  %16 = load ptr, ptr %alloc, align 8
+  store ptr %16, ptr %arena, align 8
+  %17 = load ptr, ptr %c, align 8
+  %environment = getelementptr %codegen, ptr %17, i32 0, i32 4
+  %18 = load ptr, ptr %alloc, align 8
+  %19 = call ptr @environment_init(ptr %18)
+  store ptr %19, ptr %environment, align 8
+  %20 = load ptr, ptr %c, align 8
+  ret ptr %20
+}
+
+define ptr @codegen_create_variable(ptr %0, %Variable %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %variable = alloca %Variable, align 8
+  store %Variable %1, ptr %variable, align 8
+  %2 = load ptr, ptr %c, align 8
+  %arena = getelementptr %codegen, ptr %2, i32 0, i32 3
+  %3 = load ptr, ptr %arena, align 8
+  %4 = call ptr @arena_alloc(ptr %3, i64 40)
+  %v = alloca ptr, align 8
+  store ptr %4, ptr %v, align 8
+  %5 = load %Variable, ptr %variable, align 8
+  %6 = load ptr, ptr %v, align 8
+  store %Variable %5, ptr %6, align 8
+  %7 = load ptr, ptr %v, align 8
+  ret ptr %7
+}
+
+define i1 @compare_types(ptr %0, ptr %1, ptr %2, i1 %3) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %a = alloca ptr, align 8
+  store ptr %1, ptr %a, align 8
+  %b = alloca ptr, align 8
+  store ptr %2, ptr %b, align 8
+  %is_dereference = alloca i1, align 1
+  store i1 %3, ptr %is_dereference, align 1
+  %4 = load ptr, ptr %a, align 8
+  %type = getelementptr %Node, ptr %4, i32 0, i32 0
+  %5 = load i64, ptr %type, align 4
+  %6 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %7 = icmp sge i64 %5, %6
+  call void @assert(i1 %7)
+  %8 = load ptr, ptr %a, align 8
+  %type1 = getelementptr %Node, ptr %8, i32 0, i32 0
+  %9 = load i64, ptr %type1, align 4
+  %10 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %11 = icmp sle i64 %9, %10
+  call void @assert(i1 %11)
+  %12 = load ptr, ptr %b, align 8
+  %type2 = getelementptr %Node, ptr %12, i32 0, i32 0
+  %13 = load i64, ptr %type2, align 4
+  %14 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %15 = icmp sge i64 %13, %14
+  call void @assert(i1 %15)
+  %16 = load ptr, ptr %b, align 8
+  %type3 = getelementptr %Node, ptr %16, i32 0, i32 0
+  %17 = load i64, ptr %type3, align 4
+  %18 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %19 = icmp sle i64 %17, %18
+  call void @assert(i1 %19)
+  %20 = load ptr, ptr %a, align 8
+  %type4 = getelementptr %Node, ptr %20, i32 0, i32 0
+  %21 = load i64, ptr %type4, align 4
+  %22 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %23 = icmp eq i64 %21, %22
+  br i1 %23, label %then_block, label %merge_block6
+
+then_block:                                       ; preds = %entrypoint
+  %24 = load ptr, ptr %a, align 8
+  %data = getelementptr %Node, ptr %24, i32 0, i32 1
+  %25 = load ptr, ptr %data, align 8
+  %26 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %25, align 8
+  %simple_type_a = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %26, ptr %simple_type_a, align 8
+  %name = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a, i32 0, i32 0
+  %27 = load ptr, ptr %name, align 8
+  %28 = call i1 @strcmp(ptr %27, ptr @170)
+  br i1 %28, label %then_block5, label %merge_block
+
+then_block5:                                      ; preds = %then_block
+  ret i1 true
+
+merge_block:                                      ; preds = %then_block
+  br label %merge_block6
+
+merge_block6:                                     ; preds = %entrypoint, %merge_block
+  %29 = load i1, ptr %is_dereference, align 1
+  br i1 %29, label %then_block7, label %merge_block11
+
+then_block7:                                      ; preds = %merge_block6
+  %30 = load ptr, ptr %a, align 8
+  %type8 = getelementptr %Node, ptr %30, i32 0, i32 0
+  %31 = load i64, ptr %type8, align 4
+  %32 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %33 = icmp eq i64 %31, %32
+  call void @assert(i1 %33)
+  %34 = load ptr, ptr %a, align 8
+  %data9 = getelementptr %Node, ptr %34, i32 0, i32 1
+  %35 = load ptr, ptr %data9, align 8
+  %36 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %35, align 8
+  %pointer_type_a = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8
+  store %NODE_TYPE_POINTER_TYPE_DATA %36, ptr %pointer_type_a, align 8
+  %type10 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_a, i32 0, i32 0
+  %37 = load ptr, ptr %type10, align 8
+  store ptr %37, ptr %a, align 8
+  br label %merge_block11
+
+merge_block11:                                    ; preds = %merge_block6, %then_block7
+  %38 = load ptr, ptr %a, align 8
+  %type12 = getelementptr %Node, ptr %38, i32 0, i32 0
+  %39 = load i64, ptr %type12, align 4
+  %40 = load ptr, ptr %b, align 8
+  %type13 = getelementptr %Node, ptr %40, i32 0, i32 0
+  %41 = load i64, ptr %type13, align 4
+  %42 = icmp ne i64 %39, %41
+  br i1 %42, label %then_block14, label %merge_block17
+
+then_block14:                                     ; preds = %merge_block11
+  %43 = load ptr, ptr %a, align 8
+  %type15 = getelementptr %Node, ptr %43, i32 0, i32 0
+  %44 = load i64, ptr %type15, align 4
+  call void (ptr, ...) @printf(ptr @171, i64 %44)
+  %45 = load ptr, ptr %b, align 8
+  %type16 = getelementptr %Node, ptr %45, i32 0, i32 0
+  %46 = load i64, ptr %type16, align 4
+  call void (ptr, ...) @printf(ptr @172, i64 %46)
+  ret i1 false
+
+merge_block17:                                    ; preds = %merge_block11
+  %47 = load ptr, ptr %a, align 8
+  %type18 = getelementptr %Node, ptr %47, i32 0, i32 0
+  %48 = load i64, ptr %type18, align 4
+  %49 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %50 = icmp eq i64 %48, %49
+  br i1 %50, label %then_block19, label %merge_block30
+
+then_block19:                                     ; preds = %merge_block17
+  %51 = load ptr, ptr %b, align 8
+  %type20 = getelementptr %Node, ptr %51, i32 0, i32 0
+  %52 = load i64, ptr %type20, align 4
+  %53 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %54 = icmp eq i64 %52, %53
+  call void @assert(i1 %54)
+  %55 = load ptr, ptr %a, align 8
+  %data21 = getelementptr %Node, ptr %55, i32 0, i32 1
+  %56 = load ptr, ptr %data21, align 8
+  %57 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %56, align 8
+  %simple_type_a22 = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %57, ptr %simple_type_a22, align 8
+  %58 = load ptr, ptr %b, align 8
+  %data23 = getelementptr %Node, ptr %58, i32 0, i32 1
+  %59 = load ptr, ptr %data23, align 8
+  %60 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %59, align 8
+  %simple_type_b = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %60, ptr %simple_type_b, align 8
+  %name24 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a22, i32 0, i32 0
+  %61 = load ptr, ptr %name24, align 8
+  %name25 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_b, i32 0, i32 0
+  %62 = load ptr, ptr %name25, align 8
+  %63 = call i1 @strcmp(ptr %61, ptr %62)
+  %eql = alloca i1, align 1
+  store i1 %63, ptr %eql, align 1
+  %64 = load i1, ptr %eql, align 1
+  %65 = icmp eq i1 %64, false
+  br i1 %65, label %then_block26, label %merge_block29
+
+then_block26:                                     ; preds = %then_block19
+  %name27 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a22, i32 0, i32 0
+  %66 = load ptr, ptr %name27, align 8
+  call void (ptr, ...) @printf(ptr @173, ptr %66)
+  %name28 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_b, i32 0, i32 0
+  %67 = load ptr, ptr %name28, align 8
+  call void (ptr, ...) @printf(ptr @174, ptr %67)
+  br label %merge_block29
+
+merge_block29:                                    ; preds = %then_block19, %then_block26
+  %68 = load i1, ptr %eql, align 1
+  ret i1 %68
+
+merge_block30:                                    ; preds = %merge_block17
+  %69 = load ptr, ptr %a, align 8
+  %type31 = getelementptr %Node, ptr %69, i32 0, i32 0
+  %70 = load i64, ptr %type31, align 4
+  %71 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %72 = icmp eq i64 %70, %71
+  br i1 %72, label %then_block32, label %merge_block46
+
+then_block32:                                     ; preds = %merge_block30
+  %73 = load ptr, ptr %b, align 8
+  %type33 = getelementptr %Node, ptr %73, i32 0, i32 0
+  %74 = load i64, ptr %type33, align 4
+  %75 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %76 = icmp eq i64 %74, %75
+  call void @assert(i1 %76)
+  %77 = load ptr, ptr %a, align 8
+  %data34 = getelementptr %Node, ptr %77, i32 0, i32 1
+  %78 = load ptr, ptr %data34, align 8
+  %79 = load %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %78, align 8
+  %function_type_a = alloca %NODE_TYPE_FUNCTION_TYPE_DATA, align 8
+  store %NODE_TYPE_FUNCTION_TYPE_DATA %79, ptr %function_type_a, align 8
+  %80 = load ptr, ptr %b, align 8
+  %data35 = getelementptr %Node, ptr %80, i32 0, i32 1
+  %81 = load ptr, ptr %data35, align 8
+  %82 = load %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %81, align 8
+  %function_type_b = alloca %NODE_TYPE_FUNCTION_TYPE_DATA, align 8
+  store %NODE_TYPE_FUNCTION_TYPE_DATA %82, ptr %function_type_b, align 8
+  %83 = load ptr, ptr %c, align 8
+  %retur_type = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 2
+  %84 = load ptr, ptr %retur_type, align 8
+  %retur_type36 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 2
+  %85 = load ptr, ptr %retur_type36, align 8
+  %86 = call i1 @compare_types(ptr %83, ptr %84, ptr %85, i1 false)
+  %87 = icmp eq i1 %86, false
+  br i1 %87, label %then_block37, label %merge_block38
+
+then_block37:                                     ; preds = %then_block32
+  call void (ptr, ...) @printf(ptr @175)
+  ret i1 false
+
+merge_block38:                                    ; preds = %then_block32
+  %parameters_len = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 1
+  %88 = load i64, ptr %parameters_len, align 4
+  %parameters_len39 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 1
+  %89 = load i64, ptr %parameters_len39, align 4
+  %90 = icmp ne i64 %88, %89
+  br i1 %90, label %then_block40, label %merge_block41
+
+then_block40:                                     ; preds = %merge_block38
+  call void (ptr, ...) @printf(ptr @176)
+  ret i1 false
+
+merge_block41:                                    ; preds = %merge_block38
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block45, %merge_block41
+  %91 = load i64, ptr %i, align 4
+  %parameters_len42 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 1
+  %92 = load i64, ptr %parameters_len42, align 4
+  %93 = icmp slt i64 %91, %92
+  br i1 %93, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %parameters = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 0
+  %94 = load ptr, ptr %parameters, align 8
+  %95 = load i64, ptr %i, align 4
+  %96 = getelementptr ptr, ptr %94, i64 %95
+  %97 = load ptr, ptr %96, align 8
+  %param_a = alloca ptr, align 8
+  store ptr %97, ptr %param_a, align 8
+  %parameters43 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 0
+  %98 = load ptr, ptr %parameters43, align 8
+  %99 = load i64, ptr %i, align 4
+  %100 = getelementptr ptr, ptr %98, i64 %99
+  %101 = load ptr, ptr %100, align 8
+  %param_b = alloca ptr, align 8
+  store ptr %101, ptr %param_b, align 8
+  %102 = load ptr, ptr %c, align 8
+  %103 = load ptr, ptr %param_a, align 8
+  %104 = load ptr, ptr %param_b, align 8
+  %105 = call i1 @compare_types(ptr %102, ptr %103, ptr %104, i1 false)
+  %106 = icmp eq i1 %105, false
+  br i1 %106, label %then_block44, label %merge_block45
+
+outer_block:                                      ; preds = %while_block
+  ret i1 true
+
+then_block44:                                     ; preds = %inner_block
+  call void (ptr, ...) @printf(ptr @177)
+  ret i1 false
+
+merge_block45:                                    ; preds = %inner_block
+  %107 = load i64, ptr %i, align 4
+  %108 = add i64 %107, 1
+  store i64 %108, ptr %i, align 4
+  br label %while_block
+
+merge_block46:                                    ; preds = %merge_block30
+  %109 = load ptr, ptr %a, align 8
+  %type47 = getelementptr %Node, ptr %109, i32 0, i32 0
+  %110 = load i64, ptr %type47, align 4
+  %111 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %112 = icmp eq i64 %110, %111
+  br i1 %112, label %then_block48, label %merge_block57
+
+then_block48:                                     ; preds = %merge_block46
+  %113 = load ptr, ptr %b, align 8
+  %type49 = getelementptr %Node, ptr %113, i32 0, i32 0
+  %114 = load i64, ptr %type49, align 4
+  %115 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %116 = icmp eq i64 %114, %115
+  call void @assert(i1 %116)
+  %117 = load ptr, ptr %a, align 8
+  %data50 = getelementptr %Node, ptr %117, i32 0, i32 1
+  %118 = load ptr, ptr %data50, align 8
+  %119 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %118, align 8
+  %pointer_type_a51 = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8
+  store %NODE_TYPE_POINTER_TYPE_DATA %119, ptr %pointer_type_a51, align 8
+  %120 = load ptr, ptr %b, align 8
+  %data52 = getelementptr %Node, ptr %120, i32 0, i32 1
+  %121 = load ptr, ptr %data52, align 8
+  %122 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %121, align 8
+  %pointer_type_b = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8
+  store %NODE_TYPE_POINTER_TYPE_DATA %122, ptr %pointer_type_b, align 8
+  %123 = load ptr, ptr %c, align 8
+  %type53 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_a51, i32 0, i32 0
+  %124 = load ptr, ptr %type53, align 8
+  %type54 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_b, i32 0, i32 0
+  %125 = load ptr, ptr %type54, align 8
+  %126 = call i1 @compare_types(ptr %123, ptr %124, ptr %125, i1 false)
+  %127 = icmp eq i1 %126, false
+  br i1 %127, label %then_block55, label %merge_block56
+
+then_block55:                                     ; preds = %then_block48
+  call void (ptr, ...) @printf(ptr @178)
+  ret i1 false
+
+merge_block56:                                    ; preds = %then_block48
+  ret i1 true
+
+merge_block57:                                    ; preds = %merge_block46
+  %128 = load ptr, ptr %a, align 8
+  %type58 = getelementptr %Node, ptr %128, i32 0, i32 0
+  %129 = load i64, ptr %type58, align 4
+  %130 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %131 = icmp eq i64 %129, %130
+  br i1 %131, label %then_block59, label %merge_block74
+
+then_block59:                                     ; preds = %merge_block57
+  %132 = load ptr, ptr %b, align 8
+  %type60 = getelementptr %Node, ptr %132, i32 0, i32 0
+  %133 = load i64, ptr %type60, align 4
+  %134 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %135 = icmp eq i64 %133, %134
+  call void @assert(i1 %135)
+  %136 = load ptr, ptr %a, align 8
+  %data61 = getelementptr %Node, ptr %136, i32 0, i32 1
+  %137 = load ptr, ptr %data61, align 8
+  %138 = load %NODE_TYPE_STRUCT_TYPE_DATA, ptr %137, align 8
+  %struc_type_a = alloca %NODE_TYPE_STRUCT_TYPE_DATA, align 8
+  store %NODE_TYPE_STRUCT_TYPE_DATA %138, ptr %struc_type_a, align 8
+  %139 = load ptr, ptr %b, align 8
+  %data62 = getelementptr %Node, ptr %139, i32 0, i32 1
+  %140 = load ptr, ptr %data62, align 8
+  %141 = load %NODE_TYPE_STRUCT_TYPE_DATA, ptr %140, align 8
+  %struc_type_b = alloca %NODE_TYPE_STRUCT_TYPE_DATA, align 8
+  store %NODE_TYPE_STRUCT_TYPE_DATA %141, ptr %struc_type_b, align 8
+  %fields_len = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_a, i32 0, i32 1
+  %142 = load i64, ptr %fields_len, align 4
+  %fields_len63 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_b, i32 0, i32 1
+  %143 = load i64, ptr %fields_len63, align 4
+  %144 = icmp ne i64 %142, %143
+  br i1 %144, label %then_block64, label %merge_block65
+
+then_block64:                                     ; preds = %then_block59
+  call void (ptr, ...) @printf(ptr @179)
+  ret i1 false
+
+merge_block65:                                    ; preds = %then_block59
+  %i66 = alloca i64, align 8
+  store i64 0, ptr %i66, align 4
+  br label %while_block67
+
+while_block67:                                    ; preds = %merge_block73, %merge_block65
+  %145 = load i64, ptr %i66, align 4
+  %fields_len68 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_a, i32 0, i32 1
+  %146 = load i64, ptr %fields_len68, align 4
+  %147 = icmp slt i64 %145, %146
+  br i1 %147, label %inner_block69, label %outer_block70
+
+inner_block69:                                    ; preds = %while_block67
+  %fields = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_a, i32 0, i32 0
+  %148 = load ptr, ptr %fields, align 8
+  %149 = load i64, ptr %i66, align 4
+  %150 = getelementptr ptr, ptr %148, i64 %149
+  %151 = load ptr, ptr %150, align 8
+  %field_a = alloca ptr, align 8
+  store ptr %151, ptr %field_a, align 8
+  %fields71 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_b, i32 0, i32 0
+  %152 = load ptr, ptr %fields71, align 8
+  %153 = load i64, ptr %i66, align 4
+  %154 = getelementptr ptr, ptr %152, i64 %153
+  %155 = load ptr, ptr %154, align 8
+  %field_b = alloca ptr, align 8
+  store ptr %155, ptr %field_b, align 8
+  %156 = load ptr, ptr %c, align 8
+  %157 = load ptr, ptr %field_a, align 8
+  %158 = load ptr, ptr %field_b, align 8
+  %159 = call i1 @compare_types(ptr %156, ptr %157, ptr %158, i1 false)
+  %160 = icmp eq i1 %159, false
+  br i1 %160, label %then_block72, label %merge_block73
+
+outer_block70:                                    ; preds = %while_block67
+  ret i1 true
+
+then_block72:                                     ; preds = %inner_block69
+  call void (ptr, ...) @printf(ptr @180)
+  ret i1 false
+
+merge_block73:                                    ; preds = %inner_block69
+  %161 = load i64, ptr %i66, align 4
+  %162 = add i64 %161, 1
+  store i64 %162, ptr %i66, align 4
+  br label %while_block67
+
+merge_block74:                                    ; preds = %merge_block57
+  ret i1 false
+}
+
+define ptr @codegen_get_llvm_type(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %node = alloca ptr, align 8
+  store ptr %1, ptr %node, align 8
+  %2 = load ptr, ptr %node, align 8
+  %type = getelementptr %Node, ptr %2, i32 0, i32 0
+  %3 = load i64, ptr %type, align 4
+  %4 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %5 = icmp sge i64 %3, %4
+  call void @assert(i1 %5)
+  %6 = load ptr, ptr %node, align 8
+  %type1 = getelementptr %Node, ptr %6, i32 0, i32 0
+  %7 = load i64, ptr %type1, align 4
+  %8 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %9 = icmp sle i64 %7, %8
+  call void @assert(i1 %9)
+  %10 = load ptr, ptr %node, align 8
+  %type2 = getelementptr %Node, ptr %10, i32 0, i32 0
+  %11 = load i64, ptr %type2, align 4
+  %12 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %13 = icmp eq i64 %11, %12
+  br i1 %13, label %then_block, label %merge_block32
+
+then_block:                                       ; preds = %entrypoint
+  %14 = load ptr, ptr %node, align 8
+  %data = getelementptr %Node, ptr %14, i32 0, i32 1
+  %15 = load ptr, ptr %data, align 8
+  %16 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %15, align 8
+  %simple_type = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %16, ptr %simple_type, align 8
+  %name = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %17 = load ptr, ptr %name, align 8
+  %18 = call i1 @strcmp(ptr %17, ptr @181)
+  br i1 %18, label %then_block3, label %merge_block
+
+then_block3:                                      ; preds = %then_block
+  %19 = load ptr, ptr %c, align 8
+  %arena = getelementptr %codegen, ptr %19, i32 0, i32 3
+  %20 = load ptr, ptr %arena, align 8
+  %21 = call ptr @arena_alloc(ptr %20, i64 8)
+  %r = alloca ptr, align 8
+  store ptr %21, ptr %r, align 8
+  %22 = call ptr @LLVMInt8Type()
+  %23 = load ptr, ptr %r, align 8
+  store ptr %22, ptr %23, align 8
+  %24 = load ptr, ptr %r, align 8
+  ret ptr %24
+
+merge_block:                                      ; preds = %then_block
+  %name4 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %25 = load ptr, ptr %name4, align 8
+  %26 = call i1 @strcmp(ptr %25, ptr @182)
+  br i1 %26, label %then_block5, label %merge_block8
+
+then_block5:                                      ; preds = %merge_block
+  %27 = load ptr, ptr %c, align 8
+  %arena6 = getelementptr %codegen, ptr %27, i32 0, i32 3
+  %28 = load ptr, ptr %arena6, align 8
+  %29 = call ptr @arena_alloc(ptr %28, i64 8)
+  %r7 = alloca ptr, align 8
+  store ptr %29, ptr %r7, align 8
+  %30 = call ptr @LLVMInt64Type()
+  %31 = load ptr, ptr %r7, align 8
+  store ptr %30, ptr %31, align 8
+  %32 = load ptr, ptr %r7, align 8
+  ret ptr %32
+
+merge_block8:                                     ; preds = %merge_block
+  %name9 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %33 = load ptr, ptr %name9, align 8
+  %34 = call i1 @strcmp(ptr %33, ptr @183)
+  br i1 %34, label %then_block10, label %merge_block13
+
+then_block10:                                     ; preds = %merge_block8
+  %35 = load ptr, ptr %c, align 8
+  %arena11 = getelementptr %codegen, ptr %35, i32 0, i32 3
+  %36 = load ptr, ptr %arena11, align 8
+  %37 = call ptr @arena_alloc(ptr %36, i64 8)
+  %r12 = alloca ptr, align 8
+  store ptr %37, ptr %r12, align 8
+  %38 = call ptr @LLVMInt1Type()
+  %39 = load ptr, ptr %r12, align 8
+  store ptr %38, ptr %39, align 8
+  %40 = load ptr, ptr %r12, align 8
+  ret ptr %40
+
+merge_block13:                                    ; preds = %merge_block8
+  %name14 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %41 = load ptr, ptr %name14, align 8
+  %42 = call i1 @strcmp(ptr %41, ptr @184)
+  br i1 %42, label %then_block15, label %merge_block18
+
+then_block15:                                     ; preds = %merge_block13
+  %43 = load ptr, ptr %c, align 8
+  %arena16 = getelementptr %codegen, ptr %43, i32 0, i32 3
+  %44 = load ptr, ptr %arena16, align 8
+  %45 = call ptr @arena_alloc(ptr %44, i64 8)
+  %r17 = alloca ptr, align 8
+  store ptr %45, ptr %r17, align 8
+  %46 = call ptr @LLVMVoidType()
+  %47 = load ptr, ptr %r17, align 8
+  store ptr %46, ptr %47, align 8
+  %48 = load ptr, ptr %r17, align 8
+  ret ptr %48
+
+merge_block18:                                    ; preds = %merge_block13
+  %name19 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %49 = load ptr, ptr %name19, align 8
+  %50 = call i1 @strcmp(ptr %49, ptr @185)
+  br i1 %50, label %then_block20, label %merge_block23
+
+then_block20:                                     ; preds = %merge_block18
+  %51 = load ptr, ptr %c, align 8
+  %arena21 = getelementptr %codegen, ptr %51, i32 0, i32 3
+  %52 = load ptr, ptr %arena21, align 8
+  %53 = call ptr @arena_alloc(ptr %52, i64 8)
+  %r22 = alloca ptr, align 8
+  store ptr %53, ptr %r22, align 8
+  %54 = call ptr @LLVMInt64Type()
+  %55 = call ptr @LLVMPointerType(ptr %54, i64 0)
+  %56 = load ptr, ptr %r22, align 8
+  store ptr %55, ptr %56, align 8
+  %57 = load ptr, ptr %r22, align 8
+  ret ptr %57
+
+merge_block23:                                    ; preds = %merge_block18
+  %58 = load ptr, ptr %c, align 8
+  %environment = getelementptr %codegen, ptr %58, i32 0, i32 4
+  %59 = load ptr, ptr %environment, align 8
+  %name24 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %60 = load ptr, ptr %name24, align 8
+  %61 = call ptr @environment_get_variable(ptr %59, ptr %60)
+  %v = alloca ptr, align 8
+  store ptr %61, ptr %v, align 8
+  %62 = load ptr, ptr %v, align 8
+  %63 = icmp ne ptr %62, null
+  br i1 %63, label %then_block25, label %merge_block30
+
+then_block25:                                     ; preds = %merge_block23
+  %64 = load ptr, ptr %v, align 8
+  %type26 = getelementptr %Variable, ptr %64, i32 0, i32 1
+  %65 = load ptr, ptr %type26, align 8
+  %66 = icmp ne ptr %65, null
+  call void @assert(i1 %66)
+  %67 = load ptr, ptr %c, align 8
+  %arena27 = getelementptr %codegen, ptr %67, i32 0, i32 3
+  %68 = load ptr, ptr %arena27, align 8
+  %69 = call ptr @arena_alloc(ptr %68, i64 8)
+  %r28 = alloca ptr, align 8
+  store ptr %69, ptr %r28, align 8
+  %70 = load ptr, ptr %v, align 8
+  %type29 = getelementptr %Variable, ptr %70, i32 0, i32 1
+  %71 = load ptr, ptr %type29, align 8
+  %72 = load ptr, ptr %r28, align 8
+  store ptr %71, ptr %72, align 8
+  %73 = load ptr, ptr %r28, align 8
+  ret ptr %73
+
+merge_block30:                                    ; preds = %merge_block23
+  %name31 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %74 = load ptr, ptr %name31, align 8
+  call void (ptr, ...) @printf(ptr @186, ptr %74)
+  call void @assert(i1 false)
+  br label %merge_block32
+
+merge_block32:                                    ; preds = %entrypoint, %merge_block30
+  %75 = load ptr, ptr %node, align 8
+  %type33 = getelementptr %Node, ptr %75, i32 0, i32 0
+  %76 = load i64, ptr %type33, align 4
+  %77 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %78 = icmp eq i64 %76, %77
+  br i1 %78, label %then_block34, label %merge_block55
+
+then_block34:                                     ; preds = %merge_block32
+  %79 = load ptr, ptr %node, align 8
+  %data35 = getelementptr %Node, ptr %79, i32 0, i32 1
+  %80 = load ptr, ptr %data35, align 8
+  %81 = load %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %80, align 8
+  %function_type = alloca %NODE_TYPE_FUNCTION_TYPE_DATA, align 8
+  store %NODE_TYPE_FUNCTION_TYPE_DATA %81, ptr %function_type, align 8
+  %retur_type = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type, i32 0, i32 2
+  %82 = load ptr, ptr %retur_type, align 8
+  %f_retur = alloca ptr, align 8
+  store ptr %82, ptr %f_retur, align 8
+  %83 = load ptr, ptr %c, align 8
+  %84 = load ptr, ptr %f_retur, align 8
+  %85 = call ptr @codegen_get_llvm_type(ptr %83, ptr %84)
+  %retur_type36 = alloca ptr, align 8
+  store ptr %85, ptr %retur_type36, align 8
+  %86 = load ptr, ptr %retur_type36, align 8
+  %87 = icmp ne ptr %86, null
+  call void @assert(i1 %87)
+  %88 = load ptr, ptr %f_retur, align 8
+  %type37 = getelementptr %Node, ptr %88, i32 0, i32 0
+  %89 = load i64, ptr %type37, align 4
+  %90 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %91 = icmp eq i64 %89, %90
+  br i1 %91, label %then_block38, label %merge_block39
+
+then_block38:                                     ; preds = %then_block34
+  %92 = load ptr, ptr %retur_type36, align 8
+  %93 = load ptr, ptr %retur_type36, align 8
+  %94 = load ptr, ptr %93, align 8
+  %95 = call ptr @LLVMPointerType(ptr %94, i64 0)
+  store ptr %95, ptr %92, align 8
+  br label %merge_block39
+
+merge_block39:                                    ; preds = %then_block34, %then_block38
+  %96 = load ptr, ptr %c, align 8
+  %arena40 = getelementptr %codegen, ptr %96, i32 0, i32 3
+  %97 = load ptr, ptr %arena40, align 8
+  %98 = call ptr @arena_alloc(ptr %97, i64 160)
+  %paramtypes = alloca ptr, align 8
+  store ptr %98, ptr %paramtypes, align 8
+  %paramtypes_len = alloca i64, align 8
+  store i64 0, ptr %paramtypes_len, align 4
+  %is_varargs = alloca i64, align 8
+  store i64 0, ptr %is_varargs, align 4
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block51, %then_block46, %merge_block39
+  %99 = load i64, ptr %i, align 4
+  %parameters_len = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type, i32 0, i32 1
+  %100 = load i64, ptr %parameters_len, align 4
+  %101 = icmp slt i64 %99, %100
+  br i1 %101, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %parameters = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type, i32 0, i32 0
+  %102 = load ptr, ptr %parameters, align 8
+  %103 = load i64, ptr %i, align 4
+  %104 = getelementptr ptr, ptr %102, i64 %103
+  %105 = load ptr, ptr %104, align 8
+  %param = alloca ptr, align 8
+  store ptr %105, ptr %param, align 8
+  %106 = load ptr, ptr %param, align 8
+  %type41 = getelementptr %Node, ptr %106, i32 0, i32 0
+  %107 = load i64, ptr %type41, align 4
+  %108 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %109 = icmp eq i64 %107, %108
+  br i1 %109, label %then_block42, label %merge_block48
+
+outer_block:                                      ; preds = %while_block
+  %110 = load ptr, ptr %retur_type36, align 8
+  %111 = load ptr, ptr %110, align 8
+  %112 = load ptr, ptr %paramtypes, align 8
+  %113 = load i64, ptr %paramtypes_len, align 4
+  %114 = load i64, ptr %is_varargs, align 4
+  %115 = call ptr @LLVMFunctionType(ptr %111, ptr %112, i64 %113, i64 %114)
+  %function_type52 = alloca ptr, align 8
+  store ptr %115, ptr %function_type52, align 8
+  %116 = load ptr, ptr %c, align 8
+  %arena53 = getelementptr %codegen, ptr %116, i32 0, i32 3
+  %117 = load ptr, ptr %arena53, align 8
+  %118 = call ptr @arena_alloc(ptr %117, i64 8)
+  %r54 = alloca ptr, align 8
+  store ptr %118, ptr %r54, align 8
+  %119 = load ptr, ptr %function_type52, align 8
+  %120 = load ptr, ptr %r54, align 8
+  store ptr %119, ptr %120, align 8
+  %121 = load ptr, ptr %r54, align 8
+  ret ptr %121
+
+then_block42:                                     ; preds = %inner_block
+  %122 = load ptr, ptr %param, align 8
+  %data43 = getelementptr %Node, ptr %122, i32 0, i32 1
+  %123 = load ptr, ptr %data43, align 8
+  %124 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %123, align 8
+  %simple_type44 = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %124, ptr %simple_type44, align 8
+  %name45 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type44, i32 0, i32 0
+  %125 = load ptr, ptr %name45, align 8
+  %126 = call i1 @strcmp(ptr %125, ptr @187)
+  br i1 %126, label %then_block46, label %merge_block47
+
+then_block46:                                     ; preds = %then_block42
+  store i64 1, ptr %is_varargs, align 4
+  %127 = load i64, ptr %i, align 4
+  %128 = add i64 %127, 1
+  store i64 %128, ptr %i, align 4
+  br label %while_block
+
+merge_block47:                                    ; preds = %then_block42
+  br label %merge_block48
+
+merge_block48:                                    ; preds = %inner_block, %merge_block47
+  %129 = load ptr, ptr %c, align 8
+  %130 = load ptr, ptr %param, align 8
+  %131 = call ptr @codegen_get_llvm_type(ptr %129, ptr %130)
+  %typ = alloca ptr, align 8
+  store ptr %131, ptr %typ, align 8
+  %132 = load ptr, ptr %typ, align 8
+  %133 = icmp ne ptr %132, null
+  call void @assert(i1 %133)
+  %134 = load ptr, ptr %param, align 8
+  %type49 = getelementptr %Node, ptr %134, i32 0, i32 0
+  %135 = load i64, ptr %type49, align 4
+  %136 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %137 = icmp eq i64 %135, %136
+  br i1 %137, label %then_block50, label %merge_block51
+
+then_block50:                                     ; preds = %merge_block48
+  %138 = load ptr, ptr %typ, align 8
+  %139 = load ptr, ptr %138, align 8
+  %140 = call ptr @LLVMPointerType(ptr %139, i64 0)
+  %141 = load ptr, ptr %typ, align 8
+  store ptr %140, ptr %141, align 8
+  br label %merge_block51
+
+merge_block51:                                    ; preds = %merge_block48, %then_block50
+  %142 = load ptr, ptr %paramtypes, align 8
+  %143 = load i64, ptr %paramtypes_len, align 4
+  %144 = getelementptr ptr, ptr %142, i64 %143
+  %145 = load ptr, ptr %typ, align 8
+  %146 = load ptr, ptr %145, align 8
+  store ptr %146, ptr %144, align 8
+  %147 = load i64, ptr %paramtypes_len, align 4
+  %148 = add i64 %147, 1
+  store i64 %148, ptr %paramtypes_len, align 4
+  %149 = load i64, ptr %i, align 4
+  %150 = add i64 %149, 1
+  store i64 %150, ptr %i, align 4
+  br label %while_block
+
+merge_block55:                                    ; preds = %merge_block32
+  %151 = load ptr, ptr %node, align 8
+  %type56 = getelementptr %Node, ptr %151, i32 0, i32 0
+  %152 = load i64, ptr %type56, align 4
+  %153 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %154 = icmp eq i64 %152, %153
+  br i1 %154, label %then_block57, label %merge_block62
+
+then_block57:                                     ; preds = %merge_block55
+  %155 = load ptr, ptr %node, align 8
+  %data58 = getelementptr %Node, ptr %155, i32 0, i32 1
+  %156 = load ptr, ptr %data58, align 8
+  %157 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %156, align 8
+  %pointer_type = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8
+  store %NODE_TYPE_POINTER_TYPE_DATA %157, ptr %pointer_type, align 8
+  %158 = load ptr, ptr %c, align 8
+  %type59 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type, i32 0, i32 0
+  %159 = load ptr, ptr %type59, align 8
+  %160 = call ptr @codegen_get_llvm_type(ptr %158, ptr %159)
+  %inner_type = alloca ptr, align 8
+  store ptr %160, ptr %inner_type, align 8
+  %161 = load ptr, ptr %inner_type, align 8
+  %162 = icmp ne ptr %161, null
+  call void @assert(i1 %162)
+  %163 = load ptr, ptr %c, align 8
+  %arena60 = getelementptr %codegen, ptr %163, i32 0, i32 3
+  %164 = load ptr, ptr %arena60, align 8
+  %165 = call ptr @arena_alloc(ptr %164, i64 8)
+  %r61 = alloca ptr, align 8
+  store ptr %165, ptr %r61, align 8
+  %166 = load ptr, ptr %inner_type, align 8
+  %167 = load ptr, ptr %166, align 8
+  %168 = call ptr @LLVMPointerType(ptr %167, i64 0)
+  %169 = load ptr, ptr %r61, align 8
+  store ptr %168, ptr %169, align 8
+  %170 = load ptr, ptr %r61, align 8
+  ret ptr %170
+
+merge_block62:                                    ; preds = %merge_block55
+  %171 = load ptr, ptr %node, align 8
+  %type63 = getelementptr %Node, ptr %171, i32 0, i32 0
+  %172 = load i64, ptr %type63, align 4
+  call void (ptr, ...) @printf(ptr @188, i64 %172)
+  call void @assert(i1 false)
+  ret ptr null
+}
+
+define ptr @codegen_generate_literal(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %literal_val = alloca ptr, align 8
+  store ptr %1, ptr %literal_val, align 8
+  %name = alloca ptr, align 8
+  store ptr %2, ptr %name, align 8
+  %node = alloca ptr, align 8
+  store ptr %3, ptr %node, align 8
+  %node_type = alloca ptr, align 8
+  store ptr %4, ptr %node_type, align 8
+  %5 = load ptr, ptr %name, align 8
+  %6 = icmp ne ptr %5, null
+  br i1 %6, label %then_block, label %merge_block5
+
+then_block:                                       ; preds = %entrypoint
+  %7 = load ptr, ptr %c, align 8
+  %environment = getelementptr %codegen, ptr %7, i32 0, i32 4
+  %8 = load ptr, ptr %environment, align 8
+  %e = alloca ptr, align 8
+  store ptr %8, ptr %e, align 8
+  %9 = load ptr, ptr %e, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %9, i32 0, i32 1
+  %10 = load i64, ptr %scope_stack_len, align 4
+  %11 = icmp eq i64 %10, 1
+  br i1 %11, label %then_block1, label %merge_block
+
+then_block1:                                      ; preds = %then_block
+  %12 = load ptr, ptr %c, align 8
+  %13 = load ptr, ptr %node_type, align 8
+  %14 = call ptr @codegen_get_llvm_type(ptr %12, ptr %13)
+  %lt = alloca ptr, align 8
+  store ptr %14, ptr %lt, align 8
+  %15 = load ptr, ptr %lt, align 8
+  %16 = icmp ne ptr %15, null
+  call void @assert(i1 %16)
+  %v = alloca %Variable, align 8
+  %value = getelementptr %Variable, ptr %v, i32 0, i32 0
+  %17 = load ptr, ptr %c, align 8
+  %llvm_module = getelementptr %codegen, ptr %17, i32 0, i32 0
+  %18 = load ptr, ptr %llvm_module, align 8
+  %19 = load ptr, ptr %lt, align 8
+  %20 = load ptr, ptr %19, align 8
+  %21 = load ptr, ptr %name, align 8
+  %22 = call ptr @LLVMAddGlobal(ptr %18, ptr %20, ptr %21)
+  store ptr %22, ptr %value, align 8
+  %type = getelementptr %Variable, ptr %v, i32 0, i32 1
+  store ptr null, ptr %type, align 8
+  %stack_level = getelementptr %Variable, ptr %v, i32 0, i32 4
+  store ptr null, ptr %stack_level, align 8
+  %node2 = getelementptr %Variable, ptr %v, i32 0, i32 2
+  %23 = load ptr, ptr %node, align 8
+  store ptr %23, ptr %node2, align 8
+  %node_type3 = getelementptr %Variable, ptr %v, i32 0, i32 3
+  %24 = load ptr, ptr %node_type, align 8
+  store ptr %24, ptr %node_type3, align 8
+  %value4 = getelementptr %Variable, ptr %v, i32 0, i32 0
+  %25 = load ptr, ptr %value4, align 8
+  %26 = load ptr, ptr %literal_val, align 8
+  call void @LLVMSetInitializer(ptr %25, ptr %26)
+  %27 = load ptr, ptr %c, align 8
+  %28 = load %Variable, ptr %v, align 8
+  %29 = call ptr @codegen_create_variable(ptr %27, %Variable %28)
+  ret ptr %29
+
+merge_block:                                      ; preds = %then_block
+  br label %merge_block5
+
+merge_block5:                                     ; preds = %entrypoint, %merge_block
+  %v6 = alloca %Variable, align 8
+  %value7 = getelementptr %Variable, ptr %v6, i32 0, i32 0
+  %30 = load ptr, ptr %literal_val, align 8
+  store ptr %30, ptr %value7, align 8
+  %type8 = getelementptr %Variable, ptr %v6, i32 0, i32 1
+  store ptr null, ptr %type8, align 8
+  %stack_level9 = getelementptr %Variable, ptr %v6, i32 0, i32 4
+  store ptr null, ptr %stack_level9, align 8
+  %node10 = getelementptr %Variable, ptr %v6, i32 0, i32 2
+  %31 = load ptr, ptr %node, align 8
+  store ptr %31, ptr %node10, align 8
+  %node_type11 = getelementptr %Variable, ptr %v6, i32 0, i32 3
+  %32 = load ptr, ptr %node_type, align 8
+  store ptr %32, ptr %node_type11, align 8
+  %33 = load ptr, ptr %c, align 8
+  %34 = load %Variable, ptr %v6, align 8
+  %35 = call ptr @codegen_create_variable(ptr %33, %Variable %34)
+  ret ptr %35
+}
+
+define i64 @codegen_generate_statement(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %statement = alloca ptr, align 8
+  store ptr %1, ptr %statement, align 8
+  %2 = load ptr, ptr %statement, align 8
+  %3 = load %Node, ptr %2, align 8
+  %stmt = alloca %Node, align 8
+  store %Node %3, ptr %stmt, align 8
+  %type = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %4 = load i64, ptr %type, align 4
+  %5 = load i64, ptr @NODE_ASSIGNMENT_STATEMENT, align 4
+  %6 = icmp eq i64 %4, %5
+  br i1 %6, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %7 = load ptr, ptr %c, align 8
+  %data = getelementptr %Node, ptr %stmt, i32 0, i32 1
+  %8 = load ptr, ptr %data, align 8
+  %9 = call i64 @codegen_generate_assignment_statement(ptr %7, ptr %8)
+  ret i64 %9
+
+merge_block:                                      ; preds = %entrypoint
+  %type1 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %10 = load i64, ptr %type1, align 4
+  %11 = load i64, ptr @NODE_RETURN_STATEMENT, align 4
+  %12 = icmp eq i64 %10, %11
+  br i1 %12, label %then_block2, label %merge_block4
+
+then_block2:                                      ; preds = %merge_block
+  %13 = load ptr, ptr %c, align 8
+  %data3 = getelementptr %Node, ptr %stmt, i32 0, i32 1
+  %14 = load ptr, ptr %data3, align 8
+  %15 = call i64 @codegen_generate_return_statement(ptr %13, ptr %14)
+  ret i64 %15
+
+merge_block4:                                     ; preds = %merge_block
+  %type5 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %16 = load i64, ptr %type5, align 4
+  %17 = load i64, ptr @NODE_FUNCTION_CALL_STATEMENT, align 4
+  %18 = icmp eq i64 %16, %17
+  br i1 %18, label %then_block6, label %merge_block7
+
+then_block6:                                      ; preds = %merge_block4
+  %19 = load ptr, ptr %c, align 8
+  %20 = load ptr, ptr %statement, align 8
+  %21 = call ptr @codegen_generate_function_call_statement(ptr %19, ptr %20)
+  ret i64 0
+
+merge_block7:                                     ; preds = %merge_block4
+  %type8 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %22 = load i64, ptr %type8, align 4
+  %23 = load i64, ptr @NODE_IF_STATEMENT, align 4
+  %24 = icmp eq i64 %22, %23
+  br i1 %24, label %then_block9, label %merge_block11
+
+then_block9:                                      ; preds = %merge_block7
+  %25 = load ptr, ptr %c, align 8
+  %data10 = getelementptr %Node, ptr %stmt, i32 0, i32 1
+  %26 = load ptr, ptr %data10, align 8
+  %27 = call ptr @codegen_generate_if_statement(ptr %25, ptr %26)
+  ret i64 0
+
+merge_block11:                                    ; preds = %merge_block7
+  %type12 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %28 = load i64, ptr %type12, align 4
+  %29 = load i64, ptr @NODE_WHILE_STATEMENT, align 4
+  %30 = icmp eq i64 %28, %29
+  br i1 %30, label %then_block13, label %merge_block15
+
+then_block13:                                     ; preds = %merge_block11
+  %31 = load ptr, ptr %c, align 8
+  %data14 = getelementptr %Node, ptr %stmt, i32 0, i32 1
+  %32 = load ptr, ptr %data14, align 8
+  %33 = call ptr @codegen_generate_while_statement(ptr %31, ptr %32)
+  ret i64 0
+
+merge_block15:                                    ; preds = %merge_block11
+  %type16 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %34 = load i64, ptr %type16, align 4
+  %35 = load i64, ptr @NODE_IMPORT_DECLARATION, align 4
+  %36 = icmp eq i64 %34, %35
+  br i1 %36, label %then_block17, label %merge_block19
+
+then_block17:                                     ; preds = %merge_block15
+  %37 = load ptr, ptr %c, align 8
+  %data18 = getelementptr %Node, ptr %stmt, i32 0, i32 1
+  %38 = load ptr, ptr %data18, align 8
+  %39 = call i64 @codegen_generate_import_declaration(ptr %37, ptr %38)
+  ret i64 %39
+
+merge_block19:                                    ; preds = %merge_block15
+  %type20 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %40 = load i64, ptr %type20, align 4
+  %41 = load i64, ptr @NODE_CONTINUE_STATEMENT, align 4
+  %42 = icmp eq i64 %40, %41
+  br i1 %42, label %then_block21, label %merge_block22
+
+then_block21:                                     ; preds = %merge_block19
+  %43 = load ptr, ptr %c, align 8
+  %44 = call i64 @codegen_generate_continue_statement(ptr %43)
+  ret i64 %44
+
+merge_block22:                                    ; preds = %merge_block19
+  %type23 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %45 = load i64, ptr %type23, align 4
+  %46 = load i64, ptr @NODE_BREAK_STATEMENT, align 4
+  %47 = icmp eq i64 %45, %46
+  br i1 %47, label %then_block24, label %merge_block25
+
+then_block24:                                     ; preds = %merge_block22
+  %48 = load ptr, ptr %c, align 8
+  %49 = call i64 @codegen_generate_break_statement(ptr %48)
+  ret i64 %49
+
+merge_block25:                                    ; preds = %merge_block22
+  %type26 = getelementptr %Node, ptr %stmt, i32 0, i32 0
+  %50 = load i64, ptr %type26, align 4
+  call void (ptr, ...) @printf(ptr @231, i64 %50)
+  call void @assert(i1 false)
+  ret i64 0
+}
+
+define ptr @codegen_generate_function_call_statement(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %statement = alloca ptr, align 8
+  store ptr %1, ptr %statement, align 8
+  %2 = load ptr, ptr %statement, align 8
+  %type = getelementptr %Node, ptr %2, i32 0, i32 0
+  %3 = load i64, ptr %type, align 4
+  %4 = load i64, ptr @NODE_FUNCTION_CALL_STATEMENT, align 4
+  %5 = icmp eq i64 %3, %4
+  call void @assert(i1 %5)
+  %6 = load ptr, ptr %statement, align 8
+  %data = getelementptr %Node, ptr %6, i32 0, i32 1
+  %7 = load ptr, ptr %data, align 8
+  %stmt = alloca ptr, align 8
+  store ptr %7, ptr %stmt, align 8
+  %8 = load ptr, ptr %stmt, align 8
+  %expression = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %8, i32 0, i32 0
+  %9 = load ptr, ptr %expression, align 8
+  %expression1 = alloca ptr, align 8
+  store ptr %9, ptr %expression1, align 8
+  %10 = load ptr, ptr %statement, align 8
+  %node = alloca ptr, align 8
+  store ptr %10, ptr %node, align 8
+  %function = alloca ptr, align 8
+  store ptr null, ptr %function, align 8
+  %11 = load ptr, ptr %expression1, align 8
+  %type2 = getelementptr %Node, ptr %11, i32 0, i32 0
+  %12 = load i64, ptr %type2, align 4
+  %13 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %14 = icmp eq i64 %12, %13
+  br i1 %14, label %then_block, label %merge_block11
+
+then_block:                                       ; preds = %entrypoint
+  %15 = load ptr, ptr %expression1, align 8
+  %data3 = getelementptr %Node, ptr %15, i32 0, i32 1
+  %16 = load ptr, ptr %data3, align 8
+  %17 = load %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %16, align 8
+  %ident = alloca %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, align 8
+  store %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA %17, ptr %ident, align 8
+  %18 = load ptr, ptr %c, align 8
+  %environment = getelementptr %codegen, ptr %18, i32 0, i32 4
+  %19 = load ptr, ptr %environment, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %ident, i32 0, i32 0
+  %20 = load ptr, ptr %name, align 8
+  %21 = call ptr @environment_get_variable(ptr %19, ptr %20)
+  store ptr %21, ptr %function, align 8
+  %22 = load ptr, ptr %function, align 8
+  %23 = icmp eq ptr %22, null
+  br i1 %23, label %then_block4, label %merge_block
+
+then_block4:                                      ; preds = %then_block
+  %name5 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %ident, i32 0, i32 0
+  %24 = load ptr, ptr %name5, align 8
+  call void (ptr, ...) @printf(ptr @223, ptr %24)
+  call void @assert(i1 false)
+  br label %merge_block
+
+merge_block:                                      ; preds = %then_block, %then_block4
+  %25 = load ptr, ptr %function, align 8
+  %value = getelementptr %Variable, ptr %25, i32 0, i32 0
+  %26 = load ptr, ptr %value, align 8
+  %27 = call i64 @LLVMGetValueKind(ptr %26)
+  %28 = load i64, ptr @168, align 4
+  %29 = icmp ne i64 %27, %28
+  br i1 %29, label %then_block6, label %merge_block10
+
+then_block6:                                      ; preds = %merge_block
+  %30 = load ptr, ptr %c, align 8
+  %31 = load ptr, ptr %function, align 8
+  %node_type = getelementptr %Variable, ptr %31, i32 0, i32 3
+  %32 = load ptr, ptr %node_type, align 8
+  %33 = call ptr @codegen_get_llvm_type(ptr %30, ptr %32)
+  %lt = alloca ptr, align 8
+  store ptr %33, ptr %lt, align 8
+  %34 = load ptr, ptr %lt, align 8
+  %35 = icmp ne ptr %34, null
+  call void @assert(i1 %35)
+  %36 = load ptr, ptr %function, align 8
+  %value7 = getelementptr %Variable, ptr %36, i32 0, i32 0
+  %37 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %37, i32 0, i32 2
+  %38 = load ptr, ptr %builder, align 8
+  %39 = load ptr, ptr %lt, align 8
+  %40 = load ptr, ptr %39, align 8
+  %41 = call ptr @LLVMPointerType(ptr %40, i64 0)
+  %42 = load ptr, ptr %function, align 8
+  %value8 = getelementptr %Variable, ptr %42, i32 0, i32 0
+  %43 = load ptr, ptr %value8, align 8
+  %44 = call ptr @LLVMBuildLoad2(ptr %38, ptr %41, ptr %43, ptr @224)
+  store ptr %44, ptr %value7, align 8
+  %45 = load ptr, ptr %function, align 8
+  %node9 = getelementptr %Variable, ptr %45, i32 0, i32 2
+  %46 = load ptr, ptr %node9, align 8
+  store ptr %46, ptr %node, align 8
+  br label %merge_block10
+
+merge_block10:                                    ; preds = %merge_block, %then_block6
+  br label %merge_block11
+
+merge_block11:                                    ; preds = %entrypoint, %merge_block10
+  %47 = load ptr, ptr %expression1, align 8
+  %type12 = getelementptr %Node, ptr %47, i32 0, i32 0
+  %48 = load i64, ptr %type12, align 4
+  %49 = load i64, ptr @NODE_FUNCTION_DEFINITION, align 4
+  %50 = icmp eq i64 %48, %49
+  br i1 %50, label %then_block13, label %merge_block14
+
+then_block13:                                     ; preds = %merge_block11
+  %51 = load ptr, ptr %c, align 8
+  %52 = load ptr, ptr %expression1, align 8
+  %53 = call ptr @codegen_generate_expression_value(ptr %51, ptr %52, ptr null)
+  store ptr %53, ptr %function, align 8
+  br label %merge_block14
+
+merge_block14:                                    ; preds = %merge_block11, %then_block13
+  %54 = load ptr, ptr %function, align 8
+  %55 = icmp ne ptr %54, null
+  call void @assert(i1 %55)
+  %56 = load ptr, ptr %function, align 8
+  %node_type15 = getelementptr %Variable, ptr %56, i32 0, i32 3
+  %57 = load ptr, ptr %node_type15, align 8
+  %58 = icmp ne ptr %57, null
+  call void @assert(i1 %58)
+  %59 = load ptr, ptr %function, align 8
+  %node_type16 = getelementptr %Variable, ptr %59, i32 0, i32 3
+  %60 = load ptr, ptr %node_type16, align 8
+  %function_type = alloca ptr, align 8
+  store ptr %60, ptr %function_type, align 8
+  %61 = load ptr, ptr %function_type, align 8
+  %type17 = getelementptr %Node, ptr %61, i32 0, i32 0
+  %62 = load i64, ptr %type17, align 4
+  %63 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %64 = icmp eq i64 %62, %63
+  call void @assert(i1 %64)
+  %65 = load ptr, ptr %function_type, align 8
+  %data18 = getelementptr %Node, ptr %65, i32 0, i32 1
+  %66 = load ptr, ptr %data18, align 8
+  %function_type_data = alloca ptr, align 8
+  store ptr %66, ptr %function_type_data, align 8
+  %67 = load ptr, ptr %c, align 8
+  %arena = getelementptr %codegen, ptr %67, i32 0, i32 3
+  %68 = load ptr, ptr %arena, align 8
+  %69 = load ptr, ptr %stmt, align 8
+  %arguments_len = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %69, i32 0, i32 2
+  %70 = load i64, ptr %arguments_len, align 4
+  %71 = mul i64 8, %70
+  %72 = call ptr @arena_alloc(ptr %68, i64 %71)
+  %arguments = alloca ptr, align 8
+  store ptr %72, ptr %arguments, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %inner_block, %merge_block14
+  %73 = load i64, ptr %i, align 4
+  %74 = load ptr, ptr %stmt, align 8
+  %arguments_len19 = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %74, i32 0, i32 2
+  %75 = load i64, ptr %arguments_len19, align 4
+  %76 = icmp slt i64 %73, %75
+  br i1 %76, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %77 = load ptr, ptr %stmt, align 8
+  %arguments20 = getelementptr %NODE_FUNCTION_CALL_STATEMENT_DATA, ptr %77, i32 0, i32 1
+  %78 = load ptr, ptr %arguments20, align 8
+  %79 = load i64, ptr %i, align 4
+  %80 = getelementptr ptr, ptr %78, i64 %79
+  %81 = load ptr, ptr %80, align 8
+  %argument = alloca ptr, align 8
+  store ptr %81, ptr %argument, align 8
+  %82 = load ptr, ptr %c, align 8
+  %83 = load ptr, ptr %argument, align 8
+  %84 = call ptr @codegen_generate_expression_value(ptr %82, ptr %83, ptr null)
+  %arg = alloca ptr, align 8
+  store ptr %84, ptr %arg, align 8
+  %85 = load ptr, ptr %arg, align 8
+  %86 = icmp ne ptr %85, null
+  call void @assert(i1 %86)
+  %87 = load ptr, ptr %function_type_data, align 8
+  %parameters = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %87, i32 0, i32 0
+  %88 = load ptr, ptr %parameters, align 8
+  %89 = load i64, ptr %i, align 4
+  %90 = getelementptr ptr, ptr %88, i64 %89
+  %91 = load ptr, ptr %90, align 8
+  %expected_type = alloca ptr, align 8
+  store ptr %91, ptr %expected_type, align 8
+  %92 = load ptr, ptr %c, align 8
+  %93 = load ptr, ptr %expected_type, align 8
+  %94 = load ptr, ptr %arg, align 8
+  %node_type21 = getelementptr %Variable, ptr %94, i32 0, i32 3
+  %95 = load ptr, ptr %node_type21, align 8
+  %96 = call i1 @compare_types(ptr %92, ptr %93, ptr %95, i1 false)
+  call void @assert(i1 %96)
+  %97 = load ptr, ptr %arguments, align 8
+  %98 = load i64, ptr %i, align 4
+  %99 = getelementptr ptr, ptr %97, i64 %98
+  %100 = load ptr, ptr %arg, align 8
+  %value22 = getelementptr %Variable, ptr %100, i32 0, i32 0
+  %101 = load ptr, ptr %value22, align 8
+  store ptr %101, ptr %99, align 8
+  %102 = load i64, ptr %i, align 4
+  %103 = add i64 %102, 1
+  store i64 %103, ptr %i, align 4
+  br label %while_block
+
+outer_block:                                      ; preds = %while_block
+  %104 = load ptr, ptr %c, align 8
+  %105 = load ptr, ptr %function, align 8
+  %node_type23 = getelementptr %Variable, ptr %105, i32 0, i32 3
+  %106 = load ptr, ptr %node_type23, align 8
+  %107 = call ptr @codegen_get_llvm_type(ptr %104, ptr %106)
+  %function_type24 = alloca ptr, align 8
+  store ptr %107, ptr %function_type24, align 8
+  %108 = load ptr, ptr %function_type24, align 8
+  %109 = icmp ne ptr %108, null
+  call void @assert(i1 %109)
+  %110 = load ptr, ptr %c, align 8
+  %builder25 = getelementptr %codegen, ptr %110, i32 0, i32 2
+  %111 = load ptr, ptr %builder25, align 8
+  %112 = load ptr, ptr %function_type24, align 8
+  %113 = load ptr, ptr %112, align 8
+  %114 = load ptr, ptr %function, align 8
+  %value26 = getelementptr %Variable, ptr %114, i32 0, i32 0
+  %115 = load ptr, ptr %value26, align 8
+  %116 = load ptr, ptr %arguments, align 8
+  %117 = load i64, ptr %i, align 4
+  %118 = call ptr @LLVMBuildCall2(ptr %111, ptr %113, ptr %115, ptr %116, i64 %117, ptr @225)
+  %res = alloca ptr, align 8
+  store ptr %118, ptr %res, align 8
+  %119 = load ptr, ptr %c, align 8
+  %120 = load ptr, ptr %function, align 8
+  %node_type27 = getelementptr %Variable, ptr %120, i32 0, i32 3
+  %121 = load ptr, ptr %node_type27, align 8
+  %122 = call ptr @get_function_return_type(ptr %119, ptr %121)
+  %function_return_type = alloca ptr, align 8
+  store ptr %122, ptr %function_return_type, align 8
+  %v = alloca %Variable, align 8
+  %value28 = getelementptr %Variable, ptr %v, i32 0, i32 0
+  %123 = load ptr, ptr %res, align 8
+  store ptr %123, ptr %value28, align 8
+  %type29 = getelementptr %Variable, ptr %v, i32 0, i32 1
+  store ptr null, ptr %type29, align 8
+  %stack_level = getelementptr %Variable, ptr %v, i32 0, i32 4
+  store ptr null, ptr %stack_level, align 8
+  %node30 = getelementptr %Variable, ptr %v, i32 0, i32 2
+  %124 = load ptr, ptr %node, align 8
+  store ptr %124, ptr %node30, align 8
+  %node_type31 = getelementptr %Variable, ptr %v, i32 0, i32 3
+  %125 = load ptr, ptr %function_return_type, align 8
+  store ptr %125, ptr %node_type31, align 8
+  %126 = load ptr, ptr %c, align 8
+  %127 = load %Variable, ptr %v, align 8
+  %128 = call ptr @codegen_create_variable(ptr %126, %Variable %127)
+  ret ptr %128
+}
+
+define ptr @codegen_generate_expression_value(ptr %0, ptr %1, ptr %2) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %expression = alloca ptr, align 8
+  store ptr %1, ptr %expression, align 8
+  %name = alloca ptr, align 8
+  store ptr %2, ptr %name, align 8
+  %3 = load ptr, ptr %expression, align 8
+  %type = getelementptr %Node, ptr %3, i32 0, i32 0
+  %4 = load i64, ptr %type, align 4
+  %5 = load i64, ptr @NODE_PRIMARY_EXPRESSION_NULL, align 4
+  %6 = icmp eq i64 %4, %5
+  br i1 %6, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %7 = load ptr, ptr %c, align 8
+  %arena = getelementptr %codegen, ptr %7, i32 0, i32 3
+  %8 = load ptr, ptr %arena, align 8
+  %9 = call ptr @arena_alloc(ptr %8, i64 16)
+  %inner_type_data = alloca ptr, align 8
+  store ptr %9, ptr %inner_type_data, align 8
+  %10 = load ptr, ptr %inner_type_data, align 8
+  %name1 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %10, i32 0, i32 0
+  store ptr @190, ptr %name1, align 8
+  %inner_type = alloca %Node, align 8
+  %type2 = getelementptr %Node, ptr %inner_type, i32 0, i32 0
+  %11 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %11, ptr %type2, align 4
+  %data = getelementptr %Node, ptr %inner_type, i32 0, i32 1
+  %12 = load ptr, ptr %inner_type_data, align 8
+  store ptr %12, ptr %data, align 8
+  %13 = load ptr, ptr %c, align 8
+  %arena3 = getelementptr %codegen, ptr %13, i32 0, i32 3
+  %14 = load ptr, ptr %arena3, align 8
+  %15 = call ptr @arena_alloc(ptr %14, i64 8)
+  %node_type_data = alloca ptr, align 8
+  store ptr %15, ptr %node_type_data, align 8
+  %16 = load ptr, ptr %node_type_data, align 8
+  %type4 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %16, i32 0, i32 0
+  %17 = load ptr, ptr %c, align 8
+  %18 = load %Node, ptr %inner_type, align 8
+  %19 = call ptr @create_node(ptr %17, %Node %18)
+  store ptr %19, ptr %type4, align 8
+  %node_type = alloca %Node, align 8
+  %type5 = getelementptr %Node, ptr %node_type, i32 0, i32 0
+  %20 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  store i64 %20, ptr %type5, align 4
+  %data6 = getelementptr %Node, ptr %node_type, i32 0, i32 1
+  %21 = load ptr, ptr %node_type_data, align 8
+  store ptr %21, ptr %data6, align 8
+  %22 = load ptr, ptr %c, align 8
+  %23 = call ptr @LLVMInt8Type()
+  %24 = call ptr @LLVMPointerType(ptr %23, i64 0)
+  %25 = call ptr @LLVMConstNull(ptr %24)
+  %26 = load ptr, ptr %name, align 8
+  %27 = load ptr, ptr %expression, align 8
+  %28 = load ptr, ptr %c, align 8
+  %29 = load %Node, ptr %node_type, align 8
+  %30 = call ptr @create_node(ptr %28, %Node %29)
+  %31 = call ptr @codegen_generate_literal(ptr %22, ptr %25, ptr %26, ptr %27, ptr %30)
+  ret ptr %31
+
+merge_block:                                      ; preds = %entrypoint
+  %32 = load ptr, ptr %expression, align 8
+  %type7 = getelementptr %Node, ptr %32, i32 0, i32 0
+  %33 = load i64, ptr %type7, align 4
+  %34 = load i64, ptr @NODE_PRIMARY_EXPRESSION_NUMBER, align 4
+  %35 = icmp eq i64 %33, %34
+  br i1 %35, label %then_block8, label %merge_block15
+
+then_block8:                                      ; preds = %merge_block
+  %36 = load ptr, ptr %expression, align 8
+  %data9 = getelementptr %Node, ptr %36, i32 0, i32 1
+  %37 = load ptr, ptr %data9, align 8
+  %value = getelementptr %NODE_PRIMARY_EXPRESSION_NUMBER_DATA, ptr %37, i32 0, i32 0
+  %38 = load i64, ptr %value, align 4
+  %n = alloca i64, align 8
+  store i64 %38, ptr %n, align 4
+  %node_type10 = alloca %Node, align 8
+  %type11 = getelementptr %Node, ptr %node_type10, i32 0, i32 0
+  %39 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %39, ptr %type11, align 4
+  %40 = load ptr, ptr %c, align 8
+  %arena12 = getelementptr %codegen, ptr %40, i32 0, i32 3
+  %41 = load ptr, ptr %arena12, align 8
+  %42 = call ptr @arena_alloc(ptr %41, i64 16)
+  %d = alloca ptr, align 8
+  store ptr %42, ptr %d, align 8
+  %43 = load ptr, ptr %d, align 8
+  %name13 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %43, i32 0, i32 0
+  store ptr @191, ptr %name13, align 8
+  %44 = load ptr, ptr %d, align 8
+  %underlying_type = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %44, i32 0, i32 1
+  store ptr null, ptr %underlying_type, align 8
+  %data14 = getelementptr %Node, ptr %node_type10, i32 0, i32 1
+  %45 = load ptr, ptr %d, align 8
+  store ptr %45, ptr %data14, align 8
+  %46 = load ptr, ptr %c, align 8
+  %47 = call ptr @LLVMInt64Type()
+  %48 = load i64, ptr %n, align 4
+  %49 = call ptr @LLVMConstInt(ptr %47, i64 %48, i64 0)
+  %50 = load ptr, ptr %name, align 8
+  %51 = load ptr, ptr %expression, align 8
+  %52 = load ptr, ptr %c, align 8
+  %53 = load %Node, ptr %node_type10, align 8
+  %54 = call ptr @create_node(ptr %52, %Node %53)
+  %55 = call ptr @codegen_generate_literal(ptr %46, ptr %49, ptr %50, ptr %51, ptr %54)
+  ret ptr %55
+
+merge_block15:                                    ; preds = %merge_block
+  %56 = load ptr, ptr %expression, align 8
+  %type16 = getelementptr %Node, ptr %56, i32 0, i32 0
+  %57 = load i64, ptr %type16, align 4
+  %58 = load i64, ptr @NODE_PRIMARY_EXPRESSION_BOOLEAN, align 4
+  %59 = icmp eq i64 %57, %58
+  br i1 %59, label %then_block17, label %merge_block29
+
+then_block17:                                     ; preds = %merge_block15
+  %60 = load ptr, ptr %expression, align 8
+  %data18 = getelementptr %Node, ptr %60, i32 0, i32 1
+  %61 = load ptr, ptr %data18, align 8
+  %value19 = getelementptr %NODE_PRIMARY_EXPRESSION_BOOLEAN_DATA, ptr %61, i32 0, i32 0
+  %62 = load i1, ptr %value19, align 1
+  %b = alloca i1, align 1
+  store i1 %62, ptr %b, align 1
+  %node_type20 = alloca %Node, align 8
+  %type21 = getelementptr %Node, ptr %node_type20, i32 0, i32 0
+  %63 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %63, ptr %type21, align 4
+  %64 = load ptr, ptr %c, align 8
+  %arena22 = getelementptr %codegen, ptr %64, i32 0, i32 3
+  %65 = load ptr, ptr %arena22, align 8
+  %66 = call ptr @arena_alloc(ptr %65, i64 16)
+  %d23 = alloca ptr, align 8
+  store ptr %66, ptr %d23, align 8
+  %67 = load ptr, ptr %d23, align 8
+  %name24 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %67, i32 0, i32 0
+  store ptr @192, ptr %name24, align 8
+  %68 = load ptr, ptr %d23, align 8
+  %underlying_type25 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %68, i32 0, i32 1
+  store ptr null, ptr %underlying_type25, align 8
+  %data26 = getelementptr %Node, ptr %node_type20, i32 0, i32 1
+  %69 = load ptr, ptr %d23, align 8
+  store ptr %69, ptr %data26, align 8
+  %int_value = alloca i64, align 8
+  store i64 0, ptr %int_value, align 4
+  %70 = load i1, ptr %b, align 1
+  %71 = icmp eq i1 %70, true
+  br i1 %71, label %then_block27, label %merge_block28
+
+then_block27:                                     ; preds = %then_block17
+  store i64 1, ptr %int_value, align 4
+  br label %merge_block28
+
+merge_block28:                                    ; preds = %then_block17, %then_block27
+  %72 = load ptr, ptr %c, align 8
+  %73 = call ptr @LLVMInt1Type()
+  %74 = load i64, ptr %int_value, align 4
+  %75 = call ptr @LLVMConstInt(ptr %73, i64 %74, i64 0)
+  %76 = load ptr, ptr %name, align 8
+  %77 = load ptr, ptr %expression, align 8
+  %78 = load ptr, ptr %c, align 8
+  %79 = load %Node, ptr %node_type20, align 8
+  %80 = call ptr @create_node(ptr %78, %Node %79)
+  %81 = call ptr @codegen_generate_literal(ptr %72, ptr %75, ptr %76, ptr %77, ptr %80)
+  ret ptr %81
+
+merge_block29:                                    ; preds = %merge_block15
+  %82 = load ptr, ptr %expression, align 8
+  %type30 = getelementptr %Node, ptr %82, i32 0, i32 0
+  %83 = load i64, ptr %type30, align 4
+  %84 = load i64, ptr @NODE_PRIMARY_EXPRESSION_CHAR, align 4
+  %85 = icmp eq i64 %83, %84
+  br i1 %85, label %then_block31, label %merge_block41
+
+then_block31:                                     ; preds = %merge_block29
+  %86 = load ptr, ptr %expression, align 8
+  %data32 = getelementptr %Node, ptr %86, i32 0, i32 1
+  %87 = load ptr, ptr %data32, align 8
+  %value33 = getelementptr %NODE_PRIMARY_EXPRESSION_CHAR_DATA, ptr %87, i32 0, i32 0
+  %88 = load i8, ptr %value33, align 1
+  %ch = alloca i64, align 8
+  store i8 %88, ptr %ch, align 1
+  %node_type34 = alloca %Node, align 8
+  %type35 = getelementptr %Node, ptr %node_type34, i32 0, i32 0
+  %89 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %89, ptr %type35, align 4
+  %90 = load ptr, ptr %c, align 8
+  %arena36 = getelementptr %codegen, ptr %90, i32 0, i32 3
+  %91 = load ptr, ptr %arena36, align 8
+  %92 = call ptr @arena_alloc(ptr %91, i64 16)
+  %d37 = alloca ptr, align 8
+  store ptr %92, ptr %d37, align 8
+  %93 = load ptr, ptr %d37, align 8
+  %name38 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %93, i32 0, i32 0
+  store ptr @193, ptr %name38, align 8
+  %94 = load ptr, ptr %d37, align 8
+  %underlying_type39 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %94, i32 0, i32 1
+  store ptr null, ptr %underlying_type39, align 8
+  %data40 = getelementptr %Node, ptr %node_type34, i32 0, i32 1
+  %95 = load ptr, ptr %d37, align 8
+  store ptr %95, ptr %data40, align 8
+  %96 = load ptr, ptr %c, align 8
+  %97 = call ptr @LLVMInt8Type()
+  %98 = load i64, ptr %ch, align 4
+  %99 = call ptr @LLVMConstInt(ptr %97, i64 %98, i64 0)
+  %100 = load ptr, ptr %name, align 8
+  %101 = load ptr, ptr %expression, align 8
+  %102 = load ptr, ptr %c, align 8
+  %103 = load %Node, ptr %node_type34, align 8
+  %104 = call ptr @create_node(ptr %102, %Node %103)
+  %105 = call ptr @codegen_generate_literal(ptr %96, ptr %99, ptr %100, ptr %101, ptr %104)
+  ret ptr %105
+
+merge_block41:                                    ; preds = %merge_block29
+  %106 = load ptr, ptr %expression, align 8
+  %type42 = getelementptr %Node, ptr %106, i32 0, i32 0
+  %107 = load i64, ptr %type42, align 4
+  %108 = load i64, ptr @NODE_PRIMARY_EXPRESSION_STRING, align 4
+  %109 = icmp eq i64 %107, %108
+  br i1 %109, label %then_block43, label %merge_block61
+
+then_block43:                                     ; preds = %merge_block41
+  %110 = load ptr, ptr %expression, align 8
+  %data44 = getelementptr %Node, ptr %110, i32 0, i32 1
+  %111 = load ptr, ptr %data44, align 8
+  %value45 = getelementptr %NODE_PRIMARY_EXPRESSION_STRING_DATA, ptr %111, i32 0, i32 0
+  %112 = load ptr, ptr %value45, align 8
+  %str = alloca ptr, align 8
+  store ptr %112, ptr %str, align 8
+  %113 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %113, i32 0, i32 2
+  %114 = load ptr, ptr %builder, align 8
+  %115 = load ptr, ptr %str, align 8
+  %116 = call ptr @LLVMBuildGlobalStringPtr(ptr %114, ptr %115, ptr @194)
+  %x = alloca ptr, align 8
+  store ptr %116, ptr %x, align 8
+  %117 = load ptr, ptr %c, align 8
+  %arena46 = getelementptr %codegen, ptr %117, i32 0, i32 3
+  %118 = load ptr, ptr %arena46, align 8
+  %119 = call ptr @arena_alloc(ptr %118, i64 16)
+  %inner_type_data47 = alloca ptr, align 8
+  store ptr %119, ptr %inner_type_data47, align 8
+  %120 = load ptr, ptr %inner_type_data47, align 8
+  %name48 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %120, i32 0, i32 0
+  store ptr @195, ptr %name48, align 8
+  %inner_type49 = alloca %Node, align 8
+  %type50 = getelementptr %Node, ptr %inner_type49, i32 0, i32 0
+  %121 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %121, ptr %type50, align 4
+  %data51 = getelementptr %Node, ptr %inner_type49, i32 0, i32 1
+  %122 = load ptr, ptr %inner_type_data47, align 8
+  store ptr %122, ptr %data51, align 8
+  %123 = load ptr, ptr %c, align 8
+  %arena52 = getelementptr %codegen, ptr %123, i32 0, i32 3
+  %124 = load ptr, ptr %arena52, align 8
+  %125 = call ptr @arena_alloc(ptr %124, i64 8)
+  %node_type_data53 = alloca ptr, align 8
+  store ptr %125, ptr %node_type_data53, align 8
+  %126 = load ptr, ptr %node_type_data53, align 8
+  %type54 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %126, i32 0, i32 0
+  %127 = load ptr, ptr %c, align 8
+  %128 = load %Node, ptr %inner_type49, align 8
+  %129 = call ptr @create_node(ptr %127, %Node %128)
+  store ptr %129, ptr %type54, align 8
+  %node_type55 = alloca %Node, align 8
+  %type56 = getelementptr %Node, ptr %node_type55, i32 0, i32 0
+  %130 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  store i64 %130, ptr %type56, align 4
+  %data57 = getelementptr %Node, ptr %node_type55, i32 0, i32 1
+  %131 = load ptr, ptr %node_type_data53, align 8
+  store ptr %131, ptr %data57, align 8
+  %v = alloca %Variable, align 8
+  %value58 = getelementptr %Variable, ptr %v, i32 0, i32 0
+  %132 = load ptr, ptr %x, align 8
+  store ptr %132, ptr %value58, align 8
+  %type59 = getelementptr %Variable, ptr %v, i32 0, i32 1
+  store ptr null, ptr %type59, align 8
+  %stack_level = getelementptr %Variable, ptr %v, i32 0, i32 4
+  store ptr null, ptr %stack_level, align 8
+  %node = getelementptr %Variable, ptr %v, i32 0, i32 2
+  %133 = load ptr, ptr %expression, align 8
+  store ptr %133, ptr %node, align 8
+  %node_type60 = getelementptr %Variable, ptr %v, i32 0, i32 3
+  %134 = load ptr, ptr %c, align 8
+  %135 = load %Node, ptr %node_type55, align 8
+  %136 = call ptr @create_node(ptr %134, %Node %135)
+  store ptr %136, ptr %node_type60, align 8
+  %137 = load ptr, ptr %c, align 8
+  %138 = load %Variable, ptr %v, align 8
+  %139 = call ptr @codegen_create_variable(ptr %137, %Variable %138)
+  ret ptr %139
+
+merge_block61:                                    ; preds = %merge_block41
+  %140 = load ptr, ptr %expression, align 8
+  %type62 = getelementptr %Node, ptr %140, i32 0, i32 0
+  %141 = load i64, ptr %type62, align 4
+  %142 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %143 = icmp eq i64 %141, %142
+  br i1 %143, label %then_block63, label %merge_block88
+
+then_block63:                                     ; preds = %merge_block61
+  %144 = load ptr, ptr %expression, align 8
+  %data64 = getelementptr %Node, ptr %144, i32 0, i32 1
+  %145 = load ptr, ptr %data64, align 8
+  %146 = load %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %145, align 8
+  %identifier = alloca %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, align 8
+  store %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA %146, ptr %identifier, align 8
+  %147 = load ptr, ptr %c, align 8
+  %environment = getelementptr %codegen, ptr %147, i32 0, i32 4
+  %148 = load ptr, ptr %environment, align 8
+  %name65 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %identifier, i32 0, i32 0
+  %149 = load ptr, ptr %name65, align 8
+  %150 = call ptr @environment_get_variable(ptr %148, ptr %149)
+  %variable = alloca ptr, align 8
+  store ptr %150, ptr %variable, align 8
+  %151 = load ptr, ptr %variable, align 8
+  %152 = icmp ne ptr %151, null
+  call void @assert(i1 %152)
+  %153 = load ptr, ptr %variable, align 8
+  %value66 = getelementptr %Variable, ptr %153, i32 0, i32 0
+  %154 = load ptr, ptr %value66, align 8
+  %param_value = alloca ptr, align 8
+  store ptr %154, ptr %param_value, align 8
+  %155 = load ptr, ptr %variable, align 8
+  %node_type67 = getelementptr %Variable, ptr %155, i32 0, i32 3
+  %156 = load ptr, ptr %node_type67, align 8
+  %v_type = alloca ptr, align 8
+  store ptr %156, ptr %v_type, align 8
+  %done = alloca i1, align 1
+  store i1 false, ptr %done, align 1
+  %157 = load ptr, ptr %v_type, align 8
+  %type68 = getelementptr %Node, ptr %157, i32 0, i32 0
+  %158 = load i64, ptr %type68, align 4
+  %159 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %160 = icmp ne i64 %158, %159
+  br i1 %160, label %then_block69, label %merge_block75
+
+then_block69:                                     ; preds = %then_block63
+  %161 = load ptr, ptr %c, align 8
+  %162 = load ptr, ptr %v_type, align 8
+  %163 = call ptr @codegen_get_llvm_type(ptr %161, ptr %162)
+  %param_type = alloca ptr, align 8
+  store ptr %163, ptr %param_type, align 8
+  %164 = load ptr, ptr %param_type, align 8
+  %165 = icmp ne ptr %164, null
+  call void @assert(i1 %165)
+  %166 = load ptr, ptr %v_type, align 8
+  %type70 = getelementptr %Node, ptr %166, i32 0, i32 0
+  %167 = load i64, ptr %type70, align 4
+  %168 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %169 = icmp eq i64 %167, %168
+  br i1 %169, label %then_block71, label %merge_block72
+
+then_block71:                                     ; preds = %then_block69
+  %170 = load ptr, ptr %param_type, align 8
+  %171 = load ptr, ptr %param_type, align 8
+  %172 = load ptr, ptr %171, align 8
+  %173 = call ptr @LLVMPointerType(ptr %172, i64 0)
+  store ptr %173, ptr %170, align 8
+  br label %merge_block72
+
+merge_block72:                                    ; preds = %then_block69, %then_block71
+  %174 = load ptr, ptr %c, align 8
+  %builder73 = getelementptr %codegen, ptr %174, i32 0, i32 2
+  %175 = load ptr, ptr %builder73, align 8
+  %176 = load ptr, ptr %param_type, align 8
+  %177 = load ptr, ptr %176, align 8
+  %178 = load ptr, ptr %variable, align 8
+  %value74 = getelementptr %Variable, ptr %178, i32 0, i32 0
+  %179 = load ptr, ptr %value74, align 8
+  %180 = call ptr @LLVMBuildLoad2(ptr %175, ptr %177, ptr %179, ptr @196)
+  store ptr %180, ptr %param_value, align 8
+  store i1 true, ptr %done, align 1
+  br label %merge_block75
+
+merge_block75:                                    ; preds = %then_block63, %merge_block72
+  %181 = load i1, ptr %done, align 1
+  %182 = icmp eq i1 %181, false
+  br i1 %182, label %then_block76, label %merge_block86
+
+then_block76:                                     ; preds = %merge_block75
+  %183 = load ptr, ptr %variable, align 8
+  %stack_level77 = getelementptr %Variable, ptr %183, i32 0, i32 4
+  %184 = load ptr, ptr %stack_level77, align 8
+  %185 = load i64, ptr %184, align 4
+  %186 = icmp ne i64 %185, 0
+  br i1 %186, label %then_block78, label %merge_block85
+
+then_block78:                                     ; preds = %then_block76
+  %187 = load ptr, ptr %c, align 8
+  %188 = load ptr, ptr %v_type, align 8
+  %189 = call ptr @codegen_get_llvm_type(ptr %187, ptr %188)
+  %param_type79 = alloca ptr, align 8
+  store ptr %189, ptr %param_type79, align 8
+  %190 = load ptr, ptr %param_type79, align 8
+  %191 = icmp ne ptr %190, null
+  call void @assert(i1 %191)
+  %192 = load ptr, ptr %v_type, align 8
+  %type80 = getelementptr %Node, ptr %192, i32 0, i32 0
+  %193 = load i64, ptr %type80, align 4
+  %194 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %195 = icmp eq i64 %193, %194
+  br i1 %195, label %then_block81, label %merge_block82
+
+then_block81:                                     ; preds = %then_block78
+  %196 = load ptr, ptr %param_type79, align 8
+  %197 = load ptr, ptr %param_type79, align 8
+  %198 = load ptr, ptr %197, align 8
+  %199 = call ptr @LLVMPointerType(ptr %198, i64 0)
+  store ptr %199, ptr %196, align 8
+  br label %merge_block82
+
+merge_block82:                                    ; preds = %then_block78, %then_block81
+  %200 = load ptr, ptr %c, align 8
+  %builder83 = getelementptr %codegen, ptr %200, i32 0, i32 2
+  %201 = load ptr, ptr %builder83, align 8
+  %202 = load ptr, ptr %param_type79, align 8
+  %203 = load ptr, ptr %202, align 8
+  %204 = load ptr, ptr %variable, align 8
+  %value84 = getelementptr %Variable, ptr %204, i32 0, i32 0
+  %205 = load ptr, ptr %value84, align 8
+  %206 = call ptr @LLVMBuildLoad2(ptr %201, ptr %203, ptr %205, ptr @197)
+  store ptr %206, ptr %param_value, align 8
+  store i1 true, ptr %done, align 1
+  br label %merge_block85
+
+merge_block85:                                    ; preds = %then_block76, %merge_block82
+  br label %merge_block86
+
+merge_block86:                                    ; preds = %merge_block75, %merge_block85
+  %207 = load ptr, ptr %c, align 8
+  %208 = load ptr, ptr %param_value, align 8
+  %209 = load ptr, ptr %name, align 8
+  %210 = load ptr, ptr %expression, align 8
+  %211 = load ptr, ptr %variable, align 8
+  %node_type87 = getelementptr %Variable, ptr %211, i32 0, i32 3
+  %212 = load ptr, ptr %node_type87, align 8
+  %213 = call ptr @codegen_generate_literal(ptr %207, ptr %208, ptr %209, ptr %210, ptr %212)
+  ret ptr %213
+
+merge_block88:                                    ; preds = %merge_block61
+  %214 = load ptr, ptr %expression, align 8
+  %type89 = getelementptr %Node, ptr %214, i32 0, i32 0
+  %215 = load i64, ptr %type89, align 4
+  %216 = load i64, ptr @NODE_FUNCTION_DEFINITION, align 4
+  %217 = icmp eq i64 %215, %216
+  br i1 %217, label %then_block90, label %merge_block189
+
+then_block90:                                     ; preds = %merge_block88
+  %218 = load ptr, ptr %c, align 8
+  %builder91 = getelementptr %codegen, ptr %218, i32 0, i32 2
+  %219 = load ptr, ptr %builder91, align 8
+  %220 = call ptr @LLVMGetInsertBlock(ptr %219)
+  %builder_pos = alloca ptr, align 8
+  store ptr %220, ptr %builder_pos, align 8
+  %221 = load ptr, ptr %c, align 8
+  %arena92 = getelementptr %codegen, ptr %221, i32 0, i32 3
+  %222 = load ptr, ptr %arena92, align 8
+  %223 = call ptr @arena_alloc(ptr %222, i64 160)
+  %llvm_param_types = alloca ptr, align 8
+  store ptr %223, ptr %llvm_param_types, align 8
+  %224 = load ptr, ptr %c, align 8
+  %arena93 = getelementptr %codegen, ptr %224, i32 0, i32 3
+  %225 = load ptr, ptr %arena93, align 8
+  %226 = call ptr @arena_alloc(ptr %225, i64 160)
+  %param_types = alloca ptr, align 8
+  store ptr %226, ptr %param_types, align 8
+  %227 = load ptr, ptr %expression, align 8
+  %data94 = getelementptr %Node, ptr %227, i32 0, i32 1
+  %228 = load ptr, ptr %data94, align 8
+  %229 = load %NODE_FUNCTION_DEFINITION_DATA, ptr %228, align 8
+  %function_definition = alloca %NODE_FUNCTION_DEFINITION_DATA, align 8
+  store %NODE_FUNCTION_DEFINITION_DATA %229, ptr %function_definition, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  %is_varargs = alloca i64, align 8
+  store i64 0, ptr %is_varargs, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block109, %then_block90
+  %230 = load i64, ptr %i, align 4
+  %parameters_len = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 3
+  %231 = load i64, ptr %parameters_len, align 4
+  %232 = icmp slt i64 %230, %231
+  br i1 %232, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %parameters = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 2
+  %233 = load ptr, ptr %parameters, align 8
+  %234 = load i64, ptr %i, align 4
+  %235 = getelementptr ptr, ptr %233, i64 %234
+  %236 = load ptr, ptr %235, align 8
+  %node95 = alloca ptr, align 8
+  store ptr %236, ptr %node95, align 8
+  %237 = load ptr, ptr %node95, align 8
+  %type96 = getelementptr %Node, ptr %237, i32 0, i32 0
+  %238 = load i64, ptr %type96, align 4
+  %239 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %240 = icmp eq i64 %238, %239
+  call void @assert(i1 %240)
+  %241 = load ptr, ptr %node95, align 8
+  %data97 = getelementptr %Node, ptr %241, i32 0, i32 1
+  %242 = load ptr, ptr %data97, align 8
+  %243 = load %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %242, align 8
+  %param = alloca %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, align 8
+  store %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA %243, ptr %param, align 8
+  %type98 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %param, i32 0, i32 1
+  %244 = load ptr, ptr %type98, align 8
+  %param_type99 = alloca ptr, align 8
+  store ptr %244, ptr %param_type99, align 8
+  %245 = load ptr, ptr %param_type99, align 8
+  %type100 = getelementptr %Node, ptr %245, i32 0, i32 0
+  %246 = load i64, ptr %type100, align 4
+  %247 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %248 = icmp eq i64 %246, %247
+  br i1 %248, label %then_block101, label %merge_block106
+
+outer_block:                                      ; preds = %while_block
+  %retur_type = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 4
+  %249 = load ptr, ptr %retur_type, align 8
+  %f_ret = alloca ptr, align 8
+  store ptr %249, ptr %f_ret, align 8
+  %250 = load ptr, ptr %c, align 8
+  %251 = load ptr, ptr %f_ret, align 8
+  %252 = call ptr @codegen_get_llvm_type(ptr %250, ptr %251)
+  %retur_type110 = alloca ptr, align 8
+  store ptr %252, ptr %retur_type110, align 8
+  %253 = load ptr, ptr %retur_type110, align 8
+  %254 = icmp ne ptr %253, null
+  call void @assert(i1 %254)
+  %255 = load ptr, ptr %f_ret, align 8
+  %type111 = getelementptr %Node, ptr %255, i32 0, i32 0
+  %256 = load i64, ptr %type111, align 4
+  %257 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %258 = icmp eq i64 %256, %257
+  br i1 %258, label %then_block112, label %merge_block113
+
+then_block101:                                    ; preds = %inner_block
+  %259 = load ptr, ptr %param_type99, align 8
+  %data102 = getelementptr %Node, ptr %259, i32 0, i32 1
+  %260 = load ptr, ptr %data102, align 8
+  %261 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %260, align 8
+  %simple_type = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %261, ptr %simple_type, align 8
+  %name103 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %262 = load ptr, ptr %name103, align 8
+  %263 = call i1 @strcmp(ptr %262, ptr @198)
+  br i1 %263, label %then_block104, label %merge_block105
+
+then_block104:                                    ; preds = %then_block101
+  store i64 1, ptr %is_varargs, align 4
+  br label %merge_block105
+
+merge_block105:                                   ; preds = %then_block101, %then_block104
+  br label %merge_block106
+
+merge_block106:                                   ; preds = %inner_block, %merge_block105
+  %264 = load ptr, ptr %c, align 8
+  %265 = load ptr, ptr %param_type99, align 8
+  %266 = call ptr @codegen_get_llvm_type(ptr %264, ptr %265)
+  %llvm_param_type = alloca ptr, align 8
+  store ptr %266, ptr %llvm_param_type, align 8
+  %267 = load ptr, ptr %llvm_param_type, align 8
+  %268 = icmp ne ptr %267, null
+  call void @assert(i1 %268)
+  %269 = load ptr, ptr %param_type99, align 8
+  %type107 = getelementptr %Node, ptr %269, i32 0, i32 0
+  %270 = load i64, ptr %type107, align 4
+  %271 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %272 = icmp eq i64 %270, %271
+  br i1 %272, label %then_block108, label %merge_block109
+
+then_block108:                                    ; preds = %merge_block106
+  %273 = load ptr, ptr %llvm_param_type, align 8
+  %274 = load ptr, ptr %llvm_param_type, align 8
+  %275 = load ptr, ptr %274, align 8
+  %276 = call ptr @LLVMPointerType(ptr %275, i64 0)
+  store ptr %276, ptr %273, align 8
+  br label %merge_block109
+
+merge_block109:                                   ; preds = %merge_block106, %then_block108
+  %277 = load ptr, ptr %llvm_param_types, align 8
+  %278 = load i64, ptr %i, align 4
+  %279 = getelementptr ptr, ptr %277, i64 %278
+  %280 = load ptr, ptr %llvm_param_type, align 8
+  %281 = load ptr, ptr %280, align 8
+  store ptr %281, ptr %279, align 8
+  %282 = load ptr, ptr %param_types, align 8
+  %283 = load i64, ptr %i, align 4
+  %284 = getelementptr ptr, ptr %282, i64 %283
+  %285 = load ptr, ptr %param_type99, align 8
+  store ptr %285, ptr %284, align 8
+  %286 = load i64, ptr %i, align 4
+  %287 = add i64 %286, 1
+  store i64 %287, ptr %i, align 4
+  br label %while_block
+
+then_block112:                                    ; preds = %outer_block
+  %288 = load ptr, ptr %retur_type110, align 8
+  %289 = load ptr, ptr %retur_type110, align 8
+  %290 = load ptr, ptr %289, align 8
+  %291 = call ptr @LLVMPointerType(ptr %290, i64 0)
+  store ptr %291, ptr %288, align 8
+  br label %merge_block113
+
+merge_block113:                                   ; preds = %outer_block, %then_block112
+  %function = alloca ptr, align 8
+  store ptr null, ptr %function, align 8
+  %292 = load ptr, ptr %name, align 8
+  %293 = icmp ne ptr %292, null
+  br i1 %293, label %then_block114, label %merge_block120
+
+then_block114:                                    ; preds = %merge_block113
+  %294 = load ptr, ptr %c, align 8
+  %environment115 = getelementptr %codegen, ptr %294, i32 0, i32 4
+  %295 = load ptr, ptr %environment115, align 8
+  %296 = load ptr, ptr %name, align 8
+  %297 = call ptr @environment_get_variable(ptr %295, ptr %296)
+  %v116 = alloca ptr, align 8
+  store ptr %297, ptr %v116, align 8
+  %298 = load ptr, ptr %v116, align 8
+  %299 = icmp ne ptr %298, null
+  br i1 %299, label %then_block117, label %merge_block119
+
+then_block117:                                    ; preds = %then_block114
+  %300 = load ptr, ptr %v116, align 8
+  %value118 = getelementptr %Variable, ptr %300, i32 0, i32 0
+  %301 = load ptr, ptr %value118, align 8
+  store ptr %301, ptr %function, align 8
+  br label %merge_block119
+
+merge_block119:                                   ; preds = %then_block114, %then_block117
+  br label %merge_block120
+
+merge_block120:                                   ; preds = %merge_block113, %merge_block119
+  %302 = load ptr, ptr %function, align 8
+  %303 = icmp eq ptr %302, null
+  br i1 %303, label %then_block121, label %merge_block124
+
+then_block121:                                    ; preds = %merge_block120
+  %304 = load ptr, ptr %retur_type110, align 8
+  %305 = load ptr, ptr %304, align 8
+  %306 = load ptr, ptr %llvm_param_types, align 8
+  %307 = load i64, ptr %i, align 4
+  %308 = load i64, ptr %is_varargs, align 4
+  %309 = call ptr @LLVMFunctionType(ptr %305, ptr %306, i64 %307, i64 %308)
+  %function_type = alloca ptr, align 8
+  store ptr %309, ptr %function_type, align 8
+  %310 = load ptr, ptr %name, align 8
+  %n_name = alloca ptr, align 8
+  store ptr %310, ptr %n_name, align 8
+  %311 = load ptr, ptr %name, align 8
+  %312 = icmp eq ptr %311, null
+  br i1 %312, label %then_block122, label %merge_block123
+
+then_block122:                                    ; preds = %then_block121
+  store ptr @199, ptr %n_name, align 8
+  br label %merge_block123
+
+merge_block123:                                   ; preds = %then_block121, %then_block122
+  %313 = load ptr, ptr %c, align 8
+  %llvm_module = getelementptr %codegen, ptr %313, i32 0, i32 0
+  %314 = load ptr, ptr %llvm_module, align 8
+  %315 = load ptr, ptr %n_name, align 8
+  %316 = load ptr, ptr %function_type, align 8
+  %317 = call ptr @LLVMAddFunction(ptr %314, ptr %315, ptr %316)
+  store ptr %317, ptr %function, align 8
+  br label %merge_block124
+
+merge_block124:                                   ; preds = %merge_block120, %merge_block123
+  %318 = load ptr, ptr %function, align 8
+  %319 = call ptr @LLVMAppendBasicBlock(ptr %318, ptr @200)
+  %function_entry = alloca ptr, align 8
+  store ptr %319, ptr %function_entry, align 8
+  %320 = load ptr, ptr %c, align 8
+  %builder125 = getelementptr %codegen, ptr %320, i32 0, i32 2
+  %321 = load ptr, ptr %builder125, align 8
+  %322 = load ptr, ptr %function_entry, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %321, ptr %322)
+  %323 = load ptr, ptr %c, align 8
+  %environment126 = getelementptr %codegen, ptr %323, i32 0, i32 4
+  %324 = load ptr, ptr %environment126, align 8
+  call void @environment_create_scope(ptr %324)
+  %325 = load ptr, ptr %c, align 8
+  %current_function = getelementptr %codegen, ptr %325, i32 0, i32 7
+  %326 = load ptr, ptr %current_function, align 8
+  %last_function = alloca ptr, align 8
+  store ptr %326, ptr %last_function, align 8
+  %327 = load ptr, ptr %c, align 8
+  %current_function127 = getelementptr %codegen, ptr %327, i32 0, i32 7
+  %328 = load ptr, ptr %function, align 8
+  store ptr %328, ptr %current_function127, align 8
+  %329 = load ptr, ptr %c, align 8
+  %current_function_retur_type = getelementptr %codegen, ptr %329, i32 0, i32 8
+  %330 = load ptr, ptr %current_function_retur_type, align 8
+  %last_function_retur_type = alloca ptr, align 8
+  store ptr %330, ptr %last_function_retur_type, align 8
+  %331 = load ptr, ptr %c, align 8
+  %current_function_retur_type128 = getelementptr %codegen, ptr %331, i32 0, i32 8
+  %retur_type129 = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 4
+  %332 = load ptr, ptr %retur_type129, align 8
+  store ptr %332, ptr %current_function_retur_type128, align 8
+  %333 = load ptr, ptr %c, align 8
+  %arena130 = getelementptr %codegen, ptr %333, i32 0, i32 3
+  %334 = load ptr, ptr %arena130, align 8
+  %335 = call ptr @arena_alloc(ptr %334, i64 24)
+  %d131 = alloca ptr, align 8
+  store ptr %335, ptr %d131, align 8
+  %336 = load ptr, ptr %d131, align 8
+  %parameters132 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %336, i32 0, i32 0
+  %337 = load ptr, ptr %param_types, align 8
+  store ptr %337, ptr %parameters132, align 8
+  %338 = load ptr, ptr %d131, align 8
+  %parameters_len133 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %338, i32 0, i32 1
+  %339 = load i64, ptr %i, align 4
+  store i64 %339, ptr %parameters_len133, align 4
+  %340 = load ptr, ptr %d131, align 8
+  %retur_type134 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %340, i32 0, i32 2
+  %retur_type135 = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 4
+  %341 = load ptr, ptr %retur_type135, align 8
+  store ptr %341, ptr %retur_type134, align 8
+  %n136 = alloca %Node, align 8
+  %342 = load ptr, ptr %c, align 8
+  %343 = load %Node, ptr %n136, align 8
+  %344 = call ptr @create_node(ptr %342, %Node %343)
+  %node_type137 = alloca ptr, align 8
+  store ptr %344, ptr %node_type137, align 8
+  %345 = load ptr, ptr %node_type137, align 8
+  %type138 = getelementptr %Node, ptr %345, i32 0, i32 0
+  %346 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  store i64 %346, ptr %type138, align 4
+  %347 = load ptr, ptr %node_type137, align 8
+  %data139 = getelementptr %Node, ptr %347, i32 0, i32 1
+  %348 = load ptr, ptr %d131, align 8
+  store ptr %348, ptr %data139, align 8
+  %349 = load ptr, ptr %name, align 8
+  %350 = icmp ne ptr %349, null
+  br i1 %350, label %then_block140, label %merge_block148
+
+then_block140:                                    ; preds = %merge_block124
+  %v141 = alloca %Variable, align 8
+  %value142 = getelementptr %Variable, ptr %v141, i32 0, i32 0
+  %351 = load ptr, ptr %function, align 8
+  store ptr %351, ptr %value142, align 8
+  %type143 = getelementptr %Variable, ptr %v141, i32 0, i32 1
+  store ptr null, ptr %type143, align 8
+  %stack_level144 = getelementptr %Variable, ptr %v141, i32 0, i32 4
+  store ptr null, ptr %stack_level144, align 8
+  %node145 = getelementptr %Variable, ptr %v141, i32 0, i32 2
+  %352 = load ptr, ptr %expression, align 8
+  store ptr %352, ptr %node145, align 8
+  %node_type146 = getelementptr %Variable, ptr %v141, i32 0, i32 3
+  %353 = load ptr, ptr %node_type137, align 8
+  store ptr %353, ptr %node_type146, align 8
+  %354 = load ptr, ptr %c, align 8
+  %environment147 = getelementptr %codegen, ptr %354, i32 0, i32 4
+  %355 = load ptr, ptr %environment147, align 8
+  %356 = load ptr, ptr %name, align 8
+  %357 = load ptr, ptr %c, align 8
+  %358 = load %Variable, ptr %v141, align 8
+  %359 = call ptr @codegen_create_variable(ptr %357, %Variable %358)
+  call void @environment_add_variable(ptr %355, ptr %356, ptr %359)
+  br label %merge_block148
+
+merge_block148:                                   ; preds = %merge_block124, %then_block140
+  %360 = load ptr, ptr %c, align 8
+  %arena149 = getelementptr %codegen, ptr %360, i32 0, i32 3
+  %361 = load ptr, ptr %arena149, align 8
+  %parameters_len150 = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 3
+  %362 = load i64, ptr %parameters_len150, align 4
+  %363 = mul i64 8, %362
+  %364 = call ptr @arena_alloc(ptr %361, i64 %363)
+  %params = alloca ptr, align 8
+  store ptr %364, ptr %params, align 8
+  %365 = load ptr, ptr %function, align 8
+  %366 = load ptr, ptr %params, align 8
+  call void @LLVMGetParams(ptr %365, ptr %366)
+  %parameters_index = alloca i64, align 8
+  store i64 0, ptr %parameters_index, align 4
+  br label %while_block151
+
+while_block151:                                   ; preds = %merge_block164, %merge_block148
+  %367 = load i64, ptr %parameters_index, align 4
+  %parameters_len152 = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 3
+  %368 = load i64, ptr %parameters_len152, align 4
+  %369 = icmp slt i64 %367, %368
+  br i1 %369, label %inner_block153, label %outer_block154
+
+inner_block153:                                   ; preds = %while_block151
+  %370 = load ptr, ptr %params, align 8
+  %371 = load i64, ptr %parameters_index, align 4
+  %372 = getelementptr ptr, ptr %370, i64 %371
+  %373 = load ptr, ptr %372, align 8
+  %p = alloca ptr, align 8
+  store ptr %373, ptr %p, align 8
+  %parameters155 = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 2
+  %374 = load ptr, ptr %parameters155, align 8
+  %375 = load i64, ptr %parameters_index, align 4
+  %376 = getelementptr ptr, ptr %374, i64 %375
+  %377 = load ptr, ptr %376, align 8
+  %param_node = alloca ptr, align 8
+  store ptr %377, ptr %param_node, align 8
+  %378 = load ptr, ptr %param_node, align 8
+  %type156 = getelementptr %Node, ptr %378, i32 0, i32 0
+  %379 = load i64, ptr %type156, align 4
+  %380 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %381 = icmp eq i64 %379, %380
+  call void @assert(i1 %381)
+  %382 = load ptr, ptr %param_node, align 8
+  %data157 = getelementptr %Node, ptr %382, i32 0, i32 1
+  %383 = load ptr, ptr %data157, align 8
+  %384 = load %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %383, align 8
+  %param158 = alloca %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, align 8
+  store %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA %384, ptr %param158, align 8
+  %type159 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %param158, i32 0, i32 1
+  %385 = load ptr, ptr %type159, align 8
+  %param_type160 = alloca ptr, align 8
+  store ptr %385, ptr %param_type160, align 8
+  %386 = load ptr, ptr %c, align 8
+  %387 = load ptr, ptr %param_type160, align 8
+  %388 = call ptr @codegen_get_llvm_type(ptr %386, ptr %387)
+  %llvm_param_type161 = alloca ptr, align 8
+  store ptr %388, ptr %llvm_param_type161, align 8
+  %389 = load ptr, ptr %llvm_param_type161, align 8
+  %390 = icmp ne ptr %389, null
+  call void @assert(i1 %390)
+  %391 = load ptr, ptr %param_type160, align 8
+  %type162 = getelementptr %Node, ptr %391, i32 0, i32 0
+  %392 = load i64, ptr %type162, align 4
+  %393 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %394 = icmp eq i64 %392, %393
+  br i1 %394, label %then_block163, label %merge_block164
+
+outer_block154:                                   ; preds = %while_block151
+  store i64 0, ptr %i, align 4
+  br label %while_block176
+
+then_block163:                                    ; preds = %inner_block153
+  %395 = load ptr, ptr %llvm_param_type161, align 8
+  %396 = load ptr, ptr %llvm_param_type161, align 8
+  %397 = load ptr, ptr %396, align 8
+  %398 = call ptr @LLVMPointerType(ptr %397, i64 0)
+  store ptr %398, ptr %395, align 8
+  br label %merge_block164
+
+merge_block164:                                   ; preds = %inner_block153, %then_block163
+  %399 = load ptr, ptr %c, align 8
+  %builder165 = getelementptr %codegen, ptr %399, i32 0, i32 2
+  %400 = load ptr, ptr %builder165, align 8
+  %401 = load ptr, ptr %llvm_param_type161, align 8
+  %402 = load ptr, ptr %401, align 8
+  %name166 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %param158, i32 0, i32 0
+  %403 = load ptr, ptr %name166, align 8
+  %404 = call ptr @LLVMBuildAlloca(ptr %400, ptr %402, ptr %403)
+  %alloca = alloca ptr, align 8
+  store ptr %404, ptr %alloca, align 8
+  %405 = load ptr, ptr %c, align 8
+  %builder167 = getelementptr %codegen, ptr %405, i32 0, i32 2
+  %406 = load ptr, ptr %builder167, align 8
+  %407 = load ptr, ptr %p, align 8
+  %408 = load ptr, ptr %alloca, align 8
+  %409 = call ptr @LLVMBuildStore(ptr %406, ptr %407, ptr %408)
+  %v168 = alloca %Variable, align 8
+  %value169 = getelementptr %Variable, ptr %v168, i32 0, i32 0
+  %410 = load ptr, ptr %alloca, align 8
+  store ptr %410, ptr %value169, align 8
+  %type170 = getelementptr %Variable, ptr %v168, i32 0, i32 1
+  store ptr null, ptr %type170, align 8
+  %stack_level171 = getelementptr %Variable, ptr %v168, i32 0, i32 4
+  store ptr null, ptr %stack_level171, align 8
+  %node172 = getelementptr %Variable, ptr %v168, i32 0, i32 2
+  %411 = load ptr, ptr %param_node, align 8
+  store ptr %411, ptr %node172, align 8
+  %node_type173 = getelementptr %Variable, ptr %v168, i32 0, i32 3
+  %412 = load ptr, ptr %param_type160, align 8
+  store ptr %412, ptr %node_type173, align 8
+  %413 = load ptr, ptr %c, align 8
+  %environment174 = getelementptr %codegen, ptr %413, i32 0, i32 4
+  %414 = load ptr, ptr %environment174, align 8
+  %name175 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %param158, i32 0, i32 0
+  %415 = load ptr, ptr %name175, align 8
+  %416 = load ptr, ptr %c, align 8
+  %417 = load %Variable, ptr %v168, align 8
+  %418 = call ptr @codegen_create_variable(ptr %416, %Variable %417)
+  call void @environment_add_variable(ptr %414, ptr %415, ptr %418)
+  %419 = load i64, ptr %parameters_index, align 4
+  %420 = add i64 %419, 1
+  store i64 %420, ptr %parameters_index, align 4
+  br label %while_block151
+
+while_block176:                                   ; preds = %inner_block177, %outer_block154
+  %421 = load i64, ptr %i, align 4
+  %statements_len = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 1
+  %422 = load i64, ptr %statements_len, align 4
+  %423 = icmp slt i64 %421, %422
+  br i1 %423, label %inner_block177, label %outer_block178
+
+inner_block177:                                   ; preds = %while_block176
+  %statements = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %function_definition, i32 0, i32 0
+  %424 = load ptr, ptr %statements, align 8
+  %425 = load i64, ptr %i, align 4
+  %426 = getelementptr ptr, ptr %424, i64 %425
+  %427 = load ptr, ptr %426, align 8
+  %stmt = alloca ptr, align 8
+  store ptr %427, ptr %stmt, align 8
+  %428 = load ptr, ptr %c, align 8
+  %429 = load ptr, ptr %stmt, align 8
+  %430 = call i64 @codegen_generate_statement(ptr %428, ptr %429)
+  %res = alloca i64, align 8
+  store i64 %430, ptr %res, align 4
+  %431 = load i64, ptr %res, align 4
+  %432 = icmp eq i64 %431, 0
+  call void @assert(i1 %432)
+  %433 = load i64, ptr %i, align 4
+  %434 = add i64 %433, 1
+  store i64 %434, ptr %i, align 4
+  br label %while_block176
+
+outer_block178:                                   ; preds = %while_block176
+  %435 = load ptr, ptr %c, align 8
+  %builder179 = getelementptr %codegen, ptr %435, i32 0, i32 2
+  %436 = load ptr, ptr %builder179, align 8
+  %437 = load ptr, ptr %builder_pos, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %436, ptr %437)
+  %v180 = alloca %Variable, align 8
+  %value181 = getelementptr %Variable, ptr %v180, i32 0, i32 0
+  %438 = load ptr, ptr %function, align 8
+  store ptr %438, ptr %value181, align 8
+  %type182 = getelementptr %Variable, ptr %v180, i32 0, i32 1
+  store ptr null, ptr %type182, align 8
+  %stack_level183 = getelementptr %Variable, ptr %v180, i32 0, i32 4
+  store ptr null, ptr %stack_level183, align 8
+  %node184 = getelementptr %Variable, ptr %v180, i32 0, i32 2
+  %439 = load ptr, ptr %expression, align 8
+  store ptr %439, ptr %node184, align 8
+  %node_type185 = getelementptr %Variable, ptr %v180, i32 0, i32 3
+  %440 = load ptr, ptr %node_type137, align 8
+  store ptr %440, ptr %node_type185, align 8
+  %441 = load ptr, ptr %c, align 8
+  %current_function186 = getelementptr %codegen, ptr %441, i32 0, i32 7
+  %442 = load ptr, ptr %last_function, align 8
+  store ptr %442, ptr %current_function186, align 8
+  %443 = load ptr, ptr %c, align 8
+  %current_function_retur_type187 = getelementptr %codegen, ptr %443, i32 0, i32 8
+  %444 = load ptr, ptr %last_function_retur_type, align 8
+  store ptr %444, ptr %current_function_retur_type187, align 8
+  %445 = load ptr, ptr %c, align 8
+  %environment188 = getelementptr %codegen, ptr %445, i32 0, i32 4
+  %446 = load ptr, ptr %environment188, align 8
+  call void @environment_drop_scope(ptr %446)
+  %447 = load ptr, ptr %c, align 8
+  %448 = load %Variable, ptr %v180, align 8
+  %449 = call ptr @codegen_create_variable(ptr %447, %Variable %448)
+  ret ptr %449
+
+merge_block189:                                   ; preds = %merge_block88
+  %450 = load ptr, ptr %expression, align 8
+  %type190 = getelementptr %Node, ptr %450, i32 0, i32 0
+  %451 = load i64, ptr %type190, align 4
+  %452 = load i64, ptr @NODE_EQUALITY_EXPRESSION, align 4
+  %453 = icmp eq i64 %451, %452
+  br i1 %453, label %then_block191, label %merge_block222
+
+then_block191:                                    ; preds = %merge_block189
+  %454 = load ptr, ptr %expression, align 8
+  %data192 = getelementptr %Node, ptr %454, i32 0, i32 1
+  %455 = load ptr, ptr %data192, align 8
+  %456 = load %NODE_EQUALITY_EXPRESSION_DATA, ptr %455, align 8
+  %exp = alloca %NODE_EQUALITY_EXPRESSION_DATA, align 8
+  store %NODE_EQUALITY_EXPRESSION_DATA %456, ptr %exp, align 8
+  %457 = load ptr, ptr %c, align 8
+  %lhs = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 0
+  %458 = load ptr, ptr %lhs, align 8
+  %459 = call ptr @codegen_generate_expression_value(ptr %457, ptr %458, ptr null)
+  %lhs_value = alloca ptr, align 8
+  store ptr %459, ptr %lhs_value, align 8
+  %460 = load ptr, ptr %lhs_value, align 8
+  %461 = icmp ne ptr %460, null
+  call void @assert(i1 %461)
+  %462 = load ptr, ptr %c, align 8
+  %rhs = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 1
+  %463 = load ptr, ptr %rhs, align 8
+  %464 = call ptr @codegen_generate_expression_value(ptr %462, ptr %463, ptr null)
+  %rhs_value = alloca ptr, align 8
+  store ptr %464, ptr %rhs_value, align 8
+  %465 = load ptr, ptr %rhs_value, align 8
+  %466 = icmp ne ptr %465, null
+  call void @assert(i1 %466)
+  %467 = load ptr, ptr %c, align 8
+  %468 = load ptr, ptr %lhs_value, align 8
+  %node_type193 = getelementptr %Variable, ptr %468, i32 0, i32 3
+  %469 = load ptr, ptr %node_type193, align 8
+  %470 = load ptr, ptr %rhs_value, align 8
+  %node_type194 = getelementptr %Variable, ptr %470, i32 0, i32 3
+  %471 = load ptr, ptr %node_type194, align 8
+  %472 = call i1 @compare_types(ptr %467, ptr %469, ptr %471, i1 false)
+  call void @assert(i1 %472)
+  %op = alloca i64, align 8
+  store i64 -1, ptr %op, align 4
+  %typ = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 2
+  %473 = load i64, ptr %typ, align 4
+  %474 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_EQ, align 4
+  %475 = icmp eq i64 %473, %474
+  br i1 %475, label %then_block195, label %merge_block196
+
+then_block195:                                    ; preds = %then_block191
+  %476 = load i64, ptr @LLVMIntEQ, align 4
+  store i64 %476, ptr %op, align 4
+  br label %merge_block196
+
+merge_block196:                                   ; preds = %then_block191, %then_block195
+  %typ197 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 2
+  %477 = load i64, ptr %typ197, align 4
+  %478 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_NE, align 4
+  %479 = icmp eq i64 %477, %478
+  br i1 %479, label %then_block198, label %merge_block199
+
+then_block198:                                    ; preds = %merge_block196
+  %480 = load i64, ptr @LLVMIntNE, align 4
+  store i64 %480, ptr %op, align 4
+  br label %merge_block199
+
+merge_block199:                                   ; preds = %merge_block196, %then_block198
+  %typ200 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 2
+  %481 = load i64, ptr %typ200, align 4
+  %482 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_GE, align 4
+  %483 = icmp eq i64 %481, %482
+  br i1 %483, label %then_block201, label %merge_block202
+
+then_block201:                                    ; preds = %merge_block199
+  %484 = load i64, ptr @LLVMIntSGE, align 4
+  store i64 %484, ptr %op, align 4
+  br label %merge_block202
+
+merge_block202:                                   ; preds = %merge_block199, %then_block201
+  %typ203 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 2
+  %485 = load i64, ptr %typ203, align 4
+  %486 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_LE, align 4
+  %487 = icmp eq i64 %485, %486
+  br i1 %487, label %then_block204, label %merge_block205
+
+then_block204:                                    ; preds = %merge_block202
+  %488 = load i64, ptr @LLVMIntSLE, align 4
+  store i64 %488, ptr %op, align 4
+  br label %merge_block205
+
+merge_block205:                                   ; preds = %merge_block202, %then_block204
+  %typ206 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 2
+  %489 = load i64, ptr %typ206, align 4
+  %490 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_LT, align 4
+  %491 = icmp eq i64 %489, %490
+  br i1 %491, label %then_block207, label %merge_block208
+
+then_block207:                                    ; preds = %merge_block205
+  %492 = load i64, ptr @LLVMIntSLT, align 4
+  store i64 %492, ptr %op, align 4
+  br label %merge_block208
+
+merge_block208:                                   ; preds = %merge_block205, %then_block207
+  %typ209 = getelementptr %NODE_EQUALITY_EXPRESSION_DATA, ptr %exp, i32 0, i32 2
+  %493 = load i64, ptr %typ209, align 4
+  %494 = load i64, ptr @EQUALITY_EXPRESSION_TYPE_GT, align 4
+  %495 = icmp eq i64 %493, %494
+  br i1 %495, label %then_block210, label %merge_block211
+
+then_block210:                                    ; preds = %merge_block208
+  %496 = load i64, ptr @LLVMIntSGT, align 4
+  store i64 %496, ptr %op, align 4
+  br label %merge_block211
+
+merge_block211:                                   ; preds = %merge_block208, %then_block210
+  %497 = load i64, ptr %op, align 4
+  %498 = icmp ne i64 %497, -1
+  call void @assert(i1 %498)
+  %499 = load ptr, ptr %c, align 8
+  %builder212 = getelementptr %codegen, ptr %499, i32 0, i32 2
+  %500 = load ptr, ptr %builder212, align 8
+  %501 = load i64, ptr %op, align 4
+  %502 = load ptr, ptr %lhs_value, align 8
+  %value213 = getelementptr %Variable, ptr %502, i32 0, i32 0
+  %503 = load ptr, ptr %value213, align 8
+  %504 = load ptr, ptr %rhs_value, align 8
+  %value214 = getelementptr %Variable, ptr %504, i32 0, i32 0
+  %505 = load ptr, ptr %value214, align 8
+  %506 = call ptr @LLVMBuildICmp(ptr %500, i64 %501, ptr %503, ptr %505, ptr @201)
+  %cmp = alloca ptr, align 8
+  store ptr %506, ptr %cmp, align 8
+  %node_type215 = alloca %Node, align 8
+  %type216 = getelementptr %Node, ptr %node_type215, i32 0, i32 0
+  %507 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %507, ptr %type216, align 4
+  %508 = load ptr, ptr %c, align 8
+  %arena217 = getelementptr %codegen, ptr %508, i32 0, i32 3
+  %509 = load ptr, ptr %arena217, align 8
+  %510 = call ptr @arena_alloc(ptr %509, i64 16)
+  %d218 = alloca ptr, align 8
+  store ptr %510, ptr %d218, align 8
+  %511 = load ptr, ptr %d218, align 8
+  %name219 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %511, i32 0, i32 0
+  store ptr @202, ptr %name219, align 8
+  %512 = load ptr, ptr %d218, align 8
+  %underlying_type220 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %512, i32 0, i32 1
+  store ptr null, ptr %underlying_type220, align 8
+  %data221 = getelementptr %Node, ptr %node_type215, i32 0, i32 1
+  %513 = load ptr, ptr %d218, align 8
+  store ptr %513, ptr %data221, align 8
+  %514 = load ptr, ptr %c, align 8
+  %515 = load ptr, ptr %cmp, align 8
+  %516 = load ptr, ptr %name, align 8
+  %517 = load ptr, ptr %expression, align 8
+  %518 = load ptr, ptr %c, align 8
+  %519 = load %Node, ptr %node_type215, align 8
+  %520 = call ptr @create_node(ptr %518, %Node %519)
+  %521 = call ptr @codegen_generate_literal(ptr %514, ptr %515, ptr %516, ptr %517, ptr %520)
+  ret ptr %521
+
+merge_block222:                                   ; preds = %merge_block189
+  %522 = load ptr, ptr %expression, align 8
+  %type223 = getelementptr %Node, ptr %522, i32 0, i32 0
+  %523 = load i64, ptr %type223, align 4
+  %524 = load i64, ptr @NODE_ADDITIVE_EXPRESSION, align 4
+  %525 = icmp eq i64 %523, %524
+  br i1 %525, label %then_block224, label %merge_block265
+
+then_block224:                                    ; preds = %merge_block222
+  %526 = load ptr, ptr %expression, align 8
+  %data225 = getelementptr %Node, ptr %526, i32 0, i32 1
+  %527 = load ptr, ptr %data225, align 8
+  %528 = load %NODE_ADDITIVE_EXPRESSION_DATA, ptr %527, align 8
+  %exp226 = alloca %NODE_ADDITIVE_EXPRESSION_DATA, align 8
+  store %NODE_ADDITIVE_EXPRESSION_DATA %528, ptr %exp226, align 8
+  %529 = load ptr, ptr %c, align 8
+  %lhs227 = getelementptr %NODE_ADDITIVE_EXPRESSION_DATA, ptr %exp226, i32 0, i32 1
+  %530 = load ptr, ptr %lhs227, align 8
+  %531 = call ptr @codegen_generate_expression_value(ptr %529, ptr %530, ptr null)
+  %lhs_value228 = alloca ptr, align 8
+  store ptr %531, ptr %lhs_value228, align 8
+  %532 = load ptr, ptr %lhs_value228, align 8
+  %533 = icmp ne ptr %532, null
+  call void @assert(i1 %533)
+  %534 = load ptr, ptr %c, align 8
+  %rhs229 = getelementptr %NODE_ADDITIVE_EXPRESSION_DATA, ptr %exp226, i32 0, i32 2
+  %535 = load ptr, ptr %rhs229, align 8
+  %536 = call ptr @codegen_generate_expression_value(ptr %534, ptr %535, ptr null)
+  %rhs_value230 = alloca ptr, align 8
+  store ptr %536, ptr %rhs_value230, align 8
+  %537 = load ptr, ptr %rhs_value230, align 8
+  %538 = icmp ne ptr %537, null
+  call void @assert(i1 %538)
+  %539 = load ptr, ptr %c, align 8
+  %540 = load ptr, ptr %lhs_value228, align 8
+  %node_type231 = getelementptr %Variable, ptr %540, i32 0, i32 3
+  %541 = load ptr, ptr %node_type231, align 8
+  %542 = load ptr, ptr %rhs_value230, align 8
+  %node_type232 = getelementptr %Variable, ptr %542, i32 0, i32 3
+  %543 = load ptr, ptr %node_type232, align 8
+  %544 = call i1 @compare_types(ptr %539, ptr %541, ptr %543, i1 false)
+  call void @assert(i1 %544)
+  %result = alloca ptr, align 8
+  store ptr null, ptr %result, align 8
+  %node_type233 = alloca %Node, align 8
+  %type234 = getelementptr %Node, ptr %node_type233, i32 0, i32 0
+  %545 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %545, ptr %type234, align 4
+  %546 = load ptr, ptr %c, align 8
+  %arena235 = getelementptr %codegen, ptr %546, i32 0, i32 3
+  %547 = load ptr, ptr %arena235, align 8
+  %548 = call ptr @arena_alloc(ptr %547, i64 16)
+  %d236 = alloca ptr, align 8
+  store ptr %548, ptr %d236, align 8
+  %549 = load ptr, ptr %d236, align 8
+  %name237 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %549, i32 0, i32 0
+  store ptr @203, ptr %name237, align 8
+  %550 = load ptr, ptr %d236, align 8
+  %underlying_type238 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %550, i32 0, i32 1
+  store ptr null, ptr %underlying_type238, align 8
+  %data239 = getelementptr %Node, ptr %node_type233, i32 0, i32 1
+  %551 = load ptr, ptr %d236, align 8
+  store ptr %551, ptr %data239, align 8
+  %552 = load ptr, ptr %c, align 8
+  %553 = load %Node, ptr %node_type233, align 8
+  %554 = call ptr @create_node(ptr %552, %Node %553)
+  %pnode_type = alloca ptr, align 8
+  store ptr %554, ptr %pnode_type, align 8
+  %addition = getelementptr %NODE_ADDITIVE_EXPRESSION_DATA, ptr %exp226, i32 0, i32 0
+  %555 = load i1, ptr %addition, align 1
+  br i1 %555, label %then_block240, label %merge_block258
+
+then_block240:                                    ; preds = %then_block224
+  %556 = load ptr, ptr %lhs_value228, align 8
+  %node_type241 = getelementptr %Variable, ptr %556, i32 0, i32 3
+  %557 = load ptr, ptr %node_type241, align 8
+  %nt = alloca ptr, align 8
+  store ptr %557, ptr %nt, align 8
+  %558 = load ptr, ptr %nt, align 8
+  %type242 = getelementptr %Node, ptr %558, i32 0, i32 0
+  %559 = load i64, ptr %type242, align 4
+  %560 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %561 = icmp eq i64 %559, %560
+  br i1 %561, label %then_block243, label %merge_block251
+
+then_block243:                                    ; preds = %then_block240
+  %562 = load ptr, ptr %nt, align 8
+  %data244 = getelementptr %Node, ptr %562, i32 0, i32 1
+  %563 = load ptr, ptr %data244, align 8
+  %ipt = alloca ptr, align 8
+  store ptr %563, ptr %ipt, align 8
+  %564 = load ptr, ptr %c, align 8
+  %565 = load ptr, ptr %ipt, align 8
+  %type245 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %565, i32 0, i32 0
+  %566 = load ptr, ptr %type245, align 8
+  %567 = call ptr @codegen_get_llvm_type(ptr %564, ptr %566)
+  %llvmipt = alloca ptr, align 8
+  store ptr %567, ptr %llvmipt, align 8
+  %568 = load ptr, ptr %llvmipt, align 8
+  %569 = icmp ne ptr %568, null
+  call void @assert(i1 %569)
+  %570 = load ptr, ptr %c, align 8
+  %arena246 = getelementptr %codegen, ptr %570, i32 0, i32 3
+  %571 = load ptr, ptr %arena246, align 8
+  %572 = call ptr @arena_alloc(ptr %571, i64 8)
+  %arr = alloca ptr, align 8
+  store ptr %572, ptr %arr, align 8
+  %573 = load ptr, ptr %arr, align 8
+  %574 = getelementptr ptr, ptr %573, i64 0
+  %575 = load ptr, ptr %rhs_value230, align 8
+  %value247 = getelementptr %Variable, ptr %575, i32 0, i32 0
+  %576 = load ptr, ptr %value247, align 8
+  store ptr %576, ptr %574, align 8
+  %577 = load ptr, ptr %c, align 8
+  %builder248 = getelementptr %codegen, ptr %577, i32 0, i32 2
+  %578 = load ptr, ptr %builder248, align 8
+  %579 = load ptr, ptr %llvmipt, align 8
+  %580 = load ptr, ptr %579, align 8
+  %581 = load ptr, ptr %lhs_value228, align 8
+  %value249 = getelementptr %Variable, ptr %581, i32 0, i32 0
+  %582 = load ptr, ptr %value249, align 8
+  %583 = load ptr, ptr %arr, align 8
+  %584 = call ptr @LLVMBuildGEP2(ptr %578, ptr %580, ptr %582, ptr %583, i64 1, ptr @204)
+  store ptr %584, ptr %result, align 8
+  %585 = load ptr, ptr %lhs_value228, align 8
+  %node_type250 = getelementptr %Variable, ptr %585, i32 0, i32 3
+  %586 = load ptr, ptr %node_type250, align 8
+  store ptr %586, ptr %pnode_type, align 8
+  br label %merge_block251
+
+merge_block251:                                   ; preds = %then_block240, %then_block243
+  %587 = load ptr, ptr %nt, align 8
+  %type252 = getelementptr %Node, ptr %587, i32 0, i32 0
+  %588 = load i64, ptr %type252, align 4
+  %589 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %590 = icmp ne i64 %588, %589
+  br i1 %590, label %then_block253, label %merge_block257
+
+then_block253:                                    ; preds = %merge_block251
+  %591 = load ptr, ptr %c, align 8
+  %builder254 = getelementptr %codegen, ptr %591, i32 0, i32 2
+  %592 = load ptr, ptr %builder254, align 8
+  %593 = load ptr, ptr %lhs_value228, align 8
+  %value255 = getelementptr %Variable, ptr %593, i32 0, i32 0
+  %594 = load ptr, ptr %value255, align 8
+  %595 = load ptr, ptr %rhs_value230, align 8
+  %value256 = getelementptr %Variable, ptr %595, i32 0, i32 0
+  %596 = load ptr, ptr %value256, align 8
+  %597 = call ptr @LLVMBuildAdd(ptr %592, ptr %594, ptr %596, ptr @205)
+  store ptr %597, ptr %result, align 8
+  br label %merge_block257
+
+merge_block257:                                   ; preds = %merge_block251, %then_block253
+  br label %merge_block258
+
+merge_block258:                                   ; preds = %then_block224, %merge_block257
+  %addition259 = getelementptr %NODE_ADDITIVE_EXPRESSION_DATA, ptr %exp226, i32 0, i32 0
+  %598 = load i1, ptr %addition259, align 1
+  %599 = icmp eq i1 %598, false
+  br i1 %599, label %then_block260, label %merge_block264
+
+then_block260:                                    ; preds = %merge_block258
+  %600 = load ptr, ptr %c, align 8
+  %builder261 = getelementptr %codegen, ptr %600, i32 0, i32 2
+  %601 = load ptr, ptr %builder261, align 8
+  %602 = load ptr, ptr %lhs_value228, align 8
+  %value262 = getelementptr %Variable, ptr %602, i32 0, i32 0
+  %603 = load ptr, ptr %value262, align 8
+  %604 = load ptr, ptr %rhs_value230, align 8
+  %value263 = getelementptr %Variable, ptr %604, i32 0, i32 0
+  %605 = load ptr, ptr %value263, align 8
+  %606 = call ptr @LLVMBuildSub(ptr %601, ptr %603, ptr %605, ptr @206)
+  store ptr %606, ptr %result, align 8
+  br label %merge_block264
+
+merge_block264:                                   ; preds = %merge_block258, %then_block260
+  %607 = load ptr, ptr %c, align 8
+  %608 = load ptr, ptr %result, align 8
+  %609 = load ptr, ptr %name, align 8
+  %610 = load ptr, ptr %expression, align 8
+  %611 = load ptr, ptr %pnode_type, align 8
+  %612 = call ptr @codegen_generate_literal(ptr %607, ptr %608, ptr %609, ptr %610, ptr %611)
+  ret ptr %612
+
+merge_block265:                                   ; preds = %merge_block222
+  %613 = load ptr, ptr %expression, align 8
+  %type266 = getelementptr %Node, ptr %613, i32 0, i32 0
+  %614 = load i64, ptr %type266, align 4
+  %615 = load i64, ptr @NODE_MULTIPLICATIVE_EXPRESSION, align 4
+  %616 = icmp eq i64 %614, %615
+  br i1 %616, label %then_block267, label %merge_block296
+
+then_block267:                                    ; preds = %merge_block265
+  %617 = load ptr, ptr %expression, align 8
+  %data268 = getelementptr %Node, ptr %617, i32 0, i32 1
+  %618 = load ptr, ptr %data268, align 8
+  %619 = load %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %618, align 8
+  %exp269 = alloca %NODE_MULTIPLICATIVE_EXPRESSION_DATA, align 8
+  store %NODE_MULTIPLICATIVE_EXPRESSION_DATA %619, ptr %exp269, align 8
+  %620 = load ptr, ptr %c, align 8
+  %lhs270 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %exp269, i32 0, i32 0
+  %621 = load ptr, ptr %lhs270, align 8
+  %622 = call ptr @codegen_generate_expression_value(ptr %620, ptr %621, ptr null)
+  %lhs_value271 = alloca ptr, align 8
+  store ptr %622, ptr %lhs_value271, align 8
+  %623 = load ptr, ptr %lhs_value271, align 8
+  %624 = icmp ne ptr %623, null
+  call void @assert(i1 %624)
+  %625 = load ptr, ptr %c, align 8
+  %rhs272 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %exp269, i32 0, i32 1
+  %626 = load ptr, ptr %rhs272, align 8
+  %627 = call ptr @codegen_generate_expression_value(ptr %625, ptr %626, ptr null)
+  %rhs_value273 = alloca ptr, align 8
+  store ptr %627, ptr %rhs_value273, align 8
+  %628 = load ptr, ptr %rhs_value273, align 8
+  %629 = icmp ne ptr %628, null
+  call void @assert(i1 %629)
+  %630 = load ptr, ptr %c, align 8
+  %631 = load ptr, ptr %lhs_value271, align 8
+  %node_type274 = getelementptr %Variable, ptr %631, i32 0, i32 3
+  %632 = load ptr, ptr %node_type274, align 8
+  %633 = load ptr, ptr %rhs_value273, align 8
+  %node_type275 = getelementptr %Variable, ptr %633, i32 0, i32 3
+  %634 = load ptr, ptr %node_type275, align 8
+  %635 = call i1 @compare_types(ptr %630, ptr %632, ptr %634, i1 false)
+  call void @assert(i1 %635)
+  %result276 = alloca ptr, align 8
+  store ptr null, ptr %result276, align 8
+  %typ277 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %exp269, i32 0, i32 2
+  %636 = load i64, ptr %typ277, align 4
+  %637 = load i64, ptr @MULTIPLICATIVE_EXPRESSION_TYPE_MUL, align 4
+  %638 = icmp eq i64 %636, %637
+  br i1 %638, label %then_block278, label %merge_block282
+
+then_block278:                                    ; preds = %then_block267
+  %639 = load ptr, ptr %c, align 8
+  %builder279 = getelementptr %codegen, ptr %639, i32 0, i32 2
+  %640 = load ptr, ptr %builder279, align 8
+  %641 = load ptr, ptr %lhs_value271, align 8
+  %value280 = getelementptr %Variable, ptr %641, i32 0, i32 0
+  %642 = load ptr, ptr %value280, align 8
+  %643 = load ptr, ptr %rhs_value273, align 8
+  %value281 = getelementptr %Variable, ptr %643, i32 0, i32 0
+  %644 = load ptr, ptr %value281, align 8
+  %645 = call ptr @LLVMBuildMul(ptr %640, ptr %642, ptr %644, ptr @207)
+  store ptr %645, ptr %result276, align 8
+  br label %merge_block282
+
+merge_block282:                                   ; preds = %then_block267, %then_block278
+  %typ283 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %exp269, i32 0, i32 2
+  %646 = load i64, ptr %typ283, align 4
+  %647 = load i64, ptr @MULTIPLICATIVE_EXPRESSION_TYPE_DIV, align 4
+  %648 = icmp eq i64 %646, %647
+  br i1 %648, label %then_block284, label %merge_block288
+
+then_block284:                                    ; preds = %merge_block282
+  %649 = load ptr, ptr %c, align 8
+  %builder285 = getelementptr %codegen, ptr %649, i32 0, i32 2
+  %650 = load ptr, ptr %builder285, align 8
+  %651 = load ptr, ptr %lhs_value271, align 8
+  %value286 = getelementptr %Variable, ptr %651, i32 0, i32 0
+  %652 = load ptr, ptr %value286, align 8
+  %653 = load ptr, ptr %rhs_value273, align 8
+  %value287 = getelementptr %Variable, ptr %653, i32 0, i32 0
+  %654 = load ptr, ptr %value287, align 8
+  %655 = call ptr @LLVMBuildSDiv(ptr %650, ptr %652, ptr %654, ptr @208)
+  store ptr %655, ptr %result276, align 8
+  br label %merge_block288
+
+merge_block288:                                   ; preds = %merge_block282, %then_block284
+  %typ289 = getelementptr %NODE_MULTIPLICATIVE_EXPRESSION_DATA, ptr %exp269, i32 0, i32 2
+  %656 = load i64, ptr %typ289, align 4
+  %657 = load i64, ptr @MULTIPLICATIVE_EXPRESSION_TYPE_MOD, align 4
+  %658 = icmp eq i64 %656, %657
+  br i1 %658, label %then_block290, label %merge_block294
+
+then_block290:                                    ; preds = %merge_block288
+  %659 = load ptr, ptr %c, align 8
+  %builder291 = getelementptr %codegen, ptr %659, i32 0, i32 2
+  %660 = load ptr, ptr %builder291, align 8
+  %661 = load ptr, ptr %lhs_value271, align 8
+  %value292 = getelementptr %Variable, ptr %661, i32 0, i32 0
+  %662 = load ptr, ptr %value292, align 8
+  %663 = load ptr, ptr %rhs_value273, align 8
+  %value293 = getelementptr %Variable, ptr %663, i32 0, i32 0
+  %664 = load ptr, ptr %value293, align 8
+  %665 = call ptr @LLVMBuildSRem(ptr %660, ptr %662, ptr %664, ptr @209)
+  store ptr %665, ptr %result276, align 8
+  br label %merge_block294
+
+merge_block294:                                   ; preds = %merge_block288, %then_block290
+  %666 = load ptr, ptr %result276, align 8
+  %667 = icmp ne ptr %666, null
+  call void @assert(i1 %667)
+  %668 = load ptr, ptr %c, align 8
+  %669 = load ptr, ptr %result276, align 8
+  %670 = load ptr, ptr %name, align 8
+  %671 = load ptr, ptr %expression, align 8
+  %672 = load ptr, ptr %lhs_value271, align 8
+  %node_type295 = getelementptr %Variable, ptr %672, i32 0, i32 3
+  %673 = load ptr, ptr %node_type295, align 8
+  %674 = call ptr @codegen_generate_literal(ptr %668, ptr %669, ptr %670, ptr %671, ptr %673)
+  ret ptr %674
+
+merge_block296:                                   ; preds = %merge_block265
+  %675 = load ptr, ptr %expression, align 8
+  %type297 = getelementptr %Node, ptr %675, i32 0, i32 0
+  %676 = load i64, ptr %type297, align 4
+  %677 = load i64, ptr @NODE_UNARY_EXPRESSION, align 4
+  %678 = icmp eq i64 %676, %677
+  br i1 %678, label %then_block298, label %merge_block342
+
+then_block298:                                    ; preds = %merge_block296
+  %679 = load ptr, ptr %expression, align 8
+  %data299 = getelementptr %Node, ptr %679, i32 0, i32 1
+  %680 = load ptr, ptr %data299, align 8
+  %681 = load %NODE_UNARY_EXPRESSION_DATA, ptr %680, align 8
+  %exp300 = alloca %NODE_UNARY_EXPRESSION_DATA, align 8
+  store %NODE_UNARY_EXPRESSION_DATA %681, ptr %exp300, align 8
+  %682 = load ptr, ptr %c, align 8
+  %expression301 = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %exp300, i32 0, i32 1
+  %683 = load ptr, ptr %expression301, align 8
+  %684 = call ptr @codegen_generate_expression_value(ptr %682, ptr %683, ptr null)
+  %k = alloca ptr, align 8
+  store ptr %684, ptr %k, align 8
+  %685 = load ptr, ptr %k, align 8
+  %686 = icmp ne ptr %685, null
+  call void @assert(i1 %686)
+  %r = alloca ptr, align 8
+  store ptr null, ptr %r, align 8
+  %687 = load ptr, ptr %k, align 8
+  %node_type302 = getelementptr %Variable, ptr %687, i32 0, i32 3
+  %688 = load ptr, ptr %node_type302, align 8
+  %typ303 = alloca ptr, align 8
+  store ptr %688, ptr %typ303, align 8
+  %typ304 = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %exp300, i32 0, i32 0
+  %689 = load i64, ptr %typ304, align 4
+  %690 = load i64, ptr @UNARY_EXPRESSION_TYPE_NOT, align 4
+  %691 = icmp eq i64 %689, %690
+  br i1 %691, label %then_block305, label %merge_block319
+
+then_block305:                                    ; preds = %then_block298
+  %692 = load ptr, ptr %typ303, align 8
+  %type306 = getelementptr %Node, ptr %692, i32 0, i32 0
+  %693 = load i64, ptr %type306, align 4
+  %694 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %695 = icmp eq i64 %693, %694
+  call void @assert(i1 %695)
+  %696 = load ptr, ptr %typ303, align 8
+  %data307 = getelementptr %Node, ptr %696, i32 0, i32 1
+  %697 = load ptr, ptr %data307, align 8
+  %698 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %697, align 8
+  %simple_type308 = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %698, ptr %simple_type308, align 8
+  %name309 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type308, i32 0, i32 0
+  %699 = load ptr, ptr %name309, align 8
+  %700 = call i1 @strcmp(ptr %699, ptr @210)
+  call void @assert(i1 %700)
+  %701 = load ptr, ptr %c, align 8
+  %builder310 = getelementptr %codegen, ptr %701, i32 0, i32 2
+  %702 = load ptr, ptr %builder310, align 8
+  %703 = load i64, ptr @LLVMIntEQ, align 4
+  %704 = load ptr, ptr %k, align 8
+  %value311 = getelementptr %Variable, ptr %704, i32 0, i32 0
+  %705 = load ptr, ptr %value311, align 8
+  %706 = call ptr @LLVMInt1Type()
+  %707 = call ptr @LLVMConstInt(ptr %706, i64 0, i64 0)
+  %708 = call ptr @LLVMBuildICmp(ptr %702, i64 %703, ptr %705, ptr %707, ptr @211)
+  store ptr %708, ptr %r, align 8
+  %node_type312 = alloca %Node, align 8
+  %type313 = getelementptr %Node, ptr %node_type312, i32 0, i32 0
+  %709 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %709, ptr %type313, align 4
+  %710 = load ptr, ptr %c, align 8
+  %arena314 = getelementptr %codegen, ptr %710, i32 0, i32 3
+  %711 = load ptr, ptr %arena314, align 8
+  %712 = call ptr @arena_alloc(ptr %711, i64 16)
+  %d315 = alloca ptr, align 8
+  store ptr %712, ptr %d315, align 8
+  %713 = load ptr, ptr %d315, align 8
+  %name316 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %713, i32 0, i32 0
+  store ptr @212, ptr %name316, align 8
+  %714 = load ptr, ptr %d315, align 8
+  %underlying_type317 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %714, i32 0, i32 1
+  store ptr null, ptr %underlying_type317, align 8
+  %data318 = getelementptr %Node, ptr %node_type312, i32 0, i32 1
+  %715 = load ptr, ptr %d315, align 8
+  store ptr %715, ptr %data318, align 8
+  %716 = load ptr, ptr %c, align 8
+  %717 = load %Node, ptr %node_type312, align 8
+  %718 = call ptr @create_node(ptr %716, %Node %717)
+  store ptr %718, ptr %typ303, align 8
+  br label %merge_block319
+
+merge_block319:                                   ; preds = %then_block298, %then_block305
+  %typ320 = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %exp300, i32 0, i32 0
+  %719 = load i64, ptr %typ320, align 4
+  %720 = load i64, ptr @UNARY_EXPRESSION_TYPE_MINUS, align 4
+  %721 = icmp eq i64 %719, %720
+  br i1 %721, label %then_block321, label %merge_block331
+
+then_block321:                                    ; preds = %merge_block319
+  %722 = load ptr, ptr %c, align 8
+  %builder322 = getelementptr %codegen, ptr %722, i32 0, i32 2
+  %723 = load ptr, ptr %builder322, align 8
+  %724 = load ptr, ptr %k, align 8
+  %value323 = getelementptr %Variable, ptr %724, i32 0, i32 0
+  %725 = load ptr, ptr %value323, align 8
+  %726 = call ptr @LLVMBuildNeg(ptr %723, ptr %725, ptr @213)
+  store ptr %726, ptr %r, align 8
+  %node_type324 = alloca %Node, align 8
+  %type325 = getelementptr %Node, ptr %node_type324, i32 0, i32 0
+  %727 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %727, ptr %type325, align 4
+  %728 = load ptr, ptr %c, align 8
+  %arena326 = getelementptr %codegen, ptr %728, i32 0, i32 3
+  %729 = load ptr, ptr %arena326, align 8
+  %730 = call ptr @arena_alloc(ptr %729, i64 16)
+  %d327 = alloca ptr, align 8
+  store ptr %730, ptr %d327, align 8
+  %731 = load ptr, ptr %d327, align 8
+  %name328 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %731, i32 0, i32 0
+  store ptr @214, ptr %name328, align 8
+  %732 = load ptr, ptr %d327, align 8
+  %underlying_type329 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %732, i32 0, i32 1
+  store ptr null, ptr %underlying_type329, align 8
+  %data330 = getelementptr %Node, ptr %node_type324, i32 0, i32 1
+  %733 = load ptr, ptr %d327, align 8
+  store ptr %733, ptr %data330, align 8
+  %734 = load ptr, ptr %c, align 8
+  %735 = load %Node, ptr %node_type324, align 8
+  %736 = call ptr @create_node(ptr %734, %Node %735)
+  store ptr %736, ptr %typ303, align 8
+  br label %merge_block331
+
+merge_block331:                                   ; preds = %merge_block319, %then_block321
+  %typ332 = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %exp300, i32 0, i32 0
+  %737 = load i64, ptr %typ332, align 4
+  %738 = load i64, ptr @UNARY_EXPRESSION_TYPE_STAR, align 4
+  %739 = icmp eq i64 %737, %738
+  br i1 %739, label %then_block333, label %merge_block341
+
+then_block333:                                    ; preds = %merge_block331
+  %740 = load ptr, ptr %typ303, align 8
+  %type334 = getelementptr %Node, ptr %740, i32 0, i32 0
+  %741 = load i64, ptr %type334, align 4
+  %742 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %743 = icmp eq i64 %741, %742
+  call void @assert(i1 %743)
+  %744 = load ptr, ptr %k, align 8
+  %node_type335 = getelementptr %Variable, ptr %744, i32 0, i32 3
+  %745 = load ptr, ptr %node_type335, align 8
+  %n336 = alloca ptr, align 8
+  store ptr %745, ptr %n336, align 8
+  %746 = load ptr, ptr %n336, align 8
+  %data337 = getelementptr %Node, ptr %746, i32 0, i32 1
+  %747 = load ptr, ptr %data337, align 8
+  %type338 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %747, i32 0, i32 0
+  %748 = load ptr, ptr %type338, align 8
+  store ptr %748, ptr %typ303, align 8
+  %749 = load ptr, ptr %c, align 8
+  %750 = load ptr, ptr %typ303, align 8
+  %751 = call ptr @codegen_get_llvm_type(ptr %749, ptr %750)
+  %ptr_type = alloca ptr, align 8
+  store ptr %751, ptr %ptr_type, align 8
+  %752 = load ptr, ptr %ptr_type, align 8
+  %753 = icmp ne ptr %752, null
+  call void @assert(i1 %753)
+  %754 = load ptr, ptr %c, align 8
+  %builder339 = getelementptr %codegen, ptr %754, i32 0, i32 2
+  %755 = load ptr, ptr %builder339, align 8
+  %756 = load ptr, ptr %ptr_type, align 8
+  %757 = load ptr, ptr %756, align 8
+  %758 = load ptr, ptr %k, align 8
+  %value340 = getelementptr %Variable, ptr %758, i32 0, i32 0
+  %759 = load ptr, ptr %value340, align 8
+  %760 = call ptr @LLVMBuildLoad2(ptr %755, ptr %757, ptr %759, ptr @215)
+  store ptr %760, ptr %r, align 8
+  br label %merge_block341
+
+merge_block341:                                   ; preds = %merge_block331, %then_block333
+  %761 = load ptr, ptr %c, align 8
+  %762 = load ptr, ptr %r, align 8
+  %763 = load ptr, ptr %name, align 8
+  %764 = load ptr, ptr %expression, align 8
+  %765 = load ptr, ptr %typ303, align 8
+  %766 = call ptr @codegen_generate_literal(ptr %761, ptr %762, ptr %763, ptr %764, ptr %765)
+  ret ptr %766
+
+merge_block342:                                   ; preds = %merge_block296
+  %767 = load ptr, ptr %expression, align 8
+  %type343 = getelementptr %Node, ptr %767, i32 0, i32 0
+  %768 = load i64, ptr %type343, align 4
+  %769 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %770 = icmp eq i64 %768, %769
+  br i1 %770, label %then_block344, label %merge_block358
+
+then_block344:                                    ; preds = %merge_block342
+  %771 = load ptr, ptr %c, align 8
+  %environment345 = getelementptr %codegen, ptr %771, i32 0, i32 4
+  %772 = load ptr, ptr %environment345, align 8
+  %773 = load %Environment, ptr %772, align 8
+  %e = alloca %Environment, align 8
+  store %Environment %773, ptr %e, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %e, i32 0, i32 1
+  %774 = load i64, ptr %scope_stack_len, align 4
+  %775 = icmp eq i64 %774, 1
+  call void @assert(i1 %775)
+  %776 = load ptr, ptr %c, align 8
+  %environment346 = getelementptr %codegen, ptr %776, i32 0, i32 4
+  %777 = load ptr, ptr %environment346, align 8
+  %778 = load ptr, ptr %name, align 8
+  %779 = call ptr @environment_get_variable(ptr %777, ptr %778)
+  %existing = alloca ptr, align 8
+  store ptr %779, ptr %existing, align 8
+  %780 = load ptr, ptr %existing, align 8
+  %781 = icmp ne ptr %780, null
+  br i1 %781, label %then_block347, label %merge_block348
+
+then_block347:                                    ; preds = %then_block344
+  %782 = load ptr, ptr %existing, align 8
+  ret ptr %782
+
+merge_block348:                                   ; preds = %then_block344
+  %783 = load ptr, ptr %c, align 8
+  %784 = load ptr, ptr %expression, align 8
+  %785 = call ptr @codegen_get_llvm_type(ptr %783, ptr %784)
+  %function_type349 = alloca ptr, align 8
+  store ptr %785, ptr %function_type349, align 8
+  %786 = load ptr, ptr %function_type349, align 8
+  %787 = icmp ne ptr %786, null
+  call void @assert(i1 %787)
+  %788 = load ptr, ptr %c, align 8
+  %llvm_module350 = getelementptr %codegen, ptr %788, i32 0, i32 0
+  %789 = load ptr, ptr %llvm_module350, align 8
+  %790 = load ptr, ptr %name, align 8
+  %791 = load ptr, ptr %function_type349, align 8
+  %792 = load ptr, ptr %791, align 8
+  %793 = call ptr @LLVMAddFunction(ptr %789, ptr %790, ptr %792)
+  %function351 = alloca ptr, align 8
+  store ptr %793, ptr %function351, align 8
+  %v352 = alloca %Variable, align 8
+  %value353 = getelementptr %Variable, ptr %v352, i32 0, i32 0
+  %794 = load ptr, ptr %function351, align 8
+  store ptr %794, ptr %value353, align 8
+  %type354 = getelementptr %Variable, ptr %v352, i32 0, i32 1
+  store ptr null, ptr %type354, align 8
+  %stack_level355 = getelementptr %Variable, ptr %v352, i32 0, i32 4
+  store ptr null, ptr %stack_level355, align 8
+  %node356 = getelementptr %Variable, ptr %v352, i32 0, i32 2
+  %795 = load ptr, ptr %expression, align 8
+  store ptr %795, ptr %node356, align 8
+  %node_type357 = getelementptr %Variable, ptr %v352, i32 0, i32 3
+  %796 = load ptr, ptr %expression, align 8
+  store ptr %796, ptr %node_type357, align 8
+  %797 = load ptr, ptr %c, align 8
+  %798 = load %Variable, ptr %v352, align 8
+  %799 = call ptr @codegen_create_variable(ptr %797, %Variable %798)
+  ret ptr %799
+
+merge_block358:                                   ; preds = %merge_block342
+  %800 = load ptr, ptr %expression, align 8
+  %type359 = getelementptr %Node, ptr %800, i32 0, i32 0
+  %801 = load i64, ptr %type359, align 4
+  %802 = load i64, ptr @NODE_FUNCTION_CALL_STATEMENT, align 4
+  %803 = icmp eq i64 %801, %802
+  br i1 %803, label %then_block360, label %merge_block361
+
+then_block360:                                    ; preds = %merge_block358
+  %804 = load ptr, ptr %c, align 8
+  %805 = load ptr, ptr %expression, align 8
+  %806 = call ptr @codegen_generate_function_call_statement(ptr %804, ptr %805)
+  ret ptr %806
+
+merge_block361:                                   ; preds = %merge_block358
+  %807 = load ptr, ptr %expression, align 8
+  %type362 = getelementptr %Node, ptr %807, i32 0, i32 0
+  %808 = load i64, ptr %type362, align 4
+  %809 = load i64, ptr @NODE_CAST_STATEMENT, align 4
+  %810 = icmp eq i64 %808, %809
+  br i1 %810, label %then_block363, label %merge_block375
+
+then_block363:                                    ; preds = %merge_block361
+  %811 = load ptr, ptr %expression, align 8
+  %data364 = getelementptr %Node, ptr %811, i32 0, i32 1
+  %812 = load ptr, ptr %data364, align 8
+  %813 = load %NODE_CAST_STATEMENT_DATA, ptr %812, align 8
+  %exp365 = alloca %NODE_CAST_STATEMENT_DATA, align 8
+  store %NODE_CAST_STATEMENT_DATA %813, ptr %exp365, align 8
+  %814 = load ptr, ptr %c, align 8
+  %expression366 = getelementptr %NODE_CAST_STATEMENT_DATA, ptr %exp365, i32 0, i32 1
+  %815 = load ptr, ptr %expression366, align 8
+  %816 = call ptr @codegen_generate_expression_value(ptr %814, ptr %815, ptr @216)
+  %val = alloca ptr, align 8
+  store ptr %816, ptr %val, align 8
+  %817 = load ptr, ptr %val, align 8
+  %818 = icmp ne ptr %817, null
+  call void @assert(i1 %818)
+  %v367 = alloca %Variable, align 8
+  %value368 = getelementptr %Variable, ptr %v367, i32 0, i32 0
+  %819 = load ptr, ptr %val, align 8
+  %value369 = getelementptr %Variable, ptr %819, i32 0, i32 0
+  %820 = load ptr, ptr %value369, align 8
+  store ptr %820, ptr %value368, align 8
+  %type370 = getelementptr %Variable, ptr %v367, i32 0, i32 1
+  store ptr null, ptr %type370, align 8
+  %stack_level371 = getelementptr %Variable, ptr %v367, i32 0, i32 4
+  store ptr null, ptr %stack_level371, align 8
+  %node372 = getelementptr %Variable, ptr %v367, i32 0, i32 2
+  %821 = load ptr, ptr %expression, align 8
+  store ptr %821, ptr %node372, align 8
+  %node_type373 = getelementptr %Variable, ptr %v367, i32 0, i32 3
+  %typ374 = getelementptr %NODE_CAST_STATEMENT_DATA, ptr %exp365, i32 0, i32 0
+  %822 = load ptr, ptr %typ374, align 8
+  store ptr %822, ptr %node_type373, align 8
+  %823 = load ptr, ptr %c, align 8
+  %824 = load %Variable, ptr %v367, align 8
+  %825 = call ptr @codegen_create_variable(ptr %823, %Variable %824)
+  ret ptr %825
+
+merge_block375:                                   ; preds = %merge_block361
+  %826 = load ptr, ptr %expression, align 8
+  %type376 = getelementptr %Node, ptr %826, i32 0, i32 0
+  %827 = load i64, ptr %type376, align 4
+  %828 = load i64, ptr @NODE_SIZEOF_STATEMENT, align 4
+  %829 = icmp eq i64 %827, %828
+  br i1 %829, label %then_block377, label %merge_block395
+
+then_block377:                                    ; preds = %merge_block375
+  %830 = load ptr, ptr %expression, align 8
+  %data378 = getelementptr %Node, ptr %830, i32 0, i32 1
+  %831 = load ptr, ptr %data378, align 8
+  %832 = load %NODE_SIZEOF_STATEMENT_DATA, ptr %831, align 8
+  %exp379 = alloca %NODE_SIZEOF_STATEMENT_DATA, align 8
+  store %NODE_SIZEOF_STATEMENT_DATA %832, ptr %exp379, align 8
+  %833 = load ptr, ptr %c, align 8
+  %typ380 = getelementptr %NODE_SIZEOF_STATEMENT_DATA, ptr %exp379, i32 0, i32 0
+  %834 = load ptr, ptr %typ380, align 8
+  %835 = call ptr @codegen_get_llvm_type(ptr %833, ptr %834)
+  %typ381 = alloca ptr, align 8
+  store ptr %835, ptr %typ381, align 8
+  %836 = load ptr, ptr %typ381, align 8
+  %837 = icmp ne ptr %836, null
+  call void @assert(i1 %837)
+  %838 = load ptr, ptr %c, align 8
+  %llvm_target_data = getelementptr %codegen, ptr %838, i32 0, i32 9
+  %839 = load ptr, ptr %llvm_target_data, align 8
+  %840 = load ptr, ptr %typ381, align 8
+  %841 = load ptr, ptr %840, align 8
+  %842 = call i64 @LLVMStoreSizeOfType(ptr %839, ptr %841)
+  %size_in_bytes = alloca i64, align 8
+  store i64 %842, ptr %size_in_bytes, align 4
+  %843 = call ptr @LLVMInt64Type()
+  %844 = load i64, ptr %size_in_bytes, align 4
+  %845 = call ptr @LLVMConstInt(ptr %843, i64 %844, i64 0)
+  %size_val = alloca ptr, align 8
+  store ptr %845, ptr %size_val, align 8
+  %node_type382 = alloca %Node, align 8
+  %type383 = getelementptr %Node, ptr %node_type382, i32 0, i32 0
+  %846 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %846, ptr %type383, align 4
+  %847 = load ptr, ptr %c, align 8
+  %arena384 = getelementptr %codegen, ptr %847, i32 0, i32 3
+  %848 = load ptr, ptr %arena384, align 8
+  %849 = call ptr @arena_alloc(ptr %848, i64 16)
+  %d385 = alloca ptr, align 8
+  store ptr %849, ptr %d385, align 8
+  %850 = load ptr, ptr %d385, align 8
+  %name386 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %850, i32 0, i32 0
+  store ptr @217, ptr %name386, align 8
+  %851 = load ptr, ptr %d385, align 8
+  %underlying_type387 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %851, i32 0, i32 1
+  store ptr null, ptr %underlying_type387, align 8
+  %data388 = getelementptr %Node, ptr %node_type382, i32 0, i32 1
+  %852 = load ptr, ptr %d385, align 8
+  store ptr %852, ptr %data388, align 8
+  %v389 = alloca %Variable, align 8
+  %value390 = getelementptr %Variable, ptr %v389, i32 0, i32 0
+  %853 = load ptr, ptr %size_val, align 8
+  store ptr %853, ptr %value390, align 8
+  %type391 = getelementptr %Variable, ptr %v389, i32 0, i32 1
+  store ptr null, ptr %type391, align 8
+  %stack_level392 = getelementptr %Variable, ptr %v389, i32 0, i32 4
+  store ptr null, ptr %stack_level392, align 8
+  %node393 = getelementptr %Variable, ptr %v389, i32 0, i32 2
+  %854 = load ptr, ptr %expression, align 8
+  store ptr %854, ptr %node393, align 8
+  %node_type394 = getelementptr %Variable, ptr %v389, i32 0, i32 3
+  %855 = load ptr, ptr %c, align 8
+  %856 = load %Node, ptr %node_type382, align 8
+  %857 = call ptr @create_node(ptr %855, %Node %856)
+  store ptr %857, ptr %node_type394, align 8
+  %858 = load ptr, ptr %c, align 8
+  %859 = load %Variable, ptr %v389, align 8
+  %860 = call ptr @codegen_create_variable(ptr %858, %Variable %859)
+  ret ptr %860
+
+merge_block395:                                   ; preds = %merge_block375
+  %861 = load ptr, ptr %expression, align 8
+  %type396 = getelementptr %Node, ptr %861, i32 0, i32 0
+  %862 = load i64, ptr %type396, align 4
+  %863 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %864 = icmp eq i64 %862, %863
+  br i1 %864, label %then_block397, label %merge_block428
+
+then_block397:                                    ; preds = %merge_block395
+  %865 = load ptr, ptr %expression, align 8
+  %data398 = getelementptr %Node, ptr %865, i32 0, i32 1
+  %866 = load ptr, ptr %data398, align 8
+  %867 = load %NODE_TYPE_STRUCT_TYPE_DATA, ptr %866, align 8
+  %struc_data = alloca %NODE_TYPE_STRUCT_TYPE_DATA, align 8
+  store %NODE_TYPE_STRUCT_TYPE_DATA %867, ptr %struc_data, align 8
+  %868 = load ptr, ptr %c, align 8
+  %arena399 = getelementptr %codegen, ptr %868, i32 0, i32 3
+  %869 = load ptr, ptr %arena399, align 8
+  %870 = call ptr @arena_alloc(ptr %869, i64 16)
+  %dd = alloca ptr, align 8
+  store ptr %870, ptr %dd, align 8
+  %871 = load ptr, ptr %dd, align 8
+  %name400 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %871, i32 0, i32 0
+  %872 = load ptr, ptr %name, align 8
+  store ptr %872, ptr %name400, align 8
+  %873 = load ptr, ptr %dd, align 8
+  %underlying_type401 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %873, i32 0, i32 1
+  %874 = load ptr, ptr %expression, align 8
+  store ptr %874, ptr %underlying_type401, align 8
+  %n402 = alloca %Node, align 8
+  %type403 = getelementptr %Node, ptr %n402, i32 0, i32 0
+  %875 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  store i64 %875, ptr %type403, align 4
+  %data404 = getelementptr %Node, ptr %n402, i32 0, i32 1
+  %876 = load ptr, ptr %dd, align 8
+  store ptr %876, ptr %data404, align 8
+  %877 = load ptr, ptr %c, align 8
+  %878 = load %Node, ptr %n402, align 8
+  %879 = call ptr @create_node(ptr %877, %Node %878)
+  %simple_type_node = alloca ptr, align 8
+  store ptr %879, ptr %simple_type_node, align 8
+  %880 = load ptr, ptr %c, align 8
+  %llvm_context = getelementptr %codegen, ptr %880, i32 0, i32 1
+  %881 = load ptr, ptr %llvm_context, align 8
+  %882 = load ptr, ptr %name, align 8
+  %883 = call ptr @LLVMStructCreateNamed(ptr %881, ptr %882)
+  %struc_type = alloca ptr, align 8
+  store ptr %883, ptr %struc_type, align 8
+  %884 = load ptr, ptr %name, align 8
+  %885 = icmp ne ptr %884, null
+  br i1 %885, label %then_block405, label %merge_block413
+
+then_block405:                                    ; preds = %then_block397
+  %v406 = alloca %Variable, align 8
+  %value407 = getelementptr %Variable, ptr %v406, i32 0, i32 0
+  store ptr null, ptr %value407, align 8
+  %type408 = getelementptr %Variable, ptr %v406, i32 0, i32 1
+  %886 = load ptr, ptr %struc_type, align 8
+  store ptr %886, ptr %type408, align 8
+  %stack_level409 = getelementptr %Variable, ptr %v406, i32 0, i32 4
+  store ptr null, ptr %stack_level409, align 8
+  %node410 = getelementptr %Variable, ptr %v406, i32 0, i32 2
+  %887 = load ptr, ptr %expression, align 8
+  store ptr %887, ptr %node410, align 8
+  %node_type411 = getelementptr %Variable, ptr %v406, i32 0, i32 3
+  %888 = load ptr, ptr %simple_type_node, align 8
+  store ptr %888, ptr %node_type411, align 8
+  %889 = load ptr, ptr %c, align 8
+  %environment412 = getelementptr %codegen, ptr %889, i32 0, i32 4
+  %890 = load ptr, ptr %environment412, align 8
+  %891 = load ptr, ptr %name, align 8
+  %892 = load ptr, ptr %c, align 8
+  %893 = load %Variable, ptr %v406, align 8
+  %894 = call ptr @codegen_create_variable(ptr %892, %Variable %893)
+  call void @environment_add_variable(ptr %890, ptr %891, ptr %894)
+  br label %merge_block413
+
+merge_block413:                                   ; preds = %then_block397, %then_block405
+  %895 = load ptr, ptr %c, align 8
+  %arena414 = getelementptr %codegen, ptr %895, i32 0, i32 3
+  %896 = load ptr, ptr %arena414, align 8
+  %897 = call ptr @arena_alloc(ptr %896, i64 160)
+  %llvm_types = alloca ptr, align 8
+  store ptr %897, ptr %llvm_types, align 8
+  %i415 = alloca i64, align 8
+  store i64 0, ptr %i415, align 4
+  br label %while_block416
+
+while_block416:                                   ; preds = %inner_block417, %merge_block413
+  %898 = load i64, ptr %i415, align 4
+  %fields_len = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_data, i32 0, i32 1
+  %899 = load i64, ptr %fields_len, align 4
+  %900 = icmp slt i64 %898, %899
+  br i1 %900, label %inner_block417, label %outer_block418
+
+inner_block417:                                   ; preds = %while_block416
+  %fields = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_data, i32 0, i32 0
+  %901 = load ptr, ptr %fields, align 8
+  %902 = load i64, ptr %i415, align 4
+  %903 = getelementptr ptr, ptr %901, i64 %902
+  %904 = load ptr, ptr %903, align 8
+  %field = alloca ptr, align 8
+  store ptr %904, ptr %field, align 8
+  %905 = load ptr, ptr %field, align 8
+  %type419 = getelementptr %Node, ptr %905, i32 0, i32 0
+  %906 = load i64, ptr %type419, align 4
+  %907 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %908 = icmp eq i64 %906, %907
+  call void @assert(i1 %908)
+  %909 = load ptr, ptr %field, align 8
+  %data420 = getelementptr %Node, ptr %909, i32 0, i32 1
+  %910 = load ptr, ptr %data420, align 8
+  %type421 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %910, i32 0, i32 1
+  %911 = load ptr, ptr %type421, align 8
+  %t = alloca ptr, align 8
+  store ptr %911, ptr %t, align 8
+  %912 = load ptr, ptr %c, align 8
+  %913 = load ptr, ptr %t, align 8
+  %914 = call ptr @codegen_get_llvm_type(ptr %912, ptr %913)
+  %lt = alloca ptr, align 8
+  store ptr %914, ptr %lt, align 8
+  %915 = load ptr, ptr %lt, align 8
+  %916 = icmp ne ptr %915, null
+  call void @assert(i1 %916)
+  %917 = load ptr, ptr %llvm_types, align 8
+  %918 = load i64, ptr %i415, align 4
+  %919 = getelementptr ptr, ptr %917, i64 %918
+  %920 = load ptr, ptr %lt, align 8
+  %921 = load ptr, ptr %920, align 8
+  store ptr %921, ptr %919, align 8
+  %922 = load i64, ptr %i415, align 4
+  %923 = add i64 %922, 1
+  store i64 %923, ptr %i415, align 4
+  br label %while_block416
+
+outer_block418:                                   ; preds = %while_block416
+  %924 = load ptr, ptr %struc_type, align 8
+  %925 = load ptr, ptr %llvm_types, align 8
+  %926 = load i64, ptr %i415, align 4
+  call void @LLVMStructSetBody(ptr %924, ptr %925, i64 %926, i64 0)
+  %v422 = alloca %Variable, align 8
+  %value423 = getelementptr %Variable, ptr %v422, i32 0, i32 0
+  store ptr null, ptr %value423, align 8
+  %type424 = getelementptr %Variable, ptr %v422, i32 0, i32 1
+  %927 = load ptr, ptr %struc_type, align 8
+  store ptr %927, ptr %type424, align 8
+  %stack_level425 = getelementptr %Variable, ptr %v422, i32 0, i32 4
+  store ptr null, ptr %stack_level425, align 8
+  %node426 = getelementptr %Variable, ptr %v422, i32 0, i32 2
+  %928 = load ptr, ptr %expression, align 8
+  store ptr %928, ptr %node426, align 8
+  %node_type427 = getelementptr %Variable, ptr %v422, i32 0, i32 3
+  %929 = load ptr, ptr %simple_type_node, align 8
+  store ptr %929, ptr %node_type427, align 8
+  %930 = load ptr, ptr %c, align 8
+  %931 = load %Variable, ptr %v422, align 8
+  %932 = call ptr @codegen_create_variable(ptr %930, %Variable %931)
+  ret ptr %932
+
+merge_block428:                                   ; preds = %merge_block395
+  %933 = load ptr, ptr %expression, align 8
+  %type429 = getelementptr %Node, ptr %933, i32 0, i32 0
+  %934 = load i64, ptr %type429, align 4
+  %935 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %936 = icmp eq i64 %934, %935
+  br i1 %936, label %then_block430, label %merge_block441
+
+then_block430:                                    ; preds = %merge_block428
+  %937 = load ptr, ptr %expression, align 8
+  %data431 = getelementptr %Node, ptr %937, i32 0, i32 1
+  %938 = load ptr, ptr %data431, align 8
+  %939 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %938, align 8
+  %simple_type_data = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %939, ptr %simple_type_data, align 8
+  %940 = load ptr, ptr %c, align 8
+  %underlying_type432 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_data, i32 0, i32 1
+  %941 = load ptr, ptr %underlying_type432, align 8
+  %942 = call ptr @codegen_get_llvm_type(ptr %940, ptr %941)
+  %typ433 = alloca ptr, align 8
+  store ptr %942, ptr %typ433, align 8
+  %943 = load ptr, ptr %typ433, align 8
+  %944 = icmp ne ptr %943, null
+  call void @assert(i1 %944)
+  %v434 = alloca %Variable, align 8
+  %value435 = getelementptr %Variable, ptr %v434, i32 0, i32 0
+  store ptr null, ptr %value435, align 8
+  %type436 = getelementptr %Variable, ptr %v434, i32 0, i32 1
+  %945 = load ptr, ptr %typ433, align 8
+  %946 = load ptr, ptr %945, align 8
+  store ptr %946, ptr %type436, align 8
+  %stack_level437 = getelementptr %Variable, ptr %v434, i32 0, i32 4
+  store ptr null, ptr %stack_level437, align 8
+  %node438 = getelementptr %Variable, ptr %v434, i32 0, i32 2
+  %947 = load ptr, ptr %expression, align 8
+  store ptr %947, ptr %node438, align 8
+  %node_type439 = getelementptr %Variable, ptr %v434, i32 0, i32 3
+  %underlying_type440 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_data, i32 0, i32 1
+  %948 = load ptr, ptr %underlying_type440, align 8
+  store ptr %948, ptr %node_type439, align 8
+  %949 = load ptr, ptr %c, align 8
+  %950 = load %Variable, ptr %v434, align 8
+  %951 = call ptr @codegen_create_variable(ptr %949, %Variable %950)
+  ret ptr %951
+
+merge_block441:                                   ; preds = %merge_block428
+  %952 = load ptr, ptr %expression, align 8
+  %type442 = getelementptr %Node, ptr %952, i32 0, i32 0
+  %953 = load i64, ptr %type442, align 4
+  %954 = load i64, ptr @NODE_STRUCT_INSTANCIATION, align 4
+  %955 = icmp eq i64 %953, %954
+  br i1 %955, label %then_block443, label %merge_block449
+
+then_block443:                                    ; preds = %merge_block441
+  %956 = load ptr, ptr %expression, align 8
+  %data444 = getelementptr %Node, ptr %956, i32 0, i32 1
+  %957 = load ptr, ptr %data444, align 8
+  %958 = load %NODE_STRUCT_INSTANCIATION_DATA, ptr %957, align 8
+  %struc_data445 = alloca %NODE_STRUCT_INSTANCIATION_DATA, align 8
+  store %NODE_STRUCT_INSTANCIATION_DATA %958, ptr %struc_data445, align 8
+  %959 = load ptr, ptr %c, align 8
+  %environment446 = getelementptr %codegen, ptr %959, i32 0, i32 4
+  %960 = load ptr, ptr %environment446, align 8
+  %typ447 = getelementptr %NODE_STRUCT_INSTANCIATION_DATA, ptr %struc_data445, i32 0, i32 0
+  %961 = load ptr, ptr %typ447, align 8
+  %962 = call ptr @environment_get_variable(ptr %960, ptr %961)
+  %v448 = alloca ptr, align 8
+  store ptr %962, ptr %v448, align 8
+  %963 = load ptr, ptr %v448, align 8
+  %964 = icmp ne ptr %963, null
+  call void @assert(i1 %964)
+  %965 = load ptr, ptr %v448, align 8
+  ret ptr %965
+
+merge_block449:                                   ; preds = %merge_block441
+  %966 = load ptr, ptr %expression, align 8
+  %type450 = getelementptr %Node, ptr %966, i32 0, i32 0
+  %967 = load i64, ptr %type450, align 4
+  %968 = load i64, ptr @NODE_FIELD_ACCESS, align 4
+  %969 = icmp eq i64 %967, %968
+  br i1 %969, label %then_block451, label %merge_block467
+
+then_block451:                                    ; preds = %merge_block449
+  %970 = load ptr, ptr %expression, align 8
+  %data452 = getelementptr %Node, ptr %970, i32 0, i32 1
+  %971 = load ptr, ptr %data452, align 8
+  %972 = load %NODE_FIELD_ACCESS_DATA, ptr %971, align 8
+  %field_access = alloca %NODE_FIELD_ACCESS_DATA, align 8
+  store %NODE_FIELD_ACCESS_DATA %972, ptr %field_access, align 8
+  %973 = load ptr, ptr %c, align 8
+  %expression453 = getelementptr %NODE_FIELD_ACCESS_DATA, ptr %field_access, i32 0, i32 0
+  %974 = load ptr, ptr %expression453, align 8
+  %name454 = getelementptr %NODE_FIELD_ACCESS_DATA, ptr %field_access, i32 0, i32 1
+  %975 = load ptr, ptr %name454, align 8
+  %976 = call ptr @codegen_get_struct_field(ptr %973, ptr %974, ptr %975)
+  %x455 = alloca ptr, align 8
+  store ptr %976, ptr %x455, align 8
+  %977 = load ptr, ptr %x455, align 8
+  %978 = icmp ne ptr %977, null
+  call void @assert(i1 %978)
+  %979 = load ptr, ptr %c, align 8
+  %980 = load ptr, ptr %x455, align 8
+  %type456 = getelementptr %StructField, ptr %980, i32 0, i32 1
+  %981 = load ptr, ptr %type456, align 8
+  %982 = call ptr @codegen_get_llvm_type(ptr %979, ptr %981)
+  %t457 = alloca ptr, align 8
+  store ptr %982, ptr %t457, align 8
+  %983 = load ptr, ptr %t457, align 8
+  %984 = icmp ne ptr %983, null
+  call void @assert(i1 %984)
+  %985 = load ptr, ptr %c, align 8
+  %builder458 = getelementptr %codegen, ptr %985, i32 0, i32 2
+  %986 = load ptr, ptr %builder458, align 8
+  %987 = load ptr, ptr %t457, align 8
+  %988 = load ptr, ptr %987, align 8
+  %989 = load ptr, ptr %x455, align 8
+  %value459 = getelementptr %StructField, ptr %989, i32 0, i32 0
+  %990 = load ptr, ptr %value459, align 8
+  %991 = call ptr @LLVMBuildLoad2(ptr %986, ptr %988, ptr %990, ptr @218)
+  %loaded = alloca ptr, align 8
+  store ptr %991, ptr %loaded, align 8
+  %v460 = alloca %Variable, align 8
+  %value461 = getelementptr %Variable, ptr %v460, i32 0, i32 0
+  %992 = load ptr, ptr %loaded, align 8
+  store ptr %992, ptr %value461, align 8
+  %type462 = getelementptr %Variable, ptr %v460, i32 0, i32 1
+  store ptr null, ptr %type462, align 8
+  %stack_level463 = getelementptr %Variable, ptr %v460, i32 0, i32 4
+  store ptr null, ptr %stack_level463, align 8
+  %node464 = getelementptr %Variable, ptr %v460, i32 0, i32 2
+  %993 = load ptr, ptr %expression, align 8
+  store ptr %993, ptr %node464, align 8
+  %node_type465 = getelementptr %Variable, ptr %v460, i32 0, i32 3
+  %994 = load ptr, ptr %x455, align 8
+  %type466 = getelementptr %StructField, ptr %994, i32 0, i32 1
+  %995 = load ptr, ptr %type466, align 8
+  store ptr %995, ptr %node_type465, align 8
+  %996 = load ptr, ptr %c, align 8
+  %997 = load %Variable, ptr %v460, align 8
+  %998 = call ptr @codegen_create_variable(ptr %996, %Variable %997)
+  ret ptr %998
+
+merge_block467:                                   ; preds = %merge_block449
+  %999 = load ptr, ptr %expression, align 8
+  %type468 = getelementptr %Node, ptr %999, i32 0, i32 0
+  %1000 = load i64, ptr %type468, align 4
+  call void (ptr, ...) @printf(ptr @219, i64 %1000)
+  call void @assert(i1 false)
+  ret ptr null
+}
+
+define ptr @codegen_get_struct_field(ptr %0, ptr %1, ptr %2) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %node = alloca ptr, align 8
+  store ptr %1, ptr %node, align 8
+  %name = alloca ptr, align 8
+  store ptr %2, ptr %name, align 8
+  %ptr = alloca ptr, align 8
+  store ptr null, ptr %ptr, align 8
+  %3 = load ptr, ptr %node, align 8
+  %type = getelementptr %Node, ptr %3, i32 0, i32 0
+  %4 = load i64, ptr %type, align 4
+  %5 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %6 = icmp eq i64 %4, %5
+  br i1 %6, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %7 = load ptr, ptr %node, align 8
+  %data = getelementptr %Node, ptr %7, i32 0, i32 1
+  %8 = load ptr, ptr %data, align 8
+  %9 = load %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %8, align 8
+  %identifier = alloca %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, align 8
+  store %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA %9, ptr %identifier, align 8
+  %10 = load ptr, ptr %c, align 8
+  %environment = getelementptr %codegen, ptr %10, i32 0, i32 4
+  %11 = load ptr, ptr %environment, align 8
+  %name1 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %identifier, i32 0, i32 0
+  %12 = load ptr, ptr %name1, align 8
+  %13 = call ptr @environment_get_variable(ptr %11, ptr %12)
+  store ptr %13, ptr %ptr, align 8
+  br label %merge_block
+
+merge_block:                                      ; preds = %entrypoint, %then_block
+  %14 = load ptr, ptr %node, align 8
+  %type2 = getelementptr %Node, ptr %14, i32 0, i32 0
+  %15 = load i64, ptr %type2, align 4
+  %16 = load i64, ptr @NODE_UNARY_EXPRESSION, align 4
+  %17 = icmp eq i64 %15, %16
+  br i1 %17, label %then_block3, label %merge_block5
+
+then_block3:                                      ; preds = %merge_block
+  %18 = load ptr, ptr %node, align 8
+  %data4 = getelementptr %Node, ptr %18, i32 0, i32 1
+  %19 = load ptr, ptr %data4, align 8
+  %expression = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %19, i32 0, i32 1
+  %20 = load ptr, ptr %expression, align 8
+  %xd = alloca ptr, align 8
+  store ptr %20, ptr %xd, align 8
+  %21 = load ptr, ptr %c, align 8
+  %22 = load ptr, ptr %xd, align 8
+  %23 = call ptr @codegen_generate_expression_value(ptr %21, ptr %22, ptr @189)
+  store ptr %23, ptr %ptr, align 8
+  br label %merge_block5
+
+merge_block5:                                     ; preds = %merge_block, %then_block3
+  %24 = load ptr, ptr %ptr, align 8
+  %25 = icmp ne ptr %24, null
+  call void @assert(i1 %25)
+  %typ = alloca ptr, align 8
+  store ptr null, ptr %typ, align 8
+  %26 = load ptr, ptr %ptr, align 8
+  %node_type = getelementptr %Variable, ptr %26, i32 0, i32 3
+  %27 = load ptr, ptr %node_type, align 8
+  %ptr_typ = alloca ptr, align 8
+  store ptr %27, ptr %ptr_typ, align 8
+  %28 = load ptr, ptr %ptr_typ, align 8
+  %type6 = getelementptr %Node, ptr %28, i32 0, i32 0
+  %29 = load i64, ptr %type6, align 4
+  %30 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %31 = icmp eq i64 %29, %30
+  br i1 %31, label %then_block7, label %merge_block8
+
+then_block7:                                      ; preds = %merge_block5
+  %32 = load ptr, ptr %ptr_typ, align 8
+  store ptr %32, ptr %typ, align 8
+  br label %merge_block8
+
+merge_block8:                                     ; preds = %merge_block5, %then_block7
+  %33 = load ptr, ptr %ptr_typ, align 8
+  %type9 = getelementptr %Node, ptr %33, i32 0, i32 0
+  %34 = load i64, ptr %type9, align 4
+  %35 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4
+  %36 = icmp eq i64 %34, %35
+  br i1 %36, label %then_block10, label %merge_block18
+
+then_block10:                                     ; preds = %merge_block8
+  %37 = load ptr, ptr %ptr_typ, align 8
+  %data11 = getelementptr %Node, ptr %37, i32 0, i32 1
+  %38 = load ptr, ptr %data11, align 8
+  %39 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %38, align 8
+  %pt = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8
+  store %NODE_TYPE_POINTER_TYPE_DATA %39, ptr %pt, align 8
+  %type12 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pt, i32 0, i32 0
+  %40 = load ptr, ptr %type12, align 8
+  %pt_type = alloca ptr, align 8
+  store ptr %40, ptr %pt_type, align 8
+  %41 = load ptr, ptr %pt_type, align 8
+  %type13 = getelementptr %Node, ptr %41, i32 0, i32 0
+  %42 = load i64, ptr %type13, align 4
+  %43 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %44 = icmp eq i64 %42, %43
+  call void @assert(i1 %44)
+  %45 = load ptr, ptr %pt_type, align 8
+  %data14 = getelementptr %Node, ptr %45, i32 0, i32 1
+  %46 = load ptr, ptr %data14, align 8
+  %47 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %46, align 8
+  %simple_type = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %47, ptr %simple_type, align 8
+  %48 = load ptr, ptr %c, align 8
+  %environment15 = getelementptr %codegen, ptr %48, i32 0, i32 4
+  %49 = load ptr, ptr %environment15, align 8
+  %name16 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type, i32 0, i32 0
+  %50 = load ptr, ptr %name16, align 8
+  %51 = call ptr @environment_get_variable(ptr %49, ptr %50)
+  %v = alloca ptr, align 8
+  store ptr %51, ptr %v, align 8
+  %52 = load ptr, ptr %v, align 8
+  %53 = icmp ne ptr %52, null
+  call void @assert(i1 %53)
+  %54 = load ptr, ptr %v, align 8
+  %node_type17 = getelementptr %Variable, ptr %54, i32 0, i32 3
+  %55 = load ptr, ptr %node_type17, align 8
+  store ptr %55, ptr %typ, align 8
+  br label %merge_block18
+
+merge_block18:                                    ; preds = %merge_block8, %then_block10
+  %56 = load ptr, ptr %ptr_typ, align 8
+  %type19 = getelementptr %Node, ptr %56, i32 0, i32 0
+  %57 = load i64, ptr %type19, align 4
+  %58 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %59 = icmp eq i64 %57, %58
+  br i1 %59, label %then_block20, label %merge_block27
+
+then_block20:                                     ; preds = %merge_block18
+  %60 = load ptr, ptr %ptr_typ, align 8
+  %data21 = getelementptr %Node, ptr %60, i32 0, i32 1
+  %61 = load ptr, ptr %data21, align 8
+  %62 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %61, align 8
+  %simple_type22 = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %62, ptr %simple_type22, align 8
+  %63 = load ptr, ptr %c, align 8
+  %environment23 = getelementptr %codegen, ptr %63, i32 0, i32 4
+  %64 = load ptr, ptr %environment23, align 8
+  %name24 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type22, i32 0, i32 0
+  %65 = load ptr, ptr %name24, align 8
+  %66 = call ptr @environment_get_variable(ptr %64, ptr %65)
+  %v25 = alloca ptr, align 8
+  store ptr %66, ptr %v25, align 8
+  %67 = load ptr, ptr %v25, align 8
+  %68 = icmp ne ptr %67, null
+  call void @assert(i1 %68)
+  %69 = load ptr, ptr %v25, align 8
+  %node_type26 = getelementptr %Variable, ptr %69, i32 0, i32 3
+  %70 = load ptr, ptr %node_type26, align 8
+  store ptr %70, ptr %typ, align 8
+  br label %merge_block27
+
+merge_block27:                                    ; preds = %merge_block18, %then_block20
+  %71 = load ptr, ptr %typ, align 8
+  %72 = icmp ne ptr %71, null
+  call void @assert(i1 %72)
+  %73 = load ptr, ptr %typ, align 8
+  %type28 = getelementptr %Node, ptr %73, i32 0, i32 0
+  %74 = load i64, ptr %type28, align 4
+  %75 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4
+  %76 = icmp eq i64 %74, %75
+  call void @assert(i1 %76)
+  %77 = load ptr, ptr %typ, align 8
+  %data29 = getelementptr %Node, ptr %77, i32 0, i32 1
+  %78 = load ptr, ptr %data29, align 8
+  %79 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %78, align 8
+  %simple_type30 = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8
+  store %NODE_TYPE_SIMPLE_TYPE_DATA %79, ptr %simple_type30, align 8
+  %underlying_type = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type30, i32 0, i32 1
+  %80 = load ptr, ptr %underlying_type, align 8
+  %type31 = getelementptr %Node, ptr %80, i32 0, i32 0
+  %81 = load i64, ptr %type31, align 4
+  %82 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4
+  %83 = icmp eq i64 %81, %82
+  call void @assert(i1 %83)
+  %underlying_type32 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type30, i32 0, i32 1
+  %84 = load ptr, ptr %underlying_type32, align 8
+  %data33 = getelementptr %Node, ptr %84, i32 0, i32 1
+  %85 = load ptr, ptr %data33, align 8
+  %86 = load %NODE_TYPE_STRUCT_TYPE_DATA, ptr %85, align 8
+  %struc_type = alloca %NODE_TYPE_STRUCT_TYPE_DATA, align 8
+  store %NODE_TYPE_STRUCT_TYPE_DATA %86, ptr %struc_type, align 8
+  %fieldIndex = alloca ptr, align 8
+  store ptr null, ptr %fieldIndex, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block38, %merge_block27
+  %87 = load i64, ptr %i, align 4
+  %fields_len = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type, i32 0, i32 1
+  %88 = load i64, ptr %fields_len, align 4
+  %89 = icmp slt i64 %87, %88
+  br i1 %89, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %fields = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type, i32 0, i32 0
+  %90 = load ptr, ptr %fields, align 8
+  %91 = load i64, ptr %i, align 4
+  %92 = getelementptr ptr, ptr %90, i64 %91
+  %93 = load ptr, ptr %92, align 8
+  %field = alloca ptr, align 8
+  store ptr %93, ptr %field, align 8
+  %94 = load ptr, ptr %field, align 8
+  %type34 = getelementptr %Node, ptr %94, i32 0, i32 0
+  %95 = load i64, ptr %type34, align 4
+  %96 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %97 = icmp eq i64 %95, %96
+  call void @assert(i1 %97)
+  %98 = load ptr, ptr %field, align 8
+  %data35 = getelementptr %Node, ptr %98, i32 0, i32 1
+  %99 = load ptr, ptr %data35, align 8
+  %100 = load %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %99, align 8
+  %field_data = alloca %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, align 8
+  store %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA %100, ptr %field_data, align 8
+  %101 = load ptr, ptr %name, align 8
+  %name36 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %field_data, i32 0, i32 0
+  %102 = load ptr, ptr %name36, align 8
+  %103 = call i1 @strcmp(ptr %101, ptr %102)
+  br i1 %103, label %then_block37, label %merge_block38
+
+outer_block:                                      ; preds = %then_block37, %while_block
+  %104 = load ptr, ptr %fieldIndex, align 8
+  %105 = icmp ne ptr %104, null
+  call void @assert(i1 %105)
+  %106 = call ptr @LLVMInt32Type()
+  %107 = call ptr @LLVMConstInt(ptr %106, i64 0, i64 0)
+  %zero = alloca ptr, align 8
+  store ptr %107, ptr %zero, align 8
+  %108 = call ptr @LLVMInt32Type()
+  %109 = load ptr, ptr %fieldIndex, align 8
+  %110 = load i64, ptr %109, align 4
+  %111 = call ptr @LLVMConstInt(ptr %108, i64 %110, i64 0)
+  %llvmFieldIndex = alloca ptr, align 8
+  store ptr %111, ptr %llvmFieldIndex, align 8
+  %112 = load ptr, ptr %c, align 8
+  %arena39 = getelementptr %codegen, ptr %112, i32 0, i32 3
+  %113 = load ptr, ptr %arena39, align 8
+  %114 = call ptr @arena_alloc(ptr %113, i64 16)
+  %indices = alloca ptr, align 8
+  store ptr %114, ptr %indices, align 8
+  %115 = load ptr, ptr %indices, align 8
+  %116 = getelementptr ptr, ptr %115, i64 0
+  %117 = load ptr, ptr %zero, align 8
+  store ptr %117, ptr %116, align 8
+  %118 = load ptr, ptr %indices, align 8
+  %119 = getelementptr ptr, ptr %118, i64 1
+  %120 = load ptr, ptr %llvmFieldIndex, align 8
+  store ptr %120, ptr %119, align 8
+  %121 = load ptr, ptr %c, align 8
+  %arena40 = getelementptr %codegen, ptr %121, i32 0, i32 3
+  %122 = load ptr, ptr %arena40, align 8
+  %123 = call ptr @arena_alloc(ptr %122, i64 16)
+  %res = alloca ptr, align 8
+  store ptr %123, ptr %res, align 8
+  %124 = load ptr, ptr %c, align 8
+  %125 = load ptr, ptr %typ, align 8
+  %126 = call ptr @codegen_get_llvm_type(ptr %124, ptr %125)
+  %x = alloca ptr, align 8
+  store ptr %126, ptr %x, align 8
+  %127 = load ptr, ptr %x, align 8
+  %128 = icmp ne ptr %127, null
+  call void @assert(i1 %128)
+  %129 = load ptr, ptr %res, align 8
+  %value = getelementptr %StructField, ptr %129, i32 0, i32 0
+  %130 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %130, i32 0, i32 2
+  %131 = load ptr, ptr %builder, align 8
+  %132 = load ptr, ptr %x, align 8
+  %133 = load ptr, ptr %132, align 8
+  %134 = load ptr, ptr %ptr, align 8
+  %value41 = getelementptr %Variable, ptr %134, i32 0, i32 0
+  %135 = load ptr, ptr %value41, align 8
+  %136 = load ptr, ptr %indices, align 8
+  %137 = load ptr, ptr %name, align 8
+  %138 = call ptr @LLVMBuildGEP2(ptr %131, ptr %133, ptr %135, ptr %136, i64 2, ptr %137)
+  store ptr %138, ptr %value, align 8
+  %fields42 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type, i32 0, i32 0
+  %139 = load ptr, ptr %fields42, align 8
+  %140 = load ptr, ptr %fieldIndex, align 8
+  %141 = load i64, ptr %140, align 4
+  %142 = getelementptr ptr, ptr %139, i64 %141
+  %143 = load ptr, ptr %142, align 8
+  %no = alloca ptr, align 8
+  store ptr %143, ptr %no, align 8
+  %144 = load ptr, ptr %no, align 8
+  %type43 = getelementptr %Node, ptr %144, i32 0, i32 0
+  %145 = load i64, ptr %type43, align 4
+  %146 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %147 = icmp eq i64 %145, %146
+  call void @assert(i1 %147)
+  %148 = load ptr, ptr %no, align 8
+  %data44 = getelementptr %Node, ptr %148, i32 0, i32 1
+  %149 = load ptr, ptr %data44, align 8
+  %150 = load %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %149, align 8
+  %no_d = alloca %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, align 8
+  store %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA %150, ptr %no_d, align 8
+  %151 = load ptr, ptr %res, align 8
+  %type45 = getelementptr %StructField, ptr %151, i32 0, i32 1
+  %type46 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %no_d, i32 0, i32 1
+  %152 = load ptr, ptr %type46, align 8
+  store ptr %152, ptr %type45, align 8
+  %153 = load ptr, ptr %res, align 8
+  ret ptr %153
+
+then_block37:                                     ; preds = %inner_block
+  %154 = load ptr, ptr %c, align 8
+  %arena = getelementptr %codegen, ptr %154, i32 0, i32 3
+  %155 = load ptr, ptr %arena, align 8
+  %156 = call ptr @arena_alloc(ptr %155, i64 8)
+  %ii = alloca ptr, align 8
+  store ptr %156, ptr %ii, align 8
+  %157 = load i64, ptr %i, align 4
+  %158 = load ptr, ptr %ii, align 8
+  store i64 %157, ptr %158, align 4
+  %159 = load ptr, ptr %ii, align 8
+  store ptr %159, ptr %fieldIndex, align 8
+  br label %outer_block
+
+merge_block38:                                    ; preds = %inner_block
+  %160 = load i64, ptr %i, align 4
+  %161 = add i64 %160, 1
+  store i64 %161, ptr %i, align 4
+  br label %while_block
+}
+
+define i64 @codegen_generate_assignment_statement(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %stmt = alloca ptr, align 8
+  store ptr %1, ptr %stmt, align 8
+  %2 = load ptr, ptr %stmt, align 8
+  %lhs = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %2, i32 0, i32 2
+  %3 = load ptr, ptr %lhs, align 8
+  %4 = load %Node, ptr %3, align 8
+  %lhs1 = alloca %Node, align 8
+  store %Node %4, ptr %lhs1, align 8
+  %5 = load ptr, ptr %stmt, align 8
+  %rhs = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %5, i32 0, i32 3
+  %6 = load ptr, ptr %rhs, align 8
+  %prhs = alloca ptr, align 8
+  store ptr %6, ptr %prhs, align 8
+  %type = getelementptr %Node, ptr %lhs1, i32 0, i32 0
+  %7 = load i64, ptr %type, align 4
+  %8 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %9 = icmp eq i64 %7, %8
+  br i1 %9, label %then_block, label %merge_block43
+
+then_block:                                       ; preds = %entrypoint
+  %data = getelementptr %Node, ptr %lhs1, i32 0, i32 1
+  %10 = load ptr, ptr %data, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %10, i32 0, i32 0
+  %11 = load ptr, ptr %name, align 8
+  %identifier = alloca ptr, align 8
+  store ptr %11, ptr %identifier, align 8
+  %12 = load ptr, ptr %c, align 8
+  %13 = load ptr, ptr %prhs, align 8
+  %14 = load ptr, ptr %identifier, align 8
+  %15 = call ptr @codegen_generate_expression_value(ptr %12, ptr %13, ptr %14)
+  %variable = alloca ptr, align 8
+  store ptr %15, ptr %variable, align 8
+  %16 = load ptr, ptr %variable, align 8
+  %17 = icmp ne ptr %16, null
+  call void @assert(i1 %17)
+  %18 = load ptr, ptr %c, align 8
+  %environment = getelementptr %codegen, ptr %18, i32 0, i32 4
+  %19 = load ptr, ptr %environment, align 8
+  %20 = load %Environment, ptr %19, align 8
+  %env = alloca %Environment, align 8
+  store %Environment %20, ptr %env, align 8
+  %scope_stack_len = getelementptr %Environment, ptr %env, i32 0, i32 1
+  %21 = load i64, ptr %scope_stack_len, align 4
+  %22 = icmp eq i64 %21, 1
+  br i1 %22, label %then_block2, label %merge_block
+
+then_block2:                                      ; preds = %then_block
+  %23 = load ptr, ptr %c, align 8
+  %environment3 = getelementptr %codegen, ptr %23, i32 0, i32 4
+  %24 = load ptr, ptr %environment3, align 8
+  %25 = load ptr, ptr %identifier, align 8
+  %26 = load ptr, ptr %variable, align 8
+  call void @environment_add_variable(ptr %24, ptr %25, ptr %26)
+  ret i64 0
+
+merge_block:                                      ; preds = %then_block
+  %ptr = alloca ptr, align 8
+  store ptr null, ptr %ptr, align 8
+  %27 = load ptr, ptr %variable, align 8
+  %node_type = getelementptr %Variable, ptr %27, i32 0, i32 3
+  %28 = load ptr, ptr %node_type, align 8
+  %typ = alloca ptr, align 8
+  store ptr %28, ptr %typ, align 8
+  %29 = load ptr, ptr %stmt, align 8
+  %is_declaration = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %29, i32 0, i32 0
+  %30 = load i1, ptr %is_declaration, align 1
+  br i1 %30, label %then_block4, label %merge_block8
+
+then_block4:                                      ; preds = %merge_block
+  %31 = load ptr, ptr %c, align 8
+  %32 = load ptr, ptr %typ, align 8
+  %33 = call ptr @codegen_get_llvm_type(ptr %31, ptr %32)
+  %x = alloca ptr, align 8
+  store ptr %33, ptr %x, align 8
+  %34 = load ptr, ptr %x, align 8
+  %35 = icmp ne ptr %34, null
+  call void @assert(i1 %35)
+  %36 = load ptr, ptr %typ, align 8
+  %type5 = getelementptr %Node, ptr %36, i32 0, i32 0
+  %37 = load i64, ptr %type5, align 4
+  %38 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %39 = icmp eq i64 %37, %38
+  br i1 %39, label %then_block6, label %merge_block7
+
+then_block6:                                      ; preds = %then_block4
+  %40 = load ptr, ptr %x, align 8
+  %41 = load ptr, ptr %40, align 8
+  %42 = call ptr @LLVMPointerType(ptr %41, i64 0)
+  %43 = load ptr, ptr %x, align 8
+  store ptr %42, ptr %43, align 8
+  br label %merge_block7
+
+merge_block7:                                     ; preds = %then_block4, %then_block6
+  %44 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %44, i32 0, i32 2
+  %45 = load ptr, ptr %builder, align 8
+  %46 = load ptr, ptr %x, align 8
+  %47 = load ptr, ptr %46, align 8
+  %48 = load ptr, ptr %identifier, align 8
+  %49 = call ptr @LLVMBuildAlloca(ptr %45, ptr %47, ptr %48)
+  store ptr %49, ptr %ptr, align 8
+  br label %merge_block8
+
+merge_block8:                                     ; preds = %merge_block, %merge_block7
+  %50 = load ptr, ptr %stmt, align 8
+  %is_declaration9 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %50, i32 0, i32 0
+  %51 = load i1, ptr %is_declaration9, align 1
+  %52 = icmp eq i1 %51, false
+  br i1 %52, label %then_block10, label %merge_block14
+
+then_block10:                                     ; preds = %merge_block8
+  %53 = load ptr, ptr %c, align 8
+  %environment11 = getelementptr %codegen, ptr %53, i32 0, i32 4
+  %54 = load ptr, ptr %environment11, align 8
+  %55 = load ptr, ptr %identifier, align 8
+  %56 = call ptr @environment_get_variable(ptr %54, ptr %55)
+  %v = alloca ptr, align 8
+  store ptr %56, ptr %v, align 8
+  %57 = load ptr, ptr %v, align 8
+  %58 = icmp ne ptr %57, null
+  call void @assert(i1 %58)
+  %59 = load ptr, ptr %v, align 8
+  %value = getelementptr %Variable, ptr %59, i32 0, i32 0
+  %60 = load ptr, ptr %value, align 8
+  store ptr %60, ptr %ptr, align 8
+  %61 = load ptr, ptr %v, align 8
+  %node_type12 = getelementptr %Variable, ptr %61, i32 0, i32 3
+  %62 = load ptr, ptr %node_type12, align 8
+  store ptr %62, ptr %typ, align 8
+  %63 = load ptr, ptr %c, align 8
+  %64 = load ptr, ptr %typ, align 8
+  %65 = load ptr, ptr %variable, align 8
+  %node_type13 = getelementptr %Variable, ptr %65, i32 0, i32 3
+  %66 = load ptr, ptr %node_type13, align 8
+  %67 = load ptr, ptr %stmt, align 8
+  %is_dereference = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %67, i32 0, i32 1
+  %68 = load i1, ptr %is_dereference, align 1
+  %69 = call i1 @compare_types(ptr %63, ptr %64, ptr %66, i1 %68)
+  call void @assert(i1 %69)
+  br label %merge_block14
+
+merge_block14:                                    ; preds = %merge_block8, %then_block10
+  %70 = load ptr, ptr %stmt, align 8
+  %is_dereference15 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %70, i32 0, i32 1
+  %71 = load i1, ptr %is_dereference15, align 1
+  br i1 %71, label %then_block16, label %merge_block18
+
+then_block16:                                     ; preds = %merge_block14
+  %72 = load ptr, ptr %c, align 8
+  %73 = load ptr, ptr %typ, align 8
+  %74 = call ptr @codegen_get_llvm_type(ptr %72, ptr %73)
+  %ltyp = alloca ptr, align 8
+  store ptr %74, ptr %ltyp, align 8
+  %75 = load ptr, ptr %ltyp, align 8
+  %76 = icmp ne ptr %75, null
+  call void @assert(i1 %76)
+  %77 = load ptr, ptr %c, align 8
+  %builder17 = getelementptr %codegen, ptr %77, i32 0, i32 2
+  %78 = load ptr, ptr %builder17, align 8
+  %79 = load ptr, ptr %ltyp, align 8
+  %80 = load ptr, ptr %79, align 8
+  %81 = load ptr, ptr %ptr, align 8
+  %82 = call ptr @LLVMBuildLoad2(ptr %78, ptr %80, ptr %81, ptr @220)
+  store ptr %82, ptr %ptr, align 8
+  br label %merge_block18
+
+merge_block18:                                    ; preds = %merge_block14, %then_block16
+  %83 = load ptr, ptr %variable, align 8
+  %value19 = getelementptr %Variable, ptr %83, i32 0, i32 0
+  %84 = load ptr, ptr %value19, align 8
+  %85 = icmp ne ptr %84, null
+  br i1 %85, label %then_block20, label %merge_block23
+
+then_block20:                                     ; preds = %merge_block18
+  %86 = load ptr, ptr %c, align 8
+  %builder21 = getelementptr %codegen, ptr %86, i32 0, i32 2
+  %87 = load ptr, ptr %builder21, align 8
+  %88 = load ptr, ptr %variable, align 8
+  %value22 = getelementptr %Variable, ptr %88, i32 0, i32 0
+  %89 = load ptr, ptr %value22, align 8
+  %90 = load ptr, ptr %ptr, align 8
+  %91 = call ptr @LLVMBuildStore(ptr %87, ptr %89, ptr %90)
+  br label %merge_block23
+
+merge_block23:                                    ; preds = %merge_block18, %then_block20
+  %92 = load ptr, ptr %stmt, align 8
+  %is_dereference24 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %92, i32 0, i32 1
+  %93 = load i1, ptr %is_dereference24, align 1
+  br i1 %93, label %then_block25, label %merge_block29
+
+then_block25:                                     ; preds = %merge_block23
+  %94 = load ptr, ptr %c, align 8
+  %environment26 = getelementptr %codegen, ptr %94, i32 0, i32 4
+  %95 = load ptr, ptr %environment26, align 8
+  %96 = load ptr, ptr %identifier, align 8
+  %97 = call ptr @environment_get_variable(ptr %95, ptr %96)
+  %v27 = alloca ptr, align 8
+  store ptr %97, ptr %v27, align 8
+  %98 = load ptr, ptr %v27, align 8
+  %99 = icmp ne ptr %98, null
+  call void @assert(i1 %99)
+  %100 = load ptr, ptr %v27, align 8
+  %value28 = getelementptr %Variable, ptr %100, i32 0, i32 0
+  %101 = load ptr, ptr %value28, align 8
+  store ptr %101, ptr %ptr, align 8
+  br label %merge_block29
+
+merge_block29:                                    ; preds = %merge_block23, %then_block25
+  %new_variable = alloca %Variable, align 8
+  %value30 = getelementptr %Variable, ptr %new_variable, i32 0, i32 0
+  %102 = load ptr, ptr %ptr, align 8
+  store ptr %102, ptr %value30, align 8
+  %type31 = getelementptr %Variable, ptr %new_variable, i32 0, i32 1
+  %103 = load ptr, ptr %variable, align 8
+  %type32 = getelementptr %Variable, ptr %103, i32 0, i32 1
+  %104 = load ptr, ptr %type32, align 8
+  store ptr %104, ptr %type31, align 8
+  %stack_level = getelementptr %Variable, ptr %new_variable, i32 0, i32 4
+  store ptr null, ptr %stack_level, align 8
+  %node = getelementptr %Variable, ptr %new_variable, i32 0, i32 2
+  %105 = load ptr, ptr %variable, align 8
+  %node33 = getelementptr %Variable, ptr %105, i32 0, i32 2
+  %106 = load ptr, ptr %node33, align 8
+  store ptr %106, ptr %node, align 8
+  %node_type34 = getelementptr %Variable, ptr %new_variable, i32 0, i32 3
+  %107 = load ptr, ptr %typ, align 8
+  store ptr %107, ptr %node_type34, align 8
+  %108 = load ptr, ptr %stmt, align 8
+  %is_declaration35 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %108, i32 0, i32 0
+  %109 = load i1, ptr %is_declaration35, align 1
+  br i1 %109, label %then_block36, label %merge_block38
+
+then_block36:                                     ; preds = %merge_block29
+  %110 = load ptr, ptr %c, align 8
+  %environment37 = getelementptr %codegen, ptr %110, i32 0, i32 4
+  %111 = load ptr, ptr %environment37, align 8
+  %112 = load ptr, ptr %identifier, align 8
+  %113 = load ptr, ptr %c, align 8
+  %114 = load %Variable, ptr %new_variable, align 8
+  %115 = call ptr @codegen_create_variable(ptr %113, %Variable %114)
+  call void @environment_add_variable(ptr %111, ptr %112, ptr %115)
+  br label %merge_block38
+
+merge_block38:                                    ; preds = %merge_block29, %then_block36
+  %116 = load ptr, ptr %stmt, align 8
+  %is_declaration39 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %116, i32 0, i32 0
+  %117 = load i1, ptr %is_declaration39, align 1
+  %118 = icmp eq i1 %117, false
+  br i1 %118, label %then_block40, label %merge_block42
+
+then_block40:                                     ; preds = %merge_block38
+  %119 = load ptr, ptr %c, align 8
+  %environment41 = getelementptr %codegen, ptr %119, i32 0, i32 4
+  %120 = load ptr, ptr %environment41, align 8
+  %121 = load ptr, ptr %identifier, align 8
+  %122 = load ptr, ptr %c, align 8
+  %123 = load %Variable, ptr %new_variable, align 8
+  %124 = call ptr @codegen_create_variable(ptr %122, %Variable %123)
+  call void @environment_set_variable(ptr %120, ptr %121, ptr %124)
+  br label %merge_block42
+
+merge_block42:                                    ; preds = %merge_block38, %then_block40
+  ret i64 0
+
+merge_block43:                                    ; preds = %entrypoint
+  %type44 = getelementptr %Node, ptr %lhs1, i32 0, i32 0
+  %125 = load i64, ptr %type44, align 4
+  %126 = load i64, ptr @NODE_UNARY_EXPRESSION, align 4
+  %127 = icmp eq i64 %125, %126
+  br i1 %127, label %then_block45, label %merge_block53
+
+then_block45:                                     ; preds = %merge_block43
+  %data46 = getelementptr %Node, ptr %lhs1, i32 0, i32 1
+  %128 = load ptr, ptr %data46, align 8
+  %expression = getelementptr %NODE_UNARY_EXPRESSION_DATA, ptr %128, i32 0, i32 1
+  %129 = load ptr, ptr %expression, align 8
+  %xd = alloca ptr, align 8
+  store ptr %129, ptr %xd, align 8
+  %130 = load ptr, ptr %c, align 8
+  %131 = load ptr, ptr %xd, align 8
+  %132 = call ptr @codegen_generate_expression_value(ptr %130, ptr %131, ptr null)
+  %a = alloca ptr, align 8
+  store ptr %132, ptr %a, align 8
+  %133 = load ptr, ptr %a, align 8
+  %134 = icmp ne ptr %133, null
+  call void @assert(i1 %134)
+  %135 = load ptr, ptr %c, align 8
+  %136 = load ptr, ptr %prhs, align 8
+  %137 = call ptr @codegen_generate_expression_value(ptr %135, ptr %136, ptr null)
+  %variable47 = alloca ptr, align 8
+  store ptr %137, ptr %variable47, align 8
+  %138 = load ptr, ptr %variable47, align 8
+  %139 = icmp ne ptr %138, null
+  call void @assert(i1 %139)
+  %140 = load ptr, ptr %c, align 8
+  %141 = load ptr, ptr %a, align 8
+  %node_type48 = getelementptr %Variable, ptr %141, i32 0, i32 3
+  %142 = load ptr, ptr %node_type48, align 8
+  %143 = load ptr, ptr %variable47, align 8
+  %node_type49 = getelementptr %Variable, ptr %143, i32 0, i32 3
+  %144 = load ptr, ptr %node_type49, align 8
+  %145 = call i1 @compare_types(ptr %140, ptr %142, ptr %144, i1 true)
+  call void @assert(i1 %145)
+  %146 = load ptr, ptr %c, align 8
+  %builder50 = getelementptr %codegen, ptr %146, i32 0, i32 2
+  %147 = load ptr, ptr %builder50, align 8
+  %148 = load ptr, ptr %variable47, align 8
+  %value51 = getelementptr %Variable, ptr %148, i32 0, i32 0
+  %149 = load ptr, ptr %value51, align 8
+  %150 = load ptr, ptr %a, align 8
+  %value52 = getelementptr %Variable, ptr %150, i32 0, i32 0
+  %151 = load ptr, ptr %value52, align 8
+  %152 = call ptr @LLVMBuildStore(ptr %147, ptr %149, ptr %151)
+  ret i64 0
+
+merge_block53:                                    ; preds = %merge_block43
+  %type54 = getelementptr %Node, ptr %lhs1, i32 0, i32 0
+  %153 = load i64, ptr %type54, align 4
+  %154 = load i64, ptr @NODE_FIELD_ACCESS, align 4
+  %155 = icmp eq i64 %153, %154
+  br i1 %155, label %then_block55, label %merge_block69
+
+then_block55:                                     ; preds = %merge_block53
+  %data56 = getelementptr %Node, ptr %lhs1, i32 0, i32 1
+  %156 = load ptr, ptr %data56, align 8
+  %157 = load %NODE_FIELD_ACCESS_DATA, ptr %156, align 8
+  %field_access = alloca %NODE_FIELD_ACCESS_DATA, align 8
+  store %NODE_FIELD_ACCESS_DATA %157, ptr %field_access, align 8
+  %expression57 = getelementptr %NODE_FIELD_ACCESS_DATA, ptr %field_access, i32 0, i32 0
+  %158 = load ptr, ptr %expression57, align 8
+  %xd58 = alloca ptr, align 8
+  store ptr %158, ptr %xd58, align 8
+  %name59 = getelementptr %NODE_FIELD_ACCESS_DATA, ptr %field_access, i32 0, i32 1
+  %159 = load ptr, ptr %name59, align 8
+  %name60 = alloca ptr, align 8
+  store ptr %159, ptr %name60, align 8
+  %160 = load ptr, ptr %c, align 8
+  %161 = load ptr, ptr %xd58, align 8
+  %162 = load ptr, ptr %name60, align 8
+  %163 = call ptr @codegen_get_struct_field(ptr %160, ptr %161, ptr %162)
+  %x61 = alloca ptr, align 8
+  store ptr %163, ptr %x61, align 8
+  %164 = load ptr, ptr %x61, align 8
+  %165 = icmp ne ptr %164, null
+  call void @assert(i1 %165)
+  %166 = load ptr, ptr %c, align 8
+  %167 = load ptr, ptr %prhs, align 8
+  %168 = call ptr @codegen_generate_expression_value(ptr %166, ptr %167, ptr null)
+  %variable62 = alloca ptr, align 8
+  store ptr %168, ptr %variable62, align 8
+  %169 = load ptr, ptr %c, align 8
+  %170 = load ptr, ptr %x61, align 8
+  %type63 = getelementptr %StructField, ptr %170, i32 0, i32 1
+  %171 = load ptr, ptr %type63, align 8
+  %172 = load ptr, ptr %variable62, align 8
+  %node_type64 = getelementptr %Variable, ptr %172, i32 0, i32 3
+  %173 = load ptr, ptr %node_type64, align 8
+  %174 = load ptr, ptr %stmt, align 8
+  %is_dereference65 = getelementptr %NODE_ASSIGNMENT_STATEMENT_DATA, ptr %174, i32 0, i32 1
+  %175 = load i1, ptr %is_dereference65, align 1
+  %176 = call i1 @compare_types(ptr %169, ptr %171, ptr %173, i1 %175)
+  call void @assert(i1 %176)
+  %177 = load ptr, ptr %c, align 8
+  %builder66 = getelementptr %codegen, ptr %177, i32 0, i32 2
+  %178 = load ptr, ptr %builder66, align 8
+  %179 = load ptr, ptr %variable62, align 8
+  %value67 = getelementptr %Variable, ptr %179, i32 0, i32 0
+  %180 = load ptr, ptr %value67, align 8
+  %181 = load ptr, ptr %x61, align 8
+  %value68 = getelementptr %StructField, ptr %181, i32 0, i32 0
+  %182 = load ptr, ptr %value68, align 8
+  %183 = call ptr @LLVMBuildStore(ptr %178, ptr %180, ptr %182)
+  ret i64 0
+
+merge_block69:                                    ; preds = %merge_block53
+  %type70 = getelementptr %Node, ptr %lhs1, i32 0, i32 0
+  %184 = load i64, ptr %type70, align 4
+  call void (ptr, ...) @printf(ptr @221, i64 %184)
+  call void @assert(i1 false)
+  ret i64 0
+}
+
+define i64 @codegen_generate_return_statement(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %stmt = alloca ptr, align 8
+  store ptr %1, ptr %stmt, align 8
+  %2 = load ptr, ptr %stmt, align 8
+  %expression = getelementptr %NODE_RETURN_STATEMENT_DATA, ptr %2, i32 0, i32 0
+  %3 = load ptr, ptr %expression, align 8
+  %expression1 = alloca ptr, align 8
+  store ptr %3, ptr %expression1, align 8
+  %4 = load ptr, ptr %expression1, align 8
+  %5 = icmp eq ptr %4, null
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %6 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %6, i32 0, i32 2
+  %7 = load ptr, ptr %builder, align 8
+  call void @LLVMBuildRetVoid(ptr %7)
+  ret i64 0
+
+merge_block:                                      ; preds = %entrypoint
+  %8 = load ptr, ptr %c, align 8
+  %9 = load ptr, ptr %expression1, align 8
+  %10 = call ptr @codegen_generate_expression_value(ptr %8, ptr %9, ptr null)
+  %val = alloca ptr, align 8
+  store ptr %10, ptr %val, align 8
+  %11 = load ptr, ptr %val, align 8
+  %12 = icmp ne ptr %11, null
+  call void @assert(i1 %12)
+  %13 = load ptr, ptr %c, align 8
+  %14 = load ptr, ptr %c, align 8
+  %current_function_retur_type = getelementptr %codegen, ptr %14, i32 0, i32 8
+  %15 = load ptr, ptr %current_function_retur_type, align 8
+  %16 = load ptr, ptr %val, align 8
+  %node_type = getelementptr %Variable, ptr %16, i32 0, i32 3
+  %17 = load ptr, ptr %node_type, align 8
+  %18 = call i1 @compare_types(ptr %13, ptr %15, ptr %17, i1 false)
+  call void @assert(i1 %18)
+  %19 = load ptr, ptr %c, align 8
+  %builder2 = getelementptr %codegen, ptr %19, i32 0, i32 2
+  %20 = load ptr, ptr %builder2, align 8
+  %21 = load ptr, ptr %val, align 8
+  %value = getelementptr %Variable, ptr %21, i32 0, i32 0
+  %22 = load ptr, ptr %value, align 8
+  call void @LLVMBuildRet(ptr %20, ptr %22)
+  ret i64 0
+}
+
+define ptr @get_function_return_type(ptr %0, ptr %1) {
+entrypoint:
+  %ic = alloca ptr, align 8
+  store ptr %0, ptr %ic, align 8
+  %fun = alloca ptr, align 8
+  store ptr %1, ptr %fun, align 8
+  %2 = load ptr, ptr %fun, align 8
+  %type = getelementptr %Node, ptr %2, i32 0, i32 0
+  %3 = load i64, ptr %type, align 4
+  %4 = load i64, ptr @NODE_FUNCTION_DEFINITION, align 4
+  %5 = icmp eq i64 %3, %4
+  br i1 %5, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %6 = load ptr, ptr %fun, align 8
+  %data = getelementptr %Node, ptr %6, i32 0, i32 1
+  %7 = load ptr, ptr %data, align 8
+  %d = alloca ptr, align 8
+  store ptr %7, ptr %d, align 8
+  %8 = load ptr, ptr %d, align 8
+  %retur_type = getelementptr %NODE_FUNCTION_DEFINITION_DATA, ptr %8, i32 0, i32 4
+  %9 = load ptr, ptr %retur_type, align 8
+  ret ptr %9
+
+merge_block:                                      ; preds = %entrypoint
+  %10 = load ptr, ptr %fun, align 8
+  %type1 = getelementptr %Node, ptr %10, i32 0, i32 0
+  %11 = load i64, ptr %type1, align 4
+  %12 = load i64, ptr @NODE_PRIMARY_EXPRESSION_IDENTIFIER, align 4
+  %13 = icmp eq i64 %11, %12
+  br i1 %13, label %then_block2, label %merge_block9
+
+then_block2:                                      ; preds = %merge_block
+  %14 = load ptr, ptr %fun, align 8
+  %data3 = getelementptr %Node, ptr %14, i32 0, i32 1
+  %15 = load ptr, ptr %data3, align 8
+  %d4 = alloca ptr, align 8
+  store ptr %15, ptr %d4, align 8
+  %16 = load ptr, ptr %ic, align 8
+  %environment = getelementptr %codegen, ptr %16, i32 0, i32 4
+  %17 = load ptr, ptr %environment, align 8
+  %18 = load ptr, ptr %d4, align 8
+  %name = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %18, i32 0, i32 0
+  %19 = load ptr, ptr %name, align 8
+  %20 = call ptr @environment_get_variable(ptr %17, ptr %19)
+  %f = alloca ptr, align 8
+  store ptr %20, ptr %f, align 8
+  %21 = load ptr, ptr %f, align 8
+  %22 = icmp eq ptr %21, null
+  br i1 %22, label %then_block5, label %merge_block7
+
+then_block5:                                      ; preds = %then_block2
+  %23 = load ptr, ptr %d4, align 8
+  %name6 = getelementptr %NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, ptr %23, i32 0, i32 0
+  %24 = load ptr, ptr %name6, align 8
+  call void (ptr, ...) @printf(ptr @222, ptr %24)
+  call void @assert(i1 false)
+  br label %merge_block7
+
+merge_block7:                                     ; preds = %then_block2, %then_block5
+  %25 = load ptr, ptr %f, align 8
+  %node_type = getelementptr %Variable, ptr %25, i32 0, i32 3
+  %26 = load ptr, ptr %node_type, align 8
+  %f_type = alloca ptr, align 8
+  store ptr %26, ptr %f_type, align 8
+  %27 = load ptr, ptr %f_type, align 8
+  %type8 = getelementptr %Node, ptr %27, i32 0, i32 0
+  %28 = load i64, ptr %type8, align 4
+  %29 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %30 = icmp eq i64 %28, %29
+  call void @assert(i1 %30)
+  %31 = load ptr, ptr %ic, align 8
+  %32 = load ptr, ptr %f_type, align 8
+  %33 = call ptr @get_function_return_type(ptr %31, ptr %32)
+  ret ptr %33
+
+merge_block9:                                     ; preds = %merge_block
+  %34 = load ptr, ptr %fun, align 8
+  %type10 = getelementptr %Node, ptr %34, i32 0, i32 0
+  %35 = load i64, ptr %type10, align 4
+  %36 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4
+  %37 = icmp eq i64 %35, %36
+  br i1 %37, label %then_block11, label %merge_block15
+
+then_block11:                                     ; preds = %merge_block9
+  %38 = load ptr, ptr %fun, align 8
+  %data12 = getelementptr %Node, ptr %38, i32 0, i32 1
+  %39 = load ptr, ptr %data12, align 8
+  %d13 = alloca ptr, align 8
+  store ptr %39, ptr %d13, align 8
+  %40 = load ptr, ptr %d13, align 8
+  %retur_type14 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %40, i32 0, i32 2
+  %41 = load ptr, ptr %retur_type14, align 8
+  ret ptr %41
+
+merge_block15:                                    ; preds = %merge_block9
+  call void @assert(i1 false)
+  ret ptr null
+}
+
+define i64 @codegen_generate_break_statement(ptr %0) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %1 = load ptr, ptr %c, align 8
+  %whil_loop_exit = getelementptr %codegen, ptr %1, i32 0, i32 5
+  %2 = load ptr, ptr %whil_loop_exit, align 8
+  %3 = icmp ne ptr %2, null
+  call void @assert(i1 %3)
+  %4 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %4, i32 0, i32 2
+  %5 = load ptr, ptr %builder, align 8
+  %6 = load ptr, ptr %c, align 8
+  %whil_loop_exit1 = getelementptr %codegen, ptr %6, i32 0, i32 5
+  %7 = load ptr, ptr %whil_loop_exit1, align 8
+  %8 = call ptr @LLVMBuildBr(ptr %5, ptr %7)
+  ret i64 0
+}
+
+define i64 @codegen_generate_continue_statement(ptr %0) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %1 = load ptr, ptr %c, align 8
+  %whil_block = getelementptr %codegen, ptr %1, i32 0, i32 6
+  %2 = load ptr, ptr %whil_block, align 8
+  %3 = icmp ne ptr %2, null
+  call void @assert(i1 %3)
+  %4 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %4, i32 0, i32 2
+  %5 = load ptr, ptr %builder, align 8
+  %6 = load ptr, ptr %c, align 8
+  %whil_block1 = getelementptr %codegen, ptr %6, i32 0, i32 6
+  %7 = load ptr, ptr %whil_block1, align 8
+  %8 = call ptr @LLVMBuildBr(ptr %5, ptr %7)
+  ret i64 0
+}
+
+define ptr @codegen_generate_if_statement(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %statement = alloca ptr, align 8
+  store ptr %1, ptr %statement, align 8
+  %2 = load ptr, ptr %c, align 8
+  %3 = load ptr, ptr %statement, align 8
+  %condition = getelementptr %NODE_IF_STATEMENT_DATA, ptr %3, i32 0, i32 0
+  %4 = load ptr, ptr %condition, align 8
+  %5 = call ptr @codegen_generate_expression_value(ptr %2, ptr %4, ptr null)
+  %condition_value = alloca ptr, align 8
+  store ptr %5, ptr %condition_value, align 8
+  %6 = load ptr, ptr %condition_value, align 8
+  %7 = icmp ne ptr %6, null
+  call void @assert(i1 %7)
+  %8 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %8, i32 0, i32 2
+  %9 = load ptr, ptr %builder, align 8
+  %10 = call ptr @LLVMGetInsertBlock(ptr %9)
+  %current_block = alloca ptr, align 8
+  store ptr %10, ptr %current_block, align 8
+  %11 = load ptr, ptr %c, align 8
+  %current_function = getelementptr %codegen, ptr %11, i32 0, i32 7
+  %12 = load ptr, ptr %current_function, align 8
+  %13 = call ptr @LLVMAppendBasicBlock(ptr %12, ptr @226)
+  %then_block = alloca ptr, align 8
+  store ptr %13, ptr %then_block, align 8
+  %14 = load ptr, ptr %c, align 8
+  %builder1 = getelementptr %codegen, ptr %14, i32 0, i32 2
+  %15 = load ptr, ptr %builder1, align 8
+  %16 = load ptr, ptr %then_block, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %15, ptr %16)
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %inner_block, %entrypoint
+  %17 = load i64, ptr %i, align 4
+  %18 = load ptr, ptr %statement, align 8
+  %statements_len = getelementptr %NODE_IF_STATEMENT_DATA, ptr %18, i32 0, i32 2
+  %19 = load i64, ptr %statements_len, align 4
+  %20 = icmp slt i64 %17, %19
+  br i1 %20, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %21 = load ptr, ptr %statement, align 8
+  %statements = getelementptr %NODE_IF_STATEMENT_DATA, ptr %21, i32 0, i32 1
+  %22 = load ptr, ptr %statements, align 8
+  %23 = load i64, ptr %i, align 4
+  %24 = getelementptr ptr, ptr %22, i64 %23
+  %25 = load ptr, ptr %24, align 8
+  %stmt = alloca ptr, align 8
+  store ptr %25, ptr %stmt, align 8
+  %26 = load ptr, ptr %c, align 8
+  %27 = load ptr, ptr %stmt, align 8
+  %28 = call i64 @codegen_generate_statement(ptr %26, ptr %27)
+  %res = alloca i64, align 8
+  store i64 %28, ptr %res, align 4
+  %29 = load i64, ptr %res, align 4
+  %30 = icmp eq i64 %29, 0
+  call void @assert(i1 %30)
+  %31 = load i64, ptr %i, align 4
+  %32 = add i64 %31, 1
+  store i64 %32, ptr %i, align 4
+  br label %while_block
+
+outer_block:                                      ; preds = %while_block
+  %33 = load ptr, ptr %c, align 8
+  %current_function2 = getelementptr %codegen, ptr %33, i32 0, i32 7
+  %34 = load ptr, ptr %current_function2, align 8
+  %35 = call ptr @LLVMAppendBasicBlock(ptr %34, ptr @227)
+  %merge_block = alloca ptr, align 8
+  store ptr %35, ptr %merge_block, align 8
+  %36 = load ptr, ptr %c, align 8
+  %builder3 = getelementptr %codegen, ptr %36, i32 0, i32 2
+  %37 = load ptr, ptr %builder3, align 8
+  %38 = call ptr @LLVMGetInsertBlock(ptr %37)
+  %39 = call ptr @LLVMGetLastInstruction(ptr %38)
+  %last_instr = alloca ptr, align 8
+  store ptr %39, ptr %last_instr, align 8
+  %40 = load ptr, ptr %last_instr, align 8
+  %41 = icmp eq ptr %40, null
+  br i1 %41, label %then_block4, label %merge_block6
+
+then_block4:                                      ; preds = %outer_block
+  %42 = load ptr, ptr %c, align 8
+  %builder5 = getelementptr %codegen, ptr %42, i32 0, i32 2
+  %43 = load ptr, ptr %builder5, align 8
+  %44 = load ptr, ptr %merge_block, align 8
+  %45 = call ptr @LLVMBuildBr(ptr %43, ptr %44)
+  br label %merge_block6
+
+merge_block6:                                     ; preds = %outer_block, %then_block4
+  %46 = load ptr, ptr %last_instr, align 8
+  %47 = icmp ne ptr %46, null
+  br i1 %47, label %then_block7, label %merge_block11
+
+then_block7:                                      ; preds = %merge_block6
+  %48 = load ptr, ptr %last_instr, align 8
+  %49 = call ptr @LLVMIsATerminatorInst(ptr %48)
+  %50 = icmp eq ptr %49, null
+  br i1 %50, label %then_block8, label %merge_block10
+
+then_block8:                                      ; preds = %then_block7
+  %51 = load ptr, ptr %c, align 8
+  %builder9 = getelementptr %codegen, ptr %51, i32 0, i32 2
+  %52 = load ptr, ptr %builder9, align 8
+  %53 = load ptr, ptr %merge_block, align 8
+  %54 = call ptr @LLVMBuildBr(ptr %52, ptr %53)
+  br label %merge_block10
+
+merge_block10:                                    ; preds = %then_block7, %then_block8
+  br label %merge_block11
+
+merge_block11:                                    ; preds = %merge_block6, %merge_block10
+  %55 = load ptr, ptr %c, align 8
+  %builder12 = getelementptr %codegen, ptr %55, i32 0, i32 2
+  %56 = load ptr, ptr %builder12, align 8
+  %57 = load ptr, ptr %current_block, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %56, ptr %57)
+  %58 = load ptr, ptr %c, align 8
+  %builder13 = getelementptr %codegen, ptr %58, i32 0, i32 2
+  %59 = load ptr, ptr %builder13, align 8
+  %60 = load ptr, ptr %condition_value, align 8
+  %value = getelementptr %Variable, ptr %60, i32 0, i32 0
+  %61 = load ptr, ptr %value, align 8
+  %62 = load ptr, ptr %then_block, align 8
+  %63 = load ptr, ptr %merge_block, align 8
+  %64 = call ptr @LLVMBuildCondBr(ptr %59, ptr %61, ptr %62, ptr %63)
+  %65 = load ptr, ptr %c, align 8
+  %builder14 = getelementptr %codegen, ptr %65, i32 0, i32 2
+  %66 = load ptr, ptr %builder14, align 8
+  %67 = load ptr, ptr %merge_block, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %66, ptr %67)
+  ret ptr null
+}
+
+define ptr @codegen_generate_while_statement(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %statement = alloca ptr, align 8
+  store ptr %1, ptr %statement, align 8
+  %2 = load ptr, ptr %c, align 8
+  %current_function = getelementptr %codegen, ptr %2, i32 0, i32 7
+  %3 = load ptr, ptr %current_function, align 8
+  %4 = call ptr @LLVMAppendBasicBlock(ptr %3, ptr @228)
+  %whil_block = alloca ptr, align 8
+  store ptr %4, ptr %whil_block, align 8
+  %5 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %5, i32 0, i32 2
+  %6 = load ptr, ptr %builder, align 8
+  %7 = load ptr, ptr %whil_block, align 8
+  %8 = call ptr @LLVMBuildBr(ptr %6, ptr %7)
+  %9 = load ptr, ptr %c, align 8
+  %builder1 = getelementptr %codegen, ptr %9, i32 0, i32 2
+  %10 = load ptr, ptr %builder1, align 8
+  %11 = load ptr, ptr %whil_block, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %10, ptr %11)
+  %12 = load ptr, ptr %c, align 8
+  %13 = load ptr, ptr %statement, align 8
+  %condition = getelementptr %NODE_WHILE_STATEMENT_DATA, ptr %13, i32 0, i32 0
+  %14 = load ptr, ptr %condition, align 8
+  %15 = call ptr @codegen_generate_expression_value(ptr %12, ptr %14, ptr null)
+  %condition_value = alloca ptr, align 8
+  store ptr %15, ptr %condition_value, align 8
+  %16 = load ptr, ptr %condition_value, align 8
+  %17 = icmp ne ptr %16, null
+  call void @assert(i1 %17)
+  %18 = load ptr, ptr %c, align 8
+  %current_function2 = getelementptr %codegen, ptr %18, i32 0, i32 7
+  %19 = load ptr, ptr %current_function2, align 8
+  %20 = call ptr @LLVMAppendBasicBlock(ptr %19, ptr @229)
+  %inner_block = alloca ptr, align 8
+  store ptr %20, ptr %inner_block, align 8
+  %21 = load ptr, ptr %c, align 8
+  %current_function3 = getelementptr %codegen, ptr %21, i32 0, i32 7
+  %22 = load ptr, ptr %current_function3, align 8
+  %23 = call ptr @LLVMAppendBasicBlock(ptr %22, ptr @230)
+  %outer_block = alloca ptr, align 8
+  store ptr %23, ptr %outer_block, align 8
+  %24 = load ptr, ptr %c, align 8
+  %builder4 = getelementptr %codegen, ptr %24, i32 0, i32 2
+  %25 = load ptr, ptr %builder4, align 8
+  %26 = load ptr, ptr %condition_value, align 8
+  %value = getelementptr %Variable, ptr %26, i32 0, i32 0
+  %27 = load ptr, ptr %value, align 8
+  %28 = load ptr, ptr %inner_block, align 8
+  %29 = load ptr, ptr %outer_block, align 8
+  %30 = call ptr @LLVMBuildCondBr(ptr %25, ptr %27, ptr %28, ptr %29)
+  %31 = load ptr, ptr %c, align 8
+  %whil_loop_exit = getelementptr %codegen, ptr %31, i32 0, i32 5
+  %32 = load ptr, ptr %outer_block, align 8
+  store ptr %32, ptr %whil_loop_exit, align 8
+  %33 = load ptr, ptr %c, align 8
+  %whil_block5 = getelementptr %codegen, ptr %33, i32 0, i32 6
+  %34 = load ptr, ptr %whil_block, align 8
+  store ptr %34, ptr %whil_block5, align 8
+  %35 = load ptr, ptr %c, align 8
+  %builder6 = getelementptr %codegen, ptr %35, i32 0, i32 2
+  %36 = load ptr, ptr %builder6, align 8
+  %37 = load ptr, ptr %inner_block, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %36, ptr %37)
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %inner_block7, %entrypoint
+  %38 = load i64, ptr %i, align 4
+  %39 = load ptr, ptr %statement, align 8
+  %statements_len = getelementptr %NODE_WHILE_STATEMENT_DATA, ptr %39, i32 0, i32 2
+  %40 = load i64, ptr %statements_len, align 4
+  %41 = icmp slt i64 %38, %40
+  br i1 %41, label %inner_block7, label %outer_block8
+
+inner_block7:                                     ; preds = %while_block
+  %42 = load ptr, ptr %statement, align 8
+  %statements = getelementptr %NODE_WHILE_STATEMENT_DATA, ptr %42, i32 0, i32 1
+  %43 = load ptr, ptr %statements, align 8
+  %44 = load i64, ptr %i, align 4
+  %45 = getelementptr ptr, ptr %43, i64 %44
+  %46 = load ptr, ptr %45, align 8
+  %stmt = alloca ptr, align 8
+  store ptr %46, ptr %stmt, align 8
+  %47 = load ptr, ptr %c, align 8
+  %48 = load ptr, ptr %stmt, align 8
+  %49 = call i64 @codegen_generate_statement(ptr %47, ptr %48)
+  %res = alloca i64, align 8
+  store i64 %49, ptr %res, align 4
+  %50 = load i64, ptr %res, align 4
+  %51 = icmp eq i64 %50, 0
+  call void @assert(i1 %51)
+  %52 = load i64, ptr %i, align 4
+  %53 = add i64 %52, 1
+  store i64 %53, ptr %i, align 4
+  br label %while_block
+
+outer_block8:                                     ; preds = %while_block
+  %54 = load ptr, ptr %c, align 8
+  %builder9 = getelementptr %codegen, ptr %54, i32 0, i32 2
+  %55 = load ptr, ptr %builder9, align 8
+  %56 = load ptr, ptr %whil_block, align 8
+  %57 = call ptr @LLVMBuildBr(ptr %55, ptr %56)
+  %58 = load ptr, ptr %c, align 8
+  %builder10 = getelementptr %codegen, ptr %58, i32 0, i32 2
+  %59 = load ptr, ptr %builder10, align 8
+  %60 = load ptr, ptr %outer_block, align 8
+  call void @LLVMPositionBuilderAtEnd(ptr %59, ptr %60)
+  %61 = load ptr, ptr %c, align 8
+  %whil_loop_exit11 = getelementptr %codegen, ptr %61, i32 0, i32 5
+  store ptr null, ptr %whil_loop_exit11, align 8
+  %62 = load ptr, ptr %c, align 8
+  %whil_block12 = getelementptr %codegen, ptr %62, i32 0, i32 6
+  store ptr null, ptr %whil_block12, align 8
+  ret ptr null
+}
+
+define i64 @codegen_generate(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %ast = alloca ptr, align 8
+  store ptr %1, ptr %ast, align 8
+  %2 = load ptr, ptr %ast, align 8
+  %type = getelementptr %Node, ptr %2, i32 0, i32 0
+  %3 = load i64, ptr %type, align 4
+  %4 = load i64, ptr @NODE_PROGRAM, align 4
+  %5 = icmp eq i64 %3, %4
+  call void @assert(i1 %5)
+  %6 = load ptr, ptr %ast, align 8
+  %data = getelementptr %Node, ptr %6, i32 0, i32 1
+  %7 = load ptr, ptr %data, align 8
+  %8 = load %NODE_PROGRAM_DATA, ptr %7, align 8
+  %program = alloca %NODE_PROGRAM_DATA, align 8
+  store %NODE_PROGRAM_DATA %8, ptr %program, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block, %entrypoint
+  %9 = load i64, ptr %i, align 4
+  %statements_len = getelementptr %NODE_PROGRAM_DATA, ptr %program, i32 0, i32 1
+  %10 = load i64, ptr %statements_len, align 4
+  %11 = icmp slt i64 %9, %10
+  br i1 %11, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %statements = getelementptr %NODE_PROGRAM_DATA, ptr %program, i32 0, i32 0
+  %12 = load ptr, ptr %statements, align 8
+  %13 = load i64, ptr %i, align 4
+  %14 = getelementptr ptr, ptr %12, i64 %13
+  %15 = load ptr, ptr %14, align 8
+  %stmt = alloca ptr, align 8
+  store ptr %15, ptr %stmt, align 8
+  %16 = load ptr, ptr %c, align 8
+  %17 = load ptr, ptr %stmt, align 8
+  %18 = call i64 @codegen_generate_statement(ptr %16, ptr %17)
+  %res = alloca i64, align 8
+  store i64 %18, ptr %res, align 4
+  %19 = load i64, ptr %res, align 4
+  %20 = icmp ne i64 %19, 0
+  br i1 %20, label %then_block, label %merge_block
+
+outer_block:                                      ; preds = %while_block
+  ret i64 0
+
+then_block:                                       ; preds = %inner_block
+  ret i64 1
+
+merge_block:                                      ; preds = %inner_block
+  %21 = load i64, ptr %i, align 4
+  %22 = add i64 %21, 1
+  store i64 %22, ptr %i, align 4
+  br label %while_block
+}
+
+define i64 @codegen_generate_import_declaration(ptr %0, ptr %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %statement = alloca ptr, align 8
+  store ptr %1, ptr %statement, align 8
+  %2 = load ptr, ptr %c, align 8
+  %3 = load ptr, ptr %statement, align 8
+  %program = getelementptr %NODE_IMPORT_DECLARATION_DATA, ptr %3, i32 0, i32 1
+  %4 = load ptr, ptr %program, align 8
+  %5 = call i64 @codegen_generate(ptr %2, ptr %4)
+  ret i64 %5
+}
+
+define i64 @codegen_compile(ptr %0, i1 %1) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %dump_ir = alloca i1, align 1
+  store i1 %1, ptr %dump_ir, align 1
+  %2 = load ptr, ptr %c, align 8
+  %llvm_module = getelementptr %codegen, ptr %2, i32 0, i32 0
+  %3 = load ptr, ptr %llvm_module, align 8
+  call void @LLVMDumpModule(ptr %3)
+  %message = alloca ptr, align 8
+  store ptr null, ptr %message, align 8
+  %4 = load i1, ptr %dump_ir, align 1
+  br i1 %4, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  %5 = load ptr, ptr %c, align 8
+  %llvm_module1 = getelementptr %codegen, ptr %5, i32 0, i32 0
+  %6 = load ptr, ptr %llvm_module1, align 8
+  %7 = load ptr, ptr %message, align 8
+  %8 = call i64 @LLVMPrintModuleToFile(ptr %6, ptr @232, ptr %7)
+  ret i64 0
+
+merge_block:                                      ; preds = %entrypoint
+  %9 = call ptr @LLVMGetDefaultTargetTriple()
+  %triple = alloca ptr, align 8
+  store ptr %9, ptr %triple, align 8
+  %10 = load ptr, ptr %c, align 8
+  %arena = getelementptr %codegen, ptr %10, i32 0, i32 3
+  %11 = load ptr, ptr %arena, align 8
+  %12 = call ptr @arena_alloc(ptr %11, i64 8)
+  %target_ref = alloca ptr, align 8
+  store ptr %12, ptr %target_ref, align 8
+  %13 = load ptr, ptr %triple, align 8
+  %14 = load ptr, ptr %target_ref, align 8
+  %15 = load ptr, ptr %message, align 8
+  %16 = call i64 @LLVMGetTargetFromTriple(ptr %13, ptr %14, ptr %15)
+  %result = alloca i64, align 8
+  store i64 %16, ptr %result, align 4
+  %17 = load i64, ptr %result, align 4
+  %18 = icmp ne i64 %17, 0
+  br i1 %18, label %then_block2, label %merge_block3
+
+then_block2:                                      ; preds = %merge_block
+  %19 = load ptr, ptr %message, align 8
+  %20 = load ptr, ptr %19, align 8
+  call void (ptr, ...) @printf(ptr @233, ptr %20)
+  %21 = load ptr, ptr %message, align 8
+  %22 = load ptr, ptr %21, align 8
+  call void @LLVMDisposeMessage(ptr %22)
+  br label %merge_block3
+
+merge_block3:                                     ; preds = %merge_block, %then_block2
+  %23 = load ptr, ptr %target_ref, align 8
+  %24 = load ptr, ptr %23, align 8
+  %25 = load ptr, ptr %triple, align 8
+  %26 = load i64, ptr @LLVMCodeGenLevelDefault, align 4
+  %27 = load i64, ptr @LLVMRelocDefault, align 4
+  %28 = load i64, ptr @LLVMCodeModelDefault, align 4
+  %29 = call ptr @LLVMCreateTargetMachine(ptr %24, ptr %25, ptr @234, ptr @235, i64 %26, i64 %27, i64 %28)
+  %target_machine = alloca ptr, align 8
+  store ptr %29, ptr %target_machine, align 8
+  %30 = load ptr, ptr %triple, align 8
+  call void @LLVMDisposeMessage(ptr %30)
+  %31 = load ptr, ptr %c, align 8
+  %llvm_module4 = getelementptr %codegen, ptr %31, i32 0, i32 0
+  %32 = load ptr, ptr %llvm_module4, align 8
+  %33 = load i64, ptr @LLVMAbortProcessAction, align 4
+  %34 = load ptr, ptr %message, align 8
+  %35 = call i64 @LLVMVerifyModule(ptr %32, i64 %33, ptr %34)
+  store i64 %35, ptr %result, align 4
+  %36 = load i64, ptr %result, align 4
+  %37 = icmp ne i64 %36, 0
+  br i1 %37, label %then_block5, label %merge_block6
+
+then_block5:                                      ; preds = %merge_block3
+  %38 = load ptr, ptr %message, align 8
+  %39 = load ptr, ptr %38, align 8
+  call void (ptr, ...) @printf(ptr @236, ptr %39)
+  %40 = load ptr, ptr %message, align 8
+  %41 = load ptr, ptr %40, align 8
+  call void @LLVMDisposeMessage(ptr %41)
+  br label %merge_block6
+
+merge_block6:                                     ; preds = %merge_block3, %then_block5
+  %filename = alloca ptr, align 8
+  store ptr @237, ptr %filename, align 8
+  %42 = load ptr, ptr %target_machine, align 8
+  %43 = load ptr, ptr %c, align 8
+  %llvm_module7 = getelementptr %codegen, ptr %43, i32 0, i32 0
+  %44 = load ptr, ptr %llvm_module7, align 8
+  %45 = load ptr, ptr %filename, align 8
+  %46 = load i64, ptr @LLVMObjectFile, align 4
+  %47 = call i64 @LLVMTargetMachineEmitToFile(ptr %42, ptr %44, ptr %45, i64 %46, ptr null)
+  %48 = load ptr, ptr %target_machine, align 8
+  call void @LLVMDisposeTargetMachine(ptr %48)
+  %49 = load ptr, ptr %filename, align 8
+  call void (ptr, ...) @printf(ptr @238, ptr %49)
+  ret i64 0
+}
+
+define void @codegen_deinit(ptr %0) {
+entrypoint:
+  %c = alloca ptr, align 8
+  store ptr %0, ptr %c, align 8
+  %1 = load ptr, ptr %c, align 8
+  %llvm_module = getelementptr %codegen, ptr %1, i32 0, i32 0
+  %2 = load ptr, ptr %llvm_module, align 8
+  call void @LLVMDisposeModule(ptr %2)
+  call void @LLVMShutdown()
+  %3 = load ptr, ptr %c, align 8
+  %builder = getelementptr %codegen, ptr %3, i32 0, i32 2
+  %4 = load ptr, ptr %builder, align 8
+  call void @LLVMDisposeBuilder(ptr %4)
+  ret void
+}
+
+define %slice @read_file(ptr %0, ptr %1) {
+entrypoint:
+  %filename = alloca ptr, align 8
+  store ptr %0, ptr %filename, align 8
+  %alloc = alloca ptr, align 8
+  store ptr %1, ptr %alloc, align 8
+  %2 = load ptr, ptr %filename, align 8
+  %3 = call ptr @fopen(ptr %2, ptr @239)
+  %file = alloca ptr, align 8
+  store ptr %3, ptr %file, align 8
+  %4 = load ptr, ptr %file, align 8
+  %5 = call i64 @fseek(ptr %4, i64 0, i64 2)
+  %6 = load ptr, ptr %file, align 8
+  %7 = call i64 @ftell(ptr %6)
+  %file_size = alloca i64, align 8
+  store i64 %7, ptr %file_size, align 4
+  %8 = load ptr, ptr %file, align 8
+  %9 = call i64 @fseek(ptr %8, i64 0, i64 0)
+  %10 = load ptr, ptr %alloc, align 8
+  %11 = load i64, ptr %file_size, align 4
+  %12 = add i64 %11, 1
+  %13 = call ptr @arena_alloc(ptr %10, i64 %12)
+  %buf = alloca ptr, align 8
+  store ptr %13, ptr %buf, align 8
+  %14 = load ptr, ptr %buf, align 8
+  %15 = load i64, ptr %file_size, align 4
+  %16 = load ptr, ptr %file, align 8
+  %17 = call i64 @fread(ptr %14, i64 1, i64 %15, ptr %16)
+  %bytes_read = alloca i64, align 8
+  store i64 %17, ptr %bytes_read, align 4
+  %18 = load ptr, ptr %buf, align 8
+  %19 = load i64, ptr %bytes_read, align 4
+  %20 = getelementptr i8, ptr %18, i64 %19
+  store i8 0, ptr %20, align 1
+  %21 = load ptr, ptr %file, align 8
+  %22 = call ptr @fclose(ptr %21)
+  %sl = alloca %slice, align 8
+  %data = getelementptr %slice, ptr %sl, i32 0, i32 0
+  %23 = load ptr, ptr %buf, align 8
+  store ptr %23, ptr %data, align 8
+  %data_len = getelementptr %slice, ptr %sl, i32 0, i32 1
+  %24 = load i64, ptr %file_size, align 4
+  store i64 %24, ptr %data_len, align 4
+  %25 = load %slice, ptr %sl, align 8
+  ret %slice %25
+}
+
+define i64 @main(i64 %0, ptr %1) {
+entrypoint:
+  %argc = alloca i64, align 8
+  store i64 %0, ptr %argc, align 4
+  %argv = alloca ptr, align 8
+  store ptr %1, ptr %argv, align 8
+  %2 = load i64, ptr %argc, align 4
+  %3 = icmp slt i64 %2, 2
+  br i1 %3, label %then_block, label %merge_block
+
+then_block:                                       ; preds = %entrypoint
+  call void (ptr, ...) @printf(ptr @240)
+  ret i64 1
+
+merge_block:                                      ; preds = %entrypoint
+  %generate_ir = alloca i1, align 1
+  store i1 false, ptr %generate_ir, align 1
+  %filename = alloca ptr, align 8
+  store ptr null, ptr %filename, align 8
+  %i = alloca i64, align 8
+  store i64 0, ptr %i, align 4
+  br label %while_block
+
+while_block:                                      ; preds = %merge_block4, %then_block3, %then_block1, %merge_block
+  %4 = load i64, ptr %i, align 4
+  %5 = load i64, ptr %argc, align 4
+  %6 = sub i64 %5, 1
+  %7 = icmp slt i64 %4, %6
+  br i1 %7, label %inner_block, label %outer_block
+
+inner_block:                                      ; preds = %while_block
+  %8 = load i64, ptr %i, align 4
+  %9 = add i64 %8, 1
+  store i64 %9, ptr %i, align 4
+  %10 = load ptr, ptr %argv, align 8
+  %11 = load i64, ptr %i, align 4
+  %12 = getelementptr ptr, ptr %10, i64 %11
+  %13 = load ptr, ptr %12, align 8
+  %arg = alloca ptr, align 8
+  store ptr %13, ptr %arg, align 8
+  %14 = load ptr, ptr %arg, align 8
+  %15 = call i1 @strcmp(ptr %14, ptr @241)
+  br i1 %15, label %then_block1, label %merge_block2
+
+outer_block:                                      ; preds = %while_block
+  %16 = load ptr, ptr %filename, align 8
+  call void (ptr, ...) @printf(ptr @242, ptr %16)
+  %17 = call ptr @arena_init(i64 1073741824)
+  %alloc = alloca ptr, align 8
+  store ptr %17, ptr %alloc, align 8
+  %18 = load ptr, ptr %filename, align 8
+  %19 = load ptr, ptr %alloc, align 8
+  %20 = call %slice @read_file(ptr %18, ptr %19)
+  %file = alloca %slice, align 8
+  store %slice %20, ptr %file, align 8
+  %21 = load ptr, ptr %alloc, align 8
+  %22 = load %slice, ptr %file, align 8
+  %23 = call ptr @tokenizer_init(ptr %21, %slice %22)
+  %t = alloca ptr, align 8
+  store ptr %23, ptr %t, align 8
+  %24 = load ptr, ptr %t, align 8
+  %25 = call %slice @tokenizer_tokenize(ptr %24)
+  %ts = alloca %slice, align 8
+  store %slice %25, ptr %ts, align 8
+  %data = getelementptr %slice, ptr %ts, i32 0, i32 0
+  %26 = load ptr, ptr %data, align 8
+  %data_len = getelementptr %slice, ptr %ts, i32 0, i32 1
+  %27 = load i64, ptr %data_len, align 4
+  %28 = load ptr, ptr %alloc, align 8
+  %29 = load ptr, ptr %filename, align 8
+  %30 = call ptr @parser_init(ptr %26, i64 %27, ptr %28, ptr %29)
+  %p = alloca ptr, align 8
+  store ptr %30, ptr %p, align 8
+  %31 = load ptr, ptr %p, align 8
+  %32 = call ptr @parse(ptr %31)
+  %ast = alloca ptr, align 8
+  store ptr %32, ptr %ast, align 8
+  %33 = load ptr, ptr %alloc, align 8
+  %34 = call ptr @codegen_init(ptr %33)
+  %c = alloca ptr, align 8
+  store ptr %34, ptr %c, align 8
+  %35 = load ptr, ptr %c, align 8
+  %36 = load ptr, ptr %ast, align 8
+  %37 = call i64 @codegen_generate(ptr %35, ptr %36)
+  %res = alloca i64, align 8
+  store i64 %37, ptr %res, align 4
+  %38 = load ptr, ptr %c, align 8
+  %39 = load i1, ptr %generate_ir, align 1
+  %40 = call i64 @codegen_compile(ptr %38, i1 %39)
+  %res5 = alloca i64, align 8
+  store i64 %40, ptr %res5, align 4
+  %41 = load ptr, ptr %c, align 8
+  call void @codegen_deinit(ptr %41)
+  %42 = load ptr, ptr %alloc, align 8
+  call void @arena_free(ptr %42)
+  ret i64 0
+
+then_block1:                                      ; preds = %inner_block
+  store i1 true, ptr %generate_ir, align 1
+  br label %while_block
+
+merge_block2:                                     ; preds = %inner_block
+  %43 = load ptr, ptr %filename, align 8
+  %44 = icmp eq ptr %43, null
+  br i1 %44, label %then_block3, label %merge_block4
+
+then_block3:                                      ; preds = %merge_block2
+  %45 = load ptr, ptr %arg, align 8
+  store ptr %45, ptr %filename, align 8
+  br label %while_block
+
+merge_block4:                                     ; preds = %merge_block2
+  call void @assert(i1 false)
+  br label %while_block
+}