; LLVM IR from intel/qpl :: sources/core-sw/src/filtering (qplc_pack_8u)

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

; Function Attrs: nounwind uwtable
define dso_local void @px_qplc_pack_8u1u(ptr noundef %0, i32 noundef %1, ptr noundef %2, i32 noundef %3) #0 {
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i64, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i16, align 2
  %18 = alloca ptr, align 8
  %19 = alloca i16, align 2
  %20 = alloca i16, align 2
  %21 = alloca i16, align 2
  %22 = alloca ptr, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i32 %1, ptr %6, align 4, !tbaa !9
  store ptr %2, ptr %7, align 8, !tbaa !5
  store i32 %3, ptr %8, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #2
  store i32 0, ptr %9, align 4, !tbaa !9
  %23 = load i32, ptr %8, align 4, !tbaa !9
  %24 = zext i32 %23 to i64
  %25 = shl i64 1, %24
  %26 = sub i64 %25, 1
  %27 = load ptr, ptr %7, align 8, !tbaa !5
  %28 = getelementptr inbounds i8, ptr %27, i64 0
  %29 = load i8, ptr %28, align 1, !tbaa !11
  %30 = zext i8 %29 to i64
  %31 = and i64 %30, %26
  %32 = trunc i64 %31 to i8
  store i8 %32, ptr %28, align 1, !tbaa !11
  br label %33

33:                                               ; preds = %62, %4
  %34 = load i32, ptr %8, align 4, !tbaa !9
  %35 = icmp ne i32 0, %34
  br i1 %35, label %36, label %63

36:                                               ; preds = %33
  %37 = load ptr, ptr %5, align 8, !tbaa !5
  %38 = load i8, ptr %37, align 1, !tbaa !11
  %39 = zext i8 %38 to i32
  %40 = load i32, ptr %8, align 4, !tbaa !9
  %41 = shl i32 %39, %40
  %42 = load ptr, ptr %7, align 8, !tbaa !5
  %43 = load i8, ptr %42, align 1, !tbaa !11
  %44 = zext i8 %43 to i32
  %45 = or i32 %44, %41
  %46 = trunc i32 %45 to i8
  store i8 %46, ptr %42, align 1, !tbaa !11
  %47 = load i32, ptr %6, align 4, !tbaa !9
  %48 = add i32 %47, -1
  store i32 %48, ptr %6, align 4, !tbaa !9
  %49 = load ptr, ptr %5, align 8, !tbaa !5
  %50 = getelementptr inbounds i8, ptr %49, i32 1
  store ptr %50, ptr %5, align 8, !tbaa !5
  %51 = load i32, ptr %8, align 4, !tbaa !9
  %52 = add i32 %51, 1
  store i32 %52, ptr %8, align 4, !tbaa !9
  %53 = load i32, ptr %8, align 4, !tbaa !9
  %54 = icmp eq i32 8, %53
  br i1 %54, label %55, label %58

55:                                               ; preds = %36
  %56 = load ptr, ptr %7, align 8, !tbaa !5
  %57 = getelementptr inbounds i8, ptr %56, i32 1
  store ptr %57, ptr %7, align 8, !tbaa !5
  br label %63

58:                                               ; preds = %36
  %59 = load i32, ptr %6, align 4, !tbaa !9
  %60 = icmp eq i32 0, %59
  br i1 %60, label %61, label %62

61:                                               ; preds = %58
  store i32 1, ptr %10, align 4
  br label %218

62:                                               ; preds = %58
  br label %33, !llvm.loop !12

63:                                               ; preds = %55, %33
  br label %64

64:                                               ; preds = %91, %63
  %65 = load i32, ptr %6, align 4, !tbaa !9
  %66 = icmp ugt i32 %65, 64
  br i1 %66, label %67, label %100

67:                                               ; preds = %64
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #2
  store i64 0, ptr %11, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #2
  %68 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %68, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #2
  store i64 0, ptr %13, align 8, !tbaa !14
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %69

69:                                               ; preds = %88, %67
  %70 = load i32, ptr %9, align 4, !tbaa !9
  %71 = icmp ult i32 %70, 64
  br i1 %71, label %72, label %91

72:                                               ; preds = %69
  %73 = load ptr, ptr %5, align 8, !tbaa !5
  %74 = load i32, ptr %9, align 4, !tbaa !9
  %75 = zext i32 %74 to i64
  %76 = getelementptr inbounds i8, ptr %73, i64 %75
  %77 = load i8, ptr %76, align 1, !tbaa !11
  %78 = zext i8 %77 to i32
  %79 = and i32 1, %78
  %80 = zext i32 %79 to i64
  store i64 %80, ptr %13, align 8, !tbaa !14
  %81 = load i64, ptr %13, align 8, !tbaa !14
  %82 = load i32, ptr %9, align 4, !tbaa !9
  %83 = zext i32 %82 to i64
  %84 = shl i64 %81, %83
  store i64 %84, ptr %13, align 8, !tbaa !14
  %85 = load i64, ptr %13, align 8, !tbaa !14
  %86 = load i64, ptr %11, align 8, !tbaa !14
  %87 = or i64 %86, %85
  store i64 %87, ptr %11, align 8, !tbaa !14
  br label %88

88:                                               ; preds = %72
  %89 = load i32, ptr %9, align 4, !tbaa !9
  %90 = add i32 %89, 1
  store i32 %90, ptr %9, align 4, !tbaa !9
  br label %69, !llvm.loop !16

91:                                               ; preds = %69
  %92 = load ptr, ptr %5, align 8, !tbaa !5
  %93 = getelementptr inbounds i8, ptr %92, i64 64
  store ptr %93, ptr %5, align 8, !tbaa !5
  %94 = load i64, ptr %11, align 8, !tbaa !14
  %95 = load ptr, ptr %12, align 8, !tbaa !5
  store i64 %94, ptr %95, align 8, !tbaa !14
  %96 = load ptr, ptr %7, align 8, !tbaa !5
  %97 = getelementptr inbounds i8, ptr %96, i64 8
  store ptr %97, ptr %7, align 8, !tbaa !5
  %98 = load i32, ptr %6, align 4, !tbaa !9
  %99 = sub i32 %98, 64
  store i32 %99, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #2
  br label %64, !llvm.loop !17

100:                                              ; preds = %64
  %101 = load i32, ptr %6, align 4, !tbaa !9
  %102 = icmp ugt i32 %101, 32
  br i1 %102, label %103, label %134

103:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #2
  store i32 0, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #2
  %104 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %104, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #2
  store i32 0, ptr %16, align 4, !tbaa !9
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %105

105:                                              ; preds = %122, %103
  %106 = load i32, ptr %9, align 4, !tbaa !9
  %107 = icmp ult i32 %106, 32
  br i1 %107, label %108, label %125

108:                                              ; preds = %105
  %109 = load ptr, ptr %5, align 8, !tbaa !5
  %110 = load i32, ptr %9, align 4, !tbaa !9
  %111 = zext i32 %110 to i64
  %112 = getelementptr inbounds i8, ptr %109, i64 %111
  %113 = load i8, ptr %112, align 1, !tbaa !11
  %114 = zext i8 %113 to i32
  %115 = and i32 1, %114
  store i32 %115, ptr %16, align 4, !tbaa !9
  %116 = load i32, ptr %16, align 4, !tbaa !9
  %117 = load i32, ptr %9, align 4, !tbaa !9
  %118 = shl i32 %116, %117
  store i32 %118, ptr %16, align 4, !tbaa !9
  %119 = load i32, ptr %16, align 4, !tbaa !9
  %120 = load i32, ptr %14, align 4, !tbaa !9
  %121 = or i32 %120, %119
  store i32 %121, ptr %14, align 4, !tbaa !9
  br label %122

122:                                              ; preds = %108
  %123 = load i32, ptr %9, align 4, !tbaa !9
  %124 = add i32 %123, 1
  store i32 %124, ptr %9, align 4, !tbaa !9
  br label %105, !llvm.loop !18

125:                                              ; preds = %105
  %126 = load ptr, ptr %5, align 8, !tbaa !5
  %127 = getelementptr inbounds i8, ptr %126, i64 32
  store ptr %127, ptr %5, align 8, !tbaa !5
  %128 = load i32, ptr %14, align 4, !tbaa !9
  %129 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 %128, ptr %129, align 4, !tbaa !9
  %130 = load ptr, ptr %7, align 8, !tbaa !5
  %131 = getelementptr inbounds i8, ptr %130, i64 4
  store ptr %131, ptr %7, align 8, !tbaa !5
  %132 = load i32, ptr %6, align 4, !tbaa !9
  %133 = sub i32 %132, 32
  store i32 %133, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #2
  br label %134

134:                                              ; preds = %125, %100
  %135 = load i32, ptr %6, align 4, !tbaa !9
  %136 = icmp ugt i32 %135, 16
  br i1 %136, label %137, label %174

137:                                              ; preds = %134
  call void @llvm.lifetime.start.p0(i64 2, ptr %17) #2
  store i16 0, ptr %17, align 2, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #2
  %138 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %138, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %19) #2
  store i16 0, ptr %19, align 2, !tbaa !19
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %139

139:                                              ; preds = %162, %137
  %140 = load i32, ptr %9, align 4, !tbaa !9
  %141 = icmp ult i32 %140, 16
  br i1 %141, label %142, label %165

142:                                              ; preds = %139
  %143 = load ptr, ptr %5, align 8, !tbaa !5
  %144 = load i32, ptr %9, align 4, !tbaa !9
  %145 = zext i32 %144 to i64
  %146 = getelementptr inbounds i8, ptr %143, i64 %145
  %147 = load i8, ptr %146, align 1, !tbaa !11
  %148 = zext i8 %147 to i32
  %149 = and i32 1, %148
  %150 = trunc i32 %149 to i16
  store i16 %150, ptr %19, align 2, !tbaa !19
  %151 = load i16, ptr %19, align 2, !tbaa !19
  %152 = zext i16 %151 to i32
  %153 = load i32, ptr %9, align 4, !tbaa !9
  %154 = shl i32 %152, %153
  %155 = trunc i32 %154 to i16
  store i16 %155, ptr %19, align 2, !tbaa !19
  %156 = load i16, ptr %19, align 2, !tbaa !19
  %157 = zext i16 %156 to i32
  %158 = load i16, ptr %17, align 2, !tbaa !19
  %159 = zext i16 %158 to i32
  %160 = or i32 %159, %157
  %161 = trunc i32 %160 to i16
  store i16 %161, ptr %17, align 2, !tbaa !19
  br label %162

162:                                              ; preds = %142
  %163 = load i32, ptr %9, align 4, !tbaa !9
  %164 = add i32 %163, 1
  store i32 %164, ptr %9, align 4, !tbaa !9
  br label %139, !llvm.loop !21

165:                                              ; preds = %139
  %166 = load ptr, ptr %5, align 8, !tbaa !5
  %167 = getelementptr inbounds i8, ptr %166, i64 16
  store ptr %167, ptr %5, align 8, !tbaa !5
  %168 = load i16, ptr %17, align 2, !tbaa !19
  %169 = load ptr, ptr %18, align 8, !tbaa !5
  store i16 %168, ptr %169, align 2, !tbaa !19
  %170 = load ptr, ptr %7, align 8, !tbaa !5
  %171 = getelementptr inbounds i8, ptr %170, i64 2
  store ptr %171, ptr %7, align 8, !tbaa !5
  %172 = load i32, ptr %6, align 4, !tbaa !9
  %173 = sub i32 %172, 16
  store i32 %173, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 2, ptr %19) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %17) #2
  br label %174

174:                                              ; preds = %165, %134
  %175 = load i32, ptr %6, align 4, !tbaa !9
  %176 = icmp ult i32 0, %175
  br i1 %176, label %177, label %217

177:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 2, ptr %20) #2
  store i16 0, ptr %20, align 2, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 2, ptr %21) #2
  store i16 0, ptr %21, align 2, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #2
  %178 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %178, ptr %22, align 8, !tbaa !5
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %179

179:                                              ; preds = %203, %177
  %180 = load i32, ptr %9, align 4, !tbaa !9
  %181 = load i32, ptr %6, align 4, !tbaa !9
  %182 = icmp ult i32 %180, %181
  br i1 %182, label %183, label %206

183:                                              ; preds = %179
  %184 = load ptr, ptr %5, align 8, !tbaa !5
  %185 = load i32, ptr %9, align 4, !tbaa !9
  %186 = zext i32 %185 to i64
  %187 = getelementptr inbounds i8, ptr %184, i64 %186
  %188 = load i8, ptr %187, align 1, !tbaa !11
  %189 = zext i8 %188 to i32
  %190 = and i32 1, %189
  %191 = trunc i32 %190 to i16
  store i16 %191, ptr %21, align 2, !tbaa !19
  %192 = load i16, ptr %21, align 2, !tbaa !19
  %193 = zext i16 %192 to i32
  %194 = load i32, ptr %9, align 4, !tbaa !9
  %195 = shl i32 %193, %194
  %196 = trunc i32 %195 to i16
  store i16 %196, ptr %21, align 2, !tbaa !19
  %197 = load i16, ptr %21, align 2, !tbaa !19
  %198 = zext i16 %197 to i32
  %199 = load i16, ptr %20, align 2, !tbaa !19
  %200 = zext i16 %199 to i32
  %201 = or i32 %200, %198
  %202 = trunc i32 %201 to i16
  store i16 %202, ptr %20, align 2, !tbaa !19
  br label %203

203:                                              ; preds = %183
  %204 = load i32, ptr %9, align 4, !tbaa !9
  %205 = add i32 %204, 1
  store i32 %205, ptr %9, align 4, !tbaa !9
  br label %179, !llvm.loop !22

206:                                              ; preds = %179
  %207 = load i32, ptr %9, align 4, !tbaa !9
  %208 = icmp uge i32 8, %207
  br i1 %208, label %209, label %213

209:                                              ; preds = %206
  %210 = load i16, ptr %20, align 2, !tbaa !19
  %211 = trunc i16 %210 to i8
  %212 = load ptr, ptr %7, align 8, !tbaa !5
  store i8 %211, ptr %212, align 1, !tbaa !11
  br label %216

213:                                              ; preds = %206
  %214 = load i16, ptr %20, align 2, !tbaa !19
  %215 = load ptr, ptr %22, align 8, !tbaa !5
  store i16 %214, ptr %215, align 2, !tbaa !19
  br label %216

216:                                              ; preds = %213, %209
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %21) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %20) #2
  br label %217

217:                                              ; preds = %216, %174
  store i32 0, ptr %10, align 4
  br label %218

218:                                              ; preds = %217, %61
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #2
  %219 = load i32, ptr %10, align 4
  switch i32 %219, label %221 [
    i32 0, label %220
    i32 1, label %220
  ]

220:                                              ; preds = %218, %218
  ret void

221:                                              ; preds = %218
  unreachable
}

; 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

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 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = distinct !{!12, !13}
!13 = !{!"llvm.loop.mustprogress"}
!14 = !{!15, !15, i64 0}
!15 = !{!"long", !7, i64 0}
!16 = distinct !{!16, !13}
!17 = distinct !{!17, !13}
!18 = distinct !{!18, !13}
!19 = !{!20, !20, i64 0}
!20 = !{!"short", !7, i64 0}
!21 = distinct !{!21, !13}
!22 = distinct !{!22, !13}


; 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: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable
define dso_local void @px_qplc_pack_8u1u(ptr nocapture noundef readonly %0, i32 noundef %1, ptr nocapture noundef %2, i32 noundef %3) local_unnamed_addr #0 {
  %5 = zext nneg i32 %3 to i64
  %notmask = shl nsw i64 -1, %5
  %6 = load i8, ptr %2, align 1, !tbaa !5
  %7 = trunc i64 %notmask to i8
  %8 = xor i8 %7, -1
  %9 = and i8 %6, %8
  store i8 %9, ptr %2, align 1, !tbaa !5
  %10 = sub i32 0, %3
  %11 = add i32 %1, -1
  %12 = tail call i32 @llvm.umin.i32(i32 %10, i32 %11)
  %13 = sub i32 7, %3
  %14 = tail call i32 @llvm.umin.i32(i32 %12, i32 %13)
  %umin176 = zext i32 %14 to i64
  %15 = add nuw nsw i64 %umin176, 1
  %min.iters.check = icmp ult i32 %14, 16
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %4
  %scevgep = getelementptr i8, ptr %2, i64 1
  %16 = sub i32 0, %3
  %17 = add i32 %1, -1
  %18 = tail call i32 @llvm.umin.i32(i32 %16, i32 %17)
  %19 = sub i32 7, %3
  %20 = tail call i32 @llvm.umin.i32(i32 %18, i32 %19)
  %umin173 = zext i32 %20 to i64
  %21 = getelementptr i8, ptr %0, i64 %umin173
  %scevgep174 = getelementptr i8, ptr %21, i64 1
  %bound0 = icmp ugt ptr %scevgep174, %2
  %bound1 = icmp ugt ptr %scevgep, %0
  %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 %15, 15
  %22 = icmp eq i64 %n.mod.vf, 0
  %23 = select i1 %22, i64 16, i64 %n.mod.vf
  %n.vec = sub nsw i64 %15, %23
  %.cast = trunc i64 %n.vec to i32
  %ind.end = add i32 %.cast, %3
  %.cast177 = trunc i64 %n.vec to i32
  %ind.end178 = sub i32 %1, %.cast177
  %ind.end180 = getelementptr i8, ptr %0, i64 %n.vec
  %24 = insertelement <16 x i8> <i8 poison, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>, i8 %9, i64 0
  %.splatinsert = insertelement <16 x i32> poison, i32 %3, i64 0
  %.splat = shufflevector <16 x i32> %.splatinsert, <16 x i32> poison, <16 x i32> zeroinitializer
  %induction = add <16 x i32> %.splat, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.phi = phi <16 x i8> [ %24, %vector.ph ], [ %28, %vector.body ]
  %vec.ind = phi <16 x i32> [ %induction, %vector.ph ], [ %vec.ind.next, %vector.body ]
  %next.gep = getelementptr i8, ptr %0, i64 %index
  %wide.load = load <16 x i8>, ptr %next.gep, align 1, !tbaa !5, !alias.scope !8
  %25 = zext <16 x i8> %wide.load to <16 x i32>
  %26 = shl <16 x i32> %25, %vec.ind
  %27 = trunc <16 x i32> %26 to <16 x i8>
  %28 = or <16 x i8> %vec.phi, %27
  %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>
  %29 = icmp eq i64 %index.next, %n.vec
  br i1 %29, label %middle.block, label %vector.body, !llvm.loop !11

middle.block:                                     ; preds = %vector.body
  %30 = tail call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %28)
  store i8 %30, ptr %2, align 1, !tbaa !5
  br label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %middle.block, %vector.memcheck, %4
  %.ph = phi i8 [ %9, %vector.memcheck ], [ %9, %4 ], [ %30, %middle.block ]
  %.084.ph = phi i32 [ %3, %vector.memcheck ], [ %3, %4 ], [ %ind.end, %middle.block ]
  %.073.ph = phi i32 [ %1, %vector.memcheck ], [ %1, %4 ], [ %ind.end178, %middle.block ]
  %.0.ph = phi ptr [ %0, %vector.memcheck ], [ %0, %4 ], [ %ind.end180, %middle.block ]
  br label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.preheader, %44
  %31 = phi i8 [ %37, %44 ], [ %.ph, %scalar.ph.preheader ]
  %.084 = phi i32 [ %40, %44 ], [ %.084.ph, %scalar.ph.preheader ]
  %.073 = phi i32 [ %38, %44 ], [ %.073.ph, %scalar.ph.preheader ]
  %.0 = phi ptr [ %39, %44 ], [ %.0.ph, %scalar.ph.preheader ]
  %.not = icmp eq i32 %.084, 0
  br i1 %.not, label %.loopexit, label %32

32:                                               ; preds = %scalar.ph
  %33 = load i8, ptr %.0, align 1, !tbaa !5
  %34 = zext i8 %33 to i32
  %35 = shl i32 %34, %.084
  %36 = trunc i32 %35 to i8
  %37 = or i8 %31, %36
  store i8 %37, ptr %2, align 1, !tbaa !5
  %38 = add i32 %.073, -1
  %39 = getelementptr inbounds i8, ptr %.0, i64 1
  %40 = add i32 %.084, 1
  %41 = icmp eq i32 %40, 8
  br i1 %41, label %42, label %44

42:                                               ; preds = %32
  %43 = getelementptr inbounds i8, ptr %2, i64 1
  br label %.loopexit

44:                                               ; preds = %32
  %45 = icmp eq i32 %38, 0
  br i1 %45, label %.loopexit96, label %scalar.ph, !llvm.loop !15

.loopexit:                                        ; preds = %scalar.ph, %42
  %.079 = phi ptr [ %43, %42 ], [ %2, %scalar.ph ]
  %.174 = phi i32 [ %38, %42 ], [ %.073, %scalar.ph ]
  %.1 = phi ptr [ %39, %42 ], [ %.0, %scalar.ph ]
  %46 = icmp ugt i32 %.174, 64
  br i1 %46, label %.preheader95, label %._crit_edge

.preheader95:                                     ; preds = %.loopexit, %72
  %.2108 = phi ptr [ %73, %72 ], [ %.1, %.loopexit ]
  %.275107 = phi i32 [ %75, %72 ], [ %.174, %.loopexit ]
  %.180106 = phi ptr [ %74, %72 ], [ %.079, %.loopexit ]
  br label %47

47:                                               ; preds = %47, %.preheader95
  %indvars.iv = phi i64 [ 0, %.preheader95 ], [ %indvars.iv.next.3, %47 ]
  %.085105 = phi i64 [ 0, %.preheader95 ], [ %71, %47 ]
  %48 = getelementptr inbounds i8, ptr %.2108, i64 %indvars.iv
  %49 = load i8, ptr %48, align 1, !tbaa !5
  %50 = and i8 %49, 1
  %51 = zext nneg i8 %50 to i64
  %52 = shl nuw i64 %51, %indvars.iv
  %53 = or i64 %52, %.085105
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %54 = getelementptr inbounds i8, ptr %.2108, i64 %indvars.iv.next
  %55 = load i8, ptr %54, align 1, !tbaa !5
  %56 = and i8 %55, 1
  %57 = zext nneg i8 %56 to i64
  %58 = shl nuw i64 %57, %indvars.iv.next
  %59 = or i64 %58, %53
  %indvars.iv.next.1 = or disjoint i64 %indvars.iv, 2
  %60 = getelementptr inbounds i8, ptr %.2108, i64 %indvars.iv.next.1
  %61 = load i8, ptr %60, align 1, !tbaa !5
  %62 = and i8 %61, 1
  %63 = zext nneg i8 %62 to i64
  %64 = shl nuw i64 %63, %indvars.iv.next.1
  %65 = or i64 %64, %59
  %indvars.iv.next.2 = or disjoint i64 %indvars.iv, 3
  %66 = getelementptr inbounds i8, ptr %.2108, i64 %indvars.iv.next.2
  %67 = load i8, ptr %66, align 1, !tbaa !5
  %68 = and i8 %67, 1
  %69 = zext nneg i8 %68 to i64
  %70 = shl nuw i64 %69, %indvars.iv.next.2
  %71 = or i64 %70, %65
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next.3, 64
  br i1 %exitcond.not.3, label %72, label %47, !llvm.loop !16

72:                                               ; preds = %47
  %73 = getelementptr inbounds i8, ptr %.2108, i64 64
  store i64 %71, ptr %.180106, align 8, !tbaa !17
  %74 = getelementptr inbounds i8, ptr %.180106, i64 8
  %75 = add i32 %.275107, -64
  %76 = icmp ugt i32 %75, 64
  br i1 %76, label %.preheader95, label %._crit_edge, !llvm.loop !19

._crit_edge:                                      ; preds = %72, %.loopexit
  %.180.lcssa = phi ptr [ %.079, %.loopexit ], [ %74, %72 ]
  %.275.lcssa = phi i32 [ %.174, %.loopexit ], [ %75, %72 ]
  %.2.lcssa = phi ptr [ %.1, %.loopexit ], [ %73, %72 ]
  %77 = icmp ugt i32 %.275.lcssa, 32
  br i1 %77, label %.preheader94.preheader, label %130

.preheader94.preheader:                           ; preds = %._crit_edge
  %78 = load i8, ptr %.2.lcssa, align 1, !tbaa !5
  %79 = and i8 %78, 1
  %80 = getelementptr inbounds i8, ptr %.2.lcssa, i64 1
  %81 = load i8, ptr %80, align 1, !tbaa !5
  %82 = shl i8 %81, 1
  %83 = and i8 %82, 2
  %84 = or disjoint i8 %83, %79
  %85 = getelementptr inbounds i8, ptr %.2.lcssa, i64 2
  %86 = load i8, ptr %85, align 1, !tbaa !5
  %87 = shl i8 %86, 2
  %88 = and i8 %87, 4
  %89 = or disjoint i8 %88, %84
  %90 = getelementptr inbounds i8, ptr %.2.lcssa, i64 3
  %91 = load i8, ptr %90, align 1, !tbaa !5
  %92 = shl i8 %91, 3
  %93 = and i8 %92, 8
  %94 = or disjoint i8 %93, %89
  %95 = getelementptr inbounds i8, ptr %.2.lcssa, i64 4
  %96 = load i8, ptr %95, align 1, !tbaa !5
  %97 = shl i8 %96, 4
  %98 = and i8 %97, 16
  %99 = or disjoint i8 %98, %94
  %100 = getelementptr inbounds i8, ptr %.2.lcssa, i64 5
  %101 = load i8, ptr %100, align 1, !tbaa !5
  %102 = shl i8 %101, 5
  %103 = and i8 %102, 32
  %104 = or disjoint i8 %103, %99
  %105 = getelementptr inbounds i8, ptr %.2.lcssa, i64 6
  %106 = load i8, ptr %105, align 1, !tbaa !5
  %107 = shl i8 %106, 6
  %108 = and i8 %107, 64
  %109 = or i8 %108, %104
  %110 = getelementptr inbounds i8, ptr %.2.lcssa, i64 7
  %111 = load i8, ptr %110, align 1, !tbaa !5
  %112 = shl i8 %111, 7
  %113 = or i8 %112, %109
  %114 = zext i8 %113 to i32
  %115 = getelementptr inbounds i8, ptr %.2.lcssa, i64 8
  %116 = load <16 x i8>, ptr %115, align 1, !tbaa !5
  %117 = and <16 x i8> %116, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %118 = zext nneg <16 x i8> %117 to <16 x i32>
  %119 = shl nuw nsw <16 x i32> %118, <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>
  %120 = getelementptr inbounds i8, ptr %.2.lcssa, i64 24
  %121 = load <8 x i8>, ptr %120, align 1, !tbaa !5
  %122 = and <8 x i8> %121, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %123 = zext nneg <8 x i8> %122 to <8 x i32>
  %124 = shl nuw <8 x i32> %123, <i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
  %125 = tail call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %119)
  %126 = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %124)
  %op.rdx202 = or i32 %125, %126
  %op.rdx203 = or i32 %op.rdx202, %114
  %127 = getelementptr inbounds i8, ptr %.2.lcssa, i64 32
  store i32 %op.rdx203, ptr %.180.lcssa, align 4, !tbaa !20
  %128 = getelementptr inbounds i8, ptr %.180.lcssa, i64 4
  %129 = add nsw i32 %.275.lcssa, -32
  br label %130

130:                                              ; preds = %.preheader94.preheader, %._crit_edge
  %.281 = phi ptr [ %128, %.preheader94.preheader ], [ %.180.lcssa, %._crit_edge ]
  %.376 = phi i32 [ %129, %.preheader94.preheader ], [ %.275.lcssa, %._crit_edge ]
  %.3 = phi ptr [ %127, %.preheader94.preheader ], [ %.2.lcssa, %._crit_edge ]
  %131 = icmp ugt i32 %.376, 16
  br i1 %131, label %.thread, label %193

.thread:                                          ; preds = %130
  %132 = load i8, ptr %.3, align 1, !tbaa !5
  %133 = and i8 %132, 1
  %134 = getelementptr inbounds i8, ptr %.3, i64 1
  %135 = load i8, ptr %134, align 1, !tbaa !5
  %136 = shl i8 %135, 1
  %137 = and i8 %136, 2
  %138 = or disjoint i8 %133, %137
  %139 = getelementptr inbounds i8, ptr %.3, i64 2
  %140 = load i8, ptr %139, align 1, !tbaa !5
  %141 = shl i8 %140, 2
  %142 = and i8 %141, 4
  %143 = or disjoint i8 %138, %142
  %144 = getelementptr inbounds i8, ptr %.3, i64 3
  %145 = load i8, ptr %144, align 1, !tbaa !5
  %146 = shl i8 %145, 3
  %147 = and i8 %146, 8
  %148 = or disjoint i8 %143, %147
  %149 = getelementptr inbounds i8, ptr %.3, i64 4
  %150 = load i8, ptr %149, align 1, !tbaa !5
  %151 = shl i8 %150, 4
  %152 = and i8 %151, 16
  %153 = or disjoint i8 %148, %152
  %154 = getelementptr inbounds i8, ptr %.3, i64 5
  %155 = load i8, ptr %154, align 1, !tbaa !5
  %156 = shl i8 %155, 5
  %157 = and i8 %156, 32
  %158 = or disjoint i8 %153, %157
  %159 = getelementptr inbounds i8, ptr %.3, i64 6
  %160 = load i8, ptr %159, align 1, !tbaa !5
  %161 = shl i8 %160, 6
  %162 = and i8 %161, 64
  %163 = or i8 %158, %162
  %164 = getelementptr inbounds i8, ptr %.3, i64 7
  %165 = load i8, ptr %164, align 1, !tbaa !5
  %166 = shl i8 %165, 7
  %167 = or i8 %163, %166
  %168 = zext i8 %167 to i16
  %169 = getelementptr inbounds i8, ptr %.3, i64 8
  %170 = load <4 x i8>, ptr %169, align 1, !tbaa !5
  %171 = and <4 x i8> %170, <i8 1, i8 1, i8 1, i8 1>
  %172 = zext nneg <4 x i8> %171 to <4 x i16>
  %173 = shl nuw nsw <4 x i16> %172, <i16 8, i16 9, i16 10, i16 11>
  %174 = getelementptr inbounds i8, ptr %.3, i64 12
  %175 = load i8, ptr %174, align 1, !tbaa !5
  %176 = and i8 %175, 1
  %177 = zext nneg i8 %176 to i16
  %178 = shl nuw nsw i16 %177, 12
  %179 = getelementptr inbounds i8, ptr %.3, i64 13
  %180 = load <2 x i8>, ptr %179, align 1, !tbaa !5
  %181 = and <2 x i8> %180, <i8 1, i8 1>
  %182 = zext nneg <2 x i8> %181 to <2 x i16>
  %183 = shl nuw nsw <2 x i16> %182, <i16 13, i16 14>
  %184 = getelementptr inbounds i8, ptr %.3, i64 15
  %185 = load i8, ptr %184, align 1, !tbaa !5
  %186 = zext i8 %185 to i16
  %187 = shl i16 %186, 15
  %188 = tail call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %173)
  %op.rdx = or disjoint i16 %188, %178
  %shift = shufflevector <2 x i16> %183, <2 x i16> poison, <2 x i32> <i32 1, i32 poison>
  %189 = or <2 x i16> %183, %shift
  %op.rdx198 = extractelement <2 x i16> %189, i64 0
  %op.rdx199 = or disjoint i16 %187, %168
  %op.rdx200 = or disjoint i16 %op.rdx, %op.rdx198
  %op.rdx201 = or disjoint i16 %op.rdx200, %op.rdx199
  %190 = getelementptr inbounds i8, ptr %.3, i64 16
  store i16 %op.rdx201, ptr %.281, align 2, !tbaa !22
  %191 = getelementptr inbounds i8, ptr %.281, i64 2
  %192 = add nsw i32 %.376, -16
  br label %.preheader.preheader

193:                                              ; preds = %130
  %.not92 = icmp eq i32 %.376, 0
  br i1 %.not92, label %.loopexit96, label %.preheader.preheader

.preheader.preheader:                             ; preds = %.thread, %193
  %.4148 = phi ptr [ %190, %.thread ], [ %.3, %193 ]
  %.477147 = phi i32 [ %192, %.thread ], [ %.376, %193 ]
  %.382146 = phi ptr [ %191, %.thread ], [ %.281, %193 ]
  %wide.trip.count = zext nneg i32 %.477147 to i64
  %min.iters.check184 = icmp ult i32 %.477147, 8
  br i1 %min.iters.check184, label %.preheader.preheader204, label %vector.ph185

vector.ph185:                                     ; preds = %.preheader.preheader
  %n.vec187 = and i64 %wide.trip.count, 2147483640
  br label %vector.body189

vector.body189:                                   ; preds = %vector.body189, %vector.ph185
  %index190 = phi i64 [ 0, %vector.ph185 ], [ %index.next195, %vector.body189 ]
  %vec.phi191 = phi <8 x i16> [ zeroinitializer, %vector.ph185 ], [ %199, %vector.body189 ]
  %vec.ind192 = phi <8 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, %vector.ph185 ], [ %vec.ind.next193, %vector.body189 ]
  %194 = getelementptr inbounds i8, ptr %.4148, i64 %index190
  %wide.load194 = load <8 x i8>, ptr %194, align 1, !tbaa !5
  %195 = and <8 x i8> %wide.load194, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  %196 = zext nneg <8 x i8> %195 to <8 x i32>
  %197 = shl nuw nsw <8 x i32> %196, %vec.ind192
  %198 = trunc <8 x i32> %197 to <8 x i16>
  %199 = or <8 x i16> %vec.phi191, %198
  %index.next195 = add nuw i64 %index190, 8
  %vec.ind.next193 = add <8 x i32> %vec.ind192, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
  %200 = icmp eq i64 %index.next195, %n.vec187
  br i1 %200, label %middle.block182, label %vector.body189, !llvm.loop !24

middle.block182:                                  ; preds = %vector.body189
  %201 = tail call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %199)
  %cmp.n = icmp eq i64 %n.vec187, %wide.trip.count
  br i1 %cmp.n, label %.loopexit197, label %.preheader.preheader204

.preheader.preheader204:                          ; preds = %middle.block182, %.preheader.preheader
  %indvars.iv139.ph = phi i64 [ 0, %.preheader.preheader ], [ %n.vec187, %middle.block182 ]
  %.072116.ph = phi i16 [ 0, %.preheader.preheader ], [ %201, %middle.block182 ]
  br label %.preheader

.preheader:                                       ; preds = %.preheader.preheader204, %.preheader
  %indvars.iv139 = phi i64 [ %indvars.iv.next140, %.preheader ], [ %indvars.iv139.ph, %.preheader.preheader204 ]
  %.072116 = phi i16 [ %209, %.preheader ], [ %.072116.ph, %.preheader.preheader204 ]
  %202 = getelementptr inbounds i8, ptr %.4148, i64 %indvars.iv139
  %203 = load i8, ptr %202, align 1, !tbaa !5
  %204 = and i8 %203, 1
  %205 = zext nneg i8 %204 to i32
  %206 = trunc nuw nsw i64 %indvars.iv139 to i32
  %207 = shl nuw nsw i32 %205, %206
  %208 = trunc i32 %207 to i16
  %209 = or i16 %.072116, %208
  %indvars.iv.next140 = add nuw nsw i64 %indvars.iv139, 1
  %exitcond141.not = icmp eq i64 %indvars.iv.next140, %wide.trip.count
  br i1 %exitcond141.not, label %.loopexit197, label %.preheader, !llvm.loop !25

.loopexit197:                                     ; preds = %.preheader, %middle.block182
  %.lcssa = phi i16 [ %201, %middle.block182 ], [ %209, %.preheader ]
  %210 = icmp ult i32 %.477147, 9
  br i1 %210, label %211, label %213

211:                                              ; preds = %.loopexit197
  %212 = trunc i16 %.lcssa to i8
  store i8 %212, ptr %.382146, align 1, !tbaa !5
  br label %.loopexit96

213:                                              ; preds = %.loopexit197
  store i16 %.lcssa, ptr %.382146, align 2, !tbaa !22
  br label %.loopexit96

.loopexit96:                                      ; preds = %44, %193, %213, %211
  ret void
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>) #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>) #1

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>) #1

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>) #1

attributes #0 = { nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) 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 speculatable willreturn memory(none) }

!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 = !{!9}
!9 = distinct !{!9, !10}
!10 = distinct !{!10, !"LVerDomain"}
!11 = distinct !{!11, !12, !13, !14}
!12 = !{!"llvm.loop.mustprogress"}
!13 = !{!"llvm.loop.isvectorized", i32 1}
!14 = !{!"llvm.loop.unroll.runtime.disable"}
!15 = distinct !{!15, !12, !13}
!16 = distinct !{!16, !12}
!17 = !{!18, !18, i64 0}
!18 = !{!"long", !6, i64 0}
!19 = distinct !{!19, !12}
!20 = !{!21, !21, i64 0}
!21 = !{!"int", !6, i64 0}
!22 = !{!23, !23, i64 0}
!23 = !{!"short", !6, i64 0}
!24 = distinct !{!24, !12, !13, !14}
!25 = distinct !{!25, !12, !14, !13}


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