; LLVM IR from ggml-org/ggml :: src/ggml-cpu (ggml-cpu-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.block_q2_K = type { [16 x i8], [64 x i8], %union.anon.4 }
%union.anon.4 = type { i32 }
%struct.block_q8_K = type { float, [256 x i8], [16 x i16] }
%struct.anon.5 = type { i16, i16 }

@.str.1 = external hidden unnamed_addr constant [78 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [9 x i8], align 1
@__PRETTY_FUNCTION__.ggml_vec_dot_q2_K_q8_K = external hidden unnamed_addr constant [123 x i8], align 1

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #0

; 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

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @ggml_lookup_fp16_to_fp32(i16 noundef zeroext) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #3

; Function Attrs: nounwind uwtable
define dso_local void @ggml_vec_dot_q2_K_q8_K(i32 noundef %0, ptr noalias noundef %1, i64 noundef %2, ptr noalias noundef %3, i64 noundef %4, ptr noalias noundef %5, i64 noundef %6, i32 noundef %7) #4 {
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i64, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca float, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca float, align 4
  %29 = alloca float, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %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
  store i32 %0, ptr %9, align 4, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !9
  store i64 %2, ptr %11, align 8, !tbaa !11
  store ptr %3, ptr %12, align 8, !tbaa !9
  store i64 %4, ptr %13, align 8, !tbaa !11
  store ptr %5, ptr %14, align 8, !tbaa !9
  store i64 %6, ptr %15, align 8, !tbaa !11
  store i32 %7, ptr %16, align 4, !tbaa !5
  %39 = load i32, ptr %16, align 4, !tbaa !5
  %40 = icmp eq i32 %39, 1
  br i1 %40, label %41, label %42

41:                                               ; preds = %8
  br label %43

42:                                               ; preds = %8
  call void @__assert_fail(ptr noundef @.str.5, ptr noundef @.str.1, i32 noundef 4513, ptr noundef @__PRETTY_FUNCTION__.ggml_vec_dot_q2_K_q8_K) #5
  unreachable

43:                                               ; preds = %41
  %44 = load i32, ptr %16, align 4, !tbaa !5
  %45 = load i64, ptr %13, align 8, !tbaa !11
  %46 = load i64, ptr %15, align 8, !tbaa !11
  %47 = load i64, ptr %11, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  %48 = load ptr, ptr %12, align 8, !tbaa !9
  store ptr %48, ptr %17, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  %49 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %49, ptr %18, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #6
  %50 = load i32, ptr %9, align 4, !tbaa !5
  %51 = sdiv i32 %50, 256
  store i32 %51, ptr %19, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #6
  store float 0.000000e+00, ptr %20, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #6
  store i32 0, ptr %21, align 4, !tbaa !5
  br label %52

52:                                               ; preds = %250, %43
  %53 = load i32, ptr %21, align 4, !tbaa !5
  %54 = load i32, ptr %19, align 4, !tbaa !5
  %55 = icmp slt i32 %53, %54
  br i1 %55, label %57, label %56

56:                                               ; preds = %52
  store i32 2, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #6
  br label %253

57:                                               ; preds = %52
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  %58 = load ptr, ptr %17, align 8, !tbaa !9
  %59 = load i32, ptr %21, align 4, !tbaa !5
  %60 = sext i32 %59 to i64
  %61 = getelementptr inbounds %struct.block_q2_K, ptr %58, i64 %60
  %62 = getelementptr inbounds %struct.block_q2_K, ptr %61, i32 0, i32 1
  %63 = getelementptr inbounds [64 x i8], ptr %62, i64 0, i64 0
  store ptr %63, ptr %23, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %64 = load ptr, ptr %18, align 8, !tbaa !9
  %65 = load i32, ptr %21, align 4, !tbaa !5
  %66 = sext i32 %65 to i64
  %67 = getelementptr inbounds %struct.block_q8_K, ptr %64, i64 %66
  %68 = getelementptr inbounds %struct.block_q8_K, ptr %67, i32 0, i32 1
  %69 = getelementptr inbounds [256 x i8], ptr %68, i64 0, i64 0
  store ptr %69, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #6
  %70 = load ptr, ptr %17, align 8, !tbaa !9
  %71 = load i32, ptr %21, align 4, !tbaa !5
  %72 = sext i32 %71 to i64
  %73 = getelementptr inbounds %struct.block_q2_K, ptr %70, i64 %72
  %74 = getelementptr inbounds %struct.block_q2_K, ptr %73, i32 0, i32 0
  %75 = getelementptr inbounds [16 x i8], ptr %74, i64 0, i64 0
  store ptr %75, ptr %25, align 8, !tbaa !9
  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 %76

76:                                               ; preds = %101, %57
  %77 = load i32, ptr %27, align 4, !tbaa !5
  %78 = icmp slt i32 %77, 16
  br i1 %78, label %80, label %79

79:                                               ; preds = %76
  store i32 5, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #6
  br label %104

80:                                               ; preds = %76
  %81 = load ptr, ptr %18, align 8, !tbaa !9
  %82 = load i32, ptr %21, align 4, !tbaa !5
  %83 = sext i32 %82 to i64
  %84 = getelementptr inbounds %struct.block_q8_K, ptr %81, i64 %83
  %85 = getelementptr inbounds %struct.block_q8_K, ptr %84, i32 0, i32 2
  %86 = load i32, ptr %27, align 4, !tbaa !5
  %87 = sext i32 %86 to i64
  %88 = getelementptr inbounds [16 x i16], ptr %85, i64 0, i64 %87
  %89 = load i16, ptr %88, align 2, !tbaa !15
  %90 = sext i16 %89 to i32
  %91 = load ptr, ptr %25, align 8, !tbaa !9
  %92 = load i32, ptr %27, align 4, !tbaa !5
  %93 = sext i32 %92 to i64
  %94 = getelementptr inbounds i8, ptr %91, i64 %93
  %95 = load i8, ptr %94, align 1, !tbaa !17
  %96 = zext i8 %95 to i32
  %97 = ashr i32 %96, 4
  %98 = mul nsw i32 %90, %97
  %99 = load i32, ptr %26, align 4, !tbaa !5
  %100 = add nsw i32 %99, %98
  store i32 %100, ptr %26, align 4, !tbaa !5
  br label %101

101:                                              ; preds = %80
  %102 = load i32, ptr %27, align 4, !tbaa !5
  %103 = add nsw i32 %102, 1
  store i32 %103, ptr %27, align 4, !tbaa !5
  br label %76, !llvm.loop !18

104:                                              ; preds = %79
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #6
  %105 = load ptr, ptr %18, align 8, !tbaa !9
  %106 = load i32, ptr %21, align 4, !tbaa !5
  %107 = sext i32 %106 to i64
  %108 = getelementptr inbounds %struct.block_q8_K, ptr %105, i64 %107
  %109 = getelementptr inbounds %struct.block_q8_K, ptr %108, i32 0, i32 0
  %110 = load float, ptr %109, align 4, !tbaa !20
  %111 = load ptr, ptr %17, align 8, !tbaa !9
  %112 = load i32, ptr %21, align 4, !tbaa !5
  %113 = sext i32 %112 to i64
  %114 = getelementptr inbounds %struct.block_q2_K, ptr %111, i64 %113
  %115 = getelementptr inbounds %struct.block_q2_K, ptr %114, i32 0, i32 2
  %116 = getelementptr inbounds %struct.anon.5, ptr %115, i32 0, i32 0
  %117 = load i16, ptr %116, align 4, !tbaa !17
  %118 = call float @ggml_lookup_fp16_to_fp32(i16 noundef zeroext %117)
  %119 = fmul float %110, %118
  store float %119, ptr %28, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #6
  %120 = load ptr, ptr %18, align 8, !tbaa !9
  %121 = load i32, ptr %21, align 4, !tbaa !5
  %122 = sext i32 %121 to i64
  %123 = getelementptr inbounds %struct.block_q8_K, ptr %120, i64 %122
  %124 = getelementptr inbounds %struct.block_q8_K, ptr %123, i32 0, i32 0
  %125 = load float, ptr %124, align 4, !tbaa !20
  %126 = load ptr, ptr %17, align 8, !tbaa !9
  %127 = load i32, ptr %21, align 4, !tbaa !5
  %128 = sext i32 %127 to i64
  %129 = getelementptr inbounds %struct.block_q2_K, ptr %126, i64 %128
  %130 = getelementptr inbounds %struct.block_q2_K, ptr %129, i32 0, i32 2
  %131 = getelementptr inbounds %struct.anon.5, ptr %130, i32 0, i32 1
  %132 = load i16, ptr %131, align 2, !tbaa !17
  %133 = call float @ggml_lookup_fp16_to_fp32(i16 noundef zeroext %132)
  %134 = fmul float %125, %133
  store float %134, ptr %29, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  store i32 0, ptr %30, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #6
  store i32 0, ptr %31, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #6
  store i32 0, ptr %33, align 4, !tbaa !5
  br label %135

135:                                              ; preds = %235, %104
  %136 = load i32, ptr %33, align 4, !tbaa !5
  %137 = icmp slt i32 %136, 2
  br i1 %137, label %139, label %138

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

139:                                              ; preds = %135
  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
  store i32 0, ptr %35, align 4, !tbaa !5
  br label %140

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

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

144:                                              ; preds = %140
  %145 = load ptr, ptr %25, align 8, !tbaa !9
  %146 = load i32, ptr %31, align 4, !tbaa !5
  %147 = add nsw i32 %146, 1
  store i32 %147, ptr %31, align 4, !tbaa !5
  %148 = sext i32 %146 to i64
  %149 = getelementptr inbounds i8, ptr %145, i64 %148
  %150 = load i8, ptr %149, align 1, !tbaa !17
  %151 = zext i8 %150 to i32
  %152 = and i32 %151, 15
  store i32 %152, ptr %32, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #6
  store i32 0, 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 %153

153:                                              ; preds = %176, %144
  %154 = load i32, ptr %37, align 4, !tbaa !5
  %155 = icmp slt i32 %154, 16
  br i1 %155, label %157, label %156

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

157:                                              ; preds = %153
  %158 = load ptr, ptr %24, align 8, !tbaa !9
  %159 = load i32, ptr %37, align 4, !tbaa !5
  %160 = sext i32 %159 to i64
  %161 = getelementptr inbounds i8, ptr %158, i64 %160
  %162 = load i8, ptr %161, align 1, !tbaa !17
  %163 = sext i8 %162 to i32
  %164 = load ptr, ptr %23, align 8, !tbaa !9
  %165 = load i32, ptr %37, align 4, !tbaa !5
  %166 = sext i32 %165 to i64
  %167 = getelementptr inbounds i8, ptr %164, i64 %166
  %168 = load i8, ptr %167, align 1, !tbaa !17
  %169 = zext i8 %168 to i32
  %170 = load i32, ptr %34, align 4, !tbaa !5
  %171 = ashr i32 %169, %170
  %172 = and i32 %171, 3
  %173 = mul nsw i32 %163, %172
  %174 = load i32, ptr %36, align 4, !tbaa !5
  %175 = add nsw i32 %174, %173
  store i32 %175, ptr %36, align 4, !tbaa !5
  br label %176

176:                                              ; preds = %157
  %177 = load i32, ptr %37, align 4, !tbaa !5
  %178 = add nsw i32 %177, 1
  store i32 %178, ptr %37, align 4, !tbaa !5
  br label %153, !llvm.loop !22

179:                                              ; preds = %156
  %180 = load i32, ptr %32, align 4, !tbaa !5
  %181 = load i32, ptr %36, align 4, !tbaa !5
  %182 = mul nsw i32 %180, %181
  %183 = load i32, ptr %30, align 4, !tbaa !5
  %184 = add nsw i32 %183, %182
  store i32 %184, ptr %30, align 4, !tbaa !5
  %185 = load ptr, ptr %25, align 8, !tbaa !9
  %186 = load i32, ptr %31, align 4, !tbaa !5
  %187 = add nsw i32 %186, 1
  store i32 %187, ptr %31, align 4, !tbaa !5
  %188 = sext i32 %186 to i64
  %189 = getelementptr inbounds i8, ptr %185, i64 %188
  %190 = load i8, ptr %189, align 1, !tbaa !17
  %191 = zext i8 %190 to i32
  %192 = and i32 %191, 15
  store i32 %192, ptr %32, align 4, !tbaa !5
  store i32 0, ptr %36, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #6
  store i32 16, ptr %38, align 4, !tbaa !5
  br label %193

193:                                              ; preds = %216, %179
  %194 = load i32, ptr %38, align 4, !tbaa !5
  %195 = icmp slt i32 %194, 32
  br i1 %195, label %197, label %196

196:                                              ; preds = %193
  store i32 17, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #6
  br label %219

197:                                              ; preds = %193
  %198 = load ptr, ptr %24, align 8, !tbaa !9
  %199 = load i32, ptr %38, align 4, !tbaa !5
  %200 = sext i32 %199 to i64
  %201 = getelementptr inbounds i8, ptr %198, i64 %200
  %202 = load i8, ptr %201, align 1, !tbaa !17
  %203 = sext i8 %202 to i32
  %204 = load ptr, ptr %23, align 8, !tbaa !9
  %205 = load i32, ptr %38, align 4, !tbaa !5
  %206 = sext i32 %205 to i64
  %207 = getelementptr inbounds i8, ptr %204, i64 %206
  %208 = load i8, ptr %207, align 1, !tbaa !17
  %209 = zext i8 %208 to i32
  %210 = load i32, ptr %34, align 4, !tbaa !5
  %211 = ashr i32 %209, %210
  %212 = and i32 %211, 3
  %213 = mul nsw i32 %203, %212
  %214 = load i32, ptr %36, align 4, !tbaa !5
  %215 = add nsw i32 %214, %213
  store i32 %215, ptr %36, align 4, !tbaa !5
  br label %216

216:                                              ; preds = %197
  %217 = load i32, ptr %38, align 4, !tbaa !5
  %218 = add nsw i32 %217, 1
  store i32 %218, ptr %38, align 4, !tbaa !5
  br label %193, !llvm.loop !23

219:                                              ; preds = %196
  %220 = load i32, ptr %32, align 4, !tbaa !5
  %221 = load i32, ptr %36, align 4, !tbaa !5
  %222 = mul nsw i32 %220, %221
  %223 = load i32, ptr %30, align 4, !tbaa !5
  %224 = add nsw i32 %223, %222
  store i32 %224, ptr %30, align 4, !tbaa !5
  %225 = load i32, ptr %34, align 4, !tbaa !5
  %226 = add nsw i32 %225, 2
  store i32 %226, ptr %34, align 4, !tbaa !5
  %227 = load ptr, ptr %24, align 8, !tbaa !9
  %228 = getelementptr inbounds i8, ptr %227, i64 32
  store ptr %228, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #6
  br label %229

229:                                              ; preds = %219
  %230 = load i32, ptr %35, align 4, !tbaa !5
  %231 = add nsw i32 %230, 1
  store i32 %231, ptr %35, align 4, !tbaa !5
  br label %140, !llvm.loop !24

232:                                              ; preds = %143
  %233 = load ptr, ptr %23, align 8, !tbaa !9
  %234 = getelementptr inbounds i8, ptr %233, i64 32
  store ptr %234, ptr %23, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #6
  br label %235

235:                                              ; preds = %232
  %236 = load i32, ptr %33, align 4, !tbaa !5
  %237 = add nsw i32 %236, 1
  store i32 %237, ptr %33, align 4, !tbaa !5
  br label %135, !llvm.loop !25

238:                                              ; preds = %138
  %239 = load float, ptr %28, align 4, !tbaa !13
  %240 = load i32, ptr %30, align 4, !tbaa !5
  %241 = sitofp i32 %240 to float
  %242 = load float, ptr %29, align 4, !tbaa !13
  %243 = load i32, ptr %26, align 4, !tbaa !5
  %244 = sitofp i32 %243 to float
  %245 = fmul float %242, %244
  %246 = fneg float %245
  %247 = call float @llvm.fmuladd.f32(float %239, float %241, float %246)
  %248 = load float, ptr %20, align 4, !tbaa !13
  %249 = fadd float %248, %247
  store float %249, ptr %20, align 4, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  br label %250

250:                                              ; preds = %238
  %251 = load i32, ptr %21, align 4, !tbaa !5
  %252 = add nsw i32 %251, 1
  store i32 %252, ptr %21, align 4, !tbaa !5
  br label %52, !llvm.loop !26

253:                                              ; preds = %56
  %254 = load float, ptr %20, align 4, !tbaa !13
  %255 = load ptr, ptr %10, align 8, !tbaa !9
  store float %254, ptr %255, align 4, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  ret void
}

attributes #0 = { noreturn 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { noreturn nounwind }
attributes #6 = { 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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"float", !7, i64 0}
!15 = !{!16, !16, i64 0}
!16 = !{!"short", !7, i64 0}
!17 = !{!7, !7, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!21, !14, i64 0}
!21 = !{!"", !14, i64 0, !7, i64 4, !7, i64 260}
!22 = distinct !{!22, !19}
!23 = distinct !{!23, !19}
!24 = distinct !{!24, !19}
!25 = distinct !{!25, !19}
!26 = distinct !{!26, !19}


; 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.block_q2_K = type { [16 x i8], [64 x i8], %union.anon.4 }
%union.anon.4 = type { i32 }
%struct.block_q8_K = type { float, [256 x i8], [16 x i16] }

@.str.1 = external hidden unnamed_addr constant [78 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [9 x i8], align 1
@__PRETTY_FUNCTION__.ggml_vec_dot_q2_K_q8_K = external hidden unnamed_addr constant [123 x i8], align 1

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @ggml_lookup_fp16_to_fp32(i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #2

; Function Attrs: nounwind uwtable
define dso_local void @ggml_vec_dot_q2_K_q8_K(i32 noundef %0, ptr noalias nocapture noundef writeonly %1, i64 noundef %2, ptr noalias nocapture noundef readonly %3, i64 noundef %4, ptr noalias nocapture noundef readonly %5, i64 noundef %6, i32 noundef %7) local_unnamed_addr #3 {
  %9 = icmp eq i32 %7, 1
  br i1 %9, label %11, label %10

10:                                               ; preds = %8
  tail call void @__assert_fail(ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.1, i32 noundef 4513, ptr noundef nonnull @__PRETTY_FUNCTION__.ggml_vec_dot_q2_K_q8_K) #5
  unreachable

11:                                               ; preds = %8
  %12 = icmp sgt i32 %0, 255
  br i1 %12, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %11
  %13 = lshr i32 %0, 8
  %wide.trip.count = zext nneg i32 %13 to i64
  br label %.lr.ph

._crit_edge:                                      ; preds = %192, %11
  %.081.lcssa = phi float [ 0.000000e+00, %11 ], [ %217, %192 ]
  store float %.081.lcssa, ptr %1, align 4, !tbaa !5
  ret void

.lr.ph:                                           ; preds = %.lr.ph.preheader, %192
  %indvars.iv119 = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next120, %192 ]
  %.081105 = phi float [ 0.000000e+00, %.lr.ph.preheader ], [ %217, %192 ]
  %14 = getelementptr inbounds %struct.block_q2_K, ptr %3, i64 %indvars.iv119
  %15 = getelementptr inbounds %struct.block_q8_K, ptr %5, i64 %indvars.iv119
  %16 = getelementptr inbounds i8, ptr %15, i64 260
  %17 = load i16, ptr %16, align 2, !tbaa !9
  %18 = load i8, ptr %14, align 1, !tbaa !11
  %19 = lshr i8 %18, 4
  %20 = zext nneg i8 %19 to i32
  %21 = getelementptr inbounds i8, ptr %15, i64 262
  %22 = load i16, ptr %21, align 2, !tbaa !9
  %23 = sext i16 %22 to i32
  %24 = getelementptr inbounds i8, ptr %14, i64 1
  %25 = load i8, ptr %24, align 1, !tbaa !11
  %26 = lshr i8 %25, 4
  %27 = zext nneg i8 %26 to i32
  %28 = mul nsw i32 %27, %23
  %29 = getelementptr inbounds i8, ptr %15, i64 264
  %30 = load i16, ptr %29, align 2, !tbaa !9
  %31 = sext i16 %30 to i32
  %32 = getelementptr inbounds i8, ptr %14, i64 2
  %33 = load i8, ptr %32, align 1, !tbaa !11
  %34 = lshr i8 %33, 4
  %35 = zext nneg i8 %34 to i32
  %36 = mul nsw i32 %35, %31
  %37 = getelementptr inbounds i8, ptr %15, i64 266
  %38 = load i16, ptr %37, align 2, !tbaa !9
  %39 = sext i16 %38 to i32
  %40 = getelementptr inbounds i8, ptr %14, i64 3
  %41 = load i8, ptr %40, align 1, !tbaa !11
  %42 = lshr i8 %41, 4
  %43 = zext nneg i8 %42 to i32
  %44 = mul nsw i32 %43, %39
  %45 = getelementptr inbounds i8, ptr %15, i64 268
  %46 = load i16, ptr %45, align 2, !tbaa !9
  %47 = sext i16 %46 to i32
  %48 = getelementptr inbounds i8, ptr %14, i64 4
  %49 = load i8, ptr %48, align 1, !tbaa !11
  %50 = lshr i8 %49, 4
  %51 = zext nneg i8 %50 to i32
  %52 = mul nsw i32 %51, %47
  %53 = getelementptr inbounds i8, ptr %15, i64 270
  %54 = load i16, ptr %53, align 2, !tbaa !9
  %55 = sext i16 %54 to i32
  %56 = getelementptr inbounds i8, ptr %14, i64 5
  %57 = load i8, ptr %56, align 1, !tbaa !11
  %58 = lshr i8 %57, 4
  %59 = zext nneg i8 %58 to i32
  %60 = mul nsw i32 %59, %55
  %61 = getelementptr inbounds i8, ptr %15, i64 272
  %62 = load i16, ptr %61, align 2, !tbaa !9
  %63 = sext i16 %62 to i32
  %64 = getelementptr inbounds i8, ptr %14, i64 6
  %65 = load i8, ptr %64, align 1, !tbaa !11
  %66 = lshr i8 %65, 4
  %67 = zext nneg i8 %66 to i32
  %68 = mul nsw i32 %67, %63
  %69 = getelementptr inbounds i8, ptr %15, i64 274
  %70 = load i16, ptr %69, align 2, !tbaa !9
  %71 = sext i16 %70 to i32
  %72 = getelementptr inbounds i8, ptr %14, i64 7
  %73 = load i8, ptr %72, align 1, !tbaa !11
  %74 = lshr i8 %73, 4
  %75 = zext nneg i8 %74 to i32
  %76 = mul nsw i32 %75, %71
  %77 = getelementptr inbounds i8, ptr %15, i64 276
  %78 = load i16, ptr %77, align 2, !tbaa !9
  %79 = sext i16 %78 to i32
  %80 = getelementptr inbounds i8, ptr %14, i64 8
  %81 = load i8, ptr %80, align 1, !tbaa !11
  %82 = lshr i8 %81, 4
  %83 = zext nneg i8 %82 to i32
  %84 = mul nsw i32 %83, %79
  %85 = getelementptr inbounds i8, ptr %15, i64 278
  %86 = load i16, ptr %85, align 2, !tbaa !9
  %87 = sext i16 %86 to i32
  %88 = getelementptr inbounds i8, ptr %14, i64 9
  %89 = load i8, ptr %88, align 1, !tbaa !11
  %90 = lshr i8 %89, 4
  %91 = zext nneg i8 %90 to i32
  %92 = mul nsw i32 %91, %87
  %93 = getelementptr inbounds i8, ptr %15, i64 280
  %94 = load i16, ptr %93, align 2, !tbaa !9
  %95 = sext i16 %94 to i32
  %96 = getelementptr inbounds i8, ptr %14, i64 10
  %97 = load i8, ptr %96, align 1, !tbaa !11
  %98 = lshr i8 %97, 4
  %99 = zext nneg i8 %98 to i32
  %100 = mul nsw i32 %99, %95
  %101 = getelementptr inbounds i8, ptr %15, i64 282
  %102 = load i16, ptr %101, align 2, !tbaa !9
  %103 = sext i16 %102 to i32
  %104 = getelementptr inbounds i8, ptr %14, i64 11
  %105 = load i8, ptr %104, align 1, !tbaa !11
  %106 = lshr i8 %105, 4
  %107 = zext nneg i8 %106 to i32
  %108 = mul nsw i32 %107, %103
  %109 = getelementptr inbounds i8, ptr %15, i64 284
  %110 = load i16, ptr %109, align 2, !tbaa !9
  %111 = sext i16 %110 to i32
  %112 = getelementptr inbounds i8, ptr %14, i64 12
  %113 = load i8, ptr %112, align 1, !tbaa !11
  %114 = lshr i8 %113, 4
  %115 = zext nneg i8 %114 to i32
  %116 = mul nsw i32 %115, %111
  %117 = getelementptr inbounds i8, ptr %15, i64 286
  %118 = load i16, ptr %117, align 2, !tbaa !9
  %119 = sext i16 %118 to i32
  %120 = getelementptr inbounds i8, ptr %14, i64 13
  %121 = load i8, ptr %120, align 1, !tbaa !11
  %122 = lshr i8 %121, 4
  %123 = zext nneg i8 %122 to i32
  %124 = mul nsw i32 %123, %119
  %125 = getelementptr inbounds i8, ptr %15, i64 288
  %126 = load i16, ptr %125, align 2, !tbaa !9
  %127 = sext i16 %126 to i32
  %128 = getelementptr inbounds i8, ptr %14, i64 14
  %129 = load i8, ptr %128, align 1, !tbaa !11
  %130 = lshr i8 %129, 4
  %131 = zext nneg i8 %130 to i32
  %132 = mul nsw i32 %131, %127
  %133 = getelementptr inbounds i8, ptr %15, i64 290
  %134 = load i16, ptr %133, align 2, !tbaa !9
  %135 = sext i16 %134 to i32
  %136 = getelementptr inbounds i8, ptr %14, i64 15
  %137 = load i8, ptr %136, align 1, !tbaa !11
  %138 = lshr i8 %137, 4
  %139 = zext nneg i8 %138 to i32
  %140 = mul nsw i32 %139, %135
  %141 = load float, ptr %15, align 4, !tbaa !12
  %142 = getelementptr inbounds i8, ptr %14, i64 80
  %143 = load i16, ptr %142, align 4, !tbaa !11
  %144 = tail call float @ggml_lookup_fp16_to_fp32(i16 noundef zeroext %143)
  %145 = getelementptr inbounds i8, ptr %14, i64 82
  %146 = load i16, ptr %145, align 2, !tbaa !11
  %147 = tail call float @ggml_lookup_fp16_to_fp32(i16 noundef zeroext %146)
  %148 = getelementptr inbounds i8, ptr %14, i64 16
  %149 = getelementptr inbounds i8, ptr %15, i64 4
  %scevgep = getelementptr i8, ptr %15, i64 132
  %150 = load <16 x i8>, ptr %148, align 1, !tbaa !11
  %151 = zext <16 x i8> %150 to <16 x i32>
  %152 = getelementptr inbounds i8, ptr %14, i64 32
  %153 = load <16 x i8>, ptr %152, align 1, !tbaa !11
  %154 = zext <16 x i8> %153 to <16 x i32>
  br label %218

.preheader.1:                                     ; preds = %218
  %155 = getelementptr inbounds i8, ptr %14, i64 48
  %156 = load <16 x i8>, ptr %155, align 1, !tbaa !11
  %157 = zext <16 x i8> %156 to <16 x i32>
  %158 = getelementptr inbounds i8, ptr %14, i64 64
  %159 = load <16 x i8>, ptr %158, align 1, !tbaa !11
  %160 = zext <16 x i8> %159 to <16 x i32>
  br label %161

161:                                              ; preds = %161, %.preheader.1
  %indvars.iv.1 = phi i64 [ 8, %.preheader.1 ], [ %indvars.iv.next.1, %161 ]
  %.07498.1 = phi i32 [ 0, %.preheader.1 ], [ %191, %161 ]
  %.07597.1 = phi i32 [ 0, %.preheader.1 ], [ %189, %161 ]
  %.18095.1 = phi i32 [ %245, %.preheader.1 ], [ %188, %161 ]
  %.18694.1 = phi ptr [ %scevgep, %.preheader.1 ], [ %190, %161 ]
  %162 = getelementptr inbounds i8, ptr %14, i64 %indvars.iv.1
  %163 = load i8, ptr %162, align 1, !tbaa !11
  %164 = and i8 %163, 15
  %165 = insertelement <16 x i32> poison, i32 %.07597.1, i64 0
  %166 = shufflevector <16 x i32> %165, <16 x i32> poison, <16 x i32> zeroinitializer
  %167 = lshr <16 x i32> %157, %166
  %168 = load <16 x i8>, ptr %.18694.1, align 1, !tbaa !11
  %169 = sext <16 x i8> %168 to <16 x i32>
  %170 = and <16 x i32> %167, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
  %171 = mul nsw <16 x i32> %170, %169
  %172 = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %171)
  %173 = zext nneg i8 %164 to i32
  %174 = mul nsw i32 %172, %173
  %175 = add nsw i32 %174, %.18095.1
  %176 = getelementptr i8, ptr %162, i64 1
  %177 = load i8, ptr %176, align 1, !tbaa !11
  %178 = and i8 %177, 15
  %179 = getelementptr inbounds i8, ptr %.18694.1, i64 16
  %180 = lshr <16 x i32> %160, %166
  %181 = load <16 x i8>, ptr %179, align 1, !tbaa !11
  %182 = sext <16 x i8> %181 to <16 x i32>
  %183 = and <16 x i32> %180, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
  %184 = mul nsw <16 x i32> %183, %182
  %185 = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %184)
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.1, 2
  %186 = zext nneg i8 %178 to i32
  %187 = mul nsw i32 %185, %186
  %188 = add nsw i32 %175, %187
  %189 = add nuw nsw i32 %.07597.1, 2
  %190 = getelementptr inbounds i8, ptr %.18694.1, i64 32
  %191 = add nuw nsw i32 %.07498.1, 1
  %exitcond.not.1 = icmp eq i32 %191, 4
  br i1 %exitcond.not.1, label %192, label %161, !llvm.loop !14

192:                                              ; preds = %161
  %193 = sext i16 %17 to i32
  %194 = mul nsw i32 %20, %193
  %195 = add nsw i32 %28, %194
  %196 = add nsw i32 %36, %195
  %197 = add nsw i32 %44, %196
  %198 = add nsw i32 %52, %197
  %199 = add nsw i32 %60, %198
  %200 = add nsw i32 %68, %199
  %201 = add nsw i32 %76, %200
  %202 = add nsw i32 %84, %201
  %203 = add nsw i32 %92, %202
  %204 = add nsw i32 %100, %203
  %205 = add nsw i32 %108, %204
  %206 = add nsw i32 %116, %205
  %207 = add nsw i32 %124, %206
  %208 = add nsw i32 %132, %207
  %209 = add nsw i32 %140, %208
  %210 = fmul float %141, %144
  %211 = sitofp i32 %188 to float
  %212 = sitofp i32 %209 to float
  %213 = fneg float %141
  %214 = fmul float %147, %213
  %215 = fmul float %214, %212
  %216 = tail call float @llvm.fmuladd.f32(float %210, float %211, float %215)
  %217 = fadd float %.081105, %216
  %indvars.iv.next120 = add nuw nsw i64 %indvars.iv119, 1
  %exitcond122.not = icmp eq i64 %indvars.iv.next120, %wide.trip.count
  br i1 %exitcond122.not, label %._crit_edge, label %.lr.ph, !llvm.loop !16

218:                                              ; preds = %.lr.ph, %218
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %218 ]
  %.07498 = phi i32 [ 0, %.lr.ph ], [ %248, %218 ]
  %.07597 = phi i32 [ 0, %.lr.ph ], [ %246, %218 ]
  %.18095 = phi i32 [ 0, %.lr.ph ], [ %245, %218 ]
  %.18694 = phi ptr [ %149, %.lr.ph ], [ %247, %218 ]
  %219 = getelementptr inbounds i8, ptr %14, i64 %indvars.iv
  %220 = load i8, ptr %219, align 1, !tbaa !11
  %221 = and i8 %220, 15
  %222 = insertelement <16 x i32> poison, i32 %.07597, i64 0
  %223 = shufflevector <16 x i32> %222, <16 x i32> poison, <16 x i32> zeroinitializer
  %224 = lshr <16 x i32> %151, %223
  %225 = load <16 x i8>, ptr %.18694, align 1, !tbaa !11
  %226 = sext <16 x i8> %225 to <16 x i32>
  %227 = and <16 x i32> %224, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
  %228 = mul nsw <16 x i32> %227, %226
  %229 = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %228)
  %230 = zext nneg i8 %221 to i32
  %231 = mul nsw i32 %229, %230
  %232 = add nsw i32 %231, %.18095
  %233 = getelementptr i8, ptr %219, i64 1
  %234 = load i8, ptr %233, align 1, !tbaa !11
  %235 = and i8 %234, 15
  %236 = getelementptr inbounds i8, ptr %.18694, i64 16
  %237 = lshr <16 x i32> %154, %223
  %238 = load <16 x i8>, ptr %236, align 1, !tbaa !11
  %239 = sext <16 x i8> %238 to <16 x i32>
  %240 = and <16 x i32> %237, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
  %241 = mul nsw <16 x i32> %240, %239
  %242 = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %241)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
  %243 = zext nneg i8 %235 to i32
  %244 = mul nsw i32 %242, %243
  %245 = add nsw i32 %232, %244
  %246 = add nuw nsw i32 %.07597, 2
  %247 = getelementptr inbounds i8, ptr %.18694, i64 32
  %248 = add nuw nsw i32 %.07498, 1
  %exitcond.not = icmp eq i32 %248, 4
  br i1 %exitcond.not, label %.preheader.1, label %218, !llvm.loop !14
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>) #4

attributes #0 = { noreturn 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 #1 = { 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 #2 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { noreturn 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 = !{!"float", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"short", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !6, i64 0}
!13 = !{!"", !6, i64 0, !7, i64 4, !7, i64 260}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}


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