; LLVM IR from dbry/wavpack-stream :: src (decorr_utils)

; 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.WavpackMetadata = type { i32, ptr, i8 }
%struct.WavpackStream = type { %struct.WavpackHeader, %struct.words_data, ptr, ptr, ptr, ptr, ptr, i64, i64, i32, i32, i32, i8, i8, i8, i8, i8, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, %struct.bs, %struct.bs, %struct.bs, float, i8, i8, i8, i8, i8, i8, i8, i8, %struct.anon, [16 x %struct.decorr_pass], %struct.decorr_pass, ptr, %struct.anon.0 }
%struct.WavpackHeader = type { [4 x i8], i16, i16, i32 }
%struct.words_data = type { [2 x i32], [2 x i32], i32, i32, i32, i32, i32, [2 x %struct.entropy_data] }
%struct.entropy_data = type { [3 x i32], i32, i32 }
%struct.bs = type { ptr, ptr, ptr, ptr, i32, i32, i32 }
%struct.anon = type { [2 x i32], [2 x i32], [2 x i32], double, double, double, ptr, ptr, i32 }
%struct.decorr_pass = type { i32, i32, i32, i32, [8 x i32], [8 x i32], i32, i32, i32, i32 }
%struct.anon.0 = type { ptr, ptr, ptr, ptr, ptr, i8, i8, i32, i32, i32, ptr, i32, i32, i32, [2 x %struct.DSDfilters], ptr }
%struct.DSDfilters = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.WavpackDecorrSpec = type { i8, i8, [17 x i8] }

; Function Attrs: nounwind uwtable
define dso_local i32 @read_decorr_combined(ptr noundef %0, ptr noundef %1) #0 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca [32 x i8], align 16
  %9 = alloca ptr, align 8
  %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 ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #4
  %20 = load ptr, ptr %5, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.WavpackMetadata, ptr %20, i32 0, i32 1
  %22 = load ptr, ptr %21, align 8, !tbaa !9
  store ptr %22, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #4
  %23 = load ptr, ptr %6, align 8, !tbaa !5
  %24 = load ptr, ptr %5, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.WavpackMetadata, ptr %24, i32 0, i32 0
  %26 = load i32, ptr %25, align 8, !tbaa !12
  %27 = sext i32 %26 to i64
  %28 = getelementptr inbounds i8, ptr %23, i64 %27
  store ptr %28, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 32, ptr %8) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  %29 = load ptr, ptr %5, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.WavpackMetadata, ptr %29, i32 0, i32 0
  %31 = load i32, ptr %30, align 8, !tbaa !12
  %32 = icmp slt i32 %31, 1
  br i1 %32, label %33, label %34

33:                                               ; preds = %2
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %672

34:                                               ; preds = %2
  %35 = load ptr, ptr %6, align 8, !tbaa !5
  %36 = load i8, ptr %35, align 1, !tbaa !13
  %37 = sext i8 %36 to i32
  %38 = and i32 %37, 31
  %39 = load ptr, ptr %4, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.WavpackStream, ptr %39, i32 0, i32 10
  store i32 %38, ptr %40, align 4, !tbaa !14
  store i32 %38, ptr %10, align 4, !tbaa !26
  %41 = load i32, ptr %10, align 4, !tbaa !26
  %42 = icmp sgt i32 %41, 16
  br i1 %42, label %43, label %44

43:                                               ; preds = %34
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %672

44:                                               ; preds = %34
  %45 = load i32, ptr %10, align 4, !tbaa !26
  %46 = icmp ne i32 %45, 0
  br i1 %46, label %48, label %47

47:                                               ; preds = %44
  store i32 1, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %672

48:                                               ; preds = %44
  br label %49

49:                                               ; preds = %48
  %50 = load ptr, ptr %6, align 8, !tbaa !5
  %51 = load i8, ptr %50, align 1, !tbaa !13
  %52 = sext i8 %51 to i32
  %53 = and i32 %52, 128
  %54 = icmp ne i32 %53, 0
  br i1 %54, label %55, label %204

55:                                               ; preds = %49
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  %56 = load ptr, ptr %6, align 8, !tbaa !5
  %57 = getelementptr inbounds i8, ptr %56, i32 1
  store ptr %57, ptr %6, align 8, !tbaa !5
  %58 = load i8, ptr %56, align 1, !tbaa !13
  %59 = sext i8 %58 to i32
  %60 = and i32 %59, 96
  %61 = icmp ne i32 %60, 0
  br i1 %61, label %73, label %62

62:                                               ; preds = %55
  %63 = load ptr, ptr %7, align 8, !tbaa !5
  %64 = load ptr, ptr %6, align 8, !tbaa !5
  %65 = ptrtoint ptr %63 to i64
  %66 = ptrtoint ptr %64 to i64
  %67 = sub i64 %65, %66
  %68 = load i32, ptr %10, align 4, !tbaa !26
  %69 = sdiv i32 %68, 2
  %70 = add nsw i32 %69, 1
  %71 = sext i32 %70 to i64
  %72 = icmp slt i64 %67, %71
  br i1 %72, label %73, label %74

73:                                               ; preds = %62, %55
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %201

74:                                               ; preds = %62
  %75 = load ptr, ptr %6, align 8, !tbaa !5
  %76 = load i8, ptr %75, align 1, !tbaa !13
  %77 = sext i8 %76 to i32
  %78 = and i32 %77, 7
  store i32 %78, ptr %13, align 4, !tbaa !26
  %79 = load ptr, ptr %4, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.WavpackStream, ptr %79, i32 0, i32 40
  %81 = getelementptr inbounds [16 x %struct.decorr_pass], ptr %80, i64 0, i64 0
  %82 = load i32, ptr %10, align 4, !tbaa !26
  %83 = sext i32 %82 to i64
  %84 = getelementptr inbounds %struct.decorr_pass, ptr %81, i64 %83
  store ptr %84, ptr %9, align 8, !tbaa !5
  %85 = load ptr, ptr %6, align 8, !tbaa !5
  %86 = getelementptr inbounds i8, ptr %85, i32 1
  store ptr %86, ptr %6, align 8, !tbaa !5
  %87 = load i8, ptr %85, align 1, !tbaa !13
  %88 = sext i8 %87 to i32
  %89 = ashr i32 %88, 4
  %90 = load ptr, ptr %9, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.decorr_pass, ptr %90, i32 -1
  store ptr %91, ptr %9, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.decorr_pass, ptr %91, i32 0, i32 0
  store i32 %89, ptr %92, align 4, !tbaa !27
  %93 = load i32, ptr %10, align 4, !tbaa !26
  %94 = add nsw i32 %93, -1
  store i32 %94, ptr %10, align 4, !tbaa !26
  br label %95

95:                                               ; preds = %98, %74
  %96 = load i32, ptr %10, align 4, !tbaa !26
  %97 = icmp sge i32 %96, 2
  br i1 %97, label %98, label %115

98:                                               ; preds = %95
  %99 = load ptr, ptr %6, align 8, !tbaa !5
  %100 = load i8, ptr %99, align 1, !tbaa !13
  %101 = sext i8 %100 to i32
  %102 = load ptr, ptr %9, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.decorr_pass, ptr %102, i32 -1
  store ptr %103, ptr %9, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.decorr_pass, ptr %103, i32 0, i32 0
  store i32 %101, ptr %104, align 4, !tbaa !27
  %105 = load ptr, ptr %6, align 8, !tbaa !5
  %106 = getelementptr inbounds i8, ptr %105, i32 1
  store ptr %106, ptr %6, align 8, !tbaa !5
  %107 = load i8, ptr %105, align 1, !tbaa !13
  %108 = sext i8 %107 to i32
  %109 = ashr i32 %108, 4
  %110 = load ptr, ptr %9, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.decorr_pass, ptr %110, i32 -1
  store ptr %111, ptr %9, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.decorr_pass, ptr %111, i32 0, i32 0
  store i32 %109, ptr %112, align 4, !tbaa !27
  %113 = load i32, ptr %10, align 4, !tbaa !26
  %114 = sub nsw i32 %113, 2
  store i32 %114, ptr %10, align 4, !tbaa !26
  br label %95, !llvm.loop !28

115:                                              ; preds = %95
  %116 = load i32, ptr %10, align 4, !tbaa !26
  %117 = icmp ne i32 %116, 0
  br i1 %117, label %118, label %126

118:                                              ; preds = %115
  %119 = load ptr, ptr %6, align 8, !tbaa !5
  %120 = getelementptr inbounds i8, ptr %119, i32 1
  store ptr %120, ptr %6, align 8, !tbaa !5
  %121 = load i8, ptr %119, align 1, !tbaa !13
  %122 = sext i8 %121 to i32
  %123 = load ptr, ptr %9, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.decorr_pass, ptr %123, i32 -1
  store ptr %124, ptr %9, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.decorr_pass, ptr %124, i32 0, i32 0
  store i32 %122, ptr %125, align 4, !tbaa !27
  br label %126

126:                                              ; preds = %118, %115
  store i32 0, ptr %11, align 4, !tbaa !26
  br label %127

127:                                              ; preds = %197, %126
  %128 = load i32, ptr %11, align 4, !tbaa !26
  %129 = load ptr, ptr %4, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.WavpackStream, ptr %129, i32 0, i32 10
  %131 = load i32, ptr %130, align 4, !tbaa !14
  %132 = icmp slt i32 %128, %131
  br i1 %132, label %133, label %200

133:                                              ; preds = %127
  %134 = load ptr, ptr %9, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.decorr_pass, ptr %134, i32 0, i32 0
  %136 = load i32, ptr %135, align 4, !tbaa !27
  %137 = and i32 %136, 15
  %138 = icmp slt i32 %137, 12
  br i1 %138, label %139, label %145

139:                                              ; preds = %133
  %140 = load ptr, ptr %9, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.decorr_pass, ptr %140, i32 0, i32 0
  %142 = load i32, ptr %141, align 4, !tbaa !27
  %143 = and i32 %142, 15
  %144 = sub nsw i32 %143, 3
  br label %151

145:                                              ; preds = %133
  %146 = load ptr, ptr %9, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.decorr_pass, ptr %146, i32 0, i32 0
  %148 = load i32, ptr %147, align 4, !tbaa !27
  %149 = and i32 %148, 15
  %150 = add nsw i32 %149, 3
  br label %151

151:                                              ; preds = %145, %139
  %152 = phi i32 [ %144, %139 ], [ %150, %145 ]
  %153 = load ptr, ptr %9, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.decorr_pass, ptr %153, i32 0, i32 0
  store i32 %152, ptr %154, align 4, !tbaa !27
  %155 = load ptr, ptr %9, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.decorr_pass, ptr %155, i32 0, i32 0
  %157 = load i32, ptr %156, align 4, !tbaa !27
  %158 = icmp ne i32 %157, 0
  br i1 %158, label %159, label %191

159:                                              ; preds = %151
  %160 = load ptr, ptr %9, align 8, !tbaa !5
  %161 = getelementptr inbounds %struct.decorr_pass, ptr %160, i32 0, i32 0
  %162 = load i32, ptr %161, align 4, !tbaa !27
  %163 = icmp slt i32 %162, -3
  br i1 %163, label %191, label %164

164:                                              ; preds = %159
  %165 = load ptr, ptr %9, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.decorr_pass, ptr %165, i32 0, i32 0
  %167 = load i32, ptr %166, align 4, !tbaa !27
  %168 = icmp sgt i32 %167, 8
  br i1 %168, label %169, label %174

169:                                              ; preds = %164
  %170 = load ptr, ptr %9, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.decorr_pass, ptr %170, i32 0, i32 0
  %172 = load i32, ptr %171, align 4, !tbaa !27
  %173 = icmp slt i32 %172, 17
  br i1 %173, label %191, label %174

174:                                              ; preds = %169, %164
  %175 = load ptr, ptr %9, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.decorr_pass, ptr %175, i32 0, i32 0
  %177 = load i32, ptr %176, align 4, !tbaa !27
  %178 = icmp sgt i32 %177, 18
  br i1 %178, label %191, label %179

179:                                              ; preds = %174
  %180 = load ptr, ptr %4, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.WavpackStream, ptr %180, i32 0, i32 0
  %182 = getelementptr inbounds %struct.WavpackHeader, ptr %181, i32 0, i32 3
  %183 = load i32, ptr %182, align 8, !tbaa !30
  %184 = and i32 %183, 1073741828
  %185 = icmp ne i32 %184, 0
  br i1 %185, label %186, label %192

186:                                              ; preds = %179
  %187 = load ptr, ptr %9, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.decorr_pass, ptr %187, i32 0, i32 0
  %189 = load i32, ptr %188, align 4, !tbaa !27
  %190 = icmp slt i32 %189, 0
  br i1 %190, label %191, label %192

191:                                              ; preds = %186, %174, %169, %159, %151
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %201

192:                                              ; preds = %186, %179
  %193 = load i32, ptr %13, align 4, !tbaa !26
  %194 = load ptr, ptr %9, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.decorr_pass, ptr %194, i32 1
  store ptr %195, ptr %9, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.decorr_pass, ptr %194, i32 0, i32 1
  store i32 %193, ptr %196, align 4, !tbaa !31
  br label %197

197:                                              ; preds = %192
  %198 = load i32, ptr %11, align 4, !tbaa !26
  %199 = add nsw i32 %198, 1
  store i32 %199, ptr %11, align 4, !tbaa !26
  br label %127, !llvm.loop !32

200:                                              ; preds = %127
  store i32 0, ptr %12, align 4
  br label %201

201:                                              ; preds = %200, %191, %73
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  %202 = load i32, ptr %12, align 4
  switch i32 %202, label %672 [
    i32 0, label %203
  ]

203:                                              ; preds = %201
  br label %373

204:                                              ; preds = %49
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  store i32 0, ptr %14, align 4, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  %205 = load ptr, ptr %6, align 8, !tbaa !5
  %206 = getelementptr inbounds i8, ptr %205, i64 1
  %207 = load i8, ptr %206, align 1, !tbaa !13
  %208 = zext i8 %207 to i32
  store i32 %208, ptr %15, align 4, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %209 = load ptr, ptr %4, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.WavpackStream, ptr %209, i32 0, i32 0
  %211 = getelementptr inbounds %struct.WavpackHeader, ptr %210, i32 0, i32 3
  %212 = load i32, ptr %211, align 8, !tbaa !30
  %213 = and i32 %212, 1073741828
  %214 = icmp ne i32 %213, 0
  br i1 %214, label %215, label %216

215:                                              ; preds = %204
  store i32 1, ptr %14, align 4, !tbaa !26
  br label %225

216:                                              ; preds = %204
  %217 = load ptr, ptr %4, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.WavpackStream, ptr %217, i32 0, i32 0
  %219 = getelementptr inbounds %struct.WavpackHeader, ptr %218, i32 0, i32 3
  %220 = load i32, ptr %219, align 8, !tbaa !30
  %221 = and i32 %220, 32
  %222 = icmp ne i32 %221, 0
  br i1 %222, label %224, label %223

223:                                              ; preds = %216
  store i32 -3, ptr %14, align 4, !tbaa !26
  br label %224

224:                                              ; preds = %223, %216
  br label %225

225:                                              ; preds = %224, %215
  %226 = load ptr, ptr %6, align 8, !tbaa !5
  %227 = load i8, ptr %226, align 1, !tbaa !13
  %228 = sext i8 %227 to i32
  %229 = and i32 %228, 96
  %230 = icmp eq i32 %229, 0
  br i1 %230, label %231, label %241

231:                                              ; preds = %225
  %232 = load i32, ptr %15, align 4, !tbaa !26
  %233 = call i32 @get_num_fast_specs()
  %234 = icmp sge i32 %232, %233
  br i1 %234, label %235, label %236

235:                                              ; preds = %231
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %370

236:                                              ; preds = %231
  %237 = call ptr @get_fast_specs()
  %238 = load i32, ptr %15, align 4, !tbaa !26
  %239 = sext i32 %238 to i64
  %240 = getelementptr inbounds %struct.WavpackDecorrSpec, ptr %237, i64 %239
  store ptr %240, ptr %17, align 8, !tbaa !5
  br label %285

241:                                              ; preds = %225
  %242 = load ptr, ptr %6, align 8, !tbaa !5
  %243 = load i8, ptr %242, align 1, !tbaa !13
  %244 = sext i8 %243 to i32
  %245 = and i32 %244, 96
  %246 = icmp eq i32 %245, 32
  br i1 %246, label %247, label %257

247:                                              ; preds = %241
  %248 = load i32, ptr %15, align 4, !tbaa !26
  %249 = call i32 @get_num_default_specs()
  %250 = icmp sge i32 %248, %249
  br i1 %250, label %251, label %252

251:                                              ; preds = %247
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %370

252:                                              ; preds = %247
  %253 = call ptr @get_default_specs()
  %254 = load i32, ptr %15, align 4, !tbaa !26
  %255 = sext i32 %254 to i64
  %256 = getelementptr inbounds %struct.WavpackDecorrSpec, ptr %253, i64 %255
  store ptr %256, ptr %17, align 8, !tbaa !5
  br label %284

257:                                              ; preds = %241
  %258 = load ptr, ptr %6, align 8, !tbaa !5
  %259 = load i8, ptr %258, align 1, !tbaa !13
  %260 = sext i8 %259 to i32
  %261 = and i32 %260, 96
  %262 = icmp eq i32 %261, 64
  br i1 %262, label %263, label %273

263:                                              ; preds = %257
  %264 = load i32, ptr %15, align 4, !tbaa !26
  %265 = call i32 @get_num_high_specs()
  %266 = icmp sge i32 %264, %265
  br i1 %266, label %267, label %268

267:                                              ; preds = %263
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %370

268:                                              ; preds = %263
  %269 = call ptr @get_high_specs()
  %270 = load i32, ptr %15, align 4, !tbaa !26
  %271 = sext i32 %270 to i64
  %272 = getelementptr inbounds %struct.WavpackDecorrSpec, ptr %269, i64 %271
  store ptr %272, ptr %17, align 8, !tbaa !5
  br label %283

273:                                              ; preds = %257
  %274 = load i32, ptr %15, align 4, !tbaa !26
  %275 = call i32 @get_num_very_high_specs()
  %276 = icmp sge i32 %274, %275
  br i1 %276, label %277, label %278

277:                                              ; preds = %273
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %370

278:                                              ; preds = %273
  %279 = call ptr @get_very_high_specs()
  %280 = load i32, ptr %15, align 4, !tbaa !26
  %281 = sext i32 %280 to i64
  %282 = getelementptr inbounds %struct.WavpackDecorrSpec, ptr %279, i64 %281
  store ptr %282, ptr %17, align 8, !tbaa !5
  br label %283

283:                                              ; preds = %278, %268
  br label %284

284:                                              ; preds = %283, %252
  br label %285

285:                                              ; preds = %284, %236
  %286 = load ptr, ptr %17, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.WavpackDecorrSpec, ptr %286, i32 0, i32 2
  %288 = getelementptr inbounds [17 x i8], ptr %287, i64 0, i64 0
  store ptr %288, ptr %16, align 8, !tbaa !5
  %289 = load ptr, ptr %4, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.WavpackStream, ptr %289, i32 0, i32 40
  %291 = getelementptr inbounds [16 x %struct.decorr_pass], ptr %290, i64 0, i64 0
  %292 = load i32, ptr %10, align 4, !tbaa !26
  %293 = sext i32 %292 to i64
  %294 = getelementptr inbounds %struct.decorr_pass, ptr %291, i64 %293
  %295 = getelementptr inbounds %struct.decorr_pass, ptr %294, i64 -1
  store ptr %295, ptr %9, align 8, !tbaa !5
  br label %296

296:                                              ; preds = %362, %285
  %297 = load i32, ptr %10, align 4, !tbaa !26
  %298 = add nsw i32 %297, -1
  store i32 %298, ptr %10, align 4, !tbaa !26
  %299 = icmp ne i32 %297, 0
  br i1 %299, label %300, label %367

300:                                              ; preds = %296
  %301 = load i32, ptr %14, align 4, !tbaa !26
  %302 = icmp ne i32 %301, 0
  br i1 %302, label %303, label %310

303:                                              ; preds = %300
  %304 = load ptr, ptr %16, align 8, !tbaa !5
  %305 = load i8, ptr %304, align 1, !tbaa !13
  %306 = sext i8 %305 to i32
  %307 = icmp slt i32 %306, 0
  br i1 %307, label %308, label %310

308:                                              ; preds = %303
  %309 = load i32, ptr %14, align 4, !tbaa !26
  br label %314

310:                                              ; preds = %303, %300
  %311 = load ptr, ptr %16, align 8, !tbaa !5
  %312 = load i8, ptr %311, align 1, !tbaa !13
  %313 = sext i8 %312 to i32
  br label %314

314:                                              ; preds = %310, %308
  %315 = phi i32 [ %309, %308 ], [ %313, %310 ]
  %316 = load ptr, ptr %9, align 8, !tbaa !5
  %317 = getelementptr inbounds %struct.decorr_pass, ptr %316, i32 0, i32 0
  store i32 %315, ptr %317, align 4, !tbaa !27
  %318 = load ptr, ptr %17, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.WavpackDecorrSpec, ptr %318, i32 0, i32 1
  %320 = load i8, ptr %319, align 1, !tbaa !33
  %321 = sext i8 %320 to i32
  %322 = load ptr, ptr %9, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.decorr_pass, ptr %322, i32 0, i32 1
  store i32 %321, ptr %323, align 4, !tbaa !31
  %324 = load ptr, ptr %9, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.decorr_pass, ptr %324, i32 0, i32 0
  %326 = load i32, ptr %325, align 4, !tbaa !27
  %327 = icmp ne i32 %326, 0
  br i1 %327, label %328, label %360

328:                                              ; preds = %314
  %329 = load ptr, ptr %9, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.decorr_pass, ptr %329, i32 0, i32 0
  %331 = load i32, ptr %330, align 4, !tbaa !27
  %332 = icmp slt i32 %331, -3
  br i1 %332, label %360, label %333

333:                                              ; preds = %328
  %334 = load ptr, ptr %9, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.decorr_pass, ptr %334, i32 0, i32 0
  %336 = load i32, ptr %335, align 4, !tbaa !27
  %337 = icmp sgt i32 %336, 8
  br i1 %337, label %338, label %343

338:                                              ; preds = %333
  %339 = load ptr, ptr %9, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.decorr_pass, ptr %339, i32 0, i32 0
  %341 = load i32, ptr %340, align 4, !tbaa !27
  %342 = icmp slt i32 %341, 17
  br i1 %342, label %360, label %343

343:                                              ; preds = %338, %333
  %344 = load ptr, ptr %9, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.decorr_pass, ptr %344, i32 0, i32 0
  %346 = load i32, ptr %345, align 4, !tbaa !27
  %347 = icmp sgt i32 %346, 18
  br i1 %347, label %360, label %348

348:                                              ; preds = %343
  %349 = load ptr, ptr %4, align 8, !tbaa !5
  %350 = getelementptr inbounds %struct.WavpackStream, ptr %349, i32 0, i32 0
  %351 = getelementptr inbounds %struct.WavpackHeader, ptr %350, i32 0, i32 3
  %352 = load i32, ptr %351, align 8, !tbaa !30
  %353 = and i32 %352, 1073741828
  %354 = icmp ne i32 %353, 0
  br i1 %354, label %355, label %361

355:                                              ; preds = %348
  %356 = load ptr, ptr %9, align 8, !tbaa !5
  %357 = getelementptr inbounds %struct.decorr_pass, ptr %356, i32 0, i32 0
  %358 = load i32, ptr %357, align 4, !tbaa !27
  %359 = icmp slt i32 %358, 0
  br i1 %359, label %360, label %361

360:                                              ; preds = %355, %343, %338, %328, %314
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %370

361:                                              ; preds = %355, %348
  br label %362

362:                                              ; preds = %361
  %363 = load ptr, ptr %9, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.decorr_pass, ptr %363, i32 -1
  store ptr %364, ptr %9, align 8, !tbaa !5
  %365 = load ptr, ptr %16, align 8, !tbaa !5
  %366 = getelementptr inbounds i8, ptr %365, i32 1
  store ptr %366, ptr %16, align 8, !tbaa !5
  br label %296, !llvm.loop !35

367:                                              ; preds = %296
  %368 = load ptr, ptr %6, align 8, !tbaa !5
  %369 = getelementptr inbounds i8, ptr %368, i64 2
  store ptr %369, ptr %6, align 8, !tbaa !5
  store i32 0, ptr %12, align 4
  br label %370

370:                                              ; preds = %367, %360, %277, %267, %251, %235
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  %371 = load i32, ptr %12, align 4
  switch i32 %371, label %672 [
    i32 0, label %372
  ]

372:                                              ; preds = %370
  br label %373

373:                                              ; preds = %372, %203
  %374 = load ptr, ptr %4, align 8, !tbaa !5
  %375 = getelementptr inbounds %struct.WavpackStream, ptr %374, i32 0, i32 0
  %376 = getelementptr inbounds %struct.WavpackHeader, ptr %375, i32 0, i32 3
  %377 = load i32, ptr %376, align 8, !tbaa !30
  %378 = and i32 %377, 1073741828
  %379 = icmp ne i32 %378, 0
  br i1 %379, label %380, label %386

380:                                              ; preds = %373
  %381 = load ptr, ptr %4, align 8, !tbaa !5
  %382 = getelementptr inbounds %struct.WavpackStream, ptr %381, i32 0, i32 10
  %383 = load i32, ptr %382, align 4, !tbaa !14
  %384 = add nsw i32 %383, 1
  %385 = and i32 %384, -2
  br label %391

386:                                              ; preds = %373
  %387 = load ptr, ptr %4, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.WavpackStream, ptr %387, i32 0, i32 10
  %389 = load i32, ptr %388, align 4, !tbaa !14
  %390 = mul nsw i32 %389, 2
  br label %391

391:                                              ; preds = %386, %380
  %392 = phi i32 [ %385, %380 ], [ %390, %386 ]
  store i32 %392, ptr %10, align 4, !tbaa !26
  %393 = load i32, ptr %10, align 4, !tbaa !26
  %394 = sdiv i32 %393, 2
  %395 = sext i32 %394 to i64
  %396 = load ptr, ptr %7, align 8, !tbaa !5
  %397 = load ptr, ptr %6, align 8, !tbaa !5
  %398 = ptrtoint ptr %396 to i64
  %399 = ptrtoint ptr %397 to i64
  %400 = sub i64 %398, %399
  %401 = icmp sgt i64 %395, %400
  br i1 %401, label %402, label %403

402:                                              ; preds = %391
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %672

403:                                              ; preds = %391
  store i32 0, ptr %11, align 4, !tbaa !26
  br label %404

404:                                              ; preds = %429, %403
  %405 = load i32, ptr %11, align 4, !tbaa !26
  %406 = load i32, ptr %10, align 4, !tbaa !26
  %407 = icmp slt i32 %405, %406
  br i1 %407, label %408, label %432

408:                                              ; preds = %404
  %409 = load i32, ptr %11, align 4, !tbaa !26
  %410 = and i32 %409, 1
  %411 = icmp ne i32 %410, 0
  br i1 %411, label %412, label %422

412:                                              ; preds = %408
  %413 = load ptr, ptr %6, align 8, !tbaa !5
  %414 = getelementptr inbounds i8, ptr %413, i32 1
  store ptr %414, ptr %6, align 8, !tbaa !5
  %415 = load i8, ptr %413, align 1, !tbaa !13
  %416 = sext i8 %415 to i32
  %417 = mul nsw i32 %416, 16
  %418 = trunc i32 %417 to i8
  %419 = load i32, ptr %11, align 4, !tbaa !26
  %420 = sext i32 %419 to i64
  %421 = getelementptr inbounds [32 x i8], ptr %8, i64 0, i64 %420
  store i8 %418, ptr %421, align 1, !tbaa !13
  br label %428

422:                                              ; preds = %408
  %423 = load ptr, ptr %6, align 8, !tbaa !5
  %424 = load i8, ptr %423, align 1, !tbaa !13
  %425 = load i32, ptr %11, align 4, !tbaa !26
  %426 = sext i32 %425 to i64
  %427 = getelementptr inbounds [32 x i8], ptr %8, i64 0, i64 %426
  store i8 %424, ptr %427, align 1, !tbaa !13
  br label %428

428:                                              ; preds = %422, %412
  br label %429

429:                                              ; preds = %428
  %430 = load i32, ptr %11, align 4, !tbaa !26
  %431 = add nsw i32 %430, 1
  store i32 %431, ptr %11, align 4, !tbaa !26
  br label %404, !llvm.loop !36

432:                                              ; preds = %404
  %433 = load ptr, ptr %4, align 8, !tbaa !5
  %434 = getelementptr inbounds %struct.WavpackStream, ptr %433, i32 0, i32 0
  %435 = getelementptr inbounds %struct.WavpackHeader, ptr %434, i32 0, i32 3
  %436 = load i32, ptr %435, align 8, !tbaa !30
  %437 = and i32 %436, 1073741828
  %438 = icmp ne i32 %437, 0
  br i1 %438, label %439, label %450

439:                                              ; preds = %432
  %440 = load i32, ptr %10, align 4, !tbaa !26
  %441 = load ptr, ptr %4, align 8, !tbaa !5
  %442 = getelementptr inbounds %struct.WavpackStream, ptr %441, i32 0, i32 10
  %443 = load i32, ptr %442, align 4, !tbaa !14
  %444 = add nsw i32 %443, 1
  %445 = icmp eq i32 %440, %444
  br i1 %445, label %446, label %449

446:                                              ; preds = %439
  %447 = load i32, ptr %10, align 4, !tbaa !26
  %448 = add nsw i32 %447, -1
  store i32 %448, ptr %10, align 4, !tbaa !26
  br label %449

449:                                              ; preds = %446, %439
  br label %453

450:                                              ; preds = %432
  %451 = load i32, ptr %10, align 4, !tbaa !26
  %452 = sdiv i32 %451, 2
  store i32 %452, ptr %10, align 4, !tbaa !26
  br label %453

453:                                              ; preds = %450, %449
  store i32 0, ptr %11, align 4, !tbaa !26
  %454 = load ptr, ptr %4, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.WavpackStream, ptr %454, i32 0, i32 40
  %456 = getelementptr inbounds [16 x %struct.decorr_pass], ptr %455, i64 0, i64 0
  %457 = load i32, ptr %10, align 4, !tbaa !26
  %458 = sext i32 %457 to i64
  %459 = getelementptr inbounds %struct.decorr_pass, ptr %456, i64 %458
  %460 = getelementptr inbounds %struct.decorr_pass, ptr %459, i64 -1
  store ptr %460, ptr %9, align 8, !tbaa !5
  br label %461

461:                                              ; preds = %490, %453
  %462 = load i32, ptr %10, align 4, !tbaa !26
  %463 = add nsw i32 %462, -1
  store i32 %463, ptr %10, align 4, !tbaa !26
  %464 = icmp ne i32 %462, 0
  br i1 %464, label %465, label %493

465:                                              ; preds = %461
  %466 = load i32, ptr %11, align 4, !tbaa !26
  %467 = add nsw i32 %466, 1
  store i32 %467, ptr %11, align 4, !tbaa !26
  %468 = sext i32 %466 to i64
  %469 = getelementptr inbounds [32 x i8], ptr %8, i64 0, i64 %468
  %470 = load i8, ptr %469, align 1, !tbaa !13
  %471 = call i32 @restore_weight_nybble(i8 noundef signext %470)
  %472 = load ptr, ptr %9, align 8, !tbaa !5
  %473 = getelementptr inbounds %struct.decorr_pass, ptr %472, i32 0, i32 2
  store i32 %471, ptr %473, align 4, !tbaa !37
  %474 = load ptr, ptr %4, align 8, !tbaa !5
  %475 = getelementptr inbounds %struct.WavpackStream, ptr %474, i32 0, i32 0
  %476 = getelementptr inbounds %struct.WavpackHeader, ptr %475, i32 0, i32 3
  %477 = load i32, ptr %476, align 8, !tbaa !30
  %478 = and i32 %477, 1073741828
  %479 = icmp ne i32 %478, 0
  br i1 %479, label %489, label %480

480:                                              ; preds = %465
  %481 = load i32, ptr %11, align 4, !tbaa !26
  %482 = add nsw i32 %481, 1
  store i32 %482, ptr %11, align 4, !tbaa !26
  %483 = sext i32 %481 to i64
  %484 = getelementptr inbounds [32 x i8], ptr %8, i64 0, i64 %483
  %485 = load i8, ptr %484, align 1, !tbaa !13
  %486 = call i32 @restore_weight_nybble(i8 noundef signext %485)
  %487 = load ptr, ptr %9, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.decorr_pass, ptr %487, i32 0, i32 3
  store i32 %486, ptr %488, align 4, !tbaa !38
  br label %489

489:                                              ; preds = %480, %465
  br label %490

490:                                              ; preds = %489
  %491 = load ptr, ptr %9, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.decorr_pass, ptr %491, i32 -1
  store ptr %492, ptr %9, align 8, !tbaa !5
  br label %461, !llvm.loop !39

493:                                              ; preds = %461
  %494 = load ptr, ptr %4, align 8, !tbaa !5
  %495 = getelementptr inbounds %struct.WavpackStream, ptr %494, i32 0, i32 10
  %496 = load i32, ptr %495, align 4, !tbaa !14
  store i32 %496, ptr %10, align 4, !tbaa !26
  %497 = load ptr, ptr %4, align 8, !tbaa !5
  %498 = getelementptr inbounds %struct.WavpackStream, ptr %497, i32 0, i32 40
  %499 = getelementptr inbounds [16 x %struct.decorr_pass], ptr %498, i64 0, i64 0
  store ptr %499, ptr %9, align 8, !tbaa !5
  br label %500

500:                                              ; preds = %509, %493
  %501 = load i32, ptr %10, align 4, !tbaa !26
  %502 = add nsw i32 %501, -1
  store i32 %502, ptr %10, align 4, !tbaa !26
  %503 = icmp ne i32 %501, 0
  br i1 %503, label %504, label %512

504:                                              ; preds = %500
  %505 = load ptr, ptr %9, align 8, !tbaa !5
  %506 = getelementptr inbounds %struct.decorr_pass, ptr %505, i32 0, i32 4
  call void @llvm.memset.p0.i64(ptr align 4 %506, i8 0, i64 32, i1 false)
  %507 = load ptr, ptr %9, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.decorr_pass, ptr %507, i32 0, i32 5
  call void @llvm.memset.p0.i64(ptr align 4 %508, i8 0, i64 32, i1 false)
  br label %509

509:                                              ; preds = %504
  %510 = load ptr, ptr %9, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.decorr_pass, ptr %510, i32 1
  store ptr %511, ptr %9, align 8, !tbaa !5
  br label %500, !llvm.loop !40

512:                                              ; preds = %500
  br label %513

513:                                              ; preds = %666, %512
  %514 = load ptr, ptr %9, align 8, !tbaa !5
  %515 = getelementptr inbounds %struct.decorr_pass, ptr %514, i32 -1
  store ptr %515, ptr %9, align 8, !tbaa !5
  %516 = load ptr, ptr %4, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct.WavpackStream, ptr %516, i32 0, i32 40
  %518 = getelementptr inbounds [16 x %struct.decorr_pass], ptr %517, i64 0, i64 0
  %519 = icmp ugt ptr %514, %518
  br i1 %519, label %520, label %524

520:                                              ; preds = %513
  %521 = load ptr, ptr %6, align 8, !tbaa !5
  %522 = load ptr, ptr %7, align 8, !tbaa !5
  %523 = icmp ult ptr %521, %522
  br label %524

524:                                              ; preds = %520, %513
  %525 = phi i1 [ false, %513 ], [ %523, %520 ]
  br i1 %525, label %526, label %667

526:                                              ; preds = %524
  %527 = load ptr, ptr %9, align 8, !tbaa !5
  %528 = getelementptr inbounds %struct.decorr_pass, ptr %527, i32 0, i32 0
  %529 = load i32, ptr %528, align 4, !tbaa !27
  %530 = icmp sgt i32 %529, 8
  br i1 %530, label %531, label %583

531:                                              ; preds = %526
  %532 = load ptr, ptr %6, align 8, !tbaa !5
  %533 = load ptr, ptr %4, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.WavpackStream, ptr %533, i32 0, i32 0
  %535 = getelementptr inbounds %struct.WavpackHeader, ptr %534, i32 0, i32 3
  %536 = load i32, ptr %535, align 8, !tbaa !30
  %537 = and i32 %536, 1073741828
  %538 = icmp ne i32 %537, 0
  %539 = zext i1 %538 to i64
  %540 = select i1 %538, i32 2, i32 4
  %541 = sext i32 %540 to i64
  %542 = getelementptr inbounds i8, ptr %532, i64 %541
  %543 = load ptr, ptr %7, align 8, !tbaa !5
  %544 = icmp ugt ptr %542, %543
  br i1 %544, label %545, label %546

545:                                              ; preds = %531
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %672

546:                                              ; preds = %531
  %547 = load ptr, ptr %6, align 8, !tbaa !5
  %548 = getelementptr inbounds i8, ptr %547, i32 1
  store ptr %548, ptr %6, align 8, !tbaa !5
  %549 = load i8, ptr %547, align 1, !tbaa !13
  %550 = call i32 @wp_exp2_schar(i8 noundef signext %549)
  %551 = load ptr, ptr %9, align 8, !tbaa !5
  %552 = getelementptr inbounds %struct.decorr_pass, ptr %551, i32 0, i32 4
  %553 = getelementptr inbounds [8 x i32], ptr %552, i64 0, i64 0
  store i32 %550, ptr %553, align 4, !tbaa !26
  %554 = load ptr, ptr %6, align 8, !tbaa !5
  %555 = getelementptr inbounds i8, ptr %554, i32 1
  store ptr %555, ptr %6, align 8, !tbaa !5
  %556 = load i8, ptr %554, align 1, !tbaa !13
  %557 = call i32 @wp_exp2_schar(i8 noundef signext %556)
  %558 = load ptr, ptr %9, align 8, !tbaa !5
  %559 = getelementptr inbounds %struct.decorr_pass, ptr %558, i32 0, i32 4
  %560 = getelementptr inbounds [8 x i32], ptr %559, i64 0, i64 1
  store i32 %557, ptr %560, align 4, !tbaa !26
  %561 = load ptr, ptr %4, align 8, !tbaa !5
  %562 = getelementptr inbounds %struct.WavpackStream, ptr %561, i32 0, i32 0
  %563 = getelementptr inbounds %struct.WavpackHeader, ptr %562, i32 0, i32 3
  %564 = load i32, ptr %563, align 8, !tbaa !30
  %565 = and i32 %564, 1073741828
  %566 = icmp ne i32 %565, 0
  br i1 %566, label %582, label %567

567:                                              ; preds = %546
  %568 = load ptr, ptr %6, align 8, !tbaa !5
  %569 = getelementptr inbounds i8, ptr %568, i32 1
  store ptr %569, ptr %6, align 8, !tbaa !5
  %570 = load i8, ptr %568, align 1, !tbaa !13
  %571 = call i32 @wp_exp2_schar(i8 noundef signext %570)
  %572 = load ptr, ptr %9, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.decorr_pass, ptr %572, i32 0, i32 5
  %574 = getelementptr inbounds [8 x i32], ptr %573, i64 0, i64 0
  store i32 %571, ptr %574, align 4, !tbaa !26
  %575 = load ptr, ptr %6, align 8, !tbaa !5
  %576 = getelementptr inbounds i8, ptr %575, i32 1
  store ptr %576, ptr %6, align 8, !tbaa !5
  %577 = load i8, ptr %575, align 1, !tbaa !13
  %578 = call i32 @wp_exp2_schar(i8 noundef signext %577)
  %579 = load ptr, ptr %9, align 8, !tbaa !5
  %580 = getelementptr inbounds %struct.decorr_pass, ptr %579, i32 0, i32 5
  %581 = getelementptr inbounds [8 x i32], ptr %580, i64 0, i64 1
  store i32 %578, ptr %581, align 4, !tbaa !26
  br label %582

582:                                              ; preds = %567, %546
  br label %666

583:                                              ; preds = %526
  %584 = load ptr, ptr %9, align 8, !tbaa !5
  %585 = getelementptr inbounds %struct.decorr_pass, ptr %584, i32 0, i32 0
  %586 = load i32, ptr %585, align 4, !tbaa !27
  %587 = icmp slt i32 %586, 0
  br i1 %587, label %588, label %609

588:                                              ; preds = %583
  %589 = load ptr, ptr %6, align 8, !tbaa !5
  %590 = getelementptr inbounds i8, ptr %589, i64 2
  %591 = load ptr, ptr %7, align 8, !tbaa !5
  %592 = icmp ugt ptr %590, %591
  br i1 %592, label %593, label %594

593:                                              ; preds = %588
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %672

594:                                              ; preds = %588
  %595 = load ptr, ptr %6, align 8, !tbaa !5
  %596 = getelementptr inbounds i8, ptr %595, i32 1
  store ptr %596, ptr %6, align 8, !tbaa !5
  %597 = load i8, ptr %595, align 1, !tbaa !13
  %598 = call i32 @wp_exp2_schar(i8 noundef signext %597)
  %599 = load ptr, ptr %9, align 8, !tbaa !5
  %600 = getelementptr inbounds %struct.decorr_pass, ptr %599, i32 0, i32 4
  %601 = getelementptr inbounds [8 x i32], ptr %600, i64 0, i64 0
  store i32 %598, ptr %601, align 4, !tbaa !26
  %602 = load ptr, ptr %6, align 8, !tbaa !5
  %603 = getelementptr inbounds i8, ptr %602, i32 1
  store ptr %603, ptr %6, align 8, !tbaa !5
  %604 = load i8, ptr %602, align 1, !tbaa !13
  %605 = call i32 @wp_exp2_schar(i8 noundef signext %604)
  %606 = load ptr, ptr %9, align 8, !tbaa !5
  %607 = getelementptr inbounds %struct.decorr_pass, ptr %606, i32 0, i32 5
  %608 = getelementptr inbounds [8 x i32], ptr %607, i64 0, i64 0
  store i32 %605, ptr %608, align 4, !tbaa !26
  br label %665

609:                                              ; preds = %583
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  store i32 0, ptr %18, align 4, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  %610 = load ptr, ptr %9, align 8, !tbaa !5
  %611 = getelementptr inbounds %struct.decorr_pass, ptr %610, i32 0, i32 0
  %612 = load i32, ptr %611, align 4, !tbaa !27
  store i32 %612, ptr %19, align 4, !tbaa !26
  br label %613

613:                                              ; preds = %658, %609
  %614 = load i32, ptr %19, align 4, !tbaa !26
  %615 = add nsw i32 %614, -1
  store i32 %615, ptr %19, align 4, !tbaa !26
  %616 = icmp ne i32 %614, 0
  br i1 %616, label %617, label %661

617:                                              ; preds = %613
  %618 = load ptr, ptr %6, align 8, !tbaa !5
  %619 = load ptr, ptr %4, align 8, !tbaa !5
  %620 = getelementptr inbounds %struct.WavpackStream, ptr %619, i32 0, i32 0
  %621 = getelementptr inbounds %struct.WavpackHeader, ptr %620, i32 0, i32 3
  %622 = load i32, ptr %621, align 8, !tbaa !30
  %623 = and i32 %622, 1073741828
  %624 = icmp ne i32 %623, 0
  %625 = zext i1 %624 to i64
  %626 = select i1 %624, i32 1, i32 2
  %627 = sext i32 %626 to i64
  %628 = getelementptr inbounds i8, ptr %618, i64 %627
  %629 = load ptr, ptr %7, align 8, !tbaa !5
  %630 = icmp ugt ptr %628, %629
  br i1 %630, label %631, label %632

631:                                              ; preds = %617
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %662

632:                                              ; preds = %617
  %633 = load ptr, ptr %6, align 8, !tbaa !5
  %634 = getelementptr inbounds i8, ptr %633, i32 1
  store ptr %634, ptr %6, align 8, !tbaa !5
  %635 = load i8, ptr %633, align 1, !tbaa !13
  %636 = call i32 @wp_exp2_schar(i8 noundef signext %635)
  %637 = load ptr, ptr %9, align 8, !tbaa !5
  %638 = getelementptr inbounds %struct.decorr_pass, ptr %637, i32 0, i32 4
  %639 = load i32, ptr %18, align 4, !tbaa !26
  %640 = sext i32 %639 to i64
  %641 = getelementptr inbounds [8 x i32], ptr %638, i64 0, i64 %640
  store i32 %636, ptr %641, align 4, !tbaa !26
  %642 = load ptr, ptr %4, align 8, !tbaa !5
  %643 = getelementptr inbounds %struct.WavpackStream, ptr %642, i32 0, i32 0
  %644 = getelementptr inbounds %struct.WavpackHeader, ptr %643, i32 0, i32 3
  %645 = load i32, ptr %644, align 8, !tbaa !30
  %646 = and i32 %645, 1073741828
  %647 = icmp ne i32 %646, 0
  br i1 %647, label %658, label %648

648:                                              ; preds = %632
  %649 = load ptr, ptr %6, align 8, !tbaa !5
  %650 = getelementptr inbounds i8, ptr %649, i32 1
  store ptr %650, ptr %6, align 8, !tbaa !5
  %651 = load i8, ptr %649, align 1, !tbaa !13
  %652 = call i32 @wp_exp2_schar(i8 noundef signext %651)
  %653 = load ptr, ptr %9, align 8, !tbaa !5
  %654 = getelementptr inbounds %struct.decorr_pass, ptr %653, i32 0, i32 5
  %655 = load i32, ptr %18, align 4, !tbaa !26
  %656 = sext i32 %655 to i64
  %657 = getelementptr inbounds [8 x i32], ptr %654, i64 0, i64 %656
  store i32 %652, ptr %657, align 4, !tbaa !26
  br label %658

658:                                              ; preds = %648, %632
  %659 = load i32, ptr %18, align 4, !tbaa !26
  %660 = add nsw i32 %659, 1
  store i32 %660, ptr %18, align 4, !tbaa !26
  br label %613, !llvm.loop !41

661:                                              ; preds = %613
  store i32 0, ptr %12, align 4
  br label %662

662:                                              ; preds = %661, %631
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  %663 = load i32, ptr %12, align 4
  switch i32 %663, label %672 [
    i32 0, label %664
  ]

664:                                              ; preds = %662
  br label %665

665:                                              ; preds = %664, %594
  br label %666

666:                                              ; preds = %665, %582
  br label %513, !llvm.loop !42

667:                                              ; preds = %524
  %668 = load ptr, ptr %6, align 8, !tbaa !5
  %669 = load ptr, ptr %7, align 8, !tbaa !5
  %670 = icmp eq ptr %668, %669
  %671 = zext i1 %670 to i32
  store i32 %671, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %672

672:                                              ; preds = %667, %662, %593, %545, %402, %370, %201, %47, %43, %33
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #4
  %673 = load i32, ptr %3, align 4
  ret i32 %673
}

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

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

declare i32 @get_num_fast_specs() #2

declare ptr @get_fast_specs() #2

declare i32 @get_num_default_specs() #2

declare ptr @get_default_specs() #2

declare i32 @get_num_high_specs() #2

declare ptr @get_high_specs() #2

declare i32 @get_num_very_high_specs() #2

declare ptr @get_very_high_specs() #2

declare i32 @restore_weight_nybble(i8 noundef signext) #2

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

declare i32 @wp_exp2_schar(i8 noundef signext) #2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 8}
!10 = !{!"", !11, i64 0, !6, i64 8, !7, i64 16}
!11 = !{!"int", !7, i64 0}
!12 = !{!10, !11, i64 0}
!13 = !{!7, !7, i64 0}
!14 = !{!15, !11, i64 148}
!15 = !{!"", !16, i64 0, !18, i64 12, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !19, i64 128, !19, i64 136, !11, i64 144, !11, i64 148, !11, i64 152, !7, i64 156, !7, i64 157, !7, i64 158, !7, i64 159, !7, i64 160, !7, i64 161, !7, i64 162, !11, i64 164, !11, i64 168, !11, i64 172, !11, i64 176, !11, i64 180, !11, i64 184, !11, i64 188, !11, i64 192, !20, i64 200, !20, i64 248, !20, i64 296, !21, i64 344, !7, i64 348, !7, i64 349, !7, i64 350, !7, i64 351, !7, i64 352, !7, i64 353, !7, i64 354, !7, i64 355, !22, i64 360, !7, i64 432, !24, i64 1968, !6, i64 2064, !25, i64 2072}
!16 = !{!"", !7, i64 0, !17, i64 4, !17, i64 6, !11, i64 8}
!17 = !{!"short", !7, i64 0}
!18 = !{!"words_data", !7, i64 0, !7, i64 8, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !7, i64 36}
!19 = !{!"long", !7, i64 0}
!20 = !{!"bs", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !11, i64 32, !11, i64 36, !11, i64 40}
!21 = !{!"float", !7, i64 0}
!22 = !{!"", !7, i64 0, !7, i64 8, !7, i64 16, !23, i64 24, !23, i64 32, !23, i64 40, !6, i64 48, !6, i64 56, !11, i64 64}
!23 = !{!"double", !7, i64 0}
!24 = !{!"decorr_pass", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !7, i64 16, !7, i64 48, !11, i64 80, !11, i64 84, !11, i64 88, !11, i64 92}
!25 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !7, i64 40, !7, i64 41, !11, i64 44, !11, i64 48, !11, i64 52, !6, i64 56, !11, i64 64, !11, i64 68, !11, i64 72, !7, i64 76, !6, i64 160}
!26 = !{!11, !11, i64 0}
!27 = !{!24, !11, i64 0}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = !{!15, !11, i64 8}
!31 = !{!24, !11, i64 4}
!32 = distinct !{!32, !29}
!33 = !{!34, !7, i64 1}
!34 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2}
!35 = distinct !{!35, !29}
!36 = distinct !{!36, !29}
!37 = !{!24, !11, i64 8}
!38 = !{!24, !11, i64 12}
!39 = distinct !{!39, !29}
!40 = distinct !{!40, !29}
!41 = distinct !{!41, !29}
!42 = distinct !{!42, !29}


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

%struct.decorr_pass = type { i32, i32, i32, i32, [8 x i32], [8 x i32], i32, i32, i32, i32 }
%struct.WavpackDecorrSpec = type { i8, i8, [17 x i8] }

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @read_decorr_combined(ptr nocapture noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #0 {
  %3 = alloca [32 x i8], align 16
  %4 = getelementptr inbounds i8, ptr %1, i64 8
  %5 = load ptr, ptr %4, align 8, !tbaa !5
  %6 = load i32, ptr %1, align 8, !tbaa !11
  %7 = sext i32 %6 to i64
  %8 = getelementptr inbounds i8, ptr %5, i64 %7
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %3) #5
  %9 = icmp slt i32 %6, 1
  br i1 %9, label %.thread, label %10

10:                                               ; preds = %2
  %11 = load i8, ptr %5, align 1, !tbaa !12
  %12 = and i8 %11, 31
  %13 = zext nneg i8 %12 to i32
  %14 = getelementptr inbounds i8, ptr %0, i64 148
  store i32 %13, ptr %14, align 4, !tbaa !13
  %15 = icmp ugt i8 %12, 16
  br i1 %15, label %.thread, label %16

16:                                               ; preds = %10
  %.not = icmp eq i8 %12, 0
  br i1 %.not, label %.thread, label %17

17:                                               ; preds = %16
  %18 = load i8, ptr %5, align 1, !tbaa !12
  %.not201 = icmp sgt i8 %18, -1
  %19 = getelementptr inbounds i8, ptr %5, i64 1
  br i1 %.not201, label %88, label %20

20:                                               ; preds = %17
  %21 = and i8 %18, 96
  %.not212 = icmp eq i8 %21, 0
  br i1 %.not212, label %22, label %.thread

22:                                               ; preds = %20
  %23 = lshr i32 %13, 1
  %24 = add nuw nsw i32 %23, 1
  %.not213 = icmp ugt i32 %6, %24
  br i1 %.not213, label %25, label %.thread

25:                                               ; preds = %22
  %26 = load i8, ptr %19, align 1, !tbaa !12
  %27 = sext i8 %26 to i32
  %28 = and i32 %27, 7
  %29 = getelementptr inbounds i8, ptr %0, i64 432
  %30 = zext nneg i8 %12 to i64
  %31 = getelementptr inbounds %struct.decorr_pass, ptr %29, i64 %30
  %32 = getelementptr inbounds i8, ptr %5, i64 2
  %33 = ashr i32 %27, 4
  %34 = getelementptr inbounds i8, ptr %31, i64 -96
  store i32 %33, ptr %34, align 4, !tbaa !25
  %35 = add nsw i32 %13, -1
  %36 = icmp ugt i8 %12, 2
  br i1 %36, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %25
  %37 = add nsw i32 %13, -3
  %38 = and i32 %37, 2
  %lcmp.mod.not.not = icmp eq i32 %38, 0
  br i1 %lcmp.mod.not.not, label %.lr.ph.prol, label %.lr.ph.prol.loopexit

.lr.ph.prol:                                      ; preds = %.lr.ph.preheader
  %39 = load i8, ptr %32, align 1, !tbaa !12
  %40 = sext i8 %39 to i32
  %41 = getelementptr inbounds i8, ptr %31, i64 -192
  store i32 %40, ptr %41, align 4, !tbaa !25
  %42 = getelementptr inbounds i8, ptr %5, i64 3
  %43 = load i8, ptr %32, align 1, !tbaa !12
  %44 = ashr i8 %43, 4
  %45 = sext i8 %44 to i32
  %46 = getelementptr inbounds i8, ptr %31, i64 -288
  store i32 %45, ptr %46, align 4, !tbaa !25
  %47 = add nsw i32 %13, -3
  br label %.lr.ph.prol.loopexit

.lr.ph.prol.loopexit:                             ; preds = %.lr.ph.prol, %.lr.ph.preheader
  %.0162255.unr = phi ptr [ %32, %.lr.ph.preheader ], [ %42, %.lr.ph.prol ]
  %.0176254.unr = phi i32 [ %35, %.lr.ph.preheader ], [ %47, %.lr.ph.prol ]
  %.0181253.unr = phi ptr [ %34, %.lr.ph.preheader ], [ %46, %.lr.ph.prol ]
  %.lcssa339.unr = phi ptr [ poison, %.lr.ph.preheader ], [ %42, %.lr.ph.prol ]
  %.lcssa338.unr = phi ptr [ poison, %.lr.ph.preheader ], [ %46, %.lr.ph.prol ]
  %.lcssa337.unr = phi i32 [ poison, %.lr.ph.preheader ], [ %47, %.lr.ph.prol ]
  %48 = icmp ult i32 %37, 2
  br i1 %48, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.prol.loopexit, %.lr.ph
  %.0162255 = phi ptr [ %60, %.lr.ph ], [ %.0162255.unr, %.lr.ph.prol.loopexit ]
  %.0176254 = phi i32 [ %65, %.lr.ph ], [ %.0176254.unr, %.lr.ph.prol.loopexit ]
  %.0181253 = phi ptr [ %64, %.lr.ph ], [ %.0181253.unr, %.lr.ph.prol.loopexit ]
  %49 = load i8, ptr %.0162255, align 1, !tbaa !12
  %50 = sext i8 %49 to i32
  %51 = getelementptr inbounds i8, ptr %.0181253, i64 -96
  store i32 %50, ptr %51, align 4, !tbaa !25
  %52 = getelementptr inbounds i8, ptr %.0162255, i64 1
  %53 = load i8, ptr %.0162255, align 1, !tbaa !12
  %54 = ashr i8 %53, 4
  %55 = sext i8 %54 to i32
  %56 = getelementptr inbounds i8, ptr %.0181253, i64 -192
  store i32 %55, ptr %56, align 4, !tbaa !25
  %57 = load i8, ptr %52, align 1, !tbaa !12
  %58 = sext i8 %57 to i32
  %59 = getelementptr inbounds i8, ptr %.0181253, i64 -288
  store i32 %58, ptr %59, align 4, !tbaa !25
  %60 = getelementptr inbounds i8, ptr %.0162255, i64 2
  %61 = load i8, ptr %52, align 1, !tbaa !12
  %62 = ashr i8 %61, 4
  %63 = sext i8 %62 to i32
  %64 = getelementptr inbounds i8, ptr %.0181253, i64 -384
  store i32 %63, ptr %64, align 4, !tbaa !25
  %65 = add nsw i32 %.0176254, -4
  %66 = icmp sgt i32 %.0176254, 5
  br i1 %66, label %.lr.ph, label %._crit_edge, !llvm.loop !26

._crit_edge:                                      ; preds = %.lr.ph.prol.loopexit, %.lr.ph, %25
  %.0181.lcssa = phi ptr [ %34, %25 ], [ %.lcssa338.unr, %.lr.ph.prol.loopexit ], [ %64, %.lr.ph ]
  %.0176.lcssa = phi i32 [ %35, %25 ], [ %.lcssa337.unr, %.lr.ph.prol.loopexit ], [ %65, %.lr.ph ]
  %.0162.lcssa = phi ptr [ %32, %25 ], [ %.lcssa339.unr, %.lr.ph.prol.loopexit ], [ %60, %.lr.ph ]
  %.not214 = icmp eq i32 %.0176.lcssa, 0
  br i1 %.not214, label %72, label %67

67:                                               ; preds = %._crit_edge
  %68 = getelementptr inbounds i8, ptr %.0162.lcssa, i64 1
  %69 = load i8, ptr %.0162.lcssa, align 1, !tbaa !12
  %70 = sext i8 %69 to i32
  %71 = getelementptr inbounds i8, ptr %.0181.lcssa, i64 -96
  store i32 %70, ptr %71, align 4, !tbaa !25
  br label %72

72:                                               ; preds = %67, %._crit_edge
  %.1182 = phi ptr [ %71, %67 ], [ %.0181.lcssa, %._crit_edge ]
  %.1163 = phi ptr [ %68, %67 ], [ %.0162.lcssa, %._crit_edge ]
  %73 = getelementptr inbounds i8, ptr %0, i64 8
  %umax = tail call i32 @llvm.umax.i32(i32 %13, i32 1)
  br label %74

74:                                               ; preds = %72, %84
  %.0172259 = phi i32 [ 0, %72 ], [ %87, %84 ]
  %.2183258 = phi ptr [ %.1182, %72 ], [ %85, %84 ]
  %75 = load i32, ptr %.2183258, align 4, !tbaa !25
  %76 = and i32 %75, 15
  %77 = icmp ult i32 %76, 12
  %.v = select i1 %77, i32 -3, i32 3
  %78 = add nsw i32 %.v, %76
  store i32 %78, ptr %.2183258, align 4, !tbaa !25
  %79 = icmp ult i32 %78, 17
  br i1 %79, label %switch.hole_check, label %80

80:                                               ; preds = %switch.hole_check, %74
  %81 = load i32, ptr %73, align 8, !tbaa !28
  %82 = and i32 %81, 1073741828
  %.not216 = icmp ne i32 %82, 0
  %83 = icmp slt i32 %78, 0
  %or.cond231 = and i1 %83, %.not216
  br i1 %or.cond231, label %.thread, label %84

84:                                               ; preds = %80
  %85 = getelementptr inbounds i8, ptr %.2183258, i64 96
  %86 = getelementptr inbounds i8, ptr %.2183258, i64 4
  store i32 %28, ptr %86, align 4, !tbaa !29
  %87 = add nuw nsw i32 %.0172259, 1
  %exitcond.not = icmp eq i32 %87, %umax
  br i1 %exitcond.not, label %.loopexit, label %74, !llvm.loop !30

88:                                               ; preds = %17
  %89 = load i8, ptr %19, align 1, !tbaa !12
  %90 = zext i8 %89 to i32
  %91 = getelementptr inbounds i8, ptr %0, i64 8
  %92 = load i32, ptr %91, align 8, !tbaa !28
  %93 = and i32 %92, 1073741828
  %.not202 = icmp eq i32 %93, 0
  %94 = and i32 %92, 32
  %.not203.not = icmp eq i32 %94, 0
  %spec.select232 = select i1 %.not203.not, i32 -3, i32 0
  %95 = and i32 %92, 1073741860
  %.not209 = icmp ne i32 %95, 32
  %.0161 = select i1 %.not202, i32 %spec.select232, i32 1
  %96 = lshr i8 %18, 5
  switch i8 %96, label %default.unreachable [
    i8 0, label %97
    i8 1, label %101
    i8 2, label %105
    i8 3, label %109
  ]

97:                                               ; preds = %88
  %98 = tail call i32 @get_num_fast_specs() #5
  %.not207 = icmp sgt i32 %98, %90
  br i1 %.not207, label %99, label %.thread

99:                                               ; preds = %97
  %100 = tail call ptr @get_fast_specs() #5
  br label %113

101:                                              ; preds = %88
  %102 = tail call i32 @get_num_default_specs() #5
  %.not206 = icmp sgt i32 %102, %90
  br i1 %.not206, label %103, label %.thread

103:                                              ; preds = %101
  %104 = tail call ptr @get_default_specs() #5
  br label %113

105:                                              ; preds = %88
  %106 = tail call i32 @get_num_high_specs() #5
  %.not205 = icmp sgt i32 %106, %90
  br i1 %.not205, label %107, label %.thread

107:                                              ; preds = %105
  %108 = tail call ptr @get_high_specs() #5
  br label %113

default.unreachable:                              ; preds = %88
  unreachable

109:                                              ; preds = %88
  %110 = tail call i32 @get_num_very_high_specs() #5
  %.not204 = icmp sgt i32 %110, %90
  br i1 %.not204, label %111, label %.thread

111:                                              ; preds = %109
  %112 = tail call ptr @get_very_high_specs() #5
  br label %113

113:                                              ; preds = %103, %111, %107, %99
  %.sink319 = phi ptr [ %104, %103 ], [ %112, %111 ], [ %108, %107 ], [ %100, %99 ]
  %114 = zext i8 %89 to i64
  %115 = getelementptr inbounds %struct.WavpackDecorrSpec, ptr %.sink319, i64 %114
  %116 = getelementptr inbounds i8, ptr %115, i64 2
  %117 = getelementptr inbounds i8, ptr %0, i64 432
  %118 = zext nneg i8 %12 to i64
  %119 = getelementptr inbounds %struct.decorr_pass, ptr %117, i64 %118
  %120 = getelementptr inbounds i8, ptr %115, i64 1
  %121 = load i8, ptr %120, align 1, !tbaa !31
  %122 = sext i8 %121 to i32
  br label %125

123:                                              ; preds = %135
  %124 = getelementptr inbounds i8, ptr %.0159262, i64 1
  %.not208 = icmp eq i32 %126, 0
  br i1 %.not208, label %139, label %125, !llvm.loop !33

125:                                              ; preds = %113, %123
  %.in = phi i32 [ %13, %113 ], [ %126, %123 ]
  %.0159262 = phi ptr [ %116, %113 ], [ %124, %123 ]
  %.pn261 = phi ptr [ %119, %113 ], [ %.3184263, %123 ]
  %.3184263 = getelementptr inbounds i8, ptr %.pn261, i64 -96
  %126 = add nsw i32 %.in, -1
  %.pre = load i8, ptr %.0159262, align 1, !tbaa !12
  %127 = icmp slt i8 %.pre, 0
  %or.cond = select i1 %.not209, i1 %127, i1 false
  %128 = sext i8 %.pre to i32
  %129 = select i1 %or.cond, i32 %.0161, i32 %128
  store i32 %129, ptr %.3184263, align 4, !tbaa !25
  %130 = getelementptr inbounds i8, ptr %.pn261, i64 -92
  store i32 %122, ptr %130, align 4, !tbaa !29
  %.not210 = icmp eq i32 %129, 0
  %131 = icmp slt i32 %129, -3
  %or.cond233 = or i1 %.not210, %131
  br i1 %or.cond233, label %.thread, label %132

132:                                              ; preds = %125
  %133 = add nsw i32 %129, -9
  %or.cond234 = icmp ult i32 %133, 8
  %134 = icmp sgt i32 %129, 18
  %or.cond243 = or i1 %134, %or.cond234
  br i1 %or.cond243, label %.thread, label %135

135:                                              ; preds = %132
  %136 = load i32, ptr %91, align 8, !tbaa !28
  %137 = and i32 %136, 1073741828
  %.not211 = icmp ne i32 %137, 0
  %138 = icmp slt i32 %129, 0
  %or.cond235 = and i1 %138, %.not211
  br i1 %or.cond235, label %.thread, label %123

139:                                              ; preds = %123
  %140 = getelementptr inbounds i8, ptr %5, i64 2
  br label %.loopexit

.loopexit:                                        ; preds = %84, %139
  %141 = phi i32 [ %136, %139 ], [ %81, %84 ]
  %.4166 = phi ptr [ %140, %139 ], [ %.1163, %84 ]
  %142 = getelementptr inbounds i8, ptr %0, i64 8
  %143 = and i32 %141, 1073741828
  %.not217 = icmp eq i32 %143, 0
  %144 = load i32, ptr %14, align 4, !tbaa !13
  %145 = add nsw i32 %144, 1
  %146 = and i32 %145, -2
  %147 = shl nsw i32 %144, 1
  %148 = select i1 %.not217, i32 %147, i32 %146
  %149 = ashr exact i32 %148, 1
  %150 = sext i32 %149 to i64
  %151 = ptrtoint ptr %8 to i64
  %152 = ptrtoint ptr %.4166 to i64
  %153 = sub i64 %151, %152
  %154 = icmp slt i64 %153, %150
  br i1 %154, label %.thread, label %.preheader247

.preheader247:                                    ; preds = %.loopexit
  %155 = icmp sgt i32 %148, 0
  br i1 %155, label %.lr.ph266.preheader.new, label %._crit_edge267

.lr.ph266.preheader.new:                          ; preds = %.preheader247
  %wide.trip.count = zext nneg i32 %148 to i64
  br label %.lr.ph266

.lr.ph266:                                        ; preds = %.lr.ph266, %.lr.ph266.preheader.new
  %indvars.iv = phi i64 [ 0, %.lr.ph266.preheader.new ], [ %indvars.iv.next.1, %.lr.ph266 ]
  %.5167265 = phi ptr [ %.4166, %.lr.ph266.preheader.new ], [ %158, %.lr.ph266 ]
  %niter = phi i64 [ 0, %.lr.ph266.preheader.new ], [ %niter.next.1, %.lr.ph266 ]
  %156 = load i8, ptr %.5167265, align 1, !tbaa !12
  %157 = getelementptr inbounds [32 x i8], ptr %3, i64 0, i64 %indvars.iv
  store i8 %156, ptr %157, align 2
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %158 = getelementptr inbounds i8, ptr %.5167265, i64 1
  %159 = load i8, ptr %.5167265, align 1, !tbaa !12
  %160 = shl i8 %159, 4
  %161 = getelementptr inbounds [32 x i8], ptr %3, i64 0, i64 %indvars.iv.next
  store i8 %160, ptr %161, align 1
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %wide.trip.count
  br i1 %niter.ncmp.1, label %._crit_edge267, label %.lr.ph266, !llvm.loop !34

._crit_edge267:                                   ; preds = %.lr.ph266, %.preheader247
  %.5167.lcssa = phi ptr [ %.4166, %.preheader247 ], [ %158, %.lr.ph266 ]
  br i1 %.not217, label %166, label %162

162:                                              ; preds = %._crit_edge267
  %163 = add nsw i32 %144, 1
  %164 = icmp eq i32 %148, %163
  %165 = sext i1 %164 to i32
  %spec.select236 = add nsw i32 %148, %165
  %.pre310 = sext i32 %spec.select236 to i64
  br label %166

166:                                              ; preds = %162, %._crit_edge267
  %.pre-phi = phi i64 [ %.pre310, %162 ], [ %150, %._crit_edge267 ]
  %.2178 = phi i32 [ %spec.select236, %162 ], [ %149, %._crit_edge267 ]
  %.not219270 = icmp eq i32 %.2178, 0
  br i1 %.not219270, label %._crit_edge276, label %.lr.ph275.preheader

.lr.ph275.preheader:                              ; preds = %166
  %.ptr222 = getelementptr inbounds i8, ptr %0, i64 432
  %167 = getelementptr inbounds %struct.decorr_pass, ptr %.ptr222, i64 %.pre-phi
  br label %.lr.ph275

.lr.ph275:                                        ; preds = %.lr.ph275.preheader, %184
  %.in297 = phi i32 [ %168, %184 ], [ %.2178, %.lr.ph275.preheader ]
  %.2174272 = phi i32 [ %.3175, %184 ], [ 0, %.lr.ph275.preheader ]
  %.pn229271 = phi ptr [ %.4185273, %184 ], [ %167, %.lr.ph275.preheader ]
  %.4185273 = getelementptr inbounds i8, ptr %.pn229271, i64 -96
  %168 = add nsw i32 %.in297, -1
  %169 = add nsw i32 %.2174272, 1
  %170 = sext i32 %.2174272 to i64
  %171 = getelementptr inbounds [32 x i8], ptr %3, i64 0, i64 %170
  %172 = load i8, ptr %171, align 1, !tbaa !12
  %173 = tail call i32 @restore_weight_nybble(i8 noundef signext %172) #5
  %174 = getelementptr inbounds i8, ptr %.pn229271, i64 -88
  store i32 %173, ptr %174, align 4, !tbaa !35
  %175 = load i32, ptr %142, align 8, !tbaa !28
  %176 = and i32 %175, 1073741828
  %.not228 = icmp eq i32 %176, 0
  br i1 %.not228, label %177, label %184

177:                                              ; preds = %.lr.ph275
  %178 = add nsw i32 %.2174272, 2
  %179 = sext i32 %169 to i64
  %180 = getelementptr inbounds [32 x i8], ptr %3, i64 0, i64 %179
  %181 = load i8, ptr %180, align 1, !tbaa !12
  %182 = tail call i32 @restore_weight_nybble(i8 noundef signext %181) #5
  %183 = getelementptr inbounds i8, ptr %.pn229271, i64 -84
  store i32 %182, ptr %183, align 4, !tbaa !36
  br label %184

184:                                              ; preds = %.lr.ph275, %177
  %.3175 = phi i32 [ %169, %.lr.ph275 ], [ %178, %177 ]
  %.not219 = icmp eq i32 %168, 0
  br i1 %.not219, label %._crit_edge276.loopexit, label %.lr.ph275, !llvm.loop !37

._crit_edge276.loopexit:                          ; preds = %184
  %.pre309 = load i32, ptr %14, align 4, !tbaa !13
  br label %._crit_edge276

._crit_edge276:                                   ; preds = %._crit_edge276.loopexit, %166
  %185 = phi i32 [ %.pre309, %._crit_edge276.loopexit ], [ %144, %166 ]
  %.not220277 = icmp eq i32 %185, 0
  br i1 %.not220277, label %._crit_edge294, label %.lr.ph281.preheader

.lr.ph281.preheader:                              ; preds = %._crit_edge276
  %invariant.gep = getelementptr inbounds i8, ptr %0, i64 16
  %xtraiter343 = and i32 %185, 7
  %186 = icmp ult i32 %185, 8
  br i1 %186, label %.preheader245.unr-lcssa, label %.lr.ph281.preheader.new

.lr.ph281.preheader.new:                          ; preds = %.lr.ph281.preheader
  %unroll_iter347 = and i32 %185, -8
  %invariant.gep353 = getelementptr inbounds i8, ptr %invariant.gep, i64 96
  %invariant.gep355 = getelementptr inbounds i8, ptr %invariant.gep, i64 192
  %invariant.gep357 = getelementptr inbounds i8, ptr %invariant.gep, i64 288
  %invariant.gep359 = getelementptr inbounds i8, ptr %invariant.gep, i64 384
  %invariant.gep361 = getelementptr inbounds i8, ptr %invariant.gep, i64 480
  %invariant.gep363 = getelementptr inbounds i8, ptr %invariant.gep, i64 576
  br label %.lr.ph281

.preheader245.unr-lcssa:                          ; preds = %.lr.ph281, %.lr.ph281.preheader
  %.5186.idx278.lcssa.ph = phi i64 [ poison, %.lr.ph281.preheader ], [ %.5186.add.6, %.lr.ph281 ]
  %.5186.add.lcssa.ph = phi i64 [ poison, %.lr.ph281.preheader ], [ %.5186.add.7, %.lr.ph281 ]
  %.5186.idx278.unr = phi i64 [ 432, %.lr.ph281.preheader ], [ %.5186.add.7, %.lr.ph281 ]
  %lcmp.mod344.not = icmp eq i32 %xtraiter343, 0
  br i1 %lcmp.mod344.not, label %.preheader245, label %.lr.ph281.epil

.lr.ph281.epil:                                   ; preds = %.preheader245.unr-lcssa, %.lr.ph281.epil
  %.5186.idx278.epil = phi i64 [ %.5186.add.epil, %.lr.ph281.epil ], [ %.5186.idx278.unr, %.preheader245.unr-lcssa ]
  %epil.iter = phi i32 [ %epil.iter.next, %.lr.ph281.epil ], [ 0, %.preheader245.unr-lcssa ]
  %gep.epil = getelementptr inbounds i8, ptr %invariant.gep, i64 %.5186.idx278.epil
  %.5186.add.epil = add nuw nsw i64 %.5186.idx278.epil, 96
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep.epil, i8 0, i64 64, i1 false)
  %epil.iter.next = add i32 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i32 %epil.iter.next, %xtraiter343
  br i1 %epil.iter.cmp.not, label %.preheader245, label %.lr.ph281.epil, !llvm.loop !38

.preheader245:                                    ; preds = %.lr.ph281.epil, %.preheader245.unr-lcssa
  %.5186.idx278.lcssa = phi i64 [ %.5186.idx278.lcssa.ph, %.preheader245.unr-lcssa ], [ %.5186.idx278.epil, %.lr.ph281.epil ]
  %.5186.add.lcssa = phi i64 [ %.5186.add.lcssa.ph, %.preheader245.unr-lcssa ], [ %.5186.add.epil, %.lr.ph281.epil ]
  %187 = icmp ugt i64 %.5186.idx278.lcssa, 336
  %188 = icmp ult ptr %.5167.lcssa, %8
  %189 = select i1 %187, i1 %188, i1 false
  br i1 %189, label %.lr.ph293, label %._crit_edge294

.lr.ph281:                                        ; preds = %.lr.ph281, %.lr.ph281.preheader.new
  %.5186.idx278 = phi i64 [ 432, %.lr.ph281.preheader.new ], [ %.5186.add.7, %.lr.ph281 ]
  %niter348 = phi i32 [ 0, %.lr.ph281.preheader.new ], [ %niter348.next.7, %.lr.ph281 ]
  %gep = getelementptr inbounds i8, ptr %invariant.gep, i64 %.5186.idx278
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep, i8 0, i64 64, i1 false)
  %gep354 = getelementptr inbounds i8, ptr %invariant.gep353, i64 %.5186.idx278
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep354, i8 0, i64 64, i1 false)
  %gep356 = getelementptr inbounds i8, ptr %invariant.gep355, i64 %.5186.idx278
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep356, i8 0, i64 64, i1 false)
  %gep358 = getelementptr inbounds i8, ptr %invariant.gep357, i64 %.5186.idx278
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep358, i8 0, i64 64, i1 false)
  %gep360 = getelementptr inbounds i8, ptr %invariant.gep359, i64 %.5186.idx278
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep360, i8 0, i64 64, i1 false)
  %gep362 = getelementptr inbounds i8, ptr %invariant.gep361, i64 %.5186.idx278
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep362, i8 0, i64 64, i1 false)
  %gep364 = getelementptr inbounds i8, ptr %invariant.gep363, i64 %.5186.idx278
  %.5186.add.6 = add nuw nsw i64 %.5186.idx278, 672
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep364, i8 0, i64 64, i1 false)
  %gep.7 = getelementptr inbounds i8, ptr %invariant.gep, i64 %.5186.add.6
  %.5186.add.7 = add nuw nsw i64 %.5186.idx278, 768
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %gep.7, i8 0, i64 64, i1 false)
  %niter348.next.7 = add i32 %niter348, 8
  %niter348.ncmp.7 = icmp eq i32 %niter348.next.7, %unroll_iter347
  br i1 %niter348.ncmp.7, label %.preheader245.unr-lcssa, label %.lr.ph281, !llvm.loop !40

.lr.ph293:                                        ; preds = %.preheader245, %.critedge
  %.6187.add291.in = phi i64 [ %.6187.add291, %.critedge ], [ %.5186.add.lcssa, %.preheader245 ]
  %.7290 = phi ptr [ %.10, %.critedge ], [ %.5167.lcssa, %.preheader245 ]
  %.6187.add291 = add nsw i64 %.6187.add291.in, -96
  %.ptr292 = getelementptr inbounds i8, ptr %0, i64 %.6187.add291
  %190 = load i32, ptr %.ptr292, align 4, !tbaa !25
  %191 = icmp sgt i32 %190, 8
  br i1 %191, label %192, label %215

192:                                              ; preds = %.lr.ph293
  %193 = load i32, ptr %142, align 8, !tbaa !28
  %194 = and i32 %193, 1073741828
  %.not226 = icmp eq i32 %194, 0
  %195 = select i1 %.not226, i64 4, i64 2
  %196 = getelementptr inbounds i8, ptr %.7290, i64 %195
  %197 = icmp ugt ptr %196, %8
  br i1 %197, label %.thread, label %198

198:                                              ; preds = %192
  %199 = getelementptr inbounds i8, ptr %.7290, i64 1
  %200 = load i8, ptr %.7290, align 1, !tbaa !12
  %201 = tail call i32 @wp_exp2_schar(i8 noundef signext %200) #5
  %202 = getelementptr inbounds i8, ptr %.ptr292, i64 16
  store i32 %201, ptr %202, align 4, !tbaa !41
  %203 = getelementptr inbounds i8, ptr %.7290, i64 2
  %204 = load i8, ptr %199, align 1, !tbaa !12
  %205 = tail call i32 @wp_exp2_schar(i8 noundef signext %204) #5
  %206 = getelementptr inbounds i8, ptr %.ptr292, i64 20
  store i32 %205, ptr %206, align 4, !tbaa !41
  %207 = load i32, ptr %142, align 8, !tbaa !28
  %208 = and i32 %207, 1073741828
  %.not227 = icmp eq i32 %208, 0
  br i1 %.not227, label %209, label %.critedge

209:                                              ; preds = %198
  %210 = getelementptr inbounds i8, ptr %.7290, i64 3
  %211 = load i8, ptr %203, align 1, !tbaa !12
  %212 = tail call i32 @wp_exp2_schar(i8 noundef signext %211) #5
  %213 = getelementptr inbounds i8, ptr %.ptr292, i64 48
  store i32 %212, ptr %213, align 4, !tbaa !41
  %214 = getelementptr inbounds i8, ptr %.7290, i64 4
  br label %.critedge.sink.split

215:                                              ; preds = %.lr.ph293
  %216 = icmp slt i32 %190, 0
  br i1 %216, label %219, label %.preheader

.preheader:                                       ; preds = %215
  %.not223283 = icmp eq i32 %190, 0
  br i1 %.not223283, label %.critedge, label %.lr.ph286

.lr.ph286:                                        ; preds = %.preheader
  %217 = getelementptr inbounds i8, ptr %.ptr292, i64 16
  %218 = getelementptr inbounds i8, ptr %.ptr292, i64 48
  br label %227

219:                                              ; preds = %215
  %220 = getelementptr inbounds i8, ptr %.7290, i64 2
  %221 = icmp ugt ptr %220, %8
  br i1 %221, label %.thread, label %222

222:                                              ; preds = %219
  %223 = getelementptr inbounds i8, ptr %.7290, i64 1
  %224 = load i8, ptr %.7290, align 1, !tbaa !12
  %225 = tail call i32 @wp_exp2_schar(i8 noundef signext %224) #5
  %226 = getelementptr inbounds i8, ptr %.ptr292, i64 16
  store i32 %225, ptr %226, align 4, !tbaa !41
  br label %.critedge.sink.split

227:                                              ; preds = %.lr.ph286, %246
  %indvars.iv306 = phi i64 [ 0, %.lr.ph286 ], [ %indvars.iv.next307, %246 ]
  %.in298 = phi i32 [ %190, %.lr.ph286 ], [ %228, %246 ]
  %.8284 = phi ptr [ %.7290, %.lr.ph286 ], [ %.9, %246 ]
  %228 = add nsw i32 %.in298, -1
  %229 = load i32, ptr %142, align 8, !tbaa !28
  %230 = and i32 %229, 1073741828
  %.not224 = icmp eq i32 %230, 0
  %231 = select i1 %.not224, i64 2, i64 1
  %232 = getelementptr inbounds i8, ptr %.8284, i64 %231
  %233 = icmp ugt ptr %232, %8
  br i1 %233, label %.thread, label %234

234:                                              ; preds = %227
  %235 = getelementptr inbounds i8, ptr %.8284, i64 1
  %236 = load i8, ptr %.8284, align 1, !tbaa !12
  %237 = tail call i32 @wp_exp2_schar(i8 noundef signext %236) #5
  %238 = getelementptr inbounds [8 x i32], ptr %217, i64 0, i64 %indvars.iv306
  store i32 %237, ptr %238, align 4, !tbaa !41
  %239 = load i32, ptr %142, align 8, !tbaa !28
  %240 = and i32 %239, 1073741828
  %.not225 = icmp eq i32 %240, 0
  br i1 %.not225, label %241, label %246

241:                                              ; preds = %234
  %242 = getelementptr inbounds i8, ptr %.8284, i64 2
  %243 = load i8, ptr %235, align 1, !tbaa !12
  %244 = tail call i32 @wp_exp2_schar(i8 noundef signext %243) #5
  %245 = getelementptr inbounds [8 x i32], ptr %218, i64 0, i64 %indvars.iv306
  store i32 %244, ptr %245, align 4, !tbaa !41
  br label %246

246:                                              ; preds = %241, %234
  %.9 = phi ptr [ %235, %234 ], [ %242, %241 ]
  %indvars.iv.next307 = add nuw nsw i64 %indvars.iv306, 1
  %.not223 = icmp eq i32 %228, 0
  br i1 %.not223, label %.critedge, label %227, !llvm.loop !42

.critedge.sink.split:                             ; preds = %209, %222
  %.sink325 = phi ptr [ %223, %222 ], [ %210, %209 ]
  %.sink323 = phi i64 [ 48, %222 ], [ 52, %209 ]
  %.10.ph = phi ptr [ %220, %222 ], [ %214, %209 ]
  %247 = load i8, ptr %.sink325, align 1, !tbaa !12
  %248 = tail call i32 @wp_exp2_schar(i8 noundef signext %247) #5
  %249 = getelementptr inbounds i8, ptr %.ptr292, i64 %.sink323
  store i32 %248, ptr %249, align 4, !tbaa !41
  br label %.critedge

.critedge:                                        ; preds = %246, %.critedge.sink.split, %.preheader, %198
  %.10 = phi ptr [ %203, %198 ], [ %.7290, %.preheader ], [ %.10.ph, %.critedge.sink.split ], [ %.9, %246 ]
  %250 = icmp sgt i64 %.6187.add291.in, 528
  %251 = icmp ult ptr %.10, %8
  %252 = select i1 %250, i1 %251, i1 false
  br i1 %252, label %.lr.ph293, label %._crit_edge294, !llvm.loop !43

._crit_edge294:                                   ; preds = %.critedge, %._crit_edge276, %.preheader245
  %.7.lcssa = phi ptr [ %.5167.lcssa, %.preheader245 ], [ %.5167.lcssa, %._crit_edge276 ], [ %.10, %.critedge ]
  %253 = icmp eq ptr %.7.lcssa, %8
  %254 = zext i1 %253 to i32
  br label %.thread

switch.hole_check:                                ; preds = %74
  %switch.shifted = lshr i32 130561, %78
  %switch.lobit = trunc i32 %switch.shifted to i1
  br i1 %switch.lobit, label %.thread, label %80

.thread:                                          ; preds = %switch.hole_check, %80, %125, %132, %135, %219, %192, %227, %109, %105, %101, %97, %20, %22, %.loopexit, %16, %10, %2, %._crit_edge294
  %.6 = phi i32 [ %254, %._crit_edge294 ], [ 0, %2 ], [ 0, %10 ], [ 1, %16 ], [ 0, %.loopexit ], [ 0, %22 ], [ 0, %20 ], [ 0, %97 ], [ 0, %101 ], [ 0, %105 ], [ 0, %109 ], [ 0, %227 ], [ 0, %192 ], [ 0, %219 ], [ 0, %135 ], [ 0, %132 ], [ 0, %125 ], [ 0, %80 ], [ 0, %switch.hole_check ]
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %3) #5
  ret i32 %.6
}

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

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

declare i32 @get_num_fast_specs() local_unnamed_addr #2

declare ptr @get_fast_specs() local_unnamed_addr #2

declare i32 @get_num_default_specs() local_unnamed_addr #2

declare ptr @get_default_specs() local_unnamed_addr #2

declare i32 @get_num_high_specs() local_unnamed_addr #2

declare ptr @get_high_specs() local_unnamed_addr #2

declare i32 @get_num_very_high_specs() local_unnamed_addr #2

declare ptr @get_very_high_specs() local_unnamed_addr #2

declare i32 @restore_weight_nybble(i8 noundef signext) local_unnamed_addr #2

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

declare i32 @wp_exp2_schar(i8 noundef signext) local_unnamed_addr #2

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress 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 8}
!6 = !{!"", !7, i64 0, !10, i64 8, !8, i64 16}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!6, !7, i64 0}
!12 = !{!8, !8, i64 0}
!13 = !{!14, !7, i64 148}
!14 = !{!"", !15, i64 0, !17, i64 12, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !18, i64 128, !18, i64 136, !7, i64 144, !7, i64 148, !7, i64 152, !8, i64 156, !8, i64 157, !8, i64 158, !8, i64 159, !8, i64 160, !8, i64 161, !8, i64 162, !7, i64 164, !7, i64 168, !7, i64 172, !7, i64 176, !7, i64 180, !7, i64 184, !7, i64 188, !7, i64 192, !19, i64 200, !19, i64 248, !19, i64 296, !20, i64 344, !8, i64 348, !8, i64 349, !8, i64 350, !8, i64 351, !8, i64 352, !8, i64 353, !8, i64 354, !8, i64 355, !21, i64 360, !8, i64 432, !23, i64 1968, !10, i64 2064, !24, i64 2072}
!15 = !{!"", !8, i64 0, !16, i64 4, !16, i64 6, !7, i64 8}
!16 = !{!"short", !8, i64 0}
!17 = !{!"words_data", !8, i64 0, !8, i64 8, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !8, i64 36}
!18 = !{!"long", !8, i64 0}
!19 = !{!"bs", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !7, i64 32, !7, i64 36, !7, i64 40}
!20 = !{!"float", !8, i64 0}
!21 = !{!"", !8, i64 0, !8, i64 8, !8, i64 16, !22, i64 24, !22, i64 32, !22, i64 40, !10, i64 48, !10, i64 56, !7, i64 64}
!22 = !{!"double", !8, i64 0}
!23 = !{!"decorr_pass", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !8, i64 16, !8, i64 48, !7, i64 80, !7, i64 84, !7, i64 88, !7, i64 92}
!24 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !8, i64 40, !8, i64 41, !7, i64 44, !7, i64 48, !7, i64 52, !10, i64 56, !7, i64 64, !7, i64 68, !7, i64 72, !8, i64 76, !10, i64 160}
!25 = !{!23, !7, i64 0}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = !{!14, !7, i64 8}
!29 = !{!23, !7, i64 4}
!30 = distinct !{!30, !27}
!31 = !{!32, !8, i64 1}
!32 = !{!"", !8, i64 0, !8, i64 1, !8, i64 2}
!33 = distinct !{!33, !27}
!34 = distinct !{!34, !27}
!35 = !{!23, !7, i64 8}
!36 = !{!23, !7, i64 12}
!37 = distinct !{!37, !27}
!38 = distinct !{!38, !39}
!39 = !{!"llvm.loop.unroll.disable"}
!40 = distinct !{!40, !27}
!41 = !{!7, !7, i64 0}
!42 = distinct !{!42, !27}
!43 = distinct !{!43, !27}


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