; LLVM IR from guanzhi/GmSSL :: src (kyber)

; 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 i32 @kyber_poly_cbd_sample(ptr noundef %0, i32 noundef %1, ptr noundef %2, i8 noundef zeroext %3) #1 {
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i8, align 1
  %9 = alloca i32, align 4
  %10 = alloca [128 x i8], align 16
  %11 = alloca i8, align 1
  %12 = alloca [192 x i8], align 16
  %13 = alloca i32, align 4
  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 i8 %3, ptr %8, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  %14 = load i32, ptr %6, align 4, !tbaa !9
  %15 = icmp eq i32 %14, 2
  br i1 %15, label %16, label %75

16:                                               ; preds = %4
  call void @llvm.lifetime.start.p0(i64 128, ptr %10) #3
  %17 = load ptr, ptr %7, align 8, !tbaa !5
  %18 = load i8, ptr %8, align 1, !tbaa !11
  %19 = getelementptr inbounds [128 x i8], ptr %10, i64 0, i64 0
  %20 = call i32 @kyber_prf(ptr noundef %17, i8 noundef zeroext %18, i64 noundef 128, ptr noundef %19)
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %21

21:                                               ; preds = %70, %16
  %22 = load i32, ptr %9, align 4, !tbaa !9
  %23 = icmp slt i32 %22, 128
  br i1 %23, label %24, label %73

24:                                               ; preds = %21
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #3
  %25 = load i32, ptr %9, align 4, !tbaa !9
  %26 = sext i32 %25 to i64
  %27 = getelementptr inbounds [128 x i8], ptr %10, i64 0, i64 %26
  %28 = load i8, ptr %27, align 1, !tbaa !11
  %29 = zext i8 %28 to i32
  %30 = and i32 %29, 85
  %31 = load i32, ptr %9, align 4, !tbaa !9
  %32 = sext i32 %31 to i64
  %33 = getelementptr inbounds [128 x i8], ptr %10, i64 0, i64 %32
  %34 = load i8, ptr %33, align 1, !tbaa !11
  %35 = zext i8 %34 to i32
  %36 = ashr i32 %35, 1
  %37 = and i32 %36, 85
  %38 = add nsw i32 %30, %37
  %39 = trunc i32 %38 to i8
  store i8 %39, ptr %11, align 1, !tbaa !11
  %40 = load i8, ptr %11, align 1, !tbaa !11
  %41 = zext i8 %40 to i32
  %42 = and i32 %41, 3
  %43 = load i8, ptr %11, align 1, !tbaa !11
  %44 = zext i8 %43 to i32
  %45 = ashr i32 %44, 2
  %46 = and i32 %45, 3
  %47 = sub nsw i32 %42, %46
  %48 = trunc i32 %47 to i16
  %49 = load ptr, ptr %5, align 8, !tbaa !5
  %50 = load i32, ptr %9, align 4, !tbaa !9
  %51 = mul nsw i32 2, %50
  %52 = sext i32 %51 to i64
  %53 = getelementptr inbounds i16, ptr %49, i64 %52
  store i16 %48, ptr %53, align 2, !tbaa !12
  %54 = load i8, ptr %11, align 1, !tbaa !11
  %55 = zext i8 %54 to i32
  %56 = ashr i32 %55, 4
  %57 = and i32 %56, 3
  %58 = load i8, ptr %11, align 1, !tbaa !11
  %59 = zext i8 %58 to i32
  %60 = ashr i32 %59, 6
  %61 = and i32 %60, 3
  %62 = sub nsw i32 %57, %61
  %63 = trunc i32 %62 to i16
  %64 = load ptr, ptr %5, align 8, !tbaa !5
  %65 = load i32, ptr %9, align 4, !tbaa !9
  %66 = mul nsw i32 2, %65
  %67 = add nsw i32 %66, 1
  %68 = sext i32 %67 to i64
  %69 = getelementptr inbounds i16, ptr %64, i64 %68
  store i16 %63, ptr %69, align 2, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #3
  br label %70

70:                                               ; preds = %24
  %71 = load i32, ptr %9, align 4, !tbaa !9
  %72 = add nsw i32 %71, 1
  store i32 %72, ptr %9, align 4, !tbaa !9
  br label %21, !llvm.loop !14

73:                                               ; preds = %21
  %74 = getelementptr inbounds [128 x i8], ptr %10, i64 0, i64 0
  call void @gmssl_secure_clear(ptr noundef %74, i64 noundef 128)
  call void @llvm.lifetime.end.p0(i64 128, ptr %10) #3
  br label %181

75:                                               ; preds = %4
  %76 = load i32, ptr %6, align 4, !tbaa !9
  %77 = icmp eq i32 %76, 3
  br i1 %77, label %78, label %180

78:                                               ; preds = %75
  call void @llvm.lifetime.start.p0(i64 192, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  %79 = load ptr, ptr %7, align 8, !tbaa !5
  %80 = load i8, ptr %8, align 1, !tbaa !11
  %81 = getelementptr inbounds [192 x i8], ptr %12, i64 0, i64 0
  %82 = call i32 @kyber_prf(ptr noundef %79, i8 noundef zeroext %80, i64 noundef 192, ptr noundef %81)
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %83

83:                                               ; preds = %175, %78
  %84 = load i32, ptr %9, align 4, !tbaa !9
  %85 = icmp slt i32 %84, 64
  br i1 %85, label %86, label %178

86:                                               ; preds = %83
  %87 = load i32, ptr %9, align 4, !tbaa !9
  %88 = mul nsw i32 3, %87
  %89 = sext i32 %88 to i64
  %90 = getelementptr inbounds [192 x i8], ptr %12, i64 0, i64 %89
  %91 = load i8, ptr %90, align 1, !tbaa !11
  %92 = zext i8 %91 to i32
  %93 = load i32, ptr %9, align 4, !tbaa !9
  %94 = mul nsw i32 3, %93
  %95 = add nsw i32 %94, 1
  %96 = sext i32 %95 to i64
  %97 = getelementptr inbounds [192 x i8], ptr %12, i64 0, i64 %96
  %98 = load i8, ptr %97, align 1, !tbaa !11
  %99 = zext i8 %98 to i32
  %100 = shl i32 %99, 8
  %101 = or i32 %92, %100
  %102 = load i32, ptr %9, align 4, !tbaa !9
  %103 = mul nsw i32 3, %102
  %104 = add nsw i32 %103, 2
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds [192 x i8], ptr %12, i64 0, i64 %105
  %107 = load i8, ptr %106, align 1, !tbaa !11
  %108 = zext i8 %107 to i32
  %109 = shl i32 %108, 16
  %110 = or i32 %101, %109
  store i32 %110, ptr %13, align 4, !tbaa !9
  %111 = load i32, ptr %13, align 4, !tbaa !9
  %112 = and i32 %111, 2396745
  %113 = load i32, ptr %13, align 4, !tbaa !9
  %114 = lshr i32 %113, 1
  %115 = and i32 %114, 2396745
  %116 = add i32 %112, %115
  %117 = load i32, ptr %13, align 4, !tbaa !9
  %118 = lshr i32 %117, 2
  %119 = and i32 %118, 2396745
  %120 = add i32 %116, %119
  store i32 %120, ptr %13, align 4, !tbaa !9
  %121 = load i32, ptr %13, align 4, !tbaa !9
  %122 = and i32 %121, 7
  %123 = load i32, ptr %13, align 4, !tbaa !9
  %124 = lshr i32 %123, 3
  %125 = and i32 %124, 7
  %126 = sub i32 %122, %125
  %127 = trunc i32 %126 to i16
  %128 = load ptr, ptr %5, align 8, !tbaa !5
  %129 = load i32, ptr %9, align 4, !tbaa !9
  %130 = mul nsw i32 4, %129
  %131 = sext i32 %130 to i64
  %132 = getelementptr inbounds i16, ptr %128, i64 %131
  store i16 %127, ptr %132, align 2, !tbaa !12
  %133 = load i32, ptr %13, align 4, !tbaa !9
  %134 = lshr i32 %133, 6
  %135 = and i32 %134, 7
  %136 = load i32, ptr %13, align 4, !tbaa !9
  %137 = lshr i32 %136, 9
  %138 = and i32 %137, 7
  %139 = sub i32 %135, %138
  %140 = trunc i32 %139 to i16
  %141 = load ptr, ptr %5, align 8, !tbaa !5
  %142 = load i32, ptr %9, align 4, !tbaa !9
  %143 = mul nsw i32 4, %142
  %144 = add nsw i32 %143, 1
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds i16, ptr %141, i64 %145
  store i16 %140, ptr %146, align 2, !tbaa !12
  %147 = load i32, ptr %13, align 4, !tbaa !9
  %148 = lshr i32 %147, 12
  %149 = and i32 %148, 7
  %150 = load i32, ptr %13, align 4, !tbaa !9
  %151 = lshr i32 %150, 15
  %152 = and i32 %151, 7
  %153 = sub i32 %149, %152
  %154 = trunc i32 %153 to i16
  %155 = load ptr, ptr %5, align 8, !tbaa !5
  %156 = load i32, ptr %9, align 4, !tbaa !9
  %157 = mul nsw i32 4, %156
  %158 = add nsw i32 %157, 2
  %159 = sext i32 %158 to i64
  %160 = getelementptr inbounds i16, ptr %155, i64 %159
  store i16 %154, ptr %160, align 2, !tbaa !12
  %161 = load i32, ptr %13, align 4, !tbaa !9
  %162 = lshr i32 %161, 18
  %163 = and i32 %162, 7
  %164 = load i32, ptr %13, align 4, !tbaa !9
  %165 = lshr i32 %164, 21
  %166 = and i32 %165, 7
  %167 = sub i32 %163, %166
  %168 = trunc i32 %167 to i16
  %169 = load ptr, ptr %5, align 8, !tbaa !5
  %170 = load i32, ptr %9, align 4, !tbaa !9
  %171 = mul nsw i32 4, %170
  %172 = add nsw i32 %171, 3
  %173 = sext i32 %172 to i64
  %174 = getelementptr inbounds i16, ptr %169, i64 %173
  store i16 %168, ptr %174, align 2, !tbaa !12
  br label %175

175:                                              ; preds = %86
  %176 = load i32, ptr %9, align 4, !tbaa !9
  %177 = add nsw i32 %176, 1
  store i32 %177, ptr %9, align 4, !tbaa !9
  br label %83, !llvm.loop !16

178:                                              ; preds = %83
  %179 = getelementptr inbounds [192 x i8], ptr %12, i64 0, i64 0
  call void @gmssl_secure_clear(ptr noundef %179, i64 noundef 192)
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 192, ptr %12) #3
  br label %180

180:                                              ; preds = %178, %75
  br label %181

181:                                              ; preds = %180, %73
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %182

182:                                              ; preds = %203, %181
  %183 = load i32, ptr %9, align 4, !tbaa !9
  %184 = icmp slt i32 %183, 256
  br i1 %184, label %185, label %206

185:                                              ; preds = %182
  %186 = load ptr, ptr %5, align 8, !tbaa !5
  %187 = load i32, ptr %9, align 4, !tbaa !9
  %188 = sext i32 %187 to i64
  %189 = getelementptr inbounds i16, ptr %186, i64 %188
  %190 = load i16, ptr %189, align 2, !tbaa !12
  %191 = sext i16 %190 to i32
  %192 = icmp slt i32 %191, 0
  br i1 %192, label %193, label %202

193:                                              ; preds = %185
  %194 = load ptr, ptr %5, align 8, !tbaa !5
  %195 = load i32, ptr %9, align 4, !tbaa !9
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds i16, ptr %194, i64 %196
  %198 = load i16, ptr %197, align 2, !tbaa !12
  %199 = sext i16 %198 to i32
  %200 = add nsw i32 %199, 3329
  %201 = trunc i32 %200 to i16
  store i16 %201, ptr %197, align 2, !tbaa !12
  br label %202

202:                                              ; preds = %193, %185
  br label %203

203:                                              ; preds = %202
  %204 = load i32, ptr %9, align 4, !tbaa !9
  %205 = add nsw i32 %204, 1
  store i32 %205, ptr %9, align 4, !tbaa !9
  br label %182, !llvm.loop !17

206:                                              ; preds = %182
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  ret i32 1
}

; Function Attrs: nounwind uwtable
declare hidden i32 @kyber_prf(ptr noundef, i8 noundef zeroext, i64 noundef, ptr noundef) #1

declare void @gmssl_secure_clear(ptr noundef, i64 noundef) #2

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 = { "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 #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/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"short", !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}
!17 = distinct !{!17, !15}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

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

; Function Attrs: mustprogress 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 noundef i32 @kyber_poly_cbd_sample(ptr nocapture noundef %0, i32 noundef %1, ptr noundef %2, i8 noundef zeroext %3) local_unnamed_addr #1 {
  %5 = alloca [128 x i8], align 16
  %6 = alloca [192 x i8], align 16
  switch i32 %1, label %vector.body75.preheader [
    i32 2, label %vector.ph65
    i32 3, label %vector.ph
  ]

vector.ph65:                                      ; preds = %4
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %5) #3
  %7 = call i32 @kyber_prf(ptr noundef %2, i8 noundef zeroext %3, i64 noundef 128, ptr noundef nonnull %5)
  %invariant.gep112 = getelementptr i8, ptr %0, i64 -2
  br label %vector.body67

vector.body67:                                    ; preds = %vector.body67, %vector.ph65
  %index68 = phi i64 [ 0, %vector.ph65 ], [ %index.next70, %vector.body67 ]
  %8 = getelementptr inbounds [128 x i8], ptr %5, i64 0, i64 %index68
  %wide.load = load <4 x i8>, ptr %8, align 4, !tbaa !5
  %9 = and <4 x i8> %wide.load, <i8 85, i8 85, i8 85, i8 85>
  %10 = lshr <4 x i8> %wide.load, <i8 1, i8 1, i8 1, i8 1>
  %11 = and <4 x i8> %10, <i8 85, i8 85, i8 85, i8 85>
  %12 = add nuw <4 x i8> %11, %9
  %13 = zext <4 x i8> %12 to <4 x i32>
  %14 = and <4 x i32> %13, <i32 3, i32 3, i32 3, i32 3>
  %15 = lshr <4 x i32> %13, <i32 2, i32 2, i32 2, i32 2>
  %16 = and <4 x i32> %15, <i32 3, i32 3, i32 3, i32 3>
  %17 = sub nsw <4 x i32> %14, %16
  %18 = shl nuw nsw i64 %index68, 1
  %19 = lshr <4 x i32> %13, <i32 4, i32 4, i32 4, i32 4>
  %20 = and <4 x i32> %19, <i32 3, i32 3, i32 3, i32 3>
  %21 = lshr <4 x i32> %13, <i32 6, i32 6, i32 6, i32 6>
  %22 = sub nsw <4 x i32> %20, %21
  %23 = or disjoint i64 %18, 1
  %gep113 = getelementptr i16, ptr %invariant.gep112, i64 %23
  %24 = shufflevector <4 x i32> %17, <4 x i32> %22, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
  %interleaved.vec69 = trunc nsw <8 x i32> %24 to <8 x i16>
  store <8 x i16> %interleaved.vec69, ptr %gep113, align 2, !tbaa !8
  %index.next70 = add nuw i64 %index68, 4
  %25 = icmp eq i64 %index.next70, 128
  br i1 %25, label %middle.block63, label %vector.body67, !llvm.loop !10

middle.block63:                                   ; preds = %vector.body67
  call void @gmssl_secure_clear(ptr noundef nonnull %5, i64 noundef 128) #3
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %5) #3
  br label %vector.body75.preheader

vector.ph:                                        ; preds = %4
  call void @llvm.lifetime.start.p0(i64 192, ptr nonnull %6) #3
  %26 = call i32 @kyber_prf(ptr noundef %2, i8 noundef zeroext %3, i64 noundef 192, ptr noundef nonnull %6)
  %invariant.gep = getelementptr i8, ptr %0, i64 -6
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %27 = mul nuw nsw i64 %index, 3
  %28 = getelementptr inbounds [192 x i8], ptr %6, i64 0, i64 %27
  %wide.vec = load <24 x i8>, ptr %28, align 8, !tbaa !5
  %strided.vec = shufflevector <24 x i8> %wide.vec, <24 x i8> poison, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>
  %strided.vec61 = shufflevector <24 x i8> %wide.vec, <24 x i8> poison, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>
  %strided.vec62 = shufflevector <24 x i8> %wide.vec, <24 x i8> poison, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>
  %29 = zext <8 x i8> %strided.vec to <8 x i32>
  %30 = zext <8 x i8> %strided.vec61 to <8 x i32>
  %31 = shl nuw nsw <8 x i32> %30, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
  %32 = or disjoint <8 x i32> %31, %29
  %33 = zext <8 x i8> %strided.vec62 to <8 x i32>
  %34 = shl nuw nsw <8 x i32> %33, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
  %35 = or disjoint <8 x i32> %32, %34
  %36 = and <8 x i32> %35, <i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745>
  %37 = lshr <8 x i32> %35, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
  %38 = and <8 x i32> %37, <i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745>
  %39 = add nuw nsw <8 x i32> %38, %36
  %40 = lshr <8 x i32> %35, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
  %41 = and <8 x i32> %40, <i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745, i32 2396745>
  %42 = add nuw nsw <8 x i32> %39, %41
  %43 = and <8 x i32> %42, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
  %44 = lshr <8 x i32> %42, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
  %45 = and <8 x i32> %44, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
  %46 = sub nsw <8 x i32> %43, %45
  %47 = trunc nsw <8 x i32> %46 to <8 x i16>
  %48 = shl nuw nsw i64 %index, 2
  %49 = lshr <8 x i32> %42, <i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6>
  %50 = and <8 x i32> %49, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
  %51 = lshr <8 x i32> %42, <i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9>
  %52 = and <8 x i32> %51, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
  %53 = sub nsw <8 x i32> %50, %52
  %54 = trunc nsw <8 x i32> %53 to <8 x i16>
  %55 = lshr <8 x i32> %42, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
  %56 = and <8 x i32> %55, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
  %57 = lshr <8 x i32> %42, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>
  %58 = and <8 x i32> %57, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
  %59 = sub nsw <8 x i32> %56, %58
  %60 = trunc nsw <8 x i32> %59 to <8 x i16>
  %61 = lshr <8 x i32> %42, <i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18>
  %62 = and <8 x i32> %61, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
  %63 = lshr <8 x i32> %42, <i32 21, i32 21, i32 21, i32 21, i32 21, i32 21, i32 21, i32 21>
  %64 = sub nsw <8 x i32> %62, %63
  %65 = trunc nsw <8 x i32> %64 to <8 x i16>
  %66 = or disjoint i64 %48, 3
  %gep = getelementptr i16, ptr %invariant.gep, i64 %66
  %67 = shufflevector <8 x i16> %47, <8 x i16> %54, <16 x i32> <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>
  %68 = shufflevector <8 x i16> %60, <8 x i16> %65, <16 x i32> <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>
  %interleaved.vec = shufflevector <16 x i16> %67, <16 x i16> %68, <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31>
  store <32 x i16> %interleaved.vec, ptr %gep, align 2, !tbaa !8
  %index.next = add nuw i64 %index, 8
  %69 = icmp eq i64 %index.next, 64
  br i1 %69, label %middle.block, label %vector.body, !llvm.loop !14

middle.block:                                     ; preds = %vector.body
  call void @gmssl_secure_clear(ptr noundef nonnull %6, i64 noundef 192) #3
  call void @llvm.lifetime.end.p0(i64 192, ptr nonnull %6) #3
  br label %vector.body75.preheader

vector.body75.preheader:                          ; preds = %middle.block63, %middle.block, %4
  br label %vector.body75

vector.body75:                                    ; preds = %vector.body75.preheader, %pred.store.continue108
  %index76 = phi i64 [ %index.next109, %pred.store.continue108 ], [ 0, %vector.body75.preheader ]
  %70 = or disjoint i64 %index76, 8
  %71 = getelementptr inbounds i16, ptr %0, i64 %index76
  %72 = getelementptr inbounds i8, ptr %71, i64 16
  %wide.load77 = load <8 x i16>, ptr %71, align 2, !tbaa !8
  %wide.load78 = load <8 x i16>, ptr %72, align 2, !tbaa !8
  %73 = icmp slt <8 x i16> %wide.load77, zeroinitializer
  %74 = icmp slt <8 x i16> %wide.load78, zeroinitializer
  %75 = extractelement <8 x i1> %73, i64 0
  br i1 %75, label %pred.store.if, label %pred.store.continue

pred.store.if:                                    ; preds = %vector.body75
  %76 = getelementptr inbounds i16, ptr %0, i64 %index76
  %77 = extractelement <8 x i16> %wide.load77, i64 0
  %78 = add nsw i16 %77, 3329
  store i16 %78, ptr %76, align 2, !tbaa !8
  br label %pred.store.continue

pred.store.continue:                              ; preds = %pred.store.if, %vector.body75
  %79 = extractelement <8 x i1> %73, i64 1
  br i1 %79, label %pred.store.if79, label %pred.store.continue80

pred.store.if79:                                  ; preds = %pred.store.continue
  %80 = or disjoint i64 %index76, 1
  %81 = getelementptr inbounds i16, ptr %0, i64 %80
  %82 = extractelement <8 x i16> %wide.load77, i64 1
  %83 = add nsw i16 %82, 3329
  store i16 %83, ptr %81, align 2, !tbaa !8
  br label %pred.store.continue80

pred.store.continue80:                            ; preds = %pred.store.if79, %pred.store.continue
  %84 = extractelement <8 x i1> %73, i64 2
  br i1 %84, label %pred.store.if81, label %pred.store.continue82

pred.store.if81:                                  ; preds = %pred.store.continue80
  %85 = or disjoint i64 %index76, 2
  %86 = getelementptr inbounds i16, ptr %0, i64 %85
  %87 = extractelement <8 x i16> %wide.load77, i64 2
  %88 = add nsw i16 %87, 3329
  store i16 %88, ptr %86, align 2, !tbaa !8
  br label %pred.store.continue82

pred.store.continue82:                            ; preds = %pred.store.if81, %pred.store.continue80
  %89 = extractelement <8 x i1> %73, i64 3
  br i1 %89, label %pred.store.if83, label %pred.store.continue84

pred.store.if83:                                  ; preds = %pred.store.continue82
  %90 = or disjoint i64 %index76, 3
  %91 = getelementptr inbounds i16, ptr %0, i64 %90
  %92 = extractelement <8 x i16> %wide.load77, i64 3
  %93 = add nsw i16 %92, 3329
  store i16 %93, ptr %91, align 2, !tbaa !8
  br label %pred.store.continue84

pred.store.continue84:                            ; preds = %pred.store.if83, %pred.store.continue82
  %94 = extractelement <8 x i1> %73, i64 4
  br i1 %94, label %pred.store.if85, label %pred.store.continue86

pred.store.if85:                                  ; preds = %pred.store.continue84
  %95 = or disjoint i64 %index76, 4
  %96 = getelementptr inbounds i16, ptr %0, i64 %95
  %97 = extractelement <8 x i16> %wide.load77, i64 4
  %98 = add nsw i16 %97, 3329
  store i16 %98, ptr %96, align 2, !tbaa !8
  br label %pred.store.continue86

pred.store.continue86:                            ; preds = %pred.store.if85, %pred.store.continue84
  %99 = extractelement <8 x i1> %73, i64 5
  br i1 %99, label %pred.store.if87, label %pred.store.continue88

pred.store.if87:                                  ; preds = %pred.store.continue86
  %100 = or disjoint i64 %index76, 5
  %101 = getelementptr inbounds i16, ptr %0, i64 %100
  %102 = extractelement <8 x i16> %wide.load77, i64 5
  %103 = add nsw i16 %102, 3329
  store i16 %103, ptr %101, align 2, !tbaa !8
  br label %pred.store.continue88

pred.store.continue88:                            ; preds = %pred.store.if87, %pred.store.continue86
  %104 = extractelement <8 x i1> %73, i64 6
  br i1 %104, label %pred.store.if89, label %pred.store.continue90

pred.store.if89:                                  ; preds = %pred.store.continue88
  %105 = or disjoint i64 %index76, 6
  %106 = getelementptr inbounds i16, ptr %0, i64 %105
  %107 = extractelement <8 x i16> %wide.load77, i64 6
  %108 = add nsw i16 %107, 3329
  store i16 %108, ptr %106, align 2, !tbaa !8
  br label %pred.store.continue90

pred.store.continue90:                            ; preds = %pred.store.if89, %pred.store.continue88
  %109 = extractelement <8 x i1> %73, i64 7
  br i1 %109, label %pred.store.if91, label %pred.store.continue92

pred.store.if91:                                  ; preds = %pred.store.continue90
  %110 = or disjoint i64 %index76, 7
  %111 = getelementptr inbounds i16, ptr %0, i64 %110
  %112 = extractelement <8 x i16> %wide.load77, i64 7
  %113 = add nsw i16 %112, 3329
  store i16 %113, ptr %111, align 2, !tbaa !8
  br label %pred.store.continue92

pred.store.continue92:                            ; preds = %pred.store.if91, %pred.store.continue90
  %114 = extractelement <8 x i1> %74, i64 0
  br i1 %114, label %pred.store.if93, label %pred.store.continue94

pred.store.if93:                                  ; preds = %pred.store.continue92
  %115 = getelementptr inbounds i16, ptr %0, i64 %70
  %116 = extractelement <8 x i16> %wide.load78, i64 0
  %117 = add nsw i16 %116, 3329
  store i16 %117, ptr %115, align 2, !tbaa !8
  br label %pred.store.continue94

pred.store.continue94:                            ; preds = %pred.store.if93, %pred.store.continue92
  %118 = extractelement <8 x i1> %74, i64 1
  br i1 %118, label %pred.store.if95, label %pred.store.continue96

pred.store.if95:                                  ; preds = %pred.store.continue94
  %119 = or disjoint i64 %index76, 9
  %120 = getelementptr inbounds i16, ptr %0, i64 %119
  %121 = extractelement <8 x i16> %wide.load78, i64 1
  %122 = add nsw i16 %121, 3329
  store i16 %122, ptr %120, align 2, !tbaa !8
  br label %pred.store.continue96

pred.store.continue96:                            ; preds = %pred.store.if95, %pred.store.continue94
  %123 = extractelement <8 x i1> %74, i64 2
  br i1 %123, label %pred.store.if97, label %pred.store.continue98

pred.store.if97:                                  ; preds = %pred.store.continue96
  %124 = or disjoint i64 %index76, 10
  %125 = getelementptr inbounds i16, ptr %0, i64 %124
  %126 = extractelement <8 x i16> %wide.load78, i64 2
  %127 = add nsw i16 %126, 3329
  store i16 %127, ptr %125, align 2, !tbaa !8
  br label %pred.store.continue98

pred.store.continue98:                            ; preds = %pred.store.if97, %pred.store.continue96
  %128 = extractelement <8 x i1> %74, i64 3
  br i1 %128, label %pred.store.if99, label %pred.store.continue100

pred.store.if99:                                  ; preds = %pred.store.continue98
  %129 = or disjoint i64 %index76, 11
  %130 = getelementptr inbounds i16, ptr %0, i64 %129
  %131 = extractelement <8 x i16> %wide.load78, i64 3
  %132 = add nsw i16 %131, 3329
  store i16 %132, ptr %130, align 2, !tbaa !8
  br label %pred.store.continue100

pred.store.continue100:                           ; preds = %pred.store.if99, %pred.store.continue98
  %133 = extractelement <8 x i1> %74, i64 4
  br i1 %133, label %pred.store.if101, label %pred.store.continue102

pred.store.if101:                                 ; preds = %pred.store.continue100
  %134 = or disjoint i64 %index76, 12
  %135 = getelementptr inbounds i16, ptr %0, i64 %134
  %136 = extractelement <8 x i16> %wide.load78, i64 4
  %137 = add nsw i16 %136, 3329
  store i16 %137, ptr %135, align 2, !tbaa !8
  br label %pred.store.continue102

pred.store.continue102:                           ; preds = %pred.store.if101, %pred.store.continue100
  %138 = extractelement <8 x i1> %74, i64 5
  br i1 %138, label %pred.store.if103, label %pred.store.continue104

pred.store.if103:                                 ; preds = %pred.store.continue102
  %139 = or disjoint i64 %index76, 13
  %140 = getelementptr inbounds i16, ptr %0, i64 %139
  %141 = extractelement <8 x i16> %wide.load78, i64 5
  %142 = add nsw i16 %141, 3329
  store i16 %142, ptr %140, align 2, !tbaa !8
  br label %pred.store.continue104

pred.store.continue104:                           ; preds = %pred.store.if103, %pred.store.continue102
  %143 = extractelement <8 x i1> %74, i64 6
  br i1 %143, label %pred.store.if105, label %pred.store.continue106

pred.store.if105:                                 ; preds = %pred.store.continue104
  %144 = or disjoint i64 %index76, 14
  %145 = getelementptr inbounds i16, ptr %0, i64 %144
  %146 = extractelement <8 x i16> %wide.load78, i64 6
  %147 = add nsw i16 %146, 3329
  store i16 %147, ptr %145, align 2, !tbaa !8
  br label %pred.store.continue106

pred.store.continue106:                           ; preds = %pred.store.if105, %pred.store.continue104
  %148 = extractelement <8 x i1> %74, i64 7
  br i1 %148, label %pred.store.if107, label %pred.store.continue108

pred.store.if107:                                 ; preds = %pred.store.continue106
  %149 = or disjoint i64 %index76, 15
  %150 = getelementptr inbounds i16, ptr %0, i64 %149
  %151 = extractelement <8 x i16> %wide.load78, i64 7
  %152 = add nsw i16 %151, 3329
  store i16 %152, ptr %150, align 2, !tbaa !8
  br label %pred.store.continue108

pred.store.continue108:                           ; preds = %pred.store.if107, %pred.store.continue106
  %index.next109 = add nuw i64 %index76, 16
  %153 = icmp eq i64 %index.next109, 256
  br i1 %153, label %middle.block71, label %vector.body75, !llvm.loop !15

middle.block71:                                   ; preds = %pred.store.continue108
  ret i32 1
}

; Function Attrs: nounwind uwtable
declare hidden i32 @kyber_prf(ptr noundef, i8 noundef zeroext, i64 noundef, ptr noundef) local_unnamed_addr #1

declare void @gmssl_secure_clear(ptr noundef, i64 noundef) local_unnamed_addr #2

attributes #0 = { mustprogress 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 = { "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 #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/C++ TBAA"}
!8 = !{!9, !9, i64 0}
!9 = !{!"short", !6, i64 0}
!10 = distinct !{!10, !11, !12, !13}
!11 = !{!"llvm.loop.mustprogress"}
!12 = !{!"llvm.loop.isvectorized", i32 1}
!13 = !{!"llvm.loop.unroll.runtime.disable"}
!14 = distinct !{!14, !11, !12, !13}
!15 = distinct !{!15, !11, !12, !13}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,VectorCombinePass