; LLVM IR from indygreg/python-zstandard :: zstd (zstd)

; 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.HUF_WriteCTableWksp = type { %struct.HUF_CompressWeightsWksp, [13 x i8], [255 x i8] }
%struct.HUF_CompressWeightsWksp = type { [59 x i32], [41 x i32], [13 x i32], [13 x i16] }

; Function Attrs: nounwind uwtable
declare hidden i32 @ERR_isError(i64 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: nounwind uwtable
define dso_local i64 @HUF_writeCTable_wksp(ptr noundef %0, i64 noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4, ptr noundef %5, i64 noundef %6) #0 {
  %8 = alloca i64, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i64, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i64, align 8
  store ptr %0, ptr %9, align 8, !tbaa !5
  store i64 %1, ptr %10, align 8, !tbaa !9
  store ptr %2, ptr %11, align 8, !tbaa !5
  store i32 %3, ptr %12, align 4, !tbaa !11
  store i32 %4, ptr %13, align 4, !tbaa !11
  store ptr %5, ptr %14, align 8, !tbaa !5
  store i64 %6, ptr %15, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #2
  %22 = load ptr, ptr %11, align 8, !tbaa !5
  %23 = getelementptr inbounds i64, ptr %22, i64 1
  store ptr %23, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #2
  %24 = load ptr, ptr %9, align 8, !tbaa !5
  store ptr %24, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #2
  %25 = load ptr, ptr %14, align 8, !tbaa !5
  %26 = call ptr @HUF_alignUpWorkspace(ptr noundef %25, ptr noundef %15, i64 noundef 4)
  store ptr %26, ptr %19, align 8, !tbaa !5
  %27 = load i64, ptr %15, align 8, !tbaa !9
  %28 = icmp ult i64 %27, 748
  br i1 %28, label %29, label %30

29:                                               ; preds = %7
  store i64 -1, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %191

30:                                               ; preds = %7
  %31 = load i32, ptr %12, align 4, !tbaa !11
  %32 = icmp ugt i32 %31, 255
  br i1 %32, label %33, label %34

33:                                               ; preds = %30
  store i64 -46, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %191

34:                                               ; preds = %30
  %35 = load ptr, ptr %19, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %35, i32 0, i32 1
  %37 = getelementptr inbounds [13 x i8], ptr %36, i64 0, i64 0
  store i8 0, ptr %37, align 4, !tbaa !13
  store i32 1, ptr %18, align 4, !tbaa !11
  br label %38

38:                                               ; preds = %54, %34
  %39 = load i32, ptr %18, align 4, !tbaa !11
  %40 = load i32, ptr %13, align 4, !tbaa !11
  %41 = add i32 %40, 1
  %42 = icmp ult i32 %39, %41
  br i1 %42, label %43, label %57

43:                                               ; preds = %38
  %44 = load i32, ptr %13, align 4, !tbaa !11
  %45 = add i32 %44, 1
  %46 = load i32, ptr %18, align 4, !tbaa !11
  %47 = sub i32 %45, %46
  %48 = trunc i32 %47 to i8
  %49 = load ptr, ptr %19, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %49, i32 0, i32 1
  %51 = load i32, ptr %18, align 4, !tbaa !11
  %52 = zext i32 %51 to i64
  %53 = getelementptr inbounds [13 x i8], ptr %50, i64 0, i64 %52
  store i8 %48, ptr %53, align 1, !tbaa !13
  br label %54

54:                                               ; preds = %43
  %55 = load i32, ptr %18, align 4, !tbaa !11
  %56 = add i32 %55, 1
  store i32 %56, ptr %18, align 4, !tbaa !11
  br label %38, !llvm.loop !14

57:                                               ; preds = %38
  store i32 0, ptr %18, align 4, !tbaa !11
  br label %58

58:                                               ; preds = %78, %57
  %59 = load i32, ptr %18, align 4, !tbaa !11
  %60 = load i32, ptr %12, align 4, !tbaa !11
  %61 = icmp ult i32 %59, %60
  br i1 %61, label %62, label %81

62:                                               ; preds = %58
  %63 = load ptr, ptr %19, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %63, i32 0, i32 1
  %65 = load ptr, ptr %16, align 8, !tbaa !5
  %66 = load i32, ptr %18, align 4, !tbaa !11
  %67 = zext i32 %66 to i64
  %68 = getelementptr inbounds i64, ptr %65, i64 %67
  %69 = load i64, ptr %68, align 8, !tbaa !9
  %70 = call i64 @HUF_getNbBits(i64 noundef %69)
  %71 = getelementptr inbounds [13 x i8], ptr %64, i64 0, i64 %70
  %72 = load i8, ptr %71, align 1, !tbaa !13
  %73 = load ptr, ptr %19, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %73, i32 0, i32 2
  %75 = load i32, ptr %18, align 4, !tbaa !11
  %76 = zext i32 %75 to i64
  %77 = getelementptr inbounds [255 x i8], ptr %74, i64 0, i64 %76
  store i8 %72, ptr %77, align 1, !tbaa !13
  br label %78

78:                                               ; preds = %62
  %79 = load i32, ptr %18, align 4, !tbaa !11
  %80 = add i32 %79, 1
  store i32 %80, ptr %18, align 4, !tbaa !11
  br label %58, !llvm.loop !16

81:                                               ; preds = %58
  %82 = load i64, ptr %10, align 8, !tbaa !9
  %83 = icmp ult i64 %82, 1
  br i1 %83, label %84, label %85

84:                                               ; preds = %81
  store i64 -70, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %191

85:                                               ; preds = %81
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #2
  %86 = load ptr, ptr %17, align 8, !tbaa !5
  %87 = getelementptr inbounds i8, ptr %86, i64 1
  %88 = load i64, ptr %10, align 8, !tbaa !9
  %89 = sub i64 %88, 1
  %90 = load ptr, ptr %19, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %90, i32 0, i32 2
  %92 = getelementptr inbounds [255 x i8], ptr %91, i64 0, i64 0
  %93 = load i32, ptr %12, align 4, !tbaa !11
  %94 = zext i32 %93 to i64
  %95 = load ptr, ptr %19, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %95, i32 0, i32 0
  %97 = call i64 @HUF_compressWeights(ptr noundef %87, i64 noundef %89, ptr noundef %92, i64 noundef %94, ptr noundef %96, i64 noundef 480)
  store i64 %97, ptr %21, align 8, !tbaa !9
  br label %98

98:                                               ; preds = %85
  %99 = load i64, ptr %21, align 8, !tbaa !9
  %100 = call i32 @ERR_isError(i64 noundef %99)
  %101 = icmp ne i32 %100, 0
  br i1 %101, label %102, label %104

102:                                              ; preds = %98
  %103 = load i64, ptr %21, align 8, !tbaa !9
  store i64 %103, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %126

104:                                              ; preds = %98
  br label %105

105:                                              ; preds = %104
  br label %106

106:                                              ; preds = %105
  %107 = load i64, ptr %21, align 8, !tbaa !9
  %108 = icmp ugt i64 %107, 1
  %109 = zext i1 %108 to i32
  %110 = load i64, ptr %21, align 8, !tbaa !9
  %111 = load i32, ptr %12, align 4, !tbaa !11
  %112 = udiv i32 %111, 2
  %113 = zext i32 %112 to i64
  %114 = icmp ult i64 %110, %113
  %115 = zext i1 %114 to i32
  %116 = and i32 %109, %115
  %117 = icmp ne i32 %116, 0
  br i1 %117, label %118, label %125

118:                                              ; preds = %106
  %119 = load i64, ptr %21, align 8, !tbaa !9
  %120 = trunc i64 %119 to i8
  %121 = load ptr, ptr %17, align 8, !tbaa !5
  %122 = getelementptr inbounds i8, ptr %121, i64 0
  store i8 %120, ptr %122, align 1, !tbaa !13
  %123 = load i64, ptr %21, align 8, !tbaa !9
  %124 = add i64 %123, 1
  store i64 %124, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %126

125:                                              ; preds = %106
  store i32 0, ptr %20, align 4
  br label %126

126:                                              ; preds = %125, %118, %102
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #2
  %127 = load i32, ptr %20, align 4
  switch i32 %127, label %191 [
    i32 0, label %128
  ]

128:                                              ; preds = %126
  %129 = load i32, ptr %12, align 4, !tbaa !11
  %130 = icmp ugt i32 %129, 128
  br i1 %130, label %131, label %132

131:                                              ; preds = %128
  store i64 -1, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %191

132:                                              ; preds = %128
  %133 = load i32, ptr %12, align 4, !tbaa !11
  %134 = add i32 %133, 1
  %135 = udiv i32 %134, 2
  %136 = add i32 %135, 1
  %137 = zext i32 %136 to i64
  %138 = load i64, ptr %10, align 8, !tbaa !9
  %139 = icmp ugt i64 %137, %138
  br i1 %139, label %140, label %141

140:                                              ; preds = %132
  store i64 -70, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %191

141:                                              ; preds = %132
  %142 = load i32, ptr %12, align 4, !tbaa !11
  %143 = sub i32 %142, 1
  %144 = add i32 128, %143
  %145 = trunc i32 %144 to i8
  %146 = load ptr, ptr %17, align 8, !tbaa !5
  %147 = getelementptr inbounds i8, ptr %146, i64 0
  store i8 %145, ptr %147, align 1, !tbaa !13
  %148 = load ptr, ptr %19, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %148, i32 0, i32 2
  %150 = load i32, ptr %12, align 4, !tbaa !11
  %151 = zext i32 %150 to i64
  %152 = getelementptr inbounds [255 x i8], ptr %149, i64 0, i64 %151
  store i8 0, ptr %152, align 1, !tbaa !13
  store i32 0, ptr %18, align 4, !tbaa !11
  br label %153

153:                                              ; preds = %182, %141
  %154 = load i32, ptr %18, align 4, !tbaa !11
  %155 = load i32, ptr %12, align 4, !tbaa !11
  %156 = icmp ult i32 %154, %155
  br i1 %156, label %157, label %185

157:                                              ; preds = %153
  %158 = load ptr, ptr %19, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %158, i32 0, i32 2
  %160 = load i32, ptr %18, align 4, !tbaa !11
  %161 = zext i32 %160 to i64
  %162 = getelementptr inbounds [255 x i8], ptr %159, i64 0, i64 %161
  %163 = load i8, ptr %162, align 1, !tbaa !13
  %164 = zext i8 %163 to i32
  %165 = shl i32 %164, 4
  %166 = load ptr, ptr %19, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.HUF_WriteCTableWksp, ptr %166, i32 0, i32 2
  %168 = load i32, ptr %18, align 4, !tbaa !11
  %169 = add i32 %168, 1
  %170 = zext i32 %169 to i64
  %171 = getelementptr inbounds [255 x i8], ptr %167, i64 0, i64 %170
  %172 = load i8, ptr %171, align 1, !tbaa !13
  %173 = zext i8 %172 to i32
  %174 = add nsw i32 %165, %173
  %175 = trunc i32 %174 to i8
  %176 = load ptr, ptr %17, align 8, !tbaa !5
  %177 = load i32, ptr %18, align 4, !tbaa !11
  %178 = udiv i32 %177, 2
  %179 = add i32 %178, 1
  %180 = zext i32 %179 to i64
  %181 = getelementptr inbounds i8, ptr %176, i64 %180
  store i8 %175, ptr %181, align 1, !tbaa !13
  br label %182

182:                                              ; preds = %157
  %183 = load i32, ptr %18, align 4, !tbaa !11
  %184 = add i32 %183, 2
  store i32 %184, ptr %18, align 4, !tbaa !11
  br label %153, !llvm.loop !17

185:                                              ; preds = %153
  %186 = load i32, ptr %12, align 4, !tbaa !11
  %187 = add i32 %186, 1
  %188 = udiv i32 %187, 2
  %189 = add i32 %188, 1
  %190 = zext i32 %189 to i64
  store i64 %190, ptr %8, align 8
  store i32 1, ptr %20, align 4
  br label %191

191:                                              ; preds = %185, %140, %131, %126, %84, %33, %29
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #2
  %192 = load i64, ptr %8, align 8
  ret i64 %192
}

; Function Attrs: nounwind uwtable
declare hidden ptr @HUF_alignUpWorkspace(ptr noundef, ptr noundef, i64 noundef) #0

; Function Attrs: nounwind uwtable
declare hidden i64 @HUF_getNbBits(i64 noundef) #0

; Function Attrs: nounwind uwtable
declare hidden i64 @HUF_compressWeights(ptr noundef, i64 noundef, ptr noundef, i64 noundef, ptr noundef, i64 noundef) #0

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!7, !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}
!17 = distinct !{!17, !15}


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

; Function Attrs: nounwind uwtable
declare hidden i32 @ERR_isError(i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local i64 @HUF_writeCTable_wksp(ptr noundef %0, i64 noundef %1, ptr nocapture noundef readonly %2, i32 noundef %3, i32 noundef %4, ptr noundef %5, i64 noundef %6) local_unnamed_addr #0 {
  %8 = alloca i64, align 8
  store i64 %6, ptr %8, align 8, !tbaa !5
  %9 = getelementptr inbounds i8, ptr %2, i64 8
  %10 = call ptr @HUF_alignUpWorkspace(ptr noundef %5, ptr noundef nonnull %8, i64 noundef 4)
  %11 = load i64, ptr %8, align 8, !tbaa !5
  %12 = icmp ult i64 %11, 748
  br i1 %12, label %.thread, label %13

13:                                               ; preds = %7
  %14 = icmp ugt i32 %3, 255
  br i1 %14, label %.thread, label %15

15:                                               ; preds = %13
  %16 = getelementptr inbounds i8, ptr %10, i64 480
  store i8 0, ptr %16, align 4, !tbaa !9
  %17 = add i32 %4, 1
  %18 = icmp ugt i32 %17, 1
  br i1 %18, label %iter.check, label %.preheader

iter.check:                                       ; preds = %15
  %wide.trip.count = zext i32 %17 to i64
  %19 = add nsw i64 %wide.trip.count, -1
  %min.iters.check = icmp ult i32 %17, 9
  br i1 %min.iters.check, label %.lr.ph.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %iter.check
  %min.iters.check78 = icmp ult i32 %17, 17
  br i1 %min.iters.check78, label %vec.epilog.ph, label %vector.ph

vector.ph:                                        ; preds = %vector.main.loop.iter.check
  %n.vec = and i64 %19, -16
  %broadcast.splatinsert = insertelement <16 x i32> poison, i32 %17, i64 0
  %broadcast.splat = shufflevector <16 x i32> %broadcast.splatinsert, <16 x i32> poison, <16 x i32> zeroinitializer
  %ind.end = or disjoint i64 %n.vec, 1
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.ind = phi <16 x i32> [ <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, i32 16>, %vector.ph ], [ %vec.ind.next, %vector.body ]
  %offset.idx = or disjoint i64 %index, 1
  %20 = sub <16 x i32> %broadcast.splat, %vec.ind
  %21 = trunc <16 x i32> %20 to <16 x i8>
  %22 = getelementptr inbounds [13 x i8], ptr %16, i64 0, i64 %offset.idx
  store <16 x i8> %21, ptr %22, align 1, !tbaa !9
  %index.next = add nuw i64 %index, 16
  %vec.ind.next = add <16 x i32> %vec.ind, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
  %23 = icmp eq i64 %index.next, %n.vec
  br i1 %23, label %middle.block, label %vector.body, !llvm.loop !10

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %19, %n.vec
  br i1 %cmp.n, label %.preheader, label %vec.epilog.iter.check

vec.epilog.iter.check:                            ; preds = %middle.block
  %ind.end82 = or disjoint i64 %n.vec, 1
  %n.vec.remaining = and i64 %19, 8
  %min.epilog.iters.check.not.not = icmp eq i64 %n.vec.remaining, 0
  br i1 %min.epilog.iters.check.not.not, label %.lr.ph.preheader, label %vec.epilog.ph

.lr.ph.preheader:                                 ; preds = %vec.epilog.middle.block, %iter.check, %vec.epilog.iter.check
  %indvars.iv.ph = phi i64 [ 1, %iter.check ], [ %ind.end82, %vec.epilog.iter.check ], [ %ind.end81, %vec.epilog.middle.block ]
  br label %.lr.ph

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %bc.resume.val = phi i64 [ %ind.end, %vec.epilog.iter.check ], [ 1, %vector.main.loop.iter.check ]
  %vec.epilog.resume.val = phi i64 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  %n.vec80 = and i64 %19, -8
  %ind.end81 = or disjoint i64 %n.vec80, 1
  %24 = trunc i64 %bc.resume.val to i32
  %.splatinsert = insertelement <8 x i32> poison, i32 %24, i64 0
  %.splat = shufflevector <8 x i32> %.splatinsert, <8 x i32> poison, <8 x i32> zeroinitializer
  %induction = add <8 x i32> %.splat, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
  %broadcast.splatinsert88 = insertelement <8 x i32> poison, i32 %17, i64 0
  %broadcast.splat89 = shufflevector <8 x i32> %broadcast.splatinsert88, <8 x i32> poison, <8 x i32> zeroinitializer
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %vec.epilog.vector.body, %vec.epilog.ph
  %index84 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next90, %vec.epilog.vector.body ]
  %vec.ind85 = phi <8 x i32> [ %induction, %vec.epilog.ph ], [ %vec.ind.next86, %vec.epilog.vector.body ]
  %offset.idx87 = or disjoint i64 %index84, 1
  %25 = sub <8 x i32> %broadcast.splat89, %vec.ind85
  %26 = trunc <8 x i32> %25 to <8 x i8>
  %27 = getelementptr inbounds [13 x i8], ptr %16, i64 0, i64 %offset.idx87
  store <8 x i8> %26, ptr %27, align 1, !tbaa !9
  %index.next90 = add nuw i64 %index84, 8
  %vec.ind.next86 = add <8 x i32> %vec.ind85, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
  %28 = icmp eq i64 %index.next90, %n.vec80
  br i1 %28, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !14

vec.epilog.middle.block:                          ; preds = %vec.epilog.vector.body
  %cmp.n91 = icmp eq i64 %19, %n.vec80
  br i1 %cmp.n91, label %.preheader, label %.lr.ph.preheader

.preheader:                                       ; preds = %.lr.ph, %middle.block, %vec.epilog.middle.block, %15
  %.not67 = icmp eq i32 %3, 0
  br i1 %.not67, label %._crit_edge, label %.lr.ph63

.lr.ph63:                                         ; preds = %.preheader
  %29 = getelementptr inbounds i8, ptr %10, i64 493
  %wide.trip.count73 = zext nneg i32 %3 to i64
  br label %34

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %indvars.iv.ph, %.lr.ph.preheader ]
  %30 = trunc nuw i64 %indvars.iv to i32
  %31 = sub i32 %17, %30
  %32 = trunc i32 %31 to i8
  %33 = getelementptr inbounds [13 x i8], ptr %16, i64 0, i64 %indvars.iv
  store i8 %32, ptr %33, align 1, !tbaa !9
  %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 %.preheader, label %.lr.ph, !llvm.loop !15

34:                                               ; preds = %.lr.ph63, %34
  %indvars.iv70 = phi i64 [ 0, %.lr.ph63 ], [ %indvars.iv.next71, %34 ]
  %35 = getelementptr inbounds i64, ptr %9, i64 %indvars.iv70
  %36 = load i64, ptr %35, align 8, !tbaa !5
  %37 = call i64 @HUF_getNbBits(i64 noundef %36)
  %38 = getelementptr inbounds [13 x i8], ptr %16, i64 0, i64 %37
  %39 = load i8, ptr %38, align 1, !tbaa !9
  %40 = getelementptr inbounds [255 x i8], ptr %29, i64 0, i64 %indvars.iv70
  store i8 %39, ptr %40, align 1, !tbaa !9
  %indvars.iv.next71 = add nuw nsw i64 %indvars.iv70, 1
  %exitcond74.not = icmp eq i64 %indvars.iv.next71, %wide.trip.count73
  br i1 %exitcond74.not, label %._crit_edge, label %34, !llvm.loop !16

._crit_edge:                                      ; preds = %34, %.preheader
  %41 = icmp eq i64 %1, 0
  br i1 %41, label %.thread, label %42

42:                                               ; preds = %._crit_edge
  %43 = getelementptr inbounds i8, ptr %0, i64 1
  %44 = add i64 %1, -1
  %45 = getelementptr inbounds i8, ptr %10, i64 493
  %46 = zext nneg i32 %3 to i64
  %47 = call i64 @HUF_compressWeights(ptr noundef nonnull %43, i64 noundef %44, ptr noundef nonnull %45, i64 noundef %46, ptr noundef nonnull %10, i64 noundef 480)
  %48 = call i32 @ERR_isError(i64 noundef %47)
  %.not = icmp eq i32 %48, 0
  br i1 %.not, label %49, label %.thread

49:                                               ; preds = %42
  %50 = icmp ugt i64 %47, 1
  %51 = lshr i32 %3, 1
  %52 = zext nneg i32 %51 to i64
  %53 = icmp ult i64 %47, %52
  %54 = and i1 %50, %53
  br i1 %54, label %55, label %58

55:                                               ; preds = %49
  %56 = trunc i64 %47 to i8
  store i8 %56, ptr %0, align 1, !tbaa !9
  %57 = add nuw nsw i64 %47, 1
  br label %.thread

58:                                               ; preds = %49
  %59 = icmp ugt i32 %3, 128
  br i1 %59, label %.thread, label %60

60:                                               ; preds = %58
  %61 = add nuw nsw i32 %3, 1
  %62 = lshr i32 %61, 1
  %63 = add nuw nsw i32 %62, 1
  %64 = zext nneg i32 %63 to i64
  %65 = icmp ugt i64 %64, %1
  br i1 %65, label %.thread, label %66

66:                                               ; preds = %60
  %67 = trunc nuw i32 %3 to i8
  %68 = add nuw i8 %67, 127
  store i8 %68, ptr %0, align 1, !tbaa !9
  %69 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %46
  store i8 0, ptr %69, align 1, !tbaa !9
  br i1 %.not67, label %.thread, label %iter.check96

iter.check96:                                     ; preds = %66
  %70 = add nsw i64 %46, -1
  %71 = lshr i64 %70, 1
  %72 = add nuw i64 %71, 1
  %min.iters.check94 = icmp ult i32 %3, 15
  br i1 %min.iters.check94, label %.lr.ph66.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %iter.check96
  %73 = add nsw i64 %46, -1
  %74 = lshr i64 %73, 1
  %75 = getelementptr i8, ptr %0, i64 %74
  %scevgep = getelementptr i8, ptr %75, i64 2
  %76 = and i64 %73, -2
  %77 = getelementptr i8, ptr %10, i64 %76
  %scevgep92 = getelementptr i8, ptr %77, i64 495
  %bound0 = icmp ult ptr %43, %scevgep92
  %bound1 = icmp ult ptr %45, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph66.preheader, label %vector.main.loop.iter.check98

vector.main.loop.iter.check98:                    ; preds = %vector.memcheck
  %min.iters.check97 = icmp ult i32 %3, 31
  br i1 %min.iters.check97, label %vec.epilog.ph109, label %vector.ph99

vector.ph99:                                      ; preds = %vector.main.loop.iter.check98
  %n.vec101 = and i64 %72, -16
  br label %vector.body102

vector.body102:                                   ; preds = %vector.body102, %vector.ph99
  %index103 = phi i64 [ 0, %vector.ph99 ], [ %index.next105, %vector.body102 ]
  %offset.idx104 = shl i64 %index103, 1
  %78 = or disjoint i64 %offset.idx104, 2
  %79 = or disjoint i64 %offset.idx104, 4
  %80 = or disjoint i64 %offset.idx104, 6
  %81 = or disjoint i64 %offset.idx104, 8
  %82 = or disjoint i64 %offset.idx104, 10
  %83 = or disjoint i64 %offset.idx104, 12
  %84 = or disjoint i64 %offset.idx104, 14
  %85 = or disjoint i64 %offset.idx104, 16
  %86 = or disjoint i64 %offset.idx104, 18
  %87 = or disjoint i64 %offset.idx104, 20
  %88 = or disjoint i64 %offset.idx104, 22
  %89 = or disjoint i64 %offset.idx104, 24
  %90 = or disjoint i64 %offset.idx104, 26
  %91 = or disjoint i64 %offset.idx104, 28
  %92 = or disjoint i64 %offset.idx104, 30
  %93 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %offset.idx104
  %94 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %78
  %95 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %79
  %96 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %80
  %97 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %81
  %98 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %82
  %99 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %83
  %100 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %84
  %101 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %85
  %102 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %86
  %103 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %87
  %104 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %88
  %105 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %89
  %106 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %90
  %107 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %91
  %108 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %92
  %109 = load i8, ptr %93, align 1, !tbaa !9, !alias.scope !17
  %110 = load i8, ptr %94, align 1, !tbaa !9, !alias.scope !17
  %111 = load i8, ptr %95, align 1, !tbaa !9, !alias.scope !17
  %112 = load i8, ptr %96, align 1, !tbaa !9, !alias.scope !17
  %113 = load i8, ptr %97, align 1, !tbaa !9, !alias.scope !17
  %114 = load i8, ptr %98, align 1, !tbaa !9, !alias.scope !17
  %115 = load i8, ptr %99, align 1, !tbaa !9, !alias.scope !17
  %116 = load i8, ptr %100, align 1, !tbaa !9, !alias.scope !17
  %117 = load i8, ptr %101, align 1, !tbaa !9, !alias.scope !17
  %118 = load i8, ptr %102, align 1, !tbaa !9, !alias.scope !17
  %119 = load i8, ptr %103, align 1, !tbaa !9, !alias.scope !17
  %120 = load i8, ptr %104, align 1, !tbaa !9, !alias.scope !17
  %121 = load i8, ptr %105, align 1, !tbaa !9, !alias.scope !17
  %122 = load i8, ptr %106, align 1, !tbaa !9, !alias.scope !17
  %123 = load i8, ptr %107, align 1, !tbaa !9, !alias.scope !17
  %124 = load i8, ptr %108, align 1, !tbaa !9, !alias.scope !17
  %125 = insertelement <16 x i8> poison, i8 %109, i64 0
  %126 = insertelement <16 x i8> %125, i8 %110, i64 1
  %127 = insertelement <16 x i8> %126, i8 %111, i64 2
  %128 = insertelement <16 x i8> %127, i8 %112, i64 3
  %129 = insertelement <16 x i8> %128, i8 %113, i64 4
  %130 = insertelement <16 x i8> %129, i8 %114, i64 5
  %131 = insertelement <16 x i8> %130, i8 %115, i64 6
  %132 = insertelement <16 x i8> %131, i8 %116, i64 7
  %133 = insertelement <16 x i8> %132, i8 %117, i64 8
  %134 = insertelement <16 x i8> %133, i8 %118, i64 9
  %135 = insertelement <16 x i8> %134, i8 %119, i64 10
  %136 = insertelement <16 x i8> %135, i8 %120, i64 11
  %137 = insertelement <16 x i8> %136, i8 %121, i64 12
  %138 = insertelement <16 x i8> %137, i8 %122, i64 13
  %139 = insertelement <16 x i8> %138, i8 %123, i64 14
  %140 = insertelement <16 x i8> %139, i8 %124, i64 15
  %141 = shl <16 x i8> %140, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
  %142 = or disjoint i64 %offset.idx104, 1
  %143 = or disjoint i64 %offset.idx104, 3
  %144 = or disjoint i64 %offset.idx104, 5
  %145 = or disjoint i64 %offset.idx104, 7
  %146 = or disjoint i64 %offset.idx104, 9
  %147 = or disjoint i64 %offset.idx104, 11
  %148 = or disjoint i64 %offset.idx104, 13
  %149 = or disjoint i64 %offset.idx104, 15
  %150 = or disjoint i64 %offset.idx104, 17
  %151 = or disjoint i64 %offset.idx104, 19
  %152 = or disjoint i64 %offset.idx104, 21
  %153 = or disjoint i64 %offset.idx104, 23
  %154 = or disjoint i64 %offset.idx104, 25
  %155 = or disjoint i64 %offset.idx104, 27
  %156 = or disjoint i64 %offset.idx104, 29
  %157 = or disjoint i64 %offset.idx104, 31
  %158 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %142
  %159 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %143
  %160 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %144
  %161 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %145
  %162 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %146
  %163 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %147
  %164 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %148
  %165 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %149
  %166 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %150
  %167 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %151
  %168 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %152
  %169 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %153
  %170 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %154
  %171 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %155
  %172 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %156
  %173 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %157
  %174 = load i8, ptr %158, align 1, !tbaa !9, !alias.scope !17
  %175 = load i8, ptr %159, align 1, !tbaa !9, !alias.scope !17
  %176 = load i8, ptr %160, align 1, !tbaa !9, !alias.scope !17
  %177 = load i8, ptr %161, align 1, !tbaa !9, !alias.scope !17
  %178 = load i8, ptr %162, align 1, !tbaa !9, !alias.scope !17
  %179 = load i8, ptr %163, align 1, !tbaa !9, !alias.scope !17
  %180 = load i8, ptr %164, align 1, !tbaa !9, !alias.scope !17
  %181 = load i8, ptr %165, align 1, !tbaa !9, !alias.scope !17
  %182 = load i8, ptr %166, align 1, !tbaa !9, !alias.scope !17
  %183 = load i8, ptr %167, align 1, !tbaa !9, !alias.scope !17
  %184 = load i8, ptr %168, align 1, !tbaa !9, !alias.scope !17
  %185 = load i8, ptr %169, align 1, !tbaa !9, !alias.scope !17
  %186 = load i8, ptr %170, align 1, !tbaa !9, !alias.scope !17
  %187 = load i8, ptr %171, align 1, !tbaa !9, !alias.scope !17
  %188 = load i8, ptr %172, align 1, !tbaa !9, !alias.scope !17
  %189 = load i8, ptr %173, align 1, !tbaa !9, !alias.scope !17
  %190 = insertelement <16 x i8> poison, i8 %174, i64 0
  %191 = insertelement <16 x i8> %190, i8 %175, i64 1
  %192 = insertelement <16 x i8> %191, i8 %176, i64 2
  %193 = insertelement <16 x i8> %192, i8 %177, i64 3
  %194 = insertelement <16 x i8> %193, i8 %178, i64 4
  %195 = insertelement <16 x i8> %194, i8 %179, i64 5
  %196 = insertelement <16 x i8> %195, i8 %180, i64 6
  %197 = insertelement <16 x i8> %196, i8 %181, i64 7
  %198 = insertelement <16 x i8> %197, i8 %182, i64 8
  %199 = insertelement <16 x i8> %198, i8 %183, i64 9
  %200 = insertelement <16 x i8> %199, i8 %184, i64 10
  %201 = insertelement <16 x i8> %200, i8 %185, i64 11
  %202 = insertelement <16 x i8> %201, i8 %186, i64 12
  %203 = insertelement <16 x i8> %202, i8 %187, i64 13
  %204 = insertelement <16 x i8> %203, i8 %188, i64 14
  %205 = insertelement <16 x i8> %204, i8 %189, i64 15
  %206 = add <16 x i8> %141, %205
  %207 = and i64 %index103, 9223372036854775792
  %208 = getelementptr inbounds i8, ptr %43, i64 %207
  store <16 x i8> %206, ptr %208, align 1, !tbaa !9, !alias.scope !20, !noalias !17
  %index.next105 = add nuw i64 %index103, 16
  %209 = icmp eq i64 %index.next105, %n.vec101
  br i1 %209, label %middle.block93, label %vector.body102, !llvm.loop !22

middle.block93:                                   ; preds = %vector.body102
  %cmp.n106 = icmp eq i64 %72, %n.vec101
  br i1 %cmp.n106, label %.thread, label %vec.epilog.iter.check110

vec.epilog.iter.check110:                         ; preds = %middle.block93
  %ind.end117 = shl i64 %n.vec101, 1
  %n.vec.remaining111 = and i64 %72, 8
  %min.epilog.iters.check112.not.not = icmp eq i64 %n.vec.remaining111, 0
  br i1 %min.epilog.iters.check112.not.not, label %.lr.ph66.preheader, label %vec.epilog.ph109

vec.epilog.ph109:                                 ; preds = %vector.main.loop.iter.check98, %vec.epilog.iter.check110
  %vec.epilog.resume.val113 = phi i64 [ %n.vec101, %vec.epilog.iter.check110 ], [ 0, %vector.main.loop.iter.check98 ]
  %n.vec115 = and i64 %72, -8
  %ind.end116 = shl i64 %n.vec115, 1
  br label %vec.epilog.vector.body119

vec.epilog.vector.body119:                        ; preds = %vec.epilog.vector.body119, %vec.epilog.ph109
  %index120 = phi i64 [ %vec.epilog.resume.val113, %vec.epilog.ph109 ], [ %index.next122, %vec.epilog.vector.body119 ]
  %offset.idx121 = shl i64 %index120, 1
  %210 = or disjoint i64 %offset.idx121, 2
  %211 = or disjoint i64 %offset.idx121, 4
  %212 = or disjoint i64 %offset.idx121, 6
  %213 = or disjoint i64 %offset.idx121, 8
  %214 = or disjoint i64 %offset.idx121, 10
  %215 = or disjoint i64 %offset.idx121, 12
  %216 = or disjoint i64 %offset.idx121, 14
  %217 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %offset.idx121
  %218 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %210
  %219 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %211
  %220 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %212
  %221 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %213
  %222 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %214
  %223 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %215
  %224 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %216
  %225 = load i8, ptr %217, align 1, !tbaa !9, !alias.scope !23
  %226 = load i8, ptr %218, align 1, !tbaa !9, !alias.scope !23
  %227 = load i8, ptr %219, align 1, !tbaa !9, !alias.scope !23
  %228 = load i8, ptr %220, align 1, !tbaa !9, !alias.scope !23
  %229 = load i8, ptr %221, align 1, !tbaa !9, !alias.scope !23
  %230 = load i8, ptr %222, align 1, !tbaa !9, !alias.scope !23
  %231 = load i8, ptr %223, align 1, !tbaa !9, !alias.scope !23
  %232 = load i8, ptr %224, align 1, !tbaa !9, !alias.scope !23
  %233 = insertelement <8 x i8> poison, i8 %225, i64 0
  %234 = insertelement <8 x i8> %233, i8 %226, i64 1
  %235 = insertelement <8 x i8> %234, i8 %227, i64 2
  %236 = insertelement <8 x i8> %235, i8 %228, i64 3
  %237 = insertelement <8 x i8> %236, i8 %229, i64 4
  %238 = insertelement <8 x i8> %237, i8 %230, i64 5
  %239 = insertelement <8 x i8> %238, i8 %231, i64 6
  %240 = insertelement <8 x i8> %239, i8 %232, i64 7
  %241 = shl <8 x i8> %240, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
  %242 = or disjoint i64 %offset.idx121, 1
  %243 = or disjoint i64 %offset.idx121, 3
  %244 = or disjoint i64 %offset.idx121, 5
  %245 = or disjoint i64 %offset.idx121, 7
  %246 = or disjoint i64 %offset.idx121, 9
  %247 = or disjoint i64 %offset.idx121, 11
  %248 = or disjoint i64 %offset.idx121, 13
  %249 = or disjoint i64 %offset.idx121, 15
  %250 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %242
  %251 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %243
  %252 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %244
  %253 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %245
  %254 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %246
  %255 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %247
  %256 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %248
  %257 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %249
  %258 = load i8, ptr %250, align 1, !tbaa !9, !alias.scope !23
  %259 = load i8, ptr %251, align 1, !tbaa !9, !alias.scope !23
  %260 = load i8, ptr %252, align 1, !tbaa !9, !alias.scope !23
  %261 = load i8, ptr %253, align 1, !tbaa !9, !alias.scope !23
  %262 = load i8, ptr %254, align 1, !tbaa !9, !alias.scope !23
  %263 = load i8, ptr %255, align 1, !tbaa !9, !alias.scope !23
  %264 = load i8, ptr %256, align 1, !tbaa !9, !alias.scope !23
  %265 = load i8, ptr %257, align 1, !tbaa !9, !alias.scope !23
  %266 = insertelement <8 x i8> poison, i8 %258, i64 0
  %267 = insertelement <8 x i8> %266, i8 %259, i64 1
  %268 = insertelement <8 x i8> %267, i8 %260, i64 2
  %269 = insertelement <8 x i8> %268, i8 %261, i64 3
  %270 = insertelement <8 x i8> %269, i8 %262, i64 4
  %271 = insertelement <8 x i8> %270, i8 %263, i64 5
  %272 = insertelement <8 x i8> %271, i8 %264, i64 6
  %273 = insertelement <8 x i8> %272, i8 %265, i64 7
  %274 = add <8 x i8> %241, %273
  %275 = and i64 %index120, 9223372036854775800
  %276 = getelementptr inbounds i8, ptr %43, i64 %275
  store <8 x i8> %274, ptr %276, align 1, !tbaa !9, !alias.scope !26, !noalias !23
  %index.next122 = add nuw i64 %index120, 8
  %277 = icmp eq i64 %index.next122, %n.vec115
  br i1 %277, label %vec.epilog.middle.block107, label %vec.epilog.vector.body119, !llvm.loop !28

vec.epilog.middle.block107:                       ; preds = %vec.epilog.vector.body119
  %cmp.n123 = icmp eq i64 %72, %n.vec115
  br i1 %cmp.n123, label %.thread, label %.lr.ph66.preheader

.lr.ph66.preheader:                               ; preds = %vec.epilog.middle.block107, %vector.memcheck, %iter.check96, %vec.epilog.iter.check110
  %indvars.iv75.ph = phi i64 [ 0, %iter.check96 ], [ 0, %vector.memcheck ], [ %ind.end117, %vec.epilog.iter.check110 ], [ %ind.end116, %vec.epilog.middle.block107 ]
  br label %.lr.ph66

.lr.ph66:                                         ; preds = %.lr.ph66.preheader, %.lr.ph66
  %indvars.iv75 = phi i64 [ %indvars.iv.next76, %.lr.ph66 ], [ %indvars.iv75.ph, %.lr.ph66.preheader ]
  %278 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %indvars.iv75
  %279 = load i8, ptr %278, align 1, !tbaa !9
  %280 = shl i8 %279, 4
  %281 = or disjoint i64 %indvars.iv75, 1
  %282 = getelementptr inbounds [255 x i8], ptr %45, i64 0, i64 %281
  %283 = load i8, ptr %282, align 1, !tbaa !9
  %284 = add i8 %280, %283
  %285 = lshr exact i64 %indvars.iv75, 1
  %gep = getelementptr inbounds i8, ptr %43, i64 %285
  store i8 %284, ptr %gep, align 1, !tbaa !9
  %indvars.iv.next76 = add nuw nsw i64 %indvars.iv75, 2
  %286 = icmp ult i64 %indvars.iv.next76, %46
  br i1 %286, label %.lr.ph66, label %.thread, !llvm.loop !29

.thread:                                          ; preds = %.lr.ph66, %middle.block93, %vec.epilog.middle.block107, %66, %42, %55, %60, %58, %._crit_edge, %13, %7
  %.1 = phi i64 [ -1, %7 ], [ -46, %13 ], [ -70, %._crit_edge ], [ -1, %58 ], [ -70, %60 ], [ %47, %42 ], [ %57, %55 ], [ %64, %66 ], [ %64, %vec.epilog.middle.block107 ], [ %64, %middle.block93 ], [ %64, %.lr.ph66 ]
  ret i64 %.1
}

; Function Attrs: nounwind uwtable
declare hidden ptr @HUF_alignUpWorkspace(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden i64 @HUF_getNbBits(i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden i64 @HUF_compressWeights(ptr noundef, i64 noundef, ptr noundef, i64 noundef, ptr noundef, i64 noundef) local_unnamed_addr #0

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

!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 = !{!"long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = distinct !{!10, !11, !12, !13}
!11 = !{!"llvm.loop.mustprogress"}
!12 = !{!"llvm.loop.isvectorized", i32 1}
!13 = !{!"llvm.loop.unroll.runtime.disable"}
!14 = distinct !{!14, !11, !12, !13}
!15 = distinct !{!15, !11, !13, !12}
!16 = distinct !{!16, !11}
!17 = !{!18}
!18 = distinct !{!18, !19}
!19 = distinct !{!19, !"LVerDomain"}
!20 = !{!21}
!21 = distinct !{!21, !19}
!22 = distinct !{!22, !11, !12, !13}
!23 = !{!24}
!24 = distinct !{!24, !25}
!25 = distinct !{!25, !"LVerDomain"}
!26 = !{!27}
!27 = distinct !{!27, !25}
!28 = distinct !{!28, !11, !12, !13}
!29 = distinct !{!29, !11, !12}


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