; LLVM IR from ggml-org/ggml :: src (ggml-quants)

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

@iq3_data = external hidden global [2 x %struct.iq3_entry_t], align 16
@iq3xs_init_impl.kgrid_256 = external hidden constant [256 x i16], align 16
@iq3xs_init_impl.kgrid_512 = external hidden constant [512 x i16], align 16

; 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 allocsize(0)
declare noalias ptr @malloc(i64 noundef) #1

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

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

; Function Attrs: nounwind uwtable
define dso_local void @iq3xs_init_impl(i32 noundef %0) #4 {
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca i16, align 2
  %21 = alloca i32, align 4
  %22 = alloca i16, align 2
  %23 = alloca [4 x i8], align 1
  %24 = alloca ptr, align 8
  %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 ptr, align 8
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca ptr, align 8
  %44 = alloca i32, align 4
  %45 = alloca i32, align 4
  %46 = alloca i32, align 4
  %47 = alloca ptr, align 8
  %48 = alloca i32, align 4
  %49 = alloca i32, align 4
  %50 = alloca i32, align 4
  store i32 %0, ptr %2, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #6
  %51 = load i32, ptr %2, align 4, !tbaa !5
  %52 = call i32 @iq3_data_index(i32 noundef %51)
  store i32 %52, ptr %3, align 4, !tbaa !5
  %53 = load i32, ptr %3, align 4, !tbaa !5
  %54 = sext i32 %53 to i64
  %55 = getelementptr inbounds [2 x %struct.iq3_entry_t], ptr @iq3_data, i64 0, i64 %54
  %56 = getelementptr inbounds %struct.iq3_entry_t, ptr %55, i32 0, i32 0
  %57 = load ptr, ptr %56, align 8, !tbaa !9
  %58 = icmp ne ptr %57, null
  br i1 %58, label %59, label %60

59:                                               ; preds = %1
  store i32 1, ptr %4, align 4
  br label %524

60:                                               ; preds = %1
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #6
  store i32 4096, ptr %5, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #6
  %61 = load i32, ptr %2, align 4, !tbaa !5
  %62 = icmp eq i32 %61, 256
  %63 = zext i1 %62 to i64
  %64 = select i1 %62, i32 2, i32 3
  store i32 %64, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #6
  %65 = load i32, ptr %2, align 4, !tbaa !5
  %66 = icmp eq i32 %65, 256
  %67 = zext i1 %66 to i64
  %68 = select i1 %66, ptr @iq3xs_init_impl.kgrid_256, ptr @iq3xs_init_impl.kgrid_512
  store ptr %68, ptr %7, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #6
  %69 = load i32, ptr %2, align 4, !tbaa !5
  %70 = sext i32 %69 to i64
  %71 = mul i64 %70, 4
  %72 = call noalias ptr @malloc(i64 noundef %71) #7
  store ptr %72, ptr %11, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #6
  store i32 0, ptr %12, align 4, !tbaa !5
  br label %73

73:                                               ; preds = %110, %60
  %74 = load i32, ptr %12, align 4, !tbaa !5
  %75 = load i32, ptr %2, align 4, !tbaa !5
  %76 = icmp slt i32 %74, %75
  br i1 %76, label %78, label %77

77:                                               ; preds = %73
  store i32 2, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #6
  br label %113

78:                                               ; preds = %73
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  %79 = load ptr, ptr %11, align 8, !tbaa !12
  %80 = load i32, ptr %12, align 4, !tbaa !5
  %81 = sext i32 %80 to i64
  %82 = getelementptr inbounds i32, ptr %79, i64 %81
  store ptr %82, ptr %13, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #6
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %83

83:                                               ; preds = %106, %78
  %84 = load i32, ptr %14, align 4, !tbaa !5
  %85 = icmp slt i32 %84, 4
  br i1 %85, label %87, label %86

86:                                               ; preds = %83
  store i32 5, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #6
  br label %109

87:                                               ; preds = %83
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #6
  %88 = load ptr, ptr %7, align 8, !tbaa !12
  %89 = load i32, ptr %12, align 4, !tbaa !5
  %90 = sext i32 %89 to i64
  %91 = getelementptr inbounds i16, ptr %88, i64 %90
  %92 = load i16, ptr %91, align 2, !tbaa !13
  %93 = zext i16 %92 to i32
  %94 = load i32, ptr %14, align 4, !tbaa !5
  %95 = mul nsw i32 3, %94
  %96 = ashr i32 %93, %95
  %97 = and i32 %96, 7
  store i32 %97, ptr %15, align 4, !tbaa !5
  %98 = load i32, ptr %15, align 4, !tbaa !5
  %99 = mul nsw i32 2, %98
  %100 = add nsw i32 %99, 1
  %101 = trunc i32 %100 to i8
  %102 = load ptr, ptr %13, align 8, !tbaa !12
  %103 = load i32, ptr %14, align 4, !tbaa !5
  %104 = sext i32 %103 to i64
  %105 = getelementptr inbounds i8, ptr %102, i64 %104
  store i8 %101, ptr %105, align 1, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #6
  br label %106

106:                                              ; preds = %87
  %107 = load i32, ptr %14, align 4, !tbaa !5
  %108 = add nsw i32 %107, 1
  store i32 %108, ptr %14, align 4, !tbaa !5
  br label %83, !llvm.loop !16

109:                                              ; preds = %86
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  br label %110

110:                                              ; preds = %109
  %111 = load i32, ptr %12, align 4, !tbaa !5
  %112 = add nsw i32 %111, 1
  store i32 %112, ptr %12, align 4, !tbaa !5
  br label %73, !llvm.loop !18

113:                                              ; preds = %77
  %114 = load ptr, ptr %11, align 8, !tbaa !12
  store ptr %114, ptr %8, align 8, !tbaa !12
  %115 = load ptr, ptr %11, align 8, !tbaa !12
  %116 = load i32, ptr %3, align 4, !tbaa !5
  %117 = sext i32 %116 to i64
  %118 = getelementptr inbounds [2 x %struct.iq3_entry_t], ptr @iq3_data, i64 0, i64 %117
  %119 = getelementptr inbounds %struct.iq3_entry_t, ptr %118, i32 0, i32 0
  store ptr %115, ptr %119, align 8, !tbaa !9
  %120 = call noalias ptr @malloc(i64 noundef 16384) #7
  store ptr %120, ptr %9, align 8, !tbaa !12
  %121 = load ptr, ptr %9, align 8, !tbaa !12
  %122 = load i32, ptr %3, align 4, !tbaa !5
  %123 = sext i32 %122 to i64
  %124 = getelementptr inbounds [2 x %struct.iq3_entry_t], ptr @iq3_data, i64 0, i64 %123
  %125 = getelementptr inbounds %struct.iq3_entry_t, ptr %124, i32 0, i32 1
  store ptr %121, ptr %125, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #6
  store i32 0, ptr %16, align 4, !tbaa !5
  br label %126

126:                                              ; preds = %135, %113
  %127 = load i32, ptr %16, align 4, !tbaa !5
  %128 = icmp slt i32 %127, 4096
  br i1 %128, label %130, label %129

129:                                              ; preds = %126
  store i32 8, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #6
  br label %138

130:                                              ; preds = %126
  %131 = load ptr, ptr %9, align 8, !tbaa !12
  %132 = load i32, ptr %16, align 4, !tbaa !5
  %133 = sext i32 %132 to i64
  %134 = getelementptr inbounds i32, ptr %131, i64 %133
  store i32 -1, ptr %134, align 4, !tbaa !5
  br label %135

135:                                              ; preds = %130
  %136 = load i32, ptr %16, align 4, !tbaa !5
  %137 = add nsw i32 %136, 1
  store i32 %137, ptr %16, align 4, !tbaa !5
  br label %126, !llvm.loop !20

138:                                              ; preds = %129
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  store ptr %17, ptr %18, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #6
  store i32 0, ptr %19, align 4, !tbaa !5
  br label %139

139:                                              ; preds = %182, %138
  %140 = load i32, ptr %19, align 4, !tbaa !5
  %141 = load i32, ptr %2, align 4, !tbaa !5
  %142 = icmp slt i32 %140, %141
  br i1 %142, label %144, label %143

143:                                              ; preds = %139
  store i32 11, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #6
  br label %185

144:                                              ; preds = %139
  %145 = load ptr, ptr %8, align 8, !tbaa !12
  %146 = load i32, ptr %19, align 4, !tbaa !5
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds i32, ptr %145, i64 %147
  %149 = load i32, ptr %148, align 4, !tbaa !5
  store i32 %149, ptr %17, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %20) #6
  store i16 0, ptr %20, align 2, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #6
  store i32 0, ptr %21, align 4, !tbaa !5
  br label %150

150:                                              ; preds = %173, %144
  %151 = load i32, ptr %21, align 4, !tbaa !5
  %152 = icmp slt i32 %151, 4
  br i1 %152, label %154, label %153

153:                                              ; preds = %150
  store i32 14, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #6
  br label %176

154:                                              ; preds = %150
  call void @llvm.lifetime.start.p0(i64 2, ptr %22) #6
  %155 = load ptr, ptr %18, align 8, !tbaa !12
  %156 = load i32, ptr %21, align 4, !tbaa !5
  %157 = sext i32 %156 to i64
  %158 = getelementptr inbounds i8, ptr %155, i64 %157
  %159 = load i8, ptr %158, align 1, !tbaa !15
  %160 = zext i8 %159 to i32
  %161 = sub nsw i32 %160, 1
  %162 = sdiv i32 %161, 2
  %163 = trunc i32 %162 to i16
  store i16 %163, ptr %22, align 2, !tbaa !13
  %164 = load i16, ptr %22, align 2, !tbaa !13
  %165 = zext i16 %164 to i32
  %166 = load i32, ptr %21, align 4, !tbaa !5
  %167 = mul nsw i32 3, %166
  %168 = shl i32 %165, %167
  %169 = load i16, ptr %20, align 2, !tbaa !13
  %170 = zext i16 %169 to i32
  %171 = or i32 %170, %168
  %172 = trunc i32 %171 to i16
  store i16 %172, ptr %20, align 2, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 2, ptr %22) #6
  br label %173

173:                                              ; preds = %154
  %174 = load i32, ptr %21, align 4, !tbaa !5
  %175 = add nsw i32 %174, 1
  store i32 %175, ptr %21, align 4, !tbaa !5
  br label %150, !llvm.loop !21

176:                                              ; preds = %153
  %177 = load i32, ptr %19, align 4, !tbaa !5
  %178 = load ptr, ptr %9, align 8, !tbaa !12
  %179 = load i16, ptr %20, align 2, !tbaa !13
  %180 = zext i16 %179 to i64
  %181 = getelementptr inbounds i32, ptr %178, i64 %180
  store i32 %177, ptr %181, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 2, ptr %20) #6
  br label %182

182:                                              ; preds = %176
  %183 = load i32, ptr %19, align 4, !tbaa !5
  %184 = add nsw i32 %183, 1
  store i32 %184, ptr %19, align 4, !tbaa !5
  br label %139, !llvm.loop !22

185:                                              ; preds = %143
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %186 = load i32, ptr %2, align 4, !tbaa !5
  %187 = mul nsw i32 2, %186
  %188 = sext i32 %187 to i64
  %189 = mul i64 %188, 4
  %190 = call noalias ptr @malloc(i64 noundef %189) #7
  store ptr %190, ptr %24, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  store i32 0, ptr %25, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #6
  store i32 0, ptr %26, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #6
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %191

191:                                              ; preds = %336, %185
  %192 = load i32, ptr %27, align 4, !tbaa !5
  %193 = icmp slt i32 %192, 4096
  br i1 %193, label %195, label %194

194:                                              ; preds = %191
  store i32 17, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #6
  br label %339

195:                                              ; preds = %191
  %196 = load ptr, ptr %9, align 8, !tbaa !12
  %197 = load i32, ptr %27, align 4, !tbaa !5
  %198 = sext i32 %197 to i64
  %199 = getelementptr inbounds i32, ptr %196, i64 %198
  %200 = load i32, ptr %199, align 4, !tbaa !5
  %201 = icmp sge i32 %200, 0
  br i1 %201, label %202, label %203

202:                                              ; preds = %195
  br label %336

203:                                              ; preds = %195
  %204 = load i32, ptr %26, align 4, !tbaa !5
  %205 = add nsw i32 %204, 1
  store i32 %205, ptr %26, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #6
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %206

206:                                              ; preds = %223, %203
  %207 = load i32, ptr %28, align 4, !tbaa !5
  %208 = icmp slt i32 %207, 4
  br i1 %208, label %210, label %209

209:                                              ; preds = %206
  store i32 20, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #6
  br label %226

210:                                              ; preds = %206
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #6
  %211 = load i32, ptr %27, align 4, !tbaa !5
  %212 = load i32, ptr %28, align 4, !tbaa !5
  %213 = mul nsw i32 3, %212
  %214 = ashr i32 %211, %213
  %215 = and i32 %214, 7
  store i32 %215, ptr %29, align 4, !tbaa !5
  %216 = load i32, ptr %29, align 4, !tbaa !5
  %217 = mul nsw i32 2, %216
  %218 = add nsw i32 %217, 1
  %219 = trunc i32 %218 to i8
  %220 = load i32, ptr %28, align 4, !tbaa !5
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds [4 x i8], ptr %23, i64 0, i64 %221
  store i8 %219, ptr %222, align 1, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #6
  br label %223

223:                                              ; preds = %210
  %224 = load i32, ptr %28, align 4, !tbaa !5
  %225 = add nsw i32 %224, 1
  store i32 %225, ptr %28, align 4, !tbaa !5
  br label %206, !llvm.loop !23

226:                                              ; preds = %209
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  store i32 0, ptr %30, align 4, !tbaa !5
  br label %227

227:                                              ; preds = %287, %226
  %228 = load i32, ptr %30, align 4, !tbaa !5
  %229 = load i32, ptr %2, align 4, !tbaa !5
  %230 = icmp slt i32 %228, %229
  br i1 %230, label %232, label %231

231:                                              ; preds = %227
  store i32 23, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  br label %290

232:                                              ; preds = %227
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #6
  %233 = load ptr, ptr %8, align 8, !tbaa !12
  %234 = load i32, ptr %30, align 4, !tbaa !5
  %235 = sext i32 %234 to i64
  %236 = getelementptr inbounds i32, ptr %233, i64 %235
  store ptr %236, ptr %31, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #6
  store i32 0, ptr %32, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #6
  store i32 0, ptr %33, align 4, !tbaa !5
  br label %237

237:                                              ; preds = %269, %232
  %238 = load i32, ptr %33, align 4, !tbaa !5
  %239 = icmp slt i32 %238, 4
  br i1 %239, label %241, label %240

240:                                              ; preds = %237
  store i32 26, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #6
  br label %272

241:                                              ; preds = %237
  %242 = load ptr, ptr %31, align 8, !tbaa !12
  %243 = load i32, ptr %33, align 4, !tbaa !5
  %244 = sext i32 %243 to i64
  %245 = getelementptr inbounds i8, ptr %242, i64 %244
  %246 = load i8, ptr %245, align 1, !tbaa !15
  %247 = sext i8 %246 to i32
  %248 = load i32, ptr %33, align 4, !tbaa !5
  %249 = sext i32 %248 to i64
  %250 = getelementptr inbounds [4 x i8], ptr %23, i64 0, i64 %249
  %251 = load i8, ptr %250, align 1, !tbaa !15
  %252 = sext i8 %251 to i32
  %253 = sub nsw i32 %247, %252
  %254 = load ptr, ptr %31, align 8, !tbaa !12
  %255 = load i32, ptr %33, align 4, !tbaa !5
  %256 = sext i32 %255 to i64
  %257 = getelementptr inbounds i8, ptr %254, i64 %256
  %258 = load i8, ptr %257, align 1, !tbaa !15
  %259 = sext i8 %258 to i32
  %260 = load i32, ptr %33, align 4, !tbaa !5
  %261 = sext i32 %260 to i64
  %262 = getelementptr inbounds [4 x i8], ptr %23, i64 0, i64 %261
  %263 = load i8, ptr %262, align 1, !tbaa !15
  %264 = sext i8 %263 to i32
  %265 = sub nsw i32 %259, %264
  %266 = mul nsw i32 %253, %265
  %267 = load i32, ptr %32, align 4, !tbaa !5
  %268 = add nsw i32 %267, %266
  store i32 %268, ptr %32, align 4, !tbaa !5
  br label %269

269:                                              ; preds = %241
  %270 = load i32, ptr %33, align 4, !tbaa !5
  %271 = add nsw i32 %270, 1
  store i32 %271, ptr %33, align 4, !tbaa !5
  br label %237, !llvm.loop !24

272:                                              ; preds = %240
  %273 = load i32, ptr %32, align 4, !tbaa !5
  %274 = load ptr, ptr %24, align 8, !tbaa !12
  %275 = load i32, ptr %30, align 4, !tbaa !5
  %276 = mul nsw i32 2, %275
  %277 = add nsw i32 %276, 0
  %278 = sext i32 %277 to i64
  %279 = getelementptr inbounds i32, ptr %274, i64 %278
  store i32 %273, ptr %279, align 4, !tbaa !5
  %280 = load i32, ptr %30, align 4, !tbaa !5
  %281 = load ptr, ptr %24, align 8, !tbaa !12
  %282 = load i32, ptr %30, align 4, !tbaa !5
  %283 = mul nsw i32 2, %282
  %284 = add nsw i32 %283, 1
  %285 = sext i32 %284 to i64
  %286 = getelementptr inbounds i32, ptr %281, i64 %285
  store i32 %280, ptr %286, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #6
  br label %287

287:                                              ; preds = %272
  %288 = load i32, ptr %30, align 4, !tbaa !5
  %289 = add nsw i32 %288, 1
  store i32 %289, ptr %30, align 4, !tbaa !5
  br label %227, !llvm.loop !25

290:                                              ; preds = %231
  %291 = load ptr, ptr %24, align 8, !tbaa !12
  %292 = load i32, ptr %2, align 4, !tbaa !5
  %293 = sext i32 %292 to i64
  call void @qsort(ptr noundef %291, i64 noundef %293, i64 noundef 8, ptr noundef @iq3_compare_func)
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #6
  store i32 0, ptr %34, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #6
  %294 = load ptr, ptr %24, align 8, !tbaa !12
  %295 = getelementptr inbounds i32, ptr %294, i64 0
  %296 = load i32, ptr %295, align 4, !tbaa !5
  store i32 %296, ptr %35, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #6
  store i32 1, ptr %36, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #6
  store i32 0, ptr %37, align 4, !tbaa !5
  br label %297

297:                                              ; preds = %328, %290
  %298 = load i32, ptr %37, align 4, !tbaa !5
  %299 = load i32, ptr %2, align 4, !tbaa !5
  %300 = icmp slt i32 %298, %299
  br i1 %300, label %302, label %301

301:                                              ; preds = %297
  store i32 29, ptr %4, align 4
  br label %331

302:                                              ; preds = %297
  %303 = load ptr, ptr %24, align 8, !tbaa !12
  %304 = load i32, ptr %37, align 4, !tbaa !5
  %305 = mul nsw i32 2, %304
  %306 = sext i32 %305 to i64
  %307 = getelementptr inbounds i32, ptr %303, i64 %306
  %308 = load i32, ptr %307, align 4, !tbaa !5
  %309 = load i32, ptr %35, align 4, !tbaa !5
  %310 = icmp sgt i32 %308, %309
  br i1 %310, label %311, label %325

311:                                              ; preds = %302
  %312 = load i32, ptr %36, align 4, !tbaa !5
  %313 = load i32, ptr %6, align 4, !tbaa !5
  %314 = icmp eq i32 %312, %313
  br i1 %314, label %315, label %316

315:                                              ; preds = %311
  store i32 29, ptr %4, align 4
  br label %331

316:                                              ; preds = %311
  %317 = load ptr, ptr %24, align 8, !tbaa !12
  %318 = load i32, ptr %37, align 4, !tbaa !5
  %319 = mul nsw i32 2, %318
  %320 = sext i32 %319 to i64
  %321 = getelementptr inbounds i32, ptr %317, i64 %320
  %322 = load i32, ptr %321, align 4, !tbaa !5
  store i32 %322, ptr %35, align 4, !tbaa !5
  %323 = load i32, ptr %36, align 4, !tbaa !5
  %324 = add nsw i32 %323, 1
  store i32 %324, ptr %36, align 4, !tbaa !5
  br label %325

325:                                              ; preds = %316, %302
  %326 = load i32, ptr %34, align 4, !tbaa !5
  %327 = add nsw i32 %326, 1
  store i32 %327, ptr %34, align 4, !tbaa !5
  br label %328

328:                                              ; preds = %325
  %329 = load i32, ptr %37, align 4, !tbaa !5
  %330 = add nsw i32 %329, 1
  store i32 %330, ptr %37, align 4, !tbaa !5
  br label %297, !llvm.loop !26

331:                                              ; preds = %315, %301
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #6
  br label %332

332:                                              ; preds = %331
  %333 = load i32, ptr %34, align 4, !tbaa !5
  %334 = load i32, ptr %25, align 4, !tbaa !5
  %335 = add nsw i32 %334, %333
  store i32 %335, ptr %25, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #6
  br label %336

336:                                              ; preds = %332, %202
  %337 = load i32, ptr %27, align 4, !tbaa !5
  %338 = add nsw i32 %337, 1
  store i32 %338, ptr %27, align 4, !tbaa !5
  br label %191, !llvm.loop !27

339:                                              ; preds = %194
  %340 = load i32, ptr %25, align 4, !tbaa !5
  %341 = load i32, ptr %26, align 4, !tbaa !5
  %342 = add nsw i32 %340, %341
  %343 = sext i32 %342 to i64
  %344 = mul i64 %343, 2
  %345 = call noalias ptr @malloc(i64 noundef %344) #7
  store ptr %345, ptr %10, align 8, !tbaa !12
  %346 = load ptr, ptr %10, align 8, !tbaa !12
  %347 = load i32, ptr %3, align 4, !tbaa !5
  %348 = sext i32 %347 to i64
  %349 = getelementptr inbounds [2 x %struct.iq3_entry_t], ptr @iq3_data, i64 0, i64 %348
  %350 = getelementptr inbounds %struct.iq3_entry_t, ptr %349, i32 0, i32 2
  store ptr %346, ptr %350, align 8, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #6
  store i32 0, ptr %38, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #6
  store i32 0, ptr %39, align 4, !tbaa !5
  br label %351

351:                                              ; preds = %519, %339
  %352 = load i32, ptr %39, align 4, !tbaa !5
  %353 = icmp slt i32 %352, 4096
  br i1 %353, label %355, label %354

354:                                              ; preds = %351
  store i32 32, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #6
  br label %522

355:                                              ; preds = %351
  %356 = load ptr, ptr %9, align 8, !tbaa !12
  %357 = load i32, ptr %39, align 4, !tbaa !5
  %358 = sext i32 %357 to i64
  %359 = getelementptr inbounds i32, ptr %356, i64 %358
  %360 = load i32, ptr %359, align 4, !tbaa !5
  %361 = icmp sge i32 %360, 0
  br i1 %361, label %362, label %363

362:                                              ; preds = %355
  br label %519

363:                                              ; preds = %355
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #6
  store i32 0, ptr %40, align 4, !tbaa !5
  br label %364

364:                                              ; preds = %381, %363
  %365 = load i32, ptr %40, align 4, !tbaa !5
  %366 = icmp slt i32 %365, 4
  br i1 %366, label %368, label %367

367:                                              ; preds = %364
  store i32 35, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #6
  br label %384

368:                                              ; preds = %364
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #6
  %369 = load i32, ptr %39, align 4, !tbaa !5
  %370 = load i32, ptr %40, align 4, !tbaa !5
  %371 = mul nsw i32 3, %370
  %372 = ashr i32 %369, %371
  %373 = and i32 %372, 7
  store i32 %373, ptr %41, align 4, !tbaa !5
  %374 = load i32, ptr %41, align 4, !tbaa !5
  %375 = mul nsw i32 2, %374
  %376 = add nsw i32 %375, 1
  %377 = trunc i32 %376 to i8
  %378 = load i32, ptr %40, align 4, !tbaa !5
  %379 = sext i32 %378 to i64
  %380 = getelementptr inbounds [4 x i8], ptr %23, i64 0, i64 %379
  store i8 %377, ptr %380, align 1, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #6
  br label %381

381:                                              ; preds = %368
  %382 = load i32, ptr %40, align 4, !tbaa !5
  %383 = add nsw i32 %382, 1
  store i32 %383, ptr %40, align 4, !tbaa !5
  br label %364, !llvm.loop !29

384:                                              ; preds = %367
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #6
  store i32 0, ptr %42, align 4, !tbaa !5
  br label %385

385:                                              ; preds = %445, %384
  %386 = load i32, ptr %42, align 4, !tbaa !5
  %387 = load i32, ptr %2, align 4, !tbaa !5
  %388 = icmp slt i32 %386, %387
  br i1 %388, label %390, label %389

389:                                              ; preds = %385
  store i32 38, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #6
  br label %448

390:                                              ; preds = %385
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #6
  %391 = load ptr, ptr %8, align 8, !tbaa !12
  %392 = load i32, ptr %42, align 4, !tbaa !5
  %393 = sext i32 %392 to i64
  %394 = getelementptr inbounds i32, ptr %391, i64 %393
  store ptr %394, ptr %43, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #6
  store i32 0, ptr %44, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #6
  store i32 0, ptr %45, align 4, !tbaa !5
  br label %395

395:                                              ; preds = %427, %390
  %396 = load i32, ptr %45, align 4, !tbaa !5
  %397 = icmp slt i32 %396, 4
  br i1 %397, label %399, label %398

398:                                              ; preds = %395
  store i32 41, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #6
  br label %430

399:                                              ; preds = %395
  %400 = load ptr, ptr %43, align 8, !tbaa !12
  %401 = load i32, ptr %45, align 4, !tbaa !5
  %402 = sext i32 %401 to i64
  %403 = getelementptr inbounds i8, ptr %400, i64 %402
  %404 = load i8, ptr %403, align 1, !tbaa !15
  %405 = sext i8 %404 to i32
  %406 = load i32, ptr %45, align 4, !tbaa !5
  %407 = sext i32 %406 to i64
  %408 = getelementptr inbounds [4 x i8], ptr %23, i64 0, i64 %407
  %409 = load i8, ptr %408, align 1, !tbaa !15
  %410 = sext i8 %409 to i32
  %411 = sub nsw i32 %405, %410
  %412 = load ptr, ptr %43, align 8, !tbaa !12
  %413 = load i32, ptr %45, align 4, !tbaa !5
  %414 = sext i32 %413 to i64
  %415 = getelementptr inbounds i8, ptr %412, i64 %414
  %416 = load i8, ptr %415, align 1, !tbaa !15
  %417 = sext i8 %416 to i32
  %418 = load i32, ptr %45, align 4, !tbaa !5
  %419 = sext i32 %418 to i64
  %420 = getelementptr inbounds [4 x i8], ptr %23, i64 0, i64 %419
  %421 = load i8, ptr %420, align 1, !tbaa !15
  %422 = sext i8 %421 to i32
  %423 = sub nsw i32 %417, %422
  %424 = mul nsw i32 %411, %423
  %425 = load i32, ptr %44, align 4, !tbaa !5
  %426 = add nsw i32 %425, %424
  store i32 %426, ptr %44, align 4, !tbaa !5
  br label %427

427:                                              ; preds = %399
  %428 = load i32, ptr %45, align 4, !tbaa !5
  %429 = add nsw i32 %428, 1
  store i32 %429, ptr %45, align 4, !tbaa !5
  br label %395, !llvm.loop !30

430:                                              ; preds = %398
  %431 = load i32, ptr %44, align 4, !tbaa !5
  %432 = load ptr, ptr %24, align 8, !tbaa !12
  %433 = load i32, ptr %42, align 4, !tbaa !5
  %434 = mul nsw i32 2, %433
  %435 = add nsw i32 %434, 0
  %436 = sext i32 %435 to i64
  %437 = getelementptr inbounds i32, ptr %432, i64 %436
  store i32 %431, ptr %437, align 4, !tbaa !5
  %438 = load i32, ptr %42, align 4, !tbaa !5
  %439 = load ptr, ptr %24, align 8, !tbaa !12
  %440 = load i32, ptr %42, align 4, !tbaa !5
  %441 = mul nsw i32 2, %440
  %442 = add nsw i32 %441, 1
  %443 = sext i32 %442 to i64
  %444 = getelementptr inbounds i32, ptr %439, i64 %443
  store i32 %438, ptr %444, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #6
  br label %445

445:                                              ; preds = %430
  %446 = load i32, ptr %42, align 4, !tbaa !5
  %447 = add nsw i32 %446, 1
  store i32 %447, ptr %42, align 4, !tbaa !5
  br label %385, !llvm.loop !31

448:                                              ; preds = %389
  %449 = load ptr, ptr %24, align 8, !tbaa !12
  %450 = load i32, ptr %2, align 4, !tbaa !5
  %451 = sext i32 %450 to i64
  call void @qsort(ptr noundef %449, i64 noundef %451, i64 noundef 8, ptr noundef @iq3_compare_func)
  %452 = load i32, ptr %38, align 4, !tbaa !5
  %453 = add nsw i32 %452, 1
  %454 = sub nsw i32 0, %453
  %455 = load ptr, ptr %9, align 8, !tbaa !12
  %456 = load i32, ptr %39, align 4, !tbaa !5
  %457 = sext i32 %456 to i64
  %458 = getelementptr inbounds i32, ptr %455, i64 %457
  store i32 %454, ptr %458, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #6
  %459 = load ptr, ptr %24, align 8, !tbaa !12
  %460 = getelementptr inbounds i32, ptr %459, i64 0
  %461 = load i32, ptr %460, align 4, !tbaa !5
  store i32 %461, ptr %46, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #6
  %462 = load ptr, ptr %10, align 8, !tbaa !12
  %463 = load i32, ptr %38, align 4, !tbaa !5
  %464 = add nsw i32 %463, 1
  store i32 %464, ptr %38, align 4, !tbaa !5
  %465 = sext i32 %463 to i64
  %466 = getelementptr inbounds i16, ptr %462, i64 %465
  store ptr %466, ptr %47, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #6
  store i32 0, ptr %48, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #6
  store i32 1, ptr %49, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #6
  store i32 0, ptr %50, align 4, !tbaa !5
  br label %467

467:                                              ; preds = %511, %448
  %468 = load i32, ptr %50, align 4, !tbaa !5
  %469 = load i32, ptr %2, align 4, !tbaa !5
  %470 = icmp slt i32 %468, %469
  br i1 %470, label %472, label %471

471:                                              ; preds = %467
  store i32 44, ptr %4, align 4
  br label %514

472:                                              ; preds = %467
  %473 = load ptr, ptr %24, align 8, !tbaa !12
  %474 = load i32, ptr %50, align 4, !tbaa !5
  %475 = mul nsw i32 2, %474
  %476 = sext i32 %475 to i64
  %477 = getelementptr inbounds i32, ptr %473, i64 %476
  %478 = load i32, ptr %477, align 4, !tbaa !5
  %479 = load i32, ptr %46, align 4, !tbaa !5
  %480 = icmp sgt i32 %478, %479
  br i1 %480, label %481, label %495

481:                                              ; preds = %472
  %482 = load i32, ptr %49, align 4, !tbaa !5
  %483 = load i32, ptr %6, align 4, !tbaa !5
  %484 = icmp eq i32 %482, %483
  br i1 %484, label %485, label %486

485:                                              ; preds = %481
  store i32 44, ptr %4, align 4
  br label %514

486:                                              ; preds = %481
  %487 = load ptr, ptr %24, align 8, !tbaa !12
  %488 = load i32, ptr %50, align 4, !tbaa !5
  %489 = mul nsw i32 2, %488
  %490 = sext i32 %489 to i64
  %491 = getelementptr inbounds i32, ptr %487, i64 %490
  %492 = load i32, ptr %491, align 4, !tbaa !5
  store i32 %492, ptr %46, align 4, !tbaa !5
  %493 = load i32, ptr %49, align 4, !tbaa !5
  %494 = add nsw i32 %493, 1
  store i32 %494, ptr %49, align 4, !tbaa !5
  br label %495

495:                                              ; preds = %486, %472
  %496 = load ptr, ptr %24, align 8, !tbaa !12
  %497 = load i32, ptr %50, align 4, !tbaa !5
  %498 = mul nsw i32 2, %497
  %499 = add nsw i32 %498, 1
  %500 = sext i32 %499 to i64
  %501 = getelementptr inbounds i32, ptr %496, i64 %500
  %502 = load i32, ptr %501, align 4, !tbaa !5
  %503 = trunc i32 %502 to i16
  %504 = load ptr, ptr %10, align 8, !tbaa !12
  %505 = load i32, ptr %38, align 4, !tbaa !5
  %506 = add nsw i32 %505, 1
  store i32 %506, ptr %38, align 4, !tbaa !5
  %507 = sext i32 %505 to i64
  %508 = getelementptr inbounds i16, ptr %504, i64 %507
  store i16 %503, ptr %508, align 2, !tbaa !13
  %509 = load i32, ptr %48, align 4, !tbaa !5
  %510 = add nsw i32 %509, 1
  store i32 %510, ptr %48, align 4, !tbaa !5
  br label %511

511:                                              ; preds = %495
  %512 = load i32, ptr %50, align 4, !tbaa !5
  %513 = add nsw i32 %512, 1
  store i32 %513, ptr %50, align 4, !tbaa !5
  br label %467, !llvm.loop !32

514:                                              ; preds = %485, %471
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #6
  br label %515

515:                                              ; preds = %514
  %516 = load i32, ptr %48, align 4, !tbaa !5
  %517 = trunc i32 %516 to i16
  %518 = load ptr, ptr %47, align 8, !tbaa !12
  store i16 %517, ptr %518, align 2, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #6
  br label %519

519:                                              ; preds = %515, %362
  %520 = load i32, ptr %39, align 4, !tbaa !5
  %521 = add nsw i32 %520, 1
  store i32 %521, ptr %39, align 4, !tbaa !5
  br label %351, !llvm.loop !33

522:                                              ; preds = %354
  %523 = load ptr, ptr %24, align 8, !tbaa !12
  call void @free(ptr noundef %523) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #6
  store i32 0, ptr %4, align 4
  br label %524

524:                                              ; preds = %522, %59
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #6
  %525 = load i32, ptr %4, align 4
  switch i32 %525, label %527 [
    i32 0, label %526
    i32 1, label %526
  ]

526:                                              ; preds = %524, %524
  ret void

527:                                              ; preds = %524
  unreachable
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @iq3_data_index(i32 noundef) #5

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind allocsize(0) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind 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 #5 = { inlinehint 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 #6 = { nounwind }
attributes #7 = { nounwind allocsize(0) }

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


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

@iq3_data = external hidden local_unnamed_addr global [2 x %struct.iq3_entry_t], align 16
@iq3xs_init_impl.kgrid_256 = external hidden local_unnamed_addr constant [256 x i16], align 16
@iq3xs_init_impl.kgrid_512 = external hidden local_unnamed_addr constant [512 x i16], align 16

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: nofree
declare void @qsort(ptr noundef, i64 noundef, i64 noundef, ptr nocapture noundef) local_unnamed_addr #1

; 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
define dso_local void @iq3xs_init_impl(i32 noundef %0) local_unnamed_addr #3 {
  %2 = tail call i32 @iq3_data_index(i32 noundef %0)
  %3 = sext i32 %2 to i64
  %4 = getelementptr inbounds [2 x %struct.iq3_entry_t], ptr @iq3_data, i64 0, i64 %3
  %5 = load ptr, ptr %4, align 8, !tbaa !5
  %.not = icmp eq ptr %5, null
  br i1 %.not, label %6, label %204

6:                                                ; preds = %1
  %7 = icmp eq i32 %0, 256
  %8 = select i1 %7, i32 2, i32 3
  %9 = select i1 %7, ptr @iq3xs_init_impl.kgrid_256, ptr @iq3xs_init_impl.kgrid_512
  %10 = sext i32 %0 to i64
  %11 = shl nsw i64 %10, 2
  %12 = tail call noalias ptr @malloc(i64 noundef %11) #6
  %13 = icmp sgt i32 %0, 0
  br i1 %13, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %6
  %wide.trip.count = zext nneg i32 %0 to i64
  %min.iters.check = icmp ult i32 %0, 8
  br i1 %min.iters.check, label %.lr.ph.preheader340, label %vector.ph

.lr.ph.preheader340:                              ; preds = %middle.block, %.lr.ph.preheader
  %indvars.iv.ph = phi i64 [ 0, %.lr.ph.preheader ], [ %n.vec, %middle.block ]
  br label %.lr.ph

vector.ph:                                        ; preds = %.lr.ph.preheader
  %n.vec = and i64 %wide.trip.count, 2147483640
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %14 = getelementptr inbounds i32, ptr %12, i64 %index
  %15 = getelementptr inbounds i16, ptr %9, i64 %index
  %wide.load = load <8 x i16>, ptr %15, align 16, !tbaa !10
  %16 = trunc <8 x i16> %wide.load to <8 x i8>
  %17 = shl <8 x i8> %16, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %18 = and <8 x i8> %17, <i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14>
  %19 = or disjoint <8 x i8> %18, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %20 = trunc <8 x i16> %wide.load to <8 x i8>
  %21 = lshr <8 x i8> %20, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
  %22 = and <8 x i8> %21, <i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14>
  %23 = or disjoint <8 x i8> %22, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %24 = lshr <8 x i16> %wide.load, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
  %25 = trunc <8 x i16> %24 to <8 x i8>
  %26 = and <8 x i8> %25, <i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14>
  %27 = or disjoint <8 x i8> %26, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %28 = lshr <8 x i16> %wide.load, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
  %29 = trunc nuw <8 x i16> %28 to <8 x i8>
  %30 = and <8 x i8> %29, <i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14>
  %31 = or disjoint <8 x i8> %30, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %32 = shufflevector <8 x i8> %19, <8 x i8> %23, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
  %33 = shufflevector <8 x i8> %27, <8 x i8> %31, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
  %interleaved.vec = shufflevector <16 x i8> %32, <16 x i8> %33, <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31>
  store <32 x i8> %interleaved.vec, ptr %14, align 1, !tbaa !12
  %index.next = add nuw i64 %index, 8
  %34 = icmp eq i64 %index.next, %n.vec
  br i1 %34, label %middle.block, label %vector.body, !llvm.loop !13

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %._crit_edge, label %.lr.ph.preheader340

._crit_edge:                                      ; preds = %.lr.ph, %middle.block, %6
  store ptr %12, ptr %4, align 8, !tbaa !5
  %35 = tail call noalias dereferenceable_or_null(16384) ptr @malloc(i64 noundef 16384) #6
  %36 = getelementptr inbounds i8, ptr %4, i64 8
  store ptr %35, ptr %36, align 8, !tbaa !17
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(16384) %35, i8 -1, i64 16384, i1 false), !tbaa !18
  br i1 %13, label %.lr.ph197.preheader, label %._crit_edge198

.lr.ph:                                           ; preds = %.lr.ph.preheader340, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %indvars.iv.ph, %.lr.ph.preheader340 ]
  %37 = getelementptr inbounds i32, ptr %12, i64 %indvars.iv
  %38 = getelementptr inbounds i16, ptr %9, i64 %indvars.iv
  %39 = load i16, ptr %38, align 2, !tbaa !10
  %.tr187 = trunc i16 %39 to i8
  %40 = shl i8 %.tr187, 1
  %41 = trunc i16 %39 to i8
  %42 = lshr i8 %41, 2
  %sh.diff = lshr i16 %39, 5
  %tr.sh.diff = trunc i16 %sh.diff to i8
  %sh.diff308 = lshr i16 %39, 8
  %tr.sh.diff309 = trunc nuw i16 %sh.diff308 to i8
  %43 = insertelement <4 x i8> poison, i8 %40, i64 0
  %44 = insertelement <4 x i8> %43, i8 %42, i64 1
  %45 = insertelement <4 x i8> %44, i8 %tr.sh.diff, i64 2
  %46 = insertelement <4 x i8> %45, i8 %tr.sh.diff309, i64 3
  %47 = and <4 x i8> %46, <i8 14, i8 14, i8 14, i8 14>
  %48 = or disjoint <4 x i8> %47, <i8 1, i8 1, i8 1, i8 1>
  store <4 x i8> %48, ptr %37, align 1, !tbaa !12
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !20

.lr.ph197.preheader:                              ; preds = %._crit_edge
  %wide.trip.count252 = zext nneg i32 %0 to i64
  br label %.lr.ph197

._crit_edge198:                                   ; preds = %.lr.ph197, %._crit_edge
  %49 = shl nsw i32 %0, 1
  %50 = sext i32 %49 to i64
  %51 = shl nsw i64 %50, 2
  %52 = tail call noalias ptr @malloc(i64 noundef %51) #6
  %wide.trip.count265 = zext nneg i32 %0 to i64
  %wide.trip.count272 = zext nneg i32 %0 to i64
  br label %82

.lr.ph197:                                        ; preds = %.lr.ph197.preheader, %.lr.ph197
  %indvars.iv249 = phi i64 [ 0, %.lr.ph197.preheader ], [ %indvars.iv.next250, %.lr.ph197 ]
  %53 = getelementptr inbounds i32, ptr %12, i64 %indvars.iv249
  %54 = load i32, ptr %53, align 4, !tbaa !18
  %.sroa.0306.0.extract.trunc = trunc i32 %54 to i16
  %55 = trunc i32 %54 to i16
  %56 = lshr i16 %55, 8
  %.sroa.5.0.extract.shift = lshr i32 %54, 16
  %.sroa.5.0.extract.trunc = trunc nuw i32 %.sroa.5.0.extract.shift to i16
  %.sroa.6307.0.extract.shift = lshr i32 %54, 24
  %.sroa.6307.0.extract.trunc = trunc nuw nsw i32 %.sroa.6307.0.extract.shift to i16
  %57 = and i16 %.sroa.0306.0.extract.trunc, 255
  %.lhs.trunc = add nsw i16 %57, -1
  %58 = sdiv i16 %.lhs.trunc, 2
  %.lhs.trunc.1 = add nsw i16 %56, -1
  %59 = sdiv i16 %.lhs.trunc.1, 2
  %60 = shl nuw nsw i16 %59, 3
  %61 = or i16 %58, %60
  %62 = and i16 %.sroa.5.0.extract.trunc, 255
  %63 = insertelement <2 x i16> poison, i16 %62, i64 0
  %64 = insertelement <2 x i16> %63, i16 %.sroa.6307.0.extract.trunc, i64 1
  %65 = add nsw <2 x i16> %64, <i16 -1, i16 -1>
  %66 = sdiv <2 x i16> %65, <i16 2, i16 2>
  %67 = shl nuw <2 x i16> %66, <i16 6, i16 9>
  %68 = extractelement <2 x i16> %67, i64 0
  %69 = or i16 %61, %68
  %70 = extractelement <2 x i16> %67, i64 1
  %71 = or i16 %69, %70
  %72 = zext i16 %71 to i64
  %73 = getelementptr inbounds i32, ptr %35, i64 %72
  %74 = trunc nuw nsw i64 %indvars.iv249 to i32
  store i32 %74, ptr %73, align 4, !tbaa !18
  %indvars.iv.next250 = add nuw nsw i64 %indvars.iv249, 1
  %exitcond253.not = icmp eq i64 %indvars.iv.next250, %wide.trip.count252
  br i1 %exitcond253.not, label %._crit_edge198, label %.lr.ph197, !llvm.loop !21

75:                                               ; preds = %136
  %76 = add nsw i32 %.1178, %.1180
  %77 = sext i32 %76 to i64
  %78 = shl nsw i64 %77, 1
  %79 = tail call noalias ptr @malloc(i64 noundef %78) #6
  %80 = getelementptr inbounds i8, ptr %4, i64 16
  store ptr %79, ptr %80, align 8, !tbaa !22
  %81 = add i32 %0, 1
  %wide.trip.count289 = zext nneg i32 %0 to i64
  %wide.trip.count296 = zext nneg i32 %0 to i64
  br label %138

82:                                               ; preds = %._crit_edge198, %136
  %indvars.iv274 = phi i64 [ 0, %._crit_edge198 ], [ %indvars.iv.next275, %136 ]
  %.0177215 = phi i32 [ 0, %._crit_edge198 ], [ %.1178, %136 ]
  %.0179214 = phi i32 [ 0, %._crit_edge198 ], [ %.1180, %136 ]
  %83 = getelementptr inbounds i32, ptr %35, i64 %indvars.iv274
  %84 = load i32, ptr %83, align 4, !tbaa !18
  %85 = icmp sgt i32 %84, -1
  br i1 %85, label %136, label %.preheader189

.preheader189:                                    ; preds = %82
  %.tr186 = trunc i64 %indvars.iv274 to i32
  %86 = shl i32 %.tr186, 1
  %87 = and i32 %86, 14
  %.neg = xor i32 %87, -1
  %88 = trunc i64 %indvars.iv274 to i32
  %89 = lshr i32 %88, 2
  %90 = and i32 %89, 14
  %.neg316 = xor i32 %90, -1
  %91 = trunc i64 %indvars.iv274 to i32
  %92 = lshr i32 %91, 5
  %93 = and i32 %92, 14
  %.neg317 = xor i32 %93, -1
  %94 = trunc i64 %indvars.iv274 to i32
  %95 = lshr i32 %94, 8
  %96 = and i32 %95, 14
  %.neg318 = xor i32 %96, -1
  %97 = add nsw i32 %.0177215, 1
  br i1 %13, label %.lr.ph203, label %._crit_edge204.thread

._crit_edge204.thread:                            ; preds = %.preheader189
  tail call void @qsort(ptr noundef %52, i64 noundef %10, i64 noundef 8, ptr noundef nonnull @iq3_compare_func) #7
  br label %._crit_edge211

._crit_edge204:                                   ; preds = %.lr.ph203
  tail call void @qsort(ptr noundef nonnull %52, i64 noundef %10, i64 noundef 8, ptr noundef nonnull @iq3_compare_func) #7
  br i1 %13, label %.lr.ph210.preheader, label %._crit_edge211

.lr.ph210.preheader:                              ; preds = %._crit_edge204
  %98 = load i32, ptr %52, align 4, !tbaa !18
  br label %.lr.ph210

.lr.ph203:                                        ; preds = %.preheader189, %.lr.ph203
  %indvars.iv262 = phi i64 [ %indvars.iv.next263, %.lr.ph203 ], [ 0, %.preheader189 ]
  %99 = getelementptr inbounds i32, ptr %12, i64 %indvars.iv262
  %100 = load i8, ptr %99, align 1, !tbaa !12
  %101 = sext i8 %100 to i32
  %102 = add nsw i32 %.neg, %101
  %103 = mul nsw i32 %102, %102
  %104 = getelementptr inbounds i8, ptr %99, i64 1
  %105 = load i8, ptr %104, align 1, !tbaa !12
  %106 = sext i8 %105 to i32
  %107 = add nsw i32 %.neg316, %106
  %108 = mul nsw i32 %107, %107
  %109 = add nuw nsw i32 %108, %103
  %110 = getelementptr inbounds i8, ptr %99, i64 2
  %111 = load i8, ptr %110, align 1, !tbaa !12
  %112 = sext i8 %111 to i32
  %113 = add nsw i32 %.neg317, %112
  %114 = mul nsw i32 %113, %113
  %115 = add nuw nsw i32 %114, %109
  %116 = getelementptr inbounds i8, ptr %99, i64 3
  %117 = load i8, ptr %116, align 1, !tbaa !12
  %118 = sext i8 %117 to i32
  %119 = add nsw i32 %.neg318, %118
  %120 = mul nsw i32 %119, %119
  %121 = add nuw nsw i32 %120, %115
  %122 = shl nuw nsw i64 %indvars.iv262, 1
  %123 = getelementptr inbounds i32, ptr %52, i64 %122
  store i32 %121, ptr %123, align 4, !tbaa !18
  %124 = or disjoint i64 %122, 1
  %125 = getelementptr inbounds i32, ptr %52, i64 %124
  %126 = trunc nuw nsw i64 %indvars.iv262 to i32
  store i32 %126, ptr %125, align 4, !tbaa !18
  %indvars.iv.next263 = add nuw nsw i64 %indvars.iv262, 1
  %exitcond266.not = icmp eq i64 %indvars.iv.next263, %wide.trip.count265
  br i1 %exitcond266.not, label %._crit_edge204, label %.lr.ph203, !llvm.loop !23

.lr.ph210:                                        ; preds = %.lr.ph210.preheader, %134
  %indvars.iv267 = phi i64 [ 0, %.lr.ph210.preheader ], [ %indvars.iv.next268, %134 ]
  %.0165207 = phi i32 [ 1, %.lr.ph210.preheader ], [ %.1166, %134 ]
  %.0167206 = phi i32 [ %98, %.lr.ph210.preheader ], [ %.1168, %134 ]
  %.idx = shl nsw i64 %indvars.iv267, 3
  %127 = getelementptr inbounds i8, ptr %52, i64 %.idx
  %128 = load i32, ptr %127, align 4, !tbaa !18
  %129 = icmp sgt i32 %128, %.0167206
  br i1 %129, label %130, label %134

130:                                              ; preds = %.lr.ph210
  %131 = icmp eq i32 %.0165207, %8
  br i1 %131, label %._crit_edge211.loopexit.split.loop.exit, label %132

132:                                              ; preds = %130
  %133 = add nsw i32 %.0165207, 1
  br label %134

134:                                              ; preds = %132, %.lr.ph210
  %.1168 = phi i32 [ %128, %132 ], [ %.0167206, %.lr.ph210 ]
  %.1166 = phi i32 [ %133, %132 ], [ %.0165207, %.lr.ph210 ]
  %indvars.iv.next268 = add nuw nsw i64 %indvars.iv267, 1
  %exitcond273.not = icmp eq i64 %indvars.iv.next268, %wide.trip.count272
  br i1 %exitcond273.not, label %._crit_edge211, label %.lr.ph210, !llvm.loop !24

._crit_edge211.loopexit.split.loop.exit:          ; preds = %130
  %indvars271.le = trunc i64 %indvars.iv267 to i32
  br label %._crit_edge211

._crit_edge211:                                   ; preds = %134, %._crit_edge211.loopexit.split.loop.exit, %._crit_edge204.thread, %._crit_edge204
  %.0169.lcssa = phi i32 [ 0, %._crit_edge204 ], [ 0, %._crit_edge204.thread ], [ %indvars271.le, %._crit_edge211.loopexit.split.loop.exit ], [ %0, %134 ]
  %135 = add nsw i32 %.0169.lcssa, %.0179214
  br label %136

136:                                              ; preds = %82, %._crit_edge211
  %.1180 = phi i32 [ %.0179214, %82 ], [ %135, %._crit_edge211 ]
  %.1178 = phi i32 [ %.0177215, %82 ], [ %97, %._crit_edge211 ]
  %indvars.iv.next275 = add nuw nsw i64 %indvars.iv274, 1
  %exitcond277.not = icmp eq i64 %indvars.iv.next275, 4096
  br i1 %exitcond277.not, label %75, label %82, !llvm.loop !25

137:                                              ; preds = %203
  tail call void @free(ptr noundef %52) #7
  br label %204

138:                                              ; preds = %75, %203
  %indvars.iv298 = phi i64 [ 0, %75 ], [ %indvars.iv.next299, %203 ]
  %.0162237 = phi i32 [ 0, %75 ], [ %.2, %203 ]
  %139 = getelementptr inbounds i32, ptr %35, i64 %indvars.iv298
  %140 = load i32, ptr %139, align 4, !tbaa !18
  %141 = icmp sgt i32 %140, -1
  br i1 %141, label %203, label %.preheader188.preheader

.preheader188.preheader:                          ; preds = %138
  %.tr = trunc i64 %indvars.iv298 to i32
  %142 = shl i32 %.tr, 1
  %143 = and i32 %142, 14
  %.neg325 = xor i32 %143, -1
  %144 = trunc i64 %indvars.iv298 to i32
  %145 = lshr i32 %144, 2
  %146 = and i32 %145, 14
  %.neg326 = xor i32 %146, -1
  %147 = trunc i64 %indvars.iv298 to i32
  %148 = lshr i32 %147, 5
  %149 = and i32 %148, 14
  %.neg327 = xor i32 %149, -1
  %150 = trunc i64 %indvars.iv298 to i32
  %151 = lshr i32 %150, 8
  %152 = and i32 %151, 14
  %.neg328 = xor i32 %152, -1
  br i1 %13, label %.lr.ph221, label %._crit_edge222

._crit_edge222:                                   ; preds = %.lr.ph221, %.preheader188.preheader
  tail call void @qsort(ptr noundef %52, i64 noundef %10, i64 noundef 8, ptr noundef nonnull @iq3_compare_func) #7
  %153 = xor i32 %.0162237, -1
  store i32 %153, ptr %139, align 4, !tbaa !18
  %154 = sext i32 %.0162237 to i64
  %155 = getelementptr inbounds i16, ptr %79, i64 %154
  %.1163223 = add i32 %.0162237, 1
  br i1 %13, label %.lr.ph230.preheader, label %._crit_edge231

.lr.ph230.preheader:                              ; preds = %._crit_edge222
  %156 = load i32, ptr %52, align 4, !tbaa !18
  %157 = sext i32 %.1163223 to i64
  %158 = add i32 %81, %.0162237
  br label %.lr.ph230

.lr.ph221:                                        ; preds = %.preheader188.preheader, %.lr.ph221
  %indvars.iv286 = phi i64 [ %indvars.iv.next287, %.lr.ph221 ], [ 0, %.preheader188.preheader ]
  %159 = getelementptr inbounds i32, ptr %12, i64 %indvars.iv286
  %160 = load i8, ptr %159, align 1, !tbaa !12
  %161 = sext i8 %160 to i32
  %162 = add nsw i32 %.neg325, %161
  %163 = mul nsw i32 %162, %162
  %164 = getelementptr inbounds i8, ptr %159, i64 1
  %165 = load i8, ptr %164, align 1, !tbaa !12
  %166 = sext i8 %165 to i32
  %167 = add nsw i32 %.neg326, %166
  %168 = mul nsw i32 %167, %167
  %169 = add nuw nsw i32 %168, %163
  %170 = getelementptr inbounds i8, ptr %159, i64 2
  %171 = load i8, ptr %170, align 1, !tbaa !12
  %172 = sext i8 %171 to i32
  %173 = add nsw i32 %.neg327, %172
  %174 = mul nsw i32 %173, %173
  %175 = add nuw nsw i32 %174, %169
  %176 = getelementptr inbounds i8, ptr %159, i64 3
  %177 = load i8, ptr %176, align 1, !tbaa !12
  %178 = sext i8 %177 to i32
  %179 = add nsw i32 %.neg328, %178
  %180 = mul nsw i32 %179, %179
  %181 = add nuw nsw i32 %180, %175
  %182 = shl nuw nsw i64 %indvars.iv286, 1
  %183 = getelementptr inbounds i32, ptr %52, i64 %182
  store i32 %181, ptr %183, align 4, !tbaa !18
  %184 = or disjoint i64 %182, 1
  %185 = getelementptr inbounds i32, ptr %52, i64 %184
  %186 = trunc nuw nsw i64 %indvars.iv286 to i32
  store i32 %186, ptr %185, align 4, !tbaa !18
  %indvars.iv.next287 = add nuw nsw i64 %indvars.iv286, 1
  %exitcond290.not = icmp eq i64 %indvars.iv.next287, %wide.trip.count289
  br i1 %exitcond290.not, label %._crit_edge222, label %.lr.ph221, !llvm.loop !26

.lr.ph230:                                        ; preds = %.lr.ph230.preheader, %195
  %indvars.iv293 = phi i64 [ 0, %.lr.ph230.preheader ], [ %indvars.iv.next294, %195 ]
  %indvars.iv291 = phi i64 [ %157, %.lr.ph230.preheader ], [ %indvars.iv.next292, %195 ]
  %.0227 = phi i32 [ 0, %.lr.ph230.preheader ], [ %201, %195 ]
  %.0151226 = phi i32 [ 1, %.lr.ph230.preheader ], [ %.1, %195 ]
  %.0153224 = phi i32 [ %156, %.lr.ph230.preheader ], [ %.1154, %195 ]
  %187 = shl nuw nsw i64 %indvars.iv293, 1
  %188 = getelementptr inbounds i32, ptr %52, i64 %187
  %189 = load i32, ptr %188, align 4, !tbaa !18
  %190 = icmp sgt i32 %189, %.0153224
  br i1 %190, label %191, label %195

191:                                              ; preds = %.lr.ph230
  %192 = icmp eq i32 %.0151226, %8
  br i1 %192, label %._crit_edge231.loopexit.split.loop.exit, label %193

193:                                              ; preds = %191
  %194 = add nsw i32 %.0151226, 1
  br label %195

195:                                              ; preds = %193, %.lr.ph230
  %.1154 = phi i32 [ %189, %193 ], [ %.0153224, %.lr.ph230 ]
  %.1 = phi i32 [ %194, %193 ], [ %.0151226, %.lr.ph230 ]
  %196 = or disjoint i64 %187, 1
  %197 = getelementptr inbounds i32, ptr %52, i64 %196
  %198 = load i32, ptr %197, align 4, !tbaa !18
  %199 = trunc i32 %198 to i16
  %200 = getelementptr inbounds i16, ptr %79, i64 %indvars.iv291
  store i16 %199, ptr %200, align 2, !tbaa !10
  %201 = add nuw nsw i32 %.0227, 1
  %indvars.iv.next294 = add nuw nsw i64 %indvars.iv293, 1
  %indvars.iv.next292 = add nsw i64 %indvars.iv291, 1
  %exitcond297.not = icmp eq i64 %indvars.iv.next294, %wide.trip.count296
  br i1 %exitcond297.not, label %._crit_edge231.loopexit, label %.lr.ph230, !llvm.loop !27

._crit_edge231.loopexit.split.loop.exit:          ; preds = %191
  %202 = trunc nsw i64 %indvars.iv291 to i32
  br label %._crit_edge231.loopexit

._crit_edge231.loopexit:                          ; preds = %195, %._crit_edge231.loopexit.split.loop.exit
  %.0152.lcssa.ph.in = phi i32 [ %.0227, %._crit_edge231.loopexit.split.loop.exit ], [ %0, %195 ]
  %.1163.lcssa.ph = phi i32 [ %202, %._crit_edge231.loopexit.split.loop.exit ], [ %158, %195 ]
  %.0152.lcssa.ph = trunc i32 %.0152.lcssa.ph.in to i16
  br label %._crit_edge231

._crit_edge231:                                   ; preds = %._crit_edge231.loopexit, %._crit_edge222
  %.0152.lcssa = phi i16 [ 0, %._crit_edge222 ], [ %.0152.lcssa.ph, %._crit_edge231.loopexit ]
  %.1163.lcssa = phi i32 [ %.1163223, %._crit_edge222 ], [ %.1163.lcssa.ph, %._crit_edge231.loopexit ]
  store i16 %.0152.lcssa, ptr %155, align 2, !tbaa !10
  br label %203

203:                                              ; preds = %138, %._crit_edge231
  %.2 = phi i32 [ %.0162237, %138 ], [ %.1163.lcssa, %._crit_edge231 ]
  %indvars.iv.next299 = add nuw nsw i64 %indvars.iv298, 1
  %exitcond301.not = icmp eq i64 %indvars.iv.next299, 4096
  br i1 %exitcond301.not, label %137, label %138, !llvm.loop !28

204:                                              ; preds = %1, %137
  ret void
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @iq3_data_index(i32 noundef) local_unnamed_addr #4

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

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

attributes #0 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(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 #1 = { nofree "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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint 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 #5 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { nounwind allocsize(0) }
attributes #7 = { 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, !7, i64 0}
!6 = !{!"", !7, i64 0, !7, i64 8, !7, i64 16}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!11, !11, i64 0}
!11 = !{!"short", !8, i64 0}
!12 = !{!8, !8, i64 0}
!13 = distinct !{!13, !14, !15, !16}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!"llvm.loop.isvectorized", i32 1}
!16 = !{!"llvm.loop.unroll.runtime.disable"}
!17 = !{!6, !7, i64 8}
!18 = !{!19, !19, i64 0}
!19 = !{!"int", !8, i64 0}
!20 = distinct !{!20, !14, !16, !15}
!21 = distinct !{!21, !14}
!22 = !{!6, !7, i64 16}
!23 = distinct !{!23, !14}
!24 = distinct !{!24, !14}
!25 = distinct !{!25, !14}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = distinct !{!28, !14}


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