; LLVM IR from JamisHoo/Cryptographic-Algorithms :: src/sha2_512.ll (Z4sha2PKvmPc)

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

@__const._Z4sha2PKvmPc.h = external hidden unnamed_addr constant [8 x i64], align 16

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z14sha2_iterationPKhPm(ptr noundef, ptr noundef) #0

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_Z4sha2PKvmPc(ptr noundef %0, i64 noundef %1, ptr noundef %2) #0 {
  %4 = alloca ptr, align 8
  %5 = alloca i64, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca [8 x i64], align 16
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca [128 x i8], align 16
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i64 %1, ptr %5, align 8, !tbaa !9
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #3
  %15 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %15, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  store i64 128, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 64, ptr %9) #3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %9, ptr align 16 @__const._Z4sha2PKvmPc.h, i64 64, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  %16 = load i64, ptr %5, align 8, !tbaa !9
  %17 = mul i64 %16, 8
  store i64 %17, ptr %10, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #3
  store i64 0, ptr %11, align 8, !tbaa !9
  br label %18

18:                                               ; preds = %30, %3
  %19 = load i64, ptr %11, align 8, !tbaa !9
  %20 = load i64, ptr %5, align 8, !tbaa !9
  %21 = udiv i64 %20, 128
  %22 = icmp ult i64 %19, %21
  br i1 %22, label %24, label %23

23:                                               ; preds = %18
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #3
  br label %33

24:                                               ; preds = %18
  %25 = load ptr, ptr %7, align 8, !tbaa !5
  %26 = load i64, ptr %11, align 8, !tbaa !9
  %27 = mul i64 %26, 128
  %28 = getelementptr inbounds i8, ptr %25, i64 %27
  %29 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 0
  call void @_Z14sha2_iterationPKhPm(ptr noundef %28, ptr noundef %29)
  br label %30

30:                                               ; preds = %24
  %31 = load i64, ptr %11, align 8, !tbaa !9
  %32 = add i64 %31, 1
  store i64 %32, ptr %11, align 8, !tbaa !9
  br label %18, !llvm.loop !11

33:                                               ; preds = %23
  call void @llvm.lifetime.start.p0(i64 128, ptr %12) #3
  %34 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 0
  %35 = load ptr, ptr %7, align 8, !tbaa !5
  %36 = load i64, ptr %5, align 8, !tbaa !9
  %37 = udiv i64 %36, 128
  %38 = mul i64 %37, 128
  %39 = getelementptr inbounds i8, ptr %35, i64 %38
  %40 = load i64, ptr %5, align 8, !tbaa !9
  %41 = urem i64 %40, 128
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %34, ptr align 1 %39, i64 %41, i1 false)
  %42 = load i64, ptr %5, align 8, !tbaa !9
  %43 = urem i64 %42, 128
  store i64 %43, ptr %5, align 8, !tbaa !9
  %44 = load i64, ptr %5, align 8, !tbaa !9
  %45 = add i64 %44, 1
  store i64 %45, ptr %5, align 8, !tbaa !9
  %46 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 %44
  store i8 -128, ptr %46, align 1, !tbaa !13
  %47 = load i64, ptr %5, align 8, !tbaa !9
  %48 = urem i64 %47, 128
  %49 = icmp eq i64 %48, 0
  br i1 %49, label %50, label %53

50:                                               ; preds = %33
  %51 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 0
  %52 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 0
  call void @_Z14sha2_iterationPKhPm(ptr noundef %51, ptr noundef %52)
  store i64 0, ptr %5, align 8, !tbaa !9
  br label %53

53:                                               ; preds = %50, %33
  br label %54

54:                                               ; preds = %68, %53
  %55 = load i64, ptr %5, align 8, !tbaa !9
  %56 = urem i64 %55, 128
  %57 = icmp ne i64 %56, 112
  br i1 %57, label %58, label %69

58:                                               ; preds = %54
  %59 = load i64, ptr %5, align 8, !tbaa !9
  %60 = add i64 %59, 1
  store i64 %60, ptr %5, align 8, !tbaa !9
  %61 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 %59
  store i8 0, ptr %61, align 1, !tbaa !13
  %62 = load i64, ptr %5, align 8, !tbaa !9
  %63 = urem i64 %62, 128
  %64 = icmp eq i64 %63, 0
  br i1 %64, label %65, label %68

65:                                               ; preds = %58
  %66 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 0
  %67 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 0
  call void @_Z14sha2_iterationPKhPm(ptr noundef %66, ptr noundef %67)
  store i64 0, ptr %5, align 8, !tbaa !9
  br label %68

68:                                               ; preds = %65, %58
  br label %54, !llvm.loop !14

69:                                               ; preds = %54
  br label %70

70:                                               ; preds = %92, %69
  %71 = load i64, ptr %5, align 8, !tbaa !9
  %72 = urem i64 %71, 128
  %73 = icmp ne i64 %72, 0
  br i1 %73, label %74, label %95

74:                                               ; preds = %70
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  %75 = load i64, ptr %5, align 8, !tbaa !9
  %76 = sub i64 %75, 128
  %77 = add i64 %76, 16
  %78 = mul i64 %77, 8
  %79 = sub i64 120, %78
  store i64 %79, ptr %13, align 8, !tbaa !9
  %80 = load i64, ptr %13, align 8, !tbaa !9
  %81 = icmp uge i64 %80, 64
  br i1 %81, label %82, label %85

82:                                               ; preds = %74
  %83 = load i64, ptr %5, align 8, !tbaa !9
  %84 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 %83
  store i8 0, ptr %84, align 1, !tbaa !13
  br label %92

85:                                               ; preds = %74
  %86 = load i64, ptr %10, align 8, !tbaa !9
  %87 = load i64, ptr %13, align 8, !tbaa !9
  %88 = lshr i64 %86, %87
  %89 = trunc i64 %88 to i8
  %90 = load i64, ptr %5, align 8, !tbaa !9
  %91 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 %90
  store i8 %89, ptr %91, align 1, !tbaa !13
  br label %92

92:                                               ; preds = %85, %82
  %93 = load i64, ptr %5, align 8, !tbaa !9
  %94 = add i64 %93, 1
  store i64 %94, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  br label %70, !llvm.loop !15

95:                                               ; preds = %70
  %96 = getelementptr inbounds [128 x i8], ptr %12, i64 0, i64 0
  %97 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 0
  call void @_Z14sha2_iterationPKhPm(ptr noundef %96, ptr noundef %97)
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  store i64 0, ptr %14, align 8, !tbaa !9
  br label %98

98:                                               ; preds = %183, %95
  %99 = load i64, ptr %14, align 8, !tbaa !9
  %100 = icmp ult i64 %99, 64
  br i1 %100, label %102, label %101

101:                                              ; preds = %98
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  br label %186

102:                                              ; preds = %98
  %103 = load i64, ptr %14, align 8, !tbaa !9
  %104 = udiv i64 %103, 8
  %105 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %104
  %106 = load i64, ptr %105, align 8, !tbaa !9
  %107 = lshr i64 %106, 56
  %108 = trunc i64 %107 to i8
  %109 = load ptr, ptr %6, align 8, !tbaa !5
  %110 = load i64, ptr %14, align 8, !tbaa !9
  %111 = add i64 %110, 0
  %112 = getelementptr inbounds i8, ptr %109, i64 %111
  store i8 %108, ptr %112, align 1, !tbaa !13
  %113 = load i64, ptr %14, align 8, !tbaa !9
  %114 = udiv i64 %113, 8
  %115 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %114
  %116 = load i64, ptr %115, align 8, !tbaa !9
  %117 = lshr i64 %116, 48
  %118 = trunc i64 %117 to i8
  %119 = load ptr, ptr %6, align 8, !tbaa !5
  %120 = load i64, ptr %14, align 8, !tbaa !9
  %121 = add i64 %120, 1
  %122 = getelementptr inbounds i8, ptr %119, i64 %121
  store i8 %118, ptr %122, align 1, !tbaa !13
  %123 = load i64, ptr %14, align 8, !tbaa !9
  %124 = udiv i64 %123, 8
  %125 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %124
  %126 = load i64, ptr %125, align 8, !tbaa !9
  %127 = lshr i64 %126, 40
  %128 = trunc i64 %127 to i8
  %129 = load ptr, ptr %6, align 8, !tbaa !5
  %130 = load i64, ptr %14, align 8, !tbaa !9
  %131 = add i64 %130, 2
  %132 = getelementptr inbounds i8, ptr %129, i64 %131
  store i8 %128, ptr %132, align 1, !tbaa !13
  %133 = load i64, ptr %14, align 8, !tbaa !9
  %134 = udiv i64 %133, 8
  %135 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %134
  %136 = load i64, ptr %135, align 8, !tbaa !9
  %137 = lshr i64 %136, 32
  %138 = trunc i64 %137 to i8
  %139 = load ptr, ptr %6, align 8, !tbaa !5
  %140 = load i64, ptr %14, align 8, !tbaa !9
  %141 = add i64 %140, 3
  %142 = getelementptr inbounds i8, ptr %139, i64 %141
  store i8 %138, ptr %142, align 1, !tbaa !13
  %143 = load i64, ptr %14, align 8, !tbaa !9
  %144 = udiv i64 %143, 8
  %145 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %144
  %146 = load i64, ptr %145, align 8, !tbaa !9
  %147 = lshr i64 %146, 24
  %148 = trunc i64 %147 to i8
  %149 = load ptr, ptr %6, align 8, !tbaa !5
  %150 = load i64, ptr %14, align 8, !tbaa !9
  %151 = add i64 %150, 4
  %152 = getelementptr inbounds i8, ptr %149, i64 %151
  store i8 %148, ptr %152, align 1, !tbaa !13
  %153 = load i64, ptr %14, align 8, !tbaa !9
  %154 = udiv i64 %153, 8
  %155 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %154
  %156 = load i64, ptr %155, align 8, !tbaa !9
  %157 = lshr i64 %156, 16
  %158 = trunc i64 %157 to i8
  %159 = load ptr, ptr %6, align 8, !tbaa !5
  %160 = load i64, ptr %14, align 8, !tbaa !9
  %161 = add i64 %160, 5
  %162 = getelementptr inbounds i8, ptr %159, i64 %161
  store i8 %158, ptr %162, align 1, !tbaa !13
  %163 = load i64, ptr %14, align 8, !tbaa !9
  %164 = udiv i64 %163, 8
  %165 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %164
  %166 = load i64, ptr %165, align 8, !tbaa !9
  %167 = lshr i64 %166, 8
  %168 = trunc i64 %167 to i8
  %169 = load ptr, ptr %6, align 8, !tbaa !5
  %170 = load i64, ptr %14, align 8, !tbaa !9
  %171 = add i64 %170, 6
  %172 = getelementptr inbounds i8, ptr %169, i64 %171
  store i8 %168, ptr %172, align 1, !tbaa !13
  %173 = load i64, ptr %14, align 8, !tbaa !9
  %174 = udiv i64 %173, 8
  %175 = getelementptr inbounds [8 x i64], ptr %9, i64 0, i64 %174
  %176 = load i64, ptr %175, align 8, !tbaa !9
  %177 = lshr i64 %176, 0
  %178 = trunc i64 %177 to i8
  %179 = load ptr, ptr %6, align 8, !tbaa !5
  %180 = load i64, ptr %14, align 8, !tbaa !9
  %181 = add i64 %180, 7
  %182 = getelementptr inbounds i8, ptr %179, i64 %181
  store i8 %178, ptr %182, align 1, !tbaa !13
  br label %183

183:                                              ; preds = %102
  %184 = load i64, ptr %14, align 8, !tbaa !9
  %185 = add i64 %184, 8
  store i64 %185, ptr %14, align 8, !tbaa !9
  br label %98, !llvm.loop !16

186:                                              ; preds = %101
  call void @llvm.lifetime.end.p0(i64 128, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 64, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  ret void
}

attributes #0 = { mustprogress 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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = !{!7, !7, i64 0}
!14 = distinct !{!14, !12}
!15 = distinct !{!15, !12}
!16 = distinct !{!16, !12}


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

@__const._Z4sha2PKvmPc.h = external hidden unnamed_addr constant [8 x i64], align 16

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z14sha2_iterationPKhPm(ptr noundef, ptr 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: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

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

; Function Attrs: mustprogress uwtable
define dso_local void @_Z4sha2PKvmPc(ptr noundef %0, i64 noundef %1, ptr nocapture noundef writeonly %2) local_unnamed_addr #0 {
  %4 = alloca [8 x i64], align 16
  %5 = alloca [128 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %4) #3
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(64) %4, ptr noundef nonnull align 16 dereferenceable(64) @__const._Z4sha2PKvmPc.h, i64 64, i1 false)
  %6 = shl i64 %1, 3
  %7 = lshr i64 %1, 7
  %.not64 = icmp ult i64 %1, 128
  br i1 %.not64, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %.lr.ph, %3
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %5) #3
  %8 = and i64 %1, -128
  %9 = getelementptr inbounds i8, ptr %0, i64 %8
  %10 = and i64 %1, 127
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %5, ptr align 1 %9, i64 %10, i1 false)
  %11 = add nuw nsw i64 %10, 1
  %12 = getelementptr inbounds [128 x i8], ptr %5, i64 0, i64 %10
  store i8 -128, ptr %12, align 1, !tbaa !5
  %13 = and i64 %11, 127
  %14 = icmp eq i64 %13, 0
  br i1 %14, label %.thread, label %18

.lr.ph:                                           ; preds = %3, %.lr.ph
  %.05054 = phi i64 [ %17, %.lr.ph ], [ 0, %3 ]
  %15 = shl nuw i64 %.05054, 7
  %16 = getelementptr inbounds i8, ptr %0, i64 %15
  call void @_Z14sha2_iterationPKhPm(ptr noundef %16, ptr noundef nonnull %4)
  %17 = add nuw nsw i64 %.05054, 1
  %exitcond.not = icmp eq i64 %17, %7
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !8

.thread:                                          ; preds = %._crit_edge
  call void @_Z14sha2_iterationPKhPm(ptr noundef nonnull %5, ptr noundef nonnull %4)
  br label %.lr.ph58.preheader

18:                                               ; preds = %._crit_edge
  %19 = and i64 %11, 127
  %.not55 = icmp eq i64 %19, 112
  br i1 %.not55, label %.lr.ph61.preheader, label %.lr.ph58.preheader

.lr.ph58.preheader:                               ; preds = %.thread, %18
  %.156.ph = phi i64 [ %11, %18 ], [ 0, %.thread ]
  br label %.lr.ph58

.lr.ph61.preheader:                               ; preds = %35, %18
  %.1.lcssa = phi i64 [ %11, %18 ], [ %.2, %35 ]
  %20 = and i64 %.1.lcssa, 127
  %21 = sub nuw nsw i64 128, %20
  %min.iters.check = icmp ugt i64 %20, 112
  br i1 %min.iters.check, label %.lr.ph61.preheader68, label %vector.ph

.lr.ph61.preheader68:                             ; preds = %middle.block, %.lr.ph61.preheader
  %.360.ph = phi i64 [ %.1.lcssa, %.lr.ph61.preheader ], [ %ind.end, %middle.block ]
  br label %.lr.ph61

vector.ph:                                        ; preds = %.lr.ph61.preheader
  %n.vec = and i64 %21, 240
  %ind.end = add i64 %.1.lcssa, %n.vec
  %.splatinsert = insertelement <16 x i64> poison, i64 %.1.lcssa, i64 0
  %.splat = shufflevector <16 x i64> %.splatinsert, <16 x i64> poison, <16 x i32> zeroinitializer
  %induction = add <16 x i64> %.splat, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
  %broadcast.splatinsert = insertelement <16 x i64> poison, i64 %6, i64 0
  %broadcast.splat = shufflevector <16 x i64> %broadcast.splatinsert, <16 x i64> poison, <16 x i32> zeroinitializer
  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 i64> [ %induction, %vector.ph ], [ %vec.ind.next, %vector.body ]
  %offset.idx = add i64 %.1.lcssa, %index
  %22 = shl <16 x i64> %vec.ind, <i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3>
  %23 = sub <16 x i64> <i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016, i64 1016>, %22
  %24 = icmp ugt <16 x i64> %23, <i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63, i64 63>
  %25 = lshr <16 x i64> %broadcast.splat, %23
  %26 = trunc <16 x i64> %25 to <16 x i8>
  %27 = select <16 x i1> %24, <16 x i8> zeroinitializer, <16 x i8> %26
  %28 = getelementptr inbounds [128 x i8], ptr %5, i64 0, i64 %offset.idx
  store <16 x i8> %27, ptr %28, align 1
  %index.next = add nuw i64 %index, 16
  %vec.ind.next = add <16 x i64> %vec.ind, <i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16>
  %29 = icmp eq i64 %index.next, %n.vec
  br i1 %29, label %middle.block, label %vector.body, !llvm.loop !10

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %21, %n.vec
  br i1 %cmp.n, label %._crit_edge62, label %.lr.ph61.preheader68

.lr.ph58:                                         ; preds = %.lr.ph58.preheader, %35
  %.156 = phi i64 [ %.2, %35 ], [ %.156.ph, %.lr.ph58.preheader ]
  %30 = add i64 %.156, 1
  %31 = getelementptr inbounds [128 x i8], ptr %5, i64 0, i64 %.156
  store i8 0, ptr %31, align 1, !tbaa !5
  %32 = and i64 %30, 127
  %33 = icmp eq i64 %32, 0
  br i1 %33, label %34, label %35

34:                                               ; preds = %.lr.ph58
  call void @_Z14sha2_iterationPKhPm(ptr noundef nonnull %5, ptr noundef nonnull %4)
  br label %35

35:                                               ; preds = %34, %.lr.ph58
  %.2 = phi i64 [ 0, %34 ], [ %30, %.lr.ph58 ]
  %36 = and i64 %.2, 127
  %.not = icmp eq i64 %36, 112
  br i1 %.not, label %.lr.ph61.preheader, label %.lr.ph58, !llvm.loop !13

.lr.ph61:                                         ; preds = %.lr.ph61.preheader68, %.lr.ph61
  %.360 = phi i64 [ %43, %.lr.ph61 ], [ %.360.ph, %.lr.ph61.preheader68 ]
  %37 = shl i64 %.360, 3
  %38 = sub i64 1016, %37
  %39 = icmp ugt i64 %38, 63
  %40 = lshr i64 %6, %38
  %41 = trunc i64 %40 to i8
  %.sink = select i1 %39, i8 0, i8 %41
  %42 = getelementptr inbounds [128 x i8], ptr %5, i64 0, i64 %.360
  store i8 %.sink, ptr %42, align 1
  %43 = add i64 %.360, 1
  %44 = and i64 %43, 127
  %.not53 = icmp eq i64 %44, 0
  br i1 %.not53, label %._crit_edge62, label %.lr.ph61, !llvm.loop !14

._crit_edge62:                                    ; preds = %.lr.ph61, %middle.block
  call void @_Z14sha2_iterationPKhPm(ptr noundef nonnull %5, ptr noundef nonnull %4)
  %45 = load i64, ptr %4, align 16, !tbaa !15
  %46 = lshr i64 %45, 56
  %47 = trunc nuw i64 %46 to i8
  store i8 %47, ptr %2, align 1, !tbaa !5
  %48 = lshr i64 %45, 48
  %49 = trunc i64 %48 to i8
  %50 = getelementptr inbounds i8, ptr %2, i64 1
  store i8 %49, ptr %50, align 1, !tbaa !5
  %51 = lshr i64 %45, 40
  %52 = trunc i64 %51 to i8
  %53 = getelementptr inbounds i8, ptr %2, i64 2
  store i8 %52, ptr %53, align 1, !tbaa !5
  %54 = lshr i64 %45, 32
  %55 = trunc i64 %54 to i8
  %56 = getelementptr inbounds i8, ptr %2, i64 3
  store i8 %55, ptr %56, align 1, !tbaa !5
  %57 = lshr i64 %45, 24
  %58 = trunc i64 %57 to i8
  %59 = getelementptr inbounds i8, ptr %2, i64 4
  store i8 %58, ptr %59, align 1, !tbaa !5
  %60 = lshr i64 %45, 16
  %61 = trunc i64 %60 to i8
  %62 = getelementptr inbounds i8, ptr %2, i64 5
  store i8 %61, ptr %62, align 1, !tbaa !5
  %63 = lshr i64 %45, 8
  %64 = trunc i64 %63 to i8
  %65 = getelementptr inbounds i8, ptr %2, i64 6
  store i8 %64, ptr %65, align 1, !tbaa !5
  %66 = trunc i64 %45 to i8
  %67 = getelementptr inbounds i8, ptr %2, i64 7
  store i8 %66, ptr %67, align 1, !tbaa !5
  %68 = getelementptr inbounds i8, ptr %4, i64 8
  %69 = load i64, ptr %68, align 8, !tbaa !15
  %70 = lshr i64 %69, 56
  %71 = trunc nuw i64 %70 to i8
  %72 = getelementptr inbounds i8, ptr %2, i64 8
  store i8 %71, ptr %72, align 1, !tbaa !5
  %73 = lshr i64 %69, 48
  %74 = trunc i64 %73 to i8
  %75 = getelementptr inbounds i8, ptr %2, i64 9
  store i8 %74, ptr %75, align 1, !tbaa !5
  %76 = lshr i64 %69, 40
  %77 = trunc i64 %76 to i8
  %78 = getelementptr inbounds i8, ptr %2, i64 10
  store i8 %77, ptr %78, align 1, !tbaa !5
  %79 = lshr i64 %69, 32
  %80 = trunc i64 %79 to i8
  %81 = getelementptr inbounds i8, ptr %2, i64 11
  store i8 %80, ptr %81, align 1, !tbaa !5
  %82 = lshr i64 %69, 24
  %83 = trunc i64 %82 to i8
  %84 = getelementptr inbounds i8, ptr %2, i64 12
  store i8 %83, ptr %84, align 1, !tbaa !5
  %85 = lshr i64 %69, 16
  %86 = trunc i64 %85 to i8
  %87 = getelementptr inbounds i8, ptr %2, i64 13
  store i8 %86, ptr %87, align 1, !tbaa !5
  %88 = lshr i64 %69, 8
  %89 = trunc i64 %88 to i8
  %90 = getelementptr inbounds i8, ptr %2, i64 14
  store i8 %89, ptr %90, align 1, !tbaa !5
  %91 = trunc i64 %69 to i8
  %92 = getelementptr inbounds i8, ptr %2, i64 15
  store i8 %91, ptr %92, align 1, !tbaa !5
  %93 = getelementptr inbounds i8, ptr %4, i64 16
  %94 = load i64, ptr %93, align 16, !tbaa !15
  %95 = lshr i64 %94, 56
  %96 = trunc nuw i64 %95 to i8
  %97 = getelementptr inbounds i8, ptr %2, i64 16
  store i8 %96, ptr %97, align 1, !tbaa !5
  %98 = lshr i64 %94, 48
  %99 = trunc i64 %98 to i8
  %100 = getelementptr inbounds i8, ptr %2, i64 17
  store i8 %99, ptr %100, align 1, !tbaa !5
  %101 = lshr i64 %94, 40
  %102 = trunc i64 %101 to i8
  %103 = getelementptr inbounds i8, ptr %2, i64 18
  store i8 %102, ptr %103, align 1, !tbaa !5
  %104 = lshr i64 %94, 32
  %105 = trunc i64 %104 to i8
  %106 = getelementptr inbounds i8, ptr %2, i64 19
  store i8 %105, ptr %106, align 1, !tbaa !5
  %107 = lshr i64 %94, 24
  %108 = trunc i64 %107 to i8
  %109 = getelementptr inbounds i8, ptr %2, i64 20
  store i8 %108, ptr %109, align 1, !tbaa !5
  %110 = lshr i64 %94, 16
  %111 = trunc i64 %110 to i8
  %112 = getelementptr inbounds i8, ptr %2, i64 21
  store i8 %111, ptr %112, align 1, !tbaa !5
  %113 = lshr i64 %94, 8
  %114 = trunc i64 %113 to i8
  %115 = getelementptr inbounds i8, ptr %2, i64 22
  store i8 %114, ptr %115, align 1, !tbaa !5
  %116 = trunc i64 %94 to i8
  %117 = getelementptr inbounds i8, ptr %2, i64 23
  store i8 %116, ptr %117, align 1, !tbaa !5
  %118 = getelementptr inbounds i8, ptr %4, i64 24
  %119 = load i64, ptr %118, align 8, !tbaa !15
  %120 = lshr i64 %119, 56
  %121 = trunc nuw i64 %120 to i8
  %122 = getelementptr inbounds i8, ptr %2, i64 24
  store i8 %121, ptr %122, align 1, !tbaa !5
  %123 = lshr i64 %119, 48
  %124 = trunc i64 %123 to i8
  %125 = getelementptr inbounds i8, ptr %2, i64 25
  store i8 %124, ptr %125, align 1, !tbaa !5
  %126 = lshr i64 %119, 40
  %127 = trunc i64 %126 to i8
  %128 = getelementptr inbounds i8, ptr %2, i64 26
  store i8 %127, ptr %128, align 1, !tbaa !5
  %129 = lshr i64 %119, 32
  %130 = trunc i64 %129 to i8
  %131 = getelementptr inbounds i8, ptr %2, i64 27
  store i8 %130, ptr %131, align 1, !tbaa !5
  %132 = lshr i64 %119, 24
  %133 = trunc i64 %132 to i8
  %134 = getelementptr inbounds i8, ptr %2, i64 28
  store i8 %133, ptr %134, align 1, !tbaa !5
  %135 = lshr i64 %119, 16
  %136 = trunc i64 %135 to i8
  %137 = getelementptr inbounds i8, ptr %2, i64 29
  store i8 %136, ptr %137, align 1, !tbaa !5
  %138 = lshr i64 %119, 8
  %139 = trunc i64 %138 to i8
  %140 = getelementptr inbounds i8, ptr %2, i64 30
  store i8 %139, ptr %140, align 1, !tbaa !5
  %141 = trunc i64 %119 to i8
  %142 = getelementptr inbounds i8, ptr %2, i64 31
  store i8 %141, ptr %142, align 1, !tbaa !5
  %143 = getelementptr inbounds i8, ptr %4, i64 32
  %144 = load i64, ptr %143, align 16, !tbaa !15
  %145 = lshr i64 %144, 56
  %146 = trunc nuw i64 %145 to i8
  %147 = getelementptr inbounds i8, ptr %2, i64 32
  store i8 %146, ptr %147, align 1, !tbaa !5
  %148 = lshr i64 %144, 48
  %149 = trunc i64 %148 to i8
  %150 = getelementptr inbounds i8, ptr %2, i64 33
  store i8 %149, ptr %150, align 1, !tbaa !5
  %151 = lshr i64 %144, 40
  %152 = trunc i64 %151 to i8
  %153 = getelementptr inbounds i8, ptr %2, i64 34
  store i8 %152, ptr %153, align 1, !tbaa !5
  %154 = lshr i64 %144, 32
  %155 = trunc i64 %154 to i8
  %156 = getelementptr inbounds i8, ptr %2, i64 35
  store i8 %155, ptr %156, align 1, !tbaa !5
  %157 = lshr i64 %144, 24
  %158 = trunc i64 %157 to i8
  %159 = getelementptr inbounds i8, ptr %2, i64 36
  store i8 %158, ptr %159, align 1, !tbaa !5
  %160 = lshr i64 %144, 16
  %161 = trunc i64 %160 to i8
  %162 = getelementptr inbounds i8, ptr %2, i64 37
  store i8 %161, ptr %162, align 1, !tbaa !5
  %163 = lshr i64 %144, 8
  %164 = trunc i64 %163 to i8
  %165 = getelementptr inbounds i8, ptr %2, i64 38
  store i8 %164, ptr %165, align 1, !tbaa !5
  %166 = trunc i64 %144 to i8
  %167 = getelementptr inbounds i8, ptr %2, i64 39
  store i8 %166, ptr %167, align 1, !tbaa !5
  %168 = getelementptr inbounds i8, ptr %4, i64 40
  %169 = load i64, ptr %168, align 8, !tbaa !15
  %170 = lshr i64 %169, 56
  %171 = trunc nuw i64 %170 to i8
  %172 = getelementptr inbounds i8, ptr %2, i64 40
  store i8 %171, ptr %172, align 1, !tbaa !5
  %173 = lshr i64 %169, 48
  %174 = trunc i64 %173 to i8
  %175 = getelementptr inbounds i8, ptr %2, i64 41
  store i8 %174, ptr %175, align 1, !tbaa !5
  %176 = lshr i64 %169, 40
  %177 = trunc i64 %176 to i8
  %178 = getelementptr inbounds i8, ptr %2, i64 42
  store i8 %177, ptr %178, align 1, !tbaa !5
  %179 = lshr i64 %169, 32
  %180 = trunc i64 %179 to i8
  %181 = getelementptr inbounds i8, ptr %2, i64 43
  store i8 %180, ptr %181, align 1, !tbaa !5
  %182 = lshr i64 %169, 24
  %183 = trunc i64 %182 to i8
  %184 = getelementptr inbounds i8, ptr %2, i64 44
  store i8 %183, ptr %184, align 1, !tbaa !5
  %185 = lshr i64 %169, 16
  %186 = trunc i64 %185 to i8
  %187 = getelementptr inbounds i8, ptr %2, i64 45
  store i8 %186, ptr %187, align 1, !tbaa !5
  %188 = lshr i64 %169, 8
  %189 = trunc i64 %188 to i8
  %190 = getelementptr inbounds i8, ptr %2, i64 46
  store i8 %189, ptr %190, align 1, !tbaa !5
  %191 = trunc i64 %169 to i8
  %192 = getelementptr inbounds i8, ptr %2, i64 47
  store i8 %191, ptr %192, align 1, !tbaa !5
  %193 = getelementptr inbounds i8, ptr %4, i64 48
  %194 = load i64, ptr %193, align 16, !tbaa !15
  %195 = lshr i64 %194, 56
  %196 = trunc nuw i64 %195 to i8
  %197 = getelementptr inbounds i8, ptr %2, i64 48
  store i8 %196, ptr %197, align 1, !tbaa !5
  %198 = lshr i64 %194, 48
  %199 = trunc i64 %198 to i8
  %200 = getelementptr inbounds i8, ptr %2, i64 49
  store i8 %199, ptr %200, align 1, !tbaa !5
  %201 = lshr i64 %194, 40
  %202 = trunc i64 %201 to i8
  %203 = getelementptr inbounds i8, ptr %2, i64 50
  store i8 %202, ptr %203, align 1, !tbaa !5
  %204 = lshr i64 %194, 32
  %205 = trunc i64 %204 to i8
  %206 = getelementptr inbounds i8, ptr %2, i64 51
  store i8 %205, ptr %206, align 1, !tbaa !5
  %207 = lshr i64 %194, 24
  %208 = trunc i64 %207 to i8
  %209 = getelementptr inbounds i8, ptr %2, i64 52
  store i8 %208, ptr %209, align 1, !tbaa !5
  %210 = lshr i64 %194, 16
  %211 = trunc i64 %210 to i8
  %212 = getelementptr inbounds i8, ptr %2, i64 53
  store i8 %211, ptr %212, align 1, !tbaa !5
  %213 = lshr i64 %194, 8
  %214 = trunc i64 %213 to i8
  %215 = getelementptr inbounds i8, ptr %2, i64 54
  store i8 %214, ptr %215, align 1, !tbaa !5
  %216 = trunc i64 %194 to i8
  %217 = getelementptr inbounds i8, ptr %2, i64 55
  store i8 %216, ptr %217, align 1, !tbaa !5
  %218 = getelementptr inbounds i8, ptr %4, i64 56
  %219 = load i64, ptr %218, align 8, !tbaa !15
  %220 = lshr i64 %219, 56
  %221 = trunc nuw i64 %220 to i8
  %222 = getelementptr inbounds i8, ptr %2, i64 56
  store i8 %221, ptr %222, align 1, !tbaa !5
  %223 = lshr i64 %219, 48
  %224 = trunc i64 %223 to i8
  %225 = getelementptr inbounds i8, ptr %2, i64 57
  store i8 %224, ptr %225, align 1, !tbaa !5
  %226 = lshr i64 %219, 40
  %227 = trunc i64 %226 to i8
  %228 = getelementptr inbounds i8, ptr %2, i64 58
  store i8 %227, ptr %228, align 1, !tbaa !5
  %229 = lshr i64 %219, 32
  %230 = trunc i64 %229 to i8
  %231 = getelementptr inbounds i8, ptr %2, i64 59
  store i8 %230, ptr %231, align 1, !tbaa !5
  %232 = lshr i64 %219, 24
  %233 = trunc i64 %232 to i8
  %234 = getelementptr inbounds i8, ptr %2, i64 60
  store i8 %233, ptr %234, align 1, !tbaa !5
  %235 = lshr i64 %219, 16
  %236 = trunc i64 %235 to i8
  %237 = getelementptr inbounds i8, ptr %2, i64 61
  store i8 %236, ptr %237, align 1, !tbaa !5
  %238 = lshr i64 %219, 8
  %239 = trunc i64 %238 to i8
  %240 = getelementptr inbounds i8, ptr %2, i64 62
  store i8 %239, ptr %240, align 1, !tbaa !5
  %241 = trunc i64 %219 to i8
  %242 = getelementptr inbounds i8, ptr %2, i64 63
  store i8 %241, ptr %242, align 1, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %5) #3
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %4) #3
  ret void
}

attributes #0 = { mustprogress 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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = distinct !{!8, !9}
!9 = !{!"llvm.loop.mustprogress"}
!10 = distinct !{!10, !9, !11, !12}
!11 = !{!"llvm.loop.isvectorized", i32 1}
!12 = !{!"llvm.loop.unroll.runtime.disable"}
!13 = distinct !{!13, !9}
!14 = distinct !{!14, !9, !12, !11}
!15 = !{!16, !16, i64 0}
!16 = !{!"long", !6, i64 0}


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