; LLVM IR from zchrissirhcz/pixel :: legacy (rgb2gray)

; 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: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

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

; Function Attrs: nounwind uwtable
define dso_local void @pixel_rgb2gray_fixed(ptr noundef %0, i64 noundef %1, i64 noundef %2, ptr noundef %3) #1 {
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i64 %1, ptr %6, align 8, !tbaa !9
  store i64 %2, ptr %7, align 8, !tbaa !9
  store ptr %3, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #2
  %17 = load i64, ptr %6, align 8, !tbaa !9
  %18 = load i64, ptr %7, align 8, !tbaa !9
  %19 = mul i64 %17, %18
  store i64 %19, ptr %9, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #2
  %20 = load i64, ptr %9, align 8, !tbaa !9
  %21 = mul i64 %20, 3
  store i64 %21, ptr %10, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #2
  store i64 0, ptr %11, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #2
  store i64 0, ptr %12, align 8, !tbaa !9
  br label %22

22:                                               ; preds = %59, %4
  %23 = load i64, ptr %11, align 8, !tbaa !9
  %24 = load i64, ptr %9, align 8, !tbaa !9
  %25 = icmp ult i64 %23, %24
  br i1 %25, label %27, label %26

26:                                               ; preds = %22
  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

27:                                               ; preds = %22
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #2
  %28 = load ptr, ptr %5, align 8, !tbaa !5
  %29 = load i64, ptr %12, align 8, !tbaa !9
  %30 = getelementptr inbounds i8, ptr %28, i64 %29
  %31 = load i8, ptr %30, align 1, !tbaa !11
  %32 = zext i8 %31 to i32
  store i32 %32, ptr %13, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #2
  %33 = load ptr, ptr %5, align 8, !tbaa !5
  %34 = load i64, ptr %12, align 8, !tbaa !9
  %35 = add i64 %34, 1
  %36 = getelementptr inbounds i8, ptr %33, i64 %35
  %37 = load i8, ptr %36, align 1, !tbaa !11
  %38 = zext i8 %37 to i32
  store i32 %38, ptr %14, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #2
  %39 = load ptr, ptr %5, align 8, !tbaa !5
  %40 = load i64, ptr %12, align 8, !tbaa !9
  %41 = add i64 %40, 2
  %42 = getelementptr inbounds i8, ptr %39, i64 %41
  %43 = load i8, ptr %42, align 1, !tbaa !11
  %44 = zext i8 %43 to i32
  store i32 %44, ptr %15, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #2
  %45 = load i32, ptr %13, align 4, !tbaa !12
  %46 = mul nsw i32 77, %45
  %47 = load i32, ptr %14, align 4, !tbaa !12
  %48 = mul nsw i32 151, %47
  %49 = add nsw i32 %46, %48
  %50 = load i32, ptr %15, align 4, !tbaa !12
  %51 = mul nsw i32 28, %50
  %52 = add nsw i32 %49, %51
  %53 = ashr i32 %52, 8
  store i32 %53, ptr %16, align 4, !tbaa !12
  %54 = load i32, ptr %16, align 4, !tbaa !12
  %55 = trunc i32 %54 to i8
  %56 = load ptr, ptr %8, align 8, !tbaa !5
  %57 = load i64, ptr %11, align 8, !tbaa !9
  %58 = getelementptr inbounds i8, ptr %56, i64 %57
  store i8 %55, ptr %58, align 1, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #2
  br label %59

59:                                               ; preds = %27
  %60 = load i64, ptr %11, align 8, !tbaa !9
  %61 = add i64 %60, 1
  store i64 %61, ptr %11, align 8, !tbaa !9
  %62 = load i64, ptr %12, align 8, !tbaa !9
  %63 = add i64 %62, 3
  store i64 %63, ptr %12, align 8, !tbaa !9
  br label %22, !llvm.loop !14

64:                                               ; preds = %26
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #2
  ret void
}

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


; 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(argmem: readwrite) uwtable
define dso_local void @pixel_rgb2gray_fixed(ptr nocapture noundef readonly %0, i64 noundef %1, i64 noundef %2, ptr nocapture noundef writeonly %3) local_unnamed_addr #0 {
  %5 = mul i64 %2, %1
  %.not = icmp eq i64 %5, 0
  br i1 %.not, label %._crit_edge, label %iter.check

iter.check:                                       ; preds = %4
  %min.iters.check = icmp ult i64 %5, 8
  br i1 %min.iters.check, label %.lr.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %iter.check
  %scevgep = getelementptr i8, ptr %3, i64 %5
  %6 = mul i64 %2, %1
  %7 = mul i64 %6, 3
  %scevgep21 = getelementptr i8, ptr %0, i64 %7
  %bound0 = icmp ugt ptr %scevgep21, %3
  %bound1 = icmp ugt ptr %scevgep, %0
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %vector.memcheck
  %min.iters.check22 = icmp ult i64 %5, 16
  br i1 %min.iters.check22, label %vec.epilog.ph, label %vector.ph

vector.ph:                                        ; preds = %vector.main.loop.iter.check
  %n.vec = and i64 %5, -16
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = mul i64 %index, 3
  %8 = or disjoint i64 %offset.idx, 3
  %9 = or disjoint i64 %offset.idx, 6
  %10 = or disjoint i64 %offset.idx, 9
  %11 = or disjoint i64 %offset.idx, 12
  %12 = or disjoint i64 %offset.idx, 15
  %13 = getelementptr inbounds i8, ptr %0, i64 %offset.idx
  %14 = getelementptr inbounds i8, ptr %0, i64 %8
  %15 = getelementptr inbounds i8, ptr %0, i64 %9
  %16 = getelementptr inbounds i8, ptr %0, i64 %10
  %17 = getelementptr inbounds i8, ptr %0, i64 %11
  %18 = getelementptr inbounds i8, ptr %0, i64 %12
  %19 = getelementptr i8, ptr %0, i64 %offset.idx
  %20 = getelementptr i8, ptr %19, i64 18
  %21 = getelementptr i8, ptr %0, i64 %offset.idx
  %22 = getelementptr i8, ptr %21, i64 21
  %23 = getelementptr i8, ptr %0, i64 %offset.idx
  %24 = getelementptr i8, ptr %23, i64 24
  %25 = getelementptr i8, ptr %0, i64 %offset.idx
  %26 = getelementptr i8, ptr %25, i64 27
  %27 = getelementptr i8, ptr %0, i64 %offset.idx
  %28 = getelementptr i8, ptr %27, i64 30
  %29 = getelementptr i8, ptr %0, i64 %offset.idx
  %30 = getelementptr i8, ptr %29, i64 33
  %31 = getelementptr i8, ptr %0, i64 %offset.idx
  %32 = getelementptr i8, ptr %31, i64 36
  %33 = getelementptr i8, ptr %0, i64 %offset.idx
  %34 = getelementptr i8, ptr %33, i64 39
  %35 = getelementptr i8, ptr %0, i64 %offset.idx
  %36 = getelementptr i8, ptr %35, i64 42
  %37 = getelementptr i8, ptr %0, i64 %offset.idx
  %38 = getelementptr i8, ptr %37, i64 45
  %39 = load i8, ptr %13, align 1, !tbaa !5, !alias.scope !8
  %40 = load i8, ptr %14, align 1, !tbaa !5, !alias.scope !8
  %41 = load i8, ptr %15, align 1, !tbaa !5, !alias.scope !8
  %42 = load i8, ptr %16, align 1, !tbaa !5, !alias.scope !8
  %43 = load i8, ptr %17, align 1, !tbaa !5, !alias.scope !8
  %44 = load i8, ptr %18, align 1, !tbaa !5, !alias.scope !8
  %45 = load i8, ptr %20, align 1, !tbaa !5, !alias.scope !8
  %46 = load i8, ptr %22, align 1, !tbaa !5, !alias.scope !8
  %47 = load i8, ptr %24, align 1, !tbaa !5, !alias.scope !8
  %48 = load i8, ptr %26, align 1, !tbaa !5, !alias.scope !8
  %49 = load i8, ptr %28, align 1, !tbaa !5, !alias.scope !8
  %50 = load i8, ptr %30, align 1, !tbaa !5, !alias.scope !8
  %51 = load i8, ptr %32, align 1, !tbaa !5, !alias.scope !8
  %52 = load i8, ptr %34, align 1, !tbaa !5, !alias.scope !8
  %53 = load i8, ptr %36, align 1, !tbaa !5, !alias.scope !8
  %54 = load i8, ptr %38, align 1, !tbaa !5, !alias.scope !8
  %55 = insertelement <16 x i8> poison, i8 %39, i64 0
  %56 = insertelement <16 x i8> %55, i8 %40, i64 1
  %57 = insertelement <16 x i8> %56, i8 %41, i64 2
  %58 = insertelement <16 x i8> %57, i8 %42, i64 3
  %59 = insertelement <16 x i8> %58, i8 %43, i64 4
  %60 = insertelement <16 x i8> %59, i8 %44, i64 5
  %61 = insertelement <16 x i8> %60, i8 %45, i64 6
  %62 = insertelement <16 x i8> %61, i8 %46, i64 7
  %63 = insertelement <16 x i8> %62, i8 %47, i64 8
  %64 = insertelement <16 x i8> %63, i8 %48, i64 9
  %65 = insertelement <16 x i8> %64, i8 %49, i64 10
  %66 = insertelement <16 x i8> %65, i8 %50, i64 11
  %67 = insertelement <16 x i8> %66, i8 %51, i64 12
  %68 = insertelement <16 x i8> %67, i8 %52, i64 13
  %69 = insertelement <16 x i8> %68, i8 %53, i64 14
  %70 = insertelement <16 x i8> %69, i8 %54, i64 15
  %71 = zext <16 x i8> %70 to <16 x i32>
  %72 = getelementptr i8, ptr %13, i64 1
  %73 = getelementptr i8, ptr %14, i64 1
  %74 = getelementptr i8, ptr %15, i64 1
  %75 = getelementptr i8, ptr %16, i64 1
  %76 = getelementptr i8, ptr %17, i64 1
  %77 = getelementptr i8, ptr %18, i64 1
  %78 = getelementptr i8, ptr %19, i64 19
  %79 = getelementptr i8, ptr %21, i64 22
  %80 = getelementptr i8, ptr %23, i64 25
  %81 = getelementptr i8, ptr %25, i64 28
  %82 = getelementptr i8, ptr %27, i64 31
  %83 = getelementptr i8, ptr %29, i64 34
  %84 = getelementptr i8, ptr %31, i64 37
  %85 = getelementptr i8, ptr %33, i64 40
  %86 = getelementptr i8, ptr %35, i64 43
  %87 = getelementptr i8, ptr %37, i64 46
  %88 = load i8, ptr %72, align 1, !tbaa !5, !alias.scope !8
  %89 = load i8, ptr %73, align 1, !tbaa !5, !alias.scope !8
  %90 = load i8, ptr %74, align 1, !tbaa !5, !alias.scope !8
  %91 = load i8, ptr %75, align 1, !tbaa !5, !alias.scope !8
  %92 = load i8, ptr %76, align 1, !tbaa !5, !alias.scope !8
  %93 = load i8, ptr %77, align 1, !tbaa !5, !alias.scope !8
  %94 = load i8, ptr %78, align 1, !tbaa !5, !alias.scope !8
  %95 = load i8, ptr %79, align 1, !tbaa !5, !alias.scope !8
  %96 = load i8, ptr %80, align 1, !tbaa !5, !alias.scope !8
  %97 = load i8, ptr %81, align 1, !tbaa !5, !alias.scope !8
  %98 = load i8, ptr %82, align 1, !tbaa !5, !alias.scope !8
  %99 = load i8, ptr %83, align 1, !tbaa !5, !alias.scope !8
  %100 = load i8, ptr %84, align 1, !tbaa !5, !alias.scope !8
  %101 = load i8, ptr %85, align 1, !tbaa !5, !alias.scope !8
  %102 = load i8, ptr %86, align 1, !tbaa !5, !alias.scope !8
  %103 = load i8, ptr %87, align 1, !tbaa !5, !alias.scope !8
  %104 = insertelement <16 x i8> poison, i8 %88, i64 0
  %105 = insertelement <16 x i8> %104, i8 %89, i64 1
  %106 = insertelement <16 x i8> %105, i8 %90, i64 2
  %107 = insertelement <16 x i8> %106, i8 %91, i64 3
  %108 = insertelement <16 x i8> %107, i8 %92, i64 4
  %109 = insertelement <16 x i8> %108, i8 %93, i64 5
  %110 = insertelement <16 x i8> %109, i8 %94, i64 6
  %111 = insertelement <16 x i8> %110, i8 %95, i64 7
  %112 = insertelement <16 x i8> %111, i8 %96, i64 8
  %113 = insertelement <16 x i8> %112, i8 %97, i64 9
  %114 = insertelement <16 x i8> %113, i8 %98, i64 10
  %115 = insertelement <16 x i8> %114, i8 %99, i64 11
  %116 = insertelement <16 x i8> %115, i8 %100, i64 12
  %117 = insertelement <16 x i8> %116, i8 %101, i64 13
  %118 = insertelement <16 x i8> %117, i8 %102, i64 14
  %119 = insertelement <16 x i8> %118, i8 %103, i64 15
  %120 = zext <16 x i8> %119 to <16 x i32>
  %121 = getelementptr i8, ptr %13, i64 2
  %122 = getelementptr i8, ptr %14, i64 2
  %123 = getelementptr i8, ptr %15, i64 2
  %124 = getelementptr i8, ptr %16, i64 2
  %125 = getelementptr i8, ptr %17, i64 2
  %126 = getelementptr i8, ptr %18, i64 2
  %127 = getelementptr i8, ptr %19, i64 20
  %128 = getelementptr i8, ptr %21, i64 23
  %129 = getelementptr i8, ptr %23, i64 26
  %130 = getelementptr i8, ptr %25, i64 29
  %131 = getelementptr i8, ptr %27, i64 32
  %132 = getelementptr i8, ptr %29, i64 35
  %133 = getelementptr i8, ptr %31, i64 38
  %134 = getelementptr i8, ptr %33, i64 41
  %135 = getelementptr i8, ptr %35, i64 44
  %136 = getelementptr i8, ptr %37, i64 47
  %137 = load i8, ptr %121, align 1, !tbaa !5, !alias.scope !8
  %138 = load i8, ptr %122, align 1, !tbaa !5, !alias.scope !8
  %139 = load i8, ptr %123, align 1, !tbaa !5, !alias.scope !8
  %140 = load i8, ptr %124, align 1, !tbaa !5, !alias.scope !8
  %141 = load i8, ptr %125, align 1, !tbaa !5, !alias.scope !8
  %142 = load i8, ptr %126, align 1, !tbaa !5, !alias.scope !8
  %143 = load i8, ptr %127, align 1, !tbaa !5, !alias.scope !8
  %144 = load i8, ptr %128, align 1, !tbaa !5, !alias.scope !8
  %145 = load i8, ptr %129, align 1, !tbaa !5, !alias.scope !8
  %146 = load i8, ptr %130, align 1, !tbaa !5, !alias.scope !8
  %147 = load i8, ptr %131, align 1, !tbaa !5, !alias.scope !8
  %148 = load i8, ptr %132, align 1, !tbaa !5, !alias.scope !8
  %149 = load i8, ptr %133, align 1, !tbaa !5, !alias.scope !8
  %150 = load i8, ptr %134, align 1, !tbaa !5, !alias.scope !8
  %151 = load i8, ptr %135, align 1, !tbaa !5, !alias.scope !8
  %152 = load i8, ptr %136, align 1, !tbaa !5, !alias.scope !8
  %153 = insertelement <16 x i8> poison, i8 %137, i64 0
  %154 = insertelement <16 x i8> %153, i8 %138, i64 1
  %155 = insertelement <16 x i8> %154, i8 %139, i64 2
  %156 = insertelement <16 x i8> %155, i8 %140, i64 3
  %157 = insertelement <16 x i8> %156, i8 %141, i64 4
  %158 = insertelement <16 x i8> %157, i8 %142, i64 5
  %159 = insertelement <16 x i8> %158, i8 %143, i64 6
  %160 = insertelement <16 x i8> %159, i8 %144, i64 7
  %161 = insertelement <16 x i8> %160, i8 %145, i64 8
  %162 = insertelement <16 x i8> %161, i8 %146, i64 9
  %163 = insertelement <16 x i8> %162, i8 %147, i64 10
  %164 = insertelement <16 x i8> %163, i8 %148, i64 11
  %165 = insertelement <16 x i8> %164, i8 %149, i64 12
  %166 = insertelement <16 x i8> %165, i8 %150, i64 13
  %167 = insertelement <16 x i8> %166, i8 %151, i64 14
  %168 = insertelement <16 x i8> %167, i8 %152, i64 15
  %169 = zext <16 x i8> %168 to <16 x i32>
  %170 = mul nuw nsw <16 x i32> %71, <i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77>
  %171 = mul nuw nsw <16 x i32> %120, <i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151>
  %172 = add nuw nsw <16 x i32> %171, %170
  %173 = mul nuw nsw <16 x i32> %169, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
  %174 = add nuw nsw <16 x i32> %172, %173
  %175 = lshr <16 x i32> %174, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
  %176 = trunc <16 x i32> %175 to <16 x i8>
  %177 = getelementptr inbounds i8, ptr %3, i64 %index
  store <16 x i8> %176, ptr %177, align 1, !tbaa !5, !alias.scope !11, !noalias !8
  %index.next = add nuw i64 %index, 16
  %178 = icmp eq i64 %index.next, %n.vec
  br i1 %178, label %middle.block, label %vector.body, !llvm.loop !13

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

vec.epilog.iter.check:                            ; preds = %middle.block
  %ind.end25 = mul i64 %n.vec, 3
  %n.vec.remaining = and i64 %5, 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, %vector.memcheck, %iter.check, %vec.epilog.iter.check
  %.020.ph = phi i64 [ 0, %iter.check ], [ 0, %vector.memcheck ], [ %n.vec, %vec.epilog.iter.check ], [ %n.vec24, %vec.epilog.middle.block ]
  %.01819.ph = phi i64 [ 0, %iter.check ], [ 0, %vector.memcheck ], [ %ind.end25, %vec.epilog.iter.check ], [ %ind.end, %vec.epilog.middle.block ]
  %.neg = or disjoint i64 %.020.ph, 1
  %xtraiter = and i64 %5, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph.prol.loopexit, label %.lr.ph.prol

.lr.ph.prol:                                      ; preds = %.lr.ph.preheader
  %179 = getelementptr inbounds i8, ptr %0, i64 %.01819.ph
  %180 = load i8, ptr %179, align 1, !tbaa !5
  %181 = zext i8 %180 to i32
  %182 = getelementptr i8, ptr %179, i64 1
  %183 = load i8, ptr %182, align 1, !tbaa !5
  %184 = zext i8 %183 to i32
  %185 = getelementptr i8, ptr %179, i64 2
  %186 = load i8, ptr %185, align 1, !tbaa !5
  %187 = zext i8 %186 to i32
  %188 = mul nuw nsw i32 %181, 77
  %189 = mul nuw nsw i32 %184, 151
  %190 = add nuw nsw i32 %189, %188
  %191 = mul nuw nsw i32 %187, 28
  %192 = add nuw nsw i32 %190, %191
  %193 = lshr i32 %192, 8
  %194 = trunc nuw i32 %193 to i8
  %195 = getelementptr inbounds i8, ptr %3, i64 %.020.ph
  store i8 %194, ptr %195, align 1, !tbaa !5
  %196 = or disjoint i64 %.020.ph, 1
  %197 = add i64 %.01819.ph, 3
  br label %.lr.ph.prol.loopexit

.lr.ph.prol.loopexit:                             ; preds = %.lr.ph.prol, %.lr.ph.preheader
  %.020.unr = phi i64 [ %.020.ph, %.lr.ph.preheader ], [ %196, %.lr.ph.prol ]
  %.01819.unr = phi i64 [ %.01819.ph, %.lr.ph.preheader ], [ %197, %.lr.ph.prol ]
  %198 = icmp eq i64 %5, %.neg
  br i1 %198, label %._crit_edge, label %.lr.ph.preheader.new

.lr.ph.preheader.new:                             ; preds = %.lr.ph.prol.loopexit
  %invariant.gep = getelementptr i8, ptr %3, i64 1
  br label %.lr.ph

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %vec.epilog.resume.val = phi i64 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  %n.vec24 = and i64 %5, -8
  %ind.end = mul i64 %n.vec24, 3
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %vec.epilog.vector.body, %vec.epilog.ph
  %index27 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next29, %vec.epilog.vector.body ]
  %offset.idx28 = mul i64 %index27, 3
  %199 = or disjoint i64 %offset.idx28, 3
  %200 = or disjoint i64 %offset.idx28, 6
  %201 = getelementptr inbounds i8, ptr %0, i64 %offset.idx28
  %202 = getelementptr inbounds i8, ptr %0, i64 %199
  %203 = getelementptr inbounds i8, ptr %0, i64 %200
  %204 = getelementptr i8, ptr %0, i64 %offset.idx28
  %205 = getelementptr i8, ptr %204, i64 9
  %206 = getelementptr i8, ptr %0, i64 %offset.idx28
  %207 = getelementptr i8, ptr %206, i64 12
  %208 = getelementptr i8, ptr %0, i64 %offset.idx28
  %209 = getelementptr i8, ptr %208, i64 15
  %210 = getelementptr i8, ptr %0, i64 %offset.idx28
  %211 = getelementptr i8, ptr %210, i64 18
  %212 = getelementptr i8, ptr %0, i64 %offset.idx28
  %213 = getelementptr i8, ptr %212, i64 21
  %214 = load i8, ptr %201, align 1, !tbaa !5, !alias.scope !17
  %215 = load i8, ptr %202, align 1, !tbaa !5, !alias.scope !17
  %216 = load i8, ptr %203, align 1, !tbaa !5, !alias.scope !17
  %217 = load i8, ptr %205, align 1, !tbaa !5, !alias.scope !17
  %218 = load i8, ptr %207, align 1, !tbaa !5, !alias.scope !17
  %219 = load i8, ptr %209, align 1, !tbaa !5, !alias.scope !17
  %220 = load i8, ptr %211, align 1, !tbaa !5, !alias.scope !17
  %221 = load i8, ptr %213, align 1, !tbaa !5, !alias.scope !17
  %222 = insertelement <8 x i8> poison, i8 %214, i64 0
  %223 = insertelement <8 x i8> %222, i8 %215, i64 1
  %224 = insertelement <8 x i8> %223, i8 %216, i64 2
  %225 = insertelement <8 x i8> %224, i8 %217, i64 3
  %226 = insertelement <8 x i8> %225, i8 %218, i64 4
  %227 = insertelement <8 x i8> %226, i8 %219, i64 5
  %228 = insertelement <8 x i8> %227, i8 %220, i64 6
  %229 = insertelement <8 x i8> %228, i8 %221, i64 7
  %230 = zext <8 x i8> %229 to <8 x i32>
  %231 = getelementptr i8, ptr %201, i64 1
  %232 = getelementptr i8, ptr %202, i64 1
  %233 = getelementptr i8, ptr %203, i64 1
  %234 = getelementptr i8, ptr %204, i64 10
  %235 = getelementptr i8, ptr %206, i64 13
  %236 = getelementptr i8, ptr %208, i64 16
  %237 = getelementptr i8, ptr %210, i64 19
  %238 = getelementptr i8, ptr %212, i64 22
  %239 = load i8, ptr %231, align 1, !tbaa !5, !alias.scope !17
  %240 = load i8, ptr %232, align 1, !tbaa !5, !alias.scope !17
  %241 = load i8, ptr %233, align 1, !tbaa !5, !alias.scope !17
  %242 = load i8, ptr %234, align 1, !tbaa !5, !alias.scope !17
  %243 = load i8, ptr %235, align 1, !tbaa !5, !alias.scope !17
  %244 = load i8, ptr %236, align 1, !tbaa !5, !alias.scope !17
  %245 = load i8, ptr %237, align 1, !tbaa !5, !alias.scope !17
  %246 = load i8, ptr %238, align 1, !tbaa !5, !alias.scope !17
  %247 = insertelement <8 x i8> poison, i8 %239, i64 0
  %248 = insertelement <8 x i8> %247, i8 %240, i64 1
  %249 = insertelement <8 x i8> %248, i8 %241, i64 2
  %250 = insertelement <8 x i8> %249, i8 %242, i64 3
  %251 = insertelement <8 x i8> %250, i8 %243, i64 4
  %252 = insertelement <8 x i8> %251, i8 %244, i64 5
  %253 = insertelement <8 x i8> %252, i8 %245, i64 6
  %254 = insertelement <8 x i8> %253, i8 %246, i64 7
  %255 = zext <8 x i8> %254 to <8 x i32>
  %256 = getelementptr i8, ptr %201, i64 2
  %257 = getelementptr i8, ptr %202, i64 2
  %258 = getelementptr i8, ptr %203, i64 2
  %259 = getelementptr i8, ptr %204, i64 11
  %260 = getelementptr i8, ptr %206, i64 14
  %261 = getelementptr i8, ptr %208, i64 17
  %262 = getelementptr i8, ptr %210, i64 20
  %263 = getelementptr i8, ptr %212, i64 23
  %264 = load i8, ptr %256, align 1, !tbaa !5, !alias.scope !17
  %265 = load i8, ptr %257, align 1, !tbaa !5, !alias.scope !17
  %266 = load i8, ptr %258, align 1, !tbaa !5, !alias.scope !17
  %267 = load i8, ptr %259, align 1, !tbaa !5, !alias.scope !17
  %268 = load i8, ptr %260, align 1, !tbaa !5, !alias.scope !17
  %269 = load i8, ptr %261, align 1, !tbaa !5, !alias.scope !17
  %270 = load i8, ptr %262, align 1, !tbaa !5, !alias.scope !17
  %271 = load i8, ptr %263, align 1, !tbaa !5, !alias.scope !17
  %272 = insertelement <8 x i8> poison, i8 %264, i64 0
  %273 = insertelement <8 x i8> %272, i8 %265, i64 1
  %274 = insertelement <8 x i8> %273, i8 %266, i64 2
  %275 = insertelement <8 x i8> %274, i8 %267, i64 3
  %276 = insertelement <8 x i8> %275, i8 %268, i64 4
  %277 = insertelement <8 x i8> %276, i8 %269, i64 5
  %278 = insertelement <8 x i8> %277, i8 %270, i64 6
  %279 = insertelement <8 x i8> %278, i8 %271, i64 7
  %280 = zext <8 x i8> %279 to <8 x i32>
  %281 = mul nuw nsw <8 x i32> %230, <i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77, i32 77>
  %282 = mul nuw nsw <8 x i32> %255, <i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151, i32 151>
  %283 = add nuw nsw <8 x i32> %282, %281
  %284 = mul nuw nsw <8 x i32> %280, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
  %285 = add nuw nsw <8 x i32> %283, %284
  %286 = lshr <8 x i32> %285, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
  %287 = trunc <8 x i32> %286 to <8 x i8>
  %288 = getelementptr inbounds i8, ptr %3, i64 %index27
  store <8 x i8> %287, ptr %288, align 1, !tbaa !5, !alias.scope !20, !noalias !17
  %index.next29 = add nuw i64 %index27, 8
  %289 = icmp eq i64 %index.next29, %n.vec24
  br i1 %289, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !22

vec.epilog.middle.block:                          ; preds = %vec.epilog.vector.body
  %cmp.n30 = icmp eq i64 %5, %n.vec24
  br i1 %cmp.n30, label %._crit_edge, label %.lr.ph.preheader

._crit_edge:                                      ; preds = %.lr.ph.prol.loopexit, %.lr.ph, %middle.block, %vec.epilog.middle.block, %4
  ret void

.lr.ph:                                           ; preds = %.lr.ph, %.lr.ph.preheader.new
  %.020 = phi i64 [ %.020.unr, %.lr.ph.preheader.new ], [ %324, %.lr.ph ]
  %.01819 = phi i64 [ %.01819.unr, %.lr.ph.preheader.new ], [ %325, %.lr.ph ]
  %290 = getelementptr inbounds i8, ptr %0, i64 %.01819
  %291 = load i8, ptr %290, align 1, !tbaa !5
  %292 = zext i8 %291 to i32
  %293 = getelementptr i8, ptr %290, i64 1
  %294 = load i8, ptr %293, align 1, !tbaa !5
  %295 = zext i8 %294 to i32
  %296 = getelementptr i8, ptr %290, i64 2
  %297 = load i8, ptr %296, align 1, !tbaa !5
  %298 = zext i8 %297 to i32
  %299 = mul nuw nsw i32 %292, 77
  %300 = mul nuw nsw i32 %295, 151
  %301 = add nuw nsw i32 %300, %299
  %302 = mul nuw nsw i32 %298, 28
  %303 = add nuw nsw i32 %301, %302
  %304 = lshr i32 %303, 8
  %305 = trunc nuw i32 %304 to i8
  %306 = getelementptr inbounds i8, ptr %3, i64 %.020
  store i8 %305, ptr %306, align 1, !tbaa !5
  %307 = getelementptr i8, ptr %0, i64 %.01819
  %308 = getelementptr i8, ptr %307, i64 3
  %309 = load i8, ptr %308, align 1, !tbaa !5
  %310 = zext i8 %309 to i32
  %311 = getelementptr i8, ptr %307, i64 4
  %312 = load i8, ptr %311, align 1, !tbaa !5
  %313 = zext i8 %312 to i32
  %314 = getelementptr i8, ptr %307, i64 5
  %315 = load i8, ptr %314, align 1, !tbaa !5
  %316 = zext i8 %315 to i32
  %317 = mul nuw nsw i32 %310, 77
  %318 = mul nuw nsw i32 %313, 151
  %319 = add nuw nsw i32 %318, %317
  %320 = mul nuw nsw i32 %316, 28
  %321 = add nuw nsw i32 %319, %320
  %322 = lshr i32 %321, 8
  %323 = trunc nuw i32 %322 to i8
  %gep = getelementptr i8, ptr %invariant.gep, i64 %.020
  store i8 %323, ptr %gep, align 1, !tbaa !5
  %324 = add nuw i64 %.020, 2
  %325 = add i64 %.01819, 6
  %exitcond.not.1 = icmp eq i64 %324, %5
  br i1 %exitcond.not.1, label %._crit_edge, label %.lr.ph, !llvm.loop !23
}

attributes #0 = { nofree norecurse nosync nounwind memory(argmem: readwrite) 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 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = !{!9}
!9 = distinct !{!9, !10}
!10 = distinct !{!10, !"LVerDomain"}
!11 = !{!12}
!12 = distinct !{!12, !10}
!13 = distinct !{!13, !14, !15, !16}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!"llvm.loop.isvectorized", i32 1}
!16 = !{!"llvm.loop.unroll.runtime.disable"}
!17 = !{!18}
!18 = distinct !{!18, !19}
!19 = distinct !{!19, !"LVerDomain"}
!20 = !{!21}
!21 = distinct !{!21, !19}
!22 = distinct !{!22, !14, !15, !16}
!23 = distinct !{!23, !14, !15}


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