; LLVM IR from catid/Zpng :: zstd (huf_compress)

; 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_CElt_s = type { i16, i8 }

; Function Attrs: nounwind uwtable
declare dso_local i64 @HUF_compressWeights(ptr noundef, i64 noundef, ptr noundef, 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: nounwind uwtable
declare hidden i32 @ERR_isError(i64 noundef) #0

; 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(ptr noundef %0, i64 noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4) #0 {
  %6 = alloca i64, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca [13 x i8], align 1
  %13 = alloca [255 x i8], align 16
  %14 = alloca ptr, align 8
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i64, align 8
  store ptr %0, ptr %7, align 8, !tbaa !5
  store i64 %1, ptr %8, align 8, !tbaa !9
  store ptr %2, ptr %9, align 8, !tbaa !5
  store i32 %3, ptr %10, align 4, !tbaa !11
  store i32 %4, ptr %11, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 13, ptr %12) #2
  call void @llvm.lifetime.start.p0(i64 255, ptr %13) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #2
  %18 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %18, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #2
  %19 = load i32, ptr %10, align 4, !tbaa !11
  %20 = icmp ugt i32 %19, 255
  br i1 %20, label %21, label %22

21:                                               ; preds = %5
  store i64 -46, ptr %6, align 8
  store i32 1, ptr %16, align 4
  br label %155

22:                                               ; preds = %5
  %23 = getelementptr inbounds [13 x i8], ptr %12, i64 0, i64 0
  store i8 0, ptr %23, align 1, !tbaa !13
  store i32 1, ptr %15, align 4, !tbaa !11
  br label %24

24:                                               ; preds = %38, %22
  %25 = load i32, ptr %15, align 4, !tbaa !11
  %26 = load i32, ptr %11, align 4, !tbaa !11
  %27 = add i32 %26, 1
  %28 = icmp ult i32 %25, %27
  br i1 %28, label %29, label %41

29:                                               ; preds = %24
  %30 = load i32, ptr %11, align 4, !tbaa !11
  %31 = add i32 %30, 1
  %32 = load i32, ptr %15, align 4, !tbaa !11
  %33 = sub i32 %31, %32
  %34 = trunc i32 %33 to i8
  %35 = load i32, ptr %15, align 4, !tbaa !11
  %36 = zext i32 %35 to i64
  %37 = getelementptr inbounds [13 x i8], ptr %12, i64 0, i64 %36
  store i8 %34, ptr %37, align 1, !tbaa !13
  br label %38

38:                                               ; preds = %29
  %39 = load i32, ptr %15, align 4, !tbaa !11
  %40 = add i32 %39, 1
  store i32 %40, ptr %15, align 4, !tbaa !11
  br label %24, !llvm.loop !14

41:                                               ; preds = %24
  store i32 0, ptr %15, align 4, !tbaa !11
  br label %42

42:                                               ; preds = %59, %41
  %43 = load i32, ptr %15, align 4, !tbaa !11
  %44 = load i32, ptr %10, align 4, !tbaa !11
  %45 = icmp ult i32 %43, %44
  br i1 %45, label %46, label %62

46:                                               ; preds = %42
  %47 = load ptr, ptr %9, align 8, !tbaa !5
  %48 = load i32, ptr %15, align 4, !tbaa !11
  %49 = zext i32 %48 to i64
  %50 = getelementptr inbounds %struct.HUF_CElt_s, ptr %47, i64 %49
  %51 = getelementptr inbounds %struct.HUF_CElt_s, ptr %50, i32 0, i32 1
  %52 = load i8, ptr %51, align 2, !tbaa !16
  %53 = zext i8 %52 to i64
  %54 = getelementptr inbounds [13 x i8], ptr %12, i64 0, i64 %53
  %55 = load i8, ptr %54, align 1, !tbaa !13
  %56 = load i32, ptr %15, align 4, !tbaa !11
  %57 = zext i32 %56 to i64
  %58 = getelementptr inbounds [255 x i8], ptr %13, i64 0, i64 %57
  store i8 %55, ptr %58, align 1, !tbaa !13
  br label %59

59:                                               ; preds = %46
  %60 = load i32, ptr %15, align 4, !tbaa !11
  %61 = add i32 %60, 1
  store i32 %61, ptr %15, align 4, !tbaa !11
  br label %42, !llvm.loop !19

62:                                               ; preds = %42
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #2
  %63 = load ptr, ptr %14, align 8, !tbaa !5
  %64 = getelementptr inbounds i8, ptr %63, i64 1
  %65 = load i64, ptr %8, align 8, !tbaa !9
  %66 = sub i64 %65, 1
  %67 = getelementptr inbounds [255 x i8], ptr %13, i64 0, i64 0
  %68 = load i32, ptr %10, align 4, !tbaa !11
  %69 = zext i32 %68 to i64
  %70 = call i64 @HUF_compressWeights(ptr noundef %64, i64 noundef %66, ptr noundef %67, i64 noundef %69)
  store i64 %70, ptr %17, align 8, !tbaa !9
  %71 = load i64, ptr %17, align 8, !tbaa !9
  %72 = call i32 @ERR_isError(i64 noundef %71)
  %73 = icmp ne i32 %72, 0
  br i1 %73, label %74, label %76

74:                                               ; preds = %62
  %75 = load i64, ptr %17, align 8, !tbaa !9
  store i64 %75, ptr %6, align 8
  store i32 1, ptr %16, align 4
  br label %96

76:                                               ; preds = %62
  %77 = load i64, ptr %17, align 8, !tbaa !9
  %78 = icmp ugt i64 %77, 1
  %79 = zext i1 %78 to i32
  %80 = load i64, ptr %17, align 8, !tbaa !9
  %81 = load i32, ptr %10, align 4, !tbaa !11
  %82 = udiv i32 %81, 2
  %83 = zext i32 %82 to i64
  %84 = icmp ult i64 %80, %83
  %85 = zext i1 %84 to i32
  %86 = and i32 %79, %85
  %87 = icmp ne i32 %86, 0
  br i1 %87, label %88, label %95

88:                                               ; preds = %76
  %89 = load i64, ptr %17, align 8, !tbaa !9
  %90 = trunc i64 %89 to i8
  %91 = load ptr, ptr %14, align 8, !tbaa !5
  %92 = getelementptr inbounds i8, ptr %91, i64 0
  store i8 %90, ptr %92, align 1, !tbaa !13
  %93 = load i64, ptr %17, align 8, !tbaa !9
  %94 = add i64 %93, 1
  store i64 %94, ptr %6, align 8
  store i32 1, ptr %16, align 4
  br label %96

95:                                               ; preds = %76
  store i32 0, ptr %16, align 4
  br label %96

96:                                               ; preds = %95, %88, %74
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #2
  %97 = load i32, ptr %16, align 4
  switch i32 %97, label %155 [
    i32 0, label %98
  ]

98:                                               ; preds = %96
  %99 = load i32, ptr %10, align 4, !tbaa !11
  %100 = icmp ugt i32 %99, 128
  br i1 %100, label %101, label %102

101:                                              ; preds = %98
  store i64 -1, ptr %6, align 8
  store i32 1, ptr %16, align 4
  br label %155

102:                                              ; preds = %98
  %103 = load i32, ptr %10, align 4, !tbaa !11
  %104 = add i32 %103, 1
  %105 = udiv i32 %104, 2
  %106 = add i32 %105, 1
  %107 = zext i32 %106 to i64
  %108 = load i64, ptr %8, align 8, !tbaa !9
  %109 = icmp ugt i64 %107, %108
  br i1 %109, label %110, label %111

110:                                              ; preds = %102
  store i64 -70, ptr %6, align 8
  store i32 1, ptr %16, align 4
  br label %155

111:                                              ; preds = %102
  %112 = load i32, ptr %10, align 4, !tbaa !11
  %113 = sub i32 %112, 1
  %114 = add i32 128, %113
  %115 = trunc i32 %114 to i8
  %116 = load ptr, ptr %14, align 8, !tbaa !5
  %117 = getelementptr inbounds i8, ptr %116, i64 0
  store i8 %115, ptr %117, align 1, !tbaa !13
  %118 = load i32, ptr %10, align 4, !tbaa !11
  %119 = zext i32 %118 to i64
  %120 = getelementptr inbounds [255 x i8], ptr %13, i64 0, i64 %119
  store i8 0, ptr %120, align 1, !tbaa !13
  store i32 0, ptr %15, align 4, !tbaa !11
  br label %121

121:                                              ; preds = %146, %111
  %122 = load i32, ptr %15, align 4, !tbaa !11
  %123 = load i32, ptr %10, align 4, !tbaa !11
  %124 = icmp ult i32 %122, %123
  br i1 %124, label %125, label %149

125:                                              ; preds = %121
  %126 = load i32, ptr %15, align 4, !tbaa !11
  %127 = zext i32 %126 to i64
  %128 = getelementptr inbounds [255 x i8], ptr %13, i64 0, i64 %127
  %129 = load i8, ptr %128, align 1, !tbaa !13
  %130 = zext i8 %129 to i32
  %131 = shl i32 %130, 4
  %132 = load i32, ptr %15, align 4, !tbaa !11
  %133 = add i32 %132, 1
  %134 = zext i32 %133 to i64
  %135 = getelementptr inbounds [255 x i8], ptr %13, i64 0, i64 %134
  %136 = load i8, ptr %135, align 1, !tbaa !13
  %137 = zext i8 %136 to i32
  %138 = add nsw i32 %131, %137
  %139 = trunc i32 %138 to i8
  %140 = load ptr, ptr %14, align 8, !tbaa !5
  %141 = load i32, ptr %15, align 4, !tbaa !11
  %142 = udiv i32 %141, 2
  %143 = add i32 %142, 1
  %144 = zext i32 %143 to i64
  %145 = getelementptr inbounds i8, ptr %140, i64 %144
  store i8 %139, ptr %145, align 1, !tbaa !13
  br label %146

146:                                              ; preds = %125
  %147 = load i32, ptr %15, align 4, !tbaa !11
  %148 = add i32 %147, 2
  store i32 %148, ptr %15, align 4, !tbaa !11
  br label %121, !llvm.loop !20

149:                                              ; preds = %121
  %150 = load i32, ptr %10, align 4, !tbaa !11
  %151 = add i32 %150, 1
  %152 = udiv i32 %151, 2
  %153 = add i32 %152, 1
  %154 = zext i32 %153 to i64
  store i64 %154, ptr %6, align 8
  store i32 1, ptr %16, align 4
  br label %155

155:                                              ; preds = %149, %110, %101, %96, %21
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 255, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 13, ptr %12) #2
  %156 = load i64, ptr %6, align 8
  ret i64 %156
}

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 = !{!17, !7, i64 2}
!17 = !{!"HUF_CElt_s", !18, i64 0, !7, i64 2}
!18 = !{!"short", !7, i64 0}
!19 = distinct !{!19, !15}
!20 = distinct !{!20, !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"

%struct.HUF_CElt_s = type { i16, i8 }

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

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

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

; Function Attrs: mustprogress 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(ptr noundef %0, i64 noundef %1, ptr nocapture noundef readonly %2, i32 noundef %3, i32 noundef %4) local_unnamed_addr #0 {
  %6 = alloca [13 x i8], align 1
  %7 = alloca [255 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 13, ptr nonnull %6) #2
  call void @llvm.lifetime.start.p0(i64 255, ptr nonnull %7) #2
  %8 = icmp ugt i32 %3, 255
  br i1 %8, label %.thread, label %9

9:                                                ; preds = %5
  store i8 0, ptr %6, align 1, !tbaa !5
  %10 = add i32 %4, 1
  %11 = icmp ugt i32 %10, 1
  br i1 %11, label %iter.check, label %.preheader

iter.check:                                       ; preds = %9
  %wide.trip.count = zext i32 %10 to i64
  %12 = add nsw i64 %wide.trip.count, -1
  %min.iters.check = icmp ult i32 %10, 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.check65 = icmp ult i32 %10, 17
  br i1 %min.iters.check65, label %vec.epilog.ph, label %vector.ph

vector.ph:                                        ; preds = %vector.main.loop.iter.check
  %n.vec = and i64 %12, -16
  %broadcast.splatinsert = insertelement <16 x i32> poison, i32 %10, 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
  %13 = sub <16 x i32> %broadcast.splat, %vec.ind
  %14 = trunc <16 x i32> %13 to <16 x i8>
  %15 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %offset.idx
  store <16 x i8> %14, ptr %15, align 1, !tbaa !5
  %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>
  %16 = icmp eq i64 %index.next, %n.vec
  br i1 %16, label %middle.block, label %vector.body, !llvm.loop !8

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

vec.epilog.iter.check:                            ; preds = %middle.block
  %ind.end69 = or disjoint i64 %n.vec, 1
  %n.vec.remaining = and i64 %12, 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.end69, %vec.epilog.iter.check ], [ %ind.end68, %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.vec67 = and i64 %12, -8
  %ind.end68 = or disjoint i64 %n.vec67, 1
  %17 = trunc i64 %bc.resume.val to i32
  %.splatinsert = insertelement <8 x i32> poison, i32 %17, 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.splatinsert75 = insertelement <8 x i32> poison, i32 %10, i64 0
  %broadcast.splat76 = shufflevector <8 x i32> %broadcast.splatinsert75, <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
  %index71 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next77, %vec.epilog.vector.body ]
  %vec.ind72 = phi <8 x i32> [ %induction, %vec.epilog.ph ], [ %vec.ind.next73, %vec.epilog.vector.body ]
  %offset.idx74 = or disjoint i64 %index71, 1
  %18 = sub <8 x i32> %broadcast.splat76, %vec.ind72
  %19 = trunc <8 x i32> %18 to <8 x i8>
  %20 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %offset.idx74
  store <8 x i8> %19, ptr %20, align 1, !tbaa !5
  %index.next77 = add nuw i64 %index71, 8
  %vec.ind.next73 = add <8 x i32> %vec.ind72, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
  %21 = icmp eq i64 %index.next77, %n.vec67
  br i1 %21, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !12

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

.preheader:                                       ; preds = %.lr.ph, %middle.block, %vec.epilog.middle.block, %9
  %.not54 = icmp eq i32 %3, 0
  br i1 %.not54, label %._crit_edge, label %.lr.ph50.preheader

.lr.ph50.preheader:                               ; preds = %.preheader
  %wide.trip.count60 = zext nneg i32 %3 to i64
  %xtraiter = and i64 %wide.trip.count60, 3
  %22 = icmp ult i32 %3, 4
  br i1 %22, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph50.preheader.new

.lr.ph50.preheader.new:                           ; preds = %.lr.ph50.preheader
  %unroll_iter = and i64 %wide.trip.count60, 252
  br label %.lr.ph50

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %indvars.iv.ph, %.lr.ph.preheader ]
  %23 = trunc nuw i64 %indvars.iv to i32
  %24 = sub i32 %10, %23
  %25 = trunc i32 %24 to i8
  %26 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %indvars.iv
  store i8 %25, ptr %26, align 1, !tbaa !5
  %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 !13

.lr.ph50:                                         ; preds = %.lr.ph50, %.lr.ph50.preheader.new
  %indvars.iv57 = phi i64 [ 0, %.lr.ph50.preheader.new ], [ %indvars.iv.next58.3, %.lr.ph50 ]
  %niter = phi i64 [ 0, %.lr.ph50.preheader.new ], [ %niter.next.3, %.lr.ph50 ]
  %27 = getelementptr inbounds %struct.HUF_CElt_s, ptr %2, i64 %indvars.iv57, i32 1
  %28 = load i8, ptr %27, align 2, !tbaa !14
  %29 = zext i8 %28 to i64
  %30 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %29
  %31 = load i8, ptr %30, align 1, !tbaa !5
  %32 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %indvars.iv57
  store i8 %31, ptr %32, align 4, !tbaa !5
  %indvars.iv.next58 = or disjoint i64 %indvars.iv57, 1
  %33 = getelementptr inbounds %struct.HUF_CElt_s, ptr %2, i64 %indvars.iv.next58, i32 1
  %34 = load i8, ptr %33, align 2, !tbaa !14
  %35 = zext i8 %34 to i64
  %36 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %35
  %37 = load i8, ptr %36, align 1, !tbaa !5
  %38 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %indvars.iv.next58
  store i8 %37, ptr %38, align 1, !tbaa !5
  %indvars.iv.next58.1 = or disjoint i64 %indvars.iv57, 2
  %39 = getelementptr inbounds %struct.HUF_CElt_s, ptr %2, i64 %indvars.iv.next58.1, i32 1
  %40 = load i8, ptr %39, align 2, !tbaa !14
  %41 = zext i8 %40 to i64
  %42 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %41
  %43 = load i8, ptr %42, align 1, !tbaa !5
  %44 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %indvars.iv.next58.1
  store i8 %43, ptr %44, align 2, !tbaa !5
  %indvars.iv.next58.2 = or disjoint i64 %indvars.iv57, 3
  %45 = getelementptr inbounds %struct.HUF_CElt_s, ptr %2, i64 %indvars.iv.next58.2, i32 1
  %46 = load i8, ptr %45, align 2, !tbaa !14
  %47 = zext i8 %46 to i64
  %48 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %47
  %49 = load i8, ptr %48, align 1, !tbaa !5
  %50 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %indvars.iv.next58.2
  store i8 %49, ptr %50, align 1, !tbaa !5
  %indvars.iv.next58.3 = add nuw nsw i64 %indvars.iv57, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph50, !llvm.loop !17

._crit_edge.loopexit.unr-lcssa:                   ; preds = %.lr.ph50, %.lr.ph50.preheader
  %indvars.iv57.unr = phi i64 [ 0, %.lr.ph50.preheader ], [ %indvars.iv.next58.3, %.lr.ph50 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %.lr.ph50.epil

.lr.ph50.epil:                                    ; preds = %._crit_edge.loopexit.unr-lcssa, %.lr.ph50.epil
  %indvars.iv57.epil = phi i64 [ %indvars.iv.next58.epil, %.lr.ph50.epil ], [ %indvars.iv57.unr, %._crit_edge.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph50.epil ], [ 0, %._crit_edge.loopexit.unr-lcssa ]
  %51 = getelementptr inbounds %struct.HUF_CElt_s, ptr %2, i64 %indvars.iv57.epil, i32 1
  %52 = load i8, ptr %51, align 2, !tbaa !14
  %53 = zext i8 %52 to i64
  %54 = getelementptr inbounds [13 x i8], ptr %6, i64 0, i64 %53
  %55 = load i8, ptr %54, align 1, !tbaa !5
  %56 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %indvars.iv57.epil
  store i8 %55, ptr %56, align 1, !tbaa !5
  %indvars.iv.next58.epil = add nuw nsw i64 %indvars.iv57.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge, label %.lr.ph50.epil, !llvm.loop !18

._crit_edge:                                      ; preds = %._crit_edge.loopexit.unr-lcssa, %.lr.ph50.epil, %.preheader
  %.pre-phi = phi i64 [ 0, %.preheader ], [ %wide.trip.count60, %.lr.ph50.epil ], [ %wide.trip.count60, %._crit_edge.loopexit.unr-lcssa ]
  %57 = getelementptr inbounds i8, ptr %0, i64 1
  %58 = add i64 %1, -1
  %59 = call i64 @HUF_compressWeights(ptr noundef nonnull %57, i64 noundef %58, ptr noundef nonnull %7, i64 noundef %.pre-phi)
  %60 = call i32 @ERR_isError(i64 noundef %59)
  %.not = icmp eq i32 %60, 0
  br i1 %.not, label %61, label %.thread

61:                                               ; preds = %._crit_edge
  %62 = icmp ugt i64 %59, 1
  %63 = lshr i32 %3, 1
  %64 = zext nneg i32 %63 to i64
  %65 = icmp ult i64 %59, %64
  %66 = and i1 %62, %65
  br i1 %66, label %67, label %70

67:                                               ; preds = %61
  %68 = trunc i64 %59 to i8
  store i8 %68, ptr %0, align 1, !tbaa !5
  %69 = add nuw nsw i64 %59, 1
  br label %.thread

70:                                               ; preds = %61
  %71 = icmp ugt i32 %3, 128
  br i1 %71, label %.thread, label %72

72:                                               ; preds = %70
  %73 = add nuw nsw i32 %3, 1
  %74 = lshr i32 %73, 1
  %75 = add nuw nsw i32 %74, 1
  %76 = zext nneg i32 %75 to i64
  %77 = icmp ugt i64 %76, %1
  br i1 %77, label %.thread, label %78

78:                                               ; preds = %72
  %79 = trunc nuw i32 %3 to i8
  %80 = add nuw i8 %79, 127
  store i8 %80, ptr %0, align 1, !tbaa !5
  %81 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %.pre-phi
  store i8 0, ptr %81, align 1, !tbaa !5
  br i1 %.not54, label %.thread, label %iter.check82

iter.check82:                                     ; preds = %78
  %82 = add nsw i64 %.pre-phi, -1
  %83 = lshr i64 %82, 1
  %84 = add nuw i64 %83, 1
  %min.iters.check80 = icmp ult i64 %82, 14
  br i1 %min.iters.check80, label %.lr.ph53.preheader, label %vector.main.loop.iter.check84

vector.main.loop.iter.check84:                    ; preds = %iter.check82
  %min.iters.check83 = icmp ult i64 %82, 30
  br i1 %min.iters.check83, label %vec.epilog.ph95, label %vector.ph85

vector.ph85:                                      ; preds = %vector.main.loop.iter.check84
  %n.vec87 = and i64 %84, -16
  br label %vector.body88

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

middle.block79:                                   ; preds = %vector.body88
  %cmp.n92 = icmp eq i64 %84, %n.vec87
  br i1 %cmp.n92, label %.thread, label %vec.epilog.iter.check96

vec.epilog.iter.check96:                          ; preds = %middle.block79
  %ind.end103 = shl i64 %n.vec87, 1
  %n.vec.remaining97 = and i64 %84, 8
  %min.epilog.iters.check98.not.not = icmp eq i64 %n.vec.remaining97, 0
  br i1 %min.epilog.iters.check98.not.not, label %.lr.ph53.preheader, label %vec.epilog.ph95

vec.epilog.ph95:                                  ; preds = %vector.main.loop.iter.check84, %vec.epilog.iter.check96
  %vec.epilog.resume.val99 = phi i64 [ %n.vec87, %vec.epilog.iter.check96 ], [ 0, %vector.main.loop.iter.check84 ]
  %n.vec101 = and i64 %84, -8
  %ind.end102 = shl i64 %n.vec101, 1
  br label %vec.epilog.vector.body105

vec.epilog.vector.body105:                        ; preds = %vec.epilog.vector.body105, %vec.epilog.ph95
  %index106 = phi i64 [ %vec.epilog.resume.val99, %vec.epilog.ph95 ], [ %index.next108, %vec.epilog.vector.body105 ]
  %offset.idx107 = shl i64 %index106, 1
  %217 = or disjoint i64 %offset.idx107, 2
  %218 = or disjoint i64 %offset.idx107, 4
  %219 = or disjoint i64 %offset.idx107, 6
  %220 = or disjoint i64 %offset.idx107, 8
  %221 = or disjoint i64 %offset.idx107, 10
  %222 = or disjoint i64 %offset.idx107, 12
  %223 = or disjoint i64 %offset.idx107, 14
  %224 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %offset.idx107
  %225 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %217
  %226 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %218
  %227 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %219
  %228 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %220
  %229 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %221
  %230 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %222
  %231 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %223
  %232 = load i8, ptr %224, align 16, !tbaa !5
  %233 = load i8, ptr %225, align 2, !tbaa !5
  %234 = load i8, ptr %226, align 4, !tbaa !5
  %235 = load i8, ptr %227, align 2, !tbaa !5
  %236 = load i8, ptr %228, align 8, !tbaa !5
  %237 = load i8, ptr %229, align 2, !tbaa !5
  %238 = load i8, ptr %230, align 4, !tbaa !5
  %239 = load i8, ptr %231, align 2, !tbaa !5
  %240 = insertelement <8 x i8> poison, i8 %232, i64 0
  %241 = insertelement <8 x i8> %240, i8 %233, i64 1
  %242 = insertelement <8 x i8> %241, i8 %234, i64 2
  %243 = insertelement <8 x i8> %242, i8 %235, i64 3
  %244 = insertelement <8 x i8> %243, i8 %236, i64 4
  %245 = insertelement <8 x i8> %244, i8 %237, i64 5
  %246 = insertelement <8 x i8> %245, i8 %238, i64 6
  %247 = insertelement <8 x i8> %246, i8 %239, i64 7
  %248 = shl <8 x i8> %247, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
  %249 = or disjoint i64 %offset.idx107, 1
  %250 = or disjoint i64 %offset.idx107, 3
  %251 = or disjoint i64 %offset.idx107, 5
  %252 = or disjoint i64 %offset.idx107, 7
  %253 = or disjoint i64 %offset.idx107, 9
  %254 = or disjoint i64 %offset.idx107, 11
  %255 = or disjoint i64 %offset.idx107, 13
  %256 = or disjoint i64 %offset.idx107, 15
  %257 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %249
  %258 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %250
  %259 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %251
  %260 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %252
  %261 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %253
  %262 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %254
  %263 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %255
  %264 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %256
  %265 = load i8, ptr %257, align 1, !tbaa !5
  %266 = load i8, ptr %258, align 1, !tbaa !5
  %267 = load i8, ptr %259, align 1, !tbaa !5
  %268 = load i8, ptr %260, align 1, !tbaa !5
  %269 = load i8, ptr %261, align 1, !tbaa !5
  %270 = load i8, ptr %262, align 1, !tbaa !5
  %271 = load i8, ptr %263, align 1, !tbaa !5
  %272 = load i8, ptr %264, align 1, !tbaa !5
  %273 = insertelement <8 x i8> poison, i8 %265, i64 0
  %274 = insertelement <8 x i8> %273, i8 %266, i64 1
  %275 = insertelement <8 x i8> %274, i8 %267, i64 2
  %276 = insertelement <8 x i8> %275, i8 %268, i64 3
  %277 = insertelement <8 x i8> %276, i8 %269, i64 4
  %278 = insertelement <8 x i8> %277, i8 %270, i64 5
  %279 = insertelement <8 x i8> %278, i8 %271, i64 6
  %280 = insertelement <8 x i8> %279, i8 %272, i64 7
  %281 = add <8 x i8> %248, %280
  %282 = and i64 %index106, 9223372036854775800
  %283 = getelementptr inbounds i8, ptr %57, i64 %282
  store <8 x i8> %281, ptr %283, align 1, !tbaa !5
  %index.next108 = add nuw i64 %index106, 8
  %284 = icmp eq i64 %index.next108, %n.vec101
  br i1 %284, label %vec.epilog.middle.block93, label %vec.epilog.vector.body105, !llvm.loop !21

vec.epilog.middle.block93:                        ; preds = %vec.epilog.vector.body105
  %cmp.n109 = icmp eq i64 %84, %n.vec101
  br i1 %cmp.n109, label %.thread, label %.lr.ph53.preheader

.lr.ph53.preheader:                               ; preds = %vec.epilog.middle.block93, %iter.check82, %vec.epilog.iter.check96
  %indvars.iv62.ph = phi i64 [ 0, %iter.check82 ], [ %ind.end103, %vec.epilog.iter.check96 ], [ %ind.end102, %vec.epilog.middle.block93 ]
  br label %.lr.ph53

.lr.ph53:                                         ; preds = %.lr.ph53.preheader, %.lr.ph53
  %indvars.iv62 = phi i64 [ %indvars.iv.next63, %.lr.ph53 ], [ %indvars.iv62.ph, %.lr.ph53.preheader ]
  %285 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %indvars.iv62
  %286 = load i8, ptr %285, align 2, !tbaa !5
  %287 = shl i8 %286, 4
  %288 = or disjoint i64 %indvars.iv62, 1
  %289 = getelementptr inbounds [255 x i8], ptr %7, i64 0, i64 %288
  %290 = load i8, ptr %289, align 1, !tbaa !5
  %291 = add i8 %287, %290
  %292 = lshr exact i64 %indvars.iv62, 1
  %gep = getelementptr inbounds i8, ptr %57, i64 %292
  store i8 %291, ptr %gep, align 1, !tbaa !5
  %indvars.iv.next63 = add nuw nsw i64 %indvars.iv62, 2
  %293 = icmp ult i64 %indvars.iv.next63, %.pre-phi
  br i1 %293, label %.lr.ph53, label %.thread, !llvm.loop !22

.thread:                                          ; preds = %.lr.ph53, %middle.block79, %vec.epilog.middle.block93, %78, %._crit_edge, %67, %72, %70, %5
  %.1 = phi i64 [ -46, %5 ], [ -1, %70 ], [ -70, %72 ], [ %59, %._crit_edge ], [ %69, %67 ], [ %76, %78 ], [ %76, %vec.epilog.middle.block93 ], [ %76, %middle.block79 ], [ %76, %.lr.ph53 ]
  call void @llvm.lifetime.end.p0(i64 255, ptr nonnull %7) #2
  call void @llvm.lifetime.end.p0(i64 13, ptr nonnull %6) #2
  ret i64 %.1
}

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


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