; LLVM IR from 2404589803/LowMemoryLLM :: src/hal (quantization)

; 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.QuantParams = type { float, i32, float, float }
%struct.QuantConfig = type { i32, i32, i32, float }
%struct.FP8 = type { i8 }

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @quant_dequantize(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3, ptr noundef %4) #2 {
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca i8, align 1
  %17 = alloca ptr, align 8
  %18 = alloca i64, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i64, align 8
  %22 = alloca ptr, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i32, align 4
  %26 = alloca i64, align 8
  %27 = alloca %struct.QuantParams, align 4
  %28 = alloca i64, align 8
  store ptr %0, ptr %7, align 8, !tbaa !5
  store ptr %1, ptr %8, align 8, !tbaa !5
  store i64 %2, ptr %9, align 8, !tbaa !9
  store ptr %3, ptr %10, align 8, !tbaa !5
  store ptr %4, ptr %11, align 8, !tbaa !5
  %29 = load ptr, ptr %7, align 8, !tbaa !5
  %30 = icmp ne ptr %29, null
  br i1 %30, label %31, label %43

31:                                               ; preds = %5
  %32 = load ptr, ptr %8, align 8, !tbaa !5
  %33 = icmp ne ptr %32, null
  br i1 %33, label %34, label %43

34:                                               ; preds = %31
  %35 = load ptr, ptr %10, align 8, !tbaa !5
  %36 = icmp ne ptr %35, null
  br i1 %36, label %37, label %43

37:                                               ; preds = %34
  %38 = load ptr, ptr %11, align 8, !tbaa !5
  %39 = icmp ne ptr %38, null
  br i1 %39, label %40, label %43

40:                                               ; preds = %37
  %41 = load i64, ptr %9, align 8, !tbaa !9
  %42 = icmp eq i64 %41, 0
  br i1 %42, label %43, label %44

43:                                               ; preds = %40, %37, %34, %31, %5
  store i32 -1, ptr %6, align 4
  br label %239

44:                                               ; preds = %40
  %45 = load ptr, ptr %11, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.QuantConfig, ptr %45, i32 0, i32 0
  %47 = load i32, ptr %46, align 4, !tbaa !11
  switch i32 %47, label %238 [
    i32 0, label %48
    i32 1, label %77
    i32 2, label %131
    i32 3, label %151
    i32 4, label %179
  ]

48:                                               ; preds = %44
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  %49 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %49, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  store i64 0, ptr %13, align 8, !tbaa !9
  br label %50

50:                                               ; preds = %73, %48
  %51 = load i64, ptr %13, align 8, !tbaa !9
  %52 = load i64, ptr %9, align 8, !tbaa !9
  %53 = icmp ult i64 %51, %52
  br i1 %53, label %55, label %54

54:                                               ; preds = %50
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  br label %76

55:                                               ; preds = %50
  %56 = load ptr, ptr %12, align 8, !tbaa !5
  %57 = load i64, ptr %13, align 8, !tbaa !9
  %58 = getelementptr inbounds i8, ptr %56, i64 %57
  %59 = load i8, ptr %58, align 1, !tbaa !15
  %60 = zext i8 %59 to i32
  %61 = load ptr, ptr %10, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.QuantParams, ptr %61, i32 0, i32 1
  %63 = load i32, ptr %62, align 4, !tbaa !16
  %64 = sub nsw i32 %60, %63
  %65 = sitofp i32 %64 to float
  %66 = load ptr, ptr %10, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.QuantParams, ptr %66, i32 0, i32 0
  %68 = load float, ptr %67, align 4, !tbaa !18
  %69 = fmul float %65, %68
  %70 = load ptr, ptr %7, align 8, !tbaa !5
  %71 = load i64, ptr %13, align 8, !tbaa !9
  %72 = getelementptr inbounds float, ptr %70, i64 %71
  store float %69, ptr %72, align 4, !tbaa !19
  br label %73

73:                                               ; preds = %55
  %74 = load i64, ptr %13, align 8, !tbaa !9
  %75 = add i64 %74, 1
  store i64 %75, ptr %13, align 8, !tbaa !9
  br label %50, !llvm.loop !20

76:                                               ; preds = %54
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  br label %238

77:                                               ; preds = %44
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  %78 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %78, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  store i64 0, ptr %15, align 8, !tbaa !9
  br label %79

79:                                               ; preds = %127, %77
  %80 = load i64, ptr %15, align 8, !tbaa !9
  %81 = load i64, ptr %9, align 8, !tbaa !9
  %82 = icmp ult i64 %80, %81
  br i1 %82, label %84, label %83

83:                                               ; preds = %79
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  br label %130

84:                                               ; preds = %79
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #4
  %85 = load ptr, ptr %14, align 8, !tbaa !5
  %86 = load i64, ptr %15, align 8, !tbaa !9
  %87 = udiv i64 %86, 2
  %88 = getelementptr inbounds i8, ptr %85, i64 %87
  %89 = load i8, ptr %88, align 1, !tbaa !15
  store i8 %89, ptr %16, align 1, !tbaa !15
  %90 = load i8, ptr %16, align 1, !tbaa !15
  %91 = zext i8 %90 to i32
  %92 = ashr i32 %91, 4
  %93 = load ptr, ptr %10, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.QuantParams, ptr %93, i32 0, i32 1
  %95 = load i32, ptr %94, align 4, !tbaa !16
  %96 = sub nsw i32 %92, %95
  %97 = sitofp i32 %96 to float
  %98 = load ptr, ptr %10, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.QuantParams, ptr %98, i32 0, i32 0
  %100 = load float, ptr %99, align 4, !tbaa !18
  %101 = fmul float %97, %100
  %102 = load ptr, ptr %7, align 8, !tbaa !5
  %103 = load i64, ptr %15, align 8, !tbaa !9
  %104 = getelementptr inbounds float, ptr %102, i64 %103
  store float %101, ptr %104, align 4, !tbaa !19
  %105 = load i64, ptr %15, align 8, !tbaa !9
  %106 = add i64 %105, 1
  %107 = load i64, ptr %9, align 8, !tbaa !9
  %108 = icmp ult i64 %106, %107
  br i1 %108, label %109, label %126

109:                                              ; preds = %84
  %110 = load i8, ptr %16, align 1, !tbaa !15
  %111 = zext i8 %110 to i32
  %112 = and i32 %111, 15
  %113 = load ptr, ptr %10, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.QuantParams, ptr %113, i32 0, i32 1
  %115 = load i32, ptr %114, align 4, !tbaa !16
  %116 = sub nsw i32 %112, %115
  %117 = sitofp i32 %116 to float
  %118 = load ptr, ptr %10, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.QuantParams, ptr %118, i32 0, i32 0
  %120 = load float, ptr %119, align 4, !tbaa !18
  %121 = fmul float %117, %120
  %122 = load ptr, ptr %7, align 8, !tbaa !5
  %123 = load i64, ptr %15, align 8, !tbaa !9
  %124 = add i64 %123, 1
  %125 = getelementptr inbounds float, ptr %122, i64 %124
  store float %121, ptr %125, align 4, !tbaa !19
  br label %126

126:                                              ; preds = %109, %84
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #4
  br label %127

127:                                              ; preds = %126
  %128 = load i64, ptr %15, align 8, !tbaa !9
  %129 = add i64 %128, 2
  store i64 %129, ptr %15, align 8, !tbaa !9
  br label %79, !llvm.loop !22

130:                                              ; preds = %83
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  br label %238

131:                                              ; preds = %44
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %132 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %132, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  store i64 0, ptr %18, align 8, !tbaa !9
  br label %133

133:                                              ; preds = %147, %131
  %134 = load i64, ptr %18, align 8, !tbaa !9
  %135 = load i64, ptr %9, align 8, !tbaa !9
  %136 = icmp ult i64 %134, %135
  br i1 %136, label %138, label %137

137:                                              ; preds = %133
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  br label %150

138:                                              ; preds = %133
  %139 = load ptr, ptr %17, align 8, !tbaa !5
  %140 = load i64, ptr %18, align 8, !tbaa !9
  %141 = getelementptr inbounds i16, ptr %139, i64 %140
  %142 = load i16, ptr %141, align 2, !tbaa !23
  %143 = call float @fp16_to_float(i16 noundef zeroext %142)
  %144 = load ptr, ptr %7, align 8, !tbaa !5
  %145 = load i64, ptr %18, align 8, !tbaa !9
  %146 = getelementptr inbounds float, ptr %144, i64 %145
  store float %143, ptr %146, align 4, !tbaa !19
  br label %147

147:                                              ; preds = %138
  %148 = load i64, ptr %18, align 8, !tbaa !9
  %149 = add i64 %148, 1
  store i64 %149, ptr %18, align 8, !tbaa !9
  br label %133, !llvm.loop !25

150:                                              ; preds = %137
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  br label %238

151:                                              ; preds = %44
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %152 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %152, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  %153 = load ptr, ptr %11, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.QuantConfig, ptr %153, i32 0, i32 1
  %155 = load i32, ptr %154, align 4, !tbaa !26
  %156 = icmp ne i32 %155, 0
  %157 = zext i1 %156 to i64
  %158 = select i1 %156, i32 0, i32 1
  store i32 %158, ptr %20, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  store i64 0, ptr %21, align 8, !tbaa !9
  br label %159

159:                                              ; preds = %175, %151
  %160 = load i64, ptr %21, align 8, !tbaa !9
  %161 = load i64, ptr %9, align 8, !tbaa !9
  %162 = icmp ult i64 %160, %161
  br i1 %162, label %164, label %163

163:                                              ; preds = %159
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  br label %178

164:                                              ; preds = %159
  %165 = load ptr, ptr %19, align 8, !tbaa !5
  %166 = load i64, ptr %21, align 8, !tbaa !9
  %167 = getelementptr inbounds %struct.FP8, ptr %165, i64 %166
  %168 = load i32, ptr %20, align 4, !tbaa !27
  %169 = getelementptr inbounds %struct.FP8, ptr %167, i32 0, i32 0
  %170 = load i8, ptr %169, align 1
  %171 = call float @fp8_to_float(i8 %170, i32 noundef %168)
  %172 = load ptr, ptr %7, align 8, !tbaa !5
  %173 = load i64, ptr %21, align 8, !tbaa !9
  %174 = getelementptr inbounds float, ptr %172, i64 %173
  store float %171, ptr %174, align 4, !tbaa !19
  br label %175

175:                                              ; preds = %164
  %176 = load i64, ptr %21, align 8, !tbaa !9
  %177 = add i64 %176, 1
  store i64 %177, ptr %21, align 8, !tbaa !9
  br label %159, !llvm.loop !28

178:                                              ; preds = %163
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  br label %238

179:                                              ; preds = %44
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %180 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %180, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  store i64 256, ptr %23, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  store i64 0, ptr %24, align 8, !tbaa !9
  br label %181

181:                                              ; preds = %233, %179
  %182 = load i64, ptr %24, align 8, !tbaa !9
  %183 = load i64, ptr %9, align 8, !tbaa !9
  %184 = icmp ult i64 %182, %183
  br i1 %184, label %186, label %185

185:                                              ; preds = %181
  store i32 15, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  br label %237

186:                                              ; preds = %181
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  %187 = load i64, ptr %24, align 8, !tbaa !9
  %188 = load i64, ptr %23, align 8, !tbaa !9
  %189 = add i64 %187, %188
  %190 = load i64, ptr %9, align 8, !tbaa !9
  %191 = icmp ugt i64 %189, %190
  br i1 %191, label %192, label %196

192:                                              ; preds = %186
  %193 = load i64, ptr %9, align 8, !tbaa !9
  %194 = load i64, ptr %24, align 8, !tbaa !9
  %195 = sub i64 %193, %194
  br label %198

196:                                              ; preds = %186
  %197 = load i64, ptr %23, align 8, !tbaa !9
  br label %198

198:                                              ; preds = %196, %192
  %199 = phi i64 [ %195, %192 ], [ %197, %196 ]
  store i64 %199, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %27) #4
  %200 = load ptr, ptr %22, align 8, !tbaa !5
  %201 = load i64, ptr %24, align 8, !tbaa !9
  %202 = getelementptr inbounds i8, ptr %200, i64 %201
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %27, ptr align 1 %202, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  store i64 0, ptr %28, align 8, !tbaa !9
  br label %203

203:                                              ; preds = %229, %198
  %204 = load i64, ptr %28, align 8, !tbaa !9
  %205 = load i64, ptr %26, align 8, !tbaa !9
  %206 = icmp ult i64 %204, %205
  br i1 %206, label %208, label %207

207:                                              ; preds = %203
  store i32 18, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  br label %232

208:                                              ; preds = %203
  %209 = load ptr, ptr %22, align 8, !tbaa !5
  %210 = load i64, ptr %24, align 8, !tbaa !9
  %211 = add i64 %210, 16
  %212 = load i64, ptr %28, align 8, !tbaa !9
  %213 = add i64 %211, %212
  %214 = getelementptr inbounds i8, ptr %209, i64 %213
  %215 = load i8, ptr %214, align 1, !tbaa !15
  %216 = zext i8 %215 to i32
  %217 = getelementptr inbounds %struct.QuantParams, ptr %27, i32 0, i32 1
  %218 = load i32, ptr %217, align 4, !tbaa !16
  %219 = sub nsw i32 %216, %218
  %220 = sitofp i32 %219 to float
  %221 = getelementptr inbounds %struct.QuantParams, ptr %27, i32 0, i32 0
  %222 = load float, ptr %221, align 4, !tbaa !18
  %223 = fmul float %220, %222
  %224 = load ptr, ptr %7, align 8, !tbaa !5
  %225 = load i64, ptr %24, align 8, !tbaa !9
  %226 = load i64, ptr %28, align 8, !tbaa !9
  %227 = add i64 %225, %226
  %228 = getelementptr inbounds float, ptr %224, i64 %227
  store float %223, ptr %228, align 4, !tbaa !19
  br label %229

229:                                              ; preds = %208
  %230 = load i64, ptr %28, align 8, !tbaa !9
  %231 = add i64 %230, 1
  store i64 %231, ptr %28, align 8, !tbaa !9
  br label %203, !llvm.loop !29

232:                                              ; preds = %207
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  br label %233

233:                                              ; preds = %232
  %234 = load i64, ptr %23, align 8, !tbaa !9
  %235 = load i64, ptr %24, align 8, !tbaa !9
  %236 = add i64 %235, %234
  store i64 %236, ptr %24, align 8, !tbaa !9
  br label %181, !llvm.loop !30

237:                                              ; preds = %185
  store i32 2, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  br label %238

238:                                              ; preds = %237, %178, %150, %130, %76, %44
  store i32 0, ptr %6, align 4
  br label %239

239:                                              ; preds = %238, %43
  %240 = load i32, ptr %6, align 4
  ret i32 %240
}

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

declare float @fp8_to_float(i8, i32 noundef) #3

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

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

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


; 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.FP8 = type { i8 }

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1, 1) i32 @quant_dequantize(ptr noundef writeonly %0, ptr noundef readonly %1, i64 noundef %2, ptr noundef readonly %3, ptr noundef readonly %4) local_unnamed_addr #0 {
  %6 = insertelement <4 x ptr> poison, ptr %0, i64 0
  %7 = insertelement <4 x ptr> %6, ptr %1, i64 1
  %8 = insertelement <4 x ptr> %7, ptr %3, i64 2
  %9 = insertelement <4 x ptr> %8, ptr %4, i64 3
  %10 = icmp eq <4 x ptr> %9, zeroinitializer
  %11 = icmp eq i64 %2, 0
  %12 = bitcast <4 x i1> %10 to i4
  %13 = icmp ne i4 %12, 0
  %op.rdx = or i1 %13, %11
  br i1 %op.rdx, label %.loopexit, label %14

14:                                               ; preds = %5
  %15 = load i32, ptr %4, align 4, !tbaa !5
  switch i32 %15, label %.loopexit [
    i32 0, label %.lr.ph113
    i32 1, label %.lr.ph111
    i32 2, label %.lr.ph109
    i32 3, label %.lr.ph107.preheader
    i32 4, label %.lr.ph105.preheader
  ]

.lr.ph105.preheader:                              ; preds = %14
  %scevgep137 = getelementptr i8, ptr %1, i64 16
  br label %.lr.ph105

.lr.ph111:                                        ; preds = %14
  %16 = getelementptr inbounds i8, ptr %3, i64 4
  %17 = load i32, ptr %16, align 4, !tbaa !11
  %18 = add i64 %2, -1
  %19 = lshr i64 %18, 1
  %20 = add nuw i64 %19, 1
  %min.iters.check159 = icmp ult i64 %18, 30
  br i1 %min.iters.check159, label %scalar.ph158.preheader, label %vector.scevcheck

scalar.ph158.preheader:                           ; preds = %middle.block157, %vector.memcheck147, %vector.scevcheck, %.lr.ph111
  %.083110.ph = phi i64 [ 0, %vector.memcheck147 ], [ 0, %vector.scevcheck ], [ 0, %.lr.ph111 ], [ %ind.end, %middle.block157 ]
  br label %scalar.ph158

vector.scevcheck:                                 ; preds = %.lr.ph111
  %21 = add i64 %2, -1
  %22 = lshr i64 %21, 1
  %mul.result = shl i64 %22, 3
  %23 = getelementptr i8, ptr %0, i64 %mul.result
  %24 = icmp ult ptr %23, %0
  %scevgep143 = getelementptr i8, ptr %0, i64 4
  %mul.result145 = shl i64 %22, 3
  %mul.overflow146 = icmp ugt i64 %21, 4611686018427387903
  %25 = getelementptr i8, ptr %scevgep143, i64 %mul.result145
  %26 = icmp ult ptr %25, %scevgep143
  %27 = or i1 %26, %mul.overflow146
  %28 = or i1 %24, %27
  br i1 %28, label %scalar.ph158.preheader, label %vector.memcheck147

vector.memcheck147:                               ; preds = %vector.scevcheck
  %29 = add nsw i64 %2, -1
  %30 = lshr i64 %29, 1
  %31 = shl i64 %30, 3
  %32 = getelementptr i8, ptr %0, i64 %31
  %scevgep148 = getelementptr i8, ptr %32, i64 8
  %33 = getelementptr i8, ptr %1, i64 %30
  %scevgep149 = getelementptr i8, ptr %33, i64 1
  %scevgep150 = getelementptr i8, ptr %3, i64 4
  %bound0151 = icmp ugt ptr %scevgep149, %0
  %bound1152 = icmp ugt ptr %scevgep148, %1
  %found.conflict153 = and i1 %bound0151, %bound1152
  %bound0154 = icmp ugt ptr %scevgep150, %0
  %bound1155 = icmp ugt ptr %scevgep148, %3
  %found.conflict156 = and i1 %bound0154, %bound1155
  %conflict.rdx = or i1 %found.conflict153, %found.conflict156
  br i1 %conflict.rdx, label %scalar.ph158.preheader, label %vector.ph160

vector.ph160:                                     ; preds = %vector.memcheck147
  %n.vec162 = and i64 %20, -4
  %ind.end = shl i64 %n.vec162, 1
  %broadcast.splatinsert167 = insertelement <4 x i32> poison, i32 %17, i64 0
  %broadcast.splat168 = shufflevector <4 x i32> %broadcast.splatinsert167, <4 x i32> poison, <4 x i32> zeroinitializer
  %broadcast.splatinsert171 = insertelement <4 x i64> poison, i64 %2, i64 0
  %broadcast.splat172 = shufflevector <4 x i64> %broadcast.splatinsert171, <4 x i64> poison, <4 x i32> zeroinitializer
  %34 = load float, ptr %3, align 4, !tbaa !13, !alias.scope !14
  %broadcast.splatinsert169 = insertelement <4 x float> poison, float %34, i64 0
  %broadcast.splat170 = shufflevector <4 x float> %broadcast.splatinsert169, <4 x float> poison, <4 x i32> zeroinitializer
  %35 = load float, ptr %3, align 4, !tbaa !13, !alias.scope !14
  br label %vector.body164

vector.body164:                                   ; preds = %pred.store.continue178, %vector.ph160
  %index165 = phi i64 [ 0, %vector.ph160 ], [ %index.next179, %pred.store.continue178 ]
  %vec.ind = phi <4 x i64> [ <i64 0, i64 2, i64 4, i64 6>, %vector.ph160 ], [ %vec.ind.next, %pred.store.continue178 ]
  %offset.idx = shl i64 %index165, 1
  %36 = or disjoint i64 %offset.idx, 2
  %37 = or disjoint i64 %offset.idx, 4
  %38 = or disjoint i64 %offset.idx, 6
  %39 = and i64 %index165, 9223372036854775804
  %40 = getelementptr inbounds i8, ptr %1, i64 %39
  %wide.load166 = load <4 x i8>, ptr %40, align 1, !tbaa !17, !alias.scope !18
  %41 = zext <4 x i8> %wide.load166 to <4 x i32>
  %42 = lshr <4 x i32> %41, <i32 4, i32 4, i32 4, i32 4>
  %43 = sub nsw <4 x i32> %42, %broadcast.splat168
  %44 = sitofp <4 x i32> %43 to <4 x float>
  %45 = fmul <4 x float> %broadcast.splat170, %44
  %46 = getelementptr inbounds float, ptr %0, i64 %offset.idx
  %47 = getelementptr inbounds float, ptr %0, i64 %36
  %48 = getelementptr inbounds float, ptr %0, i64 %37
  %49 = getelementptr inbounds float, ptr %0, i64 %38
  %50 = extractelement <4 x float> %45, i64 0
  store float %50, ptr %46, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  %51 = extractelement <4 x float> %45, i64 1
  store float %51, ptr %47, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  %52 = extractelement <4 x float> %45, i64 2
  store float %52, ptr %48, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  %53 = extractelement <4 x float> %45, i64 3
  store float %53, ptr %49, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  %54 = or disjoint <4 x i64> %vec.ind, <i64 1, i64 1, i64 1, i64 1>
  %55 = icmp ult <4 x i64> %54, %broadcast.splat172
  %56 = extractelement <4 x i1> %55, i64 0
  br i1 %56, label %pred.store.if, label %pred.store.continue

pred.store.if:                                    ; preds = %vector.body164
  %57 = load float, ptr %3, align 4, !tbaa !13, !alias.scope !14
  %58 = extractelement <4 x i32> %41, i64 0
  %59 = and i32 %58, 15
  %60 = sub nsw i32 %59, %17
  %61 = sitofp i32 %60 to float
  %62 = extractelement <4 x i64> %54, i64 0
  %63 = getelementptr inbounds float, ptr %0, i64 %62
  %64 = fmul float %57, %61
  store float %64, ptr %63, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  br label %pred.store.continue

pred.store.continue:                              ; preds = %pred.store.if, %vector.body164
  %65 = extractelement <4 x i1> %55, i64 1
  br i1 %65, label %pred.store.if173, label %pred.store.continue174

pred.store.if173:                                 ; preds = %pred.store.continue
  %66 = extractelement <4 x i32> %41, i64 1
  %67 = and i32 %66, 15
  %68 = sub nsw i32 %67, %17
  %69 = sitofp i32 %68 to float
  %70 = extractelement <4 x i64> %54, i64 1
  %71 = getelementptr inbounds float, ptr %0, i64 %70
  %72 = fmul float %35, %69
  store float %72, ptr %71, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  br label %pred.store.continue174

pred.store.continue174:                           ; preds = %pred.store.if173, %pred.store.continue
  %73 = extractelement <4 x i1> %55, i64 2
  br i1 %73, label %pred.store.if175, label %pred.store.continue176

pred.store.if175:                                 ; preds = %pred.store.continue174
  %74 = extractelement <4 x i32> %41, i64 2
  %75 = and i32 %74, 15
  %76 = sub nsw i32 %75, %17
  %77 = sitofp i32 %76 to float
  %78 = extractelement <4 x i64> %54, i64 2
  %79 = getelementptr inbounds float, ptr %0, i64 %78
  %80 = fmul float %35, %77
  store float %80, ptr %79, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  br label %pred.store.continue176

pred.store.continue176:                           ; preds = %pred.store.if175, %pred.store.continue174
  %81 = extractelement <4 x i1> %55, i64 3
  br i1 %81, label %pred.store.if177, label %pred.store.continue178

pred.store.if177:                                 ; preds = %pred.store.continue176
  %82 = extractelement <4 x i32> %41, i64 3
  %83 = and i32 %82, 15
  %84 = sub nsw i32 %83, %17
  %85 = sitofp i32 %84 to float
  %86 = extractelement <4 x i64> %54, i64 3
  %87 = getelementptr inbounds float, ptr %0, i64 %86
  %88 = fmul float %35, %85
  store float %88, ptr %87, align 4, !tbaa !20, !alias.scope !21, !noalias !23
  br label %pred.store.continue178

pred.store.continue178:                           ; preds = %pred.store.if177, %pred.store.continue176
  %index.next179 = add nuw i64 %index165, 4
  %vec.ind.next = add <4 x i64> %vec.ind, <i64 8, i64 8, i64 8, i64 8>
  %89 = icmp eq i64 %index.next179, %n.vec162
  br i1 %89, label %middle.block157, label %vector.body164, !llvm.loop !24

middle.block157:                                  ; preds = %pred.store.continue178
  %cmp.n180 = icmp eq i64 %20, %n.vec162
  br i1 %cmp.n180, label %.loopexit, label %scalar.ph158.preheader

.lr.ph113:                                        ; preds = %14
  %90 = getelementptr inbounds i8, ptr %3, i64 4
  %91 = load i32, ptr %90, align 4, !tbaa !11
  %min.iters.check194 = icmp ult i64 %2, 8
  br i1 %min.iters.check194, label %scalar.ph193.preheader, label %vector.memcheck181

vector.memcheck181:                               ; preds = %.lr.ph113
  %92 = shl i64 %2, 2
  %scevgep182 = getelementptr i8, ptr %0, i64 %92
  %scevgep183 = getelementptr i8, ptr %1, i64 %2
  %scevgep184 = getelementptr i8, ptr %3, i64 4
  %bound0185 = icmp ugt ptr %scevgep183, %0
  %bound1186 = icmp ugt ptr %scevgep182, %1
  %found.conflict187 = and i1 %bound0185, %bound1186
  %bound0188 = icmp ugt ptr %scevgep184, %0
  %bound1189 = icmp ugt ptr %scevgep182, %3
  %found.conflict190 = and i1 %bound0188, %bound1189
  %conflict.rdx191 = or i1 %found.conflict187, %found.conflict190
  br i1 %conflict.rdx191, label %scalar.ph193.preheader, label %vector.ph195

vector.ph195:                                     ; preds = %vector.memcheck181
  %n.vec197 = and i64 %2, -8
  %broadcast.splatinsert203 = insertelement <4 x i32> poison, i32 %91, i64 0
  %broadcast.splat204 = shufflevector <4 x i32> %broadcast.splatinsert203, <4 x i32> poison, <4 x i32> zeroinitializer
  %93 = load float, ptr %3, align 4, !tbaa !13, !alias.scope !28
  %broadcast.splatinsert207 = insertelement <4 x float> poison, float %93, i64 0
  %broadcast.splat208 = shufflevector <4 x float> %broadcast.splatinsert207, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body199

vector.body199:                                   ; preds = %vector.body199, %vector.ph195
  %index200 = phi i64 [ 0, %vector.ph195 ], [ %index.next209, %vector.body199 ]
  %94 = getelementptr inbounds i8, ptr %1, i64 %index200
  %95 = getelementptr inbounds i8, ptr %94, i64 4
  %wide.load201 = load <4 x i8>, ptr %94, align 1, !tbaa !17, !alias.scope !31
  %wide.load202 = load <4 x i8>, ptr %95, align 1, !tbaa !17, !alias.scope !31
  %96 = zext <4 x i8> %wide.load201 to <4 x i32>
  %97 = zext <4 x i8> %wide.load202 to <4 x i32>
  %98 = sub nsw <4 x i32> %96, %broadcast.splat204
  %99 = sub nsw <4 x i32> %97, %broadcast.splat204
  %100 = sitofp <4 x i32> %98 to <4 x float>
  %101 = sitofp <4 x i32> %99 to <4 x float>
  %102 = fmul <4 x float> %broadcast.splat208, %100
  %103 = fmul <4 x float> %broadcast.splat208, %101
  %104 = getelementptr inbounds float, ptr %0, i64 %index200
  %105 = getelementptr inbounds i8, ptr %104, i64 16
  store <4 x float> %102, ptr %104, align 4, !tbaa !20, !alias.scope !33, !noalias !35
  store <4 x float> %103, ptr %105, align 4, !tbaa !20, !alias.scope !33, !noalias !35
  %index.next209 = add nuw i64 %index200, 8
  %106 = icmp eq i64 %index.next209, %n.vec197
  br i1 %106, label %middle.block192, label %vector.body199, !llvm.loop !36

middle.block192:                                  ; preds = %vector.body199
  %cmp.n210 = icmp eq i64 %n.vec197, %2
  br i1 %cmp.n210, label %.loopexit, label %scalar.ph193.preheader

scalar.ph193.preheader:                           ; preds = %middle.block192, %vector.memcheck181, %.lr.ph113
  %.082112.ph = phi i64 [ 0, %vector.memcheck181 ], [ 0, %.lr.ph113 ], [ %n.vec197, %middle.block192 ]
  %xtraiter = and i64 %2, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %scalar.ph193.prol.loopexit, label %scalar.ph193.prol

scalar.ph193.prol:                                ; preds = %scalar.ph193.preheader
  %107 = getelementptr inbounds i8, ptr %1, i64 %.082112.ph
  %108 = load i8, ptr %107, align 1, !tbaa !17
  %109 = zext i8 %108 to i32
  %110 = sub nsw i32 %109, %91
  %111 = sitofp i32 %110 to float
  %112 = load float, ptr %3, align 4, !tbaa !13
  %113 = fmul float %112, %111
  %114 = getelementptr inbounds float, ptr %0, i64 %.082112.ph
  store float %113, ptr %114, align 4, !tbaa !20
  %115 = or disjoint i64 %.082112.ph, 1
  br label %scalar.ph193.prol.loopexit

scalar.ph193.prol.loopexit:                       ; preds = %scalar.ph193.prol, %scalar.ph193.preheader
  %.082112.unr = phi i64 [ %.082112.ph, %scalar.ph193.preheader ], [ %115, %scalar.ph193.prol ]
  %116 = add i64 %2, -1
  %117 = icmp eq i64 %.082112.ph, %116
  br i1 %117, label %.loopexit, label %scalar.ph193

scalar.ph193:                                     ; preds = %scalar.ph193.prol.loopexit, %scalar.ph193
  %.082112 = phi i64 [ %135, %scalar.ph193 ], [ %.082112.unr, %scalar.ph193.prol.loopexit ]
  %118 = getelementptr inbounds i8, ptr %1, i64 %.082112
  %119 = load i8, ptr %118, align 1, !tbaa !17
  %120 = zext i8 %119 to i32
  %121 = sub nsw i32 %120, %91
  %122 = sitofp i32 %121 to float
  %123 = load float, ptr %3, align 4, !tbaa !13
  %124 = fmul float %123, %122
  %125 = getelementptr inbounds float, ptr %0, i64 %.082112
  store float %124, ptr %125, align 4, !tbaa !20
  %126 = add nuw i64 %.082112, 1
  %127 = getelementptr inbounds i8, ptr %1, i64 %126
  %128 = load i8, ptr %127, align 1, !tbaa !17
  %129 = zext i8 %128 to i32
  %130 = sub nsw i32 %129, %91
  %131 = sitofp i32 %130 to float
  %132 = load float, ptr %3, align 4, !tbaa !13
  %133 = fmul float %132, %131
  %134 = getelementptr inbounds float, ptr %0, i64 %126
  store float %133, ptr %134, align 4, !tbaa !20
  %135 = add nuw i64 %.082112, 2
  %exitcond125.not.1 = icmp eq i64 %135, %2
  br i1 %exitcond125.not.1, label %.loopexit, label %scalar.ph193, !llvm.loop !37

scalar.ph158:                                     ; preds = %scalar.ph158.preheader, %155
  %.083110 = phi i64 [ %156, %155 ], [ %.083110.ph, %scalar.ph158.preheader ]
  %136 = lshr exact i64 %.083110, 1
  %137 = getelementptr inbounds i8, ptr %1, i64 %136
  %138 = load i8, ptr %137, align 1, !tbaa !17
  %139 = zext i8 %138 to i32
  %140 = lshr i32 %139, 4
  %141 = sub nsw i32 %140, %17
  %142 = sitofp i32 %141 to float
  %143 = load float, ptr %3, align 4, !tbaa !13
  %144 = fmul float %143, %142
  %145 = getelementptr inbounds float, ptr %0, i64 %.083110
  store float %144, ptr %145, align 4, !tbaa !20
  %146 = or disjoint i64 %.083110, 1
  %147 = icmp ult i64 %146, %2
  br i1 %147, label %148, label %155

148:                                              ; preds = %scalar.ph158
  %149 = and i32 %139, 15
  %150 = sub nsw i32 %149, %17
  %151 = sitofp i32 %150 to float
  %152 = load float, ptr %3, align 4, !tbaa !13
  %153 = fmul float %152, %151
  %154 = getelementptr inbounds float, ptr %0, i64 %146
  store float %153, ptr %154, align 4, !tbaa !20
  br label %155

155:                                              ; preds = %148, %scalar.ph158
  %156 = add nuw i64 %.083110, 2
  %157 = icmp ult i64 %156, %2
  br i1 %157, label %scalar.ph158, label %.loopexit, !llvm.loop !38

.lr.ph109:                                        ; preds = %14, %.lr.ph109
  %.085108 = phi i64 [ %162, %.lr.ph109 ], [ 0, %14 ]
  %158 = getelementptr inbounds i16, ptr %1, i64 %.085108
  %159 = load i16, ptr %158, align 2, !tbaa !39
  %160 = tail call float @fp16_to_float(i16 noundef zeroext %159)
  %161 = getelementptr inbounds float, ptr %0, i64 %.085108
  store float %160, ptr %161, align 4, !tbaa !20
  %162 = add nuw i64 %.085108, 1
  %exitcond124.not = icmp eq i64 %162, %2
  br i1 %exitcond124.not, label %.loopexit, label %.lr.ph109, !llvm.loop !41

.lr.ph107.preheader:                              ; preds = %14
  %163 = getelementptr inbounds i8, ptr %4, i64 4
  %164 = load i32, ptr %163, align 4, !tbaa !42
  %.not = icmp eq i32 %164, 0
  %165 = zext i1 %.not to i32
  br label %.lr.ph107

.lr.ph107:                                        ; preds = %.lr.ph107.preheader, %.lr.ph107
  %.086106 = phi i64 [ %170, %.lr.ph107 ], [ 0, %.lr.ph107.preheader ]
  %166 = getelementptr inbounds %struct.FP8, ptr %1, i64 %.086106
  %167 = load i8, ptr %166, align 1
  %168 = tail call float @fp8_to_float(i8 %167, i32 noundef %165) #3
  %169 = getelementptr inbounds float, ptr %0, i64 %.086106
  store float %168, ptr %169, align 4, !tbaa !20
  %170 = add nuw i64 %.086106, 1
  %exitcond.not = icmp eq i64 %170, %2
  br i1 %exitcond.not, label %.loopexit, label %.lr.ph107, !llvm.loop !43

.loopexit100:                                     ; preds = %scalar.ph, %middle.block, %.lr.ph105
  %171 = icmp ult i64 %183, %2
  %indvar.next = add i64 %indvar, 1
  br i1 %171, label %.lr.ph105, label %.loopexit, !llvm.loop !44

.lr.ph105:                                        ; preds = %.lr.ph105.preheader, %.loopexit100
  %indvar = phi i64 [ 0, %.lr.ph105.preheader ], [ %indvar.next, %.loopexit100 ]
  %.084104 = phi i64 [ 0, %.lr.ph105.preheader ], [ %183, %.loopexit100 ]
  %172 = add i64 %.084104, 256
  %umin139 = tail call i64 @llvm.umin.i64(i64 %2, i64 %172)
  %173 = shl i64 %indvar, 8
  %174 = sub i64 %umin139, %173
  %175 = shl i64 %indvar, 10
  %scevgep = getelementptr i8, ptr %0, i64 %175
  %176 = or disjoint i64 %175, 4
  %scevgep134 = getelementptr i8, ptr %0, i64 %176
  %177 = add i64 %.084104, 256
  %umin = tail call i64 @llvm.umin.i64(i64 %2, i64 %177)
  %178 = shl i64 %indvar, 8
  %179 = xor i64 %178, -1
  %180 = add i64 %umin, %179
  %181 = shl i64 %180, 2
  %scevgep135 = getelementptr i8, ptr %scevgep134, i64 %181
  %182 = or disjoint i64 %.084104, 16
  %scevgep136 = getelementptr i8, ptr %1, i64 %182
  %scevgep138 = getelementptr i8, ptr %scevgep137, i64 %umin
  %183 = add nuw i64 %.084104, 256
  %184 = icmp ugt i64 %183, %2
  %185 = sub i64 %2, %.084104
  %186 = select i1 %184, i64 %185, i64 256
  %187 = getelementptr inbounds i8, ptr %1, i64 %.084104
  %.sroa.0.0.copyload = load float, ptr %187, align 1
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %187, i64 4
  %.sroa.4.0.copyload = load i32, ptr %.sroa.4.0..sroa_idx, align 1
  %.not115 = icmp eq i64 %186, 0
  br i1 %.not115, label %.loopexit100, label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph105
  %188 = or disjoint i64 %.084104, 16
  %189 = getelementptr i8, ptr %1, i64 %188
  %190 = getelementptr float, ptr %0, i64 %.084104
  %min.iters.check = icmp ult i64 %174, 8
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph
  %bound0 = icmp ult ptr %scevgep, %scevgep138
  %bound1 = icmp ult ptr %scevgep136, %scevgep135
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.mod.vf = and i64 %umin139, 7
  %n.vec = sub i64 %174, %n.mod.vf
  %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %.sroa.4.0.copyload, i64 0
  %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer
  %broadcast.splatinsert141 = insertelement <4 x float> poison, float %.sroa.0.0.copyload, i64 0
  %broadcast.splat142 = shufflevector <4 x float> %broadcast.splatinsert141, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %191 = getelementptr i8, ptr %189, i64 %index
  %192 = getelementptr i8, ptr %191, i64 4
  %wide.load = load <4 x i8>, ptr %191, align 1, !tbaa !17, !alias.scope !45
  %wide.load140 = load <4 x i8>, ptr %192, align 1, !tbaa !17, !alias.scope !45
  %193 = zext <4 x i8> %wide.load to <4 x i32>
  %194 = zext <4 x i8> %wide.load140 to <4 x i32>
  %195 = sub nsw <4 x i32> %193, %broadcast.splat
  %196 = sub nsw <4 x i32> %194, %broadcast.splat
  %197 = sitofp <4 x i32> %195 to <4 x float>
  %198 = sitofp <4 x i32> %196 to <4 x float>
  %199 = fmul <4 x float> %broadcast.splat142, %197
  %200 = fmul <4 x float> %broadcast.splat142, %198
  %201 = getelementptr float, ptr %190, i64 %index
  %202 = getelementptr i8, ptr %201, i64 16
  store <4 x float> %199, ptr %201, align 4, !tbaa !20, !alias.scope !48, !noalias !45
  store <4 x float> %200, ptr %202, align 4, !tbaa !20, !alias.scope !48, !noalias !45
  %index.next = add nuw i64 %index, 8
  %203 = icmp eq i64 %index.next, %n.vec
  br i1 %203, label %middle.block, label %vector.body, !llvm.loop !50

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.mod.vf, 0
  br i1 %cmp.n, label %.loopexit100, label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %middle.block, %vector.memcheck, %.lr.ph
  %.0103.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph ], [ %n.vec, %middle.block ]
  br label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0103 = phi i64 [ %211, %scalar.ph ], [ %.0103.ph, %scalar.ph.preheader ]
  %204 = getelementptr i8, ptr %189, i64 %.0103
  %205 = load i8, ptr %204, align 1, !tbaa !17
  %206 = zext i8 %205 to i32
  %207 = sub nsw i32 %206, %.sroa.4.0.copyload
  %208 = sitofp i32 %207 to float
  %209 = fmul float %.sroa.0.0.copyload, %208
  %210 = getelementptr float, ptr %190, i64 %.0103
  store float %209, ptr %210, align 4, !tbaa !20
  %211 = add nuw i64 %.0103, 1
  %212 = icmp ult i64 %211, %186
  br i1 %212, label %scalar.ph, label %.loopexit100, !llvm.loop !51

.loopexit:                                        ; preds = %.loopexit100, %.lr.ph107, %.lr.ph109, %155, %scalar.ph193.prol.loopexit, %scalar.ph193, %middle.block157, %middle.block192, %14, %5
  %.081 = phi i32 [ -1, %5 ], [ 0, %14 ], [ 0, %middle.block192 ], [ 0, %middle.block157 ], [ 0, %scalar.ph193 ], [ 0, %scalar.ph193.prol.loopexit ], [ 0, %155 ], [ 0, %.lr.ph109 ], [ 0, %.lr.ph107 ], [ 0, %.loopexit100 ]
  ret i32 %.081
}

; Function Attrs: nounwind uwtable
declare hidden float @fp16_to_float(i16 noundef zeroext) local_unnamed_addr #0

declare float @fp8_to_float(i8, i32 noundef) local_unnamed_addr #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.umin.i64(i64, i64) #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 12}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!12, !7, i64 4}
!12 = !{!"", !10, i64 0, !7, i64 4, !10, i64 8, !10, i64 12}
!13 = !{!12, !10, i64 0}
!14 = !{!15}
!15 = distinct !{!15, !16}
!16 = distinct !{!16, !"LVerDomain"}
!17 = !{!8, !8, i64 0}
!18 = !{!19}
!19 = distinct !{!19, !16}
!20 = !{!10, !10, i64 0}
!21 = !{!22}
!22 = distinct !{!22, !16}
!23 = !{!19, !15}
!24 = distinct !{!24, !25, !26, !27}
!25 = !{!"llvm.loop.mustprogress"}
!26 = !{!"llvm.loop.isvectorized", i32 1}
!27 = !{!"llvm.loop.unroll.runtime.disable"}
!28 = !{!29}
!29 = distinct !{!29, !30}
!30 = distinct !{!30, !"LVerDomain"}
!31 = !{!32}
!32 = distinct !{!32, !30}
!33 = !{!34}
!34 = distinct !{!34, !30}
!35 = !{!32, !29}
!36 = distinct !{!36, !25, !26, !27}
!37 = distinct !{!37, !25, !26}
!38 = distinct !{!38, !25, !26}
!39 = !{!40, !40, i64 0}
!40 = !{!"short", !8, i64 0}
!41 = distinct !{!41, !25}
!42 = !{!6, !7, i64 4}
!43 = distinct !{!43, !25}
!44 = distinct !{!44, !25}
!45 = !{!46}
!46 = distinct !{!46, !47}
!47 = distinct !{!47, !"LVerDomain"}
!48 = !{!49}
!49 = distinct !{!49, !47}
!50 = distinct !{!50, !25, !26, !27}
!51 = distinct !{!51, !25, !26}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalDCEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass