; LLVM IR from nickmqb/muon :: bootstrap/mu.ll_TypeChecker (resolveType__)

; 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.string__ = type { ptr, i32 }
%struct.tag_____IAllocator__ = type { ptr, ptr, ptr, ptr }
%struct.tag_____Error__ = type { ptr, %struct.tag_____IntRange__, %struct.string__ }
%struct.tag_____IntRange__ = type { i32, i32 }
%struct.tag_____CustomSet__Ptr__Array__Tag________ = type { %struct.tag_____Array__SetEntry__Ptr__Array__Tag__________, i32, i32, i32, ptr, ptr }
%struct.tag_____Array__SetEntry__Ptr__Array__Tag__________ = type { ptr, i32 }
%struct.tag_____Tag__ = type { ptr, ptr }
%struct.Node__ = type { i32, ptr }
%struct.tag_____List__Ptr__Namespace______ = type { ptr, i32, i32 }
%struct.tag_____Namespace__ = type { %struct.string__, ptr, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32 }
%struct.tag_____StringBuilder__ = type { ptr, i32, i32 }
%struct.tag_____Array__Tag____ = type { ptr, i32 }
%struct.tag_____TypeArgsExpression__ = type { %struct.Node__, ptr, ptr, ptr, ptr }
%struct.tag_____TypeModifierExpression__ = type { ptr, %struct.Node__ }
%struct.tag_____Token__ = type { i32, %struct.string__, %struct.tag_____IntRange__, %struct.tag_____IntRange__, i32 }
%struct.tag_____UnaryOperatorExpression__ = type { ptr, %struct.Node__ }
%struct.tag_____TypeCheckerContext__ = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, ptr, i32, i8 }
%struct.tag_____CommonTags__ = type { %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, %struct.tag_____Tag__, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.tag_____FunctionDef__ = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, %struct.Node__, ptr, ptr, ptr, ptr, i32, ptr, %struct.string__, %struct.string__, %struct.tag_____Tag__, i32, ptr, ptr, ptr, ptr, %struct.string__ }
%struct.tag_____List__Node____ = type { ptr, i32, i32 }

@mu_____string160 = external dso_local global %struct.string__, align 8
@mu_____string75 = external dso_local global %struct.string__, align 8
@mu_____string169 = external dso_local global %struct.string__, align 8
@mu_____string166 = external dso_local global %struct.string__, align 8
@mu_____string165 = external dso_local global %struct.string__, align 8
@mu_____string164 = external dso_local global %struct.string__, align 8
@mu_____string74 = external dso_local global %struct.string__, align 8
@mu_____string163 = external dso_local global %struct.string__, align 8
@top_____currentAllocator__ = external dso_local thread_local global %struct.tag_____IAllocator__, align 8
@top_____abandonFn__ = external dso_local thread_local global ptr, align 8
@__const.TypeChecker__resolveType__.local19 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local21 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local24 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local26 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local52 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local53 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local54 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local63 = external hidden unnamed_addr constant %struct.string__, align 8

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @StringBuilder__write__(ptr noundef, ptr, i32) #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, i32 } @StringBuilder__compactToString__(ptr noundef) #4

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @string__equals__(ptr, i32, ptr, i32) #4

; Function Attrs: nounwind uwtable
declare dso_local void @int__writeTo__(i32 noundef, ptr noundef) #4

; Function Attrs: nounwind uwtable
declare dso_local void @List__add__Error____(ptr noundef, ptr noundef byval(%struct.tag_____Error__) align 8) #4

; Function Attrs: nounwind uwtable
declare dso_local void @Error__at__(ptr dead_on_unwind noalias writable sret(%struct.tag_____Error__) align 8, ptr noundef, i64, ptr, i32) #4

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @TypeCheckerFirstPass__isSingleUppercaseLetter__(ptr, i32) #4

; Function Attrs: nounwind uwtable
declare dso_local ptr @TypeChecker__findTypeParamByNameOrNull__(ptr noundef, ptr, i32) #4

; Function Attrs: nounwind uwtable
declare dso_local void @List__add__Ptr__Namespace______(ptr noundef, ptr noundef) #4

; Function Attrs: nounwind uwtable
declare dso_local { i32, ptr } @Map__getOrDefault__string__Node____(ptr noundef, ptr, i32) #4

; Function Attrs: nounwind uwtable
declare dso_local i64 @RangeFinder__find__(i32, ptr) #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, ptr } @TypeChecker__getSingleArgTag__(ptr noundef, ptr, ptr) #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, i32 } @Tag__toString__(ptr, ptr) #4

; Function Attrs: nounwind uwtable
declare dso_local void @Tag__createArgsSet__(ptr dead_on_unwind noalias writable sret(%struct.tag_____CustomSet__Ptr__Array__Tag________) align 8) #4

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %1, ptr %2, i32 noundef %3) #4 {
  %5 = alloca %struct.tag_____Tag__, align 8
  %6 = alloca %struct.Node__, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca %struct.Node__, align 8
  %10 = alloca ptr, align 8
  %11 = alloca %struct.Node__, align 8
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca %struct.Node__, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i8, align 1
  %17 = alloca i8, align 1
  %18 = alloca %struct.Node__, align 8
  %19 = alloca %struct.Node__, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca %struct.Node__, align 8
  %26 = alloca %struct.Node__, align 8
  %27 = alloca ptr, align 8
  %28 = alloca i8, align 1
  %29 = alloca i8, align 1
  %30 = alloca i8, align 1
  %31 = alloca i8, align 1
  %32 = alloca ptr, align 8
  %33 = alloca %struct.tag_____List__Ptr__Namespace______, align 8
  %34 = alloca ptr, align 8
  %35 = alloca %struct.tag_____CustomSet__Ptr__Array__Tag________, align 8
  %36 = alloca ptr, align 8
  %37 = alloca %struct.tag_____Namespace__, align 8
  %38 = alloca i8, align 1
  %39 = alloca %struct.tag_____StringBuilder__, align 8
  %40 = alloca %struct.string__, align 8
  %41 = alloca %struct.tag_____Error__, align 8
  %42 = alloca %struct.string__, align 8
  %43 = alloca %struct.tag_____StringBuilder__, align 8
  %44 = alloca %struct.string__, align 8
  %45 = alloca %struct.tag_____Error__, align 8
  %46 = alloca %struct.string__, align 8
  %47 = alloca %struct.tag_____Tag__, align 8
  %48 = alloca i32, align 4
  %49 = alloca %struct.tag_____StringBuilder__, align 8
  %50 = alloca %struct.string__, align 8
  %51 = alloca %struct.tag_____Error__, align 8
  %52 = alloca %struct.string__, align 8
  %53 = alloca %struct.tag_____StringBuilder__, align 8
  %54 = alloca %struct.string__, align 8
  %55 = alloca %struct.tag_____Error__, align 8
  %56 = alloca %struct.string__, align 8
  %57 = alloca ptr, align 8
  %58 = alloca i32, align 4
  %59 = alloca %struct.Node__, align 8
  %60 = alloca %struct.tag_____Tag__, align 8
  %61 = alloca %struct.tag_____Tag__, align 8
  %62 = alloca %struct.tag_____Error__, align 8
  %63 = alloca %struct.tag_____IntRange__, align 4
  %64 = alloca i8, align 1
  %65 = alloca %struct.tag_____Error__, align 8
  %66 = alloca %struct.Node__, align 8
  %67 = alloca %struct.tag_____Error__, align 8
  %68 = alloca ptr, align 8
  %69 = alloca i32, align 4
  %70 = alloca %struct.Node__, align 8
  %71 = alloca %struct.tag_____Tag__, align 8
  %72 = alloca i32, align 4
  %73 = alloca i32, align 4
  %74 = alloca i32, align 4
  %75 = alloca i32, align 4
  %76 = alloca %struct.tag_____Tag__, align 8
  %77 = alloca ptr, align 8
  %78 = alloca %struct.tag_____Array__Tag____, align 8
  %79 = alloca %struct.tag_____Tag__, align 8
  %80 = alloca i32, align 4
  %81 = alloca ptr, align 8
  %82 = alloca i32, align 4
  %83 = alloca ptr, align 8
  %84 = alloca i32, align 4
  %85 = alloca %struct.tag_____Tag__, align 8
  %86 = alloca ptr, align 8
  %87 = alloca i32, align 4
  %88 = alloca ptr, align 8
  %89 = alloca i32, align 4
  %90 = alloca %struct.tag_____Tag__, align 8
  %91 = alloca %struct.tag_____Error__, align 8
  %92 = alloca %struct.tag_____Tag__, align 8
  %93 = alloca %struct.tag_____Tag__, align 8
  %94 = alloca i8, align 1
  %95 = alloca %struct.tag_____StringBuilder__, align 8
  %96 = alloca %struct.string__, align 8
  %97 = alloca %struct.string__, align 8
  %98 = alloca %struct.string__, align 8
  %99 = alloca %struct.tag_____Error__, align 8
  %100 = alloca %struct.string__, align 8
  %101 = alloca %struct.tag_____Tag__, align 8
  %102 = alloca %struct.tag_____Tag__, align 8
  %103 = alloca ptr, align 8
  %104 = alloca %struct.tag_____Array__Tag____, align 8
  %105 = alloca ptr, align 8
  %106 = alloca i32, align 4
  %107 = alloca %struct.Node__, align 8
  %108 = alloca %struct.tag_____Tag__, align 8
  %109 = alloca ptr, align 8
  %110 = alloca i32, align 4
  %111 = alloca ptr, align 8
  %112 = alloca i32, align 4
  %113 = alloca %struct.Node__, align 8
  %114 = alloca %struct.tag_____Tag__, align 8
  %115 = alloca %struct.tag_____StringBuilder__, align 8
  %116 = alloca %struct.string__, align 8
  %117 = alloca %struct.string__, align 8
  %118 = alloca %struct.tag_____Tag__, align 8
  %119 = alloca %struct.tag_____Error__, align 8
  %120 = alloca %struct.tag_____IntRange__, align 4
  %121 = alloca %struct.string__, align 8
  %122 = alloca %struct.tag_____Error__, align 8
  %123 = alloca %struct.tag_____IntRange__, align 4
  %124 = getelementptr inbounds { i32, ptr }, ptr %6, i32 0, i32 0
  store i32 %1, ptr %124, align 8
  %125 = getelementptr inbounds { i32, ptr }, ptr %6, i32 0, i32 1
  store ptr %2, ptr %125, align 8
  store ptr %0, ptr %7, align 8, !tbaa !5
  store i32 %3, ptr %8, align 4, !tbaa !9
  %126 = getelementptr inbounds %struct.Node__, ptr %6, i32 0, i32 1
  %127 = load ptr, ptr %126, align 8, !tbaa !11
  %128 = icmp eq ptr %127, null
  br i1 %128, label %129, label %130

129:                                              ; preds = %4
  call void @llvm.memset.p0.i64(ptr align 8 %5, i8 0, i64 16, i1 false)
  br label %1287

130:                                              ; preds = %4
  call void @llvm.lifetime.start.p0(i64 16, ptr %9) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %9, ptr align 8 %6, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  store ptr null, ptr %10, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.Node__, ptr %6, i32 0, i32 0
  %132 = load i32, ptr %131, align 8, !tbaa !14
  %133 = icmp eq i32 %132, 4
  br i1 %133, label %134, label %146

134:                                              ; preds = %130
  call void @llvm.lifetime.start.p0(i64 16, ptr %11) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %11, ptr align 8 %6, i64 16, i1 false), !tbaa.struct !13
  %135 = getelementptr inbounds %struct.Node__, ptr %11, i32 0, i32 0
  %136 = load i32, ptr %135, align 8, !tbaa !14
  %137 = icmp eq i32 %136, 4
  br i1 %137, label %141, label %138

138:                                              ; preds = %134
  %139 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %140 = load ptr, ptr %139, align 8, !tbaa !5
  call void %140(i32 noundef -4)
  br label %141

141:                                              ; preds = %138, %134
  %142 = getelementptr inbounds %struct.Node__, ptr %11, i32 0, i32 1
  %143 = load ptr, ptr %142, align 8, !tbaa !11
  store ptr %143, ptr %10, align 8, !tbaa !5
  %144 = load ptr, ptr %10, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.tag_____TypeArgsExpression__, ptr %144, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %6, ptr align 8 %145, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.end.p0(i64 16, ptr %11) #5
  br label %146

146:                                              ; preds = %141, %130
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  store i32 0, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  store ptr null, ptr %13, align 8, !tbaa !5
  br label %147

147:                                              ; preds = %200, %146
  br label %148

148:                                              ; preds = %147
  %149 = getelementptr inbounds %struct.Node__, ptr %6, i32 0, i32 0
  %150 = load i32, ptr %149, align 8, !tbaa !14
  %151 = icmp eq i32 %150, 3
  br i1 %151, label %153, label %152

152:                                              ; preds = %148
  br label %203

153:                                              ; preds = %148
  call void @llvm.lifetime.start.p0(i64 16, ptr %14) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %14, ptr align 8 %6, i64 16, i1 false), !tbaa.struct !13
  %154 = getelementptr inbounds %struct.Node__, ptr %14, i32 0, i32 0
  %155 = load i32, ptr %154, align 8, !tbaa !14
  %156 = icmp eq i32 %155, 3
  br i1 %156, label %160, label %157

157:                                              ; preds = %153
  %158 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %159 = load ptr, ptr %158, align 8, !tbaa !5
  call void %159(i32 noundef -4)
  br label %160

160:                                              ; preds = %157, %153
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %161 = getelementptr inbounds %struct.Node__, ptr %14, i32 0, i32 1
  %162 = load ptr, ptr %161, align 8, !tbaa !11
  store ptr %162, ptr %15, align 8, !tbaa !5
  %163 = load ptr, ptr %15, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.tag_____TypeModifierExpression__, ptr %163, i32 0, i32 0
  %165 = load ptr, ptr %164, align 8, !tbaa !15
  %166 = getelementptr inbounds %struct.tag_____Token__, ptr %165, i32 0, i32 1
  %167 = getelementptr inbounds { ptr, i32 }, ptr %166, i32 0, i32 0
  %168 = load ptr, ptr %167, align 8
  %169 = getelementptr inbounds { ptr, i32 }, ptr %166, i32 0, i32 1
  %170 = load i32, ptr %169, align 8
  %171 = load ptr, ptr @mu_____string74, align 8
  %172 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string74, i32 0, i32 1), align 8
  %173 = call zeroext i8 @string__equals__(ptr %168, i32 %170, ptr %171, i32 %172)
  %174 = icmp ne i8 %173, 0
  br i1 %174, label %175, label %178

175:                                              ; preds = %160
  %176 = load i32, ptr %12, align 4, !tbaa !9
  %177 = add nsw i32 %176, 1
  store i32 %177, ptr %12, align 4, !tbaa !9
  br label %200

178:                                              ; preds = %160
  %179 = load ptr, ptr %15, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.tag_____TypeModifierExpression__, ptr %179, i32 0, i32 0
  %181 = load ptr, ptr %180, align 8, !tbaa !15
  %182 = getelementptr inbounds %struct.tag_____Token__, ptr %181, i32 0, i32 1
  %183 = getelementptr inbounds { ptr, i32 }, ptr %182, i32 0, i32 0
  %184 = load ptr, ptr %183, align 8
  %185 = getelementptr inbounds { ptr, i32 }, ptr %182, i32 0, i32 1
  %186 = load i32, ptr %185, align 8
  %187 = load ptr, ptr @mu_____string75, align 8
  %188 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string75, i32 0, i32 1), align 8
  %189 = call zeroext i8 @string__equals__(ptr %184, i32 %186, ptr %187, i32 %188)
  %190 = icmp ne i8 %189, 0
  br i1 %190, label %191, label %199

191:                                              ; preds = %178
  %192 = load i32, ptr %12, align 4, !tbaa !9
  %193 = sub nsw i32 %192, 1
  store i32 %193, ptr %12, align 4, !tbaa !9
  %194 = load ptr, ptr %13, align 8, !tbaa !5
  %195 = icmp eq ptr %194, null
  br i1 %195, label %196, label %198

196:                                              ; preds = %191
  %197 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %197, ptr %13, align 8, !tbaa !5
  br label %198

198:                                              ; preds = %196, %191
  br label %199

199:                                              ; preds = %198, %178
  br label %200

200:                                              ; preds = %199, %175
  %201 = load ptr, ptr %15, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.tag_____TypeModifierExpression__, ptr %201, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %6, ptr align 8 %202, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %14) #5
  br label %147

203:                                              ; preds = %152
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #5
  store i8 0, ptr %16, align 1, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #5
  %204 = getelementptr inbounds %struct.Node__, ptr %6, i32 0, i32 0
  %205 = load i32, ptr %204, align 8, !tbaa !14
  %206 = icmp eq i32 %205, 9
  %207 = zext i1 %206 to i32
  %208 = trunc i32 %207 to i8
  store i8 %208, ptr %17, align 1, !tbaa !17
  %209 = load i8, ptr %17, align 1, !tbaa !17
  %210 = icmp ne i8 %209, 0
  br i1 %210, label %211, label %231

211:                                              ; preds = %203
  call void @llvm.lifetime.start.p0(i64 16, ptr %18) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %18, ptr align 8 %6, i64 16, i1 false), !tbaa.struct !13
  %212 = getelementptr inbounds %struct.Node__, ptr %18, i32 0, i32 0
  %213 = load i32, ptr %212, align 8, !tbaa !14
  %214 = icmp eq i32 %213, 9
  br i1 %214, label %218, label %215

215:                                              ; preds = %211
  %216 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %217 = load ptr, ptr %216, align 8, !tbaa !5
  call void %217(i32 noundef -4)
  br label %218

218:                                              ; preds = %215, %211
  %219 = getelementptr inbounds %struct.Node__, ptr %18, i32 0, i32 1
  %220 = load ptr, ptr %219, align 8, !tbaa !11
  %221 = getelementptr inbounds %struct.tag_____UnaryOperatorExpression__, ptr %220, i32 0, i32 0
  %222 = load ptr, ptr %221, align 8, !tbaa !18
  %223 = getelementptr inbounds %struct.tag_____Token__, ptr %222, i32 0, i32 1
  %224 = getelementptr inbounds { ptr, i32 }, ptr %223, i32 0, i32 0
  %225 = load ptr, ptr %224, align 8
  %226 = getelementptr inbounds { ptr, i32 }, ptr %223, i32 0, i32 1
  %227 = load i32, ptr %226, align 8
  %228 = load ptr, ptr @mu_____string160, align 8
  %229 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string160, i32 0, i32 1), align 8
  %230 = call zeroext i8 @string__equals__(ptr %225, i32 %227, ptr %228, i32 %229)
  store i8 %230, ptr %17, align 1, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 16, ptr %18) #5
  br label %231

231:                                              ; preds = %218, %203
  %232 = load i8, ptr %17, align 1, !tbaa !17
  %233 = icmp ne i8 %232, 0
  br i1 %233, label %234, label %246

234:                                              ; preds = %231
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %19, ptr align 8 %6, i64 16, i1 false), !tbaa.struct !13
  %235 = getelementptr inbounds %struct.Node__, ptr %19, i32 0, i32 0
  %236 = load i32, ptr %235, align 8, !tbaa !14
  %237 = icmp eq i32 %236, 9
  br i1 %237, label %241, label %238

238:                                              ; preds = %234
  %239 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %240 = load ptr, ptr %239, align 8, !tbaa !5
  call void %240(i32 noundef -4)
  br label %241

241:                                              ; preds = %238, %234
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  %242 = getelementptr inbounds %struct.Node__, ptr %19, i32 0, i32 1
  %243 = load ptr, ptr %242, align 8, !tbaa !11
  store ptr %243, ptr %20, align 8, !tbaa !5
  store i8 1, ptr %16, align 1, !tbaa !17
  %244 = load ptr, ptr %20, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.tag_____UnaryOperatorExpression__, ptr %244, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %6, ptr align 8 %245, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #5
  br label %246

246:                                              ; preds = %241, %231
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  store ptr null, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  store ptr null, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  store ptr null, ptr %23, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.Node__, ptr %6, i32 0, i32 0
  %248 = load i32, ptr %247, align 8, !tbaa !14
  switch i32 %248, label %678 [
    i32 21, label %249
    i32 0, label %693
  ]

249:                                              ; preds = %246
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  %250 = getelementptr inbounds %struct.Node__, ptr %6, i32 0, i32 1
  %251 = load ptr, ptr %250, align 8, !tbaa !11
  store ptr %251, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #5
  %252 = load ptr, ptr %7, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %252, i32 0, i32 3
  %254 = load ptr, ptr %253, align 8, !tbaa !20
  %255 = getelementptr inbounds %struct.tag_____Namespace__, ptr %254, i32 0, i32 4
  %256 = load ptr, ptr %255, align 8, !tbaa !22
  %257 = load ptr, ptr %24, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.tag_____Token__, ptr %257, i32 0, i32 1
  %259 = getelementptr inbounds { ptr, i32 }, ptr %258, i32 0, i32 0
  %260 = load ptr, ptr %259, align 8
  %261 = getelementptr inbounds { ptr, i32 }, ptr %258, i32 0, i32 1
  %262 = load i32, ptr %261, align 8
  %263 = call { i32, ptr } @Map__getOrDefault__string__Node____(ptr noundef %256, ptr %260, i32 %262)
  %264 = getelementptr inbounds { i32, ptr }, ptr %25, i32 0, i32 0
  %265 = extractvalue { i32, ptr } %263, 0
  store i32 %265, ptr %264, align 8
  %266 = getelementptr inbounds { i32, ptr }, ptr %25, i32 0, i32 1
  %267 = extractvalue { i32, ptr } %263, 1
  store ptr %267, ptr %266, align 8
  %268 = getelementptr inbounds %struct.Node__, ptr %25, i32 0, i32 0
  %269 = load i32, ptr %268, align 8, !tbaa !14
  %270 = icmp eq i32 %269, 22
  br i1 %270, label %271, label %307

271:                                              ; preds = %249
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %26, ptr align 8 %25, i64 16, i1 false), !tbaa.struct !13
  %272 = getelementptr inbounds %struct.Node__, ptr %26, i32 0, i32 0
  %273 = load i32, ptr %272, align 8, !tbaa !14
  %274 = icmp eq i32 %273, 22
  br i1 %274, label %278, label %275

275:                                              ; preds = %271
  %276 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %277 = load ptr, ptr %276, align 8, !tbaa !5
  call void %277(i32 noundef -4)
  br label %278

278:                                              ; preds = %275, %271
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  %279 = getelementptr inbounds %struct.Node__, ptr %26, i32 0, i32 1
  %280 = load ptr, ptr %279, align 8, !tbaa !11
  store ptr %280, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %28) #5
  %281 = load ptr, ptr %27, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.tag_____Namespace__, ptr %281, i32 0, i32 3
  %283 = load i32, ptr %282, align 4, !tbaa !25
  %284 = and i32 %283, 223741
  %285 = icmp ne i32 %284, 0
  %286 = zext i1 %285 to i32
  %287 = trunc i32 %286 to i8
  store i8 %287, ptr %28, align 1, !tbaa !17
  %288 = load i8, ptr %28, align 1, !tbaa !17
  %289 = icmp ne i8 %288, 0
  br i1 %289, label %301, label %290

290:                                              ; preds = %278
  %291 = load ptr, ptr %27, align 8, !tbaa !5
  %292 = load ptr, ptr %7, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %292, i32 0, i32 4
  %294 = load ptr, ptr %293, align 8, !tbaa !26
  %295 = getelementptr inbounds %struct.tag_____CommonTags__, ptr %294, i32 0, i32 0
  %296 = getelementptr inbounds %struct.tag_____Tag__, ptr %295, i32 0, i32 0
  %297 = load ptr, ptr %296, align 8, !tbaa !27
  %298 = icmp eq ptr %291, %297
  %299 = zext i1 %298 to i32
  %300 = trunc i32 %299 to i8
  store i8 %300, ptr %28, align 1, !tbaa !17
  br label %301

301:                                              ; preds = %290, %278
  %302 = load i8, ptr %28, align 1, !tbaa !17
  %303 = icmp ne i8 %302, 0
  br i1 %303, label %304, label %306

304:                                              ; preds = %301
  %305 = load ptr, ptr %27, align 8, !tbaa !5
  store ptr %305, ptr %21, align 8, !tbaa !5
  br label %306

306:                                              ; preds = %304, %301
  call void @llvm.lifetime.end.p0(i64 1, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #5
  br label %307

307:                                              ; preds = %306, %249
  %308 = load ptr, ptr %10, align 8, !tbaa !5
  %309 = icmp eq ptr %308, null
  br i1 %309, label %310, label %551

310:                                              ; preds = %307
  call void @llvm.lifetime.start.p0(i64 1, ptr %29) #5
  %311 = load ptr, ptr %21, align 8, !tbaa !5
  %312 = icmp eq ptr %311, null
  %313 = zext i1 %312 to i32
  %314 = trunc i32 %313 to i8
  store i8 %314, ptr %29, align 1, !tbaa !17
  %315 = load i8, ptr %29, align 1, !tbaa !17
  %316 = icmp ne i8 %315, 0
  br i1 %316, label %317, label %323

317:                                              ; preds = %310
  %318 = load i8, ptr %16, align 1, !tbaa !17
  %319 = icmp ne i8 %318, 0
  %320 = xor i1 %319, true
  %321 = zext i1 %320 to i32
  %322 = trunc i32 %321 to i8
  store i8 %322, ptr %29, align 1, !tbaa !17
  br label %323

323:                                              ; preds = %317, %310
  %324 = load i8, ptr %29, align 1, !tbaa !17
  %325 = icmp ne i8 %324, 0
  br i1 %325, label %326, label %469

326:                                              ; preds = %323
  %327 = load ptr, ptr %7, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %327, i32 0, i32 7
  %329 = load ptr, ptr %328, align 8, !tbaa !30
  %330 = icmp ne ptr %329, null
  br i1 %330, label %331, label %434

331:                                              ; preds = %326
  %332 = load ptr, ptr %7, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %332, i32 0, i32 7
  %334 = load ptr, ptr %333, align 8, !tbaa !30
  %335 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %334, i32 0, i32 13
  %336 = load ptr, ptr %335, align 8, !tbaa !31
  %337 = icmp ne ptr %336, null
  br i1 %337, label %338, label %351

338:                                              ; preds = %331
  %339 = load ptr, ptr %7, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %339, i32 0, i32 7
  %341 = load ptr, ptr %340, align 8, !tbaa !30
  %342 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %341, i32 0, i32 13
  %343 = load ptr, ptr %342, align 8, !tbaa !31
  %344 = load ptr, ptr %24, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.tag_____Token__, ptr %344, i32 0, i32 1
  %346 = getelementptr inbounds { ptr, i32 }, ptr %345, i32 0, i32 0
  %347 = load ptr, ptr %346, align 8
  %348 = getelementptr inbounds { ptr, i32 }, ptr %345, i32 0, i32 1
  %349 = load i32, ptr %348, align 8
  %350 = call ptr @TypeChecker__findTypeParamByNameOrNull__(ptr noundef %343, ptr %347, i32 %349)
  store ptr %350, ptr %21, align 8, !tbaa !5
  br label %351

351:                                              ; preds = %338, %331
  call void @llvm.lifetime.start.p0(i64 1, ptr %30) #5
  %352 = load ptr, ptr %21, align 8, !tbaa !5
  %353 = icmp eq ptr %352, null
  %354 = zext i1 %353 to i32
  %355 = trunc i32 %354 to i8
  store i8 %355, ptr %30, align 1, !tbaa !17
  %356 = load i8, ptr %30, align 1, !tbaa !17
  %357 = icmp ne i8 %356, 0
  br i1 %357, label %358, label %364

358:                                              ; preds = %351
  %359 = load i32, ptr %8, align 4, !tbaa !9
  %360 = and i32 %359, 2
  %361 = icmp ne i32 %360, 0
  %362 = zext i1 %361 to i32
  %363 = trunc i32 %362 to i8
  store i8 %363, ptr %30, align 1, !tbaa !17
  br label %364

364:                                              ; preds = %358, %351
  call void @llvm.lifetime.start.p0(i64 1, ptr %31) #5
  %365 = load i8, ptr %30, align 1, !tbaa !17
  store i8 %365, ptr %31, align 1, !tbaa !17
  %366 = load i8, ptr %31, align 1, !tbaa !17
  %367 = icmp ne i8 %366, 0
  br i1 %367, label %368, label %376

368:                                              ; preds = %364
  %369 = load ptr, ptr %24, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.tag_____Token__, ptr %369, i32 0, i32 1
  %371 = getelementptr inbounds { ptr, i32 }, ptr %370, i32 0, i32 0
  %372 = load ptr, ptr %371, align 8
  %373 = getelementptr inbounds { ptr, i32 }, ptr %370, i32 0, i32 1
  %374 = load i32, ptr %373, align 8
  %375 = call zeroext i8 @TypeCheckerFirstPass__isSingleUppercaseLetter__(ptr %372, i32 %374)
  store i8 %375, ptr %31, align 1, !tbaa !17
  br label %376

376:                                              ; preds = %368, %364
  %377 = load i8, ptr %31, align 1, !tbaa !17
  %378 = icmp ne i8 %377, 0
  br i1 %378, label %379, label %433

379:                                              ; preds = %376
  %380 = load ptr, ptr %7, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %380, i32 0, i32 7
  %382 = load ptr, ptr %381, align 8, !tbaa !30
  %383 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %382, i32 0, i32 13
  %384 = load ptr, ptr %383, align 8, !tbaa !31
  %385 = icmp eq ptr %384, null
  br i1 %385, label %386, label %413

386:                                              ; preds = %379
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #5
  %387 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %388 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %387, i32 0, i32 1
  %389 = load ptr, ptr %388, align 8, !tbaa !33
  %390 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %391 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %390, i32 0, i32 0
  %392 = load ptr, ptr %391, align 8, !tbaa !35
  %393 = call ptr %389(ptr noundef %392, i64 noundef 16)
  store ptr %393, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %33) #5
  call void @llvm.memset.p0.i64(ptr align 8 %33, i8 0, i64 16, i1 false)
  %394 = load ptr, ptr %32, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %394, ptr align 8 %33, i64 16, i1 false), !tbaa.struct !36
  %395 = load ptr, ptr %32, align 8, !tbaa !5
  %396 = load ptr, ptr %7, align 8, !tbaa !5
  %397 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %396, i32 0, i32 7
  %398 = load ptr, ptr %397, align 8, !tbaa !30
  %399 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %398, i32 0, i32 13
  store ptr %395, ptr %399, align 8, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  %400 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %401 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %400, i32 0, i32 1
  %402 = load ptr, ptr %401, align 8, !tbaa !33
  %403 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %404 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %403, i32 0, i32 0
  %405 = load ptr, ptr %404, align 8, !tbaa !35
  %406 = call ptr %402(ptr noundef %405, i64 noundef 48)
  store ptr %406, ptr %34, align 8, !tbaa !5
  %407 = load ptr, ptr %34, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 48, ptr %35) #5
  call void @Tag__createArgsSet__(ptr dead_on_unwind writable sret(%struct.tag_____CustomSet__Ptr__Array__Tag________) align 8 %35)
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %407, ptr align 8 %35, i64 48, i1 false), !tbaa.struct !37
  call void @llvm.lifetime.end.p0(i64 48, ptr %35) #5
  %408 = load ptr, ptr %34, align 8, !tbaa !5
  %409 = load ptr, ptr %7, align 8, !tbaa !5
  %410 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %409, i32 0, i32 7
  %411 = load ptr, ptr %410, align 8, !tbaa !30
  %412 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %411, i32 0, i32 18
  store ptr %408, ptr %412, align 8, !tbaa !38
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #5
  br label %413

413:                                              ; preds = %386, %379
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #5
  %414 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %415 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %414, i32 0, i32 1
  %416 = load ptr, ptr %415, align 8, !tbaa !33
  %417 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %418 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %417, i32 0, i32 0
  %419 = load ptr, ptr %418, align 8, !tbaa !35
  %420 = call ptr %416(ptr noundef %419, i64 noundef 112)
  store ptr %420, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 112, ptr %37) #5
  call void @llvm.memset.p0.i64(ptr align 8 %37, i8 0, i64 112, i1 false)
  %421 = getelementptr inbounds %struct.tag_____Namespace__, ptr %37, i32 0, i32 0
  %422 = load ptr, ptr %24, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.tag_____Token__, ptr %422, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %421, ptr align 8 %423, i64 16, i1 false), !tbaa.struct !39
  %424 = getelementptr inbounds %struct.tag_____Namespace__, ptr %37, i32 0, i32 3
  store i32 16384, ptr %424, align 4, !tbaa !25
  %425 = load ptr, ptr %36, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %425, ptr align 8 %37, i64 112, i1 false), !tbaa.struct !40
  %426 = load ptr, ptr %36, align 8, !tbaa !5
  store ptr %426, ptr %21, align 8, !tbaa !5
  %427 = load ptr, ptr %7, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %427, i32 0, i32 7
  %429 = load ptr, ptr %428, align 8, !tbaa !30
  %430 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %429, i32 0, i32 13
  %431 = load ptr, ptr %430, align 8, !tbaa !31
  %432 = load ptr, ptr %21, align 8, !tbaa !5
  call void @List__add__Ptr__Namespace______(ptr noundef %431, ptr noundef %432)
  call void @llvm.lifetime.end.p0(i64 112, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  br label %433

433:                                              ; preds = %413, %376
  call void @llvm.lifetime.end.p0(i64 1, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %30) #5
  br label %468

434:                                              ; preds = %326
  call void @llvm.lifetime.start.p0(i64 1, ptr %38) #5
  %435 = load i32, ptr %8, align 4, !tbaa !9
  %436 = and i32 %435, 1
  %437 = icmp ne i32 %436, 0
  %438 = zext i1 %437 to i32
  %439 = trunc i32 %438 to i8
  store i8 %439, ptr %38, align 1, !tbaa !17
  %440 = load i8, ptr %38, align 1, !tbaa !17
  %441 = icmp ne i8 %440, 0
  br i1 %441, label %442, label %451

442:                                              ; preds = %434
  %443 = load ptr, ptr %7, align 8, !tbaa !5
  %444 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %443, i32 0, i32 6
  %445 = load ptr, ptr %444, align 8, !tbaa !41
  %446 = getelementptr inbounds %struct.tag_____Namespace__, ptr %445, i32 0, i32 9
  %447 = load ptr, ptr %446, align 8, !tbaa !42
  %448 = icmp ne ptr %447, null
  %449 = zext i1 %448 to i32
  %450 = trunc i32 %449 to i8
  store i8 %450, ptr %38, align 1, !tbaa !17
  br label %451

451:                                              ; preds = %442, %434
  %452 = load i8, ptr %38, align 1, !tbaa !17
  %453 = icmp ne i8 %452, 0
  br i1 %453, label %454, label %467

454:                                              ; preds = %451
  %455 = load ptr, ptr %7, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %455, i32 0, i32 6
  %457 = load ptr, ptr %456, align 8, !tbaa !41
  %458 = getelementptr inbounds %struct.tag_____Namespace__, ptr %457, i32 0, i32 9
  %459 = load ptr, ptr %458, align 8, !tbaa !42
  %460 = load ptr, ptr %24, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.tag_____Token__, ptr %460, i32 0, i32 1
  %462 = getelementptr inbounds { ptr, i32 }, ptr %461, i32 0, i32 0
  %463 = load ptr, ptr %462, align 8
  %464 = getelementptr inbounds { ptr, i32 }, ptr %461, i32 0, i32 1
  %465 = load i32, ptr %464, align 8
  %466 = call ptr @TypeChecker__findTypeParamByNameOrNull__(ptr noundef %459, ptr %463, i32 %465)
  store ptr %466, ptr %21, align 8, !tbaa !5
  br label %467

467:                                              ; preds = %454, %451
  call void @llvm.lifetime.end.p0(i64 1, ptr %38) #5
  br label %468

468:                                              ; preds = %467, %433
  br label %469

469:                                              ; preds = %468, %323
  %470 = load ptr, ptr %21, align 8, !tbaa !5
  %471 = icmp eq ptr %470, null
  br i1 %471, label %472, label %546

472:                                              ; preds = %469
  %473 = getelementptr inbounds %struct.Node__, ptr %25, i32 0, i32 1
  %474 = load ptr, ptr %473, align 8, !tbaa !11
  %475 = icmp ne ptr %474, null
  br i1 %475, label %476, label %505

476:                                              ; preds = %472
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #5
  call void @llvm.memset.p0.i64(ptr align 8 %39, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %40, ptr align 8 @__const.TypeChecker__resolveType__.local19, i64 16, i1 false)
  %477 = getelementptr inbounds { ptr, i32 }, ptr %40, i32 0, i32 0
  %478 = load ptr, ptr %477, align 8
  %479 = getelementptr inbounds { ptr, i32 }, ptr %40, i32 0, i32 1
  %480 = load i32, ptr %479, align 8
  call void @StringBuilder__write__(ptr noundef %39, ptr %478, i32 %480)
  %481 = load ptr, ptr %24, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.tag_____Token__, ptr %481, i32 0, i32 1
  %483 = getelementptr inbounds { ptr, i32 }, ptr %482, i32 0, i32 0
  %484 = load ptr, ptr %483, align 8
  %485 = getelementptr inbounds { ptr, i32 }, ptr %482, i32 0, i32 1
  %486 = load i32, ptr %485, align 8
  call void @StringBuilder__write__(ptr noundef %39, ptr %484, i32 %486)
  %487 = load ptr, ptr %7, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %487, i32 0, i32 2
  %489 = load ptr, ptr %488, align 8, !tbaa !43
  %490 = load ptr, ptr %7, align 8, !tbaa !5
  %491 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %490, i32 0, i32 5
  %492 = load ptr, ptr %491, align 8, !tbaa !44
  %493 = load ptr, ptr %24, align 8, !tbaa !5
  %494 = getelementptr inbounds %struct.tag_____Token__, ptr %493, i32 0, i32 2
  %495 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef %39)
  %496 = getelementptr inbounds { ptr, i32 }, ptr %42, i32 0, i32 0
  %497 = extractvalue { ptr, i32 } %495, 0
  store ptr %497, ptr %496, align 8
  %498 = getelementptr inbounds { ptr, i32 }, ptr %42, i32 0, i32 1
  %499 = extractvalue { ptr, i32 } %495, 1
  store i32 %499, ptr %498, align 8
  %500 = load i64, ptr %494, align 8
  %501 = getelementptr inbounds { ptr, i32 }, ptr %42, i32 0, i32 0
  %502 = load ptr, ptr %501, align 8
  %503 = getelementptr inbounds { ptr, i32 }, ptr %42, i32 0, i32 1
  %504 = load i32, ptr %503, align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %41, ptr noundef %492, i64 %500, ptr %502, i32 %504)
  call void @List__add__Error____(ptr noundef %489, ptr noundef byval(%struct.tag_____Error__) align 8 %41)
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #5
  br label %534

505:                                              ; preds = %472
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #5
  call void @llvm.memset.p0.i64(ptr align 8 %43, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %44) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %44, ptr align 8 @__const.TypeChecker__resolveType__.local21, i64 16, i1 false)
  %506 = getelementptr inbounds { ptr, i32 }, ptr %44, i32 0, i32 0
  %507 = load ptr, ptr %506, align 8
  %508 = getelementptr inbounds { ptr, i32 }, ptr %44, i32 0, i32 1
  %509 = load i32, ptr %508, align 8
  call void @StringBuilder__write__(ptr noundef %43, ptr %507, i32 %509)
  %510 = load ptr, ptr %24, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.tag_____Token__, ptr %510, i32 0, i32 1
  %512 = getelementptr inbounds { ptr, i32 }, ptr %511, i32 0, i32 0
  %513 = load ptr, ptr %512, align 8
  %514 = getelementptr inbounds { ptr, i32 }, ptr %511, i32 0, i32 1
  %515 = load i32, ptr %514, align 8
  call void @StringBuilder__write__(ptr noundef %43, ptr %513, i32 %515)
  %516 = load ptr, ptr %7, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %516, i32 0, i32 2
  %518 = load ptr, ptr %517, align 8, !tbaa !43
  %519 = load ptr, ptr %7, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %519, i32 0, i32 5
  %521 = load ptr, ptr %520, align 8, !tbaa !44
  %522 = load ptr, ptr %24, align 8, !tbaa !5
  %523 = getelementptr inbounds %struct.tag_____Token__, ptr %522, i32 0, i32 2
  %524 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef %43)
  %525 = getelementptr inbounds { ptr, i32 }, ptr %46, i32 0, i32 0
  %526 = extractvalue { ptr, i32 } %524, 0
  store ptr %526, ptr %525, align 8
  %527 = getelementptr inbounds { ptr, i32 }, ptr %46, i32 0, i32 1
  %528 = extractvalue { ptr, i32 } %524, 1
  store i32 %528, ptr %527, align 8
  %529 = load i64, ptr %523, align 8
  %530 = getelementptr inbounds { ptr, i32 }, ptr %46, i32 0, i32 0
  %531 = load ptr, ptr %530, align 8
  %532 = getelementptr inbounds { ptr, i32 }, ptr %46, i32 0, i32 1
  %533 = load i32, ptr %532, align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %45, ptr noundef %521, i64 %529, ptr %531, i32 %533)
  call void @List__add__Error____(ptr noundef %518, ptr noundef byval(%struct.tag_____Error__) align 8 %45)
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #5
  br label %534

534:                                              ; preds = %505, %476
  call void @llvm.lifetime.start.p0(i64 16, ptr %47) #5
  call void @llvm.memset.p0.i64(ptr align 8 %47, i8 0, i64 16, i1 false)
  %535 = load ptr, ptr %7, align 8, !tbaa !5
  %536 = load i32, ptr %12, align 4, !tbaa !9
  %537 = getelementptr inbounds { ptr, ptr }, ptr %47, i32 0, i32 0
  %538 = load ptr, ptr %537, align 8
  %539 = getelementptr inbounds { ptr, ptr }, ptr %47, i32 0, i32 1
  %540 = load ptr, ptr %539, align 8
  %541 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %535, ptr %538, ptr %540, i32 noundef %536)
  %542 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0
  %543 = extractvalue { ptr, ptr } %541, 0
  store ptr %543, ptr %542, align 8
  %544 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1
  %545 = extractvalue { ptr, ptr } %541, 1
  store ptr %545, ptr %544, align 8
  store i32 1, ptr %48, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %47) #5
  br label %548

546:                                              ; preds = %469
  %547 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %547, ptr %23, align 8, !tbaa !5
  store i32 0, ptr %48, align 4
  br label %548

548:                                              ; preds = %546, %534
  call void @llvm.lifetime.end.p0(i64 1, ptr %29) #5
  %549 = load i32, ptr %48, align 4
  switch i32 %549, label %673 [
    i32 0, label %550
  ]

550:                                              ; preds = %548
  br label %672

551:                                              ; preds = %307
  %552 = load ptr, ptr %21, align 8, !tbaa !5
  %553 = icmp eq ptr %552, null
  br i1 %553, label %554, label %665

554:                                              ; preds = %551
  %555 = getelementptr inbounds %struct.Node__, ptr %25, i32 0, i32 1
  %556 = load ptr, ptr %555, align 8, !tbaa !11
  %557 = icmp ne ptr %556, null
  br i1 %557, label %558, label %587

558:                                              ; preds = %554
  call void @llvm.lifetime.start.p0(i64 16, ptr %49) #5
  call void @llvm.memset.p0.i64(ptr align 8 %49, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %50) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %50, ptr align 8 @__const.TypeChecker__resolveType__.local24, i64 16, i1 false)
  %559 = getelementptr inbounds { ptr, i32 }, ptr %50, i32 0, i32 0
  %560 = load ptr, ptr %559, align 8
  %561 = getelementptr inbounds { ptr, i32 }, ptr %50, i32 0, i32 1
  %562 = load i32, ptr %561, align 8
  call void @StringBuilder__write__(ptr noundef %49, ptr %560, i32 %562)
  %563 = load ptr, ptr %24, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.tag_____Token__, ptr %563, i32 0, i32 1
  %565 = getelementptr inbounds { ptr, i32 }, ptr %564, i32 0, i32 0
  %566 = load ptr, ptr %565, align 8
  %567 = getelementptr inbounds { ptr, i32 }, ptr %564, i32 0, i32 1
  %568 = load i32, ptr %567, align 8
  call void @StringBuilder__write__(ptr noundef %49, ptr %566, i32 %568)
  %569 = load ptr, ptr %7, align 8, !tbaa !5
  %570 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %569, i32 0, i32 2
  %571 = load ptr, ptr %570, align 8, !tbaa !43
  %572 = load ptr, ptr %7, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %572, i32 0, i32 5
  %574 = load ptr, ptr %573, align 8, !tbaa !44
  %575 = load ptr, ptr %24, align 8, !tbaa !5
  %576 = getelementptr inbounds %struct.tag_____Token__, ptr %575, i32 0, i32 2
  %577 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef %49)
  %578 = getelementptr inbounds { ptr, i32 }, ptr %52, i32 0, i32 0
  %579 = extractvalue { ptr, i32 } %577, 0
  store ptr %579, ptr %578, align 8
  %580 = getelementptr inbounds { ptr, i32 }, ptr %52, i32 0, i32 1
  %581 = extractvalue { ptr, i32 } %577, 1
  store i32 %581, ptr %580, align 8
  %582 = load i64, ptr %576, align 8
  %583 = getelementptr inbounds { ptr, i32 }, ptr %52, i32 0, i32 0
  %584 = load ptr, ptr %583, align 8
  %585 = getelementptr inbounds { ptr, i32 }, ptr %52, i32 0, i32 1
  %586 = load i32, ptr %585, align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %51, ptr noundef %574, i64 %582, ptr %584, i32 %586)
  call void @List__add__Error____(ptr noundef %571, ptr noundef byval(%struct.tag_____Error__) align 8 %51)
  call void @llvm.lifetime.end.p0(i64 16, ptr %50) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %49) #5
  br label %616

587:                                              ; preds = %554
  call void @llvm.lifetime.start.p0(i64 16, ptr %53) #5
  call void @llvm.memset.p0.i64(ptr align 8 %53, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %54) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %54, ptr align 8 @__const.TypeChecker__resolveType__.local26, i64 16, i1 false)
  %588 = getelementptr inbounds { ptr, i32 }, ptr %54, i32 0, i32 0
  %589 = load ptr, ptr %588, align 8
  %590 = getelementptr inbounds { ptr, i32 }, ptr %54, i32 0, i32 1
  %591 = load i32, ptr %590, align 8
  call void @StringBuilder__write__(ptr noundef %53, ptr %589, i32 %591)
  %592 = load ptr, ptr %24, align 8, !tbaa !5
  %593 = getelementptr inbounds %struct.tag_____Token__, ptr %592, i32 0, i32 1
  %594 = getelementptr inbounds { ptr, i32 }, ptr %593, i32 0, i32 0
  %595 = load ptr, ptr %594, align 8
  %596 = getelementptr inbounds { ptr, i32 }, ptr %593, i32 0, i32 1
  %597 = load i32, ptr %596, align 8
  call void @StringBuilder__write__(ptr noundef %53, ptr %595, i32 %597)
  %598 = load ptr, ptr %7, align 8, !tbaa !5
  %599 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %598, i32 0, i32 2
  %600 = load ptr, ptr %599, align 8, !tbaa !43
  %601 = load ptr, ptr %7, align 8, !tbaa !5
  %602 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %601, i32 0, i32 5
  %603 = load ptr, ptr %602, align 8, !tbaa !44
  %604 = load ptr, ptr %24, align 8, !tbaa !5
  %605 = getelementptr inbounds %struct.tag_____Token__, ptr %604, i32 0, i32 2
  %606 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef %53)
  %607 = getelementptr inbounds { ptr, i32 }, ptr %56, i32 0, i32 0
  %608 = extractvalue { ptr, i32 } %606, 0
  store ptr %608, ptr %607, align 8
  %609 = getelementptr inbounds { ptr, i32 }, ptr %56, i32 0, i32 1
  %610 = extractvalue { ptr, i32 } %606, 1
  store i32 %610, ptr %609, align 8
  %611 = load i64, ptr %605, align 8
  %612 = getelementptr inbounds { ptr, i32 }, ptr %56, i32 0, i32 0
  %613 = load ptr, ptr %612, align 8
  %614 = getelementptr inbounds { ptr, i32 }, ptr %56, i32 0, i32 1
  %615 = load i32, ptr %614, align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %55, ptr noundef %603, i64 %611, ptr %613, i32 %615)
  call void @List__add__Error____(ptr noundef %600, ptr noundef byval(%struct.tag_____Error__) align 8 %55)
  call void @llvm.lifetime.end.p0(i64 16, ptr %54) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #5
  br label %616

616:                                              ; preds = %587, %558
  %617 = load ptr, ptr %10, align 8, !tbaa !5
  %618 = getelementptr inbounds %struct.tag_____TypeArgsExpression__, ptr %617, i32 0, i32 2
  %619 = load ptr, ptr %618, align 8, !tbaa !45
  %620 = icmp ne ptr %619, null
  br i1 %620, label %621, label %653

621:                                              ; preds = %616
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #5
  %622 = load ptr, ptr %10, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.tag_____TypeArgsExpression__, ptr %622, i32 0, i32 2
  %624 = load ptr, ptr %623, align 8, !tbaa !45
  store ptr %624, ptr %57, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #5
  store i32 0, ptr %58, align 4, !tbaa !9
  br label %625

625:                                              ; preds = %631, %621
  %626 = load i32, ptr %58, align 4, !tbaa !9
  %627 = load ptr, ptr %57, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.tag_____List__Node____, ptr %627, i32 0, i32 1
  %629 = load i32, ptr %628, align 8, !tbaa !47
  %630 = icmp slt i32 %626, %629
  br i1 %630, label %631, label %652

631:                                              ; preds = %625
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #5
  %632 = load ptr, ptr %57, align 8, !tbaa !5
  %633 = getelementptr inbounds %struct.tag_____List__Node____, ptr %632, i32 0, i32 0
  %634 = load ptr, ptr %633, align 8, !tbaa !49
  %635 = load i32, ptr %58, align 4, !tbaa !9
  %636 = sext i32 %635 to i64
  %637 = getelementptr inbounds %struct.Node__, ptr %634, i64 %636
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %59, ptr align 8 %637, i64 16, i1 false), !tbaa.struct !13
  %638 = load ptr, ptr %7, align 8, !tbaa !5
  %639 = load i32, ptr %8, align 4, !tbaa !9
  %640 = and i32 %639, 3
  %641 = getelementptr inbounds { i32, ptr }, ptr %59, i32 0, i32 0
  %642 = load i32, ptr %641, align 8
  %643 = getelementptr inbounds { i32, ptr }, ptr %59, i32 0, i32 1
  %644 = load ptr, ptr %643, align 8
  %645 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %638, i32 %642, ptr %644, i32 noundef %640)
  %646 = getelementptr inbounds { ptr, ptr }, ptr %60, i32 0, i32 0
  %647 = extractvalue { ptr, ptr } %645, 0
  store ptr %647, ptr %646, align 8
  %648 = getelementptr inbounds { ptr, ptr }, ptr %60, i32 0, i32 1
  %649 = extractvalue { ptr, ptr } %645, 1
  store ptr %649, ptr %648, align 8
  %650 = load i32, ptr %58, align 4, !tbaa !9
  %651 = add nsw i32 %650, 1
  store i32 %651, ptr %58, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #5
  br label %625, !llvm.loop !50

652:                                              ; preds = %625
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #5
  br label %653

653:                                              ; preds = %652, %616
  call void @llvm.lifetime.start.p0(i64 16, ptr %61) #5
  call void @llvm.memset.p0.i64(ptr align 8 %61, i8 0, i64 16, i1 false)
  %654 = load ptr, ptr %7, align 8, !tbaa !5
  %655 = load i32, ptr %12, align 4, !tbaa !9
  %656 = getelementptr inbounds { ptr, ptr }, ptr %61, i32 0, i32 0
  %657 = load ptr, ptr %656, align 8
  %658 = getelementptr inbounds { ptr, ptr }, ptr %61, i32 0, i32 1
  %659 = load ptr, ptr %658, align 8
  %660 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %654, ptr %657, ptr %659, i32 noundef %655)
  %661 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0
  %662 = extractvalue { ptr, ptr } %660, 0
  store ptr %662, ptr %661, align 8
  %663 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1
  %664 = extractvalue { ptr, ptr } %660, 1
  store ptr %664, ptr %663, align 8
  store i32 1, ptr %48, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %61) #5
  br label %673

665:                                              ; preds = %551
  %666 = load ptr, ptr %10, align 8, !tbaa !5
  %667 = getelementptr inbounds %struct.tag_____TypeArgsExpression__, ptr %666, i32 0, i32 2
  %668 = load ptr, ptr %667, align 8, !tbaa !45
  store ptr %668, ptr %22, align 8, !tbaa !5
  %669 = load ptr, ptr %10, align 8, !tbaa !5
  %670 = getelementptr inbounds %struct.tag_____TypeArgsExpression__, ptr %669, i32 0, i32 1
  %671 = load ptr, ptr %670, align 8, !tbaa !52
  store ptr %671, ptr %23, align 8, !tbaa !5
  br label %672

672:                                              ; preds = %665, %550
  store i32 0, ptr %48, align 4
  br label %673

673:                                              ; preds = %672, %653, %548
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #5
  %674 = load i32, ptr %48, align 4
  switch i32 %674, label %676 [
    i32 0, label %675
  ]

675:                                              ; preds = %673
  store i32 4, ptr %48, align 4
  br label %676

676:                                              ; preds = %675, %673
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  %677 = load i32, ptr %48, align 4
  switch i32 %677, label %1286 [
    i32 4, label %694
  ]

678:                                              ; preds = %246
  %679 = load ptr, ptr %7, align 8, !tbaa !5
  %680 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %679, i32 0, i32 2
  %681 = load ptr, ptr %680, align 8, !tbaa !43
  %682 = load ptr, ptr %7, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %682, i32 0, i32 5
  %684 = load ptr, ptr %683, align 8, !tbaa !44
  %685 = getelementptr inbounds { i32, ptr }, ptr %9, i32 0, i32 0
  %686 = load i32, ptr %685, align 8
  %687 = getelementptr inbounds { i32, ptr }, ptr %9, i32 0, i32 1
  %688 = load ptr, ptr %687, align 8
  %689 = call i64 @RangeFinder__find__(i32 %686, ptr %688)
  store i64 %689, ptr %63, align 4
  %690 = load i64, ptr %63, align 4
  %691 = load ptr, ptr @mu_____string163, align 8
  %692 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string163, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %62, ptr noundef %684, i64 %690, ptr %691, i32 %692)
  call void @List__add__Error____(ptr noundef %681, ptr noundef byval(%struct.tag_____Error__) align 8 %62)
  call void @llvm.memset.p0.i64(ptr align 8 %5, i8 0, i64 16, i1 false)
  store i32 1, ptr %48, align 4
  br label %1286

693:                                              ; preds = %246
  call void @llvm.memset.p0.i64(ptr align 8 %5, i8 0, i64 16, i1 false)
  store i32 1, ptr %48, align 4
  br label %1286

694:                                              ; preds = %676
  call void @llvm.lifetime.start.p0(i64 1, ptr %64) #5
  %695 = load ptr, ptr %21, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.tag_____Namespace__, ptr %695, i32 0, i32 3
  %697 = load i32, ptr %696, align 4, !tbaa !25
  %698 = and i32 %697, 512
  %699 = icmp ne i32 %698, 0
  %700 = zext i1 %699 to i32
  %701 = trunc i32 %700 to i8
  store i8 %701, ptr %64, align 1, !tbaa !17
  %702 = load i8, ptr %64, align 1, !tbaa !17
  %703 = icmp ne i8 %702, 0
  br i1 %703, label %704, label %710

704:                                              ; preds = %694
  %705 = load i32, ptr %8, align 4, !tbaa !9
  %706 = and i32 %705, 8
  %707 = icmp eq i32 %706, 0
  %708 = zext i1 %707 to i32
  %709 = trunc i32 %708 to i8
  store i8 %709, ptr %64, align 1, !tbaa !17
  br label %710

710:                                              ; preds = %704, %694
  %711 = load i8, ptr %64, align 1, !tbaa !17
  %712 = icmp ne i8 %711, 0
  br i1 %712, label %713, label %716

713:                                              ; preds = %710
  %714 = load i32, ptr %12, align 4, !tbaa !9
  %715 = add nsw i32 %714, 1
  store i32 %715, ptr %12, align 4, !tbaa !9
  br label %716

716:                                              ; preds = %713, %710
  %717 = load i32, ptr %12, align 4, !tbaa !9
  %718 = icmp slt i32 %717, 0
  br i1 %718, label %719, label %733

719:                                              ; preds = %716
  %720 = load ptr, ptr %7, align 8, !tbaa !5
  %721 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %720, i32 0, i32 2
  %722 = load ptr, ptr %721, align 8, !tbaa !43
  %723 = load ptr, ptr %7, align 8, !tbaa !5
  %724 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %723, i32 0, i32 5
  %725 = load ptr, ptr %724, align 8, !tbaa !44
  %726 = load ptr, ptr %13, align 8, !tbaa !5
  %727 = getelementptr inbounds %struct.tag_____TypeModifierExpression__, ptr %726, i32 0, i32 0
  %728 = load ptr, ptr %727, align 8, !tbaa !15
  %729 = getelementptr inbounds %struct.tag_____Token__, ptr %728, i32 0, i32 2
  %730 = load i64, ptr %729, align 8
  %731 = load ptr, ptr @mu_____string164, align 8
  %732 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string164, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %65, ptr noundef %725, i64 %730, ptr %731, i32 %732)
  call void @List__add__Error____(ptr noundef %722, ptr noundef byval(%struct.tag_____Error__) align 8 %65)
  br label %733

733:                                              ; preds = %719, %716
  %734 = load ptr, ptr %21, align 8, !tbaa !5
  %735 = load ptr, ptr %7, align 8, !tbaa !5
  %736 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %735, i32 0, i32 4
  %737 = load ptr, ptr %736, align 8, !tbaa !26
  %738 = getelementptr inbounds %struct.tag_____CommonTags__, ptr %737, i32 0, i32 19
  %739 = load ptr, ptr %738, align 8, !tbaa !53
  %740 = icmp eq ptr %734, %739
  br i1 %740, label %741, label %794

741:                                              ; preds = %733
  call void @llvm.lifetime.start.p0(i64 16, ptr %66) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %66, ptr align 8 %6, i64 16, i1 false), !tbaa.struct !13
  %742 = getelementptr inbounds %struct.Node__, ptr %66, i32 0, i32 0
  %743 = load i32, ptr %742, align 8, !tbaa !14
  %744 = icmp eq i32 %743, 21
  br i1 %744, label %748, label %745

745:                                              ; preds = %741
  %746 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %747 = load ptr, ptr %746, align 8, !tbaa !5
  call void %747(i32 noundef -4)
  br label %748

748:                                              ; preds = %745, %741
  %749 = load ptr, ptr %7, align 8, !tbaa !5
  %750 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %749, i32 0, i32 2
  %751 = load ptr, ptr %750, align 8, !tbaa !43
  %752 = load ptr, ptr %7, align 8, !tbaa !5
  %753 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %752, i32 0, i32 5
  %754 = load ptr, ptr %753, align 8, !tbaa !44
  %755 = getelementptr inbounds %struct.Node__, ptr %66, i32 0, i32 1
  %756 = load ptr, ptr %755, align 8, !tbaa !11
  %757 = getelementptr inbounds %struct.tag_____Token__, ptr %756, i32 0, i32 2
  %758 = load i64, ptr %757, align 8
  %759 = load ptr, ptr @mu_____string165, align 8
  %760 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string165, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %67, ptr noundef %754, i64 %758, ptr %759, i32 %760)
  call void @List__add__Error____(ptr noundef %751, ptr noundef byval(%struct.tag_____Error__) align 8 %67)
  %761 = load ptr, ptr %22, align 8, !tbaa !5
  %762 = icmp ne ptr %761, null
  br i1 %762, label %763, label %793

763:                                              ; preds = %748
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #5
  %764 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %764, ptr %68, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %69) #5
  store i32 0, ptr %69, align 4, !tbaa !9
  br label %765

765:                                              ; preds = %771, %763
  %766 = load i32, ptr %69, align 4, !tbaa !9
  %767 = load ptr, ptr %68, align 8, !tbaa !5
  %768 = getelementptr inbounds %struct.tag_____List__Node____, ptr %767, i32 0, i32 1
  %769 = load i32, ptr %768, align 8, !tbaa !47
  %770 = icmp slt i32 %766, %769
  br i1 %770, label %771, label %792

771:                                              ; preds = %765
  call void @llvm.lifetime.start.p0(i64 16, ptr %70) #5
  %772 = load ptr, ptr %68, align 8, !tbaa !5
  %773 = getelementptr inbounds %struct.tag_____List__Node____, ptr %772, i32 0, i32 0
  %774 = load ptr, ptr %773, align 8, !tbaa !49
  %775 = load i32, ptr %69, align 4, !tbaa !9
  %776 = sext i32 %775 to i64
  %777 = getelementptr inbounds %struct.Node__, ptr %774, i64 %776
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %70, ptr align 8 %777, i64 16, i1 false), !tbaa.struct !13
  %778 = load ptr, ptr %7, align 8, !tbaa !5
  %779 = load i32, ptr %8, align 4, !tbaa !9
  %780 = and i32 %779, 3
  %781 = getelementptr inbounds { i32, ptr }, ptr %70, i32 0, i32 0
  %782 = load i32, ptr %781, align 8
  %783 = getelementptr inbounds { i32, ptr }, ptr %70, i32 0, i32 1
  %784 = load ptr, ptr %783, align 8
  %785 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %778, i32 %782, ptr %784, i32 noundef %780)
  %786 = getelementptr inbounds { ptr, ptr }, ptr %71, i32 0, i32 0
  %787 = extractvalue { ptr, ptr } %785, 0
  store ptr %787, ptr %786, align 8
  %788 = getelementptr inbounds { ptr, ptr }, ptr %71, i32 0, i32 1
  %789 = extractvalue { ptr, ptr } %785, 1
  store ptr %789, ptr %788, align 8
  %790 = load i32, ptr %69, align 4, !tbaa !9
  %791 = add nsw i32 %790, 1
  store i32 %791, ptr %69, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 16, ptr %70) #5
  br label %765, !llvm.loop !54

792:                                              ; preds = %765
  call void @llvm.lifetime.end.p0(i64 4, ptr %69) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #5
  br label %793

793:                                              ; preds = %792, %748
  call void @llvm.memset.p0.i64(ptr align 8 %5, i8 0, i64 16, i1 false)
  store i32 1, ptr %48, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %66) #5
  br label %1285

794:                                              ; preds = %733
  call void @llvm.lifetime.start.p0(i64 4, ptr %72) #5
  %795 = load ptr, ptr %21, align 8, !tbaa !5
  %796 = getelementptr inbounds %struct.tag_____Namespace__, ptr %795, i32 0, i32 9
  %797 = load ptr, ptr %796, align 8, !tbaa !42
  %798 = icmp ne ptr %797, null
  br i1 %798, label %799, label %805

799:                                              ; preds = %794
  %800 = load ptr, ptr %21, align 8, !tbaa !5
  %801 = getelementptr inbounds %struct.tag_____Namespace__, ptr %800, i32 0, i32 9
  %802 = load ptr, ptr %801, align 8, !tbaa !42
  %803 = getelementptr inbounds %struct.tag_____List__Ptr__Namespace______, ptr %802, i32 0, i32 1
  %804 = load i32, ptr %803, align 8, !tbaa !55
  store i32 %804, ptr %72, align 4, !tbaa !9
  br label %806

805:                                              ; preds = %794
  store i32 0, ptr %72, align 4, !tbaa !9
  br label %806

806:                                              ; preds = %805, %799
  call void @llvm.lifetime.start.p0(i64 4, ptr %73) #5
  %807 = load i32, ptr %72, align 4, !tbaa !9
  store i32 %807, ptr %73, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %74) #5
  %808 = load ptr, ptr %22, align 8, !tbaa !5
  %809 = icmp ne ptr %808, null
  br i1 %809, label %810, label %814

810:                                              ; preds = %806
  %811 = load ptr, ptr %22, align 8, !tbaa !5
  %812 = getelementptr inbounds %struct.tag_____List__Node____, ptr %811, i32 0, i32 1
  %813 = load i32, ptr %812, align 8, !tbaa !47
  store i32 %813, ptr %74, align 4, !tbaa !9
  br label %815

814:                                              ; preds = %806
  store i32 0, ptr %74, align 4, !tbaa !9
  br label %815

815:                                              ; preds = %814, %810
  call void @llvm.lifetime.start.p0(i64 4, ptr %75) #5
  %816 = load i32, ptr %74, align 4, !tbaa !9
  store i32 %816, ptr %75, align 4, !tbaa !9
  %817 = load ptr, ptr %21, align 8, !tbaa !5
  %818 = load ptr, ptr %7, align 8, !tbaa !5
  %819 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %818, i32 0, i32 4
  %820 = load ptr, ptr %819, align 8, !tbaa !26
  %821 = getelementptr inbounds %struct.tag_____CommonTags__, ptr %820, i32 0, i32 20
  %822 = load ptr, ptr %821, align 8, !tbaa !57
  %823 = icmp eq ptr %817, %822
  br i1 %823, label %824, label %1011

824:                                              ; preds = %815
  %825 = load i32, ptr %75, align 4, !tbaa !9
  %826 = icmp sgt i32 %825, 0
  br i1 %826, label %827, label %973

827:                                              ; preds = %824
  call void @llvm.lifetime.start.p0(i64 16, ptr %76) #5
  call void @llvm.memset.p0.i64(ptr align 8 %76, i8 0, i64 16, i1 false)
  %828 = load ptr, ptr %21, align 8, !tbaa !5
  %829 = getelementptr inbounds %struct.tag_____Tag__, ptr %76, i32 0, i32 0
  store ptr %828, ptr %829, align 8, !tbaa !58
  call void @llvm.lifetime.start.p0(i64 8, ptr %77) #5
  %830 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %831 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %830, i32 0, i32 1
  %832 = load ptr, ptr %831, align 8, !tbaa !33
  %833 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %834 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %833, i32 0, i32 0
  %835 = load ptr, ptr %834, align 8, !tbaa !35
  %836 = call ptr %832(ptr noundef %835, i64 noundef 16)
  store ptr %836, ptr %77, align 8, !tbaa !5
  %837 = load ptr, ptr %77, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %78) #5
  %838 = load i32, ptr %75, align 4, !tbaa !9
  %839 = call { ptr, i32 } @Array__cons__Tag____(i32 noundef %838)
  %840 = getelementptr inbounds { ptr, i32 }, ptr %78, i32 0, i32 0
  %841 = extractvalue { ptr, i32 } %839, 0
  store ptr %841, ptr %840, align 8
  %842 = getelementptr inbounds { ptr, i32 }, ptr %78, i32 0, i32 1
  %843 = extractvalue { ptr, i32 } %839, 1
  store i32 %843, ptr %842, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %837, ptr align 8 %78, i64 16, i1 false), !tbaa.struct !39
  call void @llvm.lifetime.end.p0(i64 16, ptr %78) #5
  %844 = load ptr, ptr %77, align 8, !tbaa !5
  %845 = getelementptr inbounds %struct.tag_____Tag__, ptr %76, i32 0, i32 1
  store ptr %844, ptr %845, align 8, !tbaa !59
  call void @llvm.lifetime.start.p0(i64 16, ptr %79) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %79, ptr align 8 %76, i64 16, i1 false), !tbaa.struct !60
  call void @llvm.lifetime.start.p0(i64 4, ptr %80) #5
  store i32 0, ptr %80, align 4, !tbaa !9
  br label %846

846:                                              ; preds = %874, %827
  %847 = load i32, ptr %80, align 4, !tbaa !9
  %848 = load i32, ptr %75, align 4, !tbaa !9
  %849 = sub nsw i32 %848, 1
  %850 = icmp slt i32 %847, %849
  br i1 %850, label %851, label %901

851:                                              ; preds = %846
  call void @llvm.lifetime.start.p0(i64 8, ptr %81) #5
  %852 = getelementptr inbounds %struct.tag_____Tag__, ptr %79, i32 0, i32 1
  %853 = load ptr, ptr %852, align 8, !tbaa !59
  store ptr %853, ptr %81, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %82) #5
  %854 = load i32, ptr %80, align 4, !tbaa !9
  store i32 %854, ptr %82, align 4, !tbaa !9
  %855 = load i32, ptr %82, align 4, !tbaa !9
  %856 = load ptr, ptr %81, align 8, !tbaa !5
  %857 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %856, i32 0, i32 1
  %858 = load i32, ptr %857, align 8, !tbaa !61
  %859 = icmp ult i32 %855, %858
  br i1 %859, label %863, label %860

860:                                              ; preds = %851
  %861 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %862 = load ptr, ptr %861, align 8, !tbaa !5
  call void %862(i32 noundef -3)
  br label %863

863:                                              ; preds = %860, %851
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #5
  %864 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %864, ptr %83, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %84) #5
  %865 = load i32, ptr %80, align 4, !tbaa !9
  store i32 %865, ptr %84, align 4, !tbaa !9
  %866 = load i32, ptr %84, align 4, !tbaa !9
  %867 = load ptr, ptr %83, align 8, !tbaa !5
  %868 = getelementptr inbounds %struct.tag_____List__Node____, ptr %867, i32 0, i32 1
  %869 = load i32, ptr %868, align 8, !tbaa !47
  %870 = icmp ult i32 %866, %869
  br i1 %870, label %874, label %871

871:                                              ; preds = %863
  %872 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %873 = load ptr, ptr %872, align 8, !tbaa !5
  call void %873(i32 noundef -3)
  br label %874

874:                                              ; preds = %871, %863
  %875 = load ptr, ptr %81, align 8, !tbaa !5
  %876 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %875, i32 0, i32 0
  %877 = load ptr, ptr %876, align 8, !tbaa !63
  %878 = load i32, ptr %82, align 4, !tbaa !9
  %879 = zext i32 %878 to i64
  %880 = getelementptr inbounds %struct.tag_____Tag__, ptr %877, i64 %879
  call void @llvm.lifetime.start.p0(i64 16, ptr %85) #5
  %881 = load ptr, ptr %7, align 8, !tbaa !5
  %882 = load ptr, ptr %83, align 8, !tbaa !5
  %883 = getelementptr inbounds %struct.tag_____List__Node____, ptr %882, i32 0, i32 0
  %884 = load ptr, ptr %883, align 8, !tbaa !49
  %885 = load i32, ptr %84, align 4, !tbaa !9
  %886 = zext i32 %885 to i64
  %887 = getelementptr inbounds %struct.Node__, ptr %884, i64 %886
  %888 = load i32, ptr %8, align 4, !tbaa !9
  %889 = and i32 %888, 3
  %890 = getelementptr inbounds { i32, ptr }, ptr %887, i32 0, i32 0
  %891 = load i32, ptr %890, align 8
  %892 = getelementptr inbounds { i32, ptr }, ptr %887, i32 0, i32 1
  %893 = load ptr, ptr %892, align 8
  %894 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %881, i32 %891, ptr %893, i32 noundef %889)
  %895 = getelementptr inbounds { ptr, ptr }, ptr %85, i32 0, i32 0
  %896 = extractvalue { ptr, ptr } %894, 0
  store ptr %896, ptr %895, align 8
  %897 = getelementptr inbounds { ptr, ptr }, ptr %85, i32 0, i32 1
  %898 = extractvalue { ptr, ptr } %894, 1
  store ptr %898, ptr %897, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %880, ptr align 8 %85, i64 16, i1 false), !tbaa.struct !60
  call void @llvm.lifetime.end.p0(i64 16, ptr %85) #5
  %899 = load i32, ptr %80, align 4, !tbaa !9
  %900 = add nsw i32 %899, 1
  store i32 %900, ptr %80, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %84) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %82) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #5
  br label %846, !llvm.loop !64

901:                                              ; preds = %846
  call void @llvm.lifetime.end.p0(i64 4, ptr %80) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %86) #5
  %902 = getelementptr inbounds %struct.tag_____Tag__, ptr %79, i32 0, i32 1
  %903 = load ptr, ptr %902, align 8, !tbaa !59
  store ptr %903, ptr %86, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %87) #5
  %904 = load i32, ptr %75, align 4, !tbaa !9
  %905 = sub nsw i32 %904, 1
  store i32 %905, ptr %87, align 4, !tbaa !9
  %906 = load i32, ptr %87, align 4, !tbaa !9
  %907 = load ptr, ptr %86, align 8, !tbaa !5
  %908 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %907, i32 0, i32 1
  %909 = load i32, ptr %908, align 8, !tbaa !61
  %910 = icmp ult i32 %906, %909
  br i1 %910, label %914, label %911

911:                                              ; preds = %901
  %912 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %913 = load ptr, ptr %912, align 8, !tbaa !5
  call void %913(i32 noundef -3)
  br label %914

914:                                              ; preds = %911, %901
  call void @llvm.lifetime.start.p0(i64 8, ptr %88) #5
  %915 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %915, ptr %88, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %89) #5
  %916 = load i32, ptr %75, align 4, !tbaa !9
  %917 = sub nsw i32 %916, 1
  store i32 %917, ptr %89, align 4, !tbaa !9
  %918 = load i32, ptr %89, align 4, !tbaa !9
  %919 = load ptr, ptr %88, align 8, !tbaa !5
  %920 = getelementptr inbounds %struct.tag_____List__Node____, ptr %919, i32 0, i32 1
  %921 = load i32, ptr %920, align 8, !tbaa !47
  %922 = icmp ult i32 %918, %921
  br i1 %922, label %926, label %923

923:                                              ; preds = %914
  %924 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %925 = load ptr, ptr %924, align 8, !tbaa !5
  call void %925(i32 noundef -3)
  br label %926

926:                                              ; preds = %923, %914
  %927 = load ptr, ptr %86, align 8, !tbaa !5
  %928 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %927, i32 0, i32 0
  %929 = load ptr, ptr %928, align 8, !tbaa !63
  %930 = load i32, ptr %87, align 4, !tbaa !9
  %931 = zext i32 %930 to i64
  %932 = getelementptr inbounds %struct.tag_____Tag__, ptr %929, i64 %931
  call void @llvm.lifetime.start.p0(i64 16, ptr %90) #5
  %933 = load ptr, ptr %7, align 8, !tbaa !5
  %934 = load ptr, ptr %88, align 8, !tbaa !5
  %935 = getelementptr inbounds %struct.tag_____List__Node____, ptr %934, i32 0, i32 0
  %936 = load ptr, ptr %935, align 8, !tbaa !49
  %937 = load i32, ptr %89, align 4, !tbaa !9
  %938 = zext i32 %937 to i64
  %939 = getelementptr inbounds %struct.Node__, ptr %936, i64 %938
  %940 = load i32, ptr %8, align 4, !tbaa !9
  %941 = and i32 %940, 3
  %942 = or i32 %941, 4
  %943 = getelementptr inbounds { i32, ptr }, ptr %939, i32 0, i32 0
  %944 = load i32, ptr %943, align 8
  %945 = getelementptr inbounds { i32, ptr }, ptr %939, i32 0, i32 1
  %946 = load ptr, ptr %945, align 8
  %947 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %933, i32 %944, ptr %946, i32 noundef %942)
  %948 = getelementptr inbounds { ptr, ptr }, ptr %90, i32 0, i32 0
  %949 = extractvalue { ptr, ptr } %947, 0
  store ptr %949, ptr %948, align 8
  %950 = getelementptr inbounds { ptr, ptr }, ptr %90, i32 0, i32 1
  %951 = extractvalue { ptr, ptr } %947, 1
  store ptr %951, ptr %950, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %932, ptr align 8 %90, i64 16, i1 false), !tbaa.struct !60
  call void @llvm.lifetime.end.p0(i64 16, ptr %90) #5
  %952 = load ptr, ptr %7, align 8, !tbaa !5
  %953 = load i32, ptr %8, align 4, !tbaa !9
  %954 = and i32 %953, 1
  %955 = icmp ne i32 %954, 0
  %956 = zext i1 %955 to i32
  %957 = trunc i32 %956 to i8
  %958 = getelementptr inbounds { ptr, ptr }, ptr %79, i32 0, i32 0
  %959 = load ptr, ptr %958, align 8
  %960 = getelementptr inbounds { ptr, ptr }, ptr %79, i32 0, i32 1
  %961 = load ptr, ptr %960, align 8
  call void @TypeChecker__useType__(ptr noundef %952, ptr %959, ptr %961, i8 noundef zeroext %957)
  %962 = load ptr, ptr %7, align 8, !tbaa !5
  %963 = load i32, ptr %12, align 4, !tbaa !9
  %964 = getelementptr inbounds { ptr, ptr }, ptr %79, i32 0, i32 0
  %965 = load ptr, ptr %964, align 8
  %966 = getelementptr inbounds { ptr, ptr }, ptr %79, i32 0, i32 1
  %967 = load ptr, ptr %966, align 8
  %968 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %962, ptr %965, ptr %967, i32 noundef %963)
  %969 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0
  %970 = extractvalue { ptr, ptr } %968, 0
  store ptr %970, ptr %969, align 8
  %971 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1
  %972 = extractvalue { ptr, ptr } %968, 1
  store ptr %972, ptr %971, align 8
  store i32 1, ptr %48, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %89) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %87) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %86) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %79) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %76) #5
  br label %1284

973:                                              ; preds = %824
  %974 = load ptr, ptr %22, align 8, !tbaa !5
  %975 = icmp eq ptr %974, null
  br i1 %975, label %976, label %988

976:                                              ; preds = %973
  %977 = load ptr, ptr %7, align 8, !tbaa !5
  %978 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %977, i32 0, i32 2
  %979 = load ptr, ptr %978, align 8, !tbaa !43
  %980 = load ptr, ptr %7, align 8, !tbaa !5
  %981 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %980, i32 0, i32 5
  %982 = load ptr, ptr %981, align 8, !tbaa !44
  %983 = load ptr, ptr %23, align 8, !tbaa !5
  %984 = getelementptr inbounds %struct.tag_____Token__, ptr %983, i32 0, i32 2
  %985 = load i64, ptr %984, align 8
  %986 = load ptr, ptr @mu_____string166, align 8
  %987 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string166, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %91, ptr noundef %982, i64 %985, ptr %986, i32 %987)
  call void @List__add__Error____(ptr noundef %979, ptr noundef byval(%struct.tag_____Error__) align 8 %91)
  br label %989

988:                                              ; preds = %973
  br label %989

989:                                              ; preds = %988, %976
  call void @llvm.lifetime.start.p0(i64 16, ptr %92) #5
  call void @llvm.memset.p0.i64(ptr align 8 %92, i8 0, i64 16, i1 false)
  %990 = load ptr, ptr %7, align 8, !tbaa !5
  %991 = load ptr, ptr %21, align 8, !tbaa !5
  %992 = getelementptr inbounds { ptr, ptr }, ptr %92, i32 0, i32 0
  %993 = load ptr, ptr %992, align 8
  %994 = getelementptr inbounds { ptr, ptr }, ptr %92, i32 0, i32 1
  %995 = load ptr, ptr %994, align 8
  %996 = call { ptr, ptr } @TypeChecker__getSingleArgTag__(ptr noundef %991, ptr %993, ptr %995)
  %997 = getelementptr inbounds { ptr, ptr }, ptr %93, i32 0, i32 0
  %998 = extractvalue { ptr, ptr } %996, 0
  store ptr %998, ptr %997, align 8
  %999 = getelementptr inbounds { ptr, ptr }, ptr %93, i32 0, i32 1
  %1000 = extractvalue { ptr, ptr } %996, 1
  store ptr %1000, ptr %999, align 8
  %1001 = load i32, ptr %12, align 4, !tbaa !9
  %1002 = getelementptr inbounds { ptr, ptr }, ptr %93, i32 0, i32 0
  %1003 = load ptr, ptr %1002, align 8
  %1004 = getelementptr inbounds { ptr, ptr }, ptr %93, i32 0, i32 1
  %1005 = load ptr, ptr %1004, align 8
  %1006 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %990, ptr %1003, ptr %1005, i32 noundef %1001)
  %1007 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0
  %1008 = extractvalue { ptr, ptr } %1006, 0
  store ptr %1008, ptr %1007, align 8
  %1009 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1
  %1010 = extractvalue { ptr, ptr } %1006, 1
  store ptr %1010, ptr %1009, align 8
  store i32 1, ptr %48, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %92) #5
  br label %1284

1011:                                             ; preds = %815
  %1012 = load i32, ptr %73, align 4, !tbaa !9
  %1013 = load i32, ptr %75, align 4, !tbaa !9
  %1014 = icmp ne i32 %1012, %1013
  br i1 %1014, label %1015, label %1066

1015:                                             ; preds = %1011
  call void @llvm.lifetime.start.p0(i64 1, ptr %94) #5
  %1016 = load i32, ptr %8, align 4, !tbaa !9
  %1017 = and i32 %1016, 8
  %1018 = icmp ne i32 %1017, 0
  %1019 = zext i1 %1018 to i32
  %1020 = trunc i32 %1019 to i8
  store i8 %1020, ptr %94, align 1, !tbaa !17
  %1021 = load i8, ptr %94, align 1, !tbaa !17
  %1022 = icmp ne i8 %1021, 0
  br i1 %1022, label %1023, label %1028

1023:                                             ; preds = %1015
  %1024 = load i32, ptr %75, align 4, !tbaa !9
  %1025 = icmp eq i32 %1024, 0
  %1026 = zext i1 %1025 to i32
  %1027 = trunc i32 %1026 to i8
  store i8 %1027, ptr %94, align 1, !tbaa !17
  br label %1028

1028:                                             ; preds = %1023, %1015
  %1029 = load i8, ptr %94, align 1, !tbaa !17
  %1030 = icmp ne i8 %1029, 0
  br i1 %1030, label %1031, label %1032

1031:                                             ; preds = %1028
  store i32 0, ptr %73, align 4, !tbaa !9
  br label %1065

1032:                                             ; preds = %1028
  call void @llvm.lifetime.start.p0(i64 16, ptr %95) #5
  call void @llvm.memset.p0.i64(ptr align 8 %95, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %96) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %96, ptr align 8 @__const.TypeChecker__resolveType__.local52, i64 16, i1 false)
  %1033 = getelementptr inbounds { ptr, i32 }, ptr %96, i32 0, i32 0
  %1034 = load ptr, ptr %1033, align 8
  %1035 = getelementptr inbounds { ptr, i32 }, ptr %96, i32 0, i32 1
  %1036 = load i32, ptr %1035, align 8
  call void @StringBuilder__write__(ptr noundef %95, ptr %1034, i32 %1036)
  %1037 = load i32, ptr %73, align 4, !tbaa !9
  call void @int__writeTo__(i32 noundef %1037, ptr noundef %95)
  call void @llvm.lifetime.start.p0(i64 16, ptr %97) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %97, ptr align 8 @__const.TypeChecker__resolveType__.local53, i64 16, i1 false)
  %1038 = getelementptr inbounds { ptr, i32 }, ptr %97, i32 0, i32 0
  %1039 = load ptr, ptr %1038, align 8
  %1040 = getelementptr inbounds { ptr, i32 }, ptr %97, i32 0, i32 1
  %1041 = load i32, ptr %1040, align 8
  call void @StringBuilder__write__(ptr noundef %95, ptr %1039, i32 %1041)
  %1042 = load i32, ptr %75, align 4, !tbaa !9
  call void @int__writeTo__(i32 noundef %1042, ptr noundef %95)
  call void @llvm.lifetime.start.p0(i64 16, ptr %98) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %98, ptr align 8 @__const.TypeChecker__resolveType__.local54, i64 16, i1 false)
  %1043 = getelementptr inbounds { ptr, i32 }, ptr %98, i32 0, i32 0
  %1044 = load ptr, ptr %1043, align 8
  %1045 = getelementptr inbounds { ptr, i32 }, ptr %98, i32 0, i32 1
  %1046 = load i32, ptr %1045, align 8
  call void @StringBuilder__write__(ptr noundef %95, ptr %1044, i32 %1046)
  %1047 = load ptr, ptr %7, align 8, !tbaa !5
  %1048 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %1047, i32 0, i32 2
  %1049 = load ptr, ptr %1048, align 8, !tbaa !43
  %1050 = load ptr, ptr %7, align 8, !tbaa !5
  %1051 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %1050, i32 0, i32 5
  %1052 = load ptr, ptr %1051, align 8, !tbaa !44
  %1053 = load ptr, ptr %23, align 8, !tbaa !5
  %1054 = getelementptr inbounds %struct.tag_____Token__, ptr %1053, i32 0, i32 2
  %1055 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef %95)
  %1056 = getelementptr inbounds { ptr, i32 }, ptr %100, i32 0, i32 0
  %1057 = extractvalue { ptr, i32 } %1055, 0
  store ptr %1057, ptr %1056, align 8
  %1058 = getelementptr inbounds { ptr, i32 }, ptr %100, i32 0, i32 1
  %1059 = extractvalue { ptr, i32 } %1055, 1
  store i32 %1059, ptr %1058, align 8
  %1060 = load i64, ptr %1054, align 8
  %1061 = getelementptr inbounds { ptr, i32 }, ptr %100, i32 0, i32 0
  %1062 = load ptr, ptr %1061, align 8
  %1063 = getelementptr inbounds { ptr, i32 }, ptr %100, i32 0, i32 1
  %1064 = load i32, ptr %1063, align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %99, ptr noundef %1052, i64 %1060, ptr %1062, i32 %1064)
  call void @List__add__Error____(ptr noundef %1049, ptr noundef byval(%struct.tag_____Error__) align 8 %99)
  call void @llvm.lifetime.end.p0(i64 16, ptr %98) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %97) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %96) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %95) #5
  br label %1065

1065:                                             ; preds = %1032, %1031
  call void @llvm.lifetime.end.p0(i64 1, ptr %94) #5
  br label %1066

1066:                                             ; preds = %1065, %1011
  call void @llvm.lifetime.start.p0(i64 16, ptr %101) #5
  call void @llvm.memset.p0.i64(ptr align 8 %101, i8 0, i64 16, i1 false)
  %1067 = load ptr, ptr %21, align 8, !tbaa !5
  %1068 = getelementptr inbounds %struct.tag_____Tag__, ptr %101, i32 0, i32 0
  store ptr %1067, ptr %1068, align 8, !tbaa !58
  call void @llvm.lifetime.start.p0(i64 16, ptr %102) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %102, ptr align 8 %101, i64 16, i1 false), !tbaa.struct !60
  %1069 = load i32, ptr %73, align 4, !tbaa !9
  %1070 = icmp sgt i32 %1069, 0
  br i1 %1070, label %1071, label %1154

1071:                                             ; preds = %1066
  call void @llvm.lifetime.start.p0(i64 8, ptr %103) #5
  %1072 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %1073 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %1072, i32 0, i32 1
  %1074 = load ptr, ptr %1073, align 8, !tbaa !33
  %1075 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %1076 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %1075, i32 0, i32 0
  %1077 = load ptr, ptr %1076, align 8, !tbaa !35
  %1078 = call ptr %1074(ptr noundef %1077, i64 noundef 16)
  store ptr %1078, ptr %103, align 8, !tbaa !5
  %1079 = load ptr, ptr %103, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %104) #5
  %1080 = load i32, ptr %73, align 4, !tbaa !9
  %1081 = call { ptr, i32 } @Array__cons__Tag____(i32 noundef %1080)
  %1082 = getelementptr inbounds { ptr, i32 }, ptr %104, i32 0, i32 0
  %1083 = extractvalue { ptr, i32 } %1081, 0
  store ptr %1083, ptr %1082, align 8
  %1084 = getelementptr inbounds { ptr, i32 }, ptr %104, i32 0, i32 1
  %1085 = extractvalue { ptr, i32 } %1081, 1
  store i32 %1085, ptr %1084, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %1079, ptr align 8 %104, i64 16, i1 false), !tbaa.struct !39
  call void @llvm.lifetime.end.p0(i64 16, ptr %104) #5
  %1086 = load ptr, ptr %103, align 8, !tbaa !5
  %1087 = getelementptr inbounds %struct.tag_____Tag__, ptr %102, i32 0, i32 1
  store ptr %1086, ptr %1087, align 8, !tbaa !59
  %1088 = load ptr, ptr %22, align 8, !tbaa !5
  %1089 = icmp ne ptr %1088, null
  br i1 %1089, label %1090, label %1153

1090:                                             ; preds = %1071
  call void @llvm.lifetime.start.p0(i64 8, ptr %105) #5
  %1091 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %1091, ptr %105, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %106) #5
  store i32 0, ptr %106, align 4, !tbaa !9
  br label %1092

1092:                                             ; preds = %1139, %1090
  %1093 = load i32, ptr %106, align 4, !tbaa !9
  %1094 = load ptr, ptr %105, align 8, !tbaa !5
  %1095 = getelementptr inbounds %struct.tag_____List__Node____, ptr %1094, i32 0, i32 1
  %1096 = load i32, ptr %1095, align 8, !tbaa !47
  %1097 = icmp slt i32 %1093, %1096
  br i1 %1097, label %1098, label %1142

1098:                                             ; preds = %1092
  call void @llvm.lifetime.start.p0(i64 16, ptr %107) #5
  %1099 = load ptr, ptr %105, align 8, !tbaa !5
  %1100 = getelementptr inbounds %struct.tag_____List__Node____, ptr %1099, i32 0, i32 0
  %1101 = load ptr, ptr %1100, align 8, !tbaa !49
  %1102 = load i32, ptr %106, align 4, !tbaa !9
  %1103 = sext i32 %1102 to i64
  %1104 = getelementptr inbounds %struct.Node__, ptr %1101, i64 %1103
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %107, ptr align 8 %1104, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 16, ptr %108) #5
  %1105 = load ptr, ptr %7, align 8, !tbaa !5
  %1106 = load i32, ptr %8, align 4, !tbaa !9
  %1107 = and i32 %1106, 3
  %1108 = getelementptr inbounds { i32, ptr }, ptr %107, i32 0, i32 0
  %1109 = load i32, ptr %1108, align 8
  %1110 = getelementptr inbounds { i32, ptr }, ptr %107, i32 0, i32 1
  %1111 = load ptr, ptr %1110, align 8
  %1112 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %1105, i32 %1109, ptr %1111, i32 noundef %1107)
  %1113 = getelementptr inbounds { ptr, ptr }, ptr %108, i32 0, i32 0
  %1114 = extractvalue { ptr, ptr } %1112, 0
  store ptr %1114, ptr %1113, align 8
  %1115 = getelementptr inbounds { ptr, ptr }, ptr %108, i32 0, i32 1
  %1116 = extractvalue { ptr, ptr } %1112, 1
  store ptr %1116, ptr %1115, align 8
  %1117 = load i32, ptr %106, align 4, !tbaa !9
  %1118 = load i32, ptr %73, align 4, !tbaa !9
  %1119 = icmp slt i32 %1117, %1118
  br i1 %1119, label %1120, label %1139

1120:                                             ; preds = %1098
  call void @llvm.lifetime.start.p0(i64 8, ptr %109) #5
  %1121 = getelementptr inbounds %struct.tag_____Tag__, ptr %102, i32 0, i32 1
  %1122 = load ptr, ptr %1121, align 8, !tbaa !59
  store ptr %1122, ptr %109, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %110) #5
  %1123 = load i32, ptr %106, align 4, !tbaa !9
  store i32 %1123, ptr %110, align 4, !tbaa !9
  %1124 = load i32, ptr %110, align 4, !tbaa !9
  %1125 = load ptr, ptr %109, align 8, !tbaa !5
  %1126 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %1125, i32 0, i32 1
  %1127 = load i32, ptr %1126, align 8, !tbaa !61
  %1128 = icmp ult i32 %1124, %1127
  br i1 %1128, label %1132, label %1129

1129:                                             ; preds = %1120
  %1130 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %1131 = load ptr, ptr %1130, align 8, !tbaa !5
  call void %1131(i32 noundef -3)
  br label %1132

1132:                                             ; preds = %1129, %1120
  %1133 = load ptr, ptr %109, align 8, !tbaa !5
  %1134 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %1133, i32 0, i32 0
  %1135 = load ptr, ptr %1134, align 8, !tbaa !63
  %1136 = load i32, ptr %110, align 4, !tbaa !9
  %1137 = zext i32 %1136 to i64
  %1138 = getelementptr inbounds %struct.tag_____Tag__, ptr %1135, i64 %1137
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %1138, ptr align 8 %108, i64 16, i1 false), !tbaa.struct !60
  call void @llvm.lifetime.end.p0(i64 4, ptr %110) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %109) #5
  br label %1139

1139:                                             ; preds = %1132, %1098
  %1140 = load i32, ptr %106, align 4, !tbaa !9
  %1141 = add nsw i32 %1140, 1
  store i32 %1141, ptr %106, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 16, ptr %108) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %107) #5
  br label %1092, !llvm.loop !65

1142:                                             ; preds = %1092
  call void @llvm.lifetime.end.p0(i64 4, ptr %106) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %105) #5
  %1143 = load ptr, ptr %7, align 8, !tbaa !5
  %1144 = load i32, ptr %8, align 4, !tbaa !9
  %1145 = and i32 %1144, 1
  %1146 = icmp ne i32 %1145, 0
  %1147 = zext i1 %1146 to i32
  %1148 = trunc i32 %1147 to i8
  %1149 = getelementptr inbounds { ptr, ptr }, ptr %102, i32 0, i32 0
  %1150 = load ptr, ptr %1149, align 8
  %1151 = getelementptr inbounds { ptr, ptr }, ptr %102, i32 0, i32 1
  %1152 = load ptr, ptr %1151, align 8
  call void @TypeChecker__useType__(ptr noundef %1143, ptr %1150, ptr %1152, i8 noundef zeroext %1148)
  br label %1153

1153:                                             ; preds = %1142, %1071
  call void @llvm.lifetime.end.p0(i64 8, ptr %103) #5
  br label %1271

1154:                                             ; preds = %1066
  %1155 = load ptr, ptr %22, align 8, !tbaa !5
  %1156 = icmp ne ptr %1155, null
  br i1 %1156, label %1157, label %1187

1157:                                             ; preds = %1154
  call void @llvm.lifetime.start.p0(i64 8, ptr %111) #5
  %1158 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %1158, ptr %111, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %112) #5
  store i32 0, ptr %112, align 4, !tbaa !9
  br label %1159

1159:                                             ; preds = %1165, %1157
  %1160 = load i32, ptr %112, align 4, !tbaa !9
  %1161 = load ptr, ptr %111, align 8, !tbaa !5
  %1162 = getelementptr inbounds %struct.tag_____List__Node____, ptr %1161, i32 0, i32 1
  %1163 = load i32, ptr %1162, align 8, !tbaa !47
  %1164 = icmp slt i32 %1160, %1163
  br i1 %1164, label %1165, label %1186

1165:                                             ; preds = %1159
  call void @llvm.lifetime.start.p0(i64 16, ptr %113) #5
  %1166 = load ptr, ptr %111, align 8, !tbaa !5
  %1167 = getelementptr inbounds %struct.tag_____List__Node____, ptr %1166, i32 0, i32 0
  %1168 = load ptr, ptr %1167, align 8, !tbaa !49
  %1169 = load i32, ptr %112, align 4, !tbaa !9
  %1170 = sext i32 %1169 to i64
  %1171 = getelementptr inbounds %struct.Node__, ptr %1168, i64 %1170
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %113, ptr align 8 %1171, i64 16, i1 false), !tbaa.struct !13
  %1172 = load ptr, ptr %7, align 8, !tbaa !5
  %1173 = load i32, ptr %8, align 4, !tbaa !9
  %1174 = and i32 %1173, 3
  %1175 = getelementptr inbounds { i32, ptr }, ptr %113, i32 0, i32 0
  %1176 = load i32, ptr %1175, align 8
  %1177 = getelementptr inbounds { i32, ptr }, ptr %113, i32 0, i32 1
  %1178 = load ptr, ptr %1177, align 8
  %1179 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %1172, i32 %1176, ptr %1178, i32 noundef %1174)
  %1180 = getelementptr inbounds { ptr, ptr }, ptr %114, i32 0, i32 0
  %1181 = extractvalue { ptr, ptr } %1179, 0
  store ptr %1181, ptr %1180, align 8
  %1182 = getelementptr inbounds { ptr, ptr }, ptr %114, i32 0, i32 1
  %1183 = extractvalue { ptr, ptr } %1179, 1
  store ptr %1183, ptr %1182, align 8
  %1184 = load i32, ptr %112, align 4, !tbaa !9
  %1185 = add nsw i32 %1184, 1
  store i32 %1185, ptr %112, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 16, ptr %113) #5
  br label %1159, !llvm.loop !66

1186:                                             ; preds = %1159
  call void @llvm.lifetime.end.p0(i64 4, ptr %112) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %111) #5
  br label %1187

1187:                                             ; preds = %1186, %1154
  %1188 = load ptr, ptr %21, align 8, !tbaa !5
  %1189 = load ptr, ptr %7, align 8, !tbaa !5
  %1190 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %1189, i32 0, i32 4
  %1191 = load ptr, ptr %1190, align 8, !tbaa !26
  %1192 = getelementptr inbounds %struct.tag_____CommonTags__, ptr %1191, i32 0, i32 0
  %1193 = getelementptr inbounds %struct.tag_____Tag__, ptr %1192, i32 0, i32 0
  %1194 = load ptr, ptr %1193, align 8, !tbaa !27
  %1195 = icmp eq ptr %1188, %1194
  br i1 %1195, label %1196, label %1270

1196:                                             ; preds = %1187
  %1197 = load i32, ptr %12, align 4, !tbaa !9
  %1198 = icmp sgt i32 %1197, 0
  br i1 %1198, label %1199, label %1249

1199:                                             ; preds = %1196
  call void @llvm.lifetime.start.p0(i64 16, ptr %115) #5
  call void @llvm.memset.p0.i64(ptr align 8 %115, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %116) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %116, ptr align 8 @__const.TypeChecker__resolveType__.local63, i64 16, i1 false)
  %1200 = getelementptr inbounds { ptr, i32 }, ptr %116, i32 0, i32 0
  %1201 = load ptr, ptr %1200, align 8
  %1202 = getelementptr inbounds { ptr, i32 }, ptr %116, i32 0, i32 1
  %1203 = load i32, ptr %1202, align 8
  call void @StringBuilder__write__(ptr noundef %115, ptr %1201, i32 %1203)
  %1204 = load ptr, ptr %7, align 8, !tbaa !5
  %1205 = load i32, ptr %12, align 4, !tbaa !9
  %1206 = getelementptr inbounds { ptr, ptr }, ptr %102, i32 0, i32 0
  %1207 = load ptr, ptr %1206, align 8
  %1208 = getelementptr inbounds { ptr, ptr }, ptr %102, i32 0, i32 1
  %1209 = load ptr, ptr %1208, align 8
  %1210 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %1204, ptr %1207, ptr %1209, i32 noundef %1205)
  %1211 = getelementptr inbounds { ptr, ptr }, ptr %118, i32 0, i32 0
  %1212 = extractvalue { ptr, ptr } %1210, 0
  store ptr %1212, ptr %1211, align 8
  %1213 = getelementptr inbounds { ptr, ptr }, ptr %118, i32 0, i32 1
  %1214 = extractvalue { ptr, ptr } %1210, 1
  store ptr %1214, ptr %1213, align 8
  %1215 = getelementptr inbounds { ptr, ptr }, ptr %118, i32 0, i32 0
  %1216 = load ptr, ptr %1215, align 8
  %1217 = getelementptr inbounds { ptr, ptr }, ptr %118, i32 0, i32 1
  %1218 = load ptr, ptr %1217, align 8
  %1219 = call { ptr, i32 } @Tag__toString__(ptr %1216, ptr %1218)
  %1220 = getelementptr inbounds { ptr, i32 }, ptr %117, i32 0, i32 0
  %1221 = extractvalue { ptr, i32 } %1219, 0
  store ptr %1221, ptr %1220, align 8
  %1222 = getelementptr inbounds { ptr, i32 }, ptr %117, i32 0, i32 1
  %1223 = extractvalue { ptr, i32 } %1219, 1
  store i32 %1223, ptr %1222, align 8
  %1224 = getelementptr inbounds { ptr, i32 }, ptr %117, i32 0, i32 0
  %1225 = load ptr, ptr %1224, align 8
  %1226 = getelementptr inbounds { ptr, i32 }, ptr %117, i32 0, i32 1
  %1227 = load i32, ptr %1226, align 8
  call void @StringBuilder__write__(ptr noundef %115, ptr %1225, i32 %1227)
  %1228 = load ptr, ptr %7, align 8, !tbaa !5
  %1229 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %1228, i32 0, i32 2
  %1230 = load ptr, ptr %1229, align 8, !tbaa !43
  %1231 = load ptr, ptr %7, align 8, !tbaa !5
  %1232 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %1231, i32 0, i32 5
  %1233 = load ptr, ptr %1232, align 8, !tbaa !44
  %1234 = getelementptr inbounds { i32, ptr }, ptr %9, i32 0, i32 0
  %1235 = load i32, ptr %1234, align 8
  %1236 = getelementptr inbounds { i32, ptr }, ptr %9, i32 0, i32 1
  %1237 = load ptr, ptr %1236, align 8
  %1238 = call i64 @RangeFinder__find__(i32 %1235, ptr %1237)
  store i64 %1238, ptr %120, align 4
  %1239 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef %115)
  %1240 = getelementptr inbounds { ptr, i32 }, ptr %121, i32 0, i32 0
  %1241 = extractvalue { ptr, i32 } %1239, 0
  store ptr %1241, ptr %1240, align 8
  %1242 = getelementptr inbounds { ptr, i32 }, ptr %121, i32 0, i32 1
  %1243 = extractvalue { ptr, i32 } %1239, 1
  store i32 %1243, ptr %1242, align 8
  %1244 = load i64, ptr %120, align 4
  %1245 = getelementptr inbounds { ptr, i32 }, ptr %121, i32 0, i32 0
  %1246 = load ptr, ptr %1245, align 8
  %1247 = getelementptr inbounds { ptr, i32 }, ptr %121, i32 0, i32 1
  %1248 = load i32, ptr %1247, align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %119, ptr noundef %1233, i64 %1244, ptr %1246, i32 %1248)
  call void @List__add__Error____(ptr noundef %1230, ptr noundef byval(%struct.tag_____Error__) align 8 %119)
  call void @llvm.memset.p0.i64(ptr align 8 %5, i8 0, i64 16, i1 false)
  store i32 1, ptr %48, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %116) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %115) #5
  br label %1283

1249:                                             ; preds = %1196
  %1250 = load i32, ptr %8, align 4, !tbaa !9
  %1251 = and i32 %1250, 4
  %1252 = icmp eq i32 %1251, 0
  br i1 %1252, label %1253, label %1268

1253:                                             ; preds = %1249
  %1254 = load ptr, ptr %7, align 8, !tbaa !5
  %1255 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %1254, i32 0, i32 2
  %1256 = load ptr, ptr %1255, align 8, !tbaa !43
  %1257 = load ptr, ptr %7, align 8, !tbaa !5
  %1258 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %1257, i32 0, i32 5
  %1259 = load ptr, ptr %1258, align 8, !tbaa !44
  %1260 = getelementptr inbounds { i32, ptr }, ptr %9, i32 0, i32 0
  %1261 = load i32, ptr %1260, align 8
  %1262 = getelementptr inbounds { i32, ptr }, ptr %9, i32 0, i32 1
  %1263 = load ptr, ptr %1262, align 8
  %1264 = call i64 @RangeFinder__find__(i32 %1261, ptr %1263)
  store i64 %1264, ptr %123, align 4
  %1265 = load i64, ptr %123, align 4
  %1266 = load ptr, ptr @mu_____string169, align 8
  %1267 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string169, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %122, ptr noundef %1259, i64 %1265, ptr %1266, i32 %1267)
  call void @List__add__Error____(ptr noundef %1256, ptr noundef byval(%struct.tag_____Error__) align 8 %122)
  call void @llvm.memset.p0.i64(ptr align 8 %5, i8 0, i64 16, i1 false)
  store i32 1, ptr %48, align 4
  br label %1283

1268:                                             ; preds = %1249
  br label %1269

1269:                                             ; preds = %1268
  br label %1270

1270:                                             ; preds = %1269, %1187
  br label %1271

1271:                                             ; preds = %1270, %1153
  %1272 = load ptr, ptr %7, align 8, !tbaa !5
  %1273 = load i32, ptr %12, align 4, !tbaa !9
  %1274 = getelementptr inbounds { ptr, ptr }, ptr %102, i32 0, i32 0
  %1275 = load ptr, ptr %1274, align 8
  %1276 = getelementptr inbounds { ptr, ptr }, ptr %102, i32 0, i32 1
  %1277 = load ptr, ptr %1276, align 8
  %1278 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %1272, ptr %1275, ptr %1277, i32 noundef %1273)
  %1279 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0
  %1280 = extractvalue { ptr, ptr } %1278, 0
  store ptr %1280, ptr %1279, align 8
  %1281 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1
  %1282 = extractvalue { ptr, ptr } %1278, 1
  store ptr %1282, ptr %1281, align 8
  store i32 1, ptr %48, align 4
  br label %1283

1283:                                             ; preds = %1271, %1253, %1199
  call void @llvm.lifetime.end.p0(i64 16, ptr %102) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %101) #5
  br label %1284

1284:                                             ; preds = %1283, %989, %926
  call void @llvm.lifetime.end.p0(i64 4, ptr %75) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %74) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %73) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %72) #5
  br label %1285

1285:                                             ; preds = %1284, %793
  call void @llvm.lifetime.end.p0(i64 1, ptr %64) #5
  br label %1286

1286:                                             ; preds = %1285, %693, %678, %676
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %9) #5
  br label %1287

1287:                                             ; preds = %1286, %129
  %1288 = load { ptr, ptr }, ptr %5, align 8
  ret { ptr, ptr } %1288
}

; Function Attrs: nounwind uwtable
declare dso_local void @TypeChecker__useType__(ptr noundef, ptr, ptr, i8 noundef zeroext) #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef, ptr, ptr, i32 noundef) #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, i32 } @Array__cons__Tag____(i32 noundef) #4

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { 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 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 8}
!12 = !{!"", !10, i64 0, !6, i64 8}
!13 = !{i64 0, i64 4, !9, i64 8, i64 8, !5}
!14 = !{!12, !10, i64 0}
!15 = !{!16, !6, i64 0}
!16 = !{!"tag_____TypeModifierExpression__", !6, i64 0, !12, i64 8}
!17 = !{!7, !7, i64 0}
!18 = !{!19, !6, i64 0}
!19 = !{!"tag_____UnaryOperatorExpression__", !6, i64 0, !12, i64 8}
!20 = !{!21, !6, i64 24}
!21 = !{!"tag_____TypeCheckerContext__", !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, !10, i64 120, !10, i64 124, !6, i64 128, !10, i64 136, !7, i64 140}
!22 = !{!23, !6, i64 32}
!23 = !{!"tag_____Namespace__", !24, i64 0, !6, i64 16, !10, i64 24, !10, i64 28, !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, !10, i64 104}
!24 = !{!"", !6, i64 0, !10, i64 8}
!25 = !{!23, !10, i64 28}
!26 = !{!21, !6, i64 32}
!27 = !{!28, !6, i64 0}
!28 = !{!"tag_____CommonTags__", !29, i64 0, !29, i64 16, !29, i64 32, !29, i64 48, !29, i64 64, !29, i64 80, !29, i64 96, !29, i64 112, !29, i64 128, !29, i64 144, !29, i64 160, !29, i64 176, !29, i64 192, !29, i64 208, !29, i64 224, !29, i64 240, !29, i64 256, !29, i64 272, !29, i64 288, !6, i64 304, !6, i64 312, !6, i64 320, !6, i64 328, !6, i64 336, !6, i64 344, !6, i64 352, !6, i64 360, !6, i64 368, !6, i64 376}
!29 = !{!"tag_____Tag__", !6, i64 0, !6, i64 8}
!30 = !{!21, !6, i64 56}
!31 = !{!32, !6, i64 112}
!32 = !{!"tag_____FunctionDef__", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !12, i64 56, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !10, i64 104, !6, i64 112, !24, i64 120, !24, i64 136, !29, i64 152, !10, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !24, i64 208}
!33 = !{!34, !6, i64 8}
!34 = !{!"tag_____IAllocator__", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!35 = !{!34, !6, i64 0}
!36 = !{i64 0, i64 8, !5, i64 8, i64 4, !9, i64 12, i64 4, !9}
!37 = !{i64 0, i64 8, !5, i64 8, i64 4, !9, i64 16, i64 4, !9, i64 20, i64 4, !9, i64 24, i64 4, !9, i64 32, i64 8, !5, i64 40, i64 8, !5}
!38 = !{!32, !6, i64 176}
!39 = !{i64 0, i64 8, !5, i64 8, i64 4, !9}
!40 = !{i64 0, i64 8, !5, i64 8, i64 4, !9, i64 16, i64 8, !5, i64 24, i64 4, !9, i64 28, i64 4, !9, i64 32, i64 8, !5, i64 40, i64 8, !5, i64 48, i64 8, !5, i64 56, i64 8, !5, i64 64, i64 8, !5, i64 72, i64 8, !5, i64 80, i64 8, !5, i64 88, i64 8, !5, i64 96, i64 8, !5, i64 104, i64 4, !9}
!41 = !{!21, !6, i64 48}
!42 = !{!23, !6, i64 72}
!43 = !{!21, !6, i64 16}
!44 = !{!21, !6, i64 40}
!45 = !{!46, !6, i64 24}
!46 = !{!"tag_____TypeArgsExpression__", !12, i64 0, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40}
!47 = !{!48, !10, i64 8}
!48 = !{!"tag_____List__Node____", !6, i64 0, !10, i64 8, !10, i64 12}
!49 = !{!48, !6, i64 0}
!50 = distinct !{!50, !51}
!51 = !{!"llvm.loop.mustprogress"}
!52 = !{!46, !6, i64 16}
!53 = !{!28, !6, i64 304}
!54 = distinct !{!54, !51}
!55 = !{!56, !10, i64 8}
!56 = !{!"tag_____List__Ptr__Namespace______", !6, i64 0, !10, i64 8, !10, i64 12}
!57 = !{!28, !6, i64 312}
!58 = !{!29, !6, i64 0}
!59 = !{!29, !6, i64 8}
!60 = !{i64 0, i64 8, !5, i64 8, i64 8, !5}
!61 = !{!62, !10, i64 8}
!62 = !{!"tag_____Array__Tag____", !6, i64 0, !10, i64 8}
!63 = !{!62, !6, i64 0}
!64 = distinct !{!64, !51}
!65 = distinct !{!65, !51}
!66 = distinct !{!66, !51}


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

%struct.string__ = type { ptr, i32 }
%struct.tag_____IAllocator__ = type { ptr, ptr, ptr, ptr }
%struct.tag_____Error__ = type { ptr, %struct.tag_____IntRange__, %struct.string__ }
%struct.tag_____IntRange__ = type { i32, i32 }
%struct.tag_____CustomSet__Ptr__Array__Tag________ = type { %struct.tag_____Array__SetEntry__Ptr__Array__Tag__________, i32, i32, i32, ptr, ptr }
%struct.tag_____Array__SetEntry__Ptr__Array__Tag__________ = type { ptr, i32 }
%struct.tag_____StringBuilder__ = type { ptr, i32, i32 }
%struct.Node__ = type { i32, ptr }
%struct.tag_____Tag__ = type { ptr, ptr }

@mu_____string160 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string75 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string169 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string166 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string165 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string164 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string74 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string163 = external dso_local local_unnamed_addr global %struct.string__, align 8
@top_____currentAllocator__ = external dso_local thread_local local_unnamed_addr global %struct.tag_____IAllocator__, align 8
@top_____abandonFn__ = external dso_local thread_local local_unnamed_addr global ptr, align 8
@__const.TypeChecker__resolveType__.local19 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local21 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local24 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local26 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local52 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local53 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local54 = external hidden unnamed_addr constant %struct.string__, align 8
@__const.TypeChecker__resolveType__.local63 = external hidden unnamed_addr constant %struct.string__, align 8

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @StringBuilder__write__(ptr noundef, ptr, i32) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, i32 } @StringBuilder__compactToString__(ptr noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @string__equals__(ptr, i32, ptr, i32) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local void @int__writeTo__(i32 noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local void @List__add__Error____(ptr noundef, ptr noundef byval(%struct.tag_____Error__) align 8) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local void @Error__at__(ptr dead_on_unwind noalias writable sret(%struct.tag_____Error__) align 8, ptr noundef, i64, ptr, i32) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @TypeCheckerFirstPass__isSingleUppercaseLetter__(ptr, i32) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local ptr @TypeChecker__findTypeParamByNameOrNull__(ptr noundef, ptr, i32) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local void @List__add__Ptr__Namespace______(ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local { i32, ptr } @Map__getOrDefault__string__Node____(ptr noundef, ptr, i32) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local i64 @RangeFinder__find__(i32, ptr) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, ptr } @TypeChecker__getSingleArgTag__(ptr noundef, ptr, ptr) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, i32 } @Tag__toString__(ptr, ptr) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local void @Tag__createArgsSet__(ptr dead_on_unwind noalias writable sret(%struct.tag_____CustomSet__Ptr__Array__Tag________) align 8) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %1, ptr %2, i32 noundef %3) local_unnamed_addr #4 {
  %5 = alloca %struct.tag_____CustomSet__Ptr__Array__Tag________, align 8
  %.sroa.0170 = alloca [28 x i8], align 8
  %6 = alloca %struct.tag_____StringBuilder__, align 8
  %7 = alloca %struct.tag_____Error__, align 8
  %8 = alloca %struct.tag_____StringBuilder__, align 8
  %9 = alloca %struct.tag_____Error__, align 8
  %10 = alloca %struct.tag_____StringBuilder__, align 8
  %11 = alloca %struct.tag_____Error__, align 8
  %12 = alloca %struct.tag_____StringBuilder__, align 8
  %13 = alloca %struct.tag_____Error__, align 8
  %14 = alloca %struct.tag_____Error__, align 8
  %15 = alloca %struct.tag_____Error__, align 8
  %16 = alloca %struct.tag_____Error__, align 8
  %17 = alloca %struct.tag_____Error__, align 8
  %18 = alloca %struct.tag_____StringBuilder__, align 8
  %19 = alloca %struct.tag_____Error__, align 8
  %20 = alloca %struct.tag_____StringBuilder__, align 8
  %21 = alloca %struct.tag_____Error__, align 8
  %22 = alloca %struct.tag_____Error__, align 8
  %23 = icmp eq ptr %2, null
  br i1 %23, label %.loopexit, label %24

24:                                               ; preds = %4
  %25 = icmp eq i32 %1, 4
  br i1 %25, label %26, label %27

26:                                               ; preds = %24
  %.sroa.0348.0.copyload = load i32, ptr %2, align 8, !tbaa !5
  %.sroa.20.0..sroa_idx = getelementptr inbounds i8, ptr %2, i64 8
  %.sroa.20.0.copyload = load ptr, ptr %.sroa.20.0..sroa_idx, align 8, !tbaa !9
  br label %27

27:                                               ; preds = %26, %24
  %.0 = phi ptr [ %2, %26 ], [ null, %24 ]
  %.sroa.0348.0 = phi i32 [ %.sroa.0348.0.copyload, %26 ], [ %1, %24 ]
  %.sroa.20.0 = phi ptr [ %.sroa.20.0.copyload, %26 ], [ %2, %24 ]
  br label %28

28:                                               ; preds = %52, %27
  %.0375 = phi ptr [ null, %27 ], [ %.1376, %52 ]
  %.0374 = phi i32 [ 0, %27 ], [ %.1, %52 ]
  %.sroa.0348.1 = phi i32 [ %.sroa.0348.0, %27 ], [ %.sroa.0348.0.copyload352, %52 ]
  %.sroa.20.1 = phi ptr [ %.sroa.20.0, %27 ], [ %.sroa.20.0.copyload359, %52 ]
  switch i32 %.sroa.0348.1, label %.thread [
    i32 3, label %29
    i32 9, label %54
  ]

29:                                               ; preds = %28
  %30 = load ptr, ptr %.sroa.20.1, align 8, !tbaa !11
  %31 = getelementptr inbounds i8, ptr %30, i64 8
  %32 = load ptr, ptr %31, align 8
  %33 = getelementptr inbounds i8, ptr %30, i64 16
  %34 = load i32, ptr %33, align 8
  %35 = load ptr, ptr @mu_____string74, align 8
  %36 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string74, i64 8), align 8
  %37 = tail call zeroext i8 @string__equals__(ptr %32, i32 %34, ptr %35, i32 %36)
  %.not441 = icmp eq i8 %37, 0
  br i1 %.not441, label %40, label %38

38:                                               ; preds = %29
  %39 = add nsw i32 %.0374, 1
  br label %52

40:                                               ; preds = %29
  %41 = load ptr, ptr %.sroa.20.1, align 8, !tbaa !11
  %42 = getelementptr inbounds i8, ptr %41, i64 8
  %43 = load ptr, ptr %42, align 8
  %44 = getelementptr inbounds i8, ptr %41, i64 16
  %45 = load i32, ptr %44, align 8
  %46 = load ptr, ptr @mu_____string75, align 8
  %47 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string75, i64 8), align 8
  %48 = tail call zeroext i8 @string__equals__(ptr %43, i32 %45, ptr %46, i32 %47)
  %.not442 = icmp eq i8 %48, 0
  br i1 %.not442, label %52, label %49

49:                                               ; preds = %40
  %50 = add nsw i32 %.0374, -1
  %51 = icmp eq ptr %.0375, null
  %spec.select = select i1 %51, ptr %.sroa.20.1, ptr %.0375
  br label %52

52:                                               ; preds = %49, %40, %38
  %.1376 = phi ptr [ %.0375, %38 ], [ %.0375, %40 ], [ %spec.select, %49 ]
  %.1 = phi i32 [ %39, %38 ], [ %.0374, %40 ], [ %50, %49 ]
  %53 = getelementptr inbounds i8, ptr %.sroa.20.1, i64 8
  %.sroa.0348.0.copyload352 = load i32, ptr %53, align 8, !tbaa !5
  %.sroa.20.0..sroa_idx358 = getelementptr inbounds i8, ptr %.sroa.20.1, i64 16
  %.sroa.20.0.copyload359 = load ptr, ptr %.sroa.20.0..sroa_idx358, align 8, !tbaa !9
  br label %28

54:                                               ; preds = %28
  %55 = load ptr, ptr %.sroa.20.1, align 8, !tbaa !14
  %56 = getelementptr inbounds i8, ptr %55, i64 8
  %57 = load ptr, ptr %56, align 8
  %58 = getelementptr inbounds i8, ptr %55, i64 16
  %59 = load i32, ptr %58, align 8
  %60 = load ptr, ptr @mu_____string160, align 8
  %61 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string160, i64 8), align 8
  %62 = tail call zeroext i8 @string__equals__(ptr %57, i32 %59, ptr %60, i32 %61)
  %.not = icmp eq i8 %62, 0
  br i1 %.not, label %.thread450, label %63

63:                                               ; preds = %54
  %64 = getelementptr inbounds i8, ptr %.sroa.20.1, i64 8
  %.sroa.0348.0.copyload353 = load i32, ptr %64, align 8, !tbaa !5
  %.sroa.20.0..sroa_idx360 = getelementptr inbounds i8, ptr %.sroa.20.1, i64 16
  %.sroa.20.0.copyload361 = load ptr, ptr %.sroa.20.0..sroa_idx360, align 8, !tbaa !9
  br label %.thread

.thread:                                          ; preds = %28, %63
  %.not424517 = phi i1 [ true, %63 ], [ false, %28 ]
  %.sroa.0348.2 = phi i32 [ %.sroa.0348.0.copyload353, %63 ], [ %.sroa.0348.1, %28 ]
  %.sroa.20.2 = phi ptr [ %.sroa.20.0.copyload361, %63 ], [ %.sroa.20.1, %28 ]
  switch i32 %.sroa.0348.2, label %.thread450 [
    i32 21, label %65
    i32 0, label %.loopexit
  ]

65:                                               ; preds = %.thread
  %66 = getelementptr inbounds i8, ptr %0, i64 24
  %67 = load ptr, ptr %66, align 8, !tbaa !16
  %68 = getelementptr inbounds i8, ptr %67, i64 32
  %69 = load ptr, ptr %68, align 8, !tbaa !18
  %70 = getelementptr inbounds i8, ptr %.sroa.20.2, i64 8
  %71 = load ptr, ptr %70, align 8
  %72 = getelementptr inbounds i8, ptr %.sroa.20.2, i64 16
  %73 = load i32, ptr %72, align 8
  %74 = tail call { i32, ptr } @Map__getOrDefault__string__Node____(ptr noundef %69, ptr %71, i32 %73)
  %75 = extractvalue { i32, ptr } %74, 0
  %76 = extractvalue { i32, ptr } %74, 1
  %77 = icmp eq i32 %75, 22
  br i1 %77, label %78, label %.thread456.thread

78:                                               ; preds = %65
  %79 = getelementptr inbounds i8, ptr %76, i64 28
  %80 = load i32, ptr %79, align 4, !tbaa !21
  %81 = and i32 %80, 223741
  %.not419 = icmp eq i32 %81, 0
  br i1 %.not419, label %82, label %.thread456

82:                                               ; preds = %78
  %83 = getelementptr inbounds i8, ptr %0, i64 32
  %84 = load ptr, ptr %83, align 8, !tbaa !22
  %85 = load ptr, ptr %84, align 8, !tbaa !23
  %86 = icmp ne ptr %76, %85
  %cond.fr = freeze i1 %86
  %spec.select516 = select i1 %cond.fr, ptr null, ptr %76
  br label %.thread456

.thread456:                                       ; preds = %82, %78
  %.1380 = phi ptr [ %76, %78 ], [ %spec.select516, %82 ]
  %87 = icmp eq ptr %.0, null
  br i1 %87, label %89, label %161

.thread456.thread:                                ; preds = %65
  %88 = icmp eq ptr %.0, null
  br i1 %88, label %89, label %.thread567

89:                                               ; preds = %.thread456.thread, %.thread456
  %.1380565 = phi ptr [ null, %.thread456.thread ], [ %.1380, %.thread456 ]
  %90 = icmp ne ptr %.1380565, null
  %.not424 = or i1 %.not424517, %90
  br i1 %.not424, label %.thread460, label %91

91:                                               ; preds = %89
  %92 = getelementptr inbounds i8, ptr %0, i64 56
  %93 = load ptr, ptr %92, align 8, !tbaa !26
  %.not425 = icmp eq ptr %93, null
  br i1 %.not425, label %126, label %94

94:                                               ; preds = %91
  %95 = getelementptr inbounds i8, ptr %93, i64 112
  %96 = load ptr, ptr %95, align 8, !tbaa !27
  %.not428 = icmp eq ptr %96, null
  br i1 %.not428, label %101, label %97

97:                                               ; preds = %94
  %98 = load ptr, ptr %70, align 8
  %99 = load i32, ptr %72, align 8
  %100 = tail call ptr @TypeChecker__findTypeParamByNameOrNull__(ptr noundef nonnull %96, ptr %98, i32 %99)
  br label %101

101:                                              ; preds = %97, %94
  %.2381 = phi ptr [ %100, %97 ], [ null, %94 ]
  %102 = icmp ne ptr %.2381, null
  %103 = and i32 %3, 2
  %.not429518 = icmp eq i32 %103, 0
  %.not429 = or i1 %.not429518, %102
  br i1 %.not429, label %.thread460, label %104

104:                                              ; preds = %101
  %105 = load ptr, ptr %70, align 8
  %106 = load i32, ptr %72, align 8
  %107 = tail call zeroext i8 @TypeCheckerFirstPass__isSingleUppercaseLetter__(ptr %105, i32 %106)
  %.not430 = icmp eq i8 %107, 0
  br i1 %.not430, label %.thread460.thread, label %108

108:                                              ; preds = %104
  %109 = load ptr, ptr %92, align 8, !tbaa !26
  %110 = getelementptr inbounds i8, ptr %109, i64 112
  %111 = load ptr, ptr %110, align 8, !tbaa !27
  %112 = icmp eq ptr %111, null
  br i1 %112, label %113, label %._crit_edge560

._crit_edge560:                                   ; preds = %108
  %.pre561 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  br label %205

113:                                              ; preds = %108
  %114 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %115 = getelementptr inbounds i8, ptr %114, i64 8
  %116 = load ptr, ptr %115, align 8, !tbaa !29
  %117 = load ptr, ptr %114, align 8, !tbaa !31
  %118 = tail call ptr %116(ptr noundef %117, i64 noundef 16) #5
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %118, i8 0, i64 16, i1 false)
  %119 = load ptr, ptr %92, align 8, !tbaa !26
  %120 = getelementptr inbounds i8, ptr %119, i64 112
  store ptr %118, ptr %120, align 8, !tbaa !27
  %121 = load ptr, ptr %115, align 8, !tbaa !29
  %122 = load ptr, ptr %114, align 8, !tbaa !31
  %123 = tail call ptr %121(ptr noundef %122, i64 noundef 48) #5
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %5) #5
  call void @Tag__createArgsSet__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____CustomSet__Ptr__Array__Tag________) align 8 %5)
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(48) %123, ptr noundef nonnull align 8 dereferenceable(48) %5, i64 48, i1 false), !tbaa.struct !32
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %5) #5
  %124 = load ptr, ptr %92, align 8, !tbaa !26
  %125 = getelementptr inbounds i8, ptr %124, i64 176
  store ptr %123, ptr %125, align 8, !tbaa !33
  br label %205

126:                                              ; preds = %91
  %127 = and i32 %3, 1
  %.not426 = icmp eq i32 %127, 0
  br i1 %.not426, label %.thread460.thread, label %128

128:                                              ; preds = %126
  %129 = getelementptr inbounds i8, ptr %0, i64 48
  %130 = load ptr, ptr %129, align 8, !tbaa !34
  %131 = getelementptr inbounds i8, ptr %130, i64 72
  %132 = load ptr, ptr %131, align 8, !tbaa !35
  %.not519 = icmp eq ptr %132, null
  br i1 %.not519, label %.thread460.thread, label %133

133:                                              ; preds = %128
  %134 = load ptr, ptr %70, align 8
  %135 = load i32, ptr %72, align 8
  %136 = tail call ptr @TypeChecker__findTypeParamByNameOrNull__(ptr noundef nonnull %132, ptr %134, i32 %135)
  br label %.thread460

.thread460:                                       ; preds = %101, %133, %89
  %.5 = phi ptr [ %.1380565, %89 ], [ %136, %133 ], [ %.2381, %101 ]
  %.not432 = icmp eq ptr %.5, null
  br i1 %.not432, label %.thread460.thread, label %.thread491

.thread460.thread:                                ; preds = %126, %128, %104, %.thread460
  %.not431 = icmp eq ptr %76, null
  %137 = getelementptr inbounds i8, ptr %0, i64 16
  %138 = getelementptr inbounds i8, ptr %0, i64 40
  %139 = getelementptr inbounds i8, ptr %.sroa.20.2, i64 24
  br i1 %.not431, label %149, label %140

140:                                              ; preds = %.thread460.thread
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %6, i8 0, i64 16, i1 false)
  %.sroa.0165.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local19, align 8
  %.sroa.4166.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local19, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %6, ptr %.sroa.0165.0.copyload, i32 %.sroa.4166.0.copyload)
  %141 = load ptr, ptr %70, align 8
  %142 = load i32, ptr %72, align 8
  call void @StringBuilder__write__(ptr noundef nonnull %6, ptr %141, i32 %142)
  %143 = load ptr, ptr %137, align 8, !tbaa !36
  %144 = load ptr, ptr %138, align 8, !tbaa !37
  %145 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef nonnull %6)
  %146 = extractvalue { ptr, i32 } %145, 0
  %147 = extractvalue { ptr, i32 } %145, 1
  %148 = load i64, ptr %139, align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %7, ptr noundef %144, i64 %148, ptr %146, i32 %147)
  call void @List__add__Error____(ptr noundef %143, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %7)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #5
  br label %.thread499

149:                                              ; preds = %.thread460.thread
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %8, i8 0, i64 16, i1 false)
  %.sroa.0160.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local21, align 8
  %.sroa.4161.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local21, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %8, ptr %.sroa.0160.0.copyload, i32 %.sroa.4161.0.copyload)
  %150 = load ptr, ptr %70, align 8
  %151 = load i32, ptr %72, align 8
  call void @StringBuilder__write__(ptr noundef nonnull %8, ptr %150, i32 %151)
  %152 = load ptr, ptr %137, align 8, !tbaa !36
  %153 = load ptr, ptr %138, align 8, !tbaa !37
  %154 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef nonnull %8)
  %155 = extractvalue { ptr, i32 } %154, 0
  %156 = extractvalue { ptr, i32 } %154, 1
  %157 = load i64, ptr %139, align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %9, ptr noundef %153, i64 %157, ptr %155, i32 %156)
  call void @List__add__Error____(ptr noundef %152, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %9)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #5
  br label %.thread499

.thread499:                                       ; preds = %140, %149
  %158 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef nonnull %0, ptr null, ptr null, i32 noundef %.0374)
  %159 = extractvalue { ptr, ptr } %158, 0
  %160 = extractvalue { ptr, ptr } %158, 1
  br label %.loopexit

161:                                              ; preds = %.thread456
  %162 = icmp eq ptr %.1380, null
  br i1 %162, label %.thread567, label %.thread471

.thread567:                                       ; preds = %.thread456.thread, %161
  %.not421 = icmp eq ptr %76, null
  %163 = getelementptr inbounds i8, ptr %0, i64 16
  %164 = getelementptr inbounds i8, ptr %0, i64 40
  %165 = getelementptr inbounds i8, ptr %.sroa.20.2, i64 24
  br i1 %.not421, label %175, label %166

166:                                              ; preds = %.thread567
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %10, i8 0, i64 16, i1 false)
  %.sroa.0150.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local24, align 8
  %.sroa.4151.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local24, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %10, ptr %.sroa.0150.0.copyload, i32 %.sroa.4151.0.copyload)
  %167 = load ptr, ptr %70, align 8
  %168 = load i32, ptr %72, align 8
  call void @StringBuilder__write__(ptr noundef nonnull %10, ptr %167, i32 %168)
  %169 = load ptr, ptr %163, align 8, !tbaa !36
  %170 = load ptr, ptr %164, align 8, !tbaa !37
  %171 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef nonnull %10)
  %172 = extractvalue { ptr, i32 } %171, 0
  %173 = extractvalue { ptr, i32 } %171, 1
  %174 = load i64, ptr %165, align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %11, ptr noundef %170, i64 %174, ptr %172, i32 %173)
  call void @List__add__Error____(ptr noundef %169, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %11)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #5
  br label %184

175:                                              ; preds = %.thread567
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %12, i8 0, i64 16, i1 false)
  %.sroa.0145.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local26, align 8
  %.sroa.4146.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local26, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %12, ptr %.sroa.0145.0.copyload, i32 %.sroa.4146.0.copyload)
  %176 = load ptr, ptr %70, align 8
  %177 = load i32, ptr %72, align 8
  call void @StringBuilder__write__(ptr noundef nonnull %12, ptr %176, i32 %177)
  %178 = load ptr, ptr %163, align 8, !tbaa !36
  %179 = load ptr, ptr %164, align 8, !tbaa !37
  %180 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef nonnull %12)
  %181 = extractvalue { ptr, i32 } %180, 0
  %182 = extractvalue { ptr, i32 } %180, 1
  %183 = load i64, ptr %165, align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %13, ptr noundef %179, i64 %183, ptr %181, i32 %182)
  call void @List__add__Error____(ptr noundef %178, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %13)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #5
  br label %184

184:                                              ; preds = %175, %166
  %185 = getelementptr inbounds i8, ptr %.0, i64 24
  %186 = load ptr, ptr %185, align 8, !tbaa !38
  %.not422 = icmp eq ptr %186, null
  br i1 %.not422, label %.thread483, label %.preheader523

.preheader523:                                    ; preds = %184
  %187 = getelementptr inbounds i8, ptr %186, i64 8
  %188 = load i32, ptr %187, align 8, !tbaa !40
  %189 = icmp sgt i32 %188, 0
  br i1 %189, label %.lr.ph, label %.thread483

.lr.ph:                                           ; preds = %.preheader523
  %190 = and i32 %3, 3
  br label %191

191:                                              ; preds = %.lr.ph, %191
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %191 ]
  %192 = load ptr, ptr %186, align 8, !tbaa !42
  %193 = getelementptr inbounds %struct.Node__, ptr %192, i64 %indvars.iv
  %.sroa.0135.0.copyload = load i32, ptr %193, align 8, !tbaa !5
  %.sroa.4137.0..sroa_idx = getelementptr inbounds i8, ptr %193, i64 8
  %.sroa.4137.0.copyload = load ptr, ptr %.sroa.4137.0..sroa_idx, align 8, !tbaa !9
  %194 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %.sroa.0135.0.copyload, ptr %.sroa.4137.0.copyload, i32 noundef %190)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %195 = load i32, ptr %187, align 8, !tbaa !40
  %196 = sext i32 %195 to i64
  %197 = icmp slt i64 %indvars.iv.next, %196
  br i1 %197, label %191, label %.thread483, !llvm.loop !43

.thread483:                                       ; preds = %191, %.preheader523, %184
  %198 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %0, ptr null, ptr null, i32 noundef %.0374)
  %199 = extractvalue { ptr, ptr } %198, 0
  %200 = extractvalue { ptr, ptr } %198, 1
  br label %.loopexit

.thread471:                                       ; preds = %161
  %201 = getelementptr inbounds i8, ptr %.0, i64 24
  %202 = load ptr, ptr %201, align 8, !tbaa !38
  %203 = getelementptr inbounds i8, ptr %.0, i64 16
  %204 = load ptr, ptr %203, align 8, !tbaa !45
  br label %.thread491

205:                                              ; preds = %._crit_edge560, %113
  %.pre-phi = phi ptr [ %.pre561, %._crit_edge560 ], [ %114, %113 ]
  %206 = getelementptr inbounds i8, ptr %.pre-phi, i64 8
  %207 = load ptr, ptr %206, align 8, !tbaa !29
  %208 = load ptr, ptr %.pre-phi, align 8, !tbaa !31
  %209 = call ptr %207(ptr noundef %208, i64 noundef 112) #5
  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %.sroa.0170)
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %.sroa.0170, i8 0, i64 28, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %.sroa.0170, ptr noundef nonnull align 8 dereferenceable(16) %70, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %209, ptr noundef nonnull align 8 dereferenceable(28) %.sroa.0170, i64 28, i1 false), !tbaa.struct !47
  %.sroa.5171.0..sroa_idx = getelementptr inbounds i8, ptr %209, i64 28
  store i32 16384, ptr %.sroa.5171.0..sroa_idx, align 4, !tbaa !5
  %.sroa.6172.0..sroa_idx = getelementptr inbounds i8, ptr %209, i64 32
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(80) %.sroa.6172.0..sroa_idx, i8 0, i64 80, i1 false)
  %210 = load ptr, ptr %92, align 8, !tbaa !26
  %211 = getelementptr inbounds i8, ptr %210, i64 112
  %212 = load ptr, ptr %211, align 8, !tbaa !27
  call void @List__add__Ptr__Namespace______(ptr noundef %212, ptr noundef %209)
  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %.sroa.0170)
  br label %.thread491

.thread450:                                       ; preds = %54, %.thread
  %213 = getelementptr inbounds i8, ptr %0, i64 16
  %214 = load ptr, ptr %213, align 8, !tbaa !36
  %215 = getelementptr inbounds i8, ptr %0, i64 40
  %216 = load ptr, ptr %215, align 8, !tbaa !37
  %217 = tail call i64 @RangeFinder__find__(i32 %1, ptr nonnull %2)
  %218 = load ptr, ptr @mu_____string163, align 8
  %219 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string163, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %14, ptr noundef %216, i64 %217, ptr %218, i32 %219)
  call void @List__add__Error____(ptr noundef %214, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %14)
  br label %.loopexit

.thread491:                                       ; preds = %205, %.thread460, %.thread471
  %.7482 = phi ptr [ %.1380, %.thread471 ], [ %209, %205 ], [ %.5, %.thread460 ]
  %.1383481 = phi ptr [ %202, %.thread471 ], [ null, %205 ], [ null, %.thread460 ]
  %.2386480 = phi ptr [ %204, %.thread471 ], [ %.sroa.20.2, %205 ], [ %.sroa.20.2, %.thread460 ]
  %220 = getelementptr inbounds i8, ptr %.7482, i64 28
  %221 = load i32, ptr %220, align 4, !tbaa !21
  %222 = and i32 %221, 512
  %.not433 = icmp ne i32 %222, 0
  %223 = and i32 %3, 8
  %224 = icmp eq i32 %223, 0
  %narrow = and i1 %224, %.not433
  %225 = zext i1 %narrow to i32
  %.2 = add nsw i32 %.0374, %225
  %226 = icmp slt i32 %.2, 0
  br i1 %226, label %227, label %237

227:                                              ; preds = %.thread491
  %228 = getelementptr inbounds i8, ptr %0, i64 16
  %229 = load ptr, ptr %228, align 8, !tbaa !36
  %230 = getelementptr inbounds i8, ptr %0, i64 40
  %231 = load ptr, ptr %230, align 8, !tbaa !37
  %232 = load ptr, ptr %.0375, align 8, !tbaa !11
  %233 = getelementptr inbounds i8, ptr %232, i64 24
  %234 = load i64, ptr %233, align 8
  %235 = load ptr, ptr @mu_____string164, align 8
  %236 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string164, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %15, ptr noundef %231, i64 %234, ptr %235, i32 %236)
  call void @List__add__Error____(ptr noundef %229, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %15)
  br label %237

237:                                              ; preds = %227, %.thread491
  %238 = getelementptr inbounds i8, ptr %0, i64 32
  %239 = load ptr, ptr %238, align 8, !tbaa !22
  %240 = getelementptr inbounds i8, ptr %239, i64 304
  %241 = load ptr, ptr %240, align 8, !tbaa !48
  %242 = icmp eq ptr %.7482, %241
  br i1 %242, label %243, label %263

243:                                              ; preds = %237
  %244 = getelementptr inbounds i8, ptr %0, i64 16
  %245 = load ptr, ptr %244, align 8, !tbaa !36
  %246 = getelementptr inbounds i8, ptr %0, i64 40
  %247 = load ptr, ptr %246, align 8, !tbaa !37
  %248 = getelementptr inbounds i8, ptr %.sroa.20.2, i64 24
  %249 = load i64, ptr %248, align 8
  %250 = load ptr, ptr @mu_____string165, align 8
  %251 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string165, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %16, ptr noundef %247, i64 %249, ptr %250, i32 %251)
  call void @List__add__Error____(ptr noundef %245, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %16)
  %.not440 = icmp eq ptr %.1383481, null
  br i1 %.not440, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %243
  %252 = getelementptr inbounds i8, ptr %.1383481, i64 8
  %253 = load i32, ptr %252, align 8, !tbaa !40
  %254 = icmp sgt i32 %253, 0
  br i1 %254, label %.lr.ph539, label %.loopexit

.lr.ph539:                                        ; preds = %.preheader
  %255 = and i32 %3, 3
  br label %256

256:                                              ; preds = %.lr.ph539, %256
  %indvars.iv557 = phi i64 [ 0, %.lr.ph539 ], [ %indvars.iv.next558, %256 ]
  %257 = load ptr, ptr %.1383481, align 8, !tbaa !42
  %258 = getelementptr inbounds %struct.Node__, ptr %257, i64 %indvars.iv557
  %.sroa.0117.0.copyload = load i32, ptr %258, align 8, !tbaa !5
  %.sroa.4119.0..sroa_idx = getelementptr inbounds i8, ptr %258, i64 8
  %.sroa.4119.0.copyload = load ptr, ptr %.sroa.4119.0..sroa_idx, align 8, !tbaa !9
  %259 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %.sroa.0117.0.copyload, ptr %.sroa.4119.0.copyload, i32 noundef %255)
  %indvars.iv.next558 = add nuw nsw i64 %indvars.iv557, 1
  %260 = load i32, ptr %252, align 8, !tbaa !40
  %261 = sext i32 %260 to i64
  %262 = icmp slt i64 %indvars.iv.next558, %261
  br i1 %262, label %256, label %.loopexit, !llvm.loop !49

263:                                              ; preds = %237
  %264 = getelementptr inbounds i8, ptr %.7482, i64 72
  %265 = load ptr, ptr %264, align 8, !tbaa !35
  %.not435 = icmp eq ptr %265, null
  br i1 %.not435, label %269, label %266

266:                                              ; preds = %263
  %267 = getelementptr inbounds i8, ptr %265, i64 8
  %268 = load i32, ptr %267, align 8, !tbaa !50
  br label %269

269:                                              ; preds = %263, %266
  %.0398 = phi i32 [ %268, %266 ], [ 0, %263 ]
  %.not436 = icmp eq ptr %.1383481, null
  br i1 %.not436, label %.thread507, label %270

270:                                              ; preds = %269
  %271 = getelementptr inbounds i8, ptr %.1383481, i64 8
  %272 = load i32, ptr %271, align 8, !tbaa !40
  %273 = getelementptr inbounds i8, ptr %239, i64 312
  %274 = load ptr, ptr %273, align 8, !tbaa !52
  %275 = icmp eq ptr %.7482, %274
  br i1 %275, label %279, label %362

.thread507:                                       ; preds = %269
  %276 = getelementptr inbounds i8, ptr %239, i64 312
  %277 = load ptr, ptr %276, align 8, !tbaa !52
  %278 = icmp eq ptr %.7482, %277
  br i1 %278, label %346, label %362

279:                                              ; preds = %270
  %280 = icmp sgt i32 %272, 0
  br i1 %280, label %281, label %355

281:                                              ; preds = %279
  %282 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %283 = getelementptr inbounds i8, ptr %282, i64 8
  %284 = load ptr, ptr %283, align 8, !tbaa !29
  %285 = load ptr, ptr %282, align 8, !tbaa !31
  %286 = call ptr %284(ptr noundef %285, i64 noundef 16) #5
  %287 = call { ptr, i32 } @Array__cons__Tag____(i32 noundef %272)
  %288 = extractvalue { ptr, i32 } %287, 0
  %289 = extractvalue { ptr, i32 } %287, 1
  store ptr %288, ptr %286, align 8, !tbaa !9
  %.sroa.494.0..sroa_idx = getelementptr inbounds i8, ptr %286, i64 8
  store i32 %289, ptr %.sroa.494.0..sroa_idx, align 8, !tbaa !5
  %290 = add nsw i32 %272, -1
  %.not540 = icmp eq i32 %272, 1
  br i1 %.not540, label %._crit_edge, label %.lr.ph532

.lr.ph532:                                        ; preds = %281
  %291 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %292 = and i32 %3, 3
  %wide.trip.count = zext nneg i32 %290 to i64
  br label %293

293:                                              ; preds = %.lr.ph532, %305
  %indvars.iv548 = phi i64 [ 0, %.lr.ph532 ], [ %indvars.iv.next549, %305 ]
  %294 = load i32, ptr %.sroa.494.0..sroa_idx, align 8, !tbaa !53
  %295 = zext i32 %294 to i64
  %296 = icmp ult i64 %indvars.iv548, %295
  br i1 %296, label %299, label %297

297:                                              ; preds = %293
  %298 = load ptr, ptr %291, align 8, !tbaa !9
  call void %298(i32 noundef -3) #5
  br label %299

299:                                              ; preds = %297, %293
  %300 = load i32, ptr %271, align 8, !tbaa !40
  %301 = zext i32 %300 to i64
  %302 = icmp ult i64 %indvars.iv548, %301
  br i1 %302, label %305, label %303

303:                                              ; preds = %299
  %304 = load ptr, ptr %291, align 8, !tbaa !9
  call void %304(i32 noundef -3) #5
  br label %305

305:                                              ; preds = %303, %299
  %306 = load ptr, ptr %286, align 8, !tbaa !55
  %307 = getelementptr inbounds %struct.tag_____Tag__, ptr %306, i64 %indvars.iv548
  %308 = load ptr, ptr %.1383481, align 8, !tbaa !42
  %309 = getelementptr inbounds %struct.Node__, ptr %308, i64 %indvars.iv548
  %310 = load i32, ptr %309, align 8
  %311 = getelementptr inbounds i8, ptr %309, i64 8
  %312 = load ptr, ptr %311, align 8
  %313 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %310, ptr %312, i32 noundef %292)
  %314 = extractvalue { ptr, ptr } %313, 0
  %315 = extractvalue { ptr, ptr } %313, 1
  store ptr %314, ptr %307, align 8, !tbaa !9
  %.sroa.474.0..sroa_idx = getelementptr inbounds i8, ptr %307, i64 8
  store ptr %315, ptr %.sroa.474.0..sroa_idx, align 8, !tbaa !9
  %indvars.iv.next549 = add nuw nsw i64 %indvars.iv548, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next549, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge.loopexit, label %293, !llvm.loop !56

._crit_edge.loopexit:                             ; preds = %305
  %.pre = load i32, ptr %.sroa.494.0..sroa_idx, align 8, !tbaa !53
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %281
  %316 = phi i32 [ %.pre, %._crit_edge.loopexit ], [ %289, %281 ]
  %317 = icmp ult i32 %290, %316
  br i1 %317, label %321, label %318

318:                                              ; preds = %._crit_edge
  %319 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %320 = load ptr, ptr %319, align 8, !tbaa !9
  call void %320(i32 noundef -3) #5
  br label %321

321:                                              ; preds = %318, %._crit_edge
  %322 = load i32, ptr %271, align 8, !tbaa !40
  %323 = icmp ult i32 %290, %322
  br i1 %323, label %327, label %324

324:                                              ; preds = %321
  %325 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %326 = load ptr, ptr %325, align 8, !tbaa !9
  call void %326(i32 noundef -3) #5
  br label %327

327:                                              ; preds = %324, %321
  %328 = load ptr, ptr %286, align 8, !tbaa !55
  %329 = zext nneg i32 %290 to i64
  %330 = getelementptr inbounds %struct.tag_____Tag__, ptr %328, i64 %329
  %331 = load ptr, ptr %.1383481, align 8, !tbaa !42
  %332 = getelementptr inbounds %struct.Node__, ptr %331, i64 %329
  %333 = and i32 %3, 3
  %334 = or disjoint i32 %333, 4
  %335 = load i32, ptr %332, align 8
  %336 = getelementptr inbounds i8, ptr %332, i64 8
  %337 = load ptr, ptr %336, align 8
  %338 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %335, ptr %337, i32 noundef %334)
  %339 = extractvalue { ptr, ptr } %338, 0
  %340 = extractvalue { ptr, ptr } %338, 1
  store ptr %339, ptr %330, align 8, !tbaa !9
  %.sroa.464.0..sroa_idx = getelementptr inbounds i8, ptr %330, i64 8
  store ptr %340, ptr %.sroa.464.0..sroa_idx, align 8, !tbaa !9
  %341 = trunc i32 %3 to i8
  %342 = and i8 %341, 1
  call void @TypeChecker__useType__(ptr noundef %0, ptr %.7482, ptr nonnull %286, i8 noundef zeroext %342)
  %343 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %0, ptr %.7482, ptr nonnull %286, i32 noundef %.2)
  %344 = extractvalue { ptr, ptr } %343, 0
  %345 = extractvalue { ptr, ptr } %343, 1
  br label %.loopexit

346:                                              ; preds = %.thread507
  %347 = getelementptr inbounds i8, ptr %0, i64 16
  %348 = load ptr, ptr %347, align 8, !tbaa !36
  %349 = getelementptr inbounds i8, ptr %0, i64 40
  %350 = load ptr, ptr %349, align 8, !tbaa !37
  %351 = getelementptr inbounds i8, ptr %.2386480, i64 24
  %352 = load i64, ptr %351, align 8
  %353 = load ptr, ptr @mu_____string166, align 8
  %354 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string166, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %17, ptr noundef %350, i64 %352, ptr %353, i32 %354)
  call void @List__add__Error____(ptr noundef %348, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %17)
  br label %355

355:                                              ; preds = %279, %346
  %356 = call { ptr, ptr } @TypeChecker__getSingleArgTag__(ptr noundef nonnull %.7482, ptr null, ptr null)
  %357 = extractvalue { ptr, ptr } %356, 0
  %358 = extractvalue { ptr, ptr } %356, 1
  %359 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef nonnull %0, ptr %357, ptr %358, i32 noundef %.2)
  %360 = extractvalue { ptr, ptr } %359, 0
  %361 = extractvalue { ptr, ptr } %359, 1
  br label %.loopexit

362:                                              ; preds = %.thread507, %270
  %.0402510 = phi i32 [ 0, %.thread507 ], [ %272, %270 ]
  %.not437 = icmp eq i32 %.0398, %.0402510
  br i1 %.not437, label %375, label %363

363:                                              ; preds = %362
  %364 = icmp ne i32 %.0402510, 0
  %spec.select445 = or i1 %224, %364
  br i1 %spec.select445, label %365, label %.thread514

365:                                              ; preds = %363
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %18, i8 0, i64 16, i1 false)
  %.sroa.054.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local52, align 8
  %.sroa.455.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local52, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %18, ptr %.sroa.054.0.copyload, i32 %.sroa.455.0.copyload)
  call void @int__writeTo__(i32 noundef %.0398, ptr noundef nonnull %18)
  %.sroa.051.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local53, align 8
  %.sroa.452.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local53, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %18, ptr %.sroa.051.0.copyload, i32 %.sroa.452.0.copyload)
  call void @int__writeTo__(i32 noundef %.0402510, ptr noundef nonnull %18)
  %.sroa.048.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local54, align 8
  %.sroa.449.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local54, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %18, ptr %.sroa.048.0.copyload, i32 %.sroa.449.0.copyload)
  %366 = getelementptr inbounds i8, ptr %0, i64 16
  %367 = load ptr, ptr %366, align 8, !tbaa !36
  %368 = getelementptr inbounds i8, ptr %0, i64 40
  %369 = load ptr, ptr %368, align 8, !tbaa !37
  %370 = getelementptr inbounds i8, ptr %.2386480, i64 24
  %371 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef nonnull %18)
  %372 = extractvalue { ptr, i32 } %371, 0
  %373 = extractvalue { ptr, i32 } %371, 1
  %374 = load i64, ptr %370, align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %19, ptr noundef %369, i64 %374, ptr %372, i32 %373)
  call void @List__add__Error____(ptr noundef %367, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %19)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #5
  br label %375

375:                                              ; preds = %365, %362
  %376 = icmp sgt i32 %.0398, 0
  br i1 %376, label %377, label %.thread514

377:                                              ; preds = %375
  %378 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %379 = getelementptr inbounds i8, ptr %378, i64 8
  %380 = load ptr, ptr %379, align 8, !tbaa !29
  %381 = load ptr, ptr %378, align 8, !tbaa !31
  %382 = call ptr %380(ptr noundef %381, i64 noundef 16) #5
  %383 = call { ptr, i32 } @Array__cons__Tag____(i32 noundef %.0398)
  %384 = extractvalue { ptr, i32 } %383, 0
  %385 = extractvalue { ptr, i32 } %383, 1
  store ptr %384, ptr %382, align 8, !tbaa !9
  %.sroa.434.0..sroa_idx = getelementptr inbounds i8, ptr %382, i64 8
  store i32 %385, ptr %.sroa.434.0..sroa_idx, align 8, !tbaa !5
  br i1 %.not436, label %456, label %.preheader520

.preheader520:                                    ; preds = %377
  %386 = getelementptr inbounds i8, ptr %.1383481, i64 8
  %387 = load i32, ptr %386, align 8, !tbaa !40
  %388 = icmp sgt i32 %387, 0
  br i1 %388, label %.lr.ph536, label %._crit_edge537

.lr.ph536:                                        ; preds = %.preheader520
  %389 = and i32 %3, 3
  %390 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %391 = zext nneg i32 %.0398 to i64
  br label %392

392:                                              ; preds = %.lr.ph536, %408
  %indvars.iv554 = phi i64 [ 0, %.lr.ph536 ], [ %indvars.iv.next555, %408 ]
  %393 = load ptr, ptr %.1383481, align 8, !tbaa !42
  %394 = getelementptr inbounds %struct.Node__, ptr %393, i64 %indvars.iv554
  %.sroa.023.0.copyload = load i32, ptr %394, align 8, !tbaa !5
  %.sroa.425.0..sroa_idx = getelementptr inbounds i8, ptr %394, i64 8
  %.sroa.425.0.copyload = load ptr, ptr %.sroa.425.0..sroa_idx, align 8, !tbaa !9
  %395 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %.sroa.023.0.copyload, ptr %.sroa.425.0.copyload, i32 noundef %389)
  %396 = extractvalue { ptr, ptr } %395, 0
  %397 = extractvalue { ptr, ptr } %395, 1
  %398 = icmp ult i64 %indvars.iv554, %391
  br i1 %398, label %399, label %408

399:                                              ; preds = %392
  %400 = load i32, ptr %.sroa.434.0..sroa_idx, align 8, !tbaa !53
  %401 = zext i32 %400 to i64
  %402 = icmp ult i64 %indvars.iv554, %401
  br i1 %402, label %405, label %403

403:                                              ; preds = %399
  %404 = load ptr, ptr %390, align 8, !tbaa !9
  call void %404(i32 noundef -3) #5
  br label %405

405:                                              ; preds = %403, %399
  %406 = load ptr, ptr %382, align 8, !tbaa !55
  %407 = getelementptr inbounds %struct.tag_____Tag__, ptr %406, i64 %indvars.iv554
  store ptr %396, ptr %407, align 8, !tbaa !9
  %.sroa.422.0..sroa_idx = getelementptr inbounds i8, ptr %407, i64 8
  store ptr %397, ptr %.sroa.422.0..sroa_idx, align 8, !tbaa !9
  br label %408

408:                                              ; preds = %405, %392
  %indvars.iv.next555 = add nuw nsw i64 %indvars.iv554, 1
  %409 = load i32, ptr %386, align 8, !tbaa !40
  %410 = sext i32 %409 to i64
  %411 = icmp slt i64 %indvars.iv.next555, %410
  br i1 %411, label %392, label %._crit_edge537, !llvm.loop !57

._crit_edge537:                                   ; preds = %408, %.preheader520
  %412 = trunc i32 %3 to i8
  %413 = and i8 %412, 1
  call void @TypeChecker__useType__(ptr noundef %0, ptr %.7482, ptr nonnull %382, i8 noundef zeroext %413)
  br label %456

.thread514:                                       ; preds = %363, %375
  br i1 %.not436, label %.loopexit522, label %.preheader521

.preheader521:                                    ; preds = %.thread514
  %414 = getelementptr inbounds i8, ptr %.1383481, i64 8
  %415 = load i32, ptr %414, align 8, !tbaa !40
  %416 = icmp sgt i32 %415, 0
  br i1 %416, label %.lr.ph534, label %.loopexit522

.lr.ph534:                                        ; preds = %.preheader521
  %417 = and i32 %3, 3
  br label %418

418:                                              ; preds = %.lr.ph534, %418
  %indvars.iv551 = phi i64 [ 0, %.lr.ph534 ], [ %indvars.iv.next552, %418 ]
  %419 = load ptr, ptr %.1383481, align 8, !tbaa !42
  %420 = getelementptr inbounds %struct.Node__, ptr %419, i64 %indvars.iv551
  %.sroa.011.0.copyload = load i32, ptr %420, align 8, !tbaa !5
  %.sroa.413.0..sroa_idx = getelementptr inbounds i8, ptr %420, i64 8
  %.sroa.413.0.copyload = load ptr, ptr %.sroa.413.0..sroa_idx, align 8, !tbaa !9
  %421 = call { ptr, ptr } @TypeChecker__resolveType__(ptr noundef %0, i32 %.sroa.011.0.copyload, ptr %.sroa.413.0.copyload, i32 noundef %417)
  %indvars.iv.next552 = add nuw nsw i64 %indvars.iv551, 1
  %422 = load i32, ptr %414, align 8, !tbaa !40
  %423 = sext i32 %422 to i64
  %424 = icmp slt i64 %indvars.iv.next552, %423
  br i1 %424, label %418, label %.loopexit522, !llvm.loop !58

.loopexit522:                                     ; preds = %418, %.preheader521, %.thread514
  %425 = load ptr, ptr %238, align 8, !tbaa !22
  %426 = load ptr, ptr %425, align 8, !tbaa !23
  %427 = icmp eq ptr %.7482, %426
  br i1 %427, label %428, label %456

428:                                              ; preds = %.loopexit522
  %429 = icmp sgt i32 %.2, 0
  br i1 %429, label %430, label %445

430:                                              ; preds = %428
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %20, i8 0, i64 16, i1 false)
  %.sroa.09.0.copyload = load ptr, ptr @__const.TypeChecker__resolveType__.local63, align 8
  %.sroa.4.0.copyload = load i32, ptr getelementptr inbounds (i8, ptr @__const.TypeChecker__resolveType__.local63, i64 8), align 8
  call void @StringBuilder__write__(ptr noundef nonnull %20, ptr %.sroa.09.0.copyload, i32 %.sroa.4.0.copyload)
  %431 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef nonnull %0, ptr %.7482, ptr null, i32 noundef %.2)
  %432 = extractvalue { ptr, ptr } %431, 0
  %433 = extractvalue { ptr, ptr } %431, 1
  %434 = call { ptr, i32 } @Tag__toString__(ptr %432, ptr %433)
  %435 = extractvalue { ptr, i32 } %434, 0
  %436 = extractvalue { ptr, i32 } %434, 1
  call void @StringBuilder__write__(ptr noundef nonnull %20, ptr %435, i32 %436)
  %437 = getelementptr inbounds i8, ptr %0, i64 16
  %438 = load ptr, ptr %437, align 8, !tbaa !36
  %439 = getelementptr inbounds i8, ptr %0, i64 40
  %440 = load ptr, ptr %439, align 8, !tbaa !37
  %441 = call i64 @RangeFinder__find__(i32 %1, ptr nonnull %2)
  %442 = call { ptr, i32 } @StringBuilder__compactToString__(ptr noundef nonnull %20)
  %443 = extractvalue { ptr, i32 } %442, 0
  %444 = extractvalue { ptr, i32 } %442, 1
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %21, ptr noundef %440, i64 %441, ptr %443, i32 %444)
  call void @List__add__Error____(ptr noundef %438, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %21)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #5
  br label %.loopexit

445:                                              ; preds = %428
  %446 = and i32 %3, 4
  %447 = icmp eq i32 %446, 0
  br i1 %447, label %448, label %456

448:                                              ; preds = %445
  %449 = getelementptr inbounds i8, ptr %0, i64 16
  %450 = load ptr, ptr %449, align 8, !tbaa !36
  %451 = getelementptr inbounds i8, ptr %0, i64 40
  %452 = load ptr, ptr %451, align 8, !tbaa !37
  %453 = call i64 @RangeFinder__find__(i32 %1, ptr nonnull %2)
  %454 = load ptr, ptr @mu_____string169, align 8
  %455 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string169, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %22, ptr noundef %452, i64 %453, ptr %454, i32 %455)
  call void @List__add__Error____(ptr noundef %450, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %22)
  br label %.loopexit

456:                                              ; preds = %377, %._crit_edge537, %.loopexit522, %445
  %.sroa.6.0 = phi ptr [ null, %445 ], [ null, %.loopexit522 ], [ %382, %._crit_edge537 ], [ %382, %377 ]
  %457 = call { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef %0, ptr %.7482, ptr %.sroa.6.0, i32 noundef %.2)
  %458 = extractvalue { ptr, ptr } %457, 0
  %459 = extractvalue { ptr, ptr } %457, 1
  br label %.loopexit

.loopexit:                                        ; preds = %256, %.preheader, %.thread499, %.thread483, %.thread450, %.thread, %327, %355, %456, %448, %430, %243, %4
  %.sroa.12.7 = phi ptr [ null, %4 ], [ null, %.thread450 ], [ null, %.thread ], [ null, %243 ], [ %345, %327 ], [ %361, %355 ], [ %459, %456 ], [ null, %430 ], [ null, %448 ], [ %200, %.thread483 ], [ %160, %.thread499 ], [ null, %.preheader ], [ null, %256 ]
  %.sroa.0363.7 = phi ptr [ null, %4 ], [ null, %.thread450 ], [ null, %.thread ], [ null, %243 ], [ %344, %327 ], [ %360, %355 ], [ %458, %456 ], [ null, %430 ], [ null, %448 ], [ %199, %.thread483 ], [ %159, %.thread499 ], [ null, %.preheader ], [ null, %256 ]
  %.fca.0.insert = insertvalue { ptr, ptr } poison, ptr %.sroa.0363.7, 0
  %.fca.1.insert = insertvalue { ptr, ptr } %.fca.0.insert, ptr %.sroa.12.7, 1
  ret { ptr, ptr } %.fca.1.insert
}

; Function Attrs: nounwind uwtable
declare dso_local void @TypeChecker__useType__(ptr noundef, ptr, ptr, i8 noundef zeroext) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, ptr } @TypeChecker__getPtrTag__(ptr noundef, ptr, ptr, i32 noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local { ptr, i32 } @Array__cons__Tag____(i32 noundef) local_unnamed_addr #4

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { 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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !10, i64 0}
!12 = !{!"tag_____TypeModifierExpression__", !10, i64 0, !13, i64 8}
!13 = !{!"", !6, i64 0, !10, i64 8}
!14 = !{!15, !10, i64 0}
!15 = !{!"tag_____UnaryOperatorExpression__", !10, i64 0, !13, i64 8}
!16 = !{!17, !10, i64 24}
!17 = !{!"tag_____TypeCheckerContext__", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !6, i64 120, !6, i64 124, !10, i64 128, !6, i64 136, !7, i64 140}
!18 = !{!19, !10, i64 32}
!19 = !{!"tag_____Namespace__", !20, i64 0, !10, i64 16, !6, i64 24, !6, i64 28, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !6, i64 104}
!20 = !{!"", !10, i64 0, !6, i64 8}
!21 = !{!19, !6, i64 28}
!22 = !{!17, !10, i64 32}
!23 = !{!24, !10, i64 0}
!24 = !{!"tag_____CommonTags__", !25, i64 0, !25, i64 16, !25, i64 32, !25, i64 48, !25, i64 64, !25, i64 80, !25, i64 96, !25, i64 112, !25, i64 128, !25, i64 144, !25, i64 160, !25, i64 176, !25, i64 192, !25, i64 208, !25, i64 224, !25, i64 240, !25, i64 256, !25, i64 272, !25, i64 288, !10, i64 304, !10, i64 312, !10, i64 320, !10, i64 328, !10, i64 336, !10, i64 344, !10, i64 352, !10, i64 360, !10, i64 368, !10, i64 376}
!25 = !{!"tag_____Tag__", !10, i64 0, !10, i64 8}
!26 = !{!17, !10, i64 56}
!27 = !{!28, !10, i64 112}
!28 = !{!"tag_____FunctionDef__", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !13, i64 56, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !6, i64 104, !10, i64 112, !20, i64 120, !20, i64 136, !25, i64 152, !6, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !10, i64 200, !20, i64 208}
!29 = !{!30, !10, i64 8}
!30 = !{!"tag_____IAllocator__", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24}
!31 = !{!30, !10, i64 0}
!32 = !{i64 0, i64 8, !9, i64 8, i64 4, !5, i64 16, i64 4, !5, i64 20, i64 4, !5, i64 24, i64 4, !5, i64 32, i64 8, !9, i64 40, i64 8, !9}
!33 = !{!28, !10, i64 176}
!34 = !{!17, !10, i64 48}
!35 = !{!19, !10, i64 72}
!36 = !{!17, !10, i64 16}
!37 = !{!17, !10, i64 40}
!38 = !{!39, !10, i64 24}
!39 = !{!"tag_____TypeArgsExpression__", !13, i64 0, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40}
!40 = !{!41, !6, i64 8}
!41 = !{!"tag_____List__Node____", !10, i64 0, !6, i64 8, !6, i64 12}
!42 = !{!41, !10, i64 0}
!43 = distinct !{!43, !44}
!44 = !{!"llvm.loop.mustprogress"}
!45 = !{!39, !10, i64 16}
!46 = !{i64 0, i64 8, !9, i64 8, i64 4, !5}
!47 = !{i64 0, i64 8, !9, i64 8, i64 4, !5, i64 16, i64 8, !9, i64 24, i64 4, !5, i64 28, i64 4, !5, i64 32, i64 8, !9, i64 40, i64 8, !9, i64 48, i64 8, !9, i64 56, i64 8, !9, i64 64, i64 8, !9, i64 72, i64 8, !9, i64 80, i64 8, !9, i64 88, i64 8, !9, i64 96, i64 8, !9, i64 104, i64 4, !5}
!48 = !{!24, !10, i64 304}
!49 = distinct !{!49, !44}
!50 = !{!51, !6, i64 8}
!51 = !{!"tag_____List__Ptr__Namespace______", !10, i64 0, !6, i64 8, !6, i64 12}
!52 = !{!24, !10, i64 312}
!53 = !{!54, !6, i64 8}
!54 = !{!"tag_____Array__Tag____", !10, i64 0, !6, i64 8}
!55 = !{!54, !10, i64 0}
!56 = distinct !{!56, !44}
!57 = distinct !{!57, !44}
!58 = distinct !{!58, !44}


; Effective O3 passes: CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,MemCpyOptPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass