; LLVM IR from ponylang/ponyc :: src/libponyc/ast (frame)

; 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.typecheck_t = type { ptr, %struct.typecheck_stats_t, ptr }
%struct.typecheck_stats_t = type { i64, i64, i64, i64 }
%struct.typecheck_frame_t = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

; Function Attrs: nounwind uwtable
define dso_local zeroext i1 @frame_push(ptr noundef %0, ptr noundef %1) #0 {
  %3 = alloca i1, align 1
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i8, align 1
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca [4 x ptr], align 16
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca [8 x ptr], align 16
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca [4 x ptr], align 16
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca [3 x ptr], align 16
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca [4 x ptr], align 16
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca [4 x ptr], align 16
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca [5 x ptr], align 16
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca ptr, align 8
  %45 = alloca [4 x ptr], align 16
  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 1, ptr %6) #4
  store i8 0, ptr %6, align 1, !tbaa !9
  %46 = load ptr, ptr %5, align 8, !tbaa !5
  %47 = icmp eq ptr %46, null
  br i1 %47, label %48, label %59

48:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #4
  %49 = call noalias ptr @ponyint_pool_alloc(i64 noundef 3)
  store ptr %49, ptr %7, align 8, !tbaa !5
  %50 = load ptr, ptr %7, align 8, !tbaa !5
  call void @llvm.memset.p0.i64(ptr align 8 %50, i8 0, i64 208, i1 false)
  %51 = load ptr, ptr %4, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.typecheck_t, ptr %51, i32 0, i32 0
  %53 = load ptr, ptr %52, align 8, !tbaa !11
  %54 = load ptr, ptr %7, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.typecheck_frame_t, ptr %54, i32 0, i32 25
  store ptr %53, ptr %55, align 8, !tbaa !15
  %56 = load ptr, ptr %7, align 8, !tbaa !5
  %57 = load ptr, ptr %4, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.typecheck_t, ptr %57, i32 0, i32 0
  store ptr %56, ptr %58, align 8, !tbaa !11
  store i1 true, ptr %3, align 1
  store i32 1, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #4
  br label %548

59:                                               ; preds = %2
  %60 = load ptr, ptr %5, align 8, !tbaa !5
  %61 = call i32 @ast_id(ptr noundef %60)
  switch i32 %61, label %196 [
    i32 136, label %62
    i32 137, label %74
    i32 138, label %87
    i32 72, label %105
    i32 73, label %105
    i32 74, label %105
    i32 75, label %105
    i32 76, label %105
    i32 77, label %105
    i32 148, label %114
    i32 88, label %123
    i32 90, label %123
    i32 89, label %123
    i32 166, label %132
    i32 181, label %156
    i32 116, label %165
    i32 118, label %165
    i32 124, label %174
    i32 125, label %174
    i32 206, label %183
    i32 107, label %187
  ]

62:                                               ; preds = %59
  %63 = load ptr, ptr %4, align 8, !tbaa !5
  %64 = call zeroext i1 @push_frame(ptr noundef %63)
  %65 = zext i1 %64 to i8
  store i8 %65, ptr %6, align 1, !tbaa !9
  %66 = load ptr, ptr %4, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.typecheck_t, ptr %66, i32 0, i32 0
  %68 = load ptr, ptr %67, align 8, !tbaa !11
  %69 = getelementptr inbounds %struct.typecheck_frame_t, ptr %68, i32 0, i32 0
  store ptr null, ptr %69, align 8, !tbaa !17
  %70 = load ptr, ptr %4, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.typecheck_t, ptr %70, i32 0, i32 0
  %72 = load ptr, ptr %71, align 8, !tbaa !11
  %73 = getelementptr inbounds %struct.typecheck_frame_t, ptr %72, i32 0, i32 1
  store ptr null, ptr %73, align 8, !tbaa !18
  br label %545

74:                                               ; preds = %59
  %75 = load ptr, ptr %4, align 8, !tbaa !5
  %76 = call zeroext i1 @push_frame(ptr noundef %75)
  %77 = zext i1 %76 to i8
  store i8 %77, ptr %6, align 1, !tbaa !9
  %78 = load ptr, ptr %5, align 8, !tbaa !5
  %79 = load ptr, ptr %4, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.typecheck_t, ptr %79, i32 0, i32 0
  %81 = load ptr, ptr %80, align 8, !tbaa !11
  %82 = getelementptr inbounds %struct.typecheck_frame_t, ptr %81, i32 0, i32 0
  store ptr %78, ptr %82, align 8, !tbaa !17
  %83 = load ptr, ptr %4, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.typecheck_t, ptr %83, i32 0, i32 0
  %85 = load ptr, ptr %84, align 8, !tbaa !11
  %86 = getelementptr inbounds %struct.typecheck_frame_t, ptr %85, i32 0, i32 1
  store ptr null, ptr %86, align 8, !tbaa !18
  br label %545

87:                                               ; preds = %59
  %88 = load ptr, ptr %4, align 8, !tbaa !5
  %89 = call zeroext i1 @push_frame(ptr noundef %88)
  %90 = zext i1 %89 to i8
  store i8 %90, ptr %6, align 1, !tbaa !9
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = load ptr, ptr %4, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.typecheck_t, ptr %92, i32 0, i32 0
  %94 = load ptr, ptr %93, align 8, !tbaa !11
  %95 = getelementptr inbounds %struct.typecheck_frame_t, ptr %94, i32 0, i32 1
  store ptr %91, ptr %95, align 8, !tbaa !18
  %96 = load ptr, ptr %4, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.typecheck_t, ptr %96, i32 0, i32 0
  %98 = load ptr, ptr %97, align 8, !tbaa !11
  %99 = getelementptr inbounds %struct.typecheck_frame_t, ptr %98, i32 0, i32 21
  store ptr null, ptr %99, align 8, !tbaa !19
  %100 = load ptr, ptr %5, align 8, !tbaa !5
  %101 = load ptr, ptr %4, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.typecheck_t, ptr %101, i32 0, i32 0
  %103 = load ptr, ptr %102, align 8, !tbaa !11
  %104 = getelementptr inbounds %struct.typecheck_frame_t, ptr %103, i32 0, i32 22
  store ptr %100, ptr %104, align 8, !tbaa !20
  br label %545

105:                                              ; preds = %59, %59, %59, %59, %59, %59
  %106 = load ptr, ptr %4, align 8, !tbaa !5
  %107 = call zeroext i1 @push_frame(ptr noundef %106)
  %108 = zext i1 %107 to i8
  store i8 %108, ptr %6, align 1, !tbaa !9
  %109 = load ptr, ptr %5, align 8, !tbaa !5
  %110 = load ptr, ptr %4, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.typecheck_t, ptr %110, i32 0, i32 0
  %112 = load ptr, ptr %111, align 8, !tbaa !11
  %113 = getelementptr inbounds %struct.typecheck_frame_t, ptr %112, i32 0, i32 2
  store ptr %109, ptr %113, align 8, !tbaa !21
  br label %545

114:                                              ; preds = %59
  %115 = load ptr, ptr %4, align 8, !tbaa !5
  %116 = call zeroext i1 @push_frame(ptr noundef %115)
  %117 = zext i1 %116 to i8
  store i8 %117, ptr %6, align 1, !tbaa !9
  %118 = load ptr, ptr %5, align 8, !tbaa !5
  %119 = load ptr, ptr %4, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.typecheck_t, ptr %119, i32 0, i32 0
  %121 = load ptr, ptr %120, align 8, !tbaa !11
  %122 = getelementptr inbounds %struct.typecheck_frame_t, ptr %121, i32 0, i32 4
  store ptr %118, ptr %122, align 8, !tbaa !22
  br label %545

123:                                              ; preds = %59, %59, %59
  %124 = load ptr, ptr %4, align 8, !tbaa !5
  %125 = call zeroext i1 @push_frame(ptr noundef %124)
  %126 = zext i1 %125 to i8
  store i8 %126, ptr %6, align 1, !tbaa !9
  %127 = load ptr, ptr %5, align 8, !tbaa !5
  %128 = load ptr, ptr %4, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.typecheck_t, ptr %128, i32 0, i32 0
  %130 = load ptr, ptr %129, align 8, !tbaa !11
  %131 = getelementptr inbounds %struct.typecheck_frame_t, ptr %130, i32 0, i32 5
  store ptr %127, ptr %131, align 8, !tbaa !23
  br label %545

132:                                              ; preds = %59
  %133 = load ptr, ptr %4, align 8, !tbaa !5
  %134 = call zeroext i1 @push_frame(ptr noundef %133)
  %135 = zext i1 %134 to i8
  store i8 %135, ptr %6, align 1, !tbaa !9
  %136 = load ptr, ptr %4, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.typecheck_t, ptr %136, i32 0, i32 0
  %138 = load ptr, ptr %137, align 8, !tbaa !11
  %139 = getelementptr inbounds %struct.typecheck_frame_t, ptr %138, i32 0, i32 9
  store ptr null, ptr %139, align 8, !tbaa !24
  %140 = load ptr, ptr %4, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.typecheck_t, ptr %140, i32 0, i32 0
  %142 = load ptr, ptr %141, align 8, !tbaa !11
  %143 = getelementptr inbounds %struct.typecheck_frame_t, ptr %142, i32 0, i32 10
  store ptr null, ptr %143, align 8, !tbaa !25
  %144 = load ptr, ptr %4, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.typecheck_t, ptr %144, i32 0, i32 0
  %146 = load ptr, ptr %145, align 8, !tbaa !11
  %147 = getelementptr inbounds %struct.typecheck_frame_t, ptr %146, i32 0, i32 11
  store ptr null, ptr %147, align 8, !tbaa !26
  %148 = load ptr, ptr %4, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.typecheck_t, ptr %148, i32 0, i32 0
  %150 = load ptr, ptr %149, align 8, !tbaa !11
  %151 = getelementptr inbounds %struct.typecheck_frame_t, ptr %150, i32 0, i32 3
  store ptr null, ptr %151, align 8, !tbaa !27
  %152 = load ptr, ptr %4, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.typecheck_t, ptr %152, i32 0, i32 0
  %154 = load ptr, ptr %153, align 8, !tbaa !11
  %155 = getelementptr inbounds %struct.typecheck_frame_t, ptr %154, i32 0, i32 23
  store ptr null, ptr %155, align 8, !tbaa !28
  br label %545

156:                                              ; preds = %59
  %157 = load ptr, ptr %4, align 8, !tbaa !5
  %158 = call zeroext i1 @push_frame(ptr noundef %157)
  %159 = zext i1 %158 to i8
  store i8 %159, ptr %6, align 1, !tbaa !9
  %160 = load ptr, ptr %5, align 8, !tbaa !5
  %161 = load ptr, ptr %4, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.typecheck_t, ptr %161, i32 0, i32 0
  %163 = load ptr, ptr %162, align 8, !tbaa !11
  %164 = getelementptr inbounds %struct.typecheck_frame_t, ptr %163, i32 0, i32 13
  store ptr %160, ptr %164, align 8, !tbaa !29
  br label %545

165:                                              ; preds = %59, %59
  %166 = load ptr, ptr %4, align 8, !tbaa !5
  %167 = call zeroext i1 @push_frame(ptr noundef %166)
  %168 = zext i1 %167 to i8
  store i8 %168, ptr %6, align 1, !tbaa !9
  %169 = load ptr, ptr %5, align 8, !tbaa !5
  %170 = load ptr, ptr %4, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.typecheck_t, ptr %170, i32 0, i32 0
  %172 = load ptr, ptr %171, align 8, !tbaa !11
  %173 = getelementptr inbounds %struct.typecheck_frame_t, ptr %172, i32 0, i32 15
  store ptr %169, ptr %173, align 8, !tbaa !30
  br label %545

174:                                              ; preds = %59, %59
  %175 = load ptr, ptr %4, align 8, !tbaa !5
  %176 = call zeroext i1 @push_frame(ptr noundef %175)
  %177 = zext i1 %176 to i8
  store i8 %177, ptr %6, align 1, !tbaa !9
  %178 = load ptr, ptr %5, align 8, !tbaa !5
  %179 = load ptr, ptr %4, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.typecheck_t, ptr %179, i32 0, i32 0
  %181 = load ptr, ptr %180, align 8, !tbaa !11
  %182 = getelementptr inbounds %struct.typecheck_frame_t, ptr %181, i32 0, i32 19
  store ptr %178, ptr %182, align 8, !tbaa !31
  br label %545

183:                                              ; preds = %59
  %184 = load ptr, ptr %4, align 8, !tbaa !5
  %185 = call zeroext i1 @push_frame(ptr noundef %184)
  %186 = zext i1 %185 to i8
  store i8 %186, ptr %6, align 1, !tbaa !9
  br label %545

187:                                              ; preds = %59
  %188 = load ptr, ptr %4, align 8, !tbaa !5
  %189 = call zeroext i1 @push_frame(ptr noundef %188)
  %190 = zext i1 %189 to i8
  store i8 %190, ptr %6, align 1, !tbaa !9
  %191 = load ptr, ptr %5, align 8, !tbaa !5
  %192 = load ptr, ptr %4, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.typecheck_t, ptr %192, i32 0, i32 0
  %194 = load ptr, ptr %193, align 8, !tbaa !11
  %195 = getelementptr inbounds %struct.typecheck_frame_t, ptr %194, i32 0, i32 20
  store ptr %191, ptr %195, align 8, !tbaa !32
  br label %545

196:                                              ; preds = %59
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #4
  %197 = load ptr, ptr %5, align 8, !tbaa !5
  %198 = call ptr @ast_parent(ptr noundef %197)
  store ptr %198, ptr %9, align 8, !tbaa !5
  %199 = load ptr, ptr %9, align 8, !tbaa !5
  %200 = icmp eq ptr %199, null
  br i1 %200, label %201, label %204

201:                                              ; preds = %196
  %202 = load i8, ptr %6, align 1, !tbaa !9, !range !33, !noundef !34
  %203 = trunc i8 %202 to i1
  store i1 %203, ptr %3, align 1
  store i32 1, ptr %8, align 4
  br label %543

204:                                              ; preds = %196
  %205 = load ptr, ptr %9, align 8, !tbaa !5
  %206 = call i32 @ast_id(ptr noundef %205)
  switch i32 %206, label %541 [
    i32 163, label %207
    i32 88, label %226
    i32 90, label %226
    i32 89, label %226
    i32 166, label %277
    i32 165, label %292
    i32 84, label %325
    i32 85, label %325
    i32 181, label %340
    i32 81, label %355
    i32 116, label %373
    i32 118, label %420
    i32 109, label %467
    i32 110, label %511
  ]

207:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr %13) #4
  store ptr %10, ptr %13, align 8, !tbaa !5
  %208 = getelementptr inbounds ptr, ptr %13, i64 1
  store ptr %11, ptr %208, align 8, !tbaa !5
  %209 = getelementptr inbounds ptr, ptr %13, i64 2
  store ptr %12, ptr %209, align 8, !tbaa !5
  %210 = getelementptr inbounds ptr, ptr %13, i64 3
  store ptr null, ptr %210, align 8, !tbaa !5
  %211 = load ptr, ptr %9, align 8, !tbaa !5
  %212 = getelementptr inbounds [4 x ptr], ptr %13, i64 0, i64 0
  call void @ast_get_children(ptr noundef %211, i64 noundef 3, ptr noundef %212)
  call void @llvm.lifetime.end.p0(i64 32, ptr %13) #4
  %213 = load ptr, ptr %11, align 8, !tbaa !5
  %214 = load ptr, ptr %5, align 8, !tbaa !5
  %215 = icmp eq ptr %213, %214
  br i1 %215, label %216, label %225

216:                                              ; preds = %207
  %217 = load ptr, ptr %4, align 8, !tbaa !5
  %218 = call zeroext i1 @push_frame(ptr noundef %217)
  %219 = zext i1 %218 to i8
  store i8 %219, ptr %6, align 1, !tbaa !9
  %220 = load ptr, ptr %5, align 8, !tbaa !5
  %221 = load ptr, ptr %4, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.typecheck_t, ptr %221, i32 0, i32 0
  %223 = load ptr, ptr %222, align 8, !tbaa !11
  %224 = getelementptr inbounds %struct.typecheck_frame_t, ptr %223, i32 0, i32 3
  store ptr %220, ptr %224, align 8, !tbaa !27
  br label %225

225:                                              ; preds = %216, %207
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #4
  br label %542

226:                                              ; preds = %204, %204, %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 64, ptr %21) #4
  store ptr %14, ptr %21, align 8, !tbaa !5
  %227 = getelementptr inbounds ptr, ptr %21, i64 1
  store ptr %15, ptr %227, align 8, !tbaa !5
  %228 = getelementptr inbounds ptr, ptr %21, i64 2
  store ptr %16, ptr %228, align 8, !tbaa !5
  %229 = getelementptr inbounds ptr, ptr %21, i64 3
  store ptr %17, ptr %229, align 8, !tbaa !5
  %230 = getelementptr inbounds ptr, ptr %21, i64 4
  store ptr %18, ptr %230, align 8, !tbaa !5
  %231 = getelementptr inbounds ptr, ptr %21, i64 5
  store ptr %19, ptr %231, align 8, !tbaa !5
  %232 = getelementptr inbounds ptr, ptr %21, i64 6
  store ptr %20, ptr %232, align 8, !tbaa !5
  %233 = getelementptr inbounds ptr, ptr %21, i64 7
  store ptr null, ptr %233, align 8, !tbaa !5
  %234 = load ptr, ptr %9, align 8, !tbaa !5
  %235 = getelementptr inbounds [8 x ptr], ptr %21, i64 0, i64 0
  call void @ast_get_children(ptr noundef %234, i64 noundef 7, ptr noundef %235)
  call void @llvm.lifetime.end.p0(i64 64, ptr %21) #4
  %236 = load ptr, ptr %17, align 8, !tbaa !5
  %237 = load ptr, ptr %5, align 8, !tbaa !5
  %238 = icmp eq ptr %236, %237
  br i1 %238, label %239, label %248

239:                                              ; preds = %226
  %240 = load ptr, ptr %4, align 8, !tbaa !5
  %241 = call zeroext i1 @push_frame(ptr noundef %240)
  %242 = zext i1 %241 to i8
  store i8 %242, ptr %6, align 1, !tbaa !9
  %243 = load ptr, ptr %5, align 8, !tbaa !5
  %244 = load ptr, ptr %4, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.typecheck_t, ptr %244, i32 0, i32 0
  %246 = load ptr, ptr %245, align 8, !tbaa !11
  %247 = getelementptr inbounds %struct.typecheck_frame_t, ptr %246, i32 0, i32 8
  store ptr %243, ptr %247, align 8, !tbaa !35
  br label %276

248:                                              ; preds = %226
  %249 = load ptr, ptr %18, align 8, !tbaa !5
  %250 = load ptr, ptr %5, align 8, !tbaa !5
  %251 = icmp eq ptr %249, %250
  br i1 %251, label %252, label %261

252:                                              ; preds = %248
  %253 = load ptr, ptr %4, align 8, !tbaa !5
  %254 = call zeroext i1 @push_frame(ptr noundef %253)
  %255 = zext i1 %254 to i8
  store i8 %255, ptr %6, align 1, !tbaa !9
  %256 = load ptr, ptr %5, align 8, !tbaa !5
  %257 = load ptr, ptr %4, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.typecheck_t, ptr %257, i32 0, i32 0
  %259 = load ptr, ptr %258, align 8, !tbaa !11
  %260 = getelementptr inbounds %struct.typecheck_frame_t, ptr %259, i32 0, i32 9
  store ptr %256, ptr %260, align 8, !tbaa !24
  br label %275

261:                                              ; preds = %248
  %262 = load ptr, ptr %20, align 8, !tbaa !5
  %263 = load ptr, ptr %5, align 8, !tbaa !5
  %264 = icmp eq ptr %262, %263
  br i1 %264, label %265, label %274

265:                                              ; preds = %261
  %266 = load ptr, ptr %4, align 8, !tbaa !5
  %267 = call zeroext i1 @push_frame(ptr noundef %266)
  %268 = zext i1 %267 to i8
  store i8 %268, ptr %6, align 1, !tbaa !9
  %269 = load ptr, ptr %5, align 8, !tbaa !5
  %270 = load ptr, ptr %4, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.typecheck_t, ptr %270, i32 0, i32 0
  %272 = load ptr, ptr %271, align 8, !tbaa !11
  %273 = getelementptr inbounds %struct.typecheck_frame_t, ptr %272, i32 0, i32 7
  store ptr %269, ptr %273, align 8, !tbaa !36
  br label %274

274:                                              ; preds = %265, %261
  br label %275

275:                                              ; preds = %274, %252
  br label %276

276:                                              ; preds = %275, %239
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  br label %542

277:                                              ; preds = %204
  %278 = load ptr, ptr %9, align 8, !tbaa !5
  %279 = call ptr @ast_parent(ptr noundef %278)
  %280 = call i32 @ast_id(ptr noundef %279)
  switch i32 %280, label %290 [
    i32 142, label %281
    i32 143, label %281
  ]

281:                                              ; preds = %277, %277
  %282 = load ptr, ptr %4, align 8, !tbaa !5
  %283 = call zeroext i1 @push_frame(ptr noundef %282)
  %284 = zext i1 %283 to i8
  store i8 %284, ptr %6, align 1, !tbaa !9
  %285 = load ptr, ptr %5, align 8, !tbaa !5
  %286 = load ptr, ptr %4, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.typecheck_t, ptr %286, i32 0, i32 0
  %288 = load ptr, ptr %287, align 8, !tbaa !11
  %289 = getelementptr inbounds %struct.typecheck_frame_t, ptr %288, i32 0, i32 10
  store ptr %285, ptr %289, align 8, !tbaa !25
  br label %291

290:                                              ; preds = %277
  br label %291

291:                                              ; preds = %290, %281
  br label %542

292:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr %25) #4
  store ptr %22, ptr %25, align 8, !tbaa !5
  %293 = getelementptr inbounds ptr, ptr %25, i64 1
  store ptr %23, ptr %293, align 8, !tbaa !5
  %294 = getelementptr inbounds ptr, ptr %25, i64 2
  store ptr %24, ptr %294, align 8, !tbaa !5
  %295 = getelementptr inbounds ptr, ptr %25, i64 3
  store ptr null, ptr %295, align 8, !tbaa !5
  %296 = load ptr, ptr %9, align 8, !tbaa !5
  %297 = getelementptr inbounds [4 x ptr], ptr %25, i64 0, i64 0
  call void @ast_get_children(ptr noundef %296, i64 noundef 3, ptr noundef %297)
  call void @llvm.lifetime.end.p0(i64 32, ptr %25) #4
  %298 = load ptr, ptr %23, align 8, !tbaa !5
  %299 = load ptr, ptr %5, align 8, !tbaa !5
  %300 = icmp eq ptr %298, %299
  br i1 %300, label %301, label %310

301:                                              ; preds = %292
  %302 = load ptr, ptr %4, align 8, !tbaa !5
  %303 = call zeroext i1 @push_frame(ptr noundef %302)
  %304 = zext i1 %303 to i8
  store i8 %304, ptr %6, align 1, !tbaa !9
  %305 = load ptr, ptr %5, align 8, !tbaa !5
  %306 = load ptr, ptr %4, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.typecheck_t, ptr %306, i32 0, i32 0
  %308 = load ptr, ptr %307, align 8, !tbaa !11
  %309 = getelementptr inbounds %struct.typecheck_frame_t, ptr %308, i32 0, i32 11
  store ptr %305, ptr %309, align 8, !tbaa !26
  br label %324

310:                                              ; preds = %292
  %311 = load ptr, ptr %24, align 8, !tbaa !5
  %312 = load ptr, ptr %5, align 8, !tbaa !5
  %313 = icmp eq ptr %311, %312
  br i1 %313, label %314, label %323

314:                                              ; preds = %310
  %315 = load ptr, ptr %4, align 8, !tbaa !5
  %316 = call zeroext i1 @push_frame(ptr noundef %315)
  %317 = zext i1 %316 to i8
  store i8 %317, ptr %6, align 1, !tbaa !9
  %318 = load ptr, ptr %5, align 8, !tbaa !5
  %319 = load ptr, ptr %4, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.typecheck_t, ptr %319, i32 0, i32 0
  %321 = load ptr, ptr %320, align 8, !tbaa !11
  %322 = getelementptr inbounds %struct.typecheck_frame_t, ptr %321, i32 0, i32 6
  store ptr %318, ptr %322, align 8, !tbaa !37
  br label %323

323:                                              ; preds = %314, %310
  br label %324

324:                                              ; preds = %323, %301
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  br label %542

325:                                              ; preds = %204, %204
  %326 = load ptr, ptr %9, align 8, !tbaa !5
  %327 = call ptr @ast_childidx(ptr noundef %326, i64 noundef 1)
  %328 = load ptr, ptr %5, align 8, !tbaa !5
  %329 = icmp eq ptr %327, %328
  br i1 %329, label %330, label %339

330:                                              ; preds = %325
  %331 = load ptr, ptr %4, align 8, !tbaa !5
  %332 = call zeroext i1 @push_frame(ptr noundef %331)
  %333 = zext i1 %332 to i8
  store i8 %333, ptr %6, align 1, !tbaa !9
  %334 = load ptr, ptr %5, align 8, !tbaa !5
  %335 = load ptr, ptr %4, align 8, !tbaa !5
  %336 = getelementptr inbounds %struct.typecheck_t, ptr %335, i32 0, i32 0
  %337 = load ptr, ptr %336, align 8, !tbaa !11
  %338 = getelementptr inbounds %struct.typecheck_frame_t, ptr %337, i32 0, i32 11
  store ptr %334, ptr %338, align 8, !tbaa !26
  br label %339

339:                                              ; preds = %330, %325
  br label %542

340:                                              ; preds = %204
  %341 = load ptr, ptr %9, align 8, !tbaa !5
  %342 = call ptr @ast_child(ptr noundef %341)
  %343 = load ptr, ptr %5, align 8, !tbaa !5
  %344 = icmp eq ptr %342, %343
  br i1 %344, label %345, label %354

345:                                              ; preds = %340
  %346 = load ptr, ptr %4, align 8, !tbaa !5
  %347 = call zeroext i1 @push_frame(ptr noundef %346)
  %348 = zext i1 %347 to i8
  store i8 %348, ptr %6, align 1, !tbaa !9
  %349 = load ptr, ptr %5, align 8, !tbaa !5
  %350 = load ptr, ptr %4, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.typecheck_t, ptr %350, i32 0, i32 0
  %352 = load ptr, ptr %351, align 8, !tbaa !11
  %353 = getelementptr inbounds %struct.typecheck_frame_t, ptr %352, i32 0, i32 14
  store ptr %349, ptr %353, align 8, !tbaa !38
  br label %354

354:                                              ; preds = %345, %340
  br label %542

355:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %28) #4
  store ptr %26, ptr %28, align 8, !tbaa !5
  %356 = getelementptr inbounds ptr, ptr %28, i64 1
  store ptr %27, ptr %356, align 8, !tbaa !5
  %357 = getelementptr inbounds ptr, ptr %28, i64 2
  store ptr null, ptr %357, align 8, !tbaa !5
  %358 = load ptr, ptr %9, align 8, !tbaa !5
  %359 = getelementptr inbounds [3 x ptr], ptr %28, i64 0, i64 0
  call void @ast_get_children(ptr noundef %358, i64 noundef 2, ptr noundef %359)
  call void @llvm.lifetime.end.p0(i64 24, ptr %28) #4
  %360 = load ptr, ptr %27, align 8, !tbaa !5
  %361 = load ptr, ptr %5, align 8, !tbaa !5
  %362 = icmp eq ptr %360, %361
  br i1 %362, label %363, label %372

363:                                              ; preds = %355
  %364 = load ptr, ptr %4, align 8, !tbaa !5
  %365 = call zeroext i1 @push_frame(ptr noundef %364)
  %366 = zext i1 %365 to i8
  store i8 %366, ptr %6, align 1, !tbaa !9
  %367 = load ptr, ptr %5, align 8, !tbaa !5
  %368 = load ptr, ptr %4, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.typecheck_t, ptr %368, i32 0, i32 0
  %370 = load ptr, ptr %369, align 8, !tbaa !11
  %371 = getelementptr inbounds %struct.typecheck_frame_t, ptr %370, i32 0, i32 12
  store ptr %367, ptr %371, align 8, !tbaa !39
  br label %372

372:                                              ; preds = %363, %355
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  br label %542

373:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr %32) #4
  store ptr %29, ptr %32, align 8, !tbaa !5
  %374 = getelementptr inbounds ptr, ptr %32, i64 1
  store ptr %30, ptr %374, align 8, !tbaa !5
  %375 = getelementptr inbounds ptr, ptr %32, i64 2
  store ptr %31, ptr %375, align 8, !tbaa !5
  %376 = getelementptr inbounds ptr, ptr %32, i64 3
  store ptr null, ptr %376, align 8, !tbaa !5
  %377 = load ptr, ptr %9, align 8, !tbaa !5
  %378 = getelementptr inbounds [4 x ptr], ptr %32, i64 0, i64 0
  call void @ast_get_children(ptr noundef %377, i64 noundef 3, ptr noundef %378)
  call void @llvm.lifetime.end.p0(i64 32, ptr %32) #4
  %379 = load ptr, ptr %29, align 8, !tbaa !5
  %380 = load ptr, ptr %5, align 8, !tbaa !5
  %381 = icmp eq ptr %379, %380
  br i1 %381, label %382, label %391

382:                                              ; preds = %373
  %383 = load ptr, ptr %4, align 8, !tbaa !5
  %384 = call zeroext i1 @push_frame(ptr noundef %383)
  %385 = zext i1 %384 to i8
  store i8 %385, ptr %6, align 1, !tbaa !9
  %386 = load ptr, ptr %5, align 8, !tbaa !5
  %387 = load ptr, ptr %4, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.typecheck_t, ptr %387, i32 0, i32 0
  %389 = load ptr, ptr %388, align 8, !tbaa !11
  %390 = getelementptr inbounds %struct.typecheck_frame_t, ptr %389, i32 0, i32 16
  store ptr %386, ptr %390, align 8, !tbaa !40
  br label %419

391:                                              ; preds = %373
  %392 = load ptr, ptr %30, align 8, !tbaa !5
  %393 = load ptr, ptr %5, align 8, !tbaa !5
  %394 = icmp eq ptr %392, %393
  br i1 %394, label %395, label %404

395:                                              ; preds = %391
  %396 = load ptr, ptr %4, align 8, !tbaa !5
  %397 = call zeroext i1 @push_frame(ptr noundef %396)
  %398 = zext i1 %397 to i8
  store i8 %398, ptr %6, align 1, !tbaa !9
  %399 = load ptr, ptr %5, align 8, !tbaa !5
  %400 = load ptr, ptr %4, align 8, !tbaa !5
  %401 = getelementptr inbounds %struct.typecheck_t, ptr %400, i32 0, i32 0
  %402 = load ptr, ptr %401, align 8, !tbaa !11
  %403 = getelementptr inbounds %struct.typecheck_frame_t, ptr %402, i32 0, i32 17
  store ptr %399, ptr %403, align 8, !tbaa !41
  br label %418

404:                                              ; preds = %391
  %405 = load ptr, ptr %31, align 8, !tbaa !5
  %406 = load ptr, ptr %5, align 8, !tbaa !5
  %407 = icmp eq ptr %405, %406
  br i1 %407, label %408, label %417

408:                                              ; preds = %404
  %409 = load ptr, ptr %4, align 8, !tbaa !5
  %410 = call zeroext i1 @push_frame(ptr noundef %409)
  %411 = zext i1 %410 to i8
  store i8 %411, ptr %6, align 1, !tbaa !9
  %412 = load ptr, ptr %5, align 8, !tbaa !5
  %413 = load ptr, ptr %4, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.typecheck_t, ptr %413, i32 0, i32 0
  %415 = load ptr, ptr %414, align 8, !tbaa !11
  %416 = getelementptr inbounds %struct.typecheck_frame_t, ptr %415, i32 0, i32 18
  store ptr %412, ptr %416, align 8, !tbaa !42
  br label %417

417:                                              ; preds = %408, %404
  br label %418

418:                                              ; preds = %417, %395
  br label %419

419:                                              ; preds = %418, %382
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  br label %542

420:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr %36) #4
  store ptr %33, ptr %36, align 8, !tbaa !5
  %421 = getelementptr inbounds ptr, ptr %36, i64 1
  store ptr %34, ptr %421, align 8, !tbaa !5
  %422 = getelementptr inbounds ptr, ptr %36, i64 2
  store ptr %35, ptr %422, align 8, !tbaa !5
  %423 = getelementptr inbounds ptr, ptr %36, i64 3
  store ptr null, ptr %423, align 8, !tbaa !5
  %424 = load ptr, ptr %9, align 8, !tbaa !5
  %425 = getelementptr inbounds [4 x ptr], ptr %36, i64 0, i64 0
  call void @ast_get_children(ptr noundef %424, i64 noundef 3, ptr noundef %425)
  call void @llvm.lifetime.end.p0(i64 32, ptr %36) #4
  %426 = load ptr, ptr %33, align 8, !tbaa !5
  %427 = load ptr, ptr %5, align 8, !tbaa !5
  %428 = icmp eq ptr %426, %427
  br i1 %428, label %429, label %438

429:                                              ; preds = %420
  %430 = load ptr, ptr %4, align 8, !tbaa !5
  %431 = call zeroext i1 @push_frame(ptr noundef %430)
  %432 = zext i1 %431 to i8
  store i8 %432, ptr %6, align 1, !tbaa !9
  %433 = load ptr, ptr %5, align 8, !tbaa !5
  %434 = load ptr, ptr %4, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.typecheck_t, ptr %434, i32 0, i32 0
  %436 = load ptr, ptr %435, align 8, !tbaa !11
  %437 = getelementptr inbounds %struct.typecheck_frame_t, ptr %436, i32 0, i32 17
  store ptr %433, ptr %437, align 8, !tbaa !41
  br label %466

438:                                              ; preds = %420
  %439 = load ptr, ptr %34, align 8, !tbaa !5
  %440 = load ptr, ptr %5, align 8, !tbaa !5
  %441 = icmp eq ptr %439, %440
  br i1 %441, label %442, label %451

442:                                              ; preds = %438
  %443 = load ptr, ptr %4, align 8, !tbaa !5
  %444 = call zeroext i1 @push_frame(ptr noundef %443)
  %445 = zext i1 %444 to i8
  store i8 %445, ptr %6, align 1, !tbaa !9
  %446 = load ptr, ptr %5, align 8, !tbaa !5
  %447 = load ptr, ptr %4, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.typecheck_t, ptr %447, i32 0, i32 0
  %449 = load ptr, ptr %448, align 8, !tbaa !11
  %450 = getelementptr inbounds %struct.typecheck_frame_t, ptr %449, i32 0, i32 16
  store ptr %446, ptr %450, align 8, !tbaa !40
  br label %465

451:                                              ; preds = %438
  %452 = load ptr, ptr %35, align 8, !tbaa !5
  %453 = load ptr, ptr %5, align 8, !tbaa !5
  %454 = icmp eq ptr %452, %453
  br i1 %454, label %455, label %464

455:                                              ; preds = %451
  %456 = load ptr, ptr %4, align 8, !tbaa !5
  %457 = call zeroext i1 @push_frame(ptr noundef %456)
  %458 = zext i1 %457 to i8
  store i8 %458, ptr %6, align 1, !tbaa !9
  %459 = load ptr, ptr %5, align 8, !tbaa !5
  %460 = load ptr, ptr %4, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.typecheck_t, ptr %460, i32 0, i32 0
  %462 = load ptr, ptr %461, align 8, !tbaa !11
  %463 = getelementptr inbounds %struct.typecheck_frame_t, ptr %462, i32 0, i32 18
  store ptr %459, ptr %463, align 8, !tbaa !42
  br label %464

464:                                              ; preds = %455, %451
  br label %465

465:                                              ; preds = %464, %442
  br label %466

466:                                              ; preds = %465, %429
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  br label %542

467:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %41) #4
  store ptr %37, ptr %41, align 8, !tbaa !5
  %468 = getelementptr inbounds ptr, ptr %41, i64 1
  store ptr %38, ptr %468, align 8, !tbaa !5
  %469 = getelementptr inbounds ptr, ptr %41, i64 2
  store ptr %39, ptr %469, align 8, !tbaa !5
  %470 = getelementptr inbounds ptr, ptr %41, i64 3
  store ptr %40, ptr %470, align 8, !tbaa !5
  %471 = getelementptr inbounds ptr, ptr %41, i64 4
  store ptr null, ptr %471, align 8, !tbaa !5
  %472 = load ptr, ptr %9, align 8, !tbaa !5
  %473 = getelementptr inbounds [5 x ptr], ptr %41, i64 0, i64 0
  call void @ast_get_children(ptr noundef %472, i64 noundef 4, ptr noundef %473)
  call void @llvm.lifetime.end.p0(i64 40, ptr %41) #4
  %474 = load ptr, ptr %38, align 8, !tbaa !5
  %475 = load ptr, ptr %5, align 8, !tbaa !5
  %476 = icmp eq ptr %474, %475
  br i1 %476, label %477, label %491

477:                                              ; preds = %467
  %478 = load ptr, ptr %4, align 8, !tbaa !5
  %479 = call zeroext i1 @push_frame(ptr noundef %478)
  %480 = zext i1 %479 to i8
  store i8 %480, ptr %6, align 1, !tbaa !9
  %481 = load ptr, ptr %37, align 8, !tbaa !5
  %482 = load ptr, ptr %4, align 8, !tbaa !5
  %483 = getelementptr inbounds %struct.typecheck_t, ptr %482, i32 0, i32 0
  %484 = load ptr, ptr %483, align 8, !tbaa !11
  %485 = getelementptr inbounds %struct.typecheck_frame_t, ptr %484, i32 0, i32 21
  store ptr %481, ptr %485, align 8, !tbaa !19
  %486 = load ptr, ptr %38, align 8, !tbaa !5
  %487 = load ptr, ptr %4, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.typecheck_t, ptr %487, i32 0, i32 0
  %489 = load ptr, ptr %488, align 8, !tbaa !11
  %490 = getelementptr inbounds %struct.typecheck_frame_t, ptr %489, i32 0, i32 22
  store ptr %486, ptr %490, align 8, !tbaa !20
  br label %510

491:                                              ; preds = %467
  %492 = load ptr, ptr %39, align 8, !tbaa !5
  %493 = load ptr, ptr %5, align 8, !tbaa !5
  %494 = icmp eq ptr %492, %493
  br i1 %494, label %495, label %509

495:                                              ; preds = %491
  %496 = load ptr, ptr %4, align 8, !tbaa !5
  %497 = call zeroext i1 @push_frame(ptr noundef %496)
  %498 = zext i1 %497 to i8
  store i8 %498, ptr %6, align 1, !tbaa !9
  %499 = load ptr, ptr %40, align 8, !tbaa !5
  %500 = load ptr, ptr %4, align 8, !tbaa !5
  %501 = getelementptr inbounds %struct.typecheck_t, ptr %500, i32 0, i32 0
  %502 = load ptr, ptr %501, align 8, !tbaa !11
  %503 = getelementptr inbounds %struct.typecheck_frame_t, ptr %502, i32 0, i32 21
  store ptr %499, ptr %503, align 8, !tbaa !19
  %504 = load ptr, ptr %39, align 8, !tbaa !5
  %505 = load ptr, ptr %4, align 8, !tbaa !5
  %506 = getelementptr inbounds %struct.typecheck_t, ptr %505, i32 0, i32 0
  %507 = load ptr, ptr %506, align 8, !tbaa !11
  %508 = getelementptr inbounds %struct.typecheck_frame_t, ptr %507, i32 0, i32 22
  store ptr %504, ptr %508, align 8, !tbaa !20
  br label %509

509:                                              ; preds = %495, %491
  br label %510

510:                                              ; preds = %509, %477
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  br label %542

511:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr %45) #4
  store ptr %42, ptr %45, align 8, !tbaa !5
  %512 = getelementptr inbounds ptr, ptr %45, i64 1
  store ptr %43, ptr %512, align 8, !tbaa !5
  %513 = getelementptr inbounds ptr, ptr %45, i64 2
  store ptr %44, ptr %513, align 8, !tbaa !5
  %514 = getelementptr inbounds ptr, ptr %45, i64 3
  store ptr null, ptr %514, align 8, !tbaa !5
  %515 = load ptr, ptr %9, align 8, !tbaa !5
  %516 = getelementptr inbounds [4 x ptr], ptr %45, i64 0, i64 0
  call void @ast_get_children(ptr noundef %515, i64 noundef 3, ptr noundef %516)
  call void @llvm.lifetime.end.p0(i64 32, ptr %45) #4
  %517 = load ptr, ptr %4, align 8, !tbaa !5
  %518 = call zeroext i1 @push_frame(ptr noundef %517)
  %519 = zext i1 %518 to i8
  store i8 %519, ptr %6, align 1, !tbaa !9
  %520 = load ptr, ptr %43, align 8, !tbaa !5
  %521 = load ptr, ptr %5, align 8, !tbaa !5
  %522 = icmp eq ptr %520, %521
  br i1 %522, label %523, label %529

523:                                              ; preds = %511
  %524 = load ptr, ptr %5, align 8, !tbaa !5
  %525 = load ptr, ptr %4, align 8, !tbaa !5
  %526 = getelementptr inbounds %struct.typecheck_t, ptr %525, i32 0, i32 0
  %527 = load ptr, ptr %526, align 8, !tbaa !11
  %528 = getelementptr inbounds %struct.typecheck_frame_t, ptr %527, i32 0, i32 23
  store ptr %524, ptr %528, align 8, !tbaa !28
  br label %540

529:                                              ; preds = %511
  %530 = load ptr, ptr %44, align 8, !tbaa !5
  %531 = load ptr, ptr %5, align 8, !tbaa !5
  %532 = icmp eq ptr %530, %531
  br i1 %532, label %533, label %539

533:                                              ; preds = %529
  %534 = load ptr, ptr %5, align 8, !tbaa !5
  %535 = load ptr, ptr %4, align 8, !tbaa !5
  %536 = getelementptr inbounds %struct.typecheck_t, ptr %535, i32 0, i32 0
  %537 = load ptr, ptr %536, align 8, !tbaa !11
  %538 = getelementptr inbounds %struct.typecheck_frame_t, ptr %537, i32 0, i32 24
  store ptr %534, ptr %538, align 8, !tbaa !43
  br label %539

539:                                              ; preds = %533, %529
  br label %540

540:                                              ; preds = %539, %523
  store i32 3, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  br label %542

541:                                              ; preds = %204
  br label %542

542:                                              ; preds = %541, %540, %510, %466, %419, %372, %354, %339, %324, %291, %276, %225
  store i32 2, ptr %8, align 4
  br label %543

543:                                              ; preds = %542, %201
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #4
  %544 = load i32, ptr %8, align 4
  switch i32 %544, label %548 [
    i32 2, label %545
  ]

545:                                              ; preds = %543, %187, %183, %174, %165, %156, %132, %123, %114, %105, %87, %74, %62
  %546 = load i8, ptr %6, align 1, !tbaa !9, !range !33, !noundef !34
  %547 = trunc i8 %546 to i1
  store i1 %547, ptr %3, align 1
  store i32 1, ptr %8, align 4
  br label %548

548:                                              ; preds = %545, %543, %48
  call void @llvm.lifetime.end.p0(i64 1, ptr %6) #4
  %549 = load i1, ptr %3, align 1
  ret i1 %549
}

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

declare noalias ptr @ponyint_pool_alloc(i64 noundef) #2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #3

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

declare i32 @ast_id(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden zeroext i1 @push_frame(ptr noundef) #0

declare ptr @ast_parent(ptr noundef) #2

declare void @ast_get_children(ptr noundef, i64 noundef, ptr noundef) #2

declare ptr @ast_childidx(ptr noundef, i64 noundef) #2

declare ptr @ast_child(ptr noundef) #2

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { 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 = !{!12, !6, i64 0}
!12 = !{!"typecheck_t", !6, i64 0, !13, i64 8, !6, i64 40}
!13 = !{!"typecheck_stats_t", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24}
!14 = !{!"long", !7, i64 0}
!15 = !{!16, !6, i64 200}
!16 = !{!"typecheck_frame_t", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !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, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200}
!17 = !{!16, !6, i64 0}
!18 = !{!16, !6, i64 8}
!19 = !{!16, !6, i64 168}
!20 = !{!16, !6, i64 176}
!21 = !{!16, !6, i64 16}
!22 = !{!16, !6, i64 32}
!23 = !{!16, !6, i64 40}
!24 = !{!16, !6, i64 72}
!25 = !{!16, !6, i64 80}
!26 = !{!16, !6, i64 88}
!27 = !{!16, !6, i64 24}
!28 = !{!16, !6, i64 184}
!29 = !{!16, !6, i64 104}
!30 = !{!16, !6, i64 120}
!31 = !{!16, !6, i64 152}
!32 = !{!16, !6, i64 160}
!33 = !{i8 0, i8 2}
!34 = !{}
!35 = !{!16, !6, i64 64}
!36 = !{!16, !6, i64 56}
!37 = !{!16, !6, i64 48}
!38 = !{!16, !6, i64 112}
!39 = !{!16, !6, i64 96}
!40 = !{!16, !6, i64 128}
!41 = !{!16, !6, i64 136}
!42 = !{!16, !6, i64 144}
!43 = !{!16, !6, i64 192}


; 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"

; Function Attrs: nounwind uwtable
define dso_local zeroext i1 @frame_push(ptr noundef %0, ptr noundef %1) local_unnamed_addr #0 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca [4 x ptr], align 16
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca [8 x ptr], align 16
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca [4 x ptr], align 16
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca [3 x ptr], align 16
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca [4 x ptr], align 16
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca [4 x ptr], align 16
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca [5 x ptr], align 16
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca [4 x ptr], align 16
  %39 = icmp eq ptr %1, null
  br i1 %39, label %40, label %44

40:                                               ; preds = %2
  %41 = tail call noalias ptr @ponyint_pool_alloc(i64 noundef 3) #4
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(208) %41, i8 0, i64 200, i1 false)
  %42 = load ptr, ptr %0, align 8, !tbaa !5
  %43 = getelementptr inbounds i8, ptr %41, i64 200
  store ptr %42, ptr %43, align 8, !tbaa !12
  store ptr %41, ptr %0, align 8, !tbaa !5
  br label %238

44:                                               ; preds = %2
  %45 = tail call i32 @ast_id(ptr noundef nonnull %1) #4
  switch i32 %45, label %95 [
    i32 136, label %46
    i32 137, label %49
    i32 138, label %53
    i32 72, label %59
    i32 73, label %59
    i32 74, label %59
    i32 75, label %59
    i32 76, label %59
    i32 77, label %59
    i32 148, label %63
    i32 88, label %67
    i32 90, label %67
    i32 89, label %67
    i32 166, label %71
    i32 181, label %77
    i32 116, label %81
    i32 118, label %81
    i32 124, label %85
    i32 125, label %85
    i32 206, label %89
    i32 107, label %91
  ]

46:                                               ; preds = %44
  %47 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %48 = load ptr, ptr %0, align 8, !tbaa !5
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %48, i8 0, i64 16, i1 false)
  br label %238

49:                                               ; preds = %44
  %50 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %51 = load ptr, ptr %0, align 8, !tbaa !5
  store ptr %1, ptr %51, align 8, !tbaa !14
  %52 = getelementptr inbounds i8, ptr %51, i64 8
  store ptr null, ptr %52, align 8, !tbaa !15
  br label %238

53:                                               ; preds = %44
  %54 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %55 = load ptr, ptr %0, align 8, !tbaa !5
  %56 = getelementptr inbounds i8, ptr %55, i64 8
  store ptr %1, ptr %56, align 8, !tbaa !15
  %57 = getelementptr inbounds i8, ptr %55, i64 168
  store ptr null, ptr %57, align 8, !tbaa !16
  %58 = getelementptr inbounds i8, ptr %55, i64 176
  store ptr %1, ptr %58, align 8, !tbaa !17
  br label %238

59:                                               ; preds = %44, %44, %44, %44, %44, %44
  %60 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %61 = load ptr, ptr %0, align 8, !tbaa !5
  %62 = getelementptr inbounds i8, ptr %61, i64 16
  store ptr %1, ptr %62, align 8, !tbaa !18
  br label %238

63:                                               ; preds = %44
  %64 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %65 = load ptr, ptr %0, align 8, !tbaa !5
  %66 = getelementptr inbounds i8, ptr %65, i64 32
  store ptr %1, ptr %66, align 8, !tbaa !19
  br label %238

67:                                               ; preds = %44, %44, %44
  %68 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %69 = load ptr, ptr %0, align 8, !tbaa !5
  %70 = getelementptr inbounds i8, ptr %69, i64 40
  store ptr %1, ptr %70, align 8, !tbaa !20
  br label %238

71:                                               ; preds = %44
  %72 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %73 = load ptr, ptr %0, align 8, !tbaa !5
  %74 = getelementptr inbounds i8, ptr %73, i64 72
  %75 = getelementptr inbounds i8, ptr %73, i64 24
  store ptr null, ptr %75, align 8, !tbaa !21
  %76 = getelementptr inbounds i8, ptr %73, i64 184
  store ptr null, ptr %76, align 8, !tbaa !22
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %74, i8 0, i64 24, i1 false)
  br label %238

77:                                               ; preds = %44
  %78 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %79 = load ptr, ptr %0, align 8, !tbaa !5
  %80 = getelementptr inbounds i8, ptr %79, i64 104
  store ptr %1, ptr %80, align 8, !tbaa !23
  br label %238

81:                                               ; preds = %44, %44
  %82 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %83 = load ptr, ptr %0, align 8, !tbaa !5
  %84 = getelementptr inbounds i8, ptr %83, i64 120
  store ptr %1, ptr %84, align 8, !tbaa !24
  br label %238

85:                                               ; preds = %44, %44
  %86 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %87 = load ptr, ptr %0, align 8, !tbaa !5
  %88 = getelementptr inbounds i8, ptr %87, i64 152
  store ptr %1, ptr %88, align 8, !tbaa !25
  br label %238

89:                                               ; preds = %44
  %90 = tail call zeroext i1 @push_frame(ptr noundef %0)
  br label %238

91:                                               ; preds = %44
  %92 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %93 = load ptr, ptr %0, align 8, !tbaa !5
  %94 = getelementptr inbounds i8, ptr %93, i64 160
  store ptr %1, ptr %94, align 8, !tbaa !26
  br label %238

95:                                               ; preds = %44
  %96 = tail call ptr @ast_parent(ptr noundef nonnull %1) #4
  %.not.not = icmp eq ptr %96, null
  br i1 %.not.not, label %238, label %97

97:                                               ; preds = %95
  %98 = tail call i32 @ast_id(ptr noundef nonnull %96) #4
  switch i32 %98, label %238 [
    i32 163, label %99
    i32 88, label %110
    i32 90, label %110
    i32 89, label %110
    i32 166, label %130
    i32 165, label %138
    i32 84, label %151
    i32 85, label %151
    i32 181, label %158
    i32 81, label %165
    i32 116, label %175
    i32 118, label %191
    i32 109, label %207
    i32 110, label %225
  ]

99:                                               ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %6) #4
  store ptr %3, ptr %6, align 16, !tbaa !27
  %100 = getelementptr inbounds i8, ptr %6, i64 8
  store ptr %4, ptr %100, align 8, !tbaa !27
  %101 = getelementptr inbounds i8, ptr %6, i64 16
  store ptr %5, ptr %101, align 16, !tbaa !27
  %102 = getelementptr inbounds i8, ptr %6, i64 24
  store ptr null, ptr %102, align 8, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 3, ptr noundef nonnull %6) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %6) #4
  %103 = load ptr, ptr %4, align 8, !tbaa !27
  %104 = icmp eq ptr %103, %1
  br i1 %104, label %105, label %109

105:                                              ; preds = %99
  %106 = call zeroext i1 @push_frame(ptr noundef %0)
  %107 = load ptr, ptr %0, align 8, !tbaa !5
  %108 = getelementptr inbounds i8, ptr %107, i64 24
  store ptr %1, ptr %108, align 8, !tbaa !21
  br label %109

109:                                              ; preds = %105, %99
  %.0144 = phi i1 [ %106, %105 ], [ false, %99 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #4
  br label %238

110:                                              ; preds = %97, %97, %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #4
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %14) #4
  store ptr %7, ptr %14, align 16, !tbaa !27
  %111 = getelementptr inbounds i8, ptr %14, i64 8
  store ptr %8, ptr %111, align 8, !tbaa !27
  %112 = getelementptr inbounds i8, ptr %14, i64 16
  store ptr %9, ptr %112, align 16, !tbaa !27
  %113 = getelementptr inbounds i8, ptr %14, i64 24
  store ptr %10, ptr %113, align 8, !tbaa !27
  %114 = getelementptr inbounds i8, ptr %14, i64 32
  store ptr %11, ptr %114, align 16, !tbaa !27
  %115 = getelementptr inbounds i8, ptr %14, i64 40
  store ptr %12, ptr %115, align 8, !tbaa !27
  %116 = getelementptr inbounds i8, ptr %14, i64 48
  store ptr %13, ptr %116, align 16, !tbaa !27
  %117 = getelementptr inbounds i8, ptr %14, i64 56
  store ptr null, ptr %117, align 8, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 7, ptr noundef nonnull %14) #4
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %14) #4
  %118 = load ptr, ptr %10, align 8, !tbaa !27
  %119 = icmp eq ptr %118, %1
  br i1 %119, label %.sink.split, label %120

120:                                              ; preds = %110
  %121 = load ptr, ptr %11, align 8, !tbaa !27
  %122 = icmp eq ptr %121, %1
  br i1 %122, label %.sink.split, label %123

123:                                              ; preds = %120
  %124 = load ptr, ptr %13, align 8, !tbaa !27
  %125 = icmp eq ptr %124, %1
  br i1 %125, label %.sink.split, label %129

.sink.split:                                      ; preds = %123, %120, %110
  %.sink148 = phi i64 [ 64, %110 ], [ 72, %120 ], [ 56, %123 ]
  %126 = call zeroext i1 @push_frame(ptr noundef %0)
  %127 = load ptr, ptr %0, align 8, !tbaa !5
  %128 = getelementptr inbounds i8, ptr %127, i64 %.sink148
  store ptr %1, ptr %128, align 8, !tbaa !27
  br label %129

129:                                              ; preds = %.sink.split, %123
  %.1145.shrunk = phi i1 [ false, %123 ], [ %126, %.sink.split ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #4
  br label %238

130:                                              ; preds = %97
  %131 = tail call ptr @ast_parent(ptr noundef nonnull %96) #4
  %132 = tail call i32 @ast_id(ptr noundef %131) #4
  %133 = and i32 %132, -2
  %switch = icmp eq i32 %133, 142
  br i1 %switch, label %134, label %238

134:                                              ; preds = %130
  %135 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %136 = load ptr, ptr %0, align 8, !tbaa !5
  %137 = getelementptr inbounds i8, ptr %136, i64 80
  store ptr %1, ptr %137, align 8, !tbaa !28
  br label %238

138:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %15) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %17) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %18) #4
  store ptr %15, ptr %18, align 16, !tbaa !27
  %139 = getelementptr inbounds i8, ptr %18, i64 8
  store ptr %16, ptr %139, align 8, !tbaa !27
  %140 = getelementptr inbounds i8, ptr %18, i64 16
  store ptr %17, ptr %140, align 16, !tbaa !27
  %141 = getelementptr inbounds i8, ptr %18, i64 24
  store ptr null, ptr %141, align 8, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 3, ptr noundef nonnull %18) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %18) #4
  %142 = load ptr, ptr %16, align 8, !tbaa !27
  %143 = icmp eq ptr %142, %1
  br i1 %143, label %.sink.split149, label %144

144:                                              ; preds = %138
  %145 = load ptr, ptr %17, align 8, !tbaa !27
  %146 = icmp eq ptr %145, %1
  br i1 %146, label %.sink.split149, label %150

.sink.split149:                                   ; preds = %144, %138
  %.sink151 = phi i64 [ 88, %138 ], [ 48, %144 ]
  %147 = call zeroext i1 @push_frame(ptr noundef %0)
  %148 = load ptr, ptr %0, align 8, !tbaa !5
  %149 = getelementptr inbounds i8, ptr %148, i64 %.sink151
  store ptr %1, ptr %149, align 8, !tbaa !27
  br label %150

150:                                              ; preds = %.sink.split149, %144
  %.2.shrunk = phi i1 [ false, %144 ], [ %147, %.sink.split149 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #4
  br label %238

151:                                              ; preds = %97, %97
  %152 = tail call ptr @ast_childidx(ptr noundef nonnull %96, i64 noundef 1) #4
  %153 = icmp eq ptr %152, %1
  br i1 %153, label %154, label %238

154:                                              ; preds = %151
  %155 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %156 = load ptr, ptr %0, align 8, !tbaa !5
  %157 = getelementptr inbounds i8, ptr %156, i64 88
  store ptr %1, ptr %157, align 8, !tbaa !29
  br label %238

158:                                              ; preds = %97
  %159 = tail call ptr @ast_child(ptr noundef nonnull %96) #4
  %160 = icmp eq ptr %159, %1
  br i1 %160, label %161, label %238

161:                                              ; preds = %158
  %162 = tail call zeroext i1 @push_frame(ptr noundef %0)
  %163 = load ptr, ptr %0, align 8, !tbaa !5
  %164 = getelementptr inbounds i8, ptr %163, i64 112
  store ptr %1, ptr %164, align 8, !tbaa !30
  br label %238

165:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %19) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %20) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %21) #4
  store ptr %19, ptr %21, align 16, !tbaa !27
  %166 = getelementptr inbounds i8, ptr %21, i64 8
  store ptr %20, ptr %166, align 8, !tbaa !27
  %167 = getelementptr inbounds i8, ptr %21, i64 16
  store ptr null, ptr %167, align 16, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 2, ptr noundef nonnull %21) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %21) #4
  %168 = load ptr, ptr %20, align 8, !tbaa !27
  %169 = icmp eq ptr %168, %1
  br i1 %169, label %170, label %174

170:                                              ; preds = %165
  %171 = call zeroext i1 @push_frame(ptr noundef %0)
  %172 = load ptr, ptr %0, align 8, !tbaa !5
  %173 = getelementptr inbounds i8, ptr %172, i64 96
  store ptr %1, ptr %173, align 8, !tbaa !31
  br label %174

174:                                              ; preds = %170, %165
  %.3 = phi i1 [ %171, %170 ], [ false, %165 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #4
  br label %238

175:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %22) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %23) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %24) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %25) #4
  store ptr %22, ptr %25, align 16, !tbaa !27
  %176 = getelementptr inbounds i8, ptr %25, i64 8
  store ptr %23, ptr %176, align 8, !tbaa !27
  %177 = getelementptr inbounds i8, ptr %25, i64 16
  store ptr %24, ptr %177, align 16, !tbaa !27
  %178 = getelementptr inbounds i8, ptr %25, i64 24
  store ptr null, ptr %178, align 8, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 3, ptr noundef nonnull %25) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %25) #4
  %179 = load ptr, ptr %22, align 8, !tbaa !27
  %180 = icmp eq ptr %179, %1
  br i1 %180, label %.sink.split152, label %181

181:                                              ; preds = %175
  %182 = load ptr, ptr %23, align 8, !tbaa !27
  %183 = icmp eq ptr %182, %1
  br i1 %183, label %.sink.split152, label %184

184:                                              ; preds = %181
  %185 = load ptr, ptr %24, align 8, !tbaa !27
  %186 = icmp eq ptr %185, %1
  br i1 %186, label %.sink.split152, label %190

.sink.split152:                                   ; preds = %184, %181, %175
  %.sink154 = phi i64 [ 128, %175 ], [ 136, %181 ], [ 144, %184 ]
  %187 = call zeroext i1 @push_frame(ptr noundef %0)
  %188 = load ptr, ptr %0, align 8, !tbaa !5
  %189 = getelementptr inbounds i8, ptr %188, i64 %.sink154
  store ptr %1, ptr %189, align 8, !tbaa !27
  br label %190

190:                                              ; preds = %.sink.split152, %184
  %.4.shrunk = phi i1 [ false, %184 ], [ %187, %.sink.split152 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %24) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %22) #4
  br label %238

191:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %26) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %27) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %28) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %29) #4
  store ptr %26, ptr %29, align 16, !tbaa !27
  %192 = getelementptr inbounds i8, ptr %29, i64 8
  store ptr %27, ptr %192, align 8, !tbaa !27
  %193 = getelementptr inbounds i8, ptr %29, i64 16
  store ptr %28, ptr %193, align 16, !tbaa !27
  %194 = getelementptr inbounds i8, ptr %29, i64 24
  store ptr null, ptr %194, align 8, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 3, ptr noundef nonnull %29) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %29) #4
  %195 = load ptr, ptr %26, align 8, !tbaa !27
  %196 = icmp eq ptr %195, %1
  br i1 %196, label %.sink.split155, label %197

197:                                              ; preds = %191
  %198 = load ptr, ptr %27, align 8, !tbaa !27
  %199 = icmp eq ptr %198, %1
  br i1 %199, label %.sink.split155, label %200

200:                                              ; preds = %197
  %201 = load ptr, ptr %28, align 8, !tbaa !27
  %202 = icmp eq ptr %201, %1
  br i1 %202, label %.sink.split155, label %206

.sink.split155:                                   ; preds = %200, %197, %191
  %.sink157 = phi i64 [ 136, %191 ], [ 128, %197 ], [ 144, %200 ]
  %203 = call zeroext i1 @push_frame(ptr noundef %0)
  %204 = load ptr, ptr %0, align 8, !tbaa !5
  %205 = getelementptr inbounds i8, ptr %204, i64 %.sink157
  store ptr %1, ptr %205, align 8, !tbaa !27
  br label %206

206:                                              ; preds = %.sink.split155, %200
  %.5.shrunk = phi i1 [ false, %200 ], [ %203, %.sink.split155 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %28) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %26) #4
  br label %238

207:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %30) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %31) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %32) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %33) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %34) #4
  store ptr %30, ptr %34, align 16, !tbaa !27
  %208 = getelementptr inbounds i8, ptr %34, i64 8
  store ptr %31, ptr %208, align 8, !tbaa !27
  %209 = getelementptr inbounds i8, ptr %34, i64 16
  store ptr %32, ptr %209, align 16, !tbaa !27
  %210 = getelementptr inbounds i8, ptr %34, i64 24
  store ptr %33, ptr %210, align 8, !tbaa !27
  %211 = getelementptr inbounds i8, ptr %34, i64 32
  store ptr null, ptr %211, align 16, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 4, ptr noundef nonnull %34) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %34) #4
  %212 = load ptr, ptr %31, align 8, !tbaa !27
  %213 = icmp eq ptr %212, %1
  br i1 %213, label %214, label %216

214:                                              ; preds = %207
  %215 = call zeroext i1 @push_frame(ptr noundef %0)
  br label %.sink.split158

216:                                              ; preds = %207
  %217 = load ptr, ptr %32, align 8, !tbaa !27
  %218 = icmp eq ptr %217, %1
  br i1 %218, label %219, label %224

219:                                              ; preds = %216
  %220 = call zeroext i1 @push_frame(ptr noundef %0)
  br label %.sink.split158

.sink.split158:                                   ; preds = %214, %219
  %.sink165.in = phi ptr [ %30, %214 ], [ %33, %219 ]
  %.sink.in = phi ptr [ %31, %214 ], [ %32, %219 ]
  %.6.shrunk.ph = phi i1 [ %215, %214 ], [ %220, %219 ]
  %.sink165 = load ptr, ptr %.sink165.in, align 8, !tbaa !27
  %221 = load ptr, ptr %0, align 8, !tbaa !5
  %222 = getelementptr inbounds i8, ptr %221, i64 168
  store ptr %.sink165, ptr %222, align 8, !tbaa !16
  %.sink = load ptr, ptr %.sink.in, align 8, !tbaa !27
  %223 = getelementptr inbounds i8, ptr %221, i64 176
  store ptr %.sink, ptr %223, align 8, !tbaa !17
  br label %224

224:                                              ; preds = %.sink.split158, %216
  %.6.shrunk = phi i1 [ false, %216 ], [ %.6.shrunk.ph, %.sink.split158 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %33) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %32) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %31) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %30) #4
  br label %238

225:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %36) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %37) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %38) #4
  store ptr %35, ptr %38, align 16, !tbaa !27
  %226 = getelementptr inbounds i8, ptr %38, i64 8
  store ptr %36, ptr %226, align 8, !tbaa !27
  %227 = getelementptr inbounds i8, ptr %38, i64 16
  store ptr %37, ptr %227, align 16, !tbaa !27
  %228 = getelementptr inbounds i8, ptr %38, i64 24
  store ptr null, ptr %228, align 8, !tbaa !27
  call void @ast_get_children(ptr noundef nonnull %96, i64 noundef 3, ptr noundef nonnull %38) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %38) #4
  %229 = call zeroext i1 @push_frame(ptr noundef %0)
  %230 = load ptr, ptr %36, align 8, !tbaa !27
  %231 = icmp eq ptr %230, %1
  br i1 %231, label %.sink.split161, label %232

232:                                              ; preds = %225
  %233 = load ptr, ptr %37, align 8, !tbaa !27
  %234 = icmp eq ptr %233, %1
  br i1 %234, label %.sink.split161, label %237

.sink.split161:                                   ; preds = %232, %225
  %.sink164 = phi i64 [ 184, %225 ], [ 192, %232 ]
  %235 = load ptr, ptr %0, align 8, !tbaa !5
  %236 = getelementptr inbounds i8, ptr %235, i64 %.sink164
  store ptr %1, ptr %236, align 8, !tbaa !27
  br label %237

237:                                              ; preds = %.sink.split161, %232
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %37) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #4
  br label %238

238:                                              ; preds = %95, %130, %97, %158, %161, %151, %154, %134, %237, %224, %206, %190, %174, %150, %129, %109, %46, %49, %53, %59, %63, %67, %71, %77, %81, %85, %89, %91, %40
  %.1 = phi i1 [ true, %40 ], [ %92, %91 ], [ %90, %89 ], [ %86, %85 ], [ %82, %81 ], [ %78, %77 ], [ %72, %71 ], [ %68, %67 ], [ %64, %63 ], [ %60, %59 ], [ %54, %53 ], [ %50, %49 ], [ %47, %46 ], [ false, %95 ], [ false, %97 ], [ %229, %237 ], [ %.6.shrunk, %224 ], [ %.5.shrunk, %206 ], [ %.4.shrunk, %190 ], [ %.3, %174 ], [ %162, %161 ], [ false, %158 ], [ %155, %154 ], [ false, %151 ], [ %.2.shrunk, %150 ], [ false, %130 ], [ %135, %134 ], [ %.1145.shrunk, %129 ], [ %.0144, %109 ]
  ret i1 %.1
}

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

declare noalias ptr @ponyint_pool_alloc(i64 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #3

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

declare i32 @ast_id(ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden zeroext i1 @push_frame(ptr noundef) local_unnamed_addr #0

declare ptr @ast_parent(ptr noundef) local_unnamed_addr #2

declare void @ast_get_children(ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #2

declare ptr @ast_childidx(ptr noundef, i64 noundef) local_unnamed_addr #2

declare ptr @ast_child(ptr noundef) local_unnamed_addr #2

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { 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, !7, i64 0}
!6 = !{!"typecheck_t", !7, i64 0, !10, i64 8, !7, i64 40}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"typecheck_stats_t", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24}
!11 = !{!"long", !8, i64 0}
!12 = !{!13, !7, i64 200}
!13 = !{!"typecheck_frame_t", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136, !7, i64 144, !7, i64 152, !7, i64 160, !7, i64 168, !7, i64 176, !7, i64 184, !7, i64 192, !7, i64 200}
!14 = !{!13, !7, i64 0}
!15 = !{!13, !7, i64 8}
!16 = !{!13, !7, i64 168}
!17 = !{!13, !7, i64 176}
!18 = !{!13, !7, i64 16}
!19 = !{!13, !7, i64 32}
!20 = !{!13, !7, i64 40}
!21 = !{!13, !7, i64 24}
!22 = !{!13, !7, i64 184}
!23 = !{!13, !7, i64 104}
!24 = !{!13, !7, i64 120}
!25 = !{!13, !7, i64 152}
!26 = !{!13, !7, i64 160}
!27 = !{!7, !7, i64 0}
!28 = !{!13, !7, i64 80}
!29 = !{!13, !7, i64 88}
!30 = !{!13, !7, i64 112}
!31 = !{!13, !7, i64 96}


; Effective O3 passes: CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,MemCpyOptPass,SROAPass,SimplifyCFGPass,TailCallElimPass