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

; 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.tag_____Tag__ = type { ptr, ptr }
%struct.Node__ = type { i32, ptr }
%struct.tag_____Namespace__ = type { %struct.string__, ptr, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32 }
%struct.string__ = type { ptr, i32 }
%struct.tag_____Array__Tag____ = type { ptr, i32 }

@top_____abandonFn__ = external dso_local thread_local global ptr, align 8
@Tag__null___ = external hidden global %struct.tag_____Tag__, 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
define dso_local zeroext i8 @TypeChecker__assignMatch__(ptr noundef %0, ptr %1, ptr %2, i32 %3, ptr %4, ptr noundef byval(%struct.tag_____Tag__) align 8 %5, i8 noundef zeroext %6, ptr noundef %7, ptr noundef %8) #3 {
  %10 = alloca i8, align 1
  %11 = alloca %struct.tag_____Tag__, align 8
  %12 = alloca %struct.Node__, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i8, align 1
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i8, align 1
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca ptr, align 8
  %23 = alloca i32, align 4
  %24 = alloca i8, align 1
  %25 = alloca ptr, align 8
  %26 = alloca i32, align 4
  %27 = alloca ptr, align 8
  %28 = alloca i32, align 4
  %29 = alloca ptr, align 8
  %30 = alloca i32, align 4
  %31 = alloca i8, align 1
  %32 = alloca ptr, align 8
  %33 = alloca i32, align 4
  %34 = alloca %struct.tag_____Tag__, align 8
  %35 = alloca %struct.Node__, align 8
  %36 = alloca ptr, align 8
  %37 = alloca i32, align 4
  %38 = alloca i8, align 1
  %39 = alloca i8, align 1
  %40 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 0
  store ptr %1, ptr %40, align 8
  %41 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 1
  store ptr %2, ptr %41, align 8
  %42 = getelementptr inbounds { i32, ptr }, ptr %12, i32 0, i32 0
  store i32 %3, ptr %42, align 8
  %43 = getelementptr inbounds { i32, ptr }, ptr %12, i32 0, i32 1
  store ptr %4, ptr %43, align 8
  store ptr %0, ptr %13, align 8, !tbaa !5
  store i8 %6, ptr %14, align 1, !tbaa !9
  store ptr %7, ptr %15, align 8, !tbaa !5
  store ptr %8, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #4
  %44 = getelementptr inbounds %struct.tag_____Tag__, ptr %11, i32 0, i32 0
  %45 = load ptr, ptr %44, align 8, !tbaa !10
  %46 = icmp eq ptr %45, null
  %47 = zext i1 %46 to i32
  %48 = trunc i32 %47 to i8
  store i8 %48, ptr %17, align 1, !tbaa !9
  %49 = load i8, ptr %17, align 1, !tbaa !9
  %50 = icmp ne i8 %49, 0
  br i1 %50, label %57, label %51

51:                                               ; preds = %9
  %52 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 0
  %53 = load ptr, ptr %52, align 8, !tbaa !10
  %54 = icmp eq ptr %53, null
  %55 = zext i1 %54 to i32
  %56 = trunc i32 %55 to i8
  store i8 %56, ptr %17, align 1, !tbaa !9
  br label %57

57:                                               ; preds = %51, %9
  %58 = load i8, ptr %17, align 1, !tbaa !9
  %59 = icmp ne i8 %58, 0
  br i1 %59, label %60, label %61

60:                                               ; preds = %57
  store i8 1, ptr %10, align 1
  store i32 1, ptr %18, align 4
  br label %340

61:                                               ; preds = %57
  %62 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 0
  %63 = load ptr, ptr %62, align 8, !tbaa !10
  %64 = getelementptr inbounds %struct.tag_____Namespace__, ptr %63, i32 0, i32 3
  %65 = load i32, ptr %64, align 4, !tbaa !12
  %66 = and i32 %65, 16384
  %67 = icmp ne i32 %66, 0
  br i1 %67, label %68, label %200

68:                                               ; preds = %61
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  %69 = load ptr, ptr %15, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 0
  %71 = load ptr, ptr %70, align 8, !tbaa !10
  %72 = call i32 @TypeChecker__findTypeParamIndex__(ptr noundef %69, ptr noundef %71)
  store i32 %72, ptr %19, align 4, !tbaa !16
  %73 = load i32, ptr %19, align 4, !tbaa !16
  %74 = icmp sge i32 %73, 0
  br i1 %74, label %75, label %195

75:                                               ; preds = %68
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %76 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %76, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  %77 = load i32, ptr %19, align 4, !tbaa !16
  store i32 %77, ptr %21, align 4, !tbaa !16
  %78 = load i32, ptr %21, align 4, !tbaa !16
  %79 = load ptr, ptr %20, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %79, i32 0, i32 1
  %81 = load i32, ptr %80, align 8, !tbaa !17
  %82 = icmp ult i32 %78, %81
  br i1 %82, label %86, label %83

83:                                               ; preds = %75
  %84 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %85 = load ptr, ptr %84, align 8, !tbaa !5
  call void %85(i32 noundef -3)
  br label %86

86:                                               ; preds = %83, %75
  %87 = load ptr, ptr %20, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %87, i32 0, i32 0
  %89 = load ptr, ptr %88, align 8, !tbaa !19
  %90 = load i32, ptr %21, align 4, !tbaa !16
  %91 = zext i32 %90 to i64
  %92 = getelementptr inbounds %struct.tag_____Tag__, ptr %89, i64 %91
  %93 = getelementptr inbounds %struct.tag_____Tag__, ptr %92, i32 0, i32 0
  %94 = load ptr, ptr %93, align 8, !tbaa !10
  %95 = icmp ne ptr %94, null
  br i1 %95, label %96, label %173

96:                                               ; preds = %86
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %97 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %97, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  %98 = load i32, ptr %19, align 4, !tbaa !16
  store i32 %98, ptr %23, align 4, !tbaa !16
  %99 = load i32, ptr %23, align 4, !tbaa !16
  %100 = load ptr, ptr %22, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %100, i32 0, i32 1
  %102 = load i32, ptr %101, align 8, !tbaa !17
  %103 = icmp ult i32 %99, %102
  br i1 %103, label %107, label %104

104:                                              ; preds = %96
  %105 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %106 = load ptr, ptr %105, align 8, !tbaa !5
  call void %106(i32 noundef -3)
  br label %107

107:                                              ; preds = %104, %96
  call void @llvm.lifetime.start.p0(i64 1, ptr %24) #4
  %108 = load ptr, ptr %22, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %108, i32 0, i32 0
  %110 = load ptr, ptr %109, align 8, !tbaa !19
  %111 = load i32, ptr %23, align 4, !tbaa !16
  %112 = zext i32 %111 to i64
  %113 = getelementptr inbounds %struct.tag_____Tag__, ptr %110, i64 %112
  %114 = getelementptr inbounds %struct.tag_____Tag__, ptr %113, i32 0, i32 0
  %115 = load ptr, ptr %114, align 8, !tbaa !10
  %116 = load ptr, ptr @Tag__null___, align 8, !tbaa !10
  %117 = icmp eq ptr %115, %116
  %118 = zext i1 %117 to i32
  %119 = trunc i32 %118 to i8
  store i8 %119, ptr %24, align 1, !tbaa !9
  %120 = load i8, ptr %24, align 1, !tbaa !9
  %121 = icmp ne i8 %120, 0
  br i1 %121, label %122, label %131

122:                                              ; preds = %107
  %123 = getelementptr inbounds %struct.tag_____Tag__, ptr %11, i32 0, i32 0
  %124 = load ptr, ptr %123, align 8, !tbaa !10
  %125 = getelementptr inbounds %struct.tag_____Namespace__, ptr %124, i32 0, i32 3
  %126 = load i32, ptr %125, align 4, !tbaa !12
  %127 = and i32 %126, 204992
  %128 = icmp ne i32 %127, 0
  %129 = zext i1 %128 to i32
  %130 = trunc i32 %129 to i8
  store i8 %130, ptr %24, align 1, !tbaa !9
  br label %131

131:                                              ; preds = %122, %107
  %132 = load i8, ptr %24, align 1, !tbaa !9
  %133 = icmp ne i8 %132, 0
  br i1 %133, label %134, label %152

134:                                              ; preds = %131
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %135 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %135, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #4
  %136 = load i32, ptr %19, align 4, !tbaa !16
  store i32 %136, ptr %26, align 4, !tbaa !16
  %137 = load i32, ptr %26, align 4, !tbaa !16
  %138 = load ptr, ptr %25, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %138, i32 0, i32 1
  %140 = load i32, ptr %139, align 8, !tbaa !17
  %141 = icmp ult i32 %137, %140
  br i1 %141, label %145, label %142

142:                                              ; preds = %134
  %143 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %144 = load ptr, ptr %143, align 8, !tbaa !5
  call void %144(i32 noundef -3)
  br label %145

145:                                              ; preds = %142, %134
  %146 = load ptr, ptr %25, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %146, i32 0, i32 0
  %148 = load ptr, ptr %147, align 8, !tbaa !19
  %149 = load i32, ptr %26, align 4, !tbaa !16
  %150 = zext i32 %149 to i64
  %151 = getelementptr inbounds %struct.tag_____Tag__, ptr %148, i64 %150
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %151, ptr align 8 %11, i64 16, i1 false), !tbaa.struct !20
  store i8 1, ptr %10, align 1
  store i32 1, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  br label %170

152:                                              ; preds = %131
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  %153 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %153, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %154 = load i32, ptr %19, align 4, !tbaa !16
  store i32 %154, ptr %28, align 4, !tbaa !16
  %155 = load i32, ptr %28, align 4, !tbaa !16
  %156 = load ptr, ptr %27, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %156, i32 0, i32 1
  %158 = load i32, ptr %157, align 8, !tbaa !17
  %159 = icmp ult i32 %155, %158
  br i1 %159, label %163, label %160

160:                                              ; preds = %152
  %161 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %162 = load ptr, ptr %161, align 8, !tbaa !5
  call void %162(i32 noundef -3)
  br label %163

163:                                              ; preds = %160, %152
  %164 = load ptr, ptr %27, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %164, i32 0, i32 0
  %166 = load ptr, ptr %165, align 8, !tbaa !19
  %167 = load i32, ptr %28, align 4, !tbaa !16
  %168 = zext i32 %167 to i64
  %169 = getelementptr inbounds %struct.tag_____Tag__, ptr %166, i64 %168
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %5, ptr align 8 %169, i64 16, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  store i32 0, ptr %18, align 4
  br label %170

170:                                              ; preds = %163, %145
  call void @llvm.lifetime.end.p0(i64 1, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  %171 = load i32, ptr %18, align 4
  switch i32 %171, label %192 [
    i32 0, label %172
  ]

172:                                              ; preds = %170
  br label %191

173:                                              ; preds = %86
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  %174 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %174, ptr %29, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  %175 = load i32, ptr %19, align 4, !tbaa !16
  store i32 %175, ptr %30, align 4, !tbaa !16
  %176 = load i32, ptr %30, align 4, !tbaa !16
  %177 = load ptr, ptr %29, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %177, i32 0, i32 1
  %179 = load i32, ptr %178, align 8, !tbaa !17
  %180 = icmp ult i32 %176, %179
  br i1 %180, label %184, label %181

181:                                              ; preds = %173
  %182 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %183 = load ptr, ptr %182, align 8, !tbaa !5
  call void %183(i32 noundef -3)
  br label %184

184:                                              ; preds = %181, %173
  %185 = load ptr, ptr %29, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %185, i32 0, i32 0
  %187 = load ptr, ptr %186, align 8, !tbaa !19
  %188 = load i32, ptr %30, align 4, !tbaa !16
  %189 = zext i32 %188 to i64
  %190 = getelementptr inbounds %struct.tag_____Tag__, ptr %187, i64 %189
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %190, ptr align 8 %11, i64 16, i1 false), !tbaa.struct !20
  store i8 1, ptr %10, align 1
  store i32 1, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  br label %192

191:                                              ; preds = %172
  store i32 0, ptr %18, align 4
  br label %192

192:                                              ; preds = %191, %184, %170
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  %193 = load i32, ptr %18, align 4
  switch i32 %193, label %197 [
    i32 0, label %194
  ]

194:                                              ; preds = %192
  br label %196

195:                                              ; preds = %68
  br label %196

196:                                              ; preds = %195, %194
  store i32 0, ptr %18, align 4
  br label %197

197:                                              ; preds = %196, %192
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  %198 = load i32, ptr %18, align 4
  switch i32 %198, label %340 [
    i32 0, label %199
  ]

199:                                              ; preds = %197
  br label %200

200:                                              ; preds = %199, %61
  %201 = getelementptr inbounds %struct.tag_____Tag__, ptr %11, i32 0, i32 0
  %202 = load ptr, ptr %201, align 8, !tbaa !10
  %203 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 0
  %204 = load ptr, ptr %203, align 8, !tbaa !10
  %205 = icmp eq ptr %202, %204
  br i1 %205, label %206, label %296

206:                                              ; preds = %200
  call void @llvm.lifetime.start.p0(i64 1, ptr %31) #4
  %207 = getelementptr inbounds %struct.tag_____Tag__, ptr %11, i32 0, i32 1
  %208 = load ptr, ptr %207, align 8, !tbaa !21
  %209 = icmp ne ptr %208, null
  %210 = zext i1 %209 to i32
  %211 = trunc i32 %210 to i8
  store i8 %211, ptr %31, align 1, !tbaa !9
  %212 = load i8, ptr %31, align 1, !tbaa !9
  %213 = icmp ne i8 %212, 0
  br i1 %213, label %220, label %214

214:                                              ; preds = %206
  %215 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 1
  %216 = load ptr, ptr %215, align 8, !tbaa !21
  %217 = icmp ne ptr %216, null
  %218 = zext i1 %217 to i32
  %219 = trunc i32 %218 to i8
  store i8 %219, ptr %31, align 1, !tbaa !9
  br label %220

220:                                              ; preds = %214, %206
  %221 = load i8, ptr %31, align 1, !tbaa !9
  %222 = icmp ne i8 %221, 0
  br i1 %222, label %223, label %294

223:                                              ; preds = %220
  %224 = getelementptr inbounds %struct.tag_____Tag__, ptr %11, i32 0, i32 1
  %225 = load ptr, ptr %224, align 8, !tbaa !21
  %226 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %225, i32 0, i32 1
  %227 = load i32, ptr %226, align 8, !tbaa !17
  %228 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 1
  %229 = load ptr, ptr %228, align 8, !tbaa !21
  %230 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %229, i32 0, i32 1
  %231 = load i32, ptr %230, align 8, !tbaa !17
  %232 = icmp ne i32 %227, %231
  br i1 %232, label %233, label %234

233:                                              ; preds = %223
  store i8 0, ptr %10, align 1
  store i32 1, ptr %18, align 4
  br label %295

234:                                              ; preds = %223
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %235 = getelementptr inbounds %struct.tag_____Tag__, ptr %11, i32 0, i32 1
  %236 = load ptr, ptr %235, align 8, !tbaa !21
  store ptr %236, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  store i32 0, ptr %33, align 4, !tbaa !16
  br label %237

237:                                              ; preds = %289, %234
  %238 = load i32, ptr %33, align 4, !tbaa !16
  %239 = load ptr, ptr %32, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %239, i32 0, i32 1
  %241 = load i32, ptr %240, align 8, !tbaa !17
  %242 = icmp slt i32 %238, %241
  br i1 %242, label %243, label %290

243:                                              ; preds = %237
  call void @llvm.lifetime.start.p0(i64 16, ptr %34) #4
  %244 = load ptr, ptr %32, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %244, i32 0, i32 0
  %246 = load ptr, ptr %245, align 8, !tbaa !19
  %247 = load i32, ptr %33, align 4, !tbaa !16
  %248 = sext i32 %247 to i64
  %249 = getelementptr inbounds %struct.tag_____Tag__, ptr %246, i64 %248
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %34, ptr align 8 %249, i64 16, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.start.p0(i64 16, ptr %35) #4
  %250 = getelementptr inbounds %struct.Node__, ptr %35, i32 0, i32 1
  store ptr null, ptr %250, align 8, !tbaa !22
  %251 = getelementptr inbounds %struct.Node__, ptr %35, i32 0, i32 0
  store i32 0, ptr %251, align 8, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  %252 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 1
  %253 = load ptr, ptr %252, align 8, !tbaa !21
  store ptr %253, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #4
  %254 = load i32, ptr %33, align 4, !tbaa !16
  store i32 %254, ptr %37, align 4, !tbaa !16
  %255 = load i32, ptr %37, align 4, !tbaa !16
  %256 = load ptr, ptr %36, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %256, i32 0, i32 1
  %258 = load i32, ptr %257, align 8, !tbaa !17
  %259 = icmp ult i32 %255, %258
  br i1 %259, label %263, label %260

260:                                              ; preds = %243
  %261 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %262 = load ptr, ptr %261, align 8, !tbaa !5
  call void %262(i32 noundef -3)
  br label %263

263:                                              ; preds = %260, %243
  %264 = load ptr, ptr %13, align 8, !tbaa !5
  %265 = load ptr, ptr %36, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.tag_____Array__Tag____, ptr %265, i32 0, i32 0
  %267 = load ptr, ptr %266, align 8, !tbaa !19
  %268 = load i32, ptr %37, align 4, !tbaa !16
  %269 = zext i32 %268 to i64
  %270 = getelementptr inbounds %struct.tag_____Tag__, ptr %267, i64 %269
  %271 = load ptr, ptr %15, align 8, !tbaa !5
  %272 = load ptr, ptr %16, align 8, !tbaa !5
  %273 = getelementptr inbounds { ptr, ptr }, ptr %34, i32 0, i32 0
  %274 = load ptr, ptr %273, align 8
  %275 = getelementptr inbounds { ptr, ptr }, ptr %34, i32 0, i32 1
  %276 = load ptr, ptr %275, align 8
  %277 = getelementptr inbounds { i32, ptr }, ptr %35, i32 0, i32 0
  %278 = load i32, ptr %277, align 8
  %279 = getelementptr inbounds { i32, ptr }, ptr %35, i32 0, i32 1
  %280 = load ptr, ptr %279, align 8
  %281 = call zeroext i8 @TypeChecker__assignMatch__(ptr noundef %264, ptr %274, ptr %276, i32 %278, ptr %280, ptr noundef byval(%struct.tag_____Tag__) align 8 %270, i8 noundef zeroext 0, ptr noundef %271, ptr noundef %272)
  %282 = icmp ne i8 %281, 0
  br i1 %282, label %284, label %283

283:                                              ; preds = %263
  store i8 0, ptr %10, align 1
  store i32 1, ptr %18, align 4
  br label %287

284:                                              ; preds = %263
  %285 = load i32, ptr %33, align 4, !tbaa !16
  %286 = add nsw i32 %285, 1
  store i32 %286, ptr %33, align 4, !tbaa !16
  store i32 0, ptr %18, align 4
  br label %287

287:                                              ; preds = %284, %283
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %34) #4
  %288 = load i32, ptr %18, align 4
  switch i32 %288, label %291 [
    i32 0, label %289
  ]

289:                                              ; preds = %287
  br label %237, !llvm.loop !25

290:                                              ; preds = %237
  store i32 0, ptr %18, align 4
  br label %291

291:                                              ; preds = %290, %287
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  %292 = load i32, ptr %18, align 4
  switch i32 %292, label %295 [
    i32 0, label %293
  ]

293:                                              ; preds = %291
  br label %294

294:                                              ; preds = %293, %220
  store i8 1, ptr %10, align 1
  store i32 1, ptr %18, align 4
  br label %295

295:                                              ; preds = %294, %291, %233
  call void @llvm.lifetime.end.p0(i64 1, ptr %31) #4
  br label %340

296:                                              ; preds = %200
  call void @llvm.lifetime.start.p0(i64 1, ptr %38) #4
  %297 = getelementptr inbounds %struct.tag_____Tag__, ptr %11, i32 0, i32 0
  %298 = load ptr, ptr %297, align 8, !tbaa !10
  %299 = load ptr, ptr @Tag__null___, align 8, !tbaa !10
  %300 = icmp eq ptr %298, %299
  %301 = zext i1 %300 to i32
  %302 = trunc i32 %301 to i8
  store i8 %302, ptr %38, align 1, !tbaa !9
  %303 = load i8, ptr %38, align 1, !tbaa !9
  %304 = icmp ne i8 %303, 0
  br i1 %304, label %305, label %314

305:                                              ; preds = %296
  %306 = getelementptr inbounds %struct.tag_____Tag__, ptr %5, i32 0, i32 0
  %307 = load ptr, ptr %306, align 8, !tbaa !10
  %308 = getelementptr inbounds %struct.tag_____Namespace__, ptr %307, i32 0, i32 3
  %309 = load i32, ptr %308, align 4, !tbaa !12
  %310 = and i32 %309, 204992
  %311 = icmp ne i32 %310, 0
  %312 = zext i1 %311 to i32
  %313 = trunc i32 %312 to i8
  store i8 %313, ptr %38, align 1, !tbaa !9
  br label %314

314:                                              ; preds = %305, %296
  %315 = load i8, ptr %38, align 1, !tbaa !9
  %316 = icmp ne i8 %315, 0
  br i1 %316, label %317, label %318

317:                                              ; preds = %314
  store i8 1, ptr %10, align 1
  store i32 1, ptr %18, align 4
  br label %339

318:                                              ; preds = %314
  call void @llvm.lifetime.start.p0(i64 1, ptr %39) #4
  %319 = load i8, ptr %14, align 1, !tbaa !9
  store i8 %319, ptr %39, align 1, !tbaa !9
  %320 = load i8, ptr %39, align 1, !tbaa !9
  %321 = icmp ne i8 %320, 0
  br i1 %321, label %322, label %333

322:                                              ; preds = %318
  %323 = load ptr, ptr %13, align 8, !tbaa !5
  %324 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 0
  %325 = load ptr, ptr %324, align 8
  %326 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 1
  %327 = load ptr, ptr %326, align 8
  %328 = getelementptr inbounds { i32, ptr }, ptr %12, i32 0, i32 0
  %329 = load i32, ptr %328, align 8
  %330 = getelementptr inbounds { i32, ptr }, ptr %12, i32 0, i32 1
  %331 = load ptr, ptr %330, align 8
  %332 = call zeroext i8 @TypeChecker__canCoerce__(ptr noundef %323, ptr %325, ptr %327, i32 %329, ptr %331, ptr noundef byval(%struct.tag_____Tag__) align 8 %5)
  store i8 %332, ptr %39, align 1, !tbaa !9
  br label %333

333:                                              ; preds = %322, %318
  %334 = load i8, ptr %39, align 1, !tbaa !9
  %335 = icmp ne i8 %334, 0
  br i1 %335, label %336, label %337

336:                                              ; preds = %333
  store i8 1, ptr %10, align 1
  store i32 1, ptr %18, align 4
  br label %338

337:                                              ; preds = %333
  store i8 0, ptr %10, align 1
  store i32 1, ptr %18, align 4
  br label %338

338:                                              ; preds = %337, %336
  call void @llvm.lifetime.end.p0(i64 1, ptr %39) #4
  br label %339

339:                                              ; preds = %338, %317
  call void @llvm.lifetime.end.p0(i64 1, ptr %38) #4
  br label %340

340:                                              ; preds = %339, %295, %197, %60
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #4
  %341 = load i8, ptr %10, align 1
  ret i8 %341
}

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @TypeChecker__canCoerce__(ptr noundef, ptr, ptr, i32, ptr, ptr noundef byval(%struct.tag_____Tag__) align 8) #3

; Function Attrs: nounwind uwtable
declare dso_local i32 @TypeChecker__findTypeParamIndex__(ptr noundef, ptr noundef) #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 = !{!7, !7, i64 0}
!10 = !{!11, !6, i64 0}
!11 = !{!"tag_____Tag__", !6, i64 0, !6, i64 8}
!12 = !{!13, !15, i64 28}
!13 = !{!"tag_____Namespace__", !14, i64 0, !6, i64 16, !15, i64 24, !15, 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, !15, i64 104}
!14 = !{!"", !6, i64 0, !15, i64 8}
!15 = !{!"int", !7, i64 0}
!16 = !{!15, !15, i64 0}
!17 = !{!18, !15, i64 8}
!18 = !{!"tag_____Array__Tag____", !6, i64 0, !15, i64 8}
!19 = !{!18, !6, i64 0}
!20 = !{i64 0, i64 8, !5, i64 8, i64 8, !5}
!21 = !{!11, !6, i64 8}
!22 = !{!23, !6, i64 8}
!23 = !{!"", !15, i64 0, !6, i64 8}
!24 = !{!23, !15, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}


; 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.tag_____Tag__ = type { ptr, ptr }

@top_____abandonFn__ = external dso_local thread_local local_unnamed_addr global ptr, align 8
@Tag__null___ = external hidden local_unnamed_addr global %struct.tag_____Tag__, align 8

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #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) #1

; Function Attrs: nounwind uwtable
define dso_local zeroext range(i8 0, 2) i8 @TypeChecker__assignMatch__(ptr noundef %0, ptr %1, ptr %2, i32 %3, ptr %4, ptr noundef byval(%struct.tag_____Tag__) align 8 %5, i8 noundef zeroext %6, ptr noundef %7, ptr nocapture noundef readonly %8) local_unnamed_addr #2 {
  %10 = icmp ne ptr %1, null
  %11 = load ptr, ptr %5, align 8
  %12 = icmp ne ptr %11, null
  %narrow.not = select i1 %10, i1 %12, i1 false
  br i1 %narrow.not, label %13, label %.thread118

13:                                               ; preds = %9
  %14 = getelementptr inbounds i8, ptr %11, i64 28
  %15 = load i32, ptr %14, align 4, !tbaa !5
  %16 = and i32 %15, 16384
  %.not101 = icmp eq i32 %16, 0
  br i1 %.not101, label %.critedge, label %17

17:                                               ; preds = %13
  %18 = tail call i32 @TypeChecker__findTypeParamIndex__(ptr noundef %7, ptr noundef nonnull %11)
  %19 = icmp sgt i32 %18, -1
  br i1 %19, label %20, label %.critedge

20:                                               ; preds = %17
  %21 = getelementptr inbounds i8, ptr %8, i64 8
  %22 = load i32, ptr %21, align 8, !tbaa !12
  %23 = icmp ult i32 %18, %22
  br i1 %23, label %27, label %24

24:                                               ; preds = %20
  %25 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %26 = load ptr, ptr %25, align 8, !tbaa !14
  tail call void %26(i32 noundef -3) #3
  br label %27

27:                                               ; preds = %24, %20
  %28 = load ptr, ptr %8, align 8, !tbaa !15
  %29 = zext nneg i32 %18 to i64
  %30 = getelementptr inbounds %struct.tag_____Tag__, ptr %28, i64 %29
  %31 = load ptr, ptr %30, align 8, !tbaa !16
  %.not102 = icmp eq ptr %31, null
  %32 = load i32, ptr %21, align 8, !tbaa !12
  %33 = icmp ult i32 %18, %32
  br i1 %.not102, label %60, label %34

34:                                               ; preds = %27
  br i1 %33, label %38, label %35

35:                                               ; preds = %34
  %36 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %37 = load ptr, ptr %36, align 8, !tbaa !14
  tail call void %37(i32 noundef -3) #3
  %.pre = load ptr, ptr %8, align 8, !tbaa !15
  %.phi.trans.insert = getelementptr inbounds %struct.tag_____Tag__, ptr %.pre, i64 %29
  %.pre129 = load ptr, ptr %.phi.trans.insert, align 8, !tbaa !16
  br label %38

38:                                               ; preds = %35, %34
  %39 = phi ptr [ %.pre129, %35 ], [ %31, %34 ]
  %40 = phi ptr [ %.pre, %35 ], [ %28, %34 ]
  %41 = load ptr, ptr @Tag__null___, align 8, !tbaa !16
  %42 = icmp eq ptr %39, %41
  br i1 %42, label %43, label %..thread_crit_edge

..thread_crit_edge:                               ; preds = %38
  %.pre131 = load i32, ptr %21, align 8, !tbaa !12
  br label %.thread

43:                                               ; preds = %38
  %44 = getelementptr inbounds i8, ptr %1, i64 28
  %45 = load i32, ptr %44, align 4, !tbaa !5
  %46 = and i32 %45, 204992
  %.not = icmp eq i32 %46, 0
  %.pre132 = load i32, ptr %21, align 8, !tbaa !12
  br i1 %.not, label %.thread, label %47

47:                                               ; preds = %43
  %48 = icmp ult i32 %18, %.pre132
  br i1 %48, label %52, label %49

49:                                               ; preds = %47
  %50 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %51 = load ptr, ptr %50, align 8, !tbaa !14
  tail call void %51(i32 noundef -3) #3
  %.pre130 = load ptr, ptr %8, align 8, !tbaa !15
  br label %52

52:                                               ; preds = %49, %47
  %53 = phi ptr [ %.pre130, %49 ], [ %40, %47 ]
  %54 = getelementptr inbounds %struct.tag_____Tag__, ptr %53, i64 %29
  store ptr %1, ptr %54, align 8, !tbaa !14
  %.sroa.8.0..sroa_idx = getelementptr inbounds i8, ptr %54, i64 8
  store ptr %2, ptr %.sroa.8.0..sroa_idx, align 8, !tbaa !14
  br label %.thread118

.thread:                                          ; preds = %..thread_crit_edge, %43
  %55 = phi i32 [ %.pre131, %..thread_crit_edge ], [ %.pre132, %43 ]
  %56 = icmp ult i32 %18, %55
  br i1 %56, label %67, label %57

57:                                               ; preds = %.thread
  %58 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %59 = load ptr, ptr %58, align 8, !tbaa !14
  tail call void %59(i32 noundef -3) #3
  %.pre133 = load ptr, ptr %8, align 8, !tbaa !15
  br label %67

60:                                               ; preds = %27
  br i1 %33, label %64, label %61

61:                                               ; preds = %60
  %62 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  %63 = load ptr, ptr %62, align 8, !tbaa !14
  tail call void %63(i32 noundef -3) #3
  %.pre134 = load ptr, ptr %8, align 8, !tbaa !15
  br label %64

64:                                               ; preds = %61, %60
  %65 = phi ptr [ %.pre134, %61 ], [ %28, %60 ]
  %66 = getelementptr inbounds %struct.tag_____Tag__, ptr %65, i64 %29
  store ptr %1, ptr %66, align 8, !tbaa !14
  %.sroa.8.0..sroa_idx75 = getelementptr inbounds i8, ptr %66, i64 8
  store ptr %2, ptr %.sroa.8.0..sroa_idx75, align 8, !tbaa !14
  br label %.thread118

67:                                               ; preds = %.thread, %57
  %68 = phi ptr [ %40, %.thread ], [ %.pre133, %57 ]
  %69 = getelementptr inbounds %struct.tag_____Tag__, ptr %68, i64 %29
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %5, ptr noundef nonnull align 8 dereferenceable(16) %69, i64 16, i1 false), !tbaa.struct !18
  %.pre135 = load ptr, ptr %5, align 8, !tbaa !16
  br label %.critedge

.critedge:                                        ; preds = %67, %17, %13
  %70 = phi ptr [ %.pre135, %67 ], [ %11, %17 ], [ %11, %13 ]
  %71 = icmp eq ptr %70, %1
  br i1 %71, label %72, label %96

72:                                               ; preds = %.critedge
  %.not108 = icmp eq ptr %2, null
  %73 = getelementptr inbounds i8, ptr %5, i64 8
  %74 = load ptr, ptr %73, align 8
  %.not110 = icmp eq ptr %74, null
  %.090 = select i1 %.not108, i1 %.not110, i1 false
  br i1 %.090, label %.thread118, label %75

75:                                               ; preds = %72
  %76 = getelementptr inbounds i8, ptr %2, i64 8
  %77 = load i32, ptr %76, align 8, !tbaa !12
  %78 = getelementptr inbounds i8, ptr %74, i64 8
  %79 = load i32, ptr %78, align 8, !tbaa !12
  %.not111 = icmp eq i32 %77, %79
  br i1 %.not111, label %.preheader, label %.thread118

.preheader:                                       ; preds = %75
  %80 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @top_____abandonFn__)
  br label %81

81:                                               ; preds = %.preheader, %92
  %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %92 ]
  %82 = load i32, ptr %76, align 8, !tbaa !12
  %83 = sext i32 %82 to i64
  %.not113 = icmp slt i64 %indvars.iv, %83
  br i1 %.not113, label %84, label %.thread118

84:                                               ; preds = %81
  %85 = load ptr, ptr %2, align 8, !tbaa !15
  %86 = getelementptr inbounds %struct.tag_____Tag__, ptr %85, i64 %indvars.iv
  %.sroa.012.0.copyload = load ptr, ptr %86, align 8, !tbaa !14
  %.sroa.413.0..sroa_idx = getelementptr inbounds i8, ptr %86, i64 8
  %.sroa.413.0.copyload = load ptr, ptr %.sroa.413.0..sroa_idx, align 8, !tbaa !14
  %87 = load i32, ptr %78, align 8, !tbaa !12
  %88 = zext i32 %87 to i64
  %89 = icmp ult i64 %indvars.iv, %88
  br i1 %89, label %92, label %90

90:                                               ; preds = %84
  %91 = load ptr, ptr %80, align 8, !tbaa !14
  tail call void %91(i32 noundef -3) #3
  br label %92

92:                                               ; preds = %90, %84
  %93 = load ptr, ptr %74, align 8, !tbaa !15
  %94 = getelementptr inbounds %struct.tag_____Tag__, ptr %93, i64 %indvars.iv
  %95 = tail call zeroext i8 @TypeChecker__assignMatch__(ptr noundef %0, ptr %.sroa.012.0.copyload, ptr %.sroa.413.0.copyload, i32 0, ptr null, ptr noundef byval(%struct.tag_____Tag__) align 8 %94, i8 noundef zeroext 0, ptr noundef %7, ptr noundef %8)
  %.not112.not = icmp eq i8 %95, 0
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  br i1 %.not112.not, label %.thread118, label %81, !llvm.loop !19

96:                                               ; preds = %.critedge
  %97 = load ptr, ptr @Tag__null___, align 8, !tbaa !16
  %98 = icmp eq ptr %97, %1
  br i1 %98, label %99, label %.critedge115

99:                                               ; preds = %96
  %100 = getelementptr inbounds i8, ptr %70, i64 28
  %101 = load i32, ptr %100, align 4, !tbaa !5
  %102 = and i32 %101, 204992
  %.not105 = icmp eq i32 %102, 0
  br i1 %.not105, label %.critedge115, label %.thread118

.critedge115:                                     ; preds = %96, %99
  %.not106 = icmp eq i8 %6, 0
  br i1 %.not106, label %.thread123, label %103

103:                                              ; preds = %.critedge115
  %104 = tail call zeroext i8 @TypeChecker__canCoerce__(ptr noundef %0, ptr nonnull %1, ptr %2, i32 %3, ptr %4, ptr noundef nonnull byval(%struct.tag_____Tag__) align 8 %5)
  %.fr = freeze i8 %104
  %105 = icmp eq i8 %.fr, 0
  br i1 %105, label %.thread123, label %.thread118

.thread123:                                       ; preds = %.critedge115, %103
  br label %.thread118

.thread118:                                       ; preds = %92, %81, %52, %64, %.thread123, %103, %72, %99, %75, %9
  %.11 = phi i8 [ 1, %9 ], [ 0, %75 ], [ 1, %99 ], [ 1, %72 ], [ 0, %.thread123 ], [ 1, %103 ], [ 1, %64 ], [ 1, %52 ], [ 0, %92 ], [ 1, %81 ]
  ret i8 %.11
}

; Function Attrs: nounwind uwtable
declare dso_local zeroext i8 @TypeChecker__canCoerce__(ptr noundef, ptr, ptr, i32, ptr, ptr noundef byval(%struct.tag_____Tag__) align 8) local_unnamed_addr #2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !11, i64 28}
!6 = !{!"tag_____Namespace__", !7, i64 0, !8, i64 16, !11, i64 24, !11, i64 28, !8, i64 32, !8, i64 40, !8, i64 48, !8, i64 56, !8, i64 64, !8, i64 72, !8, i64 80, !8, i64 88, !8, i64 96, !11, i64 104}
!7 = !{!"", !8, i64 0, !11, i64 8}
!8 = !{!"any pointer", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = !{!"int", !9, i64 0}
!12 = !{!13, !11, i64 8}
!13 = !{!"tag_____Array__Tag____", !8, i64 0, !11, i64 8}
!14 = !{!8, !8, i64 0}
!15 = !{!13, !8, i64 0}
!16 = !{!17, !8, i64 0}
!17 = !{!"tag_____Tag__", !8, i64 0, !8, i64 8}
!18 = !{i64 0, i64 8, !14, i64 8, i64 8, !14}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}


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