; LLVM IR from caryll/otfcc :: lib/font (caryll-sfnt-builder)

; 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.otfcc_SFNTBuilder = type { i32, i32, ptr, ptr }
%struct.otfcc_SFNTTableEntry = type { i32, i32, i32, ptr, %struct.UT_hash_handle }
%struct.UT_hash_handle = type { ptr, ptr, ptr, ptr, ptr, ptr, i32, i32 }
%struct.UT_hash_table = type { ptr, i32, i32, i32, ptr, i64, i32, i32, i32, i32, i32 }
%struct.caryll_Buffer = type { i64, i64, i64, ptr }

; 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 willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
define dso_local ptr @otfcc_SFNTBuilder_serialize(ptr noundef %0) #1 {
  %2 = alloca ptr, align 8
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca i16, align 2
  %7 = alloca i16, align 2
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca i64, align 8
  %23 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #3
  %24 = call ptr (...) @bufnew()
  store ptr %24, ptr %4, align 8, !tbaa !5
  %25 = load ptr, ptr %3, align 8, !tbaa !5
  %26 = icmp ne ptr %25, null
  br i1 %26, label %29, label %27

27:                                               ; preds = %1
  %28 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %28, ptr %2, align 8
  store i32 1, ptr %5, align 4
  br label %476

29:                                               ; preds = %1
  call void @llvm.lifetime.start.p0(i64 2, ptr %6) #3
  %30 = load ptr, ptr %3, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %30, i32 0, i32 2
  %32 = load ptr, ptr %31, align 8, !tbaa !9
  %33 = icmp ne ptr %32, null
  br i1 %33, label %34, label %43

34:                                               ; preds = %29
  %35 = load ptr, ptr %3, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %35, i32 0, i32 2
  %37 = load ptr, ptr %36, align 8, !tbaa !9
  %38 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %37, i32 0, i32 4
  %39 = getelementptr inbounds %struct.UT_hash_handle, ptr %38, i32 0, i32 0
  %40 = load ptr, ptr %39, align 8, !tbaa !12
  %41 = getelementptr inbounds %struct.UT_hash_table, ptr %40, i32 0, i32 3
  %42 = load i32, ptr %41, align 8, !tbaa !15
  br label %44

43:                                               ; preds = %29
  br label %44

44:                                               ; preds = %43, %34
  %45 = phi i32 [ %42, %34 ], [ 0, %43 ]
  %46 = trunc i32 %45 to i16
  store i16 %46, ptr %6, align 2, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 2, ptr %7) #3
  %47 = load i16, ptr %6, align 2, !tbaa !18
  %48 = zext i16 %47 to i32
  %49 = icmp slt i32 %48, 16
  br i1 %49, label %50, label %51

50:                                               ; preds = %44
  br label %64

51:                                               ; preds = %44
  %52 = load i16, ptr %6, align 2, !tbaa !18
  %53 = zext i16 %52 to i32
  %54 = icmp slt i32 %53, 32
  br i1 %54, label %55, label %56

55:                                               ; preds = %51
  br label %62

56:                                               ; preds = %51
  %57 = load i16, ptr %6, align 2, !tbaa !18
  %58 = zext i16 %57 to i32
  %59 = icmp slt i32 %58, 64
  %60 = zext i1 %59 to i64
  %61 = select i1 %59, i32 32, i32 64
  br label %62

62:                                               ; preds = %56, %55
  %63 = phi i32 [ 16, %55 ], [ %61, %56 ]
  br label %64

64:                                               ; preds = %62, %50
  %65 = phi i32 [ 8, %50 ], [ %63, %62 ]
  %66 = mul nsw i32 %65, 16
  %67 = trunc i32 %66 to i16
  store i16 %67, ptr %7, align 2, !tbaa !18
  %68 = load ptr, ptr %4, align 8, !tbaa !5
  %69 = load ptr, ptr %3, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %69, i32 0, i32 1
  %71 = load i32, ptr %70, align 4, !tbaa !20
  call void @bufwrite32b(ptr noundef %68, i32 noundef %71)
  %72 = load ptr, ptr %4, align 8, !tbaa !5
  %73 = load i16, ptr %6, align 2, !tbaa !18
  call void @bufwrite16b(ptr noundef %72, i16 noundef zeroext %73)
  %74 = load ptr, ptr %4, align 8, !tbaa !5
  %75 = load i16, ptr %7, align 2, !tbaa !18
  call void @bufwrite16b(ptr noundef %74, i16 noundef zeroext %75)
  %76 = load ptr, ptr %4, align 8, !tbaa !5
  %77 = load i16, ptr %6, align 2, !tbaa !18
  %78 = zext i16 %77 to i32
  %79 = icmp slt i32 %78, 16
  br i1 %79, label %80, label %81

80:                                               ; preds = %64
  br label %94

81:                                               ; preds = %64
  %82 = load i16, ptr %6, align 2, !tbaa !18
  %83 = zext i16 %82 to i32
  %84 = icmp slt i32 %83, 32
  br i1 %84, label %85, label %86

85:                                               ; preds = %81
  br label %92

86:                                               ; preds = %81
  %87 = load i16, ptr %6, align 2, !tbaa !18
  %88 = zext i16 %87 to i32
  %89 = icmp slt i32 %88, 64
  %90 = zext i1 %89 to i64
  %91 = select i1 %89, i32 5, i32 6
  br label %92

92:                                               ; preds = %86, %85
  %93 = phi i32 [ 4, %85 ], [ %91, %86 ]
  br label %94

94:                                               ; preds = %92, %80
  %95 = phi i32 [ 3, %80 ], [ %93, %92 ]
  %96 = trunc i32 %95 to i16
  call void @bufwrite16b(ptr noundef %76, i16 noundef zeroext %96)
  %97 = load ptr, ptr %4, align 8, !tbaa !5
  %98 = load i16, ptr %6, align 2, !tbaa !18
  %99 = zext i16 %98 to i32
  %100 = mul nsw i32 %99, 16
  %101 = load i16, ptr %7, align 2, !tbaa !18
  %102 = zext i16 %101 to i32
  %103 = sub nsw i32 %100, %102
  %104 = trunc i32 %103 to i16
  call void @bufwrite16b(ptr noundef %97, i16 noundef zeroext %104)
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #3
  %105 = load i16, ptr %6, align 2, !tbaa !18
  %106 = zext i16 %105 to i32
  %107 = mul nsw i32 %106, 16
  %108 = add nsw i32 12, %107
  %109 = sext i32 %108 to i64
  store i64 %109, ptr %9, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  %110 = load i64, ptr %9, align 8, !tbaa !21
  store i64 %110, ptr %10, align 8, !tbaa !21
  br label %111

111:                                              ; preds = %94
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #3
  %112 = load ptr, ptr %3, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %112, i32 0, i32 2
  %114 = load ptr, ptr %113, align 8, !tbaa !9
  %115 = icmp ne ptr %114, null
  br i1 %115, label %116, label %412

116:                                              ; preds = %111
  store i32 1, ptr %14, align 4, !tbaa !22
  store i32 1, ptr %12, align 4, !tbaa !22
  %117 = load ptr, ptr %3, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %117, i32 0, i32 2
  %119 = load ptr, ptr %118, align 8, !tbaa !9
  %120 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %119, i32 0, i32 4
  store ptr %120, ptr %20, align 8, !tbaa !5
  br label %121

121:                                              ; preds = %408, %116
  %122 = load i32, ptr %12, align 4, !tbaa !22
  %123 = icmp ne i32 %122, 0
  br i1 %123, label %124, label %411

124:                                              ; preds = %121
  %125 = load ptr, ptr %20, align 8, !tbaa !5
  store ptr %125, ptr %17, align 8, !tbaa !5
  store ptr null, ptr %20, align 8, !tbaa !5
  store ptr null, ptr %21, align 8, !tbaa !5
  store i32 0, ptr %13, align 4, !tbaa !22
  br label %126

126:                                              ; preds = %372, %124
  %127 = load ptr, ptr %17, align 8, !tbaa !5
  %128 = icmp ne ptr %127, null
  br i1 %128, label %129, label %374

129:                                              ; preds = %126
  %130 = load i32, ptr %13, align 4, !tbaa !22
  %131 = add i32 %130, 1
  store i32 %131, ptr %13, align 4, !tbaa !22
  %132 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %132, ptr %18, align 8, !tbaa !5
  store i32 0, ptr %15, align 4, !tbaa !22
  store i32 0, ptr %11, align 4, !tbaa !22
  br label %133

133:                                              ; preds = %164, %129
  %134 = load i32, ptr %11, align 4, !tbaa !22
  %135 = load i32, ptr %14, align 4, !tbaa !22
  %136 = icmp ult i32 %134, %135
  br i1 %136, label %137, label %167

137:                                              ; preds = %133
  %138 = load i32, ptr %15, align 4, !tbaa !22
  %139 = add i32 %138, 1
  store i32 %139, ptr %15, align 4, !tbaa !22
  %140 = load ptr, ptr %18, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.UT_hash_handle, ptr %140, i32 0, i32 2
  %142 = load ptr, ptr %141, align 8, !tbaa !23
  %143 = icmp ne ptr %142, null
  br i1 %143, label %144, label %157

144:                                              ; preds = %137
  %145 = load ptr, ptr %18, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.UT_hash_handle, ptr %145, i32 0, i32 2
  %147 = load ptr, ptr %146, align 8, !tbaa !23
  %148 = load ptr, ptr %3, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %148, i32 0, i32 2
  %150 = load ptr, ptr %149, align 8, !tbaa !9
  %151 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %150, i32 0, i32 4
  %152 = getelementptr inbounds %struct.UT_hash_handle, ptr %151, i32 0, i32 0
  %153 = load ptr, ptr %152, align 8, !tbaa !12
  %154 = getelementptr inbounds %struct.UT_hash_table, ptr %153, i32 0, i32 5
  %155 = load i64, ptr %154, align 8, !tbaa !24
  %156 = getelementptr inbounds i8, ptr %147, i64 %155
  br label %158

157:                                              ; preds = %137
  br label %158

158:                                              ; preds = %157, %144
  %159 = phi ptr [ %156, %144 ], [ null, %157 ]
  store ptr %159, ptr %18, align 8, !tbaa !5
  %160 = load ptr, ptr %18, align 8, !tbaa !5
  %161 = icmp eq ptr %160, null
  br i1 %161, label %162, label %163

162:                                              ; preds = %158
  br label %167

163:                                              ; preds = %158
  br label %164

164:                                              ; preds = %163
  %165 = load i32, ptr %11, align 4, !tbaa !22
  %166 = add i32 %165, 1
  store i32 %166, ptr %11, align 4, !tbaa !22
  br label %133, !llvm.loop !25

167:                                              ; preds = %162, %133
  %168 = load i32, ptr %14, align 4, !tbaa !22
  store i32 %168, ptr %16, align 4, !tbaa !22
  br label %169

169:                                              ; preds = %370, %167
  %170 = load i32, ptr %15, align 4, !tbaa !22
  %171 = icmp ne i32 %170, 0
  br i1 %171, label %180, label %172

172:                                              ; preds = %169
  %173 = load i32, ptr %16, align 4, !tbaa !22
  %174 = icmp ne i32 %173, 0
  br i1 %174, label %175, label %178

175:                                              ; preds = %172
  %176 = load ptr, ptr %18, align 8, !tbaa !5
  %177 = icmp ne ptr %176, null
  br label %178

178:                                              ; preds = %175, %172
  %179 = phi i1 [ false, %172 ], [ %177, %175 ]
  br label %180

180:                                              ; preds = %178, %169
  %181 = phi i1 [ true, %169 ], [ %179, %178 ]
  br i1 %181, label %182, label %372

182:                                              ; preds = %180
  %183 = load i32, ptr %15, align 4, !tbaa !22
  %184 = icmp eq i32 %183, 0
  br i1 %184, label %185, label %209

185:                                              ; preds = %182
  %186 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %186, ptr %19, align 8, !tbaa !5
  %187 = load ptr, ptr %18, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.UT_hash_handle, ptr %187, i32 0, i32 2
  %189 = load ptr, ptr %188, align 8, !tbaa !23
  %190 = icmp ne ptr %189, null
  br i1 %190, label %191, label %204

191:                                              ; preds = %185
  %192 = load ptr, ptr %18, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.UT_hash_handle, ptr %192, i32 0, i32 2
  %194 = load ptr, ptr %193, align 8, !tbaa !23
  %195 = load ptr, ptr %3, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %195, i32 0, i32 2
  %197 = load ptr, ptr %196, align 8, !tbaa !9
  %198 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %197, i32 0, i32 4
  %199 = getelementptr inbounds %struct.UT_hash_handle, ptr %198, i32 0, i32 0
  %200 = load ptr, ptr %199, align 8, !tbaa !12
  %201 = getelementptr inbounds %struct.UT_hash_table, ptr %200, i32 0, i32 5
  %202 = load i64, ptr %201, align 8, !tbaa !24
  %203 = getelementptr inbounds i8, ptr %194, i64 %202
  br label %205

204:                                              ; preds = %185
  br label %205

205:                                              ; preds = %204, %191
  %206 = phi ptr [ %203, %191 ], [ null, %204 ]
  store ptr %206, ptr %18, align 8, !tbaa !5
  %207 = load i32, ptr %16, align 4, !tbaa !22
  %208 = add i32 %207, -1
  store i32 %208, ptr %16, align 4, !tbaa !22
  br label %322

209:                                              ; preds = %182
  %210 = load i32, ptr %16, align 4, !tbaa !22
  %211 = icmp eq i32 %210, 0
  br i1 %211, label %215, label %212

212:                                              ; preds = %209
  %213 = load ptr, ptr %18, align 8, !tbaa !5
  %214 = icmp eq ptr %213, null
  br i1 %214, label %215, label %243

215:                                              ; preds = %212, %209
  %216 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %216, ptr %19, align 8, !tbaa !5
  %217 = load ptr, ptr %17, align 8, !tbaa !5
  %218 = icmp ne ptr %217, null
  br i1 %218, label %219, label %240

219:                                              ; preds = %215
  %220 = load ptr, ptr %17, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.UT_hash_handle, ptr %220, i32 0, i32 2
  %222 = load ptr, ptr %221, align 8, !tbaa !23
  %223 = icmp ne ptr %222, null
  br i1 %223, label %224, label %237

224:                                              ; preds = %219
  %225 = load ptr, ptr %17, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.UT_hash_handle, ptr %225, i32 0, i32 2
  %227 = load ptr, ptr %226, align 8, !tbaa !23
  %228 = load ptr, ptr %3, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %228, i32 0, i32 2
  %230 = load ptr, ptr %229, align 8, !tbaa !9
  %231 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %230, i32 0, i32 4
  %232 = getelementptr inbounds %struct.UT_hash_handle, ptr %231, i32 0, i32 0
  %233 = load ptr, ptr %232, align 8, !tbaa !12
  %234 = getelementptr inbounds %struct.UT_hash_table, ptr %233, i32 0, i32 5
  %235 = load i64, ptr %234, align 8, !tbaa !24
  %236 = getelementptr inbounds i8, ptr %227, i64 %235
  br label %238

237:                                              ; preds = %219
  br label %238

238:                                              ; preds = %237, %224
  %239 = phi ptr [ %236, %224 ], [ null, %237 ]
  store ptr %239, ptr %17, align 8, !tbaa !5
  br label %240

240:                                              ; preds = %238, %215
  %241 = load i32, ptr %15, align 4, !tbaa !22
  %242 = add i32 %241, -1
  store i32 %242, ptr %15, align 4, !tbaa !22
  br label %321

243:                                              ; preds = %212
  %244 = load ptr, ptr %17, align 8, !tbaa !5
  %245 = load ptr, ptr %3, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %245, i32 0, i32 2
  %247 = load ptr, ptr %246, align 8, !tbaa !9
  %248 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %247, i32 0, i32 4
  %249 = getelementptr inbounds %struct.UT_hash_handle, ptr %248, i32 0, i32 0
  %250 = load ptr, ptr %249, align 8, !tbaa !12
  %251 = getelementptr inbounds %struct.UT_hash_table, ptr %250, i32 0, i32 5
  %252 = load i64, ptr %251, align 8, !tbaa !24
  %253 = sub i64 0, %252
  %254 = getelementptr inbounds i8, ptr %244, i64 %253
  %255 = load ptr, ptr %18, align 8, !tbaa !5
  %256 = load ptr, ptr %3, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %256, i32 0, i32 2
  %258 = load ptr, ptr %257, align 8, !tbaa !9
  %259 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %258, i32 0, i32 4
  %260 = getelementptr inbounds %struct.UT_hash_handle, ptr %259, i32 0, i32 0
  %261 = load ptr, ptr %260, align 8, !tbaa !12
  %262 = getelementptr inbounds %struct.UT_hash_table, ptr %261, i32 0, i32 5
  %263 = load i64, ptr %262, align 8, !tbaa !24
  %264 = sub i64 0, %263
  %265 = getelementptr inbounds i8, ptr %255, i64 %264
  %266 = call i32 @byTag(ptr noundef %254, ptr noundef %265)
  %267 = icmp sle i32 %266, 0
  br i1 %267, label %268, label %296

268:                                              ; preds = %243
  %269 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %269, ptr %19, align 8, !tbaa !5
  %270 = load ptr, ptr %17, align 8, !tbaa !5
  %271 = icmp ne ptr %270, null
  br i1 %271, label %272, label %293

272:                                              ; preds = %268
  %273 = load ptr, ptr %17, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.UT_hash_handle, ptr %273, i32 0, i32 2
  %275 = load ptr, ptr %274, align 8, !tbaa !23
  %276 = icmp ne ptr %275, null
  br i1 %276, label %277, label %290

277:                                              ; preds = %272
  %278 = load ptr, ptr %17, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.UT_hash_handle, ptr %278, i32 0, i32 2
  %280 = load ptr, ptr %279, align 8, !tbaa !23
  %281 = load ptr, ptr %3, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %281, i32 0, i32 2
  %283 = load ptr, ptr %282, align 8, !tbaa !9
  %284 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %283, i32 0, i32 4
  %285 = getelementptr inbounds %struct.UT_hash_handle, ptr %284, i32 0, i32 0
  %286 = load ptr, ptr %285, align 8, !tbaa !12
  %287 = getelementptr inbounds %struct.UT_hash_table, ptr %286, i32 0, i32 5
  %288 = load i64, ptr %287, align 8, !tbaa !24
  %289 = getelementptr inbounds i8, ptr %280, i64 %288
  br label %291

290:                                              ; preds = %272
  br label %291

291:                                              ; preds = %290, %277
  %292 = phi ptr [ %289, %277 ], [ null, %290 ]
  store ptr %292, ptr %17, align 8, !tbaa !5
  br label %293

293:                                              ; preds = %291, %268
  %294 = load i32, ptr %15, align 4, !tbaa !22
  %295 = add i32 %294, -1
  store i32 %295, ptr %15, align 4, !tbaa !22
  br label %320

296:                                              ; preds = %243
  %297 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %297, ptr %19, align 8, !tbaa !5
  %298 = load ptr, ptr %18, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.UT_hash_handle, ptr %298, i32 0, i32 2
  %300 = load ptr, ptr %299, align 8, !tbaa !23
  %301 = icmp ne ptr %300, null
  br i1 %301, label %302, label %315

302:                                              ; preds = %296
  %303 = load ptr, ptr %18, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.UT_hash_handle, ptr %303, i32 0, i32 2
  %305 = load ptr, ptr %304, align 8, !tbaa !23
  %306 = load ptr, ptr %3, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %306, i32 0, i32 2
  %308 = load ptr, ptr %307, align 8, !tbaa !9
  %309 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %308, i32 0, i32 4
  %310 = getelementptr inbounds %struct.UT_hash_handle, ptr %309, i32 0, i32 0
  %311 = load ptr, ptr %310, align 8, !tbaa !12
  %312 = getelementptr inbounds %struct.UT_hash_table, ptr %311, i32 0, i32 5
  %313 = load i64, ptr %312, align 8, !tbaa !24
  %314 = getelementptr inbounds i8, ptr %305, i64 %313
  br label %316

315:                                              ; preds = %296
  br label %316

316:                                              ; preds = %315, %302
  %317 = phi ptr [ %314, %302 ], [ null, %315 ]
  store ptr %317, ptr %18, align 8, !tbaa !5
  %318 = load i32, ptr %16, align 4, !tbaa !22
  %319 = add i32 %318, -1
  store i32 %319, ptr %16, align 4, !tbaa !22
  br label %320

320:                                              ; preds = %316, %293
  br label %321

321:                                              ; preds = %320, %240
  br label %322

322:                                              ; preds = %321, %205
  %323 = load ptr, ptr %21, align 8, !tbaa !5
  %324 = icmp ne ptr %323, null
  br i1 %324, label %325, label %345

325:                                              ; preds = %322
  %326 = load ptr, ptr %19, align 8, !tbaa !5
  %327 = icmp ne ptr %326, null
  br i1 %327, label %328, label %340

328:                                              ; preds = %325
  %329 = load ptr, ptr %19, align 8, !tbaa !5
  %330 = load ptr, ptr %3, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %330, i32 0, i32 2
  %332 = load ptr, ptr %331, align 8, !tbaa !9
  %333 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %332, i32 0, i32 4
  %334 = getelementptr inbounds %struct.UT_hash_handle, ptr %333, i32 0, i32 0
  %335 = load ptr, ptr %334, align 8, !tbaa !12
  %336 = getelementptr inbounds %struct.UT_hash_table, ptr %335, i32 0, i32 5
  %337 = load i64, ptr %336, align 8, !tbaa !24
  %338 = sub i64 0, %337
  %339 = getelementptr inbounds i8, ptr %329, i64 %338
  br label %341

340:                                              ; preds = %325
  br label %341

341:                                              ; preds = %340, %328
  %342 = phi ptr [ %339, %328 ], [ null, %340 ]
  %343 = load ptr, ptr %21, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.UT_hash_handle, ptr %343, i32 0, i32 2
  store ptr %342, ptr %344, align 8, !tbaa !23
  br label %347

345:                                              ; preds = %322
  %346 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %346, ptr %20, align 8, !tbaa !5
  br label %347

347:                                              ; preds = %345, %341
  %348 = load ptr, ptr %19, align 8, !tbaa !5
  %349 = icmp ne ptr %348, null
  br i1 %349, label %350, label %370

350:                                              ; preds = %347
  %351 = load ptr, ptr %21, align 8, !tbaa !5
  %352 = icmp ne ptr %351, null
  br i1 %352, label %353, label %365

353:                                              ; preds = %350
  %354 = load ptr, ptr %21, align 8, !tbaa !5
  %355 = load ptr, ptr %3, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %355, i32 0, i32 2
  %357 = load ptr, ptr %356, align 8, !tbaa !9
  %358 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %357, i32 0, i32 4
  %359 = getelementptr inbounds %struct.UT_hash_handle, ptr %358, i32 0, i32 0
  %360 = load ptr, ptr %359, align 8, !tbaa !12
  %361 = getelementptr inbounds %struct.UT_hash_table, ptr %360, i32 0, i32 5
  %362 = load i64, ptr %361, align 8, !tbaa !24
  %363 = sub i64 0, %362
  %364 = getelementptr inbounds i8, ptr %354, i64 %363
  br label %366

365:                                              ; preds = %350
  br label %366

366:                                              ; preds = %365, %353
  %367 = phi ptr [ %364, %353 ], [ null, %365 ]
  %368 = load ptr, ptr %19, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.UT_hash_handle, ptr %368, i32 0, i32 1
  store ptr %367, ptr %369, align 8, !tbaa !27
  br label %370

370:                                              ; preds = %366, %347
  %371 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %371, ptr %21, align 8, !tbaa !5
  br label %169, !llvm.loop !28

372:                                              ; preds = %180
  %373 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %373, ptr %17, align 8, !tbaa !5
  br label %126, !llvm.loop !29

374:                                              ; preds = %126
  %375 = load ptr, ptr %21, align 8, !tbaa !5
  %376 = icmp ne ptr %375, null
  br i1 %376, label %377, label %380

377:                                              ; preds = %374
  %378 = load ptr, ptr %21, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.UT_hash_handle, ptr %378, i32 0, i32 2
  store ptr null, ptr %379, align 8, !tbaa !23
  br label %380

380:                                              ; preds = %377, %374
  %381 = load i32, ptr %13, align 4, !tbaa !22
  %382 = icmp ule i32 %381, 1
  br i1 %382, label %383, label %408

383:                                              ; preds = %380
  store i32 0, ptr %12, align 4, !tbaa !22
  %384 = load ptr, ptr %21, align 8, !tbaa !5
  %385 = load ptr, ptr %3, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %385, i32 0, i32 2
  %387 = load ptr, ptr %386, align 8, !tbaa !9
  %388 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %387, i32 0, i32 4
  %389 = getelementptr inbounds %struct.UT_hash_handle, ptr %388, i32 0, i32 0
  %390 = load ptr, ptr %389, align 8, !tbaa !12
  %391 = getelementptr inbounds %struct.UT_hash_table, ptr %390, i32 0, i32 4
  store ptr %384, ptr %391, align 8, !tbaa !30
  br label %392

392:                                              ; preds = %383
  %393 = load ptr, ptr %20, align 8, !tbaa !5
  %394 = load ptr, ptr %3, align 8, !tbaa !5
  %395 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %394, i32 0, i32 2
  %396 = load ptr, ptr %395, align 8, !tbaa !9
  %397 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %396, i32 0, i32 4
  %398 = getelementptr inbounds %struct.UT_hash_handle, ptr %397, i32 0, i32 0
  %399 = load ptr, ptr %398, align 8, !tbaa !12
  %400 = getelementptr inbounds %struct.UT_hash_table, ptr %399, i32 0, i32 5
  %401 = load i64, ptr %400, align 8, !tbaa !24
  %402 = sub i64 0, %401
  %403 = getelementptr inbounds i8, ptr %393, i64 %402
  %404 = load ptr, ptr %3, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %404, i32 0, i32 2
  store ptr %403, ptr %405, align 8, !tbaa !9
  br label %406

406:                                              ; preds = %392
  br label %407

407:                                              ; preds = %406
  br label %408

408:                                              ; preds = %407, %380
  %409 = load i32, ptr %14, align 4, !tbaa !22
  %410 = mul i32 %409, 2
  store i32 %410, ptr %14, align 4, !tbaa !22
  br label %121, !llvm.loop !31

411:                                              ; preds = %121
  br label %412

412:                                              ; preds = %411, %111
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  br label %413

413:                                              ; preds = %412
  br label %414

414:                                              ; preds = %413
  %415 = load ptr, ptr %3, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.otfcc_SFNTBuilder, ptr %415, i32 0, i32 2
  %417 = load ptr, ptr %416, align 8, !tbaa !9
  store ptr %417, ptr %8, align 8, !tbaa !5
  br label %418

418:                                              ; preds = %461, %414
  %419 = load ptr, ptr %8, align 8, !tbaa !5
  %420 = icmp ne ptr %419, null
  br i1 %420, label %421, label %466

421:                                              ; preds = %418
  %422 = load ptr, ptr %4, align 8, !tbaa !5
  %423 = load ptr, ptr %8, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %423, i32 0, i32 0
  %425 = load i32, ptr %424, align 8, !tbaa !32
  call void @bufwrite32b(ptr noundef %422, i32 noundef %425)
  %426 = load ptr, ptr %4, align 8, !tbaa !5
  %427 = load ptr, ptr %8, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %427, i32 0, i32 2
  %429 = load i32, ptr %428, align 8, !tbaa !33
  call void @bufwrite32b(ptr noundef %426, i32 noundef %429)
  %430 = load ptr, ptr %4, align 8, !tbaa !5
  %431 = load i64, ptr %9, align 8, !tbaa !21
  %432 = trunc i64 %431 to i32
  call void @bufwrite32b(ptr noundef %430, i32 noundef %432)
  %433 = load ptr, ptr %4, align 8, !tbaa !5
  %434 = load ptr, ptr %8, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %434, i32 0, i32 1
  %436 = load i32, ptr %435, align 4, !tbaa !34
  call void @bufwrite32b(ptr noundef %433, i32 noundef %436)
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #3
  %437 = load ptr, ptr %4, align 8, !tbaa !5
  %438 = getelementptr inbounds %struct.caryll_Buffer, ptr %437, i32 0, i32 0
  %439 = load i64, ptr %438, align 8, !tbaa !35
  store i64 %439, ptr %22, align 8, !tbaa !21
  %440 = load ptr, ptr %4, align 8, !tbaa !5
  %441 = load i64, ptr %9, align 8, !tbaa !21
  call void @bufseek(ptr noundef %440, i64 noundef %441)
  %442 = load ptr, ptr %4, align 8, !tbaa !5
  %443 = load ptr, ptr %8, align 8, !tbaa !5
  %444 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %443, i32 0, i32 3
  %445 = load ptr, ptr %444, align 8, !tbaa !37
  call void @bufwrite_buf(ptr noundef %442, ptr noundef %445)
  %446 = load ptr, ptr %4, align 8, !tbaa !5
  %447 = load i64, ptr %22, align 8, !tbaa !21
  call void @bufseek(ptr noundef %446, i64 noundef %447)
  %448 = load ptr, ptr %8, align 8, !tbaa !5
  %449 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %448, i32 0, i32 0
  %450 = load i32, ptr %449, align 8, !tbaa !32
  %451 = icmp eq i32 %450, 1751474532
  br i1 %451, label %452, label %454

452:                                              ; preds = %421
  %453 = load i64, ptr %9, align 8, !tbaa !21
  store i64 %453, ptr %10, align 8, !tbaa !21
  br label %454

454:                                              ; preds = %452, %421
  %455 = load ptr, ptr %8, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %455, i32 0, i32 3
  %457 = load ptr, ptr %456, align 8, !tbaa !37
  %458 = call i64 @buflen(ptr noundef %457)
  %459 = load i64, ptr %9, align 8, !tbaa !21
  %460 = add i64 %459, %458
  store i64 %460, ptr %9, align 8, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #3
  br label %461

461:                                              ; preds = %454
  %462 = load ptr, ptr %8, align 8, !tbaa !5
  %463 = getelementptr inbounds %struct.otfcc_SFNTTableEntry, ptr %462, i32 0, i32 4
  %464 = getelementptr inbounds %struct.UT_hash_handle, ptr %463, i32 0, i32 2
  %465 = load ptr, ptr %464, align 8, !tbaa !38
  store ptr %465, ptr %8, align 8, !tbaa !5
  br label %418, !llvm.loop !39

466:                                              ; preds = %418
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #3
  %467 = load ptr, ptr %4, align 8, !tbaa !5
  %468 = call i32 @buf_checksum(ptr noundef %467)
  store i32 %468, ptr %23, align 4, !tbaa !22
  %469 = load ptr, ptr %4, align 8, !tbaa !5
  %470 = load i64, ptr %10, align 8, !tbaa !21
  %471 = add i64 %470, 8
  call void @bufseek(ptr noundef %469, i64 noundef %471)
  %472 = load ptr, ptr %4, align 8, !tbaa !5
  %473 = load i32, ptr %23, align 4, !tbaa !22
  %474 = sub i32 -1313820742, %473
  call void @bufwrite32b(ptr noundef %472, i32 noundef %474)
  %475 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %475, ptr %2, align 8
  store i32 1, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %6) #3
  br label %476

476:                                              ; preds = %466, %27
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #3
  %477 = load ptr, ptr %2, align 8
  ret ptr %477
}

declare ptr @bufnew(...) #2

declare void @bufwrite32b(ptr noundef, i32 noundef) #2

declare void @bufwrite16b(ptr noundef, i16 noundef zeroext) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @byTag(ptr noundef, ptr noundef) #1

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

declare void @bufwrite_buf(ptr noundef, ptr noundef) #2

declare i64 @buflen(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @buf_checksum(ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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 8}
!10 = !{!"", !11, i64 0, !11, i64 4, !6, i64 8, !6, i64 16}
!11 = !{!"int", !7, i64 0}
!12 = !{!13, !6, i64 24}
!13 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !6, i64 16, !14, i64 24}
!14 = !{!"UT_hash_handle", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !11, i64 48, !11, i64 52}
!15 = !{!16, !11, i64 16}
!16 = !{!"UT_hash_table", !6, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !6, i64 24, !17, i64 32, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56}
!17 = !{!"long", !7, i64 0}
!18 = !{!19, !19, i64 0}
!19 = !{!"short", !7, i64 0}
!20 = !{!10, !11, i64 4}
!21 = !{!17, !17, i64 0}
!22 = !{!11, !11, i64 0}
!23 = !{!14, !6, i64 16}
!24 = !{!16, !17, i64 32}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!14, !6, i64 8}
!28 = distinct !{!28, !26}
!29 = distinct !{!29, !26}
!30 = !{!16, !6, i64 24}
!31 = distinct !{!31, !26}
!32 = !{!13, !11, i64 0}
!33 = !{!13, !11, i64 8}
!34 = !{!13, !11, i64 4}
!35 = !{!36, !17, i64 0}
!36 = !{!"caryll_Buffer", !17, i64 0, !17, i64 8, !17, i64 16, !6, i64 24}
!37 = !{!13, !6, i64 16}
!38 = !{!13, !6, i64 40}
!39 = distinct !{!39, !26}


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

; Function Attrs: nounwind uwtable
define dso_local ptr @otfcc_SFNTBuilder_serialize(ptr noundef %0) local_unnamed_addr #0 {
  %2 = tail call ptr (...) @bufnew() #2
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %169, label %3

3:                                                ; preds = %1
  %4 = getelementptr inbounds i8, ptr %0, i64 8
  %5 = load ptr, ptr %4, align 8, !tbaa !5
  %.not159 = icmp eq ptr %5, null
  br i1 %.not159, label %.thread, label %6

6:                                                ; preds = %3
  %7 = getelementptr inbounds i8, ptr %5, i64 24
  %8 = load ptr, ptr %7, align 8, !tbaa !11
  %9 = getelementptr inbounds i8, ptr %8, i64 16
  %10 = load i32, ptr %9, align 8, !tbaa !14
  %11 = trunc i32 %10 to i16
  %12 = and i32 %10, 65535
  %13 = icmp ult i32 %12, 16
  br i1 %13, label %.thread, label %14

14:                                               ; preds = %6
  %15 = icmp ult i32 %12, 32
  br i1 %15, label %.thread, label %16

16:                                               ; preds = %14
  %17 = icmp ult i32 %12, 64
  %18 = select i1 %17, i16 512, i16 1024
  br label %.thread

.thread:                                          ; preds = %3, %16, %14, %6
  %19 = phi i1 [ true, %6 ], [ false, %16 ], [ false, %14 ], [ true, %3 ]
  %20 = phi i32 [ %12, %6 ], [ %12, %16 ], [ %12, %14 ], [ 0, %3 ]
  %21 = phi i16 [ %11, %6 ], [ %11, %16 ], [ %11, %14 ], [ 0, %3 ]
  %22 = phi i16 [ 128, %6 ], [ %18, %16 ], [ 256, %14 ], [ 128, %3 ]
  %23 = getelementptr inbounds i8, ptr %0, i64 4
  %24 = load i32, ptr %23, align 4, !tbaa !17
  tail call void @bufwrite32b(ptr noundef %2, i32 noundef %24) #2
  tail call void @bufwrite16b(ptr noundef %2, i16 noundef zeroext %21) #2
  tail call void @bufwrite16b(ptr noundef %2, i16 noundef zeroext %22) #2
  br i1 %19, label %30, label %25

25:                                               ; preds = %.thread
  %26 = icmp ult i32 %20, 32
  br i1 %26, label %30, label %27

27:                                               ; preds = %25
  %28 = icmp ult i32 %20, 64
  %29 = select i1 %28, i16 5, i16 6
  br label %30

30:                                               ; preds = %27, %25, %.thread
  %31 = phi i16 [ 3, %.thread ], [ %29, %27 ], [ 4, %25 ]
  tail call void @bufwrite16b(ptr noundef %2, i16 noundef zeroext %31) #2
  %32 = shl nuw nsw i32 %20, 4
  %33 = trunc i32 %32 to i16
  %34 = sub i16 %33, %22
  tail call void @bufwrite16b(ptr noundef %2, i16 noundef zeroext %34) #2
  %35 = or disjoint i32 %32, 12
  %36 = zext nneg i32 %35 to i64
  %37 = load ptr, ptr %4, align 8, !tbaa !18
  %.not160 = icmp eq ptr %37, null
  br i1 %.not160, label %._crit_edge213, label %38

38:                                               ; preds = %30
  %39 = getelementptr inbounds i8, ptr %37, i64 24
  br label %.lr.ph200

.preheader:                                       ; preds = %141
  %40 = shl i32 %.0139204237, 1
  %.not163195 = icmp eq ptr %.2.ph, null
  br i1 %.not163195, label %.loopexit187, label %.lr.ph200

.lr.ph200:                                        ; preds = %38, %.preheader
  %.0139204237 = phi i32 [ 1, %38 ], [ %40, %.preheader ]
  %.0122205236 = phi ptr [ %39, %38 ], [ %.2.ph, %.preheader ]
  %.not215 = icmp eq i32 %.0139204237, 0
  br label %41

.loopexit:                                        ; preds = %53
  %.not163 = icmp eq ptr %.2127, null
  br i1 %.not163, label %._crit_edge, label %41, !llvm.loop !19

41:                                               ; preds = %.lr.ph200, %.loopexit
  %.0121199 = phi ptr [ null, %.lr.ph200 ], [ %.1, %.loopexit ]
  %.1123198 = phi ptr [ null, %.lr.ph200 ], [ %.2.ph, %.loopexit ]
  %.0129197 = phi ptr [ %.0122205236, %.lr.ph200 ], [ %.2127, %.loopexit ]
  %.0140196 = phi i32 [ 0, %.lr.ph200 ], [ %42, %.loopexit ]
  %42 = add i32 %.0140196, 1
  br i1 %.not215, label %.thread176.preheader, label %.lr.ph

.lr.ph:                                           ; preds = %41, %46
  %.0125190 = phi ptr [ %52, %46 ], [ %.0129197, %41 ]
  %.0135189 = phi i32 [ %43, %46 ], [ 0, %41 ]
  %43 = add nuw i32 %.0135189, 1
  %44 = getelementptr inbounds i8, ptr %.0125190, i64 16
  %45 = load ptr, ptr %44, align 8, !tbaa !21
  %.not165 = icmp eq ptr %45, null
  br i1 %.not165, label %.thread176.preheader, label %46

46:                                               ; preds = %.lr.ph
  %47 = load ptr, ptr %4, align 8, !tbaa !18
  %48 = getelementptr inbounds i8, ptr %47, i64 24
  %49 = load ptr, ptr %48, align 8, !tbaa !11
  %50 = getelementptr inbounds i8, ptr %49, i64 32
  %51 = load i64, ptr %50, align 8, !tbaa !22
  %52 = getelementptr inbounds i8, ptr %45, i64 %51
  %exitcond.not = icmp eq i32 %43, %.0139204237
  br i1 %exitcond.not, label %.thread176.preheader, label %.lr.ph, !llvm.loop !23

.thread176.preheader:                             ; preds = %46, %.lr.ph, %41
  %.2137.ph = phi i32 [ 0, %41 ], [ %43, %.lr.ph ], [ %.0139204237, %46 ]
  %.2127.ph = phi ptr [ %.0129197, %41 ], [ null, %.lr.ph ], [ %52, %46 ]
  br label %.thread176.outer

.thread176.outer:                                 ; preds = %.thread176.outer.backedge, %.thread176.preheader
  %.2137.ph238 = phi i32 [ %.2137.ph, %.thread176.preheader ], [ %.3138, %.thread176.outer.backedge ]
  %.0133.ph = phi i32 [ %.0139204237, %.thread176.preheader ], [ %.1134, %.thread176.outer.backedge ]
  %.1130.ph = phi ptr [ %.0129197, %.thread176.preheader ], [ %.4, %.thread176.outer.backedge ]
  %.2127.ph239 = phi ptr [ %.2127.ph, %.thread176.preheader ], [ %.3128, %.thread176.outer.backedge ]
  %.2.ph = phi ptr [ %.1123198, %.thread176.preheader ], [ %.2.ph.be, %.thread176.outer.backedge ]
  %.1.ph = phi ptr [ %.0121199, %.thread176.preheader ], [ %.0124, %.thread176.outer.backedge ]
  br label %.thread176

.thread176:                                       ; preds = %.thread176.outer, %.thread177.thread
  %.2137 = phi i32 [ %.3138, %.thread177.thread ], [ %.2137.ph238, %.thread176.outer ]
  %.0133 = phi i32 [ %.1134, %.thread177.thread ], [ %.0133.ph, %.thread176.outer ]
  %.1130 = phi ptr [ %.4, %.thread177.thread ], [ %.1130.ph, %.thread176.outer ]
  %.2127 = phi ptr [ %.3128, %.thread177.thread ], [ %.2127.ph239, %.thread176.outer ]
  %.1 = phi ptr [ %.0124, %.thread177.thread ], [ %.1.ph, %.thread176.outer ]
  %cond = icmp eq i32 %.2137, 0
  br i1 %cond, label %53, label %69

53:                                               ; preds = %.thread176
  %54 = icmp ne i32 %.0133, 0
  %55 = icmp ne ptr %.2127, null
  %56 = select i1 %54, i1 %55, i1 false
  br i1 %56, label %.critedge, label %.loopexit

.critedge:                                        ; preds = %53
  %57 = getelementptr inbounds i8, ptr %.2127, i64 16
  %58 = load ptr, ptr %57, align 8, !tbaa !21
  %.not172 = icmp eq ptr %58, null
  br i1 %.not172, label %66, label %59

59:                                               ; preds = %.critedge
  %60 = load ptr, ptr %4, align 8, !tbaa !18
  %61 = getelementptr inbounds i8, ptr %60, i64 24
  %62 = load ptr, ptr %61, align 8, !tbaa !11
  %63 = getelementptr inbounds i8, ptr %62, i64 32
  %64 = load i64, ptr %63, align 8, !tbaa !22
  %65 = getelementptr inbounds i8, ptr %58, i64 %64
  br label %66

66:                                               ; preds = %.critedge, %59
  %67 = phi ptr [ %65, %59 ], [ null, %.critedge ]
  %68 = add i32 %.0133, -1
  br label %122

69:                                               ; preds = %.thread176
  %70 = icmp eq i32 %.0133, 0
  %71 = icmp eq ptr %.2127, null
  %or.cond = select i1 %70, i1 true, i1 %71
  br i1 %or.cond, label %72, label %85

72:                                               ; preds = %69
  %.not170 = icmp eq ptr %.1130, null
  br i1 %.not170, label %83, label %73

73:                                               ; preds = %72
  %74 = getelementptr inbounds i8, ptr %.1130, i64 16
  %75 = load ptr, ptr %74, align 8, !tbaa !21
  %.not171 = icmp eq ptr %75, null
  br i1 %.not171, label %83, label %76

76:                                               ; preds = %73
  %77 = load ptr, ptr %4, align 8, !tbaa !18
  %78 = getelementptr inbounds i8, ptr %77, i64 24
  %79 = load ptr, ptr %78, align 8, !tbaa !11
  %80 = getelementptr inbounds i8, ptr %79, i64 32
  %81 = load i64, ptr %80, align 8, !tbaa !22
  %82 = getelementptr inbounds i8, ptr %75, i64 %81
  br label %83

83:                                               ; preds = %76, %73, %72
  %.2131 = phi ptr [ null, %72 ], [ %82, %76 ], [ null, %73 ]
  %84 = add i32 %.2137, -1
  br label %122

85:                                               ; preds = %69
  %86 = load ptr, ptr %4, align 8, !tbaa !5
  %87 = getelementptr inbounds i8, ptr %86, i64 24
  %88 = load ptr, ptr %87, align 8, !tbaa !11
  %89 = getelementptr inbounds i8, ptr %88, i64 32
  %90 = load i64, ptr %89, align 8, !tbaa !22
  %91 = sub i64 0, %90
  %92 = getelementptr inbounds i8, ptr %.1130, i64 %91
  %93 = getelementptr inbounds i8, ptr %.2127, i64 %91
  %94 = tail call i32 @byTag(ptr noundef %92, ptr noundef %93)
  %95 = icmp slt i32 %94, 1
  br i1 %95, label %96, label %109

96:                                               ; preds = %85
  %.not168 = icmp eq ptr %.1130, null
  br i1 %.not168, label %107, label %97

97:                                               ; preds = %96
  %98 = getelementptr inbounds i8, ptr %.1130, i64 16
  %99 = load ptr, ptr %98, align 8, !tbaa !21
  %.not169 = icmp eq ptr %99, null
  br i1 %.not169, label %107, label %100

100:                                              ; preds = %97
  %101 = load ptr, ptr %4, align 8, !tbaa !18
  %102 = getelementptr inbounds i8, ptr %101, i64 24
  %103 = load ptr, ptr %102, align 8, !tbaa !11
  %104 = getelementptr inbounds i8, ptr %103, i64 32
  %105 = load i64, ptr %104, align 8, !tbaa !22
  %106 = getelementptr inbounds i8, ptr %99, i64 %105
  br label %107

107:                                              ; preds = %100, %97, %96
  %.3132 = phi ptr [ null, %96 ], [ %106, %100 ], [ null, %97 ]
  %108 = add i32 %.2137, -1
  br label %122

109:                                              ; preds = %85
  %110 = getelementptr inbounds i8, ptr %.2127, i64 16
  %111 = load ptr, ptr %110, align 8, !tbaa !21
  %.not167 = icmp eq ptr %111, null
  br i1 %.not167, label %119, label %112

112:                                              ; preds = %109
  %113 = load ptr, ptr %4, align 8, !tbaa !18
  %114 = getelementptr inbounds i8, ptr %113, i64 24
  %115 = load ptr, ptr %114, align 8, !tbaa !11
  %116 = getelementptr inbounds i8, ptr %115, i64 32
  %117 = load i64, ptr %116, align 8, !tbaa !22
  %118 = getelementptr inbounds i8, ptr %111, i64 %117
  br label %119

119:                                              ; preds = %109, %112
  %120 = phi ptr [ %118, %112 ], [ null, %109 ]
  %121 = add i32 %.0133, -1
  br label %122

122:                                              ; preds = %83, %119, %107, %66
  %.3138 = phi i32 [ 0, %66 ], [ %84, %83 ], [ %108, %107 ], [ %.2137, %119 ]
  %.1134 = phi i32 [ %68, %66 ], [ %.0133, %83 ], [ %.0133, %107 ], [ %121, %119 ]
  %.4 = phi ptr [ %.1130, %66 ], [ %.2131, %83 ], [ %.3132, %107 ], [ %.1130, %119 ]
  %.3128 = phi ptr [ %67, %66 ], [ %.2127, %83 ], [ %.2127, %107 ], [ %120, %119 ]
  %.0124 = phi ptr [ %.2127, %66 ], [ %.1130, %83 ], [ %.1130, %107 ], [ %.2127, %119 ]
  %.not173 = icmp eq ptr %.1, null
  %.not175 = icmp eq ptr %.0124, null
  br i1 %.not173, label %125, label %123

123:                                              ; preds = %122
  br i1 %.not175, label %.thread177.thread, label %126

.thread177.thread:                                ; preds = %123
  %124 = getelementptr inbounds i8, ptr %.1, i64 16
  store ptr null, ptr %124, align 8, !tbaa !21
  br label %.thread176, !llvm.loop !24

125:                                              ; preds = %122
  br i1 %.not175, label %.thread176.outer.backedge, label %136

126:                                              ; preds = %123
  %127 = load ptr, ptr %4, align 8, !tbaa !5
  %128 = getelementptr inbounds i8, ptr %127, i64 24
  %129 = load ptr, ptr %128, align 8, !tbaa !11
  %130 = getelementptr inbounds i8, ptr %129, i64 32
  %131 = load i64, ptr %130, align 8, !tbaa !22
  %132 = sub i64 0, %131
  %133 = getelementptr inbounds i8, ptr %.0124, i64 %132
  %134 = getelementptr inbounds i8, ptr %.1, i64 16
  store ptr %133, ptr %134, align 8, !tbaa !21
  %135 = getelementptr inbounds i8, ptr %.1, i64 %132
  br label %136

136:                                              ; preds = %125, %126
  %.3180185 = phi ptr [ %.2.ph, %126 ], [ %.0124, %125 ]
  %137 = phi ptr [ %135, %126 ], [ null, %125 ]
  %138 = getelementptr inbounds i8, ptr %.0124, i64 8
  store ptr %137, ptr %138, align 8, !tbaa !25
  br label %.thread176.outer.backedge

.thread176.outer.backedge:                        ; preds = %136, %125
  %.2.ph.be = phi ptr [ null, %125 ], [ %.3180185, %136 ]
  br label %.thread176.outer, !llvm.loop !24

._crit_edge:                                      ; preds = %.loopexit
  %.not164 = icmp eq ptr %.1, null
  br i1 %.not164, label %141, label %139

139:                                              ; preds = %._crit_edge
  %140 = getelementptr inbounds i8, ptr %.1, i64 16
  store ptr null, ptr %140, align 8, !tbaa !21
  br label %141

141:                                              ; preds = %139, %._crit_edge
  %.0121.lcssa224 = phi ptr [ %.1, %139 ], [ null, %._crit_edge ]
  %142 = icmp ult i32 %42, 2
  br i1 %142, label %.loopexit187, label %.preheader

.loopexit187:                                     ; preds = %.preheader, %141
  %.1123.lcssa223230 = phi ptr [ %.2.ph, %141 ], [ null, %.preheader ]
  %.0121.lcssa224229 = phi ptr [ %.0121.lcssa224, %141 ], [ null, %.preheader ]
  %143 = load ptr, ptr %4, align 8, !tbaa !5
  %144 = getelementptr inbounds i8, ptr %143, i64 24
  %145 = load ptr, ptr %144, align 8, !tbaa !11
  %146 = getelementptr inbounds i8, ptr %145, i64 24
  store ptr %.0121.lcssa224229, ptr %146, align 8, !tbaa !26
  %147 = getelementptr inbounds i8, ptr %145, i64 32
  %148 = load i64, ptr %147, align 8, !tbaa !22
  %149 = sub i64 0, %148
  %150 = getelementptr inbounds i8, ptr %.1123.lcssa223230, i64 %149
  store ptr %150, ptr %4, align 8, !tbaa !5
  %.not162207 = icmp eq ptr %.1123.lcssa223230, null
  br i1 %.not162207, label %._crit_edge213, label %.lr.ph212

.lr.ph212:                                        ; preds = %.loopexit187, %.lr.ph212
  %.0147210 = phi ptr [ %.0147, %.lr.ph212 ], [ %150, %.loopexit187 ]
  %.0144209 = phi i64 [ %spec.select, %.lr.ph212 ], [ %36, %.loopexit187 ]
  %.0146208 = phi i64 [ %164, %.lr.ph212 ], [ %36, %.loopexit187 ]
  %151 = load i32, ptr %.0147210, align 8, !tbaa !27
  tail call void @bufwrite32b(ptr noundef %2, i32 noundef %151) #2
  %152 = getelementptr inbounds i8, ptr %.0147210, i64 8
  %153 = load i32, ptr %152, align 8, !tbaa !28
  tail call void @bufwrite32b(ptr noundef %2, i32 noundef %153) #2
  %154 = trunc i64 %.0146208 to i32
  tail call void @bufwrite32b(ptr noundef %2, i32 noundef %154) #2
  %155 = getelementptr inbounds i8, ptr %.0147210, i64 4
  %156 = load i32, ptr %155, align 4, !tbaa !29
  tail call void @bufwrite32b(ptr noundef %2, i32 noundef %156) #2
  %157 = load i64, ptr %2, align 8, !tbaa !30
  tail call void @bufseek(ptr noundef nonnull %2, i64 noundef %.0146208) #2
  %158 = getelementptr inbounds i8, ptr %.0147210, i64 16
  %159 = load ptr, ptr %158, align 8, !tbaa !32
  tail call void @bufwrite_buf(ptr noundef nonnull %2, ptr noundef %159) #2
  tail call void @bufseek(ptr noundef nonnull %2, i64 noundef %157) #2
  %160 = load i32, ptr %.0147210, align 8, !tbaa !27
  %161 = icmp eq i32 %160, 1751474532
  %spec.select = select i1 %161, i64 %.0146208, i64 %.0144209
  %162 = load ptr, ptr %158, align 8, !tbaa !32
  %163 = tail call i64 @buflen(ptr noundef %162) #2
  %164 = add i64 %163, %.0146208
  %165 = getelementptr inbounds i8, ptr %.0147210, i64 40
  %.0147 = load ptr, ptr %165, align 8, !tbaa !18
  %.not162 = icmp eq ptr %.0147, null
  br i1 %.not162, label %._crit_edge213, label %.lr.ph212, !llvm.loop !33

._crit_edge213:                                   ; preds = %.lr.ph212, %30, %.loopexit187
  %.0144.lcssa = phi i64 [ %36, %.loopexit187 ], [ %36, %30 ], [ %spec.select, %.lr.ph212 ]
  %166 = tail call i32 @buf_checksum(ptr noundef %2)
  %167 = add i64 %.0144.lcssa, 8
  tail call void @bufseek(ptr noundef %2, i64 noundef %167) #2
  %168 = sub i32 -1313820742, %166
  tail call void @bufwrite32b(ptr noundef %2, i32 noundef %168) #2
  br label %169

169:                                              ; preds = %1, %._crit_edge213
  ret ptr %2
}

declare ptr @bufnew(...) local_unnamed_addr #1

declare void @bufwrite32b(ptr noundef, i32 noundef) local_unnamed_addr #1

declare void @bufwrite16b(ptr noundef, i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden i32 @byTag(ptr noundef, ptr noundef) local_unnamed_addr #0

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

declare void @bufwrite_buf(ptr noundef, ptr noundef) local_unnamed_addr #1

declare i64 @buflen(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden i32 @buf_checksum(ptr noundef) local_unnamed_addr #0

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind }

!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, !10, i64 8}
!6 = !{!"", !7, i64 0, !7, i64 4, !10, i64 8, !10, i64 16}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!12, !10, i64 24}
!12 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 16, !13, i64 24}
!13 = !{!"UT_hash_handle", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !7, i64 48, !7, i64 52}
!14 = !{!15, !7, i64 16}
!15 = !{!"UT_hash_table", !10, i64 0, !7, i64 8, !7, i64 12, !7, i64 16, !10, i64 24, !16, i64 32, !7, i64 40, !7, i64 44, !7, i64 48, !7, i64 52, !7, i64 56}
!16 = !{!"long", !8, i64 0}
!17 = !{!6, !7, i64 4}
!18 = !{!10, !10, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!13, !10, i64 16}
!22 = !{!15, !16, i64 32}
!23 = distinct !{!23, !20}
!24 = distinct !{!24, !20}
!25 = !{!13, !10, i64 8}
!26 = !{!15, !10, i64 24}
!27 = !{!12, !7, i64 0}
!28 = !{!12, !7, i64 8}
!29 = !{!12, !7, i64 4}
!30 = !{!31, !16, i64 0}
!31 = !{!"caryll_Buffer", !16, i64 0, !16, i64 8, !16, i64 16, !10, i64 24}
!32 = !{!12, !10, i64 16}
!33 = distinct !{!33, !20}


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