; LLVM IR from ARM-software/Arm-2D :: examples/common/loader/tjpgd_loader/tjpgd (tjpgd)

; 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.JDEC = type { i64, ptr, ptr, i8, i8, i8, i8, [3 x i8], i8, [3 x i16], i16, i16, i16, [2 x [2 x ptr]], [2 x [2 x ptr]], [2 x [2 x ptr]], [4 x ptr], i32, i8, ptr, ptr, ptr, i64, ptr, 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: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @jd_prepare(ptr noundef %0, ptr noundef %1, ptr noundef %2, i64 noundef %3, ptr noundef %4) #2 {
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i64, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i8, align 1
  %14 = alloca i16, align 2
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i64, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  store ptr %0, ptr %7, align 8, !tbaa !5
  store ptr %1, ptr %8, align 8, !tbaa !5
  store ptr %2, ptr %9, align 8, !tbaa !5
  store i64 %3, ptr %10, align 8, !tbaa !9
  store ptr %4, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 2, 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 4, ptr %17) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #3
  %21 = load ptr, ptr %7, align 8, !tbaa !5
  call void @llvm.memset.p0.i64(ptr align 8 %21, i8 0, i64 232, i1 false)
  %22 = load ptr, ptr %9, align 8, !tbaa !5
  %23 = load ptr, ptr %7, align 8, !tbaa !5
  %24 = getelementptr inbounds %struct.JDEC, ptr %23, i32 0, i32 21
  store ptr %22, ptr %24, align 8, !tbaa !11
  %25 = load i64, ptr %10, align 8, !tbaa !9
  %26 = load ptr, ptr %7, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.JDEC, ptr %26, i32 0, i32 22
  store i64 %25, ptr %27, align 8, !tbaa !15
  %28 = load ptr, ptr %8, align 8, !tbaa !5
  %29 = load ptr, ptr %7, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.JDEC, ptr %29, i32 0, i32 23
  store ptr %28, ptr %30, align 8, !tbaa !16
  %31 = load ptr, ptr %11, align 8, !tbaa !5
  %32 = load ptr, ptr %7, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.JDEC, ptr %32, i32 0, i32 24
  store ptr %31, ptr %33, align 8, !tbaa !17
  %34 = load ptr, ptr %7, align 8, !tbaa !5
  %35 = call ptr @alloc_pool(ptr noundef %34, i64 noundef 128)
  store ptr %35, ptr %12, align 8, !tbaa !5
  %36 = load ptr, ptr %7, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.JDEC, ptr %36, i32 0, i32 2
  store ptr %35, ptr %37, align 8, !tbaa !18
  %38 = load ptr, ptr %12, align 8, !tbaa !5
  %39 = icmp ne ptr %38, null
  br i1 %39, label %41, label %40

40:                                               ; preds = %5
  store i32 3, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

41:                                               ; preds = %5
  store i16 0, ptr %14, align 2, !tbaa !19
  store i32 0, ptr %17, align 4, !tbaa !20
  br label %42

42:                                               ; preds = %63, %41
  %43 = load ptr, ptr %7, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.JDEC, ptr %43, i32 0, i32 23
  %45 = load ptr, ptr %44, align 8, !tbaa !16
  %46 = load ptr, ptr %7, align 8, !tbaa !5
  %47 = load ptr, ptr %12, align 8, !tbaa !5
  %48 = call i64 %45(ptr noundef %46, ptr noundef %47, i64 noundef 1)
  %49 = icmp ne i64 %48, 1
  br i1 %49, label %50, label %51

50:                                               ; preds = %42
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

51:                                               ; preds = %42
  %52 = load i32, ptr %17, align 4, !tbaa !20
  %53 = add i32 %52, 1
  store i32 %53, ptr %17, align 4, !tbaa !20
  %54 = load i16, ptr %14, align 2, !tbaa !19
  %55 = zext i16 %54 to i32
  %56 = shl i32 %55, 8
  %57 = load ptr, ptr %12, align 8, !tbaa !5
  %58 = getelementptr inbounds i8, ptr %57, i64 0
  %59 = load i8, ptr %58, align 1, !tbaa !21
  %60 = zext i8 %59 to i32
  %61 = or i32 %56, %60
  %62 = trunc i32 %61 to i16
  store i16 %62, ptr %14, align 2, !tbaa !19
  br label %63

63:                                               ; preds = %51
  %64 = load i16, ptr %14, align 2, !tbaa !19
  %65 = zext i16 %64 to i32
  %66 = icmp ne i32 %65, 65496
  br i1 %66, label %42, label %67, !llvm.loop !22

67:                                               ; preds = %63
  br label %68

68:                                               ; preds = %548, %67
  %69 = load ptr, ptr %7, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.JDEC, ptr %69, i32 0, i32 23
  %71 = load ptr, ptr %70, align 8, !tbaa !16
  %72 = load ptr, ptr %7, align 8, !tbaa !5
  %73 = load ptr, ptr %12, align 8, !tbaa !5
  %74 = call i64 %71(ptr noundef %72, ptr noundef %73, i64 noundef 4)
  %75 = icmp ne i64 %74, 4
  br i1 %75, label %76, label %77

76:                                               ; preds = %68
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

77:                                               ; preds = %68
  %78 = load ptr, ptr %12, align 8, !tbaa !5
  %79 = load i8, ptr %78, align 1, !tbaa !21
  %80 = zext i8 %79 to i16
  %81 = zext i16 %80 to i32
  %82 = shl i32 %81, 8
  %83 = load ptr, ptr %12, align 8, !tbaa !5
  %84 = getelementptr inbounds i8, ptr %83, i64 1
  %85 = load i8, ptr %84, align 1, !tbaa !21
  %86 = zext i8 %85 to i16
  %87 = zext i16 %86 to i32
  %88 = or i32 %82, %87
  %89 = trunc i32 %88 to i16
  store i16 %89, ptr %14, align 2, !tbaa !19
  %90 = load ptr, ptr %12, align 8, !tbaa !5
  %91 = getelementptr inbounds i8, ptr %90, i64 2
  %92 = load i8, ptr %91, align 1, !tbaa !21
  %93 = zext i8 %92 to i16
  %94 = zext i16 %93 to i32
  %95 = shl i32 %94, 8
  %96 = load ptr, ptr %12, align 8, !tbaa !5
  %97 = getelementptr inbounds i8, ptr %96, i64 2
  %98 = getelementptr inbounds i8, ptr %97, i64 1
  %99 = load i8, ptr %98, align 1, !tbaa !21
  %100 = zext i8 %99 to i16
  %101 = zext i16 %100 to i32
  %102 = or i32 %95, %101
  %103 = trunc i32 %102 to i16
  %104 = zext i16 %103 to i64
  store i64 %104, ptr %18, align 8, !tbaa !9
  %105 = load i64, ptr %18, align 8, !tbaa !9
  %106 = icmp ule i64 %105, 2
  br i1 %106, label %112, label %107

107:                                              ; preds = %77
  %108 = load i16, ptr %14, align 2, !tbaa !19
  %109 = zext i16 %108 to i32
  %110 = ashr i32 %109, 8
  %111 = icmp ne i32 %110, 255
  br i1 %111, label %112, label %113

112:                                              ; preds = %107, %77
  store i32 6, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

113:                                              ; preds = %107
  %114 = load i64, ptr %18, align 8, !tbaa !9
  %115 = sub i64 %114, 2
  store i64 %115, ptr %18, align 8, !tbaa !9
  %116 = load i64, ptr %18, align 8, !tbaa !9
  %117 = add i64 4, %116
  %118 = load i32, ptr %17, align 4, !tbaa !20
  %119 = zext i32 %118 to i64
  %120 = add i64 %119, %117
  %121 = trunc i64 %120 to i32
  store i32 %121, ptr %17, align 4, !tbaa !20
  %122 = load i16, ptr %14, align 2, !tbaa !19
  %123 = zext i16 %122 to i32
  %124 = and i32 %123, 255
  switch i32 %124, label %537 [
    i32 192, label %125
    i32 221, label %267
    i32 196, label %297
    i32 219, label %322
    i32 218, label %347
    i32 193, label %536
    i32 194, label %536
    i32 195, label %536
    i32 197, label %536
    i32 198, label %536
    i32 199, label %536
    i32 201, label %536
    i32 202, label %536
    i32 203, label %536
    i32 205, label %536
    i32 206, label %536
    i32 207, label %536
    i32 217, label %536
  ]

125:                                              ; preds = %113
  %126 = load i64, ptr %18, align 8, !tbaa !9
  %127 = icmp ugt i64 %126, 128
  br i1 %127, label %128, label %129

128:                                              ; preds = %125
  store i32 4, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

129:                                              ; preds = %125
  %130 = load ptr, ptr %7, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.JDEC, ptr %130, i32 0, i32 23
  %132 = load ptr, ptr %131, align 8, !tbaa !16
  %133 = load ptr, ptr %7, align 8, !tbaa !5
  %134 = load ptr, ptr %12, align 8, !tbaa !5
  %135 = load i64, ptr %18, align 8, !tbaa !9
  %136 = call i64 %132(ptr noundef %133, ptr noundef %134, i64 noundef %135)
  %137 = load i64, ptr %18, align 8, !tbaa !9
  %138 = icmp ne i64 %136, %137
  br i1 %138, label %139, label %140

139:                                              ; preds = %129
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

140:                                              ; preds = %129
  %141 = load ptr, ptr %12, align 8, !tbaa !5
  %142 = getelementptr inbounds i8, ptr %141, i64 3
  %143 = load i8, ptr %142, align 1, !tbaa !21
  %144 = zext i8 %143 to i16
  %145 = zext i16 %144 to i32
  %146 = shl i32 %145, 8
  %147 = load ptr, ptr %12, align 8, !tbaa !5
  %148 = getelementptr inbounds i8, ptr %147, i64 3
  %149 = getelementptr inbounds i8, ptr %148, i64 1
  %150 = load i8, ptr %149, align 1, !tbaa !21
  %151 = zext i8 %150 to i16
  %152 = zext i16 %151 to i32
  %153 = or i32 %146, %152
  %154 = trunc i32 %153 to i16
  %155 = load ptr, ptr %7, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.JDEC, ptr %155, i32 0, i32 11
  store i16 %154, ptr %156, align 8, !tbaa !24
  %157 = load ptr, ptr %12, align 8, !tbaa !5
  %158 = getelementptr inbounds i8, ptr %157, i64 1
  %159 = load i8, ptr %158, align 1, !tbaa !21
  %160 = zext i8 %159 to i16
  %161 = zext i16 %160 to i32
  %162 = shl i32 %161, 8
  %163 = load ptr, ptr %12, align 8, !tbaa !5
  %164 = getelementptr inbounds i8, ptr %163, i64 1
  %165 = getelementptr inbounds i8, ptr %164, i64 1
  %166 = load i8, ptr %165, align 1, !tbaa !21
  %167 = zext i8 %166 to i16
  %168 = zext i16 %167 to i32
  %169 = or i32 %162, %168
  %170 = trunc i32 %169 to i16
  %171 = load ptr, ptr %7, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.JDEC, ptr %171, i32 0, i32 12
  store i16 %170, ptr %172, align 2, !tbaa !25
  %173 = load ptr, ptr %12, align 8, !tbaa !5
  %174 = getelementptr inbounds i8, ptr %173, i64 5
  %175 = load i8, ptr %174, align 1, !tbaa !21
  %176 = load ptr, ptr %7, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.JDEC, ptr %176, i32 0, i32 8
  store i8 %175, ptr %177, align 1, !tbaa !26
  %178 = load ptr, ptr %7, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.JDEC, ptr %178, i32 0, i32 8
  %180 = load i8, ptr %179, align 1, !tbaa !26
  %181 = zext i8 %180 to i32
  %182 = icmp ne i32 %181, 3
  br i1 %182, label %183, label %190

183:                                              ; preds = %140
  %184 = load ptr, ptr %7, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.JDEC, ptr %184, i32 0, i32 8
  %186 = load i8, ptr %185, align 1, !tbaa !26
  %187 = zext i8 %186 to i32
  %188 = icmp ne i32 %187, 1
  br i1 %188, label %189, label %190

189:                                              ; preds = %183
  store i32 8, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

190:                                              ; preds = %183, %140
  store i32 0, ptr %16, align 4, !tbaa !20
  br label %191

191:                                              ; preds = %263, %190
  %192 = load i32, ptr %16, align 4, !tbaa !20
  %193 = load ptr, ptr %7, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.JDEC, ptr %193, i32 0, i32 8
  %195 = load i8, ptr %194, align 1, !tbaa !26
  %196 = zext i8 %195 to i32
  %197 = icmp ult i32 %192, %196
  br i1 %197, label %198, label %266

198:                                              ; preds = %191
  %199 = load ptr, ptr %12, align 8, !tbaa !5
  %200 = load i32, ptr %16, align 4, !tbaa !20
  %201 = mul i32 3, %200
  %202 = add i32 7, %201
  %203 = zext i32 %202 to i64
  %204 = getelementptr inbounds i8, ptr %199, i64 %203
  %205 = load i8, ptr %204, align 1, !tbaa !21
  store i8 %205, ptr %13, align 1, !tbaa !21
  %206 = load i32, ptr %16, align 4, !tbaa !20
  %207 = icmp eq i32 %206, 0
  br i1 %207, label %208, label %234

208:                                              ; preds = %198
  %209 = load i8, ptr %13, align 1, !tbaa !21
  %210 = zext i8 %209 to i32
  %211 = icmp ne i32 %210, 17
  br i1 %211, label %212, label %221

212:                                              ; preds = %208
  %213 = load i8, ptr %13, align 1, !tbaa !21
  %214 = zext i8 %213 to i32
  %215 = icmp ne i32 %214, 34
  br i1 %215, label %216, label %221

216:                                              ; preds = %212
  %217 = load i8, ptr %13, align 1, !tbaa !21
  %218 = zext i8 %217 to i32
  %219 = icmp ne i32 %218, 33
  br i1 %219, label %220, label %221

220:                                              ; preds = %216
  store i32 8, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

221:                                              ; preds = %216, %212, %208
  %222 = load i8, ptr %13, align 1, !tbaa !21
  %223 = zext i8 %222 to i32
  %224 = ashr i32 %223, 4
  %225 = trunc i32 %224 to i8
  %226 = load ptr, ptr %7, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.JDEC, ptr %226, i32 0, i32 5
  store i8 %225, ptr %227, align 2, !tbaa !27
  %228 = load i8, ptr %13, align 1, !tbaa !21
  %229 = zext i8 %228 to i32
  %230 = and i32 %229, 15
  %231 = trunc i32 %230 to i8
  %232 = load ptr, ptr %7, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.JDEC, ptr %232, i32 0, i32 6
  store i8 %231, ptr %233, align 1, !tbaa !28
  br label %240

234:                                              ; preds = %198
  %235 = load i8, ptr %13, align 1, !tbaa !21
  %236 = zext i8 %235 to i32
  %237 = icmp ne i32 %236, 17
  br i1 %237, label %238, label %239

238:                                              ; preds = %234
  store i32 8, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

239:                                              ; preds = %234
  br label %240

240:                                              ; preds = %239, %221
  %241 = load ptr, ptr %12, align 8, !tbaa !5
  %242 = load i32, ptr %16, align 4, !tbaa !20
  %243 = mul i32 3, %242
  %244 = add i32 8, %243
  %245 = zext i32 %244 to i64
  %246 = getelementptr inbounds i8, ptr %241, i64 %245
  %247 = load i8, ptr %246, align 1, !tbaa !21
  %248 = load ptr, ptr %7, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.JDEC, ptr %248, i32 0, i32 7
  %250 = load i32, ptr %16, align 4, !tbaa !20
  %251 = zext i32 %250 to i64
  %252 = getelementptr inbounds [3 x i8], ptr %249, i64 0, i64 %251
  store i8 %247, ptr %252, align 1, !tbaa !21
  %253 = load ptr, ptr %7, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.JDEC, ptr %253, i32 0, i32 7
  %255 = load i32, ptr %16, align 4, !tbaa !20
  %256 = zext i32 %255 to i64
  %257 = getelementptr inbounds [3 x i8], ptr %254, i64 0, i64 %256
  %258 = load i8, ptr %257, align 1, !tbaa !21
  %259 = zext i8 %258 to i32
  %260 = icmp sgt i32 %259, 3
  br i1 %260, label %261, label %262

261:                                              ; preds = %240
  store i32 8, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

262:                                              ; preds = %240
  br label %263

263:                                              ; preds = %262
  %264 = load i32, ptr %16, align 4, !tbaa !20
  %265 = add i32 %264, 1
  store i32 %265, ptr %16, align 4, !tbaa !20
  br label %191, !llvm.loop !29

266:                                              ; preds = %191
  br label %548

267:                                              ; preds = %113
  %268 = load i64, ptr %18, align 8, !tbaa !9
  %269 = icmp ugt i64 %268, 128
  br i1 %269, label %270, label %271

270:                                              ; preds = %267
  store i32 4, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

271:                                              ; preds = %267
  %272 = load ptr, ptr %7, align 8, !tbaa !5
  %273 = getelementptr inbounds %struct.JDEC, ptr %272, i32 0, i32 23
  %274 = load ptr, ptr %273, align 8, !tbaa !16
  %275 = load ptr, ptr %7, align 8, !tbaa !5
  %276 = load ptr, ptr %12, align 8, !tbaa !5
  %277 = load i64, ptr %18, align 8, !tbaa !9
  %278 = call i64 %274(ptr noundef %275, ptr noundef %276, i64 noundef %277)
  %279 = load i64, ptr %18, align 8, !tbaa !9
  %280 = icmp ne i64 %278, %279
  br i1 %280, label %281, label %282

281:                                              ; preds = %271
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

282:                                              ; preds = %271
  %283 = load ptr, ptr %12, align 8, !tbaa !5
  %284 = load i8, ptr %283, align 1, !tbaa !21
  %285 = zext i8 %284 to i16
  %286 = zext i16 %285 to i32
  %287 = shl i32 %286, 8
  %288 = load ptr, ptr %12, align 8, !tbaa !5
  %289 = getelementptr inbounds i8, ptr %288, i64 1
  %290 = load i8, ptr %289, align 1, !tbaa !21
  %291 = zext i8 %290 to i16
  %292 = zext i16 %291 to i32
  %293 = or i32 %287, %292
  %294 = trunc i32 %293 to i16
  %295 = load ptr, ptr %7, align 8, !tbaa !5
  %296 = getelementptr inbounds %struct.JDEC, ptr %295, i32 0, i32 10
  store i16 %294, ptr %296, align 2, !tbaa !30
  br label %548

297:                                              ; preds = %113
  %298 = load i64, ptr %18, align 8, !tbaa !9
  %299 = icmp ugt i64 %298, 128
  br i1 %299, label %300, label %301

300:                                              ; preds = %297
  store i32 4, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

301:                                              ; preds = %297
  %302 = load ptr, ptr %7, align 8, !tbaa !5
  %303 = getelementptr inbounds %struct.JDEC, ptr %302, i32 0, i32 23
  %304 = load ptr, ptr %303, align 8, !tbaa !16
  %305 = load ptr, ptr %7, align 8, !tbaa !5
  %306 = load ptr, ptr %12, align 8, !tbaa !5
  %307 = load i64, ptr %18, align 8, !tbaa !9
  %308 = call i64 %304(ptr noundef %305, ptr noundef %306, i64 noundef %307)
  %309 = load i64, ptr %18, align 8, !tbaa !9
  %310 = icmp ne i64 %308, %309
  br i1 %310, label %311, label %312

311:                                              ; preds = %301
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

312:                                              ; preds = %301
  %313 = load ptr, ptr %7, align 8, !tbaa !5
  %314 = load ptr, ptr %12, align 8, !tbaa !5
  %315 = load i64, ptr %18, align 8, !tbaa !9
  %316 = call i32 @create_huffman_tbl(ptr noundef %313, ptr noundef %314, i64 noundef %315)
  store i32 %316, ptr %19, align 4, !tbaa !20
  %317 = load i32, ptr %19, align 4, !tbaa !20
  %318 = icmp ne i32 %317, 0
  br i1 %318, label %319, label %321

319:                                              ; preds = %312
  %320 = load i32, ptr %19, align 4, !tbaa !20
  store i32 %320, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

321:                                              ; preds = %312
  br label %548

322:                                              ; preds = %113
  %323 = load i64, ptr %18, align 8, !tbaa !9
  %324 = icmp ugt i64 %323, 128
  br i1 %324, label %325, label %326

325:                                              ; preds = %322
  store i32 4, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

326:                                              ; preds = %322
  %327 = load ptr, ptr %7, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.JDEC, ptr %327, i32 0, i32 23
  %329 = load ptr, ptr %328, align 8, !tbaa !16
  %330 = load ptr, ptr %7, align 8, !tbaa !5
  %331 = load ptr, ptr %12, align 8, !tbaa !5
  %332 = load i64, ptr %18, align 8, !tbaa !9
  %333 = call i64 %329(ptr noundef %330, ptr noundef %331, i64 noundef %332)
  %334 = load i64, ptr %18, align 8, !tbaa !9
  %335 = icmp ne i64 %333, %334
  br i1 %335, label %336, label %337

336:                                              ; preds = %326
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

337:                                              ; preds = %326
  %338 = load ptr, ptr %7, align 8, !tbaa !5
  %339 = load ptr, ptr %12, align 8, !tbaa !5
  %340 = load i64, ptr %18, align 8, !tbaa !9
  %341 = call i32 @create_qt_tbl(ptr noundef %338, ptr noundef %339, i64 noundef %340)
  store i32 %341, ptr %19, align 4, !tbaa !20
  %342 = load i32, ptr %19, align 4, !tbaa !20
  %343 = icmp ne i32 %342, 0
  br i1 %343, label %344, label %346

344:                                              ; preds = %337
  %345 = load i32, ptr %19, align 4, !tbaa !20
  store i32 %345, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

346:                                              ; preds = %337
  br label %548

347:                                              ; preds = %113
  %348 = load i64, ptr %18, align 8, !tbaa !9
  %349 = icmp ugt i64 %348, 128
  br i1 %349, label %350, label %351

350:                                              ; preds = %347
  store i32 4, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

351:                                              ; preds = %347
  %352 = load ptr, ptr %7, align 8, !tbaa !5
  %353 = getelementptr inbounds %struct.JDEC, ptr %352, i32 0, i32 23
  %354 = load ptr, ptr %353, align 8, !tbaa !16
  %355 = load ptr, ptr %7, align 8, !tbaa !5
  %356 = load ptr, ptr %12, align 8, !tbaa !5
  %357 = load i64, ptr %18, align 8, !tbaa !9
  %358 = call i64 %354(ptr noundef %355, ptr noundef %356, i64 noundef %357)
  %359 = load i64, ptr %18, align 8, !tbaa !9
  %360 = icmp ne i64 %358, %359
  br i1 %360, label %361, label %362

361:                                              ; preds = %351
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

362:                                              ; preds = %351
  %363 = load ptr, ptr %7, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.JDEC, ptr %363, i32 0, i32 11
  %365 = load i16, ptr %364, align 8, !tbaa !24
  %366 = icmp ne i16 %365, 0
  br i1 %366, label %367, label %372

367:                                              ; preds = %362
  %368 = load ptr, ptr %7, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.JDEC, ptr %368, i32 0, i32 12
  %370 = load i16, ptr %369, align 2, !tbaa !25
  %371 = icmp ne i16 %370, 0
  br i1 %371, label %373, label %372

372:                                              ; preds = %367, %362
  store i32 6, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

373:                                              ; preds = %367
  %374 = load ptr, ptr %12, align 8, !tbaa !5
  %375 = getelementptr inbounds i8, ptr %374, i64 0
  %376 = load i8, ptr %375, align 1, !tbaa !21
  %377 = zext i8 %376 to i32
  %378 = load ptr, ptr %7, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.JDEC, ptr %378, i32 0, i32 8
  %380 = load i8, ptr %379, align 1, !tbaa !26
  %381 = zext i8 %380 to i32
  %382 = icmp ne i32 %377, %381
  br i1 %382, label %383, label %384

383:                                              ; preds = %373
  store i32 8, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

384:                                              ; preds = %373
  store i32 0, ptr %16, align 4, !tbaa !20
  br label %385

385:                                              ; preds = %446, %384
  %386 = load i32, ptr %16, align 4, !tbaa !20
  %387 = load ptr, ptr %7, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.JDEC, ptr %387, i32 0, i32 8
  %389 = load i8, ptr %388, align 1, !tbaa !26
  %390 = zext i8 %389 to i32
  %391 = icmp ult i32 %386, %390
  br i1 %391, label %392, label %449

392:                                              ; preds = %385
  %393 = load ptr, ptr %12, align 8, !tbaa !5
  %394 = load i32, ptr %16, align 4, !tbaa !20
  %395 = mul i32 2, %394
  %396 = add i32 2, %395
  %397 = zext i32 %396 to i64
  %398 = getelementptr inbounds i8, ptr %393, i64 %397
  %399 = load i8, ptr %398, align 1, !tbaa !21
  store i8 %399, ptr %13, align 1, !tbaa !21
  %400 = load i8, ptr %13, align 1, !tbaa !21
  %401 = zext i8 %400 to i32
  %402 = icmp ne i32 %401, 0
  br i1 %402, label %403, label %408

403:                                              ; preds = %392
  %404 = load i8, ptr %13, align 1, !tbaa !21
  %405 = zext i8 %404 to i32
  %406 = icmp ne i32 %405, 17
  br i1 %406, label %407, label %408

407:                                              ; preds = %403
  store i32 8, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

408:                                              ; preds = %403, %392
  %409 = load i32, ptr %16, align 4, !tbaa !20
  %410 = icmp ne i32 %409, 0
  %411 = zext i1 %410 to i64
  %412 = select i1 %410, i32 1, i32 0
  store i32 %412, ptr %15, align 4, !tbaa !20
  %413 = load ptr, ptr %7, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.JDEC, ptr %413, i32 0, i32 13
  %415 = load i32, ptr %15, align 4, !tbaa !20
  %416 = zext i32 %415 to i64
  %417 = getelementptr inbounds [2 x [2 x ptr]], ptr %414, i64 0, i64 %416
  %418 = getelementptr inbounds [2 x ptr], ptr %417, i64 0, i64 0
  %419 = load ptr, ptr %418, align 8, !tbaa !5
  %420 = icmp ne ptr %419, null
  br i1 %420, label %421, label %430

421:                                              ; preds = %408
  %422 = load ptr, ptr %7, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.JDEC, ptr %422, i32 0, i32 13
  %424 = load i32, ptr %15, align 4, !tbaa !20
  %425 = zext i32 %424 to i64
  %426 = getelementptr inbounds [2 x [2 x ptr]], ptr %423, i64 0, i64 %425
  %427 = getelementptr inbounds [2 x ptr], ptr %426, i64 0, i64 1
  %428 = load ptr, ptr %427, align 8, !tbaa !5
  %429 = icmp ne ptr %428, null
  br i1 %429, label %431, label %430

430:                                              ; preds = %421, %408
  store i32 6, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

431:                                              ; preds = %421
  %432 = load ptr, ptr %7, align 8, !tbaa !5
  %433 = getelementptr inbounds %struct.JDEC, ptr %432, i32 0, i32 16
  %434 = load ptr, ptr %7, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.JDEC, ptr %434, i32 0, i32 7
  %436 = load i32, ptr %16, align 4, !tbaa !20
  %437 = zext i32 %436 to i64
  %438 = getelementptr inbounds [3 x i8], ptr %435, i64 0, i64 %437
  %439 = load i8, ptr %438, align 1, !tbaa !21
  %440 = zext i8 %439 to i64
  %441 = getelementptr inbounds [4 x ptr], ptr %433, i64 0, i64 %440
  %442 = load ptr, ptr %441, align 8, !tbaa !5
  %443 = icmp ne ptr %442, null
  br i1 %443, label %445, label %444

444:                                              ; preds = %431
  store i32 6, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

445:                                              ; preds = %431
  br label %446

446:                                              ; preds = %445
  %447 = load i32, ptr %16, align 4, !tbaa !20
  %448 = add i32 %447, 1
  store i32 %448, ptr %16, align 4, !tbaa !20
  br label %385, !llvm.loop !31

449:                                              ; preds = %385
  %450 = load ptr, ptr %7, align 8, !tbaa !5
  %451 = getelementptr inbounds %struct.JDEC, ptr %450, i32 0, i32 6
  %452 = load i8, ptr %451, align 1, !tbaa !28
  %453 = zext i8 %452 to i32
  %454 = load ptr, ptr %7, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.JDEC, ptr %454, i32 0, i32 5
  %456 = load i8, ptr %455, align 2, !tbaa !27
  %457 = zext i8 %456 to i32
  %458 = mul nsw i32 %453, %457
  store i32 %458, ptr %15, align 4, !tbaa !20
  %459 = load i32, ptr %15, align 4, !tbaa !20
  %460 = icmp ne i32 %459, 0
  br i1 %460, label %462, label %461

461:                                              ; preds = %449
  store i32 6, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

462:                                              ; preds = %449
  %463 = load i32, ptr %15, align 4, !tbaa !20
  %464 = mul i32 %463, 64
  %465 = mul i32 %464, 2
  %466 = add i32 %465, 64
  %467 = zext i32 %466 to i64
  store i64 %467, ptr %18, align 8, !tbaa !9
  %468 = load i64, ptr %18, align 8, !tbaa !9
  %469 = icmp ult i64 %468, 256
  br i1 %469, label %470, label %471

470:                                              ; preds = %462
  store i64 256, ptr %18, align 8, !tbaa !9
  br label %471

471:                                              ; preds = %470, %462
  %472 = load i64, ptr %18, align 8, !tbaa !9
  %473 = load i32, ptr %15, align 4, !tbaa !20
  %474 = mul i32 %473, 64
  %475 = mul i32 %474, 4
  %476 = zext i32 %475 to i64
  %477 = icmp ult i64 %472, %476
  br i1 %477, label %478, label %483

478:                                              ; preds = %471
  %479 = load i32, ptr %15, align 4, !tbaa !20
  %480 = mul i32 %479, 64
  %481 = mul i32 %480, 4
  %482 = zext i32 %481 to i64
  store i64 %482, ptr %18, align 8, !tbaa !9
  br label %483

483:                                              ; preds = %478, %471
  %484 = load ptr, ptr %7, align 8, !tbaa !5
  %485 = load i64, ptr %18, align 8, !tbaa !9
  %486 = call ptr @alloc_pool(ptr noundef %484, i64 noundef %485)
  %487 = load ptr, ptr %7, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.JDEC, ptr %487, i32 0, i32 19
  store ptr %486, ptr %488, align 8, !tbaa !32
  %489 = load ptr, ptr %7, align 8, !tbaa !5
  %490 = getelementptr inbounds %struct.JDEC, ptr %489, i32 0, i32 19
  %491 = load ptr, ptr %490, align 8, !tbaa !32
  %492 = icmp ne ptr %491, null
  br i1 %492, label %494, label %493

493:                                              ; preds = %483
  store i32 3, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

494:                                              ; preds = %483
  %495 = load ptr, ptr %7, align 8, !tbaa !5
  %496 = load i32, ptr %15, align 4, !tbaa !20
  %497 = add i32 %496, 2
  %498 = mul i32 %497, 64
  %499 = zext i32 %498 to i64
  %500 = mul i64 %499, 2
  %501 = call ptr @alloc_pool(ptr noundef %495, i64 noundef %500)
  %502 = load ptr, ptr %7, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct.JDEC, ptr %502, i32 0, i32 20
  store ptr %501, ptr %503, align 8, !tbaa !33
  %504 = load ptr, ptr %7, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.JDEC, ptr %504, i32 0, i32 20
  %506 = load ptr, ptr %505, align 8, !tbaa !33
  %507 = icmp ne ptr %506, null
  br i1 %507, label %509, label %508

508:                                              ; preds = %494
  store i32 3, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

509:                                              ; preds = %494
  %510 = load i32, ptr %17, align 4, !tbaa !20
  %511 = urem i32 %510, 128
  store i32 %511, ptr %17, align 4, !tbaa !20
  %512 = icmp ne i32 %511, 0
  br i1 %512, label %513, label %528

513:                                              ; preds = %509
  %514 = load ptr, ptr %7, align 8, !tbaa !5
  %515 = getelementptr inbounds %struct.JDEC, ptr %514, i32 0, i32 23
  %516 = load ptr, ptr %515, align 8, !tbaa !16
  %517 = load ptr, ptr %7, align 8, !tbaa !5
  %518 = load ptr, ptr %12, align 8, !tbaa !5
  %519 = load i32, ptr %17, align 4, !tbaa !20
  %520 = zext i32 %519 to i64
  %521 = getelementptr inbounds i8, ptr %518, i64 %520
  %522 = load i32, ptr %17, align 4, !tbaa !20
  %523 = sub i32 128, %522
  %524 = zext i32 %523 to i64
  %525 = call i64 %516(ptr noundef %517, ptr noundef %521, i64 noundef %524)
  %526 = load ptr, ptr %7, align 8, !tbaa !5
  %527 = getelementptr inbounds %struct.JDEC, ptr %526, i32 0, i32 0
  store i64 %525, ptr %527, align 8, !tbaa !34
  br label %528

528:                                              ; preds = %513, %509
  %529 = load ptr, ptr %12, align 8, !tbaa !5
  %530 = load i32, ptr %17, align 4, !tbaa !20
  %531 = zext i32 %530 to i64
  %532 = getelementptr inbounds i8, ptr %529, i64 %531
  %533 = getelementptr inbounds i8, ptr %532, i64 0
  %534 = load ptr, ptr %7, align 8, !tbaa !5
  %535 = getelementptr inbounds %struct.JDEC, ptr %534, i32 0, i32 1
  store ptr %533, ptr %535, align 8, !tbaa !35
  store i32 0, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

536:                                              ; preds = %113, %113, %113, %113, %113, %113, %113, %113, %113, %113, %113, %113, %113
  store i32 8, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

537:                                              ; preds = %113
  %538 = load ptr, ptr %7, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.JDEC, ptr %538, i32 0, i32 23
  %540 = load ptr, ptr %539, align 8, !tbaa !16
  %541 = load ptr, ptr %7, align 8, !tbaa !5
  %542 = load i64, ptr %18, align 8, !tbaa !9
  %543 = call i64 %540(ptr noundef %541, ptr noundef null, i64 noundef %542)
  %544 = load i64, ptr %18, align 8, !tbaa !9
  %545 = icmp ne i64 %543, %544
  br i1 %545, label %546, label %547

546:                                              ; preds = %537
  store i32 2, ptr %6, align 4
  store i32 1, ptr %20, align 4
  br label %549

547:                                              ; preds = %537
  br label %548

548:                                              ; preds = %547, %346, %321, %282, %266
  br label %68

549:                                              ; preds = %546, %536, %528, %508, %493, %461, %444, %430, %407, %383, %372, %361, %350, %344, %336, %325, %319, %311, %300, %281, %270, %261, %238, %220, %189, %139, %128, %112, %76, %50, %40
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 4, 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 2, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  %550 = load i32, ptr %6, align 4
  ret i32 %550
}

; Function Attrs: nounwind uwtable
declare hidden ptr @alloc_pool(ptr noundef, i64 noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @create_huffman_tbl(ptr noundef, ptr noundef, i64 noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @create_qt_tbl(ptr noundef, ptr noundef, i64 noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !6, i64 200}
!12 = !{!"JDEC", !10, i64 0, !6, i64 8, !6, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !7, i64 28, !7, i64 31, !7, i64 32, !13, i64 38, !13, i64 40, !13, i64 42, !7, i64 48, !7, i64 80, !7, i64 112, !7, i64 144, !14, i64 176, !7, i64 180, !6, i64 184, !6, i64 192, !6, i64 200, !10, i64 208, !6, i64 216, !6, i64 224}
!13 = !{!"short", !7, i64 0}
!14 = !{!"int", !7, i64 0}
!15 = !{!12, !10, i64 208}
!16 = !{!12, !6, i64 216}
!17 = !{!12, !6, i64 224}
!18 = !{!12, !6, i64 16}
!19 = !{!13, !13, i64 0}
!20 = !{!14, !14, i64 0}
!21 = !{!7, !7, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!12, !13, i64 40}
!25 = !{!12, !13, i64 42}
!26 = !{!12, !7, i64 31}
!27 = !{!12, !7, i64 26}
!28 = !{!12, !7, i64 27}
!29 = distinct !{!29, !23}
!30 = !{!12, !13, i64 38}
!31 = distinct !{!31, !23}
!32 = !{!12, !6, i64 184}
!33 = !{!12, !6, i64 192}
!34 = !{!12, !10, i64 0}
!35 = !{!12, !6, i64 8}


; 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: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #0

; Function Attrs: nounwind uwtable
define dso_local i32 @jd_prepare(ptr noundef %0, ptr noundef %1, ptr noundef %2, i64 noundef %3, ptr noundef %4) local_unnamed_addr #1 {
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(232) %0, i8 0, i64 200, i1 false)
  %6 = getelementptr inbounds i8, ptr %0, i64 200
  store ptr %2, ptr %6, align 8, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %0, i64 208
  store i64 %3, ptr %7, align 8, !tbaa !13
  %8 = getelementptr inbounds i8, ptr %0, i64 216
  store ptr %1, ptr %8, align 8, !tbaa !14
  %9 = getelementptr inbounds i8, ptr %0, i64 224
  store ptr %4, ptr %9, align 8, !tbaa !15
  %10 = tail call ptr @alloc_pool(ptr noundef %0, i64 noundef 128)
  %11 = getelementptr inbounds i8, ptr %0, i64 16
  store ptr %10, ptr %11, align 8, !tbaa !16
  %.not = icmp eq ptr %10, null
  br i1 %.not, label %.loopexit, label %.preheader208

.preheader208:                                    ; preds = %5, %14
  %.0165 = phi i32 [ %20, %14 ], [ 0, %5 ]
  %.0162 = phi i32 [ %15, %14 ], [ 0, %5 ]
  %12 = load ptr, ptr %8, align 8, !tbaa !14
  %13 = tail call i64 %12(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef 1) #2
  %.not177 = icmp eq i64 %13, 1
  br i1 %.not177, label %14, label %.loopexit

14:                                               ; preds = %.preheader208
  %15 = add i32 %.0162, 1
  %16 = shl i32 %.0165, 8
  %17 = and i32 %16, 16776960
  %18 = load i8, ptr %10, align 1, !tbaa !17
  %19 = zext i8 %18 to i32
  %20 = or disjoint i32 %17, %19
  %21 = and i32 %20, 65535
  %.not178 = icmp eq i32 %21, 65496
  br i1 %.not178, label %.preheader205, label %.preheader208, !llvm.loop !18

.preheader205:                                    ; preds = %14
  %22 = load ptr, ptr %8, align 8, !tbaa !14
  %23 = tail call i64 %22(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef 4) #2
  %.not179215 = icmp eq i64 %23, 4
  br i1 %.not179215, label %.lr.ph217, label %.loopexit

.lr.ph217:                                        ; preds = %.preheader205
  %24 = getelementptr inbounds i8, ptr %10, i64 1
  %25 = getelementptr inbounds i8, ptr %10, i64 2
  %26 = getelementptr inbounds i8, ptr %10, i64 3
  %27 = getelementptr inbounds i8, ptr %0, i64 38
  %28 = getelementptr inbounds i8, ptr %10, i64 4
  %29 = getelementptr inbounds i8, ptr %0, i64 40
  %30 = getelementptr inbounds i8, ptr %0, i64 42
  %31 = getelementptr inbounds i8, ptr %10, i64 5
  %32 = getelementptr inbounds i8, ptr %0, i64 31
  %33 = getelementptr inbounds i8, ptr %0, i64 26
  %34 = getelementptr inbounds i8, ptr %0, i64 27
  %35 = getelementptr inbounds i8, ptr %0, i64 28
  %36 = getelementptr inbounds i8, ptr %10, i64 7
  %37 = getelementptr inbounds i8, ptr %10, i64 8
  br label %38

38:                                               ; preds = %.lr.ph217, %.loopexit203
  %.1216 = phi i32 [ %15, %.lr.ph217 ], [ %53, %.loopexit203 ]
  %39 = load i8, ptr %25, align 1, !tbaa !17
  %40 = zext i8 %39 to i64
  %41 = shl nuw nsw i64 %40, 8
  %42 = load i8, ptr %26, align 1, !tbaa !17
  %43 = zext i8 %42 to i64
  %44 = or disjoint i64 %41, %43
  %45 = icmp ult i64 %44, 3
  br i1 %45, label %.loopexit, label %46

46:                                               ; preds = %38
  %47 = load i8, ptr %10, align 1, !tbaa !17
  %.not180 = icmp eq i8 %47, -1
  br i1 %.not180, label %48, label %.loopexit

48:                                               ; preds = %46
  %49 = load i8, ptr %24, align 1, !tbaa !17
  %50 = add nsw i64 %44, -2
  %51 = trunc nuw nsw i64 %44 to i32
  %52 = add i32 %.1216, 2
  %53 = add i32 %52, %51
  switch i8 %49, label %174 [
    i8 -64, label %54
    i8 -35, label %91
    i8 -60, label %103
    i8 -37, label %110
    i8 -38, label %117
    i8 -63, label %.loopexit
    i8 -62, label %.loopexit
    i8 -61, label %.loopexit
    i8 -59, label %.loopexit
    i8 -58, label %.loopexit
    i8 -57, label %.loopexit
    i8 -55, label %.loopexit
    i8 -54, label %.loopexit
    i8 -53, label %.loopexit
    i8 -51, label %.loopexit
    i8 -50, label %.loopexit
    i8 -49, label %.loopexit
    i8 -39, label %.loopexit
  ]

54:                                               ; preds = %48
  %55 = icmp ugt i64 %50, 128
  br i1 %55, label %.loopexit, label %56

56:                                               ; preds = %54
  %57 = load ptr, ptr %8, align 8, !tbaa !14
  %58 = tail call i64 %57(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef %50) #2
  %.not198 = icmp eq i64 %58, %50
  br i1 %.not198, label %59, label %.loopexit

59:                                               ; preds = %56
  %60 = load i8, ptr %26, align 1, !tbaa !17
  %61 = zext i8 %60 to i16
  %62 = shl nuw i16 %61, 8
  %63 = load i8, ptr %28, align 1, !tbaa !17
  %64 = zext i8 %63 to i16
  %65 = or disjoint i16 %62, %64
  store i16 %65, ptr %29, align 8, !tbaa !20
  %66 = load i8, ptr %24, align 1, !tbaa !17
  %67 = zext i8 %66 to i16
  %68 = shl nuw i16 %67, 8
  %69 = load i8, ptr %25, align 1, !tbaa !17
  %70 = zext i8 %69 to i16
  %71 = or disjoint i16 %68, %70
  store i16 %71, ptr %30, align 2, !tbaa !21
  %72 = load i8, ptr %31, align 1, !tbaa !17
  store i8 %72, ptr %32, align 1, !tbaa !22
  switch i8 %72, label %.loopexit [
    i8 3, label %73
    i8 1, label %73
  ]

73:                                               ; preds = %59, %59
  %74 = load i8, ptr %36, align 1, !tbaa !17
  switch i8 %74, label %.loopexit [
    i8 34, label %75
    i8 33, label %75
    i8 17, label %75
  ]

75:                                               ; preds = %73, %73, %73
  %76 = lshr i8 %74, 4
  store i8 %76, ptr %33, align 2, !tbaa !23
  %77 = and i8 %74, 3
  store i8 %77, ptr %34, align 1, !tbaa !24
  %78 = load i8, ptr %37, align 1, !tbaa !17
  store i8 %78, ptr %35, align 1, !tbaa !17
  %79 = icmp ugt i8 %78, 3
  br i1 %79, label %.loopexit, label %80

80:                                               ; preds = %75
  %.not294 = icmp eq i8 %72, 1
  br i1 %.not294, label %.loopexit203, label %.lr.ph.peel.next

81:                                               ; preds = %._crit_edge291
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %82 = load i8, ptr %32, align 1, !tbaa !22
  %83 = zext i8 %82 to i64
  %84 = icmp ult i64 %indvars.iv.next, %83
  br i1 %84, label %.lr.ph.peel.next, label %.loopexit203, !llvm.loop !25

.lr.ph.peel.next:                                 ; preds = %80, %81
  %indvars.iv = phi i64 [ %indvars.iv.next, %81 ], [ 1, %80 ]
  %85 = mul nuw nsw i64 %indvars.iv, 3
  %86 = getelementptr inbounds i8, ptr %10, i64 %85
  %87 = getelementptr inbounds i8, ptr %86, i64 7
  %88 = load i8, ptr %87, align 1, !tbaa !17
  %.not201 = icmp eq i8 %88, 17
  br i1 %.not201, label %._crit_edge291, label %.loopexit

._crit_edge291:                                   ; preds = %.lr.ph.peel.next
  %.phi.trans.insert = getelementptr inbounds i8, ptr %86, i64 8
  %.pre = load i8, ptr %.phi.trans.insert, align 1, !tbaa !17
  %89 = getelementptr inbounds [3 x i8], ptr %35, i64 0, i64 %indvars.iv
  store i8 %.pre, ptr %89, align 1, !tbaa !17
  %90 = icmp ugt i8 %.pre, 3
  br i1 %90, label %.loopexit, label %81

91:                                               ; preds = %48
  %92 = icmp ugt i64 %50, 128
  br i1 %92, label %.loopexit, label %93

93:                                               ; preds = %91
  %94 = load ptr, ptr %8, align 8, !tbaa !14
  %95 = tail call i64 %94(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef %50) #2
  %.not197 = icmp eq i64 %95, %50
  br i1 %.not197, label %96, label %.loopexit

96:                                               ; preds = %93
  %97 = load i8, ptr %10, align 1, !tbaa !17
  %98 = zext i8 %97 to i16
  %99 = shl nuw i16 %98, 8
  %100 = load i8, ptr %24, align 1, !tbaa !17
  %101 = zext i8 %100 to i16
  %102 = or disjoint i16 %99, %101
  store i16 %102, ptr %27, align 2, !tbaa !27
  br label %.loopexit203

103:                                              ; preds = %48
  %104 = icmp ugt i64 %50, 128
  br i1 %104, label %.loopexit, label %105

105:                                              ; preds = %103
  %106 = load ptr, ptr %8, align 8, !tbaa !14
  %107 = tail call i64 %106(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef %50) #2
  %.not195 = icmp eq i64 %107, %50
  br i1 %.not195, label %108, label %.loopexit

108:                                              ; preds = %105
  %109 = tail call i32 @create_huffman_tbl(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef %50)
  %.not196 = icmp eq i32 %109, 0
  br i1 %.not196, label %.loopexit203, label %.loopexit

110:                                              ; preds = %48
  %111 = icmp ugt i64 %50, 128
  br i1 %111, label %.loopexit, label %112

112:                                              ; preds = %110
  %113 = load ptr, ptr %8, align 8, !tbaa !14
  %114 = tail call i64 %113(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef %50) #2
  %.not193 = icmp eq i64 %114, %50
  br i1 %.not193, label %115, label %.loopexit

115:                                              ; preds = %112
  %116 = tail call i32 @create_qt_tbl(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef %50)
  %.not194 = icmp eq i32 %116, 0
  br i1 %.not194, label %.loopexit203, label %.loopexit

117:                                              ; preds = %48
  %118 = icmp ugt i64 %50, 128
  br i1 %118, label %.loopexit, label %119

119:                                              ; preds = %117
  %120 = load ptr, ptr %8, align 8, !tbaa !14
  %121 = tail call i64 %120(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef %50) #2
  %.not181 = icmp eq i64 %121, %50
  br i1 %.not181, label %122, label %.loopexit

122:                                              ; preds = %119
  %123 = load i16, ptr %29, align 8, !tbaa !20
  %.not182 = icmp eq i16 %123, 0
  br i1 %.not182, label %.loopexit, label %124

124:                                              ; preds = %122
  %125 = load i16, ptr %30, align 2, !tbaa !21
  %.not183 = icmp eq i16 %125, 0
  br i1 %.not183, label %.loopexit, label %126

126:                                              ; preds = %124
  %127 = load i8, ptr %10, align 1, !tbaa !17
  %128 = load i8, ptr %32, align 1, !tbaa !22
  %.not184 = icmp eq i8 %127, %128
  br i1 %.not184, label %.preheader, label %.loopexit

.preheader:                                       ; preds = %126
  %.not274 = icmp eq i8 %127, 0
  br i1 %.not274, label %._crit_edge, label %.lr.ph273

.lr.ph273:                                        ; preds = %.preheader
  %129 = getelementptr inbounds i8, ptr %0, i64 48
  %130 = getelementptr inbounds i8, ptr %0, i64 144
  %wide.trip.count = zext i8 %127 to i64
  br label %132

131:                                              ; preds = %142
  %indvars.iv.next288 = add nuw nsw i64 %indvars.iv287, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next288, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %132, !llvm.loop !28

132:                                              ; preds = %.lr.ph273, %131
  %indvars.iv287 = phi i64 [ 0, %.lr.ph273 ], [ %indvars.iv.next288, %131 ]
  %133 = shl nuw nsw i64 %indvars.iv287, 1
  %gep = getelementptr inbounds i8, ptr %25, i64 %133
  %134 = load i8, ptr %gep, align 1, !tbaa !17
  switch i8 %134, label %.loopexit [
    i8 17, label %135
    i8 0, label %135
  ]

135:                                              ; preds = %132, %132
  %.not189 = icmp ne i64 %indvars.iv287, 0
  %136 = zext i1 %.not189 to i64
  %137 = getelementptr inbounds [2 x [2 x ptr]], ptr %129, i64 0, i64 %136
  %138 = load ptr, ptr %137, align 8, !tbaa !29
  %.not190 = icmp eq ptr %138, null
  br i1 %.not190, label %.loopexit, label %139

139:                                              ; preds = %135
  %140 = getelementptr inbounds i8, ptr %137, i64 8
  %141 = load ptr, ptr %140, align 8, !tbaa !29
  %.not191 = icmp eq ptr %141, null
  br i1 %.not191, label %.loopexit, label %142

142:                                              ; preds = %139
  %143 = getelementptr inbounds [3 x i8], ptr %35, i64 0, i64 %indvars.iv287
  %144 = load i8, ptr %143, align 1, !tbaa !17
  %145 = zext i8 %144 to i64
  %146 = getelementptr inbounds [4 x ptr], ptr %130, i64 0, i64 %145
  %147 = load ptr, ptr %146, align 8, !tbaa !29
  %.not192 = icmp eq ptr %147, null
  br i1 %.not192, label %.loopexit, label %131

._crit_edge:                                      ; preds = %131, %.preheader
  %148 = load i8, ptr %34, align 1, !tbaa !24
  %149 = zext i8 %148 to i32
  %150 = load i8, ptr %33, align 2, !tbaa !23
  %151 = zext i8 %150 to i32
  %152 = mul nuw nsw i32 %151, %149
  %.not185 = icmp eq i32 %152, 0
  br i1 %.not185, label %.loopexit, label %153

153:                                              ; preds = %._crit_edge
  %154 = shl nuw nsw i32 %152, 8
  %.0 = zext nneg i32 %154 to i64
  %155 = tail call ptr @alloc_pool(ptr noundef nonnull %0, i64 noundef %.0)
  %156 = getelementptr inbounds i8, ptr %0, i64 184
  store ptr %155, ptr %156, align 8, !tbaa !30
  %.not186 = icmp eq ptr %155, null
  br i1 %.not186, label %.loopexit, label %157

157:                                              ; preds = %153
  %158 = shl nuw nsw i32 %152, 7
  %159 = add nuw nsw i32 %158, 256
  %160 = zext nneg i32 %159 to i64
  %161 = tail call ptr @alloc_pool(ptr noundef nonnull %0, i64 noundef %160)
  %162 = getelementptr inbounds i8, ptr %0, i64 192
  store ptr %161, ptr %162, align 8, !tbaa !31
  %.not187 = icmp eq ptr %161, null
  br i1 %.not187, label %.loopexit, label %163

163:                                              ; preds = %157
  %164 = and i32 %53, 127
  %.not188 = icmp eq i32 %164, 0
  br i1 %.not188, label %._crit_edge292, label %165

165:                                              ; preds = %163
  %166 = load ptr, ptr %8, align 8, !tbaa !14
  %167 = zext nneg i32 %164 to i64
  %168 = getelementptr inbounds i8, ptr %10, i64 %167
  %169 = sub nuw nsw i32 128, %164
  %170 = zext nneg i32 %169 to i64
  %171 = tail call i64 %166(ptr noundef nonnull %0, ptr noundef nonnull %168, i64 noundef %170) #2
  store i64 %171, ptr %0, align 8, !tbaa !32
  br label %._crit_edge292

._crit_edge292:                                   ; preds = %163, %165
  %.pre-phi = phi i64 [ %167, %165 ], [ 0, %163 ]
  %172 = getelementptr inbounds i8, ptr %10, i64 %.pre-phi
  %173 = getelementptr inbounds i8, ptr %0, i64 8
  store ptr %172, ptr %173, align 8, !tbaa !33
  br label %.loopexit

174:                                              ; preds = %48
  %175 = load ptr, ptr %8, align 8, !tbaa !14
  %176 = tail call i64 %175(ptr noundef nonnull %0, ptr noundef null, i64 noundef %50) #2
  %.not202 = icmp eq i64 %176, %50
  br i1 %.not202, label %.loopexit203, label %.loopexit

.loopexit203:                                     ; preds = %81, %80, %174, %115, %108, %96
  %177 = load ptr, ptr %8, align 8, !tbaa !14
  %178 = tail call i64 %177(ptr noundef nonnull %0, ptr noundef nonnull %10, i64 noundef 4) #2
  %.not179 = icmp eq i64 %178, 4
  br i1 %.not179, label %38, label %.loopexit

.loopexit:                                        ; preds = %.preheader208, %.loopexit203, %46, %38, %54, %56, %59, %91, %93, %103, %105, %108, %110, %112, %115, %48, %48, %48, %48, %48, %48, %48, %48, %48, %48, %48, %48, %48, %174, %73, %75, %._crit_edge291, %.lr.ph.peel.next, %142, %135, %139, %132, %.preheader205, %157, %153, %._crit_edge, %126, %122, %124, %119, %117, %5, %._crit_edge292
  %.0166 = phi i32 [ 0, %._crit_edge292 ], [ 3, %5 ], [ 4, %117 ], [ 2, %119 ], [ 6, %124 ], [ 6, %122 ], [ 8, %126 ], [ 6, %._crit_edge ], [ 3, %153 ], [ 3, %157 ], [ 2, %.preheader205 ], [ 6, %142 ], [ 6, %135 ], [ 6, %139 ], [ 8, %132 ], [ 8, %.lr.ph.peel.next ], [ 8, %._crit_edge291 ], [ 2, %.loopexit203 ], [ 6, %46 ], [ 6, %38 ], [ 4, %54 ], [ 2, %56 ], [ 8, %59 ], [ 4, %91 ], [ 2, %93 ], [ 4, %103 ], [ 2, %105 ], [ %109, %108 ], [ 4, %110 ], [ 2, %112 ], [ %116, %115 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 8, %48 ], [ 2, %174 ], [ 8, %73 ], [ 8, %75 ], [ 2, %.preheader208 ]
  ret i32 %.0166
}

; Function Attrs: nounwind uwtable
declare hidden ptr @alloc_pool(ptr noundef, i64 noundef) local_unnamed_addr #1

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

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

attributes #0 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
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 = { 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 200}
!6 = !{!"JDEC", !7, i64 0, !10, i64 8, !10, i64 16, !8, i64 24, !8, i64 25, !8, i64 26, !8, i64 27, !8, i64 28, !8, i64 31, !8, i64 32, !11, i64 38, !11, i64 40, !11, i64 42, !8, i64 48, !8, i64 80, !8, i64 112, !8, i64 144, !12, i64 176, !8, i64 180, !10, i64 184, !10, i64 192, !10, i64 200, !7, i64 208, !10, i64 216, !10, i64 224}
!7 = !{!"long", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"short", !8, i64 0}
!12 = !{!"int", !8, i64 0}
!13 = !{!6, !7, i64 208}
!14 = !{!6, !10, i64 216}
!15 = !{!6, !10, i64 224}
!16 = !{!6, !10, i64 16}
!17 = !{!8, !8, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!6, !11, i64 40}
!21 = !{!6, !11, i64 42}
!22 = !{!6, !8, i64 31}
!23 = !{!6, !8, i64 26}
!24 = !{!6, !8, i64 27}
!25 = distinct !{!25, !19, !26}
!26 = !{!"llvm.loop.peeled.count", i32 1}
!27 = !{!6, !11, i64 38}
!28 = distinct !{!28, !19}
!29 = !{!10, !10, i64 0}
!30 = !{!6, !10, i64 184}
!31 = !{!6, !10, i64 192}
!32 = !{!6, !7, i64 0}
!33 = !{!6, !10, i64 8}


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