; LLVM IR from nickmqb/muon :: bootstrap/mu.ll_TypeCheckerFirstPass (checkFunction__)

; 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.Node__ = type { i32, ptr }
%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_____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_____Tag__ = type { ptr, ptr }
%struct.tag_____Namespace__ = type { %struct.string__, ptr, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32 }
%struct.tag_____Token__ = type { i32, %struct.string__, %struct.tag_____IntRange__, %struct.tag_____IntRange__, i32 }
%struct.tag_____List__Ptr__Attribute______ = type { ptr, i32, i32 }
%struct.tag_____Attribute__ = type { ptr, ptr, ptr, ptr, ptr, ptr }
%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_____List__Ptr__Param______ = type { ptr, i32, i32 }
%struct.tag_____Param__ = type { ptr, %struct.Node__, ptr, %struct.tag_____Tag__, i32, %struct.string__ }

@mu_____string115 = external dso_local global %struct.string__, align 8
@mu_____string116 = external dso_local global %struct.string__, align 8
@mu_____string117 = external dso_local global %struct.string__, align 8
@mu_____string110 = external dso_local global %struct.string__, align 8
@mu_____string119 = external dso_local global %struct.string__, align 8
@mu_____string113 = external dso_local global %struct.string__, align 8
@mu_____string114 = external dso_local global %struct.string__, align 8
@mu_____string118 = external dso_local global %struct.string__, align 8
@top_____currentAllocator__ = external dso_local thread_local global %struct.tag_____IAllocator__, 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: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

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

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

; 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) #3

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

; Function Attrs: nounwind uwtable
declare dso_local ptr @TypeCheckerFirstPass__checkTypeParams__(ptr noundef, ptr noundef) #3

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

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @Map__tryAdd__string__Node____(ptr noundef, ptr, i32, i32, ptr) #3

; Function Attrs: nounwind uwtable
define dso_local void @TypeCheckerFirstPass__checkFunction__(ptr noundef %0, ptr noundef %1, ptr noundef %2) #3 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca %struct.Node__, align 8
  %8 = alloca ptr, align 8
  %9 = alloca %struct.tag_____CustomSet__Ptr__Array__Tag________, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca i8, align 1
  %17 = alloca %struct.tag_____Error__, align 8
  %18 = alloca i8, align 1
  %19 = alloca %struct.tag_____Error__, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca i32, align 4
  %25 = alloca ptr, align 8
  %26 = alloca i8, align 1
  %27 = alloca %struct.tag_____Error__, align 8
  %28 = alloca i8, align 1
  %29 = alloca %struct.tag_____Error__, align 8
  %30 = alloca i8, align 1
  %31 = alloca %struct.tag_____Error__, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  %32 = load ptr, ptr %5, align 8, !tbaa !5
  %33 = load ptr, ptr %6, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %33, i32 0, i32 11
  store ptr %32, ptr %34, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %7) #4
  %35 = load ptr, ptr %6, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.Node__, ptr %7, i32 0, i32 1
  store ptr %35, ptr %36, align 8, !tbaa !15
  %37 = getelementptr inbounds %struct.Node__, ptr %7, i32 0, i32 1
  %38 = load ptr, ptr %37, align 8, !tbaa !15
  %39 = icmp ne ptr %38, null
  %40 = zext i1 %39 to i64
  %41 = select i1 %39, i32 34, i32 0
  %42 = getelementptr inbounds %struct.Node__, ptr %7, i32 0, i32 0
  store i32 %41, ptr %42, align 8, !tbaa !16
  %43 = load ptr, ptr %5, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.tag_____Namespace__, ptr %43, i32 0, i32 4
  %45 = load ptr, ptr %44, align 8, !tbaa !17
  %46 = load ptr, ptr %6, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %46, i32 0, i32 1
  %48 = load ptr, ptr %47, align 8, !tbaa !19
  %49 = getelementptr inbounds %struct.tag_____Token__, ptr %48, i32 0, i32 1
  %50 = getelementptr inbounds { ptr, i32 }, ptr %49, i32 0, i32 0
  %51 = load ptr, ptr %50, align 8
  %52 = getelementptr inbounds { ptr, i32 }, ptr %49, i32 0, i32 1
  %53 = load i32, ptr %52, align 8
  %54 = getelementptr inbounds { i32, ptr }, ptr %7, i32 0, i32 0
  %55 = load i32, ptr %54, align 8
  %56 = getelementptr inbounds { i32, ptr }, ptr %7, i32 0, i32 1
  %57 = load ptr, ptr %56, align 8
  %58 = call zeroext i8 @Map__tryAdd__string__Node____(ptr noundef %45, ptr %51, i32 %53, i32 %55, ptr %57)
  %59 = icmp ne i8 %58, 0
  br i1 %59, label %65, label %60

60:                                               ; preds = %3
  %61 = load ptr, ptr %4, align 8, !tbaa !5
  %62 = load ptr, ptr %6, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %62, i32 0, i32 1
  %64 = load ptr, ptr %63, align 8, !tbaa !19
  call void @TypeCheckerFirstPass__duplicateMember__(ptr noundef %61, ptr noundef %64)
  br label %65

65:                                               ; preds = %60, %3
  %66 = load ptr, ptr %6, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %66, i32 0, i32 2
  %68 = load ptr, ptr %67, align 8, !tbaa !20
  %69 = icmp ne ptr %68, null
  br i1 %69, label %70, label %89

70:                                               ; preds = %65
  %71 = load ptr, ptr %4, align 8, !tbaa !5
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %72, i32 0, i32 2
  %74 = load ptr, ptr %73, align 8, !tbaa !20
  %75 = call ptr @TypeCheckerFirstPass__checkTypeParams__(ptr noundef %71, ptr noundef %74)
  %76 = load ptr, ptr %6, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %76, i32 0, i32 13
  store ptr %75, ptr %77, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #4
  %78 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %79 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %78, i32 0, i32 1
  %80 = load ptr, ptr %79, align 8, !tbaa !22
  %81 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %82 = getelementptr inbounds %struct.tag_____IAllocator__, ptr %81, i32 0, i32 0
  %83 = load ptr, ptr %82, align 8, !tbaa !24
  %84 = call ptr %80(ptr noundef %83, i64 noundef 48)
  store ptr %84, ptr %8, align 8, !tbaa !5
  %85 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 48, ptr %9) #4
  call void @Tag__createArgsSet__(ptr dead_on_unwind writable sret(%struct.tag_____CustomSet__Ptr__Array__Tag________) align 8 %9)
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %85, ptr align 8 %9, i64 48, i1 false), !tbaa.struct !25
  call void @llvm.lifetime.end.p0(i64 48, ptr %9) #4
  %86 = load ptr, ptr %8, align 8, !tbaa !5
  %87 = load ptr, ptr %6, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %87, i32 0, i32 18
  store ptr %86, ptr %88, align 8, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #4
  br label %89

89:                                               ; preds = %70, %65
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #4
  store ptr null, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  store ptr null, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  store ptr null, ptr %12, align 8, !tbaa !5
  %90 = load ptr, ptr %6, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %90, i32 0, i32 8
  %92 = load ptr, ptr %91, align 8, !tbaa !28
  %93 = icmp ne ptr %92, null
  br i1 %93, label %94, label %204

94:                                               ; preds = %89
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  %95 = load ptr, ptr %6, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %95, i32 0, i32 8
  %97 = load ptr, ptr %96, align 8, !tbaa !28
  store ptr %97, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  store i32 0, ptr %14, align 4, !tbaa !26
  br label %98

98:                                               ; preds = %200, %94
  %99 = load i32, ptr %14, align 4, !tbaa !26
  %100 = load ptr, ptr %13, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.tag_____List__Ptr__Attribute______, ptr %100, i32 0, i32 1
  %102 = load i32, ptr %101, align 8, !tbaa !29
  %103 = icmp slt i32 %99, %102
  br i1 %103, label %104, label %203

104:                                              ; preds = %98
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  %105 = load ptr, ptr %13, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.tag_____List__Ptr__Attribute______, ptr %105, i32 0, i32 0
  %107 = load ptr, ptr %106, align 8, !tbaa !31
  %108 = load i32, ptr %14, align 4, !tbaa !26
  %109 = sext i32 %108 to i64
  %110 = getelementptr inbounds ptr, ptr %107, i64 %109
  %111 = load ptr, ptr %110, align 8, !tbaa !5
  store ptr %111, ptr %15, align 8, !tbaa !5
  %112 = load ptr, ptr %15, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct.tag_____Attribute__, ptr %112, i32 0, i32 1
  %114 = load ptr, ptr %113, align 8, !tbaa !32
  %115 = getelementptr inbounds %struct.tag_____Token__, ptr %114, i32 0, i32 1
  %116 = getelementptr inbounds { ptr, i32 }, ptr %115, i32 0, i32 0
  %117 = load ptr, ptr %116, align 8
  %118 = getelementptr inbounds { ptr, i32 }, ptr %115, i32 0, i32 1
  %119 = load i32, ptr %118, align 8
  %120 = load ptr, ptr @mu_____string110, align 8
  %121 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string110, i32 0, i32 1), align 8
  %122 = call zeroext i8 @string__equals__(ptr %117, i32 %119, ptr %120, i32 %121)
  %123 = icmp ne i8 %122, 0
  br i1 %123, label %124, label %128

124:                                              ; preds = %104
  %125 = load ptr, ptr %4, align 8, !tbaa !5
  %126 = load ptr, ptr %6, align 8, !tbaa !5
  %127 = load ptr, ptr %15, align 8, !tbaa !5
  call void @TypeCheckerFirstPass__checkFunctionForeignAttribute__(ptr noundef %125, ptr noundef %126, ptr noundef %127)
  br label %200

128:                                              ; preds = %104
  %129 = load ptr, ptr %15, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.tag_____Attribute__, ptr %129, i32 0, i32 1
  %131 = load ptr, ptr %130, align 8, !tbaa !32
  %132 = getelementptr inbounds %struct.tag_____Token__, ptr %131, i32 0, i32 1
  %133 = getelementptr inbounds { ptr, i32 }, ptr %132, i32 0, i32 0
  %134 = load ptr, ptr %133, align 8
  %135 = getelementptr inbounds { ptr, i32 }, ptr %132, i32 0, i32 1
  %136 = load i32, ptr %135, align 8
  %137 = load ptr, ptr @mu_____string113, align 8
  %138 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string113, i32 0, i32 1), align 8
  %139 = call zeroext i8 @string__equals__(ptr %134, i32 %136, ptr %137, i32 %138)
  %140 = icmp ne i8 %139, 0
  br i1 %140, label %141, label %150

141:                                              ; preds = %128
  %142 = load ptr, ptr %10, align 8, !tbaa !5
  %143 = icmp eq ptr %142, null
  br i1 %143, label %144, label %146

144:                                              ; preds = %141
  %145 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %145, ptr %10, align 8, !tbaa !5
  br label %146

146:                                              ; preds = %144, %141
  %147 = load ptr, ptr %4, align 8, !tbaa !5
  %148 = load ptr, ptr %6, align 8, !tbaa !5
  %149 = load ptr, ptr %15, align 8, !tbaa !5
  call void @TypeCheckerFirstPass__checkFunctionAsAttribute__(ptr noundef %147, ptr noundef %148, ptr noundef %149)
  br label %199

150:                                              ; preds = %128
  %151 = load ptr, ptr %15, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.tag_____Attribute__, ptr %151, i32 0, i32 1
  %153 = load ptr, ptr %152, align 8, !tbaa !32
  %154 = getelementptr inbounds %struct.tag_____Token__, ptr %153, i32 0, i32 1
  %155 = getelementptr inbounds { ptr, i32 }, ptr %154, i32 0, i32 0
  %156 = load ptr, ptr %155, align 8
  %157 = getelementptr inbounds { ptr, i32 }, ptr %154, i32 0, i32 1
  %158 = load i32, ptr %157, align 8
  %159 = load ptr, ptr @mu_____string114, align 8
  %160 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string114, i32 0, i32 1), align 8
  %161 = call zeroext i8 @string__equals__(ptr %156, i32 %158, ptr %159, i32 %160)
  %162 = icmp ne i8 %161, 0
  br i1 %162, label %163, label %172

163:                                              ; preds = %150
  %164 = load ptr, ptr %11, align 8, !tbaa !5
  %165 = icmp eq ptr %164, null
  br i1 %165, label %166, label %168

166:                                              ; preds = %163
  %167 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %167, ptr %11, align 8, !tbaa !5
  br label %168

168:                                              ; preds = %166, %163
  %169 = load ptr, ptr %4, align 8, !tbaa !5
  %170 = load ptr, ptr %6, align 8, !tbaa !5
  %171 = load ptr, ptr %15, align 8, !tbaa !5
  call void @TypeCheckerFirstPass__checkFunctionVarArgsAttribute__(ptr noundef %169, ptr noundef %170, ptr noundef %171)
  br label %198

172:                                              ; preds = %150
  %173 = load ptr, ptr %15, align 8, !tbaa !5
  %174 = getelementptr inbounds %struct.tag_____Attribute__, ptr %173, i32 0, i32 1
  %175 = load ptr, ptr %174, align 8, !tbaa !32
  %176 = getelementptr inbounds %struct.tag_____Token__, ptr %175, i32 0, i32 1
  %177 = getelementptr inbounds { ptr, i32 }, ptr %176, i32 0, i32 0
  %178 = load ptr, ptr %177, align 8
  %179 = getelementptr inbounds { ptr, i32 }, ptr %176, i32 0, i32 1
  %180 = load i32, ptr %179, align 8
  %181 = load ptr, ptr @mu_____string115, align 8
  %182 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string115, i32 0, i32 1), align 8
  %183 = call zeroext i8 @string__equals__(ptr %178, i32 %180, ptr %181, i32 %182)
  %184 = icmp ne i8 %183, 0
  br i1 %184, label %185, label %194

185:                                              ; preds = %172
  %186 = load ptr, ptr %12, align 8, !tbaa !5
  %187 = icmp eq ptr %186, null
  br i1 %187, label %188, label %190

188:                                              ; preds = %185
  %189 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %189, ptr %12, align 8, !tbaa !5
  br label %190

190:                                              ; preds = %188, %185
  %191 = load ptr, ptr %4, align 8, !tbaa !5
  %192 = load ptr, ptr %6, align 8, !tbaa !5
  %193 = load ptr, ptr %15, align 8, !tbaa !5
  call void @TypeCheckerFirstPass__checkFunctionCallingConventionAttribute__(ptr noundef %191, ptr noundef %192, ptr noundef %193)
  br label %197

194:                                              ; preds = %172
  %195 = load ptr, ptr %4, align 8, !tbaa !5
  %196 = load ptr, ptr %15, align 8, !tbaa !5
  call void @TypeCheckerFirstPass__badAttribute__(ptr noundef %195, ptr noundef %196)
  br label %197

197:                                              ; preds = %194, %190
  br label %198

198:                                              ; preds = %197, %168
  br label %199

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

200:                                              ; preds = %199, %124
  %201 = load i32, ptr %14, align 4, !tbaa !26
  %202 = add nsw i32 %201, 1
  store i32 %202, ptr %14, align 4, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  br label %98, !llvm.loop !34

203:                                              ; preds = %98
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  br label %204

204:                                              ; preds = %203, %89
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #4
  %205 = load ptr, ptr %6, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %205, i32 0, i32 12
  %207 = load i32, ptr %206, align 8, !tbaa !36
  %208 = and i32 %207, 2
  %209 = icmp eq i32 %208, 0
  %210 = zext i1 %209 to i32
  %211 = trunc i32 %210 to i8
  store i8 %211, ptr %16, align 1, !tbaa !37
  %212 = load i8, ptr %16, align 1, !tbaa !37
  %213 = icmp ne i8 %212, 0
  br i1 %213, label %214, label %219

214:                                              ; preds = %204
  %215 = load ptr, ptr %10, align 8, !tbaa !5
  %216 = icmp ne ptr %215, null
  %217 = zext i1 %216 to i32
  %218 = trunc i32 %217 to i8
  store i8 %218, ptr %16, align 1, !tbaa !37
  br label %219

219:                                              ; preds = %214, %204
  %220 = load i8, ptr %16, align 1, !tbaa !37
  %221 = icmp ne i8 %220, 0
  br i1 %221, label %222, label %236

222:                                              ; preds = %219
  %223 = load ptr, ptr %4, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %223, i32 0, i32 2
  %225 = load ptr, ptr %224, align 8, !tbaa !38
  %226 = load ptr, ptr %6, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %226, i32 0, i32 0
  %228 = load ptr, ptr %227, align 8, !tbaa !40
  %229 = load ptr, ptr %10, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.tag_____Attribute__, ptr %229, i32 0, i32 1
  %231 = load ptr, ptr %230, align 8, !tbaa !32
  %232 = getelementptr inbounds %struct.tag_____Token__, ptr %231, i32 0, i32 2
  %233 = load i64, ptr %232, align 8
  %234 = load ptr, ptr @mu_____string116, align 8
  %235 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string116, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %17, ptr noundef %228, i64 %233, ptr %234, i32 %235)
  call void @List__add__Error____(ptr noundef %225, ptr noundef byval(%struct.tag_____Error__) align 8 %17)
  br label %236

236:                                              ; preds = %222, %219
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #4
  %237 = load ptr, ptr %6, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %237, i32 0, i32 12
  %239 = load i32, ptr %238, align 8, !tbaa !36
  %240 = and i32 %239, 2
  %241 = icmp eq i32 %240, 0
  %242 = zext i1 %241 to i32
  %243 = trunc i32 %242 to i8
  store i8 %243, ptr %18, align 1, !tbaa !37
  %244 = load i8, ptr %18, align 1, !tbaa !37
  %245 = icmp ne i8 %244, 0
  br i1 %245, label %246, label %251

246:                                              ; preds = %236
  %247 = load ptr, ptr %11, align 8, !tbaa !5
  %248 = icmp ne ptr %247, null
  %249 = zext i1 %248 to i32
  %250 = trunc i32 %249 to i8
  store i8 %250, ptr %18, align 1, !tbaa !37
  br label %251

251:                                              ; preds = %246, %236
  %252 = load i8, ptr %18, align 1, !tbaa !37
  %253 = icmp ne i8 %252, 0
  br i1 %253, label %254, label %268

254:                                              ; preds = %251
  %255 = load ptr, ptr %4, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %255, i32 0, i32 2
  %257 = load ptr, ptr %256, align 8, !tbaa !38
  %258 = load ptr, ptr %6, align 8, !tbaa !5
  %259 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %258, i32 0, i32 0
  %260 = load ptr, ptr %259, align 8, !tbaa !40
  %261 = load ptr, ptr %11, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.tag_____Attribute__, ptr %261, i32 0, i32 1
  %263 = load ptr, ptr %262, align 8, !tbaa !32
  %264 = getelementptr inbounds %struct.tag_____Token__, ptr %263, i32 0, i32 2
  %265 = load i64, ptr %264, align 8
  %266 = load ptr, ptr @mu_____string116, align 8
  %267 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string116, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %19, ptr noundef %260, i64 %265, ptr %266, i32 %267)
  call void @List__add__Error____(ptr noundef %257, ptr noundef byval(%struct.tag_____Error__) align 8 %19)
  br label %268

268:                                              ; preds = %254, %251
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %269 = load ptr, ptr %6, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %269, i32 0, i32 4
  %271 = load ptr, ptr %270, align 8, !tbaa !41
  store ptr %271, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  store i32 0, ptr %21, align 4, !tbaa !26
  br label %272

272:                                              ; preds = %332, %268
  %273 = load i32, ptr %21, align 4, !tbaa !26
  %274 = load ptr, ptr %20, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.tag_____List__Ptr__Param______, ptr %274, i32 0, i32 1
  %276 = load i32, ptr %275, align 8, !tbaa !42
  %277 = icmp slt i32 %273, %276
  br i1 %277, label %278, label %335

278:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %279 = load ptr, ptr %20, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.tag_____List__Ptr__Param______, ptr %279, i32 0, i32 0
  %281 = load ptr, ptr %280, align 8, !tbaa !44
  %282 = load i32, ptr %21, align 4, !tbaa !26
  %283 = sext i32 %282 to i64
  %284 = getelementptr inbounds ptr, ptr %281, i64 %283
  %285 = load ptr, ptr %284, align 8, !tbaa !5
  store ptr %285, ptr %22, align 8, !tbaa !5
  %286 = load ptr, ptr %22, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.tag_____Param__, ptr %286, i32 0, i32 2
  %288 = load ptr, ptr %287, align 8, !tbaa !45
  %289 = icmp ne ptr %288, null
  br i1 %289, label %290, label %332

290:                                              ; preds = %278
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  %291 = load ptr, ptr %22, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.tag_____Param__, ptr %291, i32 0, i32 2
  %293 = load ptr, ptr %292, align 8, !tbaa !45
  store ptr %293, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  store i32 0, ptr %24, align 4, !tbaa !26
  br label %294

294:                                              ; preds = %328, %290
  %295 = load i32, ptr %24, align 4, !tbaa !26
  %296 = load ptr, ptr %23, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.tag_____List__Ptr__Attribute______, ptr %296, i32 0, i32 1
  %298 = load i32, ptr %297, align 8, !tbaa !29
  %299 = icmp slt i32 %295, %298
  br i1 %299, label %300, label %331

300:                                              ; preds = %294
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %301 = load ptr, ptr %23, align 8, !tbaa !5
  %302 = getelementptr inbounds %struct.tag_____List__Ptr__Attribute______, ptr %301, i32 0, i32 0
  %303 = load ptr, ptr %302, align 8, !tbaa !31
  %304 = load i32, ptr %24, align 4, !tbaa !26
  %305 = sext i32 %304 to i64
  %306 = getelementptr inbounds ptr, ptr %303, i64 %305
  %307 = load ptr, ptr %306, align 8, !tbaa !5
  store ptr %307, ptr %25, align 8, !tbaa !5
  %308 = load ptr, ptr %25, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.tag_____Attribute__, ptr %308, i32 0, i32 1
  %310 = load ptr, ptr %309, align 8, !tbaa !32
  %311 = getelementptr inbounds %struct.tag_____Token__, ptr %310, i32 0, i32 1
  %312 = getelementptr inbounds { ptr, i32 }, ptr %311, i32 0, i32 0
  %313 = load ptr, ptr %312, align 8
  %314 = getelementptr inbounds { ptr, i32 }, ptr %311, i32 0, i32 1
  %315 = load i32, ptr %314, align 8
  %316 = load ptr, ptr @mu_____string113, align 8
  %317 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string113, i32 0, i32 1), align 8
  %318 = call zeroext i8 @string__equals__(ptr %313, i32 %315, ptr %316, i32 %317)
  %319 = icmp ne i8 %318, 0
  br i1 %319, label %320, label %325

320:                                              ; preds = %300
  %321 = load ptr, ptr %4, align 8, !tbaa !5
  %322 = load ptr, ptr %6, align 8, !tbaa !5
  %323 = load ptr, ptr %22, align 8, !tbaa !5
  %324 = load ptr, ptr %25, align 8, !tbaa !5
  call void @TypeCheckerFirstPass__checkParamAsAttribute__(ptr noundef %321, ptr noundef %322, ptr noundef %323, ptr noundef %324)
  br label %328

325:                                              ; preds = %300
  %326 = load ptr, ptr %4, align 8, !tbaa !5
  %327 = load ptr, ptr %25, align 8, !tbaa !5
  call void @TypeCheckerFirstPass__badAttribute__(ptr noundef %326, ptr noundef %327)
  br label %328

328:                                              ; preds = %325, %320
  %329 = load i32, ptr %24, align 4, !tbaa !26
  %330 = add nsw i32 %329, 1
  store i32 %330, ptr %24, align 4, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  br label %294, !llvm.loop !47

331:                                              ; preds = %294
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  br label %332

332:                                              ; preds = %331, %278
  %333 = load i32, ptr %21, align 4, !tbaa !26
  %334 = add nsw i32 %333, 1
  store i32 %334, ptr %21, align 4, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  br label %272, !llvm.loop !48

335:                                              ; preds = %272
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 1, ptr %26) #4
  %336 = load ptr, ptr %6, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %336, i32 0, i32 12
  %338 = load i32, ptr %337, align 8, !tbaa !36
  %339 = and i32 %338, 2
  %340 = icmp ne i32 %339, 0
  %341 = zext i1 %340 to i32
  %342 = trunc i32 %341 to i8
  store i8 %342, ptr %26, align 1, !tbaa !37
  %343 = load i8, ptr %26, align 1, !tbaa !37
  %344 = icmp ne i8 %343, 0
  br i1 %344, label %345, label %353

345:                                              ; preds = %335
  %346 = load ptr, ptr %6, align 8, !tbaa !5
  %347 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %346, i32 0, i32 7
  %348 = getelementptr inbounds %struct.Node__, ptr %347, i32 0, i32 1
  %349 = load ptr, ptr %348, align 8, !tbaa !49
  %350 = icmp eq ptr %349, null
  %351 = zext i1 %350 to i32
  %352 = trunc i32 %351 to i8
  store i8 %352, ptr %26, align 1, !tbaa !37
  br label %353

353:                                              ; preds = %345, %335
  %354 = load i8, ptr %26, align 1, !tbaa !37
  %355 = icmp ne i8 %354, 0
  br i1 %355, label %356, label %370

356:                                              ; preds = %353
  %357 = load ptr, ptr %4, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %357, i32 0, i32 2
  %359 = load ptr, ptr %358, align 8, !tbaa !38
  %360 = load ptr, ptr %6, align 8, !tbaa !5
  %361 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %360, i32 0, i32 0
  %362 = load ptr, ptr %361, align 8, !tbaa !40
  %363 = load ptr, ptr %6, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %363, i32 0, i32 1
  %365 = load ptr, ptr %364, align 8, !tbaa !19
  %366 = getelementptr inbounds %struct.tag_____Token__, ptr %365, i32 0, i32 2
  %367 = load i64, ptr %366, align 8
  %368 = load ptr, ptr @mu_____string117, align 8
  %369 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string117, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %27, ptr noundef %362, i64 %367, ptr %368, i32 %369)
  call void @List__add__Error____(ptr noundef %359, ptr noundef byval(%struct.tag_____Error__) align 8 %27)
  br label %370

370:                                              ; preds = %356, %353
  call void @llvm.lifetime.start.p0(i64 1, ptr %28) #4
  %371 = load ptr, ptr %6, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %371, i32 0, i32 12
  %373 = load i32, ptr %372, align 8, !tbaa !36
  %374 = and i32 %373, 2
  %375 = icmp ne i32 %374, 0
  %376 = zext i1 %375 to i32
  %377 = trunc i32 %376 to i8
  store i8 %377, ptr %28, align 1, !tbaa !37
  %378 = load i8, ptr %28, align 1, !tbaa !37
  %379 = icmp ne i8 %378, 0
  br i1 %379, label %380, label %387

380:                                              ; preds = %370
  %381 = load ptr, ptr %6, align 8, !tbaa !5
  %382 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %381, i32 0, i32 10
  %383 = load ptr, ptr %382, align 8, !tbaa !50
  %384 = icmp ne ptr %383, null
  %385 = zext i1 %384 to i32
  %386 = trunc i32 %385 to i8
  store i8 %386, ptr %28, align 1, !tbaa !37
  br label %387

387:                                              ; preds = %380, %370
  %388 = load i8, ptr %28, align 1, !tbaa !37
  %389 = icmp ne i8 %388, 0
  br i1 %389, label %390, label %404

390:                                              ; preds = %387
  %391 = load ptr, ptr %4, align 8, !tbaa !5
  %392 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %391, i32 0, i32 2
  %393 = load ptr, ptr %392, align 8, !tbaa !38
  %394 = load ptr, ptr %6, align 8, !tbaa !5
  %395 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %394, i32 0, i32 0
  %396 = load ptr, ptr %395, align 8, !tbaa !40
  %397 = load ptr, ptr %6, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %397, i32 0, i32 1
  %399 = load ptr, ptr %398, align 8, !tbaa !19
  %400 = getelementptr inbounds %struct.tag_____Token__, ptr %399, i32 0, i32 2
  %401 = load i64, ptr %400, align 8
  %402 = load ptr, ptr @mu_____string118, align 8
  %403 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string118, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %29, ptr noundef %396, i64 %401, ptr %402, i32 %403)
  call void @List__add__Error____(ptr noundef %393, ptr noundef byval(%struct.tag_____Error__) align 8 %29)
  br label %404

404:                                              ; preds = %390, %387
  call void @llvm.lifetime.start.p0(i64 1, ptr %30) #4
  %405 = load ptr, ptr %6, align 8, !tbaa !5
  %406 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %405, i32 0, i32 12
  %407 = load i32, ptr %406, align 8, !tbaa !36
  %408 = and i32 %407, 2
  %409 = icmp eq i32 %408, 0
  %410 = zext i1 %409 to i32
  %411 = trunc i32 %410 to i8
  store i8 %411, ptr %30, align 1, !tbaa !37
  %412 = load i8, ptr %30, align 1, !tbaa !37
  %413 = icmp ne i8 %412, 0
  br i1 %413, label %414, label %421

414:                                              ; preds = %404
  %415 = load ptr, ptr %6, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %415, i32 0, i32 10
  %417 = load ptr, ptr %416, align 8, !tbaa !50
  %418 = icmp eq ptr %417, null
  %419 = zext i1 %418 to i32
  %420 = trunc i32 %419 to i8
  store i8 %420, ptr %30, align 1, !tbaa !37
  br label %421

421:                                              ; preds = %414, %404
  %422 = load i8, ptr %30, align 1, !tbaa !37
  %423 = icmp ne i8 %422, 0
  br i1 %423, label %424, label %438

424:                                              ; preds = %421
  %425 = load ptr, ptr %4, align 8, !tbaa !5
  %426 = getelementptr inbounds %struct.tag_____TypeCheckerContext__, ptr %425, i32 0, i32 2
  %427 = load ptr, ptr %426, align 8, !tbaa !38
  %428 = load ptr, ptr %6, align 8, !tbaa !5
  %429 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %428, i32 0, i32 0
  %430 = load ptr, ptr %429, align 8, !tbaa !40
  %431 = load ptr, ptr %6, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.tag_____FunctionDef__, ptr %431, i32 0, i32 1
  %433 = load ptr, ptr %432, align 8, !tbaa !19
  %434 = getelementptr inbounds %struct.tag_____Token__, ptr %433, i32 0, i32 2
  %435 = load i64, ptr %434, align 8
  %436 = load ptr, ptr @mu_____string119, align 8
  %437 = load i32, ptr getelementptr inbounds ({ ptr, i32 }, ptr @mu_____string119, i32 0, i32 1), align 8
  call void @Error__at__(ptr dead_on_unwind writable sret(%struct.tag_____Error__) align 8 %31, ptr noundef %430, i64 %435, ptr %436, i32 %437)
  call void @List__add__Error____(ptr noundef %427, ptr noundef byval(%struct.tag_____Error__) align 8 %31)
  br label %438

438:                                              ; preds = %424, %421
  call void @llvm.lifetime.end.p0(i64 1, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %7) #4
  ret void
}

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

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

; 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) #3

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: readwrite) }
attributes #3 = { 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 #4 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 96}
!10 = !{!"tag_____FunctionDef__", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !11, i64 56, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !12, i64 104, !6, i64 112, !13, i64 120, !13, i64 136, !14, i64 152, !12, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !13, i64 208}
!11 = !{!"", !12, i64 0, !6, i64 8}
!12 = !{!"int", !7, i64 0}
!13 = !{!"", !6, i64 0, !12, i64 8}
!14 = !{!"tag_____Tag__", !6, i64 0, !6, i64 8}
!15 = !{!11, !6, i64 8}
!16 = !{!11, !12, i64 0}
!17 = !{!18, !6, i64 32}
!18 = !{!"tag_____Namespace__", !13, i64 0, !6, i64 16, !12, i64 24, !12, 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, !12, i64 104}
!19 = !{!10, !6, i64 8}
!20 = !{!10, !6, i64 16}
!21 = !{!10, !6, i64 112}
!22 = !{!23, !6, i64 8}
!23 = !{!"tag_____IAllocator__", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!24 = !{!23, !6, i64 0}
!25 = !{i64 0, i64 8, !5, i64 8, i64 4, !26, i64 16, i64 4, !26, i64 20, i64 4, !26, i64 24, i64 4, !26, i64 32, i64 8, !5, i64 40, i64 8, !5}
!26 = !{!12, !12, i64 0}
!27 = !{!10, !6, i64 176}
!28 = !{!10, !6, i64 72}
!29 = !{!30, !12, i64 8}
!30 = !{!"tag_____List__Ptr__Attribute______", !6, i64 0, !12, i64 8, !12, i64 12}
!31 = !{!30, !6, i64 0}
!32 = !{!33, !6, i64 8}
!33 = !{!"tag_____Attribute__", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.mustprogress"}
!36 = !{!10, !12, i64 104}
!37 = !{!7, !7, i64 0}
!38 = !{!39, !6, i64 16}
!39 = !{!"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, !12, i64 120, !12, i64 124, !6, i64 128, !12, i64 136, !7, i64 140}
!40 = !{!10, !6, i64 0}
!41 = !{!10, !6, i64 32}
!42 = !{!43, !12, i64 8}
!43 = !{!"tag_____List__Ptr__Param______", !6, i64 0, !12, i64 8, !12, i64 12}
!44 = !{!43, !6, i64 0}
!45 = !{!46, !6, i64 24}
!46 = !{!"tag_____Param__", !6, i64 0, !11, i64 8, !6, i64 24, !14, i64 32, !12, i64 48, !13, i64 56}
!47 = distinct !{!47, !35}
!48 = distinct !{!48, !35}
!49 = !{!10, !6, i64 64}
!50 = !{!10, !6, i64 88}


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

@mu_____string115 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string116 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string117 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string110 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string119 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string113 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string114 = external dso_local local_unnamed_addr global %struct.string__, align 8
@mu_____string118 = 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

; 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: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

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

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

; 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 #3

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

; Function Attrs: nounwind uwtable
declare dso_local ptr @TypeCheckerFirstPass__checkTypeParams__(ptr noundef, ptr noundef) local_unnamed_addr #3

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

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @Map__tryAdd__string__Node____(ptr noundef, ptr, i32, i32, ptr) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local void @TypeCheckerFirstPass__checkFunction__(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #3 {
  %4 = alloca %struct.tag_____CustomSet__Ptr__Array__Tag________, align 8
  %5 = alloca %struct.tag_____Error__, align 8
  %6 = alloca %struct.tag_____Error__, align 8
  %7 = alloca %struct.tag_____Error__, align 8
  %8 = alloca %struct.tag_____Error__, align 8
  %9 = alloca %struct.tag_____Error__, align 8
  %10 = getelementptr inbounds i8, ptr %2, i64 96
  store ptr %1, ptr %10, align 8, !tbaa !5
  %.not = icmp eq ptr %2, null
  %11 = select i1 %.not, i32 0, i32 34
  %12 = getelementptr inbounds i8, ptr %1, i64 32
  %13 = load ptr, ptr %12, align 8, !tbaa !14
  %14 = getelementptr inbounds i8, ptr %2, i64 8
  %15 = load ptr, ptr %14, align 8, !tbaa !16
  %16 = getelementptr inbounds i8, ptr %15, i64 8
  %17 = load ptr, ptr %16, align 8
  %18 = getelementptr inbounds i8, ptr %15, i64 16
  %19 = load i32, ptr %18, align 8
  %20 = tail call zeroext i8 @Map__tryAdd__string__Node____(ptr noundef %13, ptr %17, i32 %19, i32 %11, ptr %2)
  %.not124 = icmp eq i8 %20, 0
  br i1 %.not124, label %21, label %23

21:                                               ; preds = %3
  %22 = load ptr, ptr %14, align 8, !tbaa !16
  tail call void @TypeCheckerFirstPass__duplicateMember__(ptr noundef %0, ptr noundef %22)
  br label %23

23:                                               ; preds = %21, %3
  %24 = getelementptr inbounds i8, ptr %2, i64 16
  %25 = load ptr, ptr %24, align 8, !tbaa !17
  %.not125 = icmp eq ptr %25, null
  br i1 %.not125, label %35, label %26

26:                                               ; preds = %23
  %27 = tail call ptr @TypeCheckerFirstPass__checkTypeParams__(ptr noundef %0, ptr noundef nonnull %25)
  %28 = getelementptr inbounds i8, ptr %2, i64 112
  store ptr %27, ptr %28, align 8, !tbaa !18
  %29 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____currentAllocator__)
  %30 = getelementptr inbounds i8, ptr %29, i64 8
  %31 = load ptr, ptr %30, align 8, !tbaa !19
  %32 = load ptr, ptr %29, align 8, !tbaa !21
  %33 = tail call ptr %31(ptr noundef %32, i64 noundef 48) #4
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %4) #4
  call void @Tag__createArgsSet__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____CustomSet__Ptr__Array__Tag________) align 8 %4)
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(48) %33, ptr noundef nonnull align 8 dereferenceable(48) %4, i64 48, i1 false), !tbaa.struct !22
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %4) #4
  %34 = getelementptr inbounds i8, ptr %2, i64 176
  store ptr %33, ptr %34, align 8, !tbaa !25
  br label %35

35:                                               ; preds = %26, %23
  %36 = getelementptr inbounds i8, ptr %2, i64 72
  %37 = load ptr, ptr %36, align 8, !tbaa !26
  %.not126 = icmp eq ptr %37, null
  br i1 %.not126, label %.thread, label %.preheader153

.preheader153:                                    ; preds = %35
  %38 = getelementptr inbounds i8, ptr %37, i64 8
  %39 = load i32, ptr %38, align 8, !tbaa !27
  %40 = icmp sgt i32 %39, 0
  br i1 %40, label %.lr.ph, label %.thread

.lr.ph:                                           ; preds = %.preheader153, %87
  %indvars.iv = phi i64 [ %indvars.iv.next, %87 ], [ 0, %.preheader153 ]
  %.0103158 = phi ptr [ %.2, %87 ], [ null, %.preheader153 ]
  %.0105157 = phi ptr [ %.2107, %87 ], [ null, %.preheader153 ]
  %41 = load ptr, ptr %37, align 8, !tbaa !29
  %42 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv
  %43 = load ptr, ptr %42, align 8, !tbaa !23
  %44 = getelementptr inbounds i8, ptr %43, i64 8
  %45 = load ptr, ptr %44, align 8, !tbaa !30
  %46 = getelementptr inbounds i8, ptr %45, i64 8
  %47 = load ptr, ptr %46, align 8
  %48 = getelementptr inbounds i8, ptr %45, i64 16
  %49 = load i32, ptr %48, align 8
  %50 = load ptr, ptr @mu_____string110, align 8
  %51 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string110, i64 8), align 8
  %52 = call zeroext i8 @string__equals__(ptr %47, i32 %49, ptr %50, i32 %51)
  %.not139 = icmp eq i8 %52, 0
  br i1 %.not139, label %54, label %53

53:                                               ; preds = %.lr.ph
  call void @TypeCheckerFirstPass__checkFunctionForeignAttribute__(ptr noundef %0, ptr noundef %2, ptr noundef nonnull %43)
  br label %87

54:                                               ; preds = %.lr.ph
  %55 = load ptr, ptr %44, align 8, !tbaa !30
  %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_____string113, align 8
  %61 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string113, i64 8), align 8
  %62 = call zeroext i8 @string__equals__(ptr %57, i32 %59, ptr %60, i32 %61)
  %.not140 = icmp eq i8 %62, 0
  br i1 %.not140, label %65, label %63

63:                                               ; preds = %54
  %64 = icmp eq ptr %.0103158, null
  %spec.select = select i1 %64, ptr %43, ptr %.0103158
  call void @TypeCheckerFirstPass__checkFunctionAsAttribute__(ptr noundef %0, ptr noundef %2, ptr noundef nonnull %43)
  br label %87

65:                                               ; preds = %54
  %66 = load ptr, ptr %44, align 8, !tbaa !30
  %67 = getelementptr inbounds i8, ptr %66, i64 8
  %68 = load ptr, ptr %67, align 8
  %69 = getelementptr inbounds i8, ptr %66, i64 16
  %70 = load i32, ptr %69, align 8
  %71 = load ptr, ptr @mu_____string114, align 8
  %72 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string114, i64 8), align 8
  %73 = call zeroext i8 @string__equals__(ptr %68, i32 %70, ptr %71, i32 %72)
  %.not141 = icmp eq i8 %73, 0
  br i1 %.not141, label %76, label %74

74:                                               ; preds = %65
  %75 = icmp eq ptr %.0105157, null
  %spec.select143 = select i1 %75, ptr %43, ptr %.0105157
  call void @TypeCheckerFirstPass__checkFunctionVarArgsAttribute__(ptr noundef %0, ptr noundef %2, ptr noundef nonnull %43)
  br label %87

76:                                               ; preds = %65
  %77 = load ptr, ptr %44, align 8, !tbaa !30
  %78 = getelementptr inbounds i8, ptr %77, i64 8
  %79 = load ptr, ptr %78, align 8
  %80 = getelementptr inbounds i8, ptr %77, i64 16
  %81 = load i32, ptr %80, align 8
  %82 = load ptr, ptr @mu_____string115, align 8
  %83 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string115, i64 8), align 8
  %84 = call zeroext i8 @string__equals__(ptr %79, i32 %81, ptr %82, i32 %83)
  %.not142 = icmp eq i8 %84, 0
  br i1 %.not142, label %86, label %85

85:                                               ; preds = %76
  call void @TypeCheckerFirstPass__checkFunctionCallingConventionAttribute__(ptr noundef %0, ptr noundef %2, ptr noundef nonnull %43)
  br label %87

86:                                               ; preds = %76
  call void @TypeCheckerFirstPass__badAttribute__(ptr noundef %0, ptr noundef nonnull %43)
  br label %87

87:                                               ; preds = %63, %85, %86, %74, %53
  %.2107 = phi ptr [ %.0105157, %53 ], [ %.0105157, %63 ], [ %spec.select143, %74 ], [ %.0105157, %85 ], [ %.0105157, %86 ]
  %.2 = phi ptr [ %.0103158, %53 ], [ %spec.select, %63 ], [ %.0103158, %74 ], [ %.0103158, %85 ], [ %.0103158, %86 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %88 = load i32, ptr %38, align 8, !tbaa !27
  %89 = sext i32 %88 to i64
  %90 = icmp slt i64 %indvars.iv.next, %89
  br i1 %90, label %.lr.ph, label %.loopexit154, !llvm.loop !32

.thread:                                          ; preds = %.preheader153, %35
  %91 = getelementptr inbounds i8, ptr %2, i64 104
  br label %120

.loopexit154:                                     ; preds = %87
  %92 = getelementptr inbounds i8, ptr %2, i64 104
  %93 = load i32, ptr %92, align 8, !tbaa !34
  %94 = and i32 %93, 2
  %95 = icmp ne i32 %94, 0
  %.not128 = icmp eq ptr %.2, null
  %spec.select145 = select i1 %95, i1 true, i1 %.not128
  br i1 %spec.select145, label %106, label %96

96:                                               ; preds = %.loopexit154
  %97 = getelementptr inbounds i8, ptr %0, i64 16
  %98 = load ptr, ptr %97, align 8, !tbaa !35
  %99 = load ptr, ptr %2, align 8, !tbaa !37
  %100 = getelementptr inbounds i8, ptr %.2, i64 8
  %101 = load ptr, ptr %100, align 8, !tbaa !30
  %102 = getelementptr inbounds i8, ptr %101, i64 24
  %103 = load i64, ptr %102, align 8
  %104 = load ptr, ptr @mu_____string116, align 8
  %105 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string116, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %5, ptr noundef %99, i64 %103, ptr %104, i32 %105)
  call void @List__add__Error____(ptr noundef %98, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %5)
  %.pre = load i32, ptr %92, align 8, !tbaa !34
  br label %106

106:                                              ; preds = %96, %.loopexit154
  %107 = phi i32 [ %.pre, %96 ], [ %93, %.loopexit154 ]
  %108 = and i32 %107, 2
  %109 = icmp ne i32 %108, 0
  %.not130 = icmp eq ptr %.2107, null
  %spec.select146 = select i1 %109, i1 true, i1 %.not130
  br i1 %spec.select146, label %120, label %110

110:                                              ; preds = %106
  %111 = getelementptr inbounds i8, ptr %0, i64 16
  %112 = load ptr, ptr %111, align 8, !tbaa !35
  %113 = load ptr, ptr %2, align 8, !tbaa !37
  %114 = getelementptr inbounds i8, ptr %.2107, i64 8
  %115 = load ptr, ptr %114, align 8, !tbaa !30
  %116 = getelementptr inbounds i8, ptr %115, i64 24
  %117 = load i64, ptr %116, align 8
  %118 = load ptr, ptr @mu_____string116, align 8
  %119 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string116, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %6, ptr noundef %113, i64 %117, ptr %118, i32 %119)
  call void @List__add__Error____(ptr noundef %112, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %6)
  br label %120

120:                                              ; preds = %.thread, %110, %106
  %121 = phi ptr [ %91, %.thread ], [ %92, %110 ], [ %92, %106 ]
  %122 = getelementptr inbounds i8, ptr %2, i64 32
  %123 = load ptr, ptr %122, align 8, !tbaa !38
  %124 = getelementptr inbounds i8, ptr %123, i64 8
  %125 = load i32, ptr %124, align 8, !tbaa !39
  %126 = icmp sgt i32 %125, 0
  br i1 %126, label %.lr.ph163, label %._crit_edge

.lr.ph163:                                        ; preds = %120, %.loopexit
  %127 = phi i32 [ %154, %.loopexit ], [ %125, %120 ]
  %indvars.iv168 = phi i64 [ %indvars.iv.next169, %.loopexit ], [ 0, %120 ]
  %128 = load ptr, ptr %123, align 8, !tbaa !41
  %129 = getelementptr inbounds ptr, ptr %128, i64 %indvars.iv168
  %130 = load ptr, ptr %129, align 8, !tbaa !23
  %131 = getelementptr inbounds i8, ptr %130, i64 24
  %132 = load ptr, ptr %131, align 8, !tbaa !42
  %.not137 = icmp eq ptr %132, null
  br i1 %.not137, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %.lr.ph163
  %133 = getelementptr inbounds i8, ptr %132, i64 8
  %134 = load i32, ptr %133, align 8, !tbaa !27
  %135 = icmp sgt i32 %134, 0
  br i1 %135, label %.lr.ph161, label %.loopexit

.lr.ph161:                                        ; preds = %.preheader, %150
  %indvars.iv165 = phi i64 [ %indvars.iv.next166, %150 ], [ 0, %.preheader ]
  %136 = load ptr, ptr %132, align 8, !tbaa !29
  %137 = getelementptr inbounds ptr, ptr %136, i64 %indvars.iv165
  %138 = load ptr, ptr %137, align 8, !tbaa !23
  %139 = getelementptr inbounds i8, ptr %138, i64 8
  %140 = load ptr, ptr %139, align 8, !tbaa !30
  %141 = getelementptr inbounds i8, ptr %140, i64 8
  %142 = load ptr, ptr %141, align 8
  %143 = getelementptr inbounds i8, ptr %140, i64 16
  %144 = load i32, ptr %143, align 8
  %145 = load ptr, ptr @mu_____string113, align 8
  %146 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string113, i64 8), align 8
  %147 = call zeroext i8 @string__equals__(ptr %142, i32 %144, ptr %145, i32 %146)
  %.not138 = icmp eq i8 %147, 0
  br i1 %.not138, label %149, label %148

148:                                              ; preds = %.lr.ph161
  call void @TypeCheckerFirstPass__checkParamAsAttribute__(ptr noundef %0, ptr noundef %2, ptr noundef %130, ptr noundef nonnull %138)
  br label %150

149:                                              ; preds = %.lr.ph161
  call void @TypeCheckerFirstPass__badAttribute__(ptr noundef %0, ptr noundef nonnull %138)
  br label %150

150:                                              ; preds = %149, %148
  %indvars.iv.next166 = add nuw nsw i64 %indvars.iv165, 1
  %151 = load i32, ptr %133, align 8, !tbaa !27
  %152 = sext i32 %151 to i64
  %153 = icmp slt i64 %indvars.iv.next166, %152
  br i1 %153, label %.lr.ph161, label %.loopexit.loopexit, !llvm.loop !44

.loopexit.loopexit:                               ; preds = %150
  %.pre171 = load i32, ptr %124, align 8, !tbaa !39
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit, %.preheader, %.lr.ph163
  %154 = phi i32 [ %.pre171, %.loopexit.loopexit ], [ %127, %.preheader ], [ %127, %.lr.ph163 ]
  %indvars.iv.next169 = add nuw nsw i64 %indvars.iv168, 1
  %155 = sext i32 %154 to i64
  %156 = icmp slt i64 %indvars.iv.next169, %155
  br i1 %156, label %.lr.ph163, label %._crit_edge, !llvm.loop !45

._crit_edge:                                      ; preds = %.loopexit, %120
  %157 = load i32, ptr %121, align 8, !tbaa !34
  %158 = and i32 %157, 2
  %.not131 = icmp eq i32 %158, 0
  br i1 %.not131, label %.critedge148, label %159

159:                                              ; preds = %._crit_edge
  %160 = getelementptr inbounds i8, ptr %2, i64 64
  %161 = load ptr, ptr %160, align 8, !tbaa !46
  %.not151 = icmp eq ptr %161, null
  br i1 %.not151, label %.critedge, label %.critedge.thread184

.critedge:                                        ; preds = %159
  %162 = getelementptr inbounds i8, ptr %0, i64 16
  %163 = load ptr, ptr %162, align 8, !tbaa !35
  %164 = load ptr, ptr %2, align 8, !tbaa !37
  %165 = load ptr, ptr %14, align 8, !tbaa !16
  %166 = getelementptr inbounds i8, ptr %165, i64 24
  %167 = load i64, ptr %166, align 8
  %168 = load ptr, ptr @mu_____string117, align 8
  %169 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string117, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %7, ptr noundef %164, i64 %167, ptr %168, i32 %169)
  call void @List__add__Error____(ptr noundef %163, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %7)
  %.pre172 = load i32, ptr %121, align 8, !tbaa !34
  %.pre174 = and i32 %.pre172, 2
  %170 = icmp eq i32 %.pre174, 0
  br i1 %170, label %.critedge148, label %.critedge.thread184

.critedge.thread184:                              ; preds = %159, %.critedge
  %171 = phi i32 [ %.pre172, %.critedge ], [ %157, %159 ]
  %172 = getelementptr inbounds i8, ptr %2, i64 88
  %173 = load ptr, ptr %172, align 8, !tbaa !47
  %.not135 = icmp eq ptr %173, null
  br i1 %.not135, label %.critedge148, label %174

174:                                              ; preds = %.critedge.thread184
  %175 = getelementptr inbounds i8, ptr %0, i64 16
  %176 = load ptr, ptr %175, align 8, !tbaa !35
  %177 = load ptr, ptr %2, align 8, !tbaa !37
  %178 = load ptr, ptr %14, align 8, !tbaa !16
  %179 = getelementptr inbounds i8, ptr %178, i64 24
  %180 = load i64, ptr %179, align 8
  %181 = load ptr, ptr @mu_____string118, align 8
  %182 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string118, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %8, ptr noundef %177, i64 %180, ptr %181, i32 %182)
  call void @List__add__Error____(ptr noundef %176, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %8)
  %.pre173 = load i32, ptr %121, align 8, !tbaa !34
  br label %.critedge148

.critedge148:                                     ; preds = %._crit_edge, %.critedge, %174, %.critedge.thread184
  %183 = phi i32 [ %.pre172, %.critedge ], [ %.pre173, %174 ], [ %171, %.critedge.thread184 ], [ %157, %._crit_edge ]
  %184 = and i32 %183, 2
  %185 = icmp eq i32 %184, 0
  br i1 %185, label %186, label %.critedge150

186:                                              ; preds = %.critedge148
  %187 = getelementptr inbounds i8, ptr %2, i64 88
  %188 = load ptr, ptr %187, align 8, !tbaa !47
  %.not152 = icmp eq ptr %188, null
  br i1 %.not152, label %189, label %.critedge150

189:                                              ; preds = %186
  %190 = getelementptr inbounds i8, ptr %0, i64 16
  %191 = load ptr, ptr %190, align 8, !tbaa !35
  %192 = load ptr, ptr %2, align 8, !tbaa !37
  %193 = load ptr, ptr %14, align 8, !tbaa !16
  %194 = getelementptr inbounds i8, ptr %193, i64 24
  %195 = load i64, ptr %194, align 8
  %196 = load ptr, ptr @mu_____string119, align 8
  %197 = load i32, ptr getelementptr inbounds (i8, ptr @mu_____string119, i64 8), align 8
  call void @Error__at__(ptr dead_on_unwind nonnull writable sret(%struct.tag_____Error__) align 8 %9, ptr noundef %192, i64 %195, ptr %196, i32 %197)
  call void @List__add__Error____(ptr noundef %191, ptr noundef nonnull byval(%struct.tag_____Error__) align 8 %9)
  br label %.critedge150

.critedge150:                                     ; preds = %.critedge148, %189, %186
  ret void
}

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

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

; 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 #3

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: readwrite) }
attributes #3 = { 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 #4 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 96}
!6 = !{!"tag_____FunctionDef__", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !10, i64 56, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !11, i64 104, !7, i64 112, !12, i64 120, !12, i64 136, !13, i64 152, !11, i64 168, !7, i64 176, !7, i64 184, !7, i64 192, !7, i64 200, !12, i64 208}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"", !11, i64 0, !7, i64 8}
!11 = !{!"int", !8, i64 0}
!12 = !{!"", !7, i64 0, !11, i64 8}
!13 = !{!"tag_____Tag__", !7, i64 0, !7, i64 8}
!14 = !{!15, !7, i64 32}
!15 = !{!"tag_____Namespace__", !12, i64 0, !7, i64 16, !11, i64 24, !11, i64 28, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !11, i64 104}
!16 = !{!6, !7, i64 8}
!17 = !{!6, !7, i64 16}
!18 = !{!6, !7, i64 112}
!19 = !{!20, !7, i64 8}
!20 = !{!"tag_____IAllocator__", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24}
!21 = !{!20, !7, i64 0}
!22 = !{i64 0, i64 8, !23, i64 8, i64 4, !24, i64 16, i64 4, !24, i64 20, i64 4, !24, i64 24, i64 4, !24, i64 32, i64 8, !23, i64 40, i64 8, !23}
!23 = !{!7, !7, i64 0}
!24 = !{!11, !11, i64 0}
!25 = !{!6, !7, i64 176}
!26 = !{!6, !7, i64 72}
!27 = !{!28, !11, i64 8}
!28 = !{!"tag_____List__Ptr__Attribute______", !7, i64 0, !11, i64 8, !11, i64 12}
!29 = !{!28, !7, i64 0}
!30 = !{!31, !7, i64 8}
!31 = !{!"tag_____Attribute__", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{!6, !11, i64 104}
!35 = !{!36, !7, i64 16}
!36 = !{!"tag_____TypeCheckerContext__", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !11, i64 120, !11, i64 124, !7, i64 128, !11, i64 136, !8, i64 140}
!37 = !{!6, !7, i64 0}
!38 = !{!6, !7, i64 32}
!39 = !{!40, !11, i64 8}
!40 = !{!"tag_____List__Ptr__Param______", !7, i64 0, !11, i64 8, !11, i64 12}
!41 = !{!40, !7, i64 0}
!42 = !{!43, !7, i64 24}
!43 = !{!"tag_____Param__", !7, i64 0, !10, i64 8, !7, i64 24, !13, i64 32, !11, i64 48, !12, i64 56}
!44 = distinct !{!44, !33}
!45 = distinct !{!45, !33}
!46 = !{!6, !7, i64 64}
!47 = !{!6, !7, i64 88}


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