; LLVM IR from opencryptoki/libzpc :: src/zkey (pkey)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.aescipherkeytoken = type <{ i8, i8, i16, i8, [3 x i8], i8, i8, [16 x i8], i8, i8, i8, i8, i8, i8, i16, i8, i8, i8, i8, i16, i8, i8, i16, i8, i16, i16, i8, i16, i16, i16, [80 x i8] }>

; 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 zeroext i1 @is_cca_aes_cipher_key(ptr noundef %0, i64 noundef %1) #1 {
  %3 = alloca i1, align 1
  %4 = alloca ptr, align 8
  %5 = alloca i64, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i64 %1, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #2
  %8 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %8, ptr %6, align 8, !tbaa !5
  %9 = load ptr, ptr %4, align 8, !tbaa !5
  %10 = icmp eq ptr %9, null
  br i1 %10, label %14, label %11

11:                                               ; preds = %2
  %12 = load i64, ptr %5, align 8, !tbaa !9
  %13 = icmp ult i64 %12, 120
  br i1 %13, label %14, label %15

14:                                               ; preds = %11, %2
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

15:                                               ; preds = %11
  %16 = load ptr, ptr %6, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.aescipherkeytoken, ptr %16, i32 0, i32 0
  %18 = load i8, ptr %17, align 1, !tbaa !11
  %19 = zext i8 %18 to i32
  %20 = icmp ne i32 %19, 1
  br i1 %20, label %21, label %22

21:                                               ; preds = %15
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

22:                                               ; preds = %15
  %23 = load ptr, ptr %6, align 8, !tbaa !5
  %24 = getelementptr inbounds %struct.aescipherkeytoken, ptr %23, i32 0, i32 3
  %25 = load i8, ptr %24, align 1, !tbaa !14
  %26 = zext i8 %25 to i32
  %27 = icmp ne i32 %26, 5
  br i1 %27, label %28, label %29

28:                                               ; preds = %22
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

29:                                               ; preds = %22
  %30 = load ptr, ptr %6, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.aescipherkeytoken, ptr %30, i32 0, i32 2
  %32 = load i16, ptr %31, align 1, !tbaa !15
  %33 = zext i16 %32 to i64
  %34 = load i64, ptr %5, align 8, !tbaa !9
  %35 = icmp ugt i64 %33, %34
  br i1 %35, label %36, label %37

36:                                               ; preds = %29
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

37:                                               ; preds = %29
  %38 = load ptr, ptr %6, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.aescipherkeytoken, ptr %38, i32 0, i32 5
  %40 = load i8, ptr %39, align 1, !tbaa !16
  %41 = zext i8 %40 to i32
  %42 = icmp ne i32 %41, 3
  br i1 %42, label %43, label %44

43:                                               ; preds = %37
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

44:                                               ; preds = %37
  %45 = load ptr, ptr %6, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.aescipherkeytoken, ptr %45, i32 0, i32 8
  %47 = load i8, ptr %46, align 1, !tbaa !17
  %48 = zext i8 %47 to i32
  %49 = icmp ne i32 %48, 2
  br i1 %49, label %50, label %51

50:                                               ; preds = %44
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

51:                                               ; preds = %44
  %52 = load ptr, ptr %6, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.aescipherkeytoken, ptr %52, i32 0, i32 10
  %54 = load i8, ptr %53, align 1, !tbaa !18
  %55 = zext i8 %54 to i32
  %56 = icmp ne i32 %55, 0
  br i1 %56, label %57, label %64

57:                                               ; preds = %51
  %58 = load ptr, ptr %6, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.aescipherkeytoken, ptr %58, i32 0, i32 10
  %60 = load i8, ptr %59, align 1, !tbaa !18
  %61 = zext i8 %60 to i32
  %62 = icmp ne i32 %61, 1
  br i1 %62, label %63, label %64

63:                                               ; preds = %57
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

64:                                               ; preds = %57, %51
  %65 = load ptr, ptr %6, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.aescipherkeytoken, ptr %65, i32 0, i32 12
  %67 = load i8, ptr %66, align 1, !tbaa !19
  %68 = zext i8 %67 to i32
  %69 = icmp ne i32 %68, 1
  br i1 %69, label %70, label %71

70:                                               ; preds = %64
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

71:                                               ; preds = %64
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.aescipherkeytoken, ptr %72, i32 0, i32 21
  %74 = load i8, ptr %73, align 1, !tbaa !20
  %75 = zext i8 %74 to i32
  %76 = icmp ne i32 %75, 2
  br i1 %76, label %77, label %78

77:                                               ; preds = %71
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

78:                                               ; preds = %71
  %79 = load ptr, ptr %6, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.aescipherkeytoken, ptr %79, i32 0, i32 22
  %81 = load i16, ptr %80, align 1, !tbaa !21
  %82 = zext i16 %81 to i32
  %83 = icmp ne i32 %82, 1
  br i1 %83, label %84, label %85

84:                                               ; preds = %78
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

85:                                               ; preds = %78
  %86 = load ptr, ptr %6, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.aescipherkeytoken, ptr %86, i32 0, i32 14
  %88 = load i16, ptr %87, align 1, !tbaa !22
  %89 = zext i16 %88 to i32
  %90 = icmp ne i32 %89, 26
  br i1 %90, label %91, label %92

91:                                               ; preds = %85
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

92:                                               ; preds = %85
  %93 = load ptr, ptr %6, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.aescipherkeytoken, ptr %93, i32 0, i32 15
  %95 = load i8, ptr %94, align 1, !tbaa !23
  %96 = zext i8 %95 to i32
  %97 = icmp ne i32 %96, 0
  br i1 %97, label %98, label %99

98:                                               ; preds = %92
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

99:                                               ; preds = %92
  %100 = load ptr, ptr %6, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.aescipherkeytoken, ptr %100, i32 0, i32 16
  %102 = load i8, ptr %101, align 1, !tbaa !24
  %103 = zext i8 %102 to i32
  %104 = icmp ne i32 %103, 0
  br i1 %104, label %105, label %106

105:                                              ; preds = %99
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

106:                                              ; preds = %99
  %107 = load ptr, ptr %6, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.aescipherkeytoken, ptr %107, i32 0, i32 17
  %109 = load i8, ptr %108, align 1, !tbaa !25
  %110 = zext i8 %109 to i32
  %111 = icmp ne i32 %110, 0
  br i1 %111, label %112, label %113

112:                                              ; preds = %106
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

113:                                              ; preds = %106
  %114 = load ptr, ptr %6, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.aescipherkeytoken, ptr %114, i32 0, i32 23
  %116 = load i8, ptr %115, align 1, !tbaa !26
  %117 = zext i8 %116 to i32
  %118 = icmp ne i32 %117, 2
  br i1 %118, label %119, label %120

119:                                              ; preds = %113
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

120:                                              ; preds = %113
  %121 = load ptr, ptr %6, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.aescipherkeytoken, ptr %121, i32 0, i32 26
  %123 = load i8, ptr %122, align 1, !tbaa !27
  %124 = zext i8 %123 to i32
  %125 = icmp ne i32 %124, 3
  br i1 %125, label %126, label %127

126:                                              ; preds = %120
  store i1 false, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

127:                                              ; preds = %120
  store i1 true, ptr %3, align 1
  store i32 1, ptr %7, align 4
  br label %128

128:                                              ; preds = %127, %126, %119, %112, %105, %98, %91, %84, %77, %70, %63, %50, %43, %36, %28, %21, %14
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #2
  %129 = load i1, ptr %3, align 1
  ret i1 %129
}

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 = !{!12, !7, i64 0}
!12 = !{!"aescipherkeytoken", !7, i64 0, !7, i64 1, !13, i64 2, !7, i64 4, !7, i64 5, !7, i64 8, !7, i64 9, !7, i64 10, !7, i64 26, !7, i64 27, !7, i64 28, !7, i64 29, !7, i64 30, !7, i64 31, !13, i64 32, !7, i64 34, !7, i64 35, !7, i64 36, !7, i64 37, !13, i64 38, !7, i64 40, !7, i64 41, !13, i64 42, !7, i64 44, !13, i64 45, !13, i64 47, !7, i64 49, !13, i64 50, !13, i64 52, !13, i64 54, !7, i64 56}
!13 = !{!"short", !7, i64 0}
!14 = !{!12, !7, i64 4}
!15 = !{!12, !13, i64 2}
!16 = !{!12, !7, i64 8}
!17 = !{!12, !7, i64 26}
!18 = !{!12, !7, i64 28}
!19 = !{!12, !7, i64 30}
!20 = !{!12, !7, i64 41}
!21 = !{!12, !13, i64 42}
!22 = !{!12, !13, i64 32}
!23 = !{!12, !7, i64 34}
!24 = !{!12, !7, i64 35}
!25 = !{!12, !7, i64 36}
!26 = !{!12, !7, i64 44}
!27 = !{!12, !7, i64 49}


; 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 nofree norecurse nosync nounwind willreturn memory(argmem: read) uwtable
define dso_local zeroext i1 @is_cca_aes_cipher_key(ptr noundef readonly %0, i64 noundef %1) local_unnamed_addr #0 {
  %3 = icmp eq ptr %0, null
  %4 = icmp ult i64 %1, 120
  %or.cond = or i1 %3, %4
  br i1 %or.cond, label %51, label %5

5:                                                ; preds = %2
  %6 = load i8, ptr %0, align 1, !tbaa !5
  %.not = icmp eq i8 %6, 1
  br i1 %.not, label %7, label %51

7:                                                ; preds = %5
  %8 = getelementptr inbounds i8, ptr %0, i64 4
  %9 = load i8, ptr %8, align 1, !tbaa !10
  %.not24 = icmp eq i8 %9, 5
  br i1 %.not24, label %10, label %51

10:                                               ; preds = %7
  %11 = getelementptr inbounds i8, ptr %0, i64 2
  %12 = load i16, ptr %11, align 1, !tbaa !11
  %13 = zext i16 %12 to i64
  %14 = icmp ugt i64 %13, %1
  br i1 %14, label %51, label %15

15:                                               ; preds = %10
  %16 = getelementptr inbounds i8, ptr %0, i64 8
  %17 = load i8, ptr %16, align 1, !tbaa !12
  %.not25 = icmp eq i8 %17, 3
  br i1 %.not25, label %18, label %51

18:                                               ; preds = %15
  %19 = getelementptr inbounds i8, ptr %0, i64 26
  %20 = load i8, ptr %19, align 1, !tbaa !13
  %.not26 = icmp eq i8 %20, 2
  br i1 %.not26, label %21, label %51

21:                                               ; preds = %18
  %22 = getelementptr inbounds i8, ptr %0, i64 28
  %23 = load i8, ptr %22, align 1, !tbaa !14
  %switch = icmp ult i8 %23, 2
  br i1 %switch, label %24, label %51

24:                                               ; preds = %21
  %25 = getelementptr inbounds i8, ptr %0, i64 30
  %26 = load i8, ptr %25, align 1, !tbaa !15
  %.not29 = icmp eq i8 %26, 1
  br i1 %.not29, label %27, label %51

27:                                               ; preds = %24
  %28 = getelementptr inbounds i8, ptr %0, i64 41
  %29 = load i8, ptr %28, align 1, !tbaa !16
  %.not30 = icmp eq i8 %29, 2
  br i1 %.not30, label %30, label %51

30:                                               ; preds = %27
  %31 = getelementptr inbounds i8, ptr %0, i64 42
  %32 = load i16, ptr %31, align 1, !tbaa !17
  %.not31 = icmp eq i16 %32, 1
  br i1 %.not31, label %33, label %51

33:                                               ; preds = %30
  %34 = getelementptr inbounds i8, ptr %0, i64 32
  %35 = load i16, ptr %34, align 1, !tbaa !18
  %.not32 = icmp eq i16 %35, 26
  br i1 %.not32, label %36, label %51

36:                                               ; preds = %33
  %37 = getelementptr inbounds i8, ptr %0, i64 34
  %38 = load i8, ptr %37, align 1, !tbaa !19
  %.not33 = icmp eq i8 %38, 0
  br i1 %.not33, label %39, label %51

39:                                               ; preds = %36
  %40 = getelementptr inbounds i8, ptr %0, i64 35
  %41 = load i8, ptr %40, align 1, !tbaa !20
  %.not34 = icmp eq i8 %41, 0
  br i1 %.not34, label %42, label %51

42:                                               ; preds = %39
  %43 = getelementptr inbounds i8, ptr %0, i64 36
  %44 = load i8, ptr %43, align 1, !tbaa !21
  %.not35 = icmp eq i8 %44, 0
  br i1 %.not35, label %45, label %51

45:                                               ; preds = %42
  %46 = getelementptr inbounds i8, ptr %0, i64 44
  %47 = load i8, ptr %46, align 1, !tbaa !22
  %.not36 = icmp eq i8 %47, 2
  br i1 %.not36, label %48, label %51

48:                                               ; preds = %45
  %49 = getelementptr inbounds i8, ptr %0, i64 49
  %50 = load i8, ptr %49, align 1, !tbaa !23
  %.not37 = icmp eq i8 %50, 3
  br label %51

51:                                               ; preds = %21, %48, %45, %42, %39, %36, %33, %30, %27, %24, %18, %15, %10, %7, %5, %2
  %.0 = phi i1 [ false, %2 ], [ false, %5 ], [ false, %7 ], [ false, %10 ], [ false, %15 ], [ false, %18 ], [ false, %21 ], [ false, %24 ], [ false, %27 ], [ false, %30 ], [ false, %33 ], [ false, %36 ], [ false, %39 ], [ false, %42 ], [ false, %45 ], [ %.not37, %48 ]
  ret i1 %.0
}

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) 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, !7, i64 0}
!6 = !{!"aescipherkeytoken", !7, i64 0, !7, i64 1, !9, i64 2, !7, i64 4, !7, i64 5, !7, i64 8, !7, i64 9, !7, i64 10, !7, i64 26, !7, i64 27, !7, i64 28, !7, i64 29, !7, i64 30, !7, i64 31, !9, i64 32, !7, i64 34, !7, i64 35, !7, i64 36, !7, i64 37, !9, i64 38, !7, i64 40, !7, i64 41, !9, i64 42, !7, i64 44, !9, i64 45, !9, i64 47, !7, i64 49, !9, i64 50, !9, i64 52, !9, i64 54, !7, i64 56}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"short", !7, i64 0}
!10 = !{!6, !7, i64 4}
!11 = !{!6, !9, i64 2}
!12 = !{!6, !7, i64 8}
!13 = !{!6, !7, i64 26}
!14 = !{!6, !7, i64 28}
!15 = !{!6, !7, i64 30}
!16 = !{!6, !7, i64 41}
!17 = !{!6, !9, i64 42}
!18 = !{!6, !9, i64 32}
!19 = !{!6, !7, i64 34}
!20 = !{!6, !7, i64 35}
!21 = !{!6, !7, i64 36}
!22 = !{!6, !7, i64 44}
!23 = !{!6, !7, i64 49}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass