; LLVM IR from ponylang/ponyc :: src/libponyc/pass (expr)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.pass_opt_t = type { i32, i32, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i32, i64, i8, i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, %struct.typecheck_t, ptr, ptr }
%struct.typecheck_t = type { ptr, %struct.typecheck_stats_t, ptr }
%struct.typecheck_stats_t = type { i64, i64, i64, i64 }

@.str.1 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [44 x i8], align 1
@__func__.pass_expr = external hidden unnamed_addr constant [10 x i8], align 1

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

declare ptr @ast_parent(ptr noundef) #1

declare i32 @ast_id(ptr noundef) #1

declare void @ponyint_assert_fail(ptr noundef, ptr noundef, i64 noundef, ptr noundef) #1

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

declare ptr @ast_type(ptr noundef) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @pass_expr(ptr noundef %0, ptr noundef %1) #2 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i8, align 1
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #3
  %11 = load ptr, ptr %4, align 8, !tbaa !5
  %12 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %12, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %7) #3
  store i8 1, ptr %7, align 1, !tbaa !9
  %13 = load ptr, ptr %6, align 8, !tbaa !5
  %14 = call i32 @ast_id(ptr noundef %13)
  switch i32 %14, label %256 [
    i32 74, label %15
    i32 75, label %15
    i32 76, label %15
    i32 77, label %15
    i32 73, label %15
    i32 72, label %15
    i32 151, label %20
    i32 140, label %25
    i32 141, label %25
    i32 86, label %25
    i32 165, label %30
    i32 88, label %35
    i32 90, label %35
    i32 89, label %35
    i32 175, label %40
    i32 84, label %45
    i32 85, label %45
    i32 104, label %50
    i32 103, label %55
    i32 82, label %60
    i32 83, label %60
    i32 24, label %65
    i32 106, label %70
    i32 107, label %75
    i32 19, label %80
    i32 20, label %85
    i32 21, label %90
    i32 176, label %95
    i32 177, label %100
    i32 109, label %105
    i32 108, label %105
    i32 111, label %110
    i32 116, label %115
    i32 118, label %120
    i32 125, label %125
    i32 124, label %125
    i32 206, label %130
    i32 122, label %135
    i32 180, label %140
    i32 181, label %145
    i32 182, label %150
    i32 178, label %155
    i32 179, label %160
    i32 199, label %165
    i32 186, label %170
    i32 196, label %175
    i32 197, label %175
    i32 198, label %180
    i32 102, label %185
    i32 3, label %190
    i32 4, label %190
    i32 69, label %195
    i32 135, label %200
    i32 134, label %205
    i32 133, label %210
    i32 81, label %215
    i32 78, label %221
    i32 79, label %227
    i32 80, label %227
    i32 149, label %233
    i32 6, label %236
    i32 7, label %238
    i32 5, label %240
    i32 143, label %251
  ]

15:                                               ; preds = %2, %2, %2, %2, %2, %2
  %16 = load ptr, ptr %5, align 8, !tbaa !5
  %17 = load ptr, ptr %6, align 8, !tbaa !5
  %18 = call zeroext i1 @expr_provides(ptr noundef %16, ptr noundef %17)
  %19 = zext i1 %18 to i8
  store i8 %19, ptr %7, align 1, !tbaa !9
  br label %257

20:                                               ; preds = %2
  %21 = load ptr, ptr %5, align 8, !tbaa !5
  %22 = load ptr, ptr %4, align 8, !tbaa !5
  %23 = call zeroext i1 @expr_nominal(ptr noundef %21, ptr noundef %22)
  %24 = zext i1 %23 to i8
  store i8 %24, ptr %7, align 1, !tbaa !9
  br label %257

25:                                               ; preds = %2, %2, %2
  %26 = load ptr, ptr %5, align 8, !tbaa !5
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = call zeroext i1 @expr_field(ptr noundef %26, ptr noundef %27)
  %29 = zext i1 %28 to i8
  store i8 %29, ptr %7, align 1, !tbaa !9
  br label %257

30:                                               ; preds = %2
  %31 = load ptr, ptr %5, align 8, !tbaa !5
  %32 = load ptr, ptr %6, align 8, !tbaa !5
  %33 = call zeroext i1 @expr_param(ptr noundef %31, ptr noundef %32)
  %34 = zext i1 %33 to i8
  store i8 %34, ptr %7, align 1, !tbaa !9
  br label %257

35:                                               ; preds = %2, %2, %2
  %36 = load ptr, ptr %5, align 8, !tbaa !5
  %37 = load ptr, ptr %6, align 8, !tbaa !5
  %38 = call zeroext i1 @expr_fun(ptr noundef %36, ptr noundef %37)
  %39 = zext i1 %38 to i8
  store i8 %39, ptr %7, align 1, !tbaa !9
  br label %257

40:                                               ; preds = %2
  %41 = load ptr, ptr %5, align 8, !tbaa !5
  %42 = load ptr, ptr %6, align 8, !tbaa !5
  %43 = call zeroext i1 @expr_seq(ptr noundef %41, ptr noundef %42)
  %44 = zext i1 %43 to i8
  store i8 %44, ptr %7, align 1, !tbaa !9
  br label %257

45:                                               ; preds = %2, %2
  %46 = load ptr, ptr %5, align 8, !tbaa !5
  %47 = load ptr, ptr %6, align 8, !tbaa !5
  %48 = call zeroext i1 @expr_local(ptr noundef %46, ptr noundef %47)
  %49 = zext i1 %48 to i8
  store i8 %49, ptr %7, align 1, !tbaa !9
  br label %257

50:                                               ; preds = %2
  %51 = load ptr, ptr %5, align 8, !tbaa !5
  %52 = load ptr, ptr %6, align 8, !tbaa !5
  %53 = call zeroext i1 @expr_break(ptr noundef %51, ptr noundef %52)
  %54 = zext i1 %53 to i8
  store i8 %54, ptr %7, align 1, !tbaa !9
  br label %257

55:                                               ; preds = %2
  %56 = load ptr, ptr %5, align 8, !tbaa !5
  %57 = load ptr, ptr %6, align 8, !tbaa !5
  %58 = call zeroext i1 @expr_return(ptr noundef %56, ptr noundef %57)
  %59 = zext i1 %58 to i8
  store i8 %59, ptr %7, align 1, !tbaa !9
  br label %257

60:                                               ; preds = %2, %2
  %61 = load ptr, ptr %5, align 8, !tbaa !5
  %62 = load ptr, ptr %6, align 8, !tbaa !5
  %63 = call zeroext i1 @expr_identity(ptr noundef %61, ptr noundef %62)
  %64 = zext i1 %63 to i8
  store i8 %64, ptr %7, align 1, !tbaa !9
  br label %257

65:                                               ; preds = %2
  %66 = load ptr, ptr %5, align 8, !tbaa !5
  %67 = load ptr, ptr %6, align 8, !tbaa !5
  %68 = call zeroext i1 @expr_assign(ptr noundef %66, ptr noundef %67)
  %69 = zext i1 %68 to i8
  store i8 %69, ptr %7, align 1, !tbaa !9
  br label %257

70:                                               ; preds = %2
  %71 = load ptr, ptr %5, align 8, !tbaa !5
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = call zeroext i1 @expr_consume(ptr noundef %71, ptr noundef %72)
  %74 = zext i1 %73 to i8
  store i8 %74, ptr %7, align 1, !tbaa !9
  br label %257

75:                                               ; preds = %2
  %76 = load ptr, ptr %5, align 8, !tbaa !5
  %77 = load ptr, ptr %6, align 8, !tbaa !5
  %78 = call zeroext i1 @expr_recover(ptr noundef %76, ptr noundef %77)
  %79 = zext i1 %78 to i8
  store i8 %79, ptr %7, align 1, !tbaa !9
  br label %257

80:                                               ; preds = %2
  %81 = load ptr, ptr %5, align 8, !tbaa !5
  %82 = load ptr, ptr %4, align 8, !tbaa !5
  %83 = call zeroext i1 @expr_dot(ptr noundef %81, ptr noundef %82)
  %84 = zext i1 %83 to i8
  store i8 %84, ptr %7, align 1, !tbaa !9
  br label %257

85:                                               ; preds = %2
  %86 = load ptr, ptr %5, align 8, !tbaa !5
  %87 = load ptr, ptr %4, align 8, !tbaa !5
  %88 = call zeroext i1 @expr_tilde(ptr noundef %86, ptr noundef %87)
  %89 = zext i1 %88 to i8
  store i8 %89, ptr %7, align 1, !tbaa !9
  br label %257

90:                                               ; preds = %2
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = load ptr, ptr %4, align 8, !tbaa !5
  %93 = call zeroext i1 @expr_chain(ptr noundef %91, ptr noundef %92)
  %94 = zext i1 %93 to i8
  store i8 %94, ptr %7, align 1, !tbaa !9
  br label %257

95:                                               ; preds = %2
  %96 = load ptr, ptr %5, align 8, !tbaa !5
  %97 = load ptr, ptr %4, align 8, !tbaa !5
  %98 = call zeroext i1 @expr_qualify(ptr noundef %96, ptr noundef %97)
  %99 = zext i1 %98 to i8
  store i8 %99, ptr %7, align 1, !tbaa !9
  br label %257

100:                                              ; preds = %2
  %101 = load ptr, ptr %5, align 8, !tbaa !5
  %102 = load ptr, ptr %4, align 8, !tbaa !5
  %103 = call zeroext i1 @expr_call(ptr noundef %101, ptr noundef %102)
  %104 = zext i1 %103 to i8
  store i8 %104, ptr %7, align 1, !tbaa !9
  br label %257

105:                                              ; preds = %2, %2
  %106 = load ptr, ptr %5, align 8, !tbaa !5
  %107 = load ptr, ptr %6, align 8, !tbaa !5
  %108 = call zeroext i1 @expr_if(ptr noundef %106, ptr noundef %107)
  %109 = zext i1 %108 to i8
  store i8 %109, ptr %7, align 1, !tbaa !9
  br label %257

110:                                              ; preds = %2
  %111 = load ptr, ptr %5, align 8, !tbaa !5
  %112 = load ptr, ptr %6, align 8, !tbaa !5
  %113 = call zeroext i1 @expr_iftype(ptr noundef %111, ptr noundef %112)
  %114 = zext i1 %113 to i8
  store i8 %114, ptr %7, align 1, !tbaa !9
  br label %257

115:                                              ; preds = %2
  %116 = load ptr, ptr %5, align 8, !tbaa !5
  %117 = load ptr, ptr %6, align 8, !tbaa !5
  %118 = call zeroext i1 @expr_while(ptr noundef %116, ptr noundef %117)
  %119 = zext i1 %118 to i8
  store i8 %119, ptr %7, align 1, !tbaa !9
  br label %257

120:                                              ; preds = %2
  %121 = load ptr, ptr %5, align 8, !tbaa !5
  %122 = load ptr, ptr %6, align 8, !tbaa !5
  %123 = call zeroext i1 @expr_repeat(ptr noundef %121, ptr noundef %122)
  %124 = zext i1 %123 to i8
  store i8 %124, ptr %7, align 1, !tbaa !9
  br label %257

125:                                              ; preds = %2, %2
  %126 = load ptr, ptr %5, align 8, !tbaa !5
  %127 = load ptr, ptr %6, align 8, !tbaa !5
  %128 = call zeroext i1 @expr_try(ptr noundef %126, ptr noundef %127)
  %129 = zext i1 %128 to i8
  store i8 %129, ptr %7, align 1, !tbaa !9
  br label %257

130:                                              ; preds = %2
  %131 = load ptr, ptr %5, align 8, !tbaa !5
  %132 = load ptr, ptr %6, align 8, !tbaa !5
  %133 = call zeroext i1 @expr_disposing_block(ptr noundef %131, ptr noundef %132)
  %134 = zext i1 %133 to i8
  store i8 %134, ptr %7, align 1, !tbaa !9
  br label %257

135:                                              ; preds = %2
  %136 = load ptr, ptr %5, align 8, !tbaa !5
  %137 = load ptr, ptr %6, align 8, !tbaa !5
  %138 = call zeroext i1 @expr_match(ptr noundef %136, ptr noundef %137)
  %139 = zext i1 %138 to i8
  store i8 %139, ptr %7, align 1, !tbaa !9
  br label %257

140:                                              ; preds = %2
  %141 = load ptr, ptr %5, align 8, !tbaa !5
  %142 = load ptr, ptr %6, align 8, !tbaa !5
  %143 = call zeroext i1 @expr_cases(ptr noundef %141, ptr noundef %142)
  %144 = zext i1 %143 to i8
  store i8 %144, ptr %7, align 1, !tbaa !9
  br label %257

145:                                              ; preds = %2
  %146 = load ptr, ptr %5, align 8, !tbaa !5
  %147 = load ptr, ptr %6, align 8, !tbaa !5
  %148 = call zeroext i1 @expr_case(ptr noundef %146, ptr noundef %147)
  %149 = zext i1 %148 to i8
  store i8 %149, ptr %7, align 1, !tbaa !9
  br label %257

150:                                              ; preds = %2
  %151 = load ptr, ptr %5, align 8, !tbaa !5
  %152 = load ptr, ptr %6, align 8, !tbaa !5
  %153 = call zeroext i1 @expr_match_capture(ptr noundef %151, ptr noundef %152)
  %154 = zext i1 %153 to i8
  store i8 %154, ptr %7, align 1, !tbaa !9
  br label %257

155:                                              ; preds = %2
  %156 = load ptr, ptr %5, align 8, !tbaa !5
  %157 = load ptr, ptr %6, align 8, !tbaa !5
  %158 = call zeroext i1 @expr_tuple(ptr noundef %156, ptr noundef %157)
  %159 = zext i1 %158 to i8
  store i8 %159, ptr %7, align 1, !tbaa !9
  br label %257

160:                                              ; preds = %2
  %161 = load ptr, ptr %5, align 8, !tbaa !5
  %162 = load ptr, ptr %4, align 8, !tbaa !5
  %163 = call zeroext i1 @expr_array(ptr noundef %161, ptr noundef %162)
  %164 = zext i1 %163 to i8
  store i8 %164, ptr %7, align 1, !tbaa !9
  br label %257

165:                                              ; preds = %2
  %166 = load ptr, ptr %5, align 8, !tbaa !5
  %167 = load ptr, ptr %6, align 8, !tbaa !5
  %168 = call zeroext i1 @expr_dontcareref(ptr noundef %166, ptr noundef %167)
  %169 = zext i1 %168 to i8
  store i8 %169, ptr %7, align 1, !tbaa !9
  br label %257

170:                                              ; preds = %2
  %171 = load ptr, ptr %5, align 8, !tbaa !5
  %172 = load ptr, ptr %4, align 8, !tbaa !5
  %173 = call zeroext i1 @expr_typeref(ptr noundef %171, ptr noundef %172)
  %174 = zext i1 %173 to i8
  store i8 %174, ptr %7, align 1, !tbaa !9
  br label %257

175:                                              ; preds = %2, %2
  %176 = load ptr, ptr %5, align 8, !tbaa !5
  %177 = load ptr, ptr %6, align 8, !tbaa !5
  %178 = call zeroext i1 @expr_localref(ptr noundef %176, ptr noundef %177)
  %179 = zext i1 %178 to i8
  store i8 %179, ptr %7, align 1, !tbaa !9
  br label %257

180:                                              ; preds = %2
  %181 = load ptr, ptr %5, align 8, !tbaa !5
  %182 = load ptr, ptr %6, align 8, !tbaa !5
  %183 = call zeroext i1 @expr_paramref(ptr noundef %181, ptr noundef %182)
  %184 = zext i1 %183 to i8
  store i8 %184, ptr %7, align 1, !tbaa !9
  br label %257

185:                                              ; preds = %2
  %186 = load ptr, ptr %5, align 8, !tbaa !5
  %187 = load ptr, ptr %6, align 8, !tbaa !5
  %188 = call zeroext i1 @expr_this(ptr noundef %186, ptr noundef %187)
  %189 = zext i1 %188 to i8
  store i8 %189, ptr %7, align 1, !tbaa !9
  br label %257

190:                                              ; preds = %2, %2
  %191 = load ptr, ptr %5, align 8, !tbaa !5
  %192 = load ptr, ptr %6, align 8, !tbaa !5
  %193 = call zeroext i1 @expr_literal(ptr noundef %191, ptr noundef %192, ptr noundef @.str.9)
  %194 = zext i1 %193 to i8
  store i8 %194, ptr %7, align 1, !tbaa !9
  br label %257

195:                                              ; preds = %2
  %196 = load ptr, ptr %5, align 8, !tbaa !5
  %197 = load ptr, ptr %6, align 8, !tbaa !5
  %198 = call zeroext i1 @expr_compile_intrinsic(ptr noundef %196, ptr noundef %197)
  %199 = zext i1 %198 to i8
  store i8 %199, ptr %7, align 1, !tbaa !9
  br label %257

200:                                              ; preds = %2
  %201 = load ptr, ptr %5, align 8, !tbaa !5
  %202 = load ptr, ptr %6, align 8, !tbaa !5
  %203 = call zeroext i1 @expr_location(ptr noundef %201, ptr noundef %202)
  %204 = zext i1 %203 to i8
  store i8 %204, ptr %7, align 1, !tbaa !9
  br label %257

205:                                              ; preds = %2
  %206 = load ptr, ptr %5, align 8, !tbaa !5
  %207 = load ptr, ptr %6, align 8, !tbaa !5
  %208 = call zeroext i1 @expr_addressof(ptr noundef %206, ptr noundef %207)
  %209 = zext i1 %208 to i8
  store i8 %209, ptr %7, align 1, !tbaa !9
  br label %257

210:                                              ; preds = %2
  %211 = load ptr, ptr %5, align 8, !tbaa !5
  %212 = load ptr, ptr %6, align 8, !tbaa !5
  %213 = call zeroext i1 @expr_digestof(ptr noundef %211, ptr noundef %212)
  %214 = zext i1 %213 to i8
  store i8 %214, ptr %7, align 1, !tbaa !9
  br label %257

215:                                              ; preds = %2
  %216 = load ptr, ptr %5, align 8, !tbaa !5
  %217 = load ptr, ptr %4, align 8, !tbaa !5
  %218 = call zeroext i1 @expr_as(ptr noundef %216, ptr noundef %217)
  br i1 %218, label %220, label %219

219:                                              ; preds = %215
  store i32 3, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %298

220:                                              ; preds = %215
  br label %257

221:                                              ; preds = %2
  %222 = load ptr, ptr %5, align 8, !tbaa !5
  %223 = load ptr, ptr %4, align 8, !tbaa !5
  %224 = call zeroext i1 @expr_object(ptr noundef %222, ptr noundef %223)
  br i1 %224, label %226, label %225

225:                                              ; preds = %221
  store i32 3, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %298

226:                                              ; preds = %221
  br label %257

227:                                              ; preds = %2, %2
  %228 = load ptr, ptr %5, align 8, !tbaa !5
  %229 = load ptr, ptr %4, align 8, !tbaa !5
  %230 = call zeroext i1 @expr_lambda(ptr noundef %228, ptr noundef %229)
  br i1 %230, label %232, label %231

231:                                              ; preds = %227
  store i32 3, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %298

232:                                              ; preds = %227
  br label %257

233:                                              ; preds = %2
  %234 = load ptr, ptr %5, align 8, !tbaa !5
  %235 = load ptr, ptr %4, align 8, !tbaa !5
  call void @fold_union(ptr noundef %234, ptr noundef %235)
  br label %257

236:                                              ; preds = %2
  %237 = load ptr, ptr %6, align 8, !tbaa !5
  call void @make_literal_type(ptr noundef %237)
  br label %257

238:                                              ; preds = %2
  %239 = load ptr, ptr %6, align 8, !tbaa !5
  call void @make_literal_type(ptr noundef %239)
  br label %257

240:                                              ; preds = %2
  %241 = load ptr, ptr %6, align 8, !tbaa !5
  %242 = call ptr @ast_parent(ptr noundef %241)
  %243 = call i32 @ast_id(ptr noundef %242)
  %244 = icmp eq i32 %243, 137
  br i1 %244, label %245, label %246

245:                                              ; preds = %240
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %298

246:                                              ; preds = %240
  %247 = load ptr, ptr %5, align 8, !tbaa !5
  %248 = load ptr, ptr %6, align 8, !tbaa !5
  %249 = call zeroext i1 @expr_literal(ptr noundef %247, ptr noundef %248, ptr noundef @.str.10)
  %250 = zext i1 %249 to i8
  store i8 %250, ptr %7, align 1, !tbaa !9
  br label %257

251:                                              ; preds = %2
  %252 = load ptr, ptr %5, align 8, !tbaa !5
  %253 = load ptr, ptr %6, align 8, !tbaa !5
  %254 = call zeroext i1 @expr_ffi(ptr noundef %252, ptr noundef %253)
  %255 = zext i1 %254 to i8
  store i8 %255, ptr %7, align 1, !tbaa !9
  br label %256

256:                                              ; preds = %251, %2
  br label %257

257:                                              ; preds = %256, %246, %238, %236, %233, %232, %226, %220, %210, %205, %200, %195, %190, %185, %180, %175, %170, %165, %160, %155, %150, %145, %140, %135, %130, %125, %120, %115, %110, %105, %100, %95, %90, %85, %80, %75, %70, %65, %60, %55, %50, %45, %40, %35, %30, %25, %20, %15
  %258 = load i8, ptr %7, align 1, !tbaa !9, !range !11, !noundef !12
  %259 = trunc i8 %258 to i1
  br i1 %259, label %270, label %260

260:                                              ; preds = %257
  %261 = load ptr, ptr %5, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.pass_opt_t, ptr %261, i32 0, i32 36
  %263 = getelementptr inbounds %struct.typecheck_t, ptr %262, i32 0, i32 2
  %264 = load ptr, ptr %263, align 8, !tbaa !13
  %265 = call i64 @errors_get_count(ptr noundef %264)
  %266 = icmp ugt i64 %265, 0
  br i1 %266, label %267, label %268

267:                                              ; preds = %260
  br label %269

268:                                              ; preds = %260
  call void @ponyint_assert_fail(ptr noundef @.str.11, ptr noundef @.str.1, i64 noundef 661, ptr noundef @__func__.pass_expr)
  br label %269

269:                                              ; preds = %268, %267
  store i32 2, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %298

270:                                              ; preds = %257
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #3
  %271 = load ptr, ptr %4, align 8, !tbaa !5
  %272 = load ptr, ptr %271, align 8, !tbaa !5
  %273 = call ptr @ast_type(ptr noundef %272)
  store ptr %273, ptr %9, align 8, !tbaa !5
  %274 = load ptr, ptr %9, align 8, !tbaa !5
  %275 = icmp ne ptr %274, null
  br i1 %275, label %276, label %282

276:                                              ; preds = %270
  %277 = load ptr, ptr %9, align 8, !tbaa !5
  %278 = call i32 @ast_id(ptr noundef %277)
  %279 = icmp eq i32 %278, 149
  br i1 %279, label %280, label %282

280:                                              ; preds = %276
  %281 = load ptr, ptr %5, align 8, !tbaa !5
  call void @fold_union(ptr noundef %281, ptr noundef %9)
  br label %282

282:                                              ; preds = %280, %276, %270
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  %283 = load ptr, ptr %4, align 8, !tbaa !5
  %284 = load ptr, ptr %283, align 8, !tbaa !5
  %285 = call ptr @ast_get_symtab(ptr noundef %284)
  store ptr %285, ptr %10, align 8, !tbaa !5
  %286 = load ptr, ptr %10, align 8, !tbaa !5
  %287 = icmp ne ptr %286, null
  br i1 %287, label %288, label %296

288:                                              ; preds = %282
  %289 = load ptr, ptr %10, align 8, !tbaa !5
  %290 = load ptr, ptr %5, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.pass_opt_t, ptr %290, i32 0, i32 36
  %292 = getelementptr inbounds %struct.typecheck_t, ptr %291, i32 0, i32 2
  %293 = load ptr, ptr %292, align 8, !tbaa !13
  %294 = call zeroext i1 @symtab_check_all_defined(ptr noundef %289, ptr noundef %293)
  br i1 %294, label %296, label %295

295:                                              ; preds = %288
  store i32 2, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %297

296:                                              ; preds = %288, %282
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %297

297:                                              ; preds = %296, %295
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #3
  br label %298

298:                                              ; preds = %297, %269, %245, %231, %225, %219
  call void @llvm.lifetime.end.p0(i64 1, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #3
  %299 = load i32, ptr %3, align 4
  ret i32 %299
}

declare zeroext i1 @expr_provides(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_nominal(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_field(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_param(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_fun(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_seq(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_local(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_break(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_return(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_identity(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_assign(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_consume(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_recover(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_dot(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_tilde(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_chain(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_qualify(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_call(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_if(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_iftype(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_while(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_repeat(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_try(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_disposing_block(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_match(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_cases(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_case(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_match_capture(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_tuple(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_array(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_dontcareref(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_typeref(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_localref(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_paramref(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_this(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_literal(ptr noundef, ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_compile_intrinsic(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_location(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_addressof(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_digestof(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_as(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_object(ptr noundef, ptr noundef) #1

declare zeroext i1 @expr_lambda(ptr noundef, ptr noundef) #1

; Function Attrs: nounwind uwtable
declare hidden void @fold_union(ptr noundef, ptr noundef) #2

declare void @make_literal_type(ptr noundef) #1

declare zeroext i1 @expr_ffi(ptr noundef, ptr noundef) #1

declare i64 @errors_get_count(ptr noundef) #1

declare ptr @ast_get_symtab(ptr noundef) #1

declare zeroext i1 @symtab_check_all_defined(ptr noundef, ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"_Bool", !7, i64 0}
!11 = !{i8 0, i8 2}
!12 = !{}
!13 = !{!14, !6, i64 216}
!14 = !{!"pass_opt_t", !15, i64 0, !15, i64 4, !10, i64 8, !10, i64 9, !10, i64 10, !10, i64 11, !10, i64 12, !10, i64 13, !10, i64 14, !10, i64 15, !10, i64 16, !10, i64 17, !10, i64 18, !10, i64 19, !10, i64 20, !10, i64 21, !15, i64 24, !16, i64 32, !10, i64 40, !10, i64 41, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !17, i64 176, !6, i64 224, !6, i64 232}
!15 = !{!"int", !7, i64 0}
!16 = !{!"long", !7, i64 0}
!17 = !{!"typecheck_t", !6, i64 0, !18, i64 8, !6, i64 40}
!18 = !{!"typecheck_stats_t", !16, i64 0, !16, i64 8, !16, i64 16, !16, i64 24}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.str.1 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [44 x i8], align 1
@__func__.pass_expr = external hidden unnamed_addr constant [10 x i8], align 1

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

declare ptr @ast_parent(ptr noundef) local_unnamed_addr #1

declare i32 @ast_id(ptr noundef) local_unnamed_addr #1

declare void @ponyint_assert_fail(ptr noundef, ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

declare ptr @ast_type(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 4) i32 @pass_expr(ptr noundef %0, ptr noundef %1) local_unnamed_addr #2 {
  %3 = alloca ptr, align 8
  %4 = load ptr, ptr %0, align 8, !tbaa !5
  %5 = tail call i32 @ast_id(ptr noundef %4) #3
  switch i32 %5, label %.critedge [
    i32 74, label %101
    i32 75, label %101
    i32 76, label %101
    i32 77, label %101
    i32 73, label %101
    i32 72, label %101
    i32 151, label %6
    i32 140, label %8
    i32 141, label %8
    i32 86, label %8
    i32 165, label %10
    i32 88, label %12
    i32 90, label %12
    i32 89, label %12
    i32 175, label %14
    i32 84, label %16
    i32 85, label %16
    i32 104, label %18
    i32 103, label %20
    i32 82, label %22
    i32 83, label %22
    i32 24, label %24
    i32 106, label %26
    i32 107, label %28
    i32 19, label %30
    i32 20, label %32
    i32 21, label %34
    i32 176, label %36
    i32 177, label %38
    i32 109, label %40
    i32 108, label %40
    i32 111, label %42
    i32 116, label %44
    i32 118, label %46
    i32 125, label %48
    i32 124, label %48
    i32 206, label %50
    i32 122, label %52
    i32 180, label %54
    i32 181, label %56
    i32 182, label %58
    i32 178, label %60
    i32 179, label %62
    i32 199, label %64
    i32 186, label %66
    i32 196, label %68
    i32 197, label %68
    i32 198, label %70
    i32 102, label %72
    i32 3, label %74
    i32 4, label %74
    i32 69, label %76
    i32 135, label %78
    i32 134, label %80
    i32 133, label %82
    i32 81, label %84
    i32 78, label %86
    i32 79, label %88
    i32 80, label %88
    i32 149, label %90
    i32 6, label %91
    i32 7, label %92
    i32 5, label %93
    i32 143, label %99
  ]

6:                                                ; preds = %2
  %7 = tail call zeroext i1 @expr_nominal(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %7, label %.critedge, label %103

8:                                                ; preds = %2, %2, %2
  %9 = tail call zeroext i1 @expr_field(ptr noundef %1, ptr noundef %4) #3
  br i1 %9, label %.critedge, label %103

10:                                               ; preds = %2
  %11 = tail call zeroext i1 @expr_param(ptr noundef %1, ptr noundef %4) #3
  br i1 %11, label %.critedge, label %103

12:                                               ; preds = %2, %2, %2
  %13 = tail call zeroext i1 @expr_fun(ptr noundef %1, ptr noundef %4) #3
  br i1 %13, label %.critedge, label %103

14:                                               ; preds = %2
  %15 = tail call zeroext i1 @expr_seq(ptr noundef %1, ptr noundef %4) #3
  br i1 %15, label %.critedge, label %103

16:                                               ; preds = %2, %2
  %17 = tail call zeroext i1 @expr_local(ptr noundef %1, ptr noundef %4) #3
  br i1 %17, label %.critedge, label %103

18:                                               ; preds = %2
  %19 = tail call zeroext i1 @expr_break(ptr noundef %1, ptr noundef %4) #3
  br i1 %19, label %.critedge, label %103

20:                                               ; preds = %2
  %21 = tail call zeroext i1 @expr_return(ptr noundef %1, ptr noundef %4) #3
  br i1 %21, label %.critedge, label %103

22:                                               ; preds = %2, %2
  %23 = tail call zeroext i1 @expr_identity(ptr noundef %1, ptr noundef %4) #3
  br i1 %23, label %.critedge, label %103

24:                                               ; preds = %2
  %25 = tail call zeroext i1 @expr_assign(ptr noundef %1, ptr noundef %4) #3
  br i1 %25, label %.critedge, label %103

26:                                               ; preds = %2
  %27 = tail call zeroext i1 @expr_consume(ptr noundef %1, ptr noundef %4) #3
  br i1 %27, label %.critedge, label %103

28:                                               ; preds = %2
  %29 = tail call zeroext i1 @expr_recover(ptr noundef %1, ptr noundef %4) #3
  br i1 %29, label %.critedge, label %103

30:                                               ; preds = %2
  %31 = tail call zeroext i1 @expr_dot(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %31, label %.critedge, label %103

32:                                               ; preds = %2
  %33 = tail call zeroext i1 @expr_tilde(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %33, label %.critedge, label %103

34:                                               ; preds = %2
  %35 = tail call zeroext i1 @expr_chain(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %35, label %.critedge, label %103

36:                                               ; preds = %2
  %37 = tail call zeroext i1 @expr_qualify(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %37, label %.critedge, label %103

38:                                               ; preds = %2
  %39 = tail call zeroext i1 @expr_call(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %39, label %.critedge, label %103

40:                                               ; preds = %2, %2
  %41 = tail call zeroext i1 @expr_if(ptr noundef %1, ptr noundef %4) #3
  br i1 %41, label %.critedge, label %103

42:                                               ; preds = %2
  %43 = tail call zeroext i1 @expr_iftype(ptr noundef %1, ptr noundef %4) #3
  br i1 %43, label %.critedge, label %103

44:                                               ; preds = %2
  %45 = tail call zeroext i1 @expr_while(ptr noundef %1, ptr noundef %4) #3
  br i1 %45, label %.critedge, label %103

46:                                               ; preds = %2
  %47 = tail call zeroext i1 @expr_repeat(ptr noundef %1, ptr noundef %4) #3
  br i1 %47, label %.critedge, label %103

48:                                               ; preds = %2, %2
  %49 = tail call zeroext i1 @expr_try(ptr noundef %1, ptr noundef %4) #3
  br i1 %49, label %.critedge, label %103

50:                                               ; preds = %2
  %51 = tail call zeroext i1 @expr_disposing_block(ptr noundef %1, ptr noundef %4) #3
  br i1 %51, label %.critedge, label %103

52:                                               ; preds = %2
  %53 = tail call zeroext i1 @expr_match(ptr noundef %1, ptr noundef %4) #3
  br i1 %53, label %.critedge, label %103

54:                                               ; preds = %2
  %55 = tail call zeroext i1 @expr_cases(ptr noundef %1, ptr noundef %4) #3
  br i1 %55, label %.critedge, label %103

56:                                               ; preds = %2
  %57 = tail call zeroext i1 @expr_case(ptr noundef %1, ptr noundef %4) #3
  br i1 %57, label %.critedge, label %103

58:                                               ; preds = %2
  %59 = tail call zeroext i1 @expr_match_capture(ptr noundef %1, ptr noundef %4) #3
  br i1 %59, label %.critedge, label %103

60:                                               ; preds = %2
  %61 = tail call zeroext i1 @expr_tuple(ptr noundef %1, ptr noundef %4) #3
  br i1 %61, label %.critedge, label %103

62:                                               ; preds = %2
  %63 = tail call zeroext i1 @expr_array(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %63, label %.critedge, label %103

64:                                               ; preds = %2
  %65 = tail call zeroext i1 @expr_dontcareref(ptr noundef %1, ptr noundef %4) #3
  br i1 %65, label %.critedge, label %103

66:                                               ; preds = %2
  %67 = tail call zeroext i1 @expr_typeref(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %67, label %.critedge, label %103

68:                                               ; preds = %2, %2
  %69 = tail call zeroext i1 @expr_localref(ptr noundef %1, ptr noundef %4) #3
  br i1 %69, label %.critedge, label %103

70:                                               ; preds = %2
  %71 = tail call zeroext i1 @expr_paramref(ptr noundef %1, ptr noundef %4) #3
  br i1 %71, label %.critedge, label %103

72:                                               ; preds = %2
  %73 = tail call zeroext i1 @expr_this(ptr noundef %1, ptr noundef %4) #3
  br i1 %73, label %.critedge, label %103

74:                                               ; preds = %2, %2
  %75 = tail call zeroext i1 @expr_literal(ptr noundef %1, ptr noundef %4, ptr noundef nonnull @.str.9) #3
  br i1 %75, label %.critedge, label %103

76:                                               ; preds = %2
  %77 = tail call zeroext i1 @expr_compile_intrinsic(ptr noundef %1, ptr noundef %4) #3
  br i1 %77, label %.critedge, label %103

78:                                               ; preds = %2
  %79 = tail call zeroext i1 @expr_location(ptr noundef %1, ptr noundef %4) #3
  br i1 %79, label %.critedge, label %103

80:                                               ; preds = %2
  %81 = tail call zeroext i1 @expr_addressof(ptr noundef %1, ptr noundef %4) #3
  br i1 %81, label %.critedge, label %103

82:                                               ; preds = %2
  %83 = tail call zeroext i1 @expr_digestof(ptr noundef %1, ptr noundef %4) #3
  br i1 %83, label %.critedge, label %103

84:                                               ; preds = %2
  %85 = tail call zeroext i1 @expr_as(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %85, label %.critedge, label %123

86:                                               ; preds = %2
  %87 = tail call zeroext i1 @expr_object(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %87, label %.critedge, label %123

88:                                               ; preds = %2, %2
  %89 = tail call zeroext i1 @expr_lambda(ptr noundef %1, ptr noundef nonnull %0) #3
  br i1 %89, label %.critedge, label %123

90:                                               ; preds = %2
  tail call void @fold_union(ptr noundef %1, ptr noundef nonnull %0)
  br label %.critedge

91:                                               ; preds = %2
  tail call void @make_literal_type(ptr noundef %4) #3
  br label %.critedge

92:                                               ; preds = %2
  tail call void @make_literal_type(ptr noundef %4) #3
  br label %.critedge

93:                                               ; preds = %2
  %94 = tail call ptr @ast_parent(ptr noundef %4) #3
  %95 = tail call i32 @ast_id(ptr noundef %94) #3
  %96 = icmp eq i32 %95, 137
  br i1 %96, label %123, label %97

97:                                               ; preds = %93
  %98 = tail call zeroext i1 @expr_literal(ptr noundef %1, ptr noundef %4, ptr noundef nonnull @.str.10) #3
  br i1 %98, label %.critedge, label %103

99:                                               ; preds = %2
  %100 = tail call zeroext i1 @expr_ffi(ptr noundef %1, ptr noundef %4) #3
  br i1 %100, label %.critedge, label %103

101:                                              ; preds = %2, %2, %2, %2, %2, %2
  %102 = tail call zeroext i1 @expr_provides(ptr noundef %1, ptr noundef %4) #3
  br i1 %102, label %.critedge, label %103

103:                                              ; preds = %6, %8, %10, %12, %14, %16, %18, %20, %22, %24, %26, %28, %30, %32, %34, %36, %38, %40, %42, %44, %46, %48, %50, %52, %54, %56, %58, %60, %62, %64, %66, %68, %70, %72, %74, %76, %78, %80, %82, %97, %99, %101
  %104 = getelementptr inbounds i8, ptr %1, i64 216
  %105 = load ptr, ptr %104, align 8, !tbaa !9
  %106 = tail call i64 @errors_get_count(ptr noundef %105) #3
  %.not = icmp eq i64 %106, 0
  br i1 %.not, label %107, label %123

107:                                              ; preds = %103
  tail call void @ponyint_assert_fail(ptr noundef nonnull @.str.11, ptr noundef nonnull @.str.1, i64 noundef 661, ptr noundef nonnull @__func__.pass_expr) #3
  br label %123

.critedge:                                        ; preds = %6, %8, %10, %12, %14, %16, %18, %20, %22, %24, %26, %28, %30, %32, %34, %36, %38, %40, %42, %44, %46, %48, %50, %52, %54, %56, %58, %60, %62, %64, %66, %68, %70, %72, %74, %76, %78, %80, %82, %97, %99, %2, %92, %91, %90, %88, %86, %84, %101
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #3
  %108 = load ptr, ptr %0, align 8, !tbaa !5
  %109 = tail call ptr @ast_type(ptr noundef %108) #3
  store ptr %109, ptr %3, align 8, !tbaa !5
  %.not108 = icmp eq ptr %109, null
  br i1 %.not108, label %114, label %110

110:                                              ; preds = %.critedge
  %111 = tail call i32 @ast_id(ptr noundef nonnull %109) #3
  %112 = icmp eq i32 %111, 149
  br i1 %112, label %113, label %114

113:                                              ; preds = %110
  call void @fold_union(ptr noundef %1, ptr noundef nonnull %3)
  br label %114

114:                                              ; preds = %113, %110, %.critedge
  %115 = load ptr, ptr %0, align 8, !tbaa !5
  %116 = call ptr @ast_get_symtab(ptr noundef %115) #3
  %.not109 = icmp eq ptr %116, null
  br i1 %.not109, label %121, label %117

117:                                              ; preds = %114
  %118 = getelementptr inbounds i8, ptr %1, i64 216
  %119 = load ptr, ptr %118, align 8, !tbaa !9
  %120 = call zeroext i1 @symtab_check_all_defined(ptr noundef nonnull %116, ptr noundef %119) #3
  br i1 %120, label %121, label %122

121:                                              ; preds = %117, %114
  br label %122

122:                                              ; preds = %117, %121
  %.0 = phi i32 [ 0, %121 ], [ 2, %117 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #3
  br label %123

123:                                              ; preds = %107, %103, %93, %88, %86, %84, %122
  %.1 = phi i32 [ %.0, %122 ], [ 3, %84 ], [ 3, %86 ], [ 3, %88 ], [ 0, %93 ], [ 2, %103 ], [ 2, %107 ]
  ret i32 %.1
}

declare zeroext i1 @expr_provides(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_nominal(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_field(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_param(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_fun(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_seq(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_local(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_break(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_return(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_identity(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_assign(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_consume(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_recover(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_dot(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_tilde(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_chain(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_qualify(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_call(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_if(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_iftype(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_while(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_repeat(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_try(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_disposing_block(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_match(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_cases(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_case(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_match_capture(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_tuple(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_array(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_dontcareref(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_typeref(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_localref(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_paramref(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_this(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_literal(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_compile_intrinsic(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_location(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_addressof(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_digestof(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_as(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_object(ptr noundef, ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_lambda(ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden void @fold_union(ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @make_literal_type(ptr noundef) local_unnamed_addr #1

declare zeroext i1 @expr_ffi(ptr noundef, ptr noundef) local_unnamed_addr #1

declare i64 @errors_get_count(ptr noundef) local_unnamed_addr #1

declare ptr @ast_get_symtab(ptr noundef) local_unnamed_addr #1

declare zeroext i1 @symtab_check_all_defined(ptr noundef, ptr noundef) local_unnamed_addr #1

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 216}
!10 = !{!"pass_opt_t", !11, i64 0, !11, i64 4, !12, i64 8, !12, i64 9, !12, i64 10, !12, i64 11, !12, i64 12, !12, i64 13, !12, i64 14, !12, i64 15, !12, i64 16, !12, i64 17, !12, i64 18, !12, i64 19, !12, i64 20, !12, i64 21, !11, i64 24, !13, i64 32, !12, i64 40, !12, i64 41, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !14, i64 176, !6, i64 224, !6, i64 232}
!11 = !{!"int", !7, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!"typecheck_t", !6, i64 0, !15, i64 8, !6, i64 40}
!15 = !{!"typecheck_stats_t", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,SROAPass,SimplifyCFGPass,TailCallElimPass