; LLVM IR from quixdb/squash :: plugins/crush (crush)

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

@__const.crush_compress.max_chain = external hidden unnamed_addr constant [3 x i32], align 4

; 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 i32 @crush_compress(ptr noundef %0, i32 noundef %1) #1 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca [3 x i32], align 4
  %10 = alloca i32, align 4
  %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 i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i32 %1, ptr %5, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #4
  %32 = load ptr, ptr %4, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.CrushContext, ptr %32, i32 0, i32 7
  %34 = load ptr, ptr %33, align 8, !tbaa !11
  %35 = load ptr, ptr %4, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.CrushContext, ptr %35, i32 0, i32 9
  %37 = load ptr, ptr %36, align 8, !tbaa !13
  %38 = call ptr %34(i64 noundef 75497472, ptr noundef %37)
  store ptr %38, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #4
  %39 = load ptr, ptr %4, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.CrushContext, ptr %39, i32 0, i32 7
  %41 = load ptr, ptr %40, align 8, !tbaa !11
  %42 = load ptr, ptr %4, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.CrushContext, ptr %42, i32 0, i32 9
  %44 = load ptr, ptr %43, align 8, !tbaa !13
  %45 = call ptr %41(i64 noundef 8388608, ptr noundef %44)
  store ptr %45, ptr %7, align 8, !tbaa !5
  %46 = load ptr, ptr %6, align 8, !tbaa !5
  %47 = icmp eq ptr %46, null
  br i1 %47, label %51, label %48

48:                                               ; preds = %2
  %49 = load ptr, ptr %7, align 8, !tbaa !5
  %50 = icmp eq ptr %49, null
  br i1 %50, label %51, label %54

51:                                               ; preds = %48, %2
  %52 = load ptr, ptr %6, align 8, !tbaa !5
  call void @free(ptr noundef %52) #4
  %53 = load ptr, ptr %7, align 8, !tbaa !5
  call void @free(ptr noundef %53) #4
  store i32 -1, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %650

54:                                               ; preds = %48
  call void @llvm.lifetime.start.p0(i64 12, ptr %9) #4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %9, ptr align 4 @__const.crush_compress.max_chain, i64 12, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  br label %55

55:                                               ; preds = %633, %54
  %56 = load ptr, ptr %4, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.CrushContext, ptr %56, i32 0, i32 5
  %58 = load ptr, ptr %57, align 8, !tbaa !14
  %59 = load ptr, ptr %4, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.CrushContext, ptr %59, i32 0, i32 2
  %61 = load ptr, ptr %60, align 8, !tbaa !15
  %62 = load ptr, ptr %4, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.CrushContext, ptr %62, i32 0, i32 9
  %64 = load ptr, ptr %63, align 8, !tbaa !13
  %65 = call i64 %58(ptr noundef %61, i64 noundef 67108864, ptr noundef %64)
  %66 = trunc i64 %65 to i32
  store i32 %66, ptr %10, align 4, !tbaa !9
  %67 = icmp sgt i32 %66, 0
  br i1 %67, label %68, label %635

68:                                               ; preds = %55
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  store i32 0, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  store i32 0, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  store i32 0, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  %69 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %69, ptr %15, align 4, !tbaa !9
  %70 = load ptr, ptr %4, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.CrushContext, ptr %70, i32 0, i32 6
  %72 = load ptr, ptr %71, align 8, !tbaa !16
  %73 = load ptr, ptr %4, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.CrushContext, ptr %73, i32 0, i32 9
  %75 = load ptr, ptr %74, align 8, !tbaa !13
  %76 = call i64 %72(ptr noundef %15, i64 noundef 4, ptr noundef %75)
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %77

77:                                               ; preds = %85, %68
  %78 = load i32, ptr %11, align 4, !tbaa !9
  %79 = icmp slt i32 %78, 18874368
  br i1 %79, label %80, label %88

80:                                               ; preds = %77
  %81 = load ptr, ptr %6, align 8, !tbaa !5
  %82 = load i32, ptr %11, align 4, !tbaa !9
  %83 = sext i32 %82 to i64
  %84 = getelementptr inbounds i32, ptr %81, i64 %83
  store i32 -1, ptr %84, align 4, !tbaa !9
  br label %85

85:                                               ; preds = %80
  %86 = load i32, ptr %11, align 4, !tbaa !9
  %87 = add nsw i32 %86, 1
  store i32 %87, ptr %11, align 4, !tbaa !9
  br label %77, !llvm.loop !17

88:                                               ; preds = %77
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %89

89:                                               ; preds = %103, %88
  %90 = load i32, ptr %11, align 4, !tbaa !9
  %91 = icmp slt i32 %90, 3
  br i1 %91, label %92, label %106

92:                                               ; preds = %89
  %93 = load i32, ptr %12, align 4, !tbaa !9
  %94 = load ptr, ptr %4, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.CrushContext, ptr %94, i32 0, i32 2
  %96 = load ptr, ptr %95, align 8, !tbaa !15
  %97 = load i32, ptr %11, align 4, !tbaa !9
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds i8, ptr %96, i64 %98
  %100 = load i8, ptr %99, align 1, !tbaa !19
  %101 = zext i8 %100 to i32
  %102 = call i32 @update_hash1(i32 noundef %93, i32 noundef %101)
  store i32 %102, ptr %12, align 4, !tbaa !9
  br label %103

103:                                              ; preds = %92
  %104 = load i32, ptr %11, align 4, !tbaa !9
  %105 = add nsw i32 %104, 1
  store i32 %105, ptr %11, align 4, !tbaa !9
  br label %89, !llvm.loop !20

106:                                              ; preds = %89
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %107

107:                                              ; preds = %121, %106
  %108 = load i32, ptr %11, align 4, !tbaa !9
  %109 = icmp slt i32 %108, 4
  br i1 %109, label %110, label %124

110:                                              ; preds = %107
  %111 = load i32, ptr %13, align 4, !tbaa !9
  %112 = load ptr, ptr %4, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct.CrushContext, ptr %112, i32 0, i32 2
  %114 = load ptr, ptr %113, align 8, !tbaa !15
  %115 = load i32, ptr %11, align 4, !tbaa !9
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds i8, ptr %114, i64 %116
  %118 = load i8, ptr %117, align 1, !tbaa !19
  %119 = zext i8 %118 to i32
  %120 = call i32 @update_hash2(i32 noundef %111, i32 noundef %119)
  store i32 %120, ptr %13, align 4, !tbaa !9
  br label %121

121:                                              ; preds = %110
  %122 = load i32, ptr %11, align 4, !tbaa !9
  %123 = add nsw i32 %122, 1
  store i32 %123, ptr %11, align 4, !tbaa !9
  br label %107, !llvm.loop !21

124:                                              ; preds = %107
  br label %125

125:                                              ; preds = %632, %124
  %126 = load i32, ptr %14, align 4, !tbaa !9
  %127 = load i32, ptr %10, align 4, !tbaa !9
  %128 = icmp slt i32 %126, %127
  br i1 %128, label %129, label %633

129:                                              ; preds = %125
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #4
  store i32 2, ptr %16, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #4
  store i32 2097152, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  %130 = load i32, ptr %10, align 4, !tbaa !9
  %131 = load i32, ptr %14, align 4, !tbaa !9
  %132 = sub nsw i32 %130, %131
  %133 = call i32 @get_min(i32 noundef 566, i32 noundef %132)
  store i32 %133, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  %134 = load i32, ptr %14, align 4, !tbaa !9
  %135 = sub nsw i32 %134, 2097152
  %136 = call i32 @get_max(i32 noundef %135, i32 noundef 0)
  store i32 %136, ptr %19, align 4, !tbaa !9
  %137 = load ptr, ptr %6, align 8, !tbaa !5
  %138 = load i32, ptr %12, align 4, !tbaa !9
  %139 = sext i32 %138 to i64
  %140 = getelementptr inbounds i32, ptr %137, i64 %139
  %141 = load i32, ptr %140, align 4, !tbaa !9
  %142 = load i32, ptr %19, align 4, !tbaa !9
  %143 = icmp sge i32 %141, %142
  br i1 %143, label %144, label %208

144:                                              ; preds = %129
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  %145 = load ptr, ptr %6, align 8, !tbaa !5
  %146 = load i32, ptr %12, align 4, !tbaa !9
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds i32, ptr %145, i64 %147
  %149 = load i32, ptr %148, align 4, !tbaa !9
  store i32 %149, ptr %20, align 4, !tbaa !9
  %150 = load ptr, ptr %4, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.CrushContext, ptr %150, i32 0, i32 2
  %152 = load ptr, ptr %151, align 8, !tbaa !15
  %153 = load i32, ptr %20, align 4, !tbaa !9
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds i8, ptr %152, i64 %154
  %156 = load i8, ptr %155, align 1, !tbaa !19
  %157 = zext i8 %156 to i32
  %158 = load ptr, ptr %4, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.CrushContext, ptr %158, i32 0, i32 2
  %160 = load ptr, ptr %159, align 8, !tbaa !15
  %161 = load i32, ptr %14, align 4, !tbaa !9
  %162 = sext i32 %161 to i64
  %163 = getelementptr inbounds i8, ptr %160, i64 %162
  %164 = load i8, ptr %163, align 1, !tbaa !19
  %165 = zext i8 %164 to i32
  %166 = icmp eq i32 %157, %165
  br i1 %166, label %167, label %207

167:                                              ; preds = %144
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  store i32 0, ptr %21, align 4, !tbaa !9
  br label %168

168:                                              ; preds = %196, %167
  %169 = load i32, ptr %21, align 4, !tbaa !9
  %170 = add nsw i32 %169, 1
  store i32 %170, ptr %21, align 4, !tbaa !9
  %171 = load i32, ptr %18, align 4, !tbaa !9
  %172 = icmp slt i32 %170, %171
  br i1 %172, label %173, label %197

173:                                              ; preds = %168
  %174 = load ptr, ptr %4, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.CrushContext, ptr %174, i32 0, i32 2
  %176 = load ptr, ptr %175, align 8, !tbaa !15
  %177 = load i32, ptr %20, align 4, !tbaa !9
  %178 = load i32, ptr %21, align 4, !tbaa !9
  %179 = add nsw i32 %177, %178
  %180 = sext i32 %179 to i64
  %181 = getelementptr inbounds i8, ptr %176, i64 %180
  %182 = load i8, ptr %181, align 1, !tbaa !19
  %183 = zext i8 %182 to i32
  %184 = load ptr, ptr %4, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.CrushContext, ptr %184, i32 0, i32 2
  %186 = load ptr, ptr %185, align 8, !tbaa !15
  %187 = load i32, ptr %14, align 4, !tbaa !9
  %188 = load i32, ptr %21, align 4, !tbaa !9
  %189 = add nsw i32 %187, %188
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds i8, ptr %186, i64 %190
  %192 = load i8, ptr %191, align 1, !tbaa !19
  %193 = zext i8 %192 to i32
  %194 = icmp ne i32 %183, %193
  br i1 %194, label %195, label %196

195:                                              ; preds = %173
  br label %197

196:                                              ; preds = %173
  br label %168, !llvm.loop !22

197:                                              ; preds = %195, %168
  %198 = load i32, ptr %21, align 4, !tbaa !9
  %199 = load i32, ptr %16, align 4, !tbaa !9
  %200 = icmp sgt i32 %198, %199
  br i1 %200, label %201, label %206

201:                                              ; preds = %197
  %202 = load i32, ptr %21, align 4, !tbaa !9
  store i32 %202, ptr %16, align 4, !tbaa !9
  %203 = load i32, ptr %14, align 4, !tbaa !9
  %204 = load i32, ptr %20, align 4, !tbaa !9
  %205 = sub nsw i32 %203, %204
  store i32 %205, ptr %17, align 4, !tbaa !9
  br label %206

206:                                              ; preds = %201, %197
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #4
  br label %207

207:                                              ; preds = %206, %144
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  br label %208

208:                                              ; preds = %207, %129
  %209 = load i32, ptr %16, align 4, !tbaa !9
  %210 = icmp slt i32 %209, 566
  br i1 %210, label %211, label %335

211:                                              ; preds = %208
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  %212 = load i32, ptr %5, align 4, !tbaa !9
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds [3 x i32], ptr %9, i64 0, i64 %213
  %215 = load i32, ptr %214, align 4, !tbaa !9
  store i32 %215, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  %216 = load ptr, ptr %6, align 8, !tbaa !5
  %217 = load i32, ptr %13, align 4, !tbaa !9
  %218 = add nsw i32 %217, 2097152
  %219 = sext i32 %218 to i64
  %220 = getelementptr inbounds i32, ptr %216, i64 %219
  %221 = load i32, ptr %220, align 4, !tbaa !9
  store i32 %221, ptr %23, align 4, !tbaa !9
  br label %222

222:                                              ; preds = %327, %211
  %223 = load i32, ptr %22, align 4, !tbaa !9
  %224 = add nsw i32 %223, -1
  store i32 %224, ptr %22, align 4, !tbaa !9
  %225 = icmp ne i32 %223, 0
  br i1 %225, label %226, label %230

226:                                              ; preds = %222
  %227 = load i32, ptr %23, align 4, !tbaa !9
  %228 = load i32, ptr %19, align 4, !tbaa !9
  %229 = icmp sge i32 %227, %228
  br label %230

230:                                              ; preds = %226, %222
  %231 = phi i1 [ false, %222 ], [ %229, %226 ]
  br i1 %231, label %232, label %334

232:                                              ; preds = %230
  %233 = load ptr, ptr %4, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct.CrushContext, ptr %233, i32 0, i32 2
  %235 = load ptr, ptr %234, align 8, !tbaa !15
  %236 = load i32, ptr %23, align 4, !tbaa !9
  %237 = load i32, ptr %16, align 4, !tbaa !9
  %238 = add nsw i32 %236, %237
  %239 = sext i32 %238 to i64
  %240 = getelementptr inbounds i8, ptr %235, i64 %239
  %241 = load i8, ptr %240, align 1, !tbaa !19
  %242 = zext i8 %241 to i32
  %243 = load ptr, ptr %4, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.CrushContext, ptr %243, i32 0, i32 2
  %245 = load ptr, ptr %244, align 8, !tbaa !15
  %246 = load i32, ptr %14, align 4, !tbaa !9
  %247 = load i32, ptr %16, align 4, !tbaa !9
  %248 = add nsw i32 %246, %247
  %249 = sext i32 %248 to i64
  %250 = getelementptr inbounds i8, ptr %245, i64 %249
  %251 = load i8, ptr %250, align 1, !tbaa !19
  %252 = zext i8 %251 to i32
  %253 = icmp eq i32 %242, %252
  br i1 %253, label %254, label %327

254:                                              ; preds = %232
  %255 = load ptr, ptr %4, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.CrushContext, ptr %255, i32 0, i32 2
  %257 = load ptr, ptr %256, align 8, !tbaa !15
  %258 = load i32, ptr %23, align 4, !tbaa !9
  %259 = sext i32 %258 to i64
  %260 = getelementptr inbounds i8, ptr %257, i64 %259
  %261 = load i8, ptr %260, align 1, !tbaa !19
  %262 = zext i8 %261 to i32
  %263 = load ptr, ptr %4, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.CrushContext, ptr %263, i32 0, i32 2
  %265 = load ptr, ptr %264, align 8, !tbaa !15
  %266 = load i32, ptr %14, align 4, !tbaa !9
  %267 = sext i32 %266 to i64
  %268 = getelementptr inbounds i8, ptr %265, i64 %267
  %269 = load i8, ptr %268, align 1, !tbaa !19
  %270 = zext i8 %269 to i32
  %271 = icmp eq i32 %262, %270
  br i1 %271, label %272, label %327

272:                                              ; preds = %254
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %273

273:                                              ; preds = %301, %272
  %274 = load i32, ptr %24, align 4, !tbaa !9
  %275 = add nsw i32 %274, 1
  store i32 %275, ptr %24, align 4, !tbaa !9
  %276 = load i32, ptr %18, align 4, !tbaa !9
  %277 = icmp slt i32 %275, %276
  br i1 %277, label %278, label %302

278:                                              ; preds = %273
  %279 = load ptr, ptr %4, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.CrushContext, ptr %279, i32 0, i32 2
  %281 = load ptr, ptr %280, align 8, !tbaa !15
  %282 = load i32, ptr %23, align 4, !tbaa !9
  %283 = load i32, ptr %24, align 4, !tbaa !9
  %284 = add nsw i32 %282, %283
  %285 = sext i32 %284 to i64
  %286 = getelementptr inbounds i8, ptr %281, i64 %285
  %287 = load i8, ptr %286, align 1, !tbaa !19
  %288 = zext i8 %287 to i32
  %289 = load ptr, ptr %4, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.CrushContext, ptr %289, i32 0, i32 2
  %291 = load ptr, ptr %290, align 8, !tbaa !15
  %292 = load i32, ptr %14, align 4, !tbaa !9
  %293 = load i32, ptr %24, align 4, !tbaa !9
  %294 = add nsw i32 %292, %293
  %295 = sext i32 %294 to i64
  %296 = getelementptr inbounds i8, ptr %291, i64 %295
  %297 = load i8, ptr %296, align 1, !tbaa !19
  %298 = zext i8 %297 to i32
  %299 = icmp ne i32 %288, %298
  br i1 %299, label %300, label %301

300:                                              ; preds = %278
  br label %302

301:                                              ; preds = %278
  br label %273, !llvm.loop !23

302:                                              ; preds = %300, %273
  %303 = load i32, ptr %24, align 4, !tbaa !9
  %304 = load i32, ptr %16, align 4, !tbaa !9
  %305 = load i32, ptr %14, align 4, !tbaa !9
  %306 = load i32, ptr %23, align 4, !tbaa !9
  %307 = sub nsw i32 %305, %306
  %308 = ashr i32 %307, 4
  %309 = load i32, ptr %17, align 4, !tbaa !9
  %310 = call i32 @get_penalty(i32 noundef %308, i32 noundef %309)
  %311 = add nsw i32 %304, %310
  %312 = icmp sgt i32 %303, %311
  br i1 %312, label %313, label %318

313:                                              ; preds = %302
  %314 = load i32, ptr %24, align 4, !tbaa !9
  store i32 %314, ptr %16, align 4, !tbaa !9
  %315 = load i32, ptr %14, align 4, !tbaa !9
  %316 = load i32, ptr %23, align 4, !tbaa !9
  %317 = sub nsw i32 %315, %316
  store i32 %317, ptr %17, align 4, !tbaa !9
  br label %318

318:                                              ; preds = %313, %302
  %319 = load i32, ptr %24, align 4, !tbaa !9
  %320 = load i32, ptr %18, align 4, !tbaa !9
  %321 = icmp eq i32 %319, %320
  br i1 %321, label %322, label %323

322:                                              ; preds = %318
  store i32 18, ptr %8, align 4
  br label %324

323:                                              ; preds = %318
  store i32 0, ptr %8, align 4
  br label %324

324:                                              ; preds = %323, %322
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  %325 = load i32, ptr %8, align 4
  switch i32 %325, label %652 [
    i32 0, label %326
    i32 18, label %334
  ]

326:                                              ; preds = %324
  br label %327

327:                                              ; preds = %326, %254, %232
  %328 = load ptr, ptr %7, align 8, !tbaa !5
  %329 = load i32, ptr %23, align 4, !tbaa !9
  %330 = and i32 %329, 2097151
  %331 = sext i32 %330 to i64
  %332 = getelementptr inbounds i32, ptr %328, i64 %331
  %333 = load i32, ptr %332, align 4, !tbaa !9
  store i32 %333, ptr %23, align 4, !tbaa !9
  br label %222, !llvm.loop !24

334:                                              ; preds = %324, %230
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  br label %335

335:                                              ; preds = %334, %208
  %336 = load i32, ptr %16, align 4, !tbaa !9
  %337 = icmp eq i32 %336, 3
  br i1 %337, label %338, label %342

338:                                              ; preds = %335
  %339 = load i32, ptr %17, align 4, !tbaa !9
  %340 = icmp sgt i32 %339, 65536
  br i1 %340, label %341, label %342

341:                                              ; preds = %338
  store i32 0, ptr %16, align 4, !tbaa !9
  br label %342

342:                                              ; preds = %341, %338, %335
  %343 = load i32, ptr %5, align 4, !tbaa !9
  %344 = icmp sge i32 %343, 2
  br i1 %344, label %345, label %487

345:                                              ; preds = %342
  %346 = load i32, ptr %16, align 4, !tbaa !9
  %347 = icmp sge i32 %346, 3
  br i1 %347, label %348, label %487

348:                                              ; preds = %345
  %349 = load i32, ptr %16, align 4, !tbaa !9
  %350 = load i32, ptr %18, align 4, !tbaa !9
  %351 = icmp slt i32 %349, %350
  br i1 %351, label %352, label %487

352:                                              ; preds = %348
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  %353 = load i32, ptr %14, align 4, !tbaa !9
  %354 = add nsw i32 %353, 1
  store i32 %354, ptr %25, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #4
  %355 = load i32, ptr %16, align 4, !tbaa !9
  %356 = add nsw i32 %355, 4
  %357 = load i32, ptr %18, align 4, !tbaa !9
  %358 = call i32 @get_min(i32 noundef %356, i32 noundef %357)
  store i32 %358, ptr %26, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #4
  %359 = load i32, ptr %5, align 4, !tbaa !9
  %360 = sext i32 %359 to i64
  %361 = getelementptr inbounds [3 x i32], ptr %9, i64 0, i64 %360
  %362 = load i32, ptr %361, align 4, !tbaa !9
  store i32 %362, ptr %27, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %363 = load ptr, ptr %6, align 8, !tbaa !5
  %364 = load i32, ptr %13, align 4, !tbaa !9
  %365 = load ptr, ptr %4, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.CrushContext, ptr %365, i32 0, i32 2
  %367 = load ptr, ptr %366, align 8, !tbaa !15
  %368 = load i32, ptr %25, align 4, !tbaa !9
  %369 = add nsw i32 %368, 3
  %370 = sext i32 %369 to i64
  %371 = getelementptr inbounds i8, ptr %367, i64 %370
  %372 = load i8, ptr %371, align 1, !tbaa !19
  %373 = zext i8 %372 to i32
  %374 = call i32 @update_hash2(i32 noundef %364, i32 noundef %373)
  %375 = add nsw i32 %374, 2097152
  %376 = sext i32 %375 to i64
  %377 = getelementptr inbounds i32, ptr %363, i64 %376
  %378 = load i32, ptr %377, align 4, !tbaa !9
  store i32 %378, ptr %28, align 4, !tbaa !9
  br label %379

379:                                              ; preds = %479, %352
  %380 = load i32, ptr %27, align 4, !tbaa !9
  %381 = add nsw i32 %380, -1
  store i32 %381, ptr %27, align 4, !tbaa !9
  %382 = icmp ne i32 %380, 0
  br i1 %382, label %383, label %387

383:                                              ; preds = %379
  %384 = load i32, ptr %28, align 4, !tbaa !9
  %385 = load i32, ptr %19, align 4, !tbaa !9
  %386 = icmp sge i32 %384, %385
  br label %387

387:                                              ; preds = %383, %379
  %388 = phi i1 [ false, %379 ], [ %386, %383 ]
  br i1 %388, label %389, label %486

389:                                              ; preds = %387
  %390 = load ptr, ptr %4, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.CrushContext, ptr %390, i32 0, i32 2
  %392 = load ptr, ptr %391, align 8, !tbaa !15
  %393 = load i32, ptr %28, align 4, !tbaa !9
  %394 = load i32, ptr %16, align 4, !tbaa !9
  %395 = add nsw i32 %393, %394
  %396 = sext i32 %395 to i64
  %397 = getelementptr inbounds i8, ptr %392, i64 %396
  %398 = load i8, ptr %397, align 1, !tbaa !19
  %399 = zext i8 %398 to i32
  %400 = load ptr, ptr %4, align 8, !tbaa !5
  %401 = getelementptr inbounds %struct.CrushContext, ptr %400, i32 0, i32 2
  %402 = load ptr, ptr %401, align 8, !tbaa !15
  %403 = load i32, ptr %25, align 4, !tbaa !9
  %404 = load i32, ptr %16, align 4, !tbaa !9
  %405 = add nsw i32 %403, %404
  %406 = sext i32 %405 to i64
  %407 = getelementptr inbounds i8, ptr %402, i64 %406
  %408 = load i8, ptr %407, align 1, !tbaa !19
  %409 = zext i8 %408 to i32
  %410 = icmp eq i32 %399, %409
  br i1 %410, label %411, label %479

411:                                              ; preds = %389
  %412 = load ptr, ptr %4, align 8, !tbaa !5
  %413 = getelementptr inbounds %struct.CrushContext, ptr %412, i32 0, i32 2
  %414 = load ptr, ptr %413, align 8, !tbaa !15
  %415 = load i32, ptr %28, align 4, !tbaa !9
  %416 = sext i32 %415 to i64
  %417 = getelementptr inbounds i8, ptr %414, i64 %416
  %418 = load i8, ptr %417, align 1, !tbaa !19
  %419 = zext i8 %418 to i32
  %420 = load ptr, ptr %4, align 8, !tbaa !5
  %421 = getelementptr inbounds %struct.CrushContext, ptr %420, i32 0, i32 2
  %422 = load ptr, ptr %421, align 8, !tbaa !15
  %423 = load i32, ptr %25, align 4, !tbaa !9
  %424 = sext i32 %423 to i64
  %425 = getelementptr inbounds i8, ptr %422, i64 %424
  %426 = load i8, ptr %425, align 1, !tbaa !19
  %427 = zext i8 %426 to i32
  %428 = icmp eq i32 %419, %427
  br i1 %428, label %429, label %479

429:                                              ; preds = %411
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  store i32 0, ptr %29, align 4, !tbaa !9
  br label %430

430:                                              ; preds = %458, %429
  %431 = load i32, ptr %29, align 4, !tbaa !9
  %432 = add nsw i32 %431, 1
  store i32 %432, ptr %29, align 4, !tbaa !9
  %433 = load i32, ptr %26, align 4, !tbaa !9
  %434 = icmp slt i32 %432, %433
  br i1 %434, label %435, label %459

435:                                              ; preds = %430
  %436 = load ptr, ptr %4, align 8, !tbaa !5
  %437 = getelementptr inbounds %struct.CrushContext, ptr %436, i32 0, i32 2
  %438 = load ptr, ptr %437, align 8, !tbaa !15
  %439 = load i32, ptr %28, align 4, !tbaa !9
  %440 = load i32, ptr %29, align 4, !tbaa !9
  %441 = add nsw i32 %439, %440
  %442 = sext i32 %441 to i64
  %443 = getelementptr inbounds i8, ptr %438, i64 %442
  %444 = load i8, ptr %443, align 1, !tbaa !19
  %445 = zext i8 %444 to i32
  %446 = load ptr, ptr %4, align 8, !tbaa !5
  %447 = getelementptr inbounds %struct.CrushContext, ptr %446, i32 0, i32 2
  %448 = load ptr, ptr %447, align 8, !tbaa !15
  %449 = load i32, ptr %25, align 4, !tbaa !9
  %450 = load i32, ptr %29, align 4, !tbaa !9
  %451 = add nsw i32 %449, %450
  %452 = sext i32 %451 to i64
  %453 = getelementptr inbounds i8, ptr %448, i64 %452
  %454 = load i8, ptr %453, align 1, !tbaa !19
  %455 = zext i8 %454 to i32
  %456 = icmp ne i32 %445, %455
  br i1 %456, label %457, label %458

457:                                              ; preds = %435
  br label %459

458:                                              ; preds = %435
  br label %430, !llvm.loop !25

459:                                              ; preds = %457, %430
  %460 = load i32, ptr %29, align 4, !tbaa !9
  %461 = load i32, ptr %16, align 4, !tbaa !9
  %462 = load i32, ptr %25, align 4, !tbaa !9
  %463 = load i32, ptr %28, align 4, !tbaa !9
  %464 = sub nsw i32 %462, %463
  %465 = load i32, ptr %17, align 4, !tbaa !9
  %466 = call i32 @get_penalty(i32 noundef %464, i32 noundef %465)
  %467 = add nsw i32 %461, %466
  %468 = icmp sgt i32 %460, %467
  br i1 %468, label %469, label %470

469:                                              ; preds = %459
  store i32 0, ptr %16, align 4, !tbaa !9
  store i32 22, ptr %8, align 4
  br label %476

470:                                              ; preds = %459
  %471 = load i32, ptr %29, align 4, !tbaa !9
  %472 = load i32, ptr %26, align 4, !tbaa !9
  %473 = icmp eq i32 %471, %472
  br i1 %473, label %474, label %475

474:                                              ; preds = %470
  store i32 22, ptr %8, align 4
  br label %476

475:                                              ; preds = %470
  store i32 0, ptr %8, align 4
  br label %476

476:                                              ; preds = %475, %474, %469
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #4
  %477 = load i32, ptr %8, align 4
  switch i32 %477, label %652 [
    i32 0, label %478
    i32 22, label %486
  ]

478:                                              ; preds = %476
  br label %479

479:                                              ; preds = %478, %411, %389
  %480 = load ptr, ptr %7, align 8, !tbaa !5
  %481 = load i32, ptr %28, align 4, !tbaa !9
  %482 = and i32 %481, 2097151
  %483 = sext i32 %482 to i64
  %484 = getelementptr inbounds i32, ptr %480, i64 %483
  %485 = load i32, ptr %484, align 4, !tbaa !9
  store i32 %485, ptr %28, align 4, !tbaa !9
  br label %379, !llvm.loop !26

486:                                              ; preds = %476, %387
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  br label %487

487:                                              ; preds = %486, %348, %345, %342
  %488 = load i32, ptr %16, align 4, !tbaa !9
  %489 = icmp sge i32 %488, 3
  br i1 %489, label %490, label %569

490:                                              ; preds = %487
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  %491 = load i32, ptr %16, align 4, !tbaa !9
  %492 = sub nsw i32 %491, 3
  store i32 %492, ptr %30, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #4
  store i32 5, ptr %31, align 4, !tbaa !9
  %493 = load ptr, ptr %4, align 8, !tbaa !5
  call void @put_bits(ptr noundef %493, i32 noundef 1, i32 noundef 1)
  %494 = load i32, ptr %30, align 4, !tbaa !9
  %495 = icmp slt i32 %494, 4
  br i1 %495, label %496, label %500

496:                                              ; preds = %490
  %497 = load ptr, ptr %4, align 8, !tbaa !5
  call void @put_bits(ptr noundef %497, i32 noundef 1, i32 noundef 1)
  %498 = load ptr, ptr %4, align 8, !tbaa !5
  %499 = load i32, ptr %30, align 4, !tbaa !9
  call void @put_bits(ptr noundef %498, i32 noundef 2, i32 noundef %499)
  br label %541

500:                                              ; preds = %490
  %501 = load i32, ptr %30, align 4, !tbaa !9
  %502 = icmp slt i32 %501, 8
  br i1 %502, label %503, label %508

503:                                              ; preds = %500
  %504 = load ptr, ptr %4, align 8, !tbaa !5
  call void @put_bits(ptr noundef %504, i32 noundef 2, i32 noundef 2)
  %505 = load ptr, ptr %4, align 8, !tbaa !5
  %506 = load i32, ptr %30, align 4, !tbaa !9
  %507 = sub nsw i32 %506, 4
  call void @put_bits(ptr noundef %505, i32 noundef 2, i32 noundef %507)
  br label %540

508:                                              ; preds = %500
  %509 = load i32, ptr %30, align 4, !tbaa !9
  %510 = icmp slt i32 %509, 12
  br i1 %510, label %511, label %516

511:                                              ; preds = %508
  %512 = load ptr, ptr %4, align 8, !tbaa !5
  call void @put_bits(ptr noundef %512, i32 noundef 3, i32 noundef 4)
  %513 = load ptr, ptr %4, align 8, !tbaa !5
  %514 = load i32, ptr %30, align 4, !tbaa !9
  %515 = sub nsw i32 %514, 8
  call void @put_bits(ptr noundef %513, i32 noundef 2, i32 noundef %515)
  br label %539

516:                                              ; preds = %508
  %517 = load i32, ptr %30, align 4, !tbaa !9
  %518 = icmp slt i32 %517, 20
  br i1 %518, label %519, label %524

519:                                              ; preds = %516
  %520 = load ptr, ptr %4, align 8, !tbaa !5
  call void @put_bits(ptr noundef %520, i32 noundef 4, i32 noundef 8)
  %521 = load ptr, ptr %4, align 8, !tbaa !5
  %522 = load i32, ptr %30, align 4, !tbaa !9
  %523 = sub nsw i32 %522, 12
  call void @put_bits(ptr noundef %521, i32 noundef 3, i32 noundef %523)
  br label %538

524:                                              ; preds = %516
  %525 = load i32, ptr %30, align 4, !tbaa !9
  %526 = icmp slt i32 %525, 52
  br i1 %526, label %527, label %532

527:                                              ; preds = %524
  %528 = load ptr, ptr %4, align 8, !tbaa !5
  call void @put_bits(ptr noundef %528, i32 noundef 5, i32 noundef 16)
  %529 = load ptr, ptr %4, align 8, !tbaa !5
  %530 = load i32, ptr %30, align 4, !tbaa !9
  %531 = sub nsw i32 %530, 20
  call void @put_bits(ptr noundef %529, i32 noundef 5, i32 noundef %531)
  br label %537

532:                                              ; preds = %524
  %533 = load ptr, ptr %4, align 8, !tbaa !5
  call void @put_bits(ptr noundef %533, i32 noundef 5, i32 noundef 0)
  %534 = load ptr, ptr %4, align 8, !tbaa !5
  %535 = load i32, ptr %30, align 4, !tbaa !9
  %536 = sub nsw i32 %535, 52
  call void @put_bits(ptr noundef %534, i32 noundef 9, i32 noundef %536)
  br label %537

537:                                              ; preds = %532, %527
  br label %538

538:                                              ; preds = %537, %519
  br label %539

539:                                              ; preds = %538, %511
  br label %540

540:                                              ; preds = %539, %503
  br label %541

541:                                              ; preds = %540, %496
  %542 = load i32, ptr %17, align 4, !tbaa !9
  %543 = add nsw i32 %542, -1
  store i32 %543, ptr %17, align 4, !tbaa !9
  br label %544

544:                                              ; preds = %549, %541
  %545 = load i32, ptr %17, align 4, !tbaa !9
  %546 = load i32, ptr %31, align 4, !tbaa !9
  %547 = shl i32 2, %546
  %548 = icmp sge i32 %545, %547
  br i1 %548, label %549, label %552

549:                                              ; preds = %544
  %550 = load i32, ptr %31, align 4, !tbaa !9
  %551 = add nsw i32 %550, 1
  store i32 %551, ptr %31, align 4, !tbaa !9
  br label %544, !llvm.loop !27

552:                                              ; preds = %544
  %553 = load ptr, ptr %4, align 8, !tbaa !5
  %554 = load i32, ptr %31, align 4, !tbaa !9
  %555 = sub nsw i32 %554, 5
  call void @put_bits(ptr noundef %553, i32 noundef 4, i32 noundef %555)
  %556 = load i32, ptr %31, align 4, !tbaa !9
  %557 = icmp sgt i32 %556, 5
  br i1 %557, label %558, label %565

558:                                              ; preds = %552
  %559 = load ptr, ptr %4, align 8, !tbaa !5
  %560 = load i32, ptr %31, align 4, !tbaa !9
  %561 = load i32, ptr %17, align 4, !tbaa !9
  %562 = load i32, ptr %31, align 4, !tbaa !9
  %563 = shl i32 1, %562
  %564 = sub nsw i32 %561, %563
  call void @put_bits(ptr noundef %559, i32 noundef %560, i32 noundef %564)
  br label %568

565:                                              ; preds = %552
  %566 = load ptr, ptr %4, align 8, !tbaa !5
  %567 = load i32, ptr %17, align 4, !tbaa !9
  call void @put_bits(ptr noundef %566, i32 noundef 6, i32 noundef %567)
  br label %568

568:                                              ; preds = %565, %558
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  br label %580

569:                                              ; preds = %487
  store i32 1, ptr %16, align 4, !tbaa !9
  %570 = load ptr, ptr %4, align 8, !tbaa !5
  %571 = load ptr, ptr %4, align 8, !tbaa !5
  %572 = getelementptr inbounds %struct.CrushContext, ptr %571, i32 0, i32 2
  %573 = load ptr, ptr %572, align 8, !tbaa !15
  %574 = load i32, ptr %14, align 4, !tbaa !9
  %575 = sext i32 %574 to i64
  %576 = getelementptr inbounds i8, ptr %573, i64 %575
  %577 = load i8, ptr %576, align 1, !tbaa !19
  %578 = zext i8 %577 to i32
  %579 = shl i32 %578, 1
  call void @put_bits(ptr noundef %570, i32 noundef 9, i32 noundef %579)
  br label %580

580:                                              ; preds = %569, %568
  br label %581

581:                                              ; preds = %585, %580
  %582 = load i32, ptr %16, align 4, !tbaa !9
  %583 = add nsw i32 %582, -1
  store i32 %583, ptr %16, align 4, !tbaa !9
  %584 = icmp ne i32 %582, 0
  br i1 %584, label %585, label %632

585:                                              ; preds = %581
  %586 = load i32, ptr %14, align 4, !tbaa !9
  %587 = load ptr, ptr %6, align 8, !tbaa !5
  %588 = load i32, ptr %12, align 4, !tbaa !9
  %589 = sext i32 %588 to i64
  %590 = getelementptr inbounds i32, ptr %587, i64 %589
  store i32 %586, ptr %590, align 4, !tbaa !9
  %591 = load ptr, ptr %6, align 8, !tbaa !5
  %592 = load i32, ptr %13, align 4, !tbaa !9
  %593 = add nsw i32 %592, 2097152
  %594 = sext i32 %593 to i64
  %595 = getelementptr inbounds i32, ptr %591, i64 %594
  %596 = load i32, ptr %595, align 4, !tbaa !9
  %597 = load ptr, ptr %7, align 8, !tbaa !5
  %598 = load i32, ptr %14, align 4, !tbaa !9
  %599 = and i32 %598, 2097151
  %600 = sext i32 %599 to i64
  %601 = getelementptr inbounds i32, ptr %597, i64 %600
  store i32 %596, ptr %601, align 4, !tbaa !9
  %602 = load i32, ptr %14, align 4, !tbaa !9
  %603 = load ptr, ptr %6, align 8, !tbaa !5
  %604 = load i32, ptr %13, align 4, !tbaa !9
  %605 = add nsw i32 %604, 2097152
  %606 = sext i32 %605 to i64
  %607 = getelementptr inbounds i32, ptr %603, i64 %606
  store i32 %602, ptr %607, align 4, !tbaa !9
  %608 = load i32, ptr %14, align 4, !tbaa !9
  %609 = add nsw i32 %608, 1
  store i32 %609, ptr %14, align 4, !tbaa !9
  %610 = load i32, ptr %12, align 4, !tbaa !9
  %611 = load ptr, ptr %4, align 8, !tbaa !5
  %612 = getelementptr inbounds %struct.CrushContext, ptr %611, i32 0, i32 2
  %613 = load ptr, ptr %612, align 8, !tbaa !15
  %614 = load i32, ptr %14, align 4, !tbaa !9
  %615 = add nsw i32 %614, 2
  %616 = sext i32 %615 to i64
  %617 = getelementptr inbounds i8, ptr %613, i64 %616
  %618 = load i8, ptr %617, align 1, !tbaa !19
  %619 = zext i8 %618 to i32
  %620 = call i32 @update_hash1(i32 noundef %610, i32 noundef %619)
  store i32 %620, ptr %12, align 4, !tbaa !9
  %621 = load i32, ptr %13, align 4, !tbaa !9
  %622 = load ptr, ptr %4, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.CrushContext, ptr %622, i32 0, i32 2
  %624 = load ptr, ptr %623, align 8, !tbaa !15
  %625 = load i32, ptr %14, align 4, !tbaa !9
  %626 = add nsw i32 %625, 3
  %627 = sext i32 %626 to i64
  %628 = getelementptr inbounds i8, ptr %624, i64 %627
  %629 = load i8, ptr %628, align 1, !tbaa !19
  %630 = zext i8 %629 to i32
  %631 = call i32 @update_hash2(i32 noundef %621, i32 noundef %630)
  store i32 %631, ptr %13, align 4, !tbaa !9
  br label %581, !llvm.loop !28

632:                                              ; preds = %581
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  br label %125, !llvm.loop !29

633:                                              ; preds = %125
  %634 = load ptr, ptr %4, align 8, !tbaa !5
  call void @flush_bits(ptr noundef %634)
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  br label %55, !llvm.loop !30

635:                                              ; preds = %55
  %636 = load ptr, ptr %4, align 8, !tbaa !5
  %637 = getelementptr inbounds %struct.CrushContext, ptr %636, i32 0, i32 8
  %638 = load ptr, ptr %637, align 8, !tbaa !31
  %639 = load ptr, ptr %6, align 8, !tbaa !5
  %640 = load ptr, ptr %4, align 8, !tbaa !5
  %641 = getelementptr inbounds %struct.CrushContext, ptr %640, i32 0, i32 9
  %642 = load ptr, ptr %641, align 8, !tbaa !13
  call void %638(ptr noundef %639, ptr noundef %642)
  %643 = load ptr, ptr %4, align 8, !tbaa !5
  %644 = getelementptr inbounds %struct.CrushContext, ptr %643, i32 0, i32 8
  %645 = load ptr, ptr %644, align 8, !tbaa !31
  %646 = load ptr, ptr %7, align 8, !tbaa !5
  %647 = load ptr, ptr %4, align 8, !tbaa !5
  %648 = getelementptr inbounds %struct.CrushContext, ptr %647, i32 0, i32 9
  %649 = load ptr, ptr %648, align 8, !tbaa !13
  call void %645(ptr noundef %646, ptr noundef %649)
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 12, ptr %9) #4
  br label %650

650:                                              ; preds = %635, %51
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #4
  %651 = load i32, ptr %3, align 4
  ret i32 %651

652:                                              ; preds = %476, %324
  unreachable
}

; Function Attrs: nounwind
declare void @free(ptr noundef) #2

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

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
declare hidden void @flush_bits(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 = { nounwind "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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nounwind }

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

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


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

@__const.crush_compress.max_chain = external hidden unnamed_addr constant [3 x i32], align 4

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

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1, 1) i32 @crush_compress(ptr noundef %0, i32 noundef %1) local_unnamed_addr #1 {
  %3 = alloca i32, align 4
  %4 = getelementptr inbounds i8, ptr %0, i64 48
  %5 = load ptr, ptr %4, align 8, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %0, i64 64
  %7 = load ptr, ptr %6, align 8, !tbaa !11
  %8 = tail call ptr %5(i64 noundef 75497472, ptr noundef %7) #5
  %9 = load ptr, ptr %4, align 8, !tbaa !5
  %10 = load ptr, ptr %6, align 8, !tbaa !11
  %11 = tail call ptr %9(i64 noundef 8388608, ptr noundef %10) #5
  %12 = icmp eq ptr %8, null
  %13 = icmp eq ptr %11, null
  %or.cond = select i1 %12, i1 true, i1 %13
  br i1 %or.cond, label %28, label %.preheader278

.preheader278:                                    ; preds = %2
  %14 = getelementptr inbounds i8, ptr %0, i64 32
  %15 = getelementptr inbounds i8, ptr %0, i64 8
  %16 = load ptr, ptr %14, align 8, !tbaa !12
  %17 = load ptr, ptr %15, align 8, !tbaa !13
  %18 = load ptr, ptr %6, align 8, !tbaa !11
  %19 = tail call i64 %16(ptr noundef %17, i64 noundef 67108864, ptr noundef %18) #5
  %20 = trunc i64 %19 to i32
  %21 = icmp sgt i32 %20, 0
  br i1 %21, label %.lr.ph313, label %._crit_edge314

.lr.ph313:                                        ; preds = %.preheader278
  %22 = getelementptr inbounds i8, ptr %0, i64 40
  %invariant.gep305 = getelementptr i8, ptr %8, i64 8388608
  %23 = sext i32 %1 to i64
  %24 = getelementptr inbounds [3 x i32], ptr @__const.crush_compress.max_chain, i64 0, i64 %23
  %25 = icmp sgt i32 %1, 1
  %26 = zext nneg i32 %1 to i64
  %27 = getelementptr inbounds [3 x i32], ptr @__const.crush_compress.max_chain, i64 0, i64 %26
  br label %.lr.ph312.preheader

28:                                               ; preds = %2
  tail call void @free(ptr noundef %8) #5
  tail call void @free(ptr noundef %11) #5
  br label %268

.lr.ph312.preheader:                              ; preds = %._crit_edge, %.lr.ph313
  %29 = phi i32 [ %20, %.lr.ph313 ], [ %261, %._crit_edge ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #5
  store i32 %29, ptr %3, align 4, !tbaa !14
  %30 = load ptr, ptr %22, align 8, !tbaa !15
  %31 = load ptr, ptr %6, align 8, !tbaa !11
  %32 = call i64 %30(ptr noundef nonnull %3, i64 noundef 4, ptr noundef %31) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(75497472) %8, i8 -1, i64 75497472, i1 false), !tbaa !14
  %33 = load ptr, ptr %15, align 8, !tbaa !13
  %34 = load i8, ptr %33, align 1, !tbaa !16
  %35 = zext i8 %34 to i32
  %36 = call i32 @update_hash1(i32 noundef 0, i32 noundef %35)
  %37 = load ptr, ptr %15, align 8, !tbaa !13
  %38 = getelementptr inbounds i8, ptr %37, i64 1
  %39 = load i8, ptr %38, align 1, !tbaa !16
  %40 = zext i8 %39 to i32
  %41 = call i32 @update_hash1(i32 noundef %36, i32 noundef %40)
  %42 = load ptr, ptr %15, align 8, !tbaa !13
  %43 = getelementptr inbounds i8, ptr %42, i64 2
  %44 = load i8, ptr %43, align 1, !tbaa !16
  %45 = zext i8 %44 to i32
  %46 = call i32 @update_hash1(i32 noundef %41, i32 noundef %45)
  %47 = load ptr, ptr %15, align 8, !tbaa !13
  %48 = load i8, ptr %47, align 1, !tbaa !16
  %49 = zext i8 %48 to i32
  %50 = call i32 @update_hash2(i32 noundef 0, i32 noundef %49)
  %51 = load ptr, ptr %15, align 8, !tbaa !13
  %52 = getelementptr inbounds i8, ptr %51, i64 1
  %53 = load i8, ptr %52, align 1, !tbaa !16
  %54 = zext i8 %53 to i32
  %55 = call i32 @update_hash2(i32 noundef %50, i32 noundef %54)
  %56 = load ptr, ptr %15, align 8, !tbaa !13
  %57 = getelementptr inbounds i8, ptr %56, i64 2
  %58 = load i8, ptr %57, align 1, !tbaa !16
  %59 = zext i8 %58 to i32
  %60 = call i32 @update_hash2(i32 noundef %55, i32 noundef %59)
  %61 = load ptr, ptr %15, align 8, !tbaa !13
  %62 = getelementptr inbounds i8, ptr %61, i64 3
  %63 = load i8, ptr %62, align 1, !tbaa !16
  %64 = zext i8 %63 to i32
  %65 = call i32 @update_hash2(i32 noundef %60, i32 noundef %64)
  br label %.lr.ph312

.loopexit:                                        ; preds = %236
  %66 = trunc nsw i64 %indvars.iv.next340 to i32
  %67 = icmp sgt i32 %29, %66
  br i1 %67, label %.lr.ph312, label %._crit_edge, !llvm.loop !17

.lr.ph312:                                        ; preds = %.lr.ph312.preheader, %.loopexit
  %.1222311 = phi i32 [ %250, %.loopexit ], [ %46, %.lr.ph312.preheader ]
  %.1225310 = phi i32 [ %256, %.loopexit ], [ %65, %.lr.ph312.preheader ]
  %.0227309 = phi i32 [ %66, %.loopexit ], [ 0, %.lr.ph312.preheader ]
  %68 = sub nsw i32 %29, %.0227309
  %69 = call i32 @get_min(i32 noundef 566, i32 noundef %68)
  %70 = add nsw i32 %.0227309, -2097152
  %71 = call i32 @get_max(i32 noundef %70, i32 noundef 0)
  %72 = sext i32 %.1222311 to i64
  %73 = getelementptr inbounds i32, ptr %8, i64 %72
  %74 = load i32, ptr %73, align 4, !tbaa !14
  %.not = icmp slt i32 %74, %71
  br i1 %.not, label %.thread, label %75

75:                                               ; preds = %.lr.ph312
  %76 = load ptr, ptr %15, align 8, !tbaa !13
  %77 = sext i32 %74 to i64
  %78 = getelementptr inbounds i8, ptr %76, i64 %77
  %79 = load i8, ptr %78, align 1, !tbaa !16
  %80 = sext i32 %.0227309 to i64
  %81 = getelementptr inbounds i8, ptr %76, i64 %80
  %82 = load i8, ptr %81, align 1, !tbaa !16
  %83 = icmp eq i8 %79, %82
  br i1 %83, label %.preheader274.preheader, label %.thread

.preheader274.preheader:                          ; preds = %75
  %smax = call i32 @llvm.smax.i32(i32 %69, i32 1)
  %84 = add nsw i32 %smax, -1
  %wide.trip.count = zext nneg i32 %84 to i64
  %invariant.gep = getelementptr i8, ptr %76, i64 %77
  %invariant.gep347 = getelementptr i8, ptr %76, i64 %80
  br label %.preheader274

.preheader274:                                    ; preds = %.preheader274.preheader, %85
  %indvars.iv = phi i64 [ 0, %.preheader274.preheader ], [ %indvars.iv.next, %85 ]
  %exitcond.not = icmp eq i64 %indvars.iv, %wide.trip.count
  br i1 %exitcond.not, label %.split.loop.exit343, label %85

85:                                               ; preds = %.preheader274
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %gep346 = getelementptr i8, ptr %invariant.gep, i64 %indvars.iv.next
  %86 = load i8, ptr %gep346, align 1, !tbaa !16
  %gep348 = getelementptr i8, ptr %invariant.gep347, i64 %indvars.iv.next
  %87 = load i8, ptr %gep348, align 1, !tbaa !16
  %.not255 = icmp eq i8 %86, %87
  br i1 %.not255, label %.preheader274, label %.split.loop.exit, !llvm.loop !19

.split.loop.exit:                                 ; preds = %85
  %88 = trunc nuw nsw i64 %indvars.iv to i32
  %89 = trunc nuw nsw i64 %indvars.iv.next to i32
  br label %.split.loop.exit343

.split.loop.exit343:                              ; preds = %.preheader274, %.split.loop.exit
  %.0220.lcssa = phi i32 [ %88, %.split.loop.exit ], [ %84, %.preheader274 ]
  %.lcssa317 = phi i32 [ %89, %.split.loop.exit ], [ %smax, %.preheader274 ]
  %90 = icmp ugt i32 %.0220.lcssa, 1
  br i1 %90, label %91, label %.thread

91:                                               ; preds = %.split.loop.exit343
  %92 = sub nsw i32 %.0227309, %74
  %93 = icmp ult i32 %.0220.lcssa, 565
  br i1 %93, label %.thread, label %.loopexit273

.thread:                                          ; preds = %75, %.split.loop.exit343, %.lr.ph312, %91
  %.2231269 = phi i32 [ %92, %91 ], [ 2097152, %75 ], [ 2097152, %.split.loop.exit343 ], [ 2097152, %.lr.ph312 ]
  %.2234268 = phi i32 [ %.lcssa317, %91 ], [ 2, %75 ], [ 2, %.split.loop.exit343 ], [ 2, %.lr.ph312 ]
  %94 = load i32, ptr %24, align 4, !tbaa !14
  %95 = sext i32 %.1225310 to i64
  %gep306 = getelementptr i32, ptr %invariant.gep305, i64 %95
  %.0218286 = load i32, ptr %gep306, align 4, !tbaa !14
  %96 = icmp ne i32 %94, 0
  %97 = icmp sge i32 %.0218286, %71
  %98 = select i1 %96, i1 %97, i1 false
  br i1 %98, label %.lr.ph, label %.loopexit273

.lr.ph:                                           ; preds = %.thread
  %99 = sext i32 %.0227309 to i64
  %smax329 = call i32 @llvm.smax.i32(i32 %69, i32 1)
  %100 = add nsw i32 %smax329, -1
  %wide.trip.count331 = zext nneg i32 %100 to i64
  br label %101

101:                                              ; preds = %.lr.ph, %130
  %.in = phi i32 [ %94, %.lr.ph ], [ %102, %130 ]
  %.0218289 = phi i32 [ %.0218286, %.lr.ph ], [ %.0218, %130 ]
  %.3288 = phi i32 [ %.2231269, %.lr.ph ], [ %.5, %130 ]
  %.3235287 = phi i32 [ %.2234268, %.lr.ph ], [ %.5237, %130 ]
  %102 = add nsw i32 %.in, -1
  %103 = load ptr, ptr %15, align 8, !tbaa !13
  %104 = add nsw i32 %.0218289, %.3235287
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds i8, ptr %103, i64 %105
  %107 = load i8, ptr %106, align 1, !tbaa !16
  %108 = add nsw i32 %.3235287, %.0227309
  %109 = sext i32 %108 to i64
  %110 = getelementptr inbounds i8, ptr %103, i64 %109
  %111 = load i8, ptr %110, align 1, !tbaa !16
  %112 = icmp eq i8 %107, %111
  br i1 %112, label %113, label %130

113:                                              ; preds = %101
  %114 = sext i32 %.0218289 to i64
  %115 = getelementptr inbounds i8, ptr %103, i64 %114
  %116 = load i8, ptr %115, align 1, !tbaa !16
  %117 = getelementptr inbounds i8, ptr %103, i64 %99
  %118 = load i8, ptr %117, align 1, !tbaa !16
  %119 = icmp eq i8 %116, %118
  br i1 %119, label %.preheader271.preheader, label %130

.preheader271.preheader:                          ; preds = %113
  %invariant.gep353 = getelementptr i8, ptr %103, i64 %114
  %invariant.gep355 = getelementptr i8, ptr %103, i64 %99
  br label %.preheader271

.preheader271:                                    ; preds = %.preheader271.preheader, %120
  %indvars.iv327 = phi i64 [ 0, %.preheader271.preheader ], [ %indvars.iv.next328, %120 ]
  %exitcond332.not = icmp eq i64 %indvars.iv327, %wide.trip.count331
  br i1 %exitcond332.not, label %.split.loop.exit350, label %120

120:                                              ; preds = %.preheader271
  %indvars.iv.next328 = add nuw nsw i64 %indvars.iv327, 1
  %gep354 = getelementptr i8, ptr %invariant.gep353, i64 %indvars.iv.next328
  %121 = load i8, ptr %gep354, align 1, !tbaa !16
  %gep356 = getelementptr i8, ptr %invariant.gep355, i64 %indvars.iv.next328
  %122 = load i8, ptr %gep356, align 1, !tbaa !16
  %.not256 = icmp eq i8 %121, %122
  br i1 %.not256, label %.preheader271, label %.split.loop.exit349, !llvm.loop !20

.split.loop.exit349:                              ; preds = %120
  %123 = trunc nuw nsw i64 %indvars.iv327 to i32
  %124 = trunc nuw nsw i64 %indvars.iv.next328 to i32
  br label %.split.loop.exit350

.split.loop.exit350:                              ; preds = %.preheader271, %.split.loop.exit349
  %.0217.lcssa = phi i32 [ %123, %.split.loop.exit349 ], [ %100, %.preheader271 ]
  %.lcssa318 = phi i32 [ %124, %.split.loop.exit349 ], [ %smax329, %.preheader271 ]
  %125 = sub nsw i32 %.0227309, %.0218289
  %126 = ashr i32 %125, 4
  %127 = call i32 @get_penalty(i32 noundef %126, i32 noundef %.3288)
  %128 = add nsw i32 %127, %.3235287
  %.not257 = icmp slt i32 %.0217.lcssa, %128
  %spec.select263 = select i1 %.not257, i32 %.3235287, i32 %.lcssa318
  %spec.select264 = select i1 %.not257, i32 %.3288, i32 %125
  %129 = icmp eq i32 %.lcssa318, %69
  br i1 %129, label %.loopexit273, label %130

130:                                              ; preds = %.split.loop.exit350, %113, %101
  %.5237 = phi i32 [ %spec.select263, %.split.loop.exit350 ], [ %.3235287, %113 ], [ %.3235287, %101 ]
  %.5 = phi i32 [ %spec.select264, %.split.loop.exit350 ], [ %.3288, %113 ], [ %.3288, %101 ]
  %131 = and i32 %.0218289, 2097151
  %132 = zext nneg i32 %131 to i64
  %133 = getelementptr inbounds i32, ptr %11, i64 %132
  %.0218 = load i32, ptr %133, align 4, !tbaa !14
  %134 = icmp ne i32 %102, 0
  %135 = icmp sge i32 %.0218, %71
  %136 = select i1 %134, i1 %135, i1 false
  br i1 %136, label %101, label %.loopexit273, !llvm.loop !21

.loopexit273:                                     ; preds = %130, %.split.loop.exit350, %.thread, %91
  %.7239 = phi i32 [ %.lcssa317, %91 ], [ %.2234268, %.thread ], [ %.5237, %130 ], [ %spec.select263, %.split.loop.exit350 ]
  %.7 = phi i32 [ %92, %91 ], [ %.2231269, %.thread ], [ %.5, %130 ], [ %spec.select264, %.split.loop.exit350 ]
  %137 = icmp eq i32 %.7239, 3
  %138 = icmp sgt i32 %.7, 65536
  %or.cond3 = select i1 %137, i1 %138, i1 false
  %spec.store.select = select i1 %or.cond3, i32 0, i32 %.7239
  %139 = icmp sgt i32 %spec.store.select, 2
  %or.cond5 = select i1 %25, i1 %139, i1 false
  %140 = icmp slt i32 %spec.store.select, %69
  %or.cond265 = select i1 %or.cond5, i1 %140, i1 false
  br i1 %or.cond265, label %141, label %.loopexit272

141:                                              ; preds = %.loopexit273
  %142 = add nsw i32 %.0227309, 1
  %143 = add nuw nsw i32 %spec.store.select, 4
  %144 = call i32 @get_min(i32 noundef %143, i32 noundef %69)
  %145 = load i32, ptr %27, align 4, !tbaa !14
  %146 = load ptr, ptr %15, align 8, !tbaa !13
  %147 = sext i32 %.0227309 to i64
  %148 = getelementptr i8, ptr %146, i64 %147
  %149 = getelementptr i8, ptr %148, i64 4
  %150 = load i8, ptr %149, align 1, !tbaa !16
  %151 = zext i8 %150 to i32
  %152 = call i32 @update_hash2(i32 noundef %.1225310, i32 noundef %151)
  %153 = sext i32 %152 to i64
  %gep308 = getelementptr i32, ptr %invariant.gep305, i64 %153
  %.0212294 = load i32, ptr %gep308, align 4, !tbaa !14
  %154 = icmp ne i32 %145, 0
  %155 = icmp sge i32 %.0212294, %71
  %156 = select i1 %154, i1 %155, i1 false
  br i1 %156, label %.lr.ph297, label %.loopexit272

.lr.ph297:                                        ; preds = %141
  %157 = sext i32 %142 to i64
  %smax335 = call i32 @llvm.smax.i32(i32 %144, i32 1)
  %158 = add nsw i32 %smax335, -1
  %wide.trip.count337 = zext nneg i32 %158 to i64
  br label %159

159:                                              ; preds = %.lr.ph297, %187
  %.in315 = phi i32 [ %145, %.lr.ph297 ], [ %160, %187 ]
  %.0212296 = phi i32 [ %.0212294, %.lr.ph297 ], [ %.0212, %187 ]
  %.8295 = phi i32 [ %.7239, %.lr.ph297 ], [ %.10, %187 ]
  %160 = add nsw i32 %.in315, -1
  %161 = load ptr, ptr %15, align 8, !tbaa !13
  %162 = add nsw i32 %.0212296, %.8295
  %163 = sext i32 %162 to i64
  %164 = getelementptr inbounds i8, ptr %161, i64 %163
  %165 = load i8, ptr %164, align 1, !tbaa !16
  %166 = add nsw i32 %.8295, %142
  %167 = sext i32 %166 to i64
  %168 = getelementptr inbounds i8, ptr %161, i64 %167
  %169 = load i8, ptr %168, align 1, !tbaa !16
  %170 = icmp eq i8 %165, %169
  br i1 %170, label %171, label %187

171:                                              ; preds = %159
  %172 = sext i32 %.0212296 to i64
  %173 = getelementptr inbounds i8, ptr %161, i64 %172
  %174 = load i8, ptr %173, align 1, !tbaa !16
  %175 = getelementptr inbounds i8, ptr %161, i64 %157
  %176 = load i8, ptr %175, align 1, !tbaa !16
  %177 = icmp eq i8 %174, %176
  br i1 %177, label %.preheader.preheader, label %187

.preheader.preheader:                             ; preds = %171
  %invariant.gep361 = getelementptr i8, ptr %161, i64 %172
  %invariant.gep363 = getelementptr i8, ptr %161, i64 %157
  br label %.preheader

.preheader:                                       ; preds = %.preheader.preheader, %178
  %indvars.iv333 = phi i64 [ 0, %.preheader.preheader ], [ %indvars.iv.next334, %178 ]
  %exitcond338.not = icmp eq i64 %indvars.iv333, %wide.trip.count337
  br i1 %exitcond338.not, label %.split.loop.exit358, label %178

178:                                              ; preds = %.preheader
  %indvars.iv.next334 = add nuw nsw i64 %indvars.iv333, 1
  %gep362 = getelementptr i8, ptr %invariant.gep361, i64 %indvars.iv.next334
  %179 = load i8, ptr %gep362, align 1, !tbaa !16
  %gep364 = getelementptr i8, ptr %invariant.gep363, i64 %indvars.iv.next334
  %180 = load i8, ptr %gep364, align 1, !tbaa !16
  %.not258 = icmp eq i8 %179, %180
  br i1 %.not258, label %.preheader, label %.split.loop.exit357, !llvm.loop !22

.split.loop.exit357:                              ; preds = %178
  %181 = trunc nuw nsw i64 %indvars.iv333 to i32
  %182 = trunc nuw nsw i64 %indvars.iv.next334 to i32
  br label %.split.loop.exit358

.split.loop.exit358:                              ; preds = %.preheader, %.split.loop.exit357
  %.0211.lcssa = phi i32 [ %181, %.split.loop.exit357 ], [ %158, %.preheader ]
  %.lcssa319 = phi i32 [ %182, %.split.loop.exit357 ], [ %smax335, %.preheader ]
  %183 = sub nsw i32 %142, %.0212296
  %184 = call i32 @get_penalty(i32 noundef %183, i32 noundef %.7)
  %185 = add nsw i32 %184, %.8295
  %.not259 = icmp slt i32 %.0211.lcssa, %185
  %186 = icmp ne i32 %.lcssa319, %144
  %.9 = select i1 %.not259, i32 %.8295, i32 0
  %switch = select i1 %.not259, i1 %186, i1 false
  br i1 %switch, label %187, label %.loopexit272

187:                                              ; preds = %.split.loop.exit358, %171, %159
  %.10 = phi i32 [ %.9, %.split.loop.exit358 ], [ %.8295, %171 ], [ %.8295, %159 ]
  %188 = and i32 %.0212296, 2097151
  %189 = zext nneg i32 %188 to i64
  %190 = getelementptr inbounds i32, ptr %11, i64 %189
  %.0212 = load i32, ptr %190, align 4, !tbaa !14
  %191 = icmp ne i32 %160, 0
  %192 = icmp sge i32 %.0212, %71
  %193 = select i1 %191, i1 %192, i1 false
  br i1 %193, label %159, label %.loopexit272, !llvm.loop !23

.loopexit272:                                     ; preds = %187, %.split.loop.exit358, %141, %.loopexit273
  %.12 = phi i32 [ %spec.store.select, %.loopexit273 ], [ %.7239, %141 ], [ %.10, %187 ], [ %.9, %.split.loop.exit358 ]
  %194 = icmp sgt i32 %.12, 2
  br i1 %194, label %195, label %227

195:                                              ; preds = %.loopexit272
  call void @put_bits(ptr noundef %0, i32 noundef 1, i32 noundef 1)
  %196 = icmp ult i32 %.12, 7
  br i1 %196, label %197, label %199

197:                                              ; preds = %195
  %198 = add nsw i32 %.12, -3
  call void @put_bits(ptr noundef %0, i32 noundef 1, i32 noundef 1)
  call void @put_bits(ptr noundef %0, i32 noundef 2, i32 noundef %198)
  br label %.preheader369

199:                                              ; preds = %195
  %200 = icmp ult i32 %.12, 11
  br i1 %200, label %201, label %203

201:                                              ; preds = %199
  call void @put_bits(ptr noundef %0, i32 noundef 2, i32 noundef 2)
  %202 = add nsw i32 %.12, -7
  call void @put_bits(ptr noundef %0, i32 noundef 2, i32 noundef %202)
  br label %.preheader369

203:                                              ; preds = %199
  %204 = icmp ult i32 %.12, 15
  br i1 %204, label %205, label %207

205:                                              ; preds = %203
  call void @put_bits(ptr noundef %0, i32 noundef 3, i32 noundef 4)
  %206 = add nsw i32 %.12, -11
  call void @put_bits(ptr noundef %0, i32 noundef 2, i32 noundef %206)
  br label %.preheader369

207:                                              ; preds = %203
  %208 = icmp ult i32 %.12, 23
  br i1 %208, label %209, label %211

209:                                              ; preds = %207
  call void @put_bits(ptr noundef %0, i32 noundef 4, i32 noundef 8)
  %210 = add nsw i32 %.12, -15
  call void @put_bits(ptr noundef %0, i32 noundef 3, i32 noundef %210)
  br label %.preheader369

211:                                              ; preds = %207
  %212 = icmp ult i32 %.12, 55
  br i1 %212, label %213, label %215

213:                                              ; preds = %211
  call void @put_bits(ptr noundef %0, i32 noundef 5, i32 noundef 16)
  %214 = add nsw i32 %.12, -23
  call void @put_bits(ptr noundef %0, i32 noundef 5, i32 noundef %214)
  br label %.preheader369

215:                                              ; preds = %211
  call void @put_bits(ptr noundef %0, i32 noundef 5, i32 noundef 0)
  %216 = add nsw i32 %.12, -55
  call void @put_bits(ptr noundef %0, i32 noundef 9, i32 noundef %216)
  br label %.preheader369

.preheader369:                                    ; preds = %201, %209, %215, %213, %205, %197
  br label %217

217:                                              ; preds = %.preheader369, %217
  %.0 = phi i32 [ %219, %217 ], [ 5, %.preheader369 ]
  %218 = shl i32 2, %.0
  %.not260.not = icmp sgt i32 %.7, %218
  %219 = add nuw nsw i32 %.0, 1
  br i1 %.not260.not, label %217, label %220, !llvm.loop !24

220:                                              ; preds = %217
  %221 = add nsw i32 %.7, -1
  %222 = add nsw i32 %.0, -5
  call void @put_bits(ptr noundef %0, i32 noundef 4, i32 noundef %222)
  %223 = icmp ugt i32 %.0, 5
  br i1 %223, label %224, label %226

224:                                              ; preds = %220
  %.neg = shl nsw i32 -1, %.0
  %225 = add i32 %.neg, %221
  call void @put_bits(ptr noundef %0, i32 noundef %.0, i32 noundef %225)
  br label %234

226:                                              ; preds = %220
  call void @put_bits(ptr noundef %0, i32 noundef 6, i32 noundef %221)
  br label %234

227:                                              ; preds = %.loopexit272
  %228 = load ptr, ptr %15, align 8, !tbaa !13
  %229 = sext i32 %.0227309 to i64
  %230 = getelementptr inbounds i8, ptr %228, i64 %229
  %231 = load i8, ptr %230, align 1, !tbaa !16
  %232 = zext i8 %231 to i32
  %233 = shl nuw nsw i32 %232, 1
  call void @put_bits(ptr noundef %0, i32 noundef 9, i32 noundef %233)
  br label %234

234:                                              ; preds = %224, %226, %227
  %.13 = phi i32 [ 1, %227 ], [ %.12, %226 ], [ %.12, %224 ]
  %235 = sext i32 %.0227309 to i64
  br label %236

236:                                              ; preds = %234, %236
  %indvars.iv339 = phi i64 [ %235, %234 ], [ %indvars.iv.next340, %236 ]
  %.2223304 = phi i32 [ %.1222311, %234 ], [ %250, %236 ]
  %.2226303 = phi i32 [ %.1225310, %234 ], [ %256, %236 ]
  %.14301 = phi i32 [ %.13, %234 ], [ %237, %236 ]
  %237 = add nsw i32 %.14301, -1
  %238 = sext i32 %.2223304 to i64
  %239 = getelementptr inbounds i32, ptr %8, i64 %238
  %240 = trunc nsw i64 %indvars.iv339 to i32
  store i32 %240, ptr %239, align 4, !tbaa !14
  %241 = sext i32 %.2226303 to i64
  %gep = getelementptr i32, ptr %invariant.gep305, i64 %241
  %242 = load i32, ptr %gep, align 4, !tbaa !14
  %243 = and i64 %indvars.iv339, 2097151
  %244 = getelementptr inbounds i32, ptr %11, i64 %243
  store i32 %242, ptr %244, align 4, !tbaa !14
  store i32 %240, ptr %gep, align 4, !tbaa !14
  %indvars.iv.next340 = add nsw i64 %indvars.iv339, 1
  %245 = load ptr, ptr %15, align 8, !tbaa !13
  %246 = getelementptr i8, ptr %245, i64 %indvars.iv339
  %247 = getelementptr i8, ptr %246, i64 3
  %248 = load i8, ptr %247, align 1, !tbaa !16
  %249 = zext i8 %248 to i32
  %250 = call i32 @update_hash1(i32 noundef %.2223304, i32 noundef %249)
  %251 = load ptr, ptr %15, align 8, !tbaa !13
  %252 = getelementptr i8, ptr %251, i64 %indvars.iv339
  %253 = getelementptr i8, ptr %252, i64 4
  %254 = load i8, ptr %253, align 1, !tbaa !16
  %255 = zext i8 %254 to i32
  %256 = call i32 @update_hash2(i32 noundef %.2226303, i32 noundef %255)
  %.not261 = icmp eq i32 %237, 0
  br i1 %.not261, label %.loopexit, label %236, !llvm.loop !25

._crit_edge:                                      ; preds = %.loopexit
  call void @flush_bits(ptr noundef nonnull %0)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3) #5
  %257 = load ptr, ptr %14, align 8, !tbaa !12
  %258 = load ptr, ptr %15, align 8, !tbaa !13
  %259 = load ptr, ptr %6, align 8, !tbaa !11
  %260 = call i64 %257(ptr noundef %258, i64 noundef 67108864, ptr noundef %259) #5
  %261 = trunc i64 %260 to i32
  %262 = icmp sgt i32 %261, 0
  br i1 %262, label %.lr.ph312.preheader, label %._crit_edge314, !llvm.loop !26

._crit_edge314:                                   ; preds = %._crit_edge, %.preheader278
  %263 = getelementptr inbounds i8, ptr %0, i64 56
  %264 = load ptr, ptr %263, align 8, !tbaa !27
  %265 = load ptr, ptr %6, align 8, !tbaa !11
  call void %264(ptr noundef nonnull %8, ptr noundef %265) #5
  %266 = load ptr, ptr %263, align 8, !tbaa !27
  %267 = load ptr, ptr %6, align 8, !tbaa !11
  call void %266(ptr noundef nonnull %11, ptr noundef %267) #5
  br label %268

268:                                              ; preds = %._crit_edge314, %28
  %.0210 = phi i32 [ -1, %28 ], [ 0, %._crit_edge314 ]
  ret i32 %.0210
}

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #2

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
declare hidden void @flush_bits(ptr noundef) local_unnamed_addr #1

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #4

attributes #0 = { mustprogress 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 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind }

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

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


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