; LLVM IR from tleonhardt/practical_cryptography_engineering :: mbedtls (ecdsa)

; 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.mbedtls_ecp_point = type { %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi }
%struct.mbedtls_mpi = type { i32, i64, ptr }
%struct.mbedtls_ecp_group = type { i32, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_ecp_point, %struct.mbedtls_mpi, i64, i64, i32, ptr, ptr, ptr, ptr, ptr, i64 }

; Function Attrs: nounwind uwtable
define dso_local i32 @mbedtls_ecdsa_sign(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, i64 noundef %5, ptr noundef %6, ptr noundef %7) #0 {
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca %struct.mbedtls_ecp_point, align 8
  %23 = alloca %struct.mbedtls_mpi, align 8
  %24 = alloca %struct.mbedtls_mpi, align 8
  %25 = alloca %struct.mbedtls_mpi, align 8
  %26 = alloca i32, align 4
  %27 = alloca i64, align 8
  store ptr %0, ptr %10, align 8, !tbaa !5
  store ptr %1, ptr %11, align 8, !tbaa !5
  store ptr %2, ptr %12, align 8, !tbaa !5
  store ptr %3, ptr %13, align 8, !tbaa !5
  store ptr %4, ptr %14, align 8, !tbaa !5
  store i64 %5, ptr %15, align 8, !tbaa !9
  store ptr %6, ptr %16, align 8, !tbaa !5
  store ptr %7, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #3
  call void @llvm.lifetime.start.p0(i64 72, ptr %22) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr %23) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr %24) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr %25) #3
  %28 = load ptr, ptr %10, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.mbedtls_ecp_group, ptr %28, i32 0, i32 5
  %30 = getelementptr inbounds %struct.mbedtls_mpi, ptr %29, i32 0, i32 2
  %31 = load ptr, ptr %30, align 8, !tbaa !11
  %32 = icmp eq ptr %31, null
  br i1 %32, label %33, label %34

33:                                               ; preds = %8
  store i32 -20352, ptr %9, align 4
  store i32 1, ptr %26, align 4
  br label %200

34:                                               ; preds = %8
  call void @mbedtls_ecp_point_init(ptr noundef %22)
  call void @mbedtls_mpi_init(ptr noundef %23)
  call void @mbedtls_mpi_init(ptr noundef %24)
  call void @mbedtls_mpi_init(ptr noundef %25)
  store i32 0, ptr %20, align 4, !tbaa !16
  br label %35

35:                                               ; preds = %193, %34
  store i32 0, ptr %19, align 4, !tbaa !16
  br label %36

36:                                               ; preds = %63, %35
  br label %37

37:                                               ; preds = %36
  %38 = load ptr, ptr %10, align 8, !tbaa !5
  %39 = load ptr, ptr %16, align 8, !tbaa !5
  %40 = load ptr, ptr %17, align 8, !tbaa !5
  %41 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %38, ptr noundef %23, ptr noundef %22, ptr noundef %39, ptr noundef %40)
  store i32 %41, ptr %18, align 4, !tbaa !16
  %42 = icmp ne i32 %41, 0
  br i1 %42, label %43, label %44

43:                                               ; preds = %37
  br label %198

44:                                               ; preds = %37
  br label %45

45:                                               ; preds = %44
  br label %46

46:                                               ; preds = %45
  br label %47

47:                                               ; preds = %46
  %48 = load ptr, ptr %11, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.mbedtls_ecp_point, ptr %22, i32 0, i32 0
  %50 = load ptr, ptr %10, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.mbedtls_ecp_group, ptr %50, i32 0, i32 5
  %52 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %48, ptr noundef %49, ptr noundef %51)
  store i32 %52, ptr %18, align 4, !tbaa !16
  %53 = icmp ne i32 %52, 0
  br i1 %53, label %54, label %55

54:                                               ; preds = %47
  br label %198

55:                                               ; preds = %47
  br label %56

56:                                               ; preds = %55
  br label %57

57:                                               ; preds = %56
  %58 = load i32, ptr %19, align 4, !tbaa !16
  %59 = add nsw i32 %58, 1
  store i32 %59, ptr %19, align 4, !tbaa !16
  %60 = icmp sgt i32 %58, 10
  br i1 %60, label %61, label %62

61:                                               ; preds = %57
  store i32 -19712, ptr %18, align 4, !tbaa !16
  br label %198

62:                                               ; preds = %57
  br label %63

63:                                               ; preds = %62
  %64 = load ptr, ptr %11, align 8, !tbaa !5
  %65 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %64, i64 noundef 0)
  %66 = icmp eq i32 %65, 0
  br i1 %66, label %36, label %67, !llvm.loop !17

67:                                               ; preds = %63
  br label %68

68:                                               ; preds = %67
  %69 = load ptr, ptr %10, align 8, !tbaa !5
  %70 = load ptr, ptr %14, align 8, !tbaa !5
  %71 = load i64, ptr %15, align 8, !tbaa !9
  %72 = call i32 @derive_mpi(ptr noundef %69, ptr noundef %24, ptr noundef %70, i64 noundef %71)
  store i32 %72, ptr %18, align 4, !tbaa !16
  %73 = icmp ne i32 %72, 0
  br i1 %73, label %74, label %75

74:                                               ; preds = %68
  br label %198

75:                                               ; preds = %68
  br label %76

76:                                               ; preds = %75
  br label %77

77:                                               ; preds = %76
  store i32 0, ptr %21, align 4, !tbaa !16
  br label %78

78:                                               ; preds = %123, %77
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #3
  %79 = load ptr, ptr %10, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.mbedtls_ecp_group, ptr %79, i32 0, i32 7
  %81 = load i64, ptr %80, align 8, !tbaa !19
  %82 = add i64 %81, 7
  %83 = udiv i64 %82, 8
  store i64 %83, ptr %27, align 8, !tbaa !9
  br label %84

84:                                               ; preds = %78
  %85 = load i64, ptr %27, align 8, !tbaa !9
  %86 = load ptr, ptr %16, align 8, !tbaa !5
  %87 = load ptr, ptr %17, align 8, !tbaa !5
  %88 = call i32 @mbedtls_mpi_fill_random(ptr noundef %25, i64 noundef %85, ptr noundef %86, ptr noundef %87)
  store i32 %88, ptr %18, align 4, !tbaa !16
  %89 = icmp ne i32 %88, 0
  br i1 %89, label %90, label %91

90:                                               ; preds = %84
  store i32 8, ptr %26, align 4
  br label %112

91:                                               ; preds = %84
  br label %92

92:                                               ; preds = %91
  br label %93

93:                                               ; preds = %92
  br label %94

94:                                               ; preds = %93
  %95 = load i64, ptr %27, align 8, !tbaa !9
  %96 = mul i64 8, %95
  %97 = load ptr, ptr %10, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.mbedtls_ecp_group, ptr %97, i32 0, i32 7
  %99 = load i64, ptr %98, align 8, !tbaa !19
  %100 = sub i64 %96, %99
  %101 = call i32 @mbedtls_mpi_shift_r(ptr noundef %25, i64 noundef %100)
  store i32 %101, ptr %18, align 4, !tbaa !16
  %102 = icmp ne i32 %101, 0
  br i1 %102, label %103, label %104

103:                                              ; preds = %94
  store i32 8, ptr %26, align 4
  br label %112

104:                                              ; preds = %94
  br label %105

105:                                              ; preds = %104
  br label %106

106:                                              ; preds = %105
  %107 = load i32, ptr %21, align 4, !tbaa !16
  %108 = add nsw i32 %107, 1
  store i32 %108, ptr %21, align 4, !tbaa !16
  %109 = icmp sgt i32 %108, 30
  br i1 %109, label %110, label %111

110:                                              ; preds = %106
  store i32 -19712, ptr %9, align 4
  store i32 1, ptr %26, align 4
  br label %112

111:                                              ; preds = %106
  store i32 0, ptr %26, align 4
  br label %112

112:                                              ; preds = %111, %110, %103, %90
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #3
  %113 = load i32, ptr %26, align 4
  switch i32 %113, label %200 [
    i32 0, label %114
    i32 8, label %198
  ]

114:                                              ; preds = %112
  br label %115

115:                                              ; preds = %114
  %116 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %25, i64 noundef 1)
  %117 = icmp slt i32 %116, 0
  br i1 %117, label %123, label %118

118:                                              ; preds = %115
  %119 = load ptr, ptr %10, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.mbedtls_ecp_group, ptr %119, i32 0, i32 5
  %121 = call i32 @mbedtls_mpi_cmp_mpi(ptr noundef %25, ptr noundef %120)
  %122 = icmp sge i32 %121, 0
  br label %123

123:                                              ; preds = %118, %115
  %124 = phi i1 [ true, %115 ], [ %122, %118 ]
  br i1 %124, label %78, label %125, !llvm.loop !20

125:                                              ; preds = %123
  br label %126

126:                                              ; preds = %125
  %127 = load ptr, ptr %12, align 8, !tbaa !5
  %128 = load ptr, ptr %11, align 8, !tbaa !5
  %129 = load ptr, ptr %13, align 8, !tbaa !5
  %130 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %127, ptr noundef %128, ptr noundef %129)
  store i32 %130, ptr %18, align 4, !tbaa !16
  %131 = icmp ne i32 %130, 0
  br i1 %131, label %132, label %133

132:                                              ; preds = %126
  br label %198

133:                                              ; preds = %126
  br label %134

134:                                              ; preds = %133
  br label %135

135:                                              ; preds = %134
  br label %136

136:                                              ; preds = %135
  %137 = load ptr, ptr %12, align 8, !tbaa !5
  %138 = call i32 @mbedtls_mpi_add_mpi(ptr noundef %24, ptr noundef %24, ptr noundef %137)
  store i32 %138, ptr %18, align 4, !tbaa !16
  %139 = icmp ne i32 %138, 0
  br i1 %139, label %140, label %141

140:                                              ; preds = %136
  br label %198

141:                                              ; preds = %136
  br label %142

142:                                              ; preds = %141
  br label %143

143:                                              ; preds = %142
  br label %144

144:                                              ; preds = %143
  %145 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %24, ptr noundef %24, ptr noundef %25)
  store i32 %145, ptr %18, align 4, !tbaa !16
  %146 = icmp ne i32 %145, 0
  br i1 %146, label %147, label %148

147:                                              ; preds = %144
  br label %198

148:                                              ; preds = %144
  br label %149

149:                                              ; preds = %148
  br label %150

150:                                              ; preds = %149
  br label %151

151:                                              ; preds = %150
  %152 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %23, ptr noundef %23, ptr noundef %25)
  store i32 %152, ptr %18, align 4, !tbaa !16
  %153 = icmp ne i32 %152, 0
  br i1 %153, label %154, label %155

154:                                              ; preds = %151
  br label %198

155:                                              ; preds = %151
  br label %156

156:                                              ; preds = %155
  br label %157

157:                                              ; preds = %156
  br label %158

158:                                              ; preds = %157
  %159 = load ptr, ptr %12, align 8, !tbaa !5
  %160 = load ptr, ptr %10, align 8, !tbaa !5
  %161 = getelementptr inbounds %struct.mbedtls_ecp_group, ptr %160, i32 0, i32 5
  %162 = call i32 @mbedtls_mpi_inv_mod(ptr noundef %159, ptr noundef %23, ptr noundef %161)
  store i32 %162, ptr %18, align 4, !tbaa !16
  %163 = icmp ne i32 %162, 0
  br i1 %163, label %164, label %165

164:                                              ; preds = %158
  br label %198

165:                                              ; preds = %158
  br label %166

166:                                              ; preds = %165
  br label %167

167:                                              ; preds = %166
  br label %168

168:                                              ; preds = %167
  %169 = load ptr, ptr %12, align 8, !tbaa !5
  %170 = load ptr, ptr %12, align 8, !tbaa !5
  %171 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %169, ptr noundef %170, ptr noundef %24)
  store i32 %171, ptr %18, align 4, !tbaa !16
  %172 = icmp ne i32 %171, 0
  br i1 %172, label %173, label %174

173:                                              ; preds = %168
  br label %198

174:                                              ; preds = %168
  br label %175

175:                                              ; preds = %174
  br label %176

176:                                              ; preds = %175
  br label %177

177:                                              ; preds = %176
  %178 = load ptr, ptr %12, align 8, !tbaa !5
  %179 = load ptr, ptr %12, align 8, !tbaa !5
  %180 = load ptr, ptr %10, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.mbedtls_ecp_group, ptr %180, i32 0, i32 5
  %182 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %178, ptr noundef %179, ptr noundef %181)
  store i32 %182, ptr %18, align 4, !tbaa !16
  %183 = icmp ne i32 %182, 0
  br i1 %183, label %184, label %185

184:                                              ; preds = %177
  br label %198

185:                                              ; preds = %177
  br label %186

186:                                              ; preds = %185
  br label %187

187:                                              ; preds = %186
  %188 = load i32, ptr %20, align 4, !tbaa !16
  %189 = add nsw i32 %188, 1
  store i32 %189, ptr %20, align 4, !tbaa !16
  %190 = icmp sgt i32 %188, 10
  br i1 %190, label %191, label %192

191:                                              ; preds = %187
  store i32 -19712, ptr %18, align 4, !tbaa !16
  br label %198

192:                                              ; preds = %187
  br label %193

193:                                              ; preds = %192
  %194 = load ptr, ptr %12, align 8, !tbaa !5
  %195 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %194, i64 noundef 0)
  %196 = icmp eq i32 %195, 0
  br i1 %196, label %35, label %197, !llvm.loop !21

197:                                              ; preds = %193
  br label %198

198:                                              ; preds = %197, %191, %184, %173, %164, %154, %147, %140, %132, %112, %74, %61, %54, %43
  call void @mbedtls_ecp_point_free(ptr noundef %22)
  call void @mbedtls_mpi_free(ptr noundef %23)
  call void @mbedtls_mpi_free(ptr noundef %24)
  call void @mbedtls_mpi_free(ptr noundef %25)
  %199 = load i32, ptr %18, align 4, !tbaa !16
  store i32 %199, ptr %9, align 4
  store i32 1, ptr %26, align 4
  br label %200

200:                                              ; preds = %198, %112, %33
  call void @llvm.lifetime.end.p0(i64 24, ptr %25) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 72, ptr %22) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #3
  %201 = load i32, ptr %9, align 4
  ret i32 %201
}

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

declare void @mbedtls_ecp_point_init(ptr noundef) #2

declare void @mbedtls_mpi_init(ptr noundef) #2

declare i32 @mbedtls_ecp_gen_keypair(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @mbedtls_mpi_mod_mpi(ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @mbedtls_mpi_cmp_int(ptr noundef, i64 noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @derive_mpi(ptr noundef, ptr noundef, ptr noundef, i64 noundef) #0

declare i32 @mbedtls_mpi_fill_random(ptr noundef, i64 noundef, ptr noundef, ptr noundef) #2

declare i32 @mbedtls_mpi_shift_r(ptr noundef, i64 noundef) #2

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

declare i32 @mbedtls_mpi_cmp_mpi(ptr noundef, ptr noundef) #2

declare i32 @mbedtls_mpi_mul_mpi(ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @mbedtls_mpi_add_mpi(ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @mbedtls_mpi_inv_mod(ptr noundef, ptr noundef, ptr noundef) #2

declare void @mbedtls_ecp_point_free(ptr noundef) #2

declare void @mbedtls_mpi_free(ptr noundef) #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "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 = !{!"long", !7, i64 0}
!11 = !{!12, !6, i64 168}
!12 = !{!"", !13, i64 0, !14, i64 8, !14, i64 32, !14, i64 56, !15, i64 80, !14, i64 152, !10, i64 176, !10, i64 184, !13, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !6, i64 224, !6, i64 232, !10, i64 240}
!13 = !{!"int", !7, i64 0}
!14 = !{!"", !13, i64 0, !10, i64 8, !6, i64 16}
!15 = !{!"", !14, i64 0, !14, i64 24, !14, i64 48}
!16 = !{!13, !13, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!12, !10, i64 184}
!20 = distinct !{!20, !18}
!21 = distinct !{!21, !18}


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

%struct.mbedtls_ecp_point = type { %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi }
%struct.mbedtls_mpi = type { i32, i64, ptr }

; Function Attrs: nounwind uwtable
define dso_local i32 @mbedtls_ecdsa_sign(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, i64 noundef %5, ptr noundef %6, ptr noundef %7) local_unnamed_addr #0 {
  %9 = alloca %struct.mbedtls_ecp_point, align 8
  %10 = alloca %struct.mbedtls_mpi, align 8
  %11 = alloca %struct.mbedtls_mpi, align 8
  %12 = alloca %struct.mbedtls_mpi, align 8
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %9) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %10) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %11) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %12) #3
  %13 = getelementptr inbounds i8, ptr %0, i64 152
  %14 = getelementptr inbounds i8, ptr %0, i64 168
  %15 = load ptr, ptr %14, align 8, !tbaa !5
  %16 = icmp eq ptr %15, null
  br i1 %16, label %.thread71, label %17

17:                                               ; preds = %8
  call void @mbedtls_ecp_point_init(ptr noundef nonnull %9) #3
  call void @mbedtls_mpi_init(ptr noundef nonnull %10) #3
  call void @mbedtls_mpi_init(ptr noundef nonnull %11) #3
  call void @mbedtls_mpi_init(ptr noundef nonnull %12) #3
  %18 = getelementptr inbounds i8, ptr %0, i64 184
  br label %19

19:                                               ; preds = %138, %17
  %.037 = phi i32 [ 0, %17 ], [ %139, %138 ]
  %20 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef nonnull %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not = icmp eq i32 %20, 0
  br i1 %.not, label %21, label %.thread

21:                                               ; preds = %19
  %22 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57 = icmp eq i32 %22, 0
  br i1 %.not57, label %23, label %.thread

23:                                               ; preds = %21
  %24 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %25 = icmp eq i32 %24, 0
  br i1 %25, label %26, label %100, !llvm.loop !14

26:                                               ; preds = %23
  %27 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.1 = icmp eq i32 %27, 0
  br i1 %.not.1, label %28, label %.thread

28:                                               ; preds = %26
  %29 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.1 = icmp eq i32 %29, 0
  br i1 %.not57.1, label %30, label %.thread

30:                                               ; preds = %28
  %31 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %32 = icmp eq i32 %31, 0
  br i1 %32, label %33, label %100, !llvm.loop !14

33:                                               ; preds = %30
  %34 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.2 = icmp eq i32 %34, 0
  br i1 %.not.2, label %35, label %.thread

35:                                               ; preds = %33
  %36 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.2 = icmp eq i32 %36, 0
  br i1 %.not57.2, label %37, label %.thread

37:                                               ; preds = %35
  %38 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %39 = icmp eq i32 %38, 0
  br i1 %39, label %40, label %100, !llvm.loop !14

40:                                               ; preds = %37
  %41 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.3 = icmp eq i32 %41, 0
  br i1 %.not.3, label %42, label %.thread

42:                                               ; preds = %40
  %43 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.3 = icmp eq i32 %43, 0
  br i1 %.not57.3, label %44, label %.thread

44:                                               ; preds = %42
  %45 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %46 = icmp eq i32 %45, 0
  br i1 %46, label %47, label %100, !llvm.loop !14

47:                                               ; preds = %44
  %48 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.4 = icmp eq i32 %48, 0
  br i1 %.not.4, label %49, label %.thread

49:                                               ; preds = %47
  %50 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.4 = icmp eq i32 %50, 0
  br i1 %.not57.4, label %51, label %.thread

51:                                               ; preds = %49
  %52 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %53 = icmp eq i32 %52, 0
  br i1 %53, label %54, label %100, !llvm.loop !14

54:                                               ; preds = %51
  %55 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.5 = icmp eq i32 %55, 0
  br i1 %.not.5, label %56, label %.thread

56:                                               ; preds = %54
  %57 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.5 = icmp eq i32 %57, 0
  br i1 %.not57.5, label %58, label %.thread

58:                                               ; preds = %56
  %59 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %60 = icmp eq i32 %59, 0
  br i1 %60, label %61, label %100, !llvm.loop !14

61:                                               ; preds = %58
  %62 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.6 = icmp eq i32 %62, 0
  br i1 %.not.6, label %63, label %.thread

63:                                               ; preds = %61
  %64 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.6 = icmp eq i32 %64, 0
  br i1 %.not57.6, label %65, label %.thread

65:                                               ; preds = %63
  %66 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %67 = icmp eq i32 %66, 0
  br i1 %67, label %68, label %100, !llvm.loop !14

68:                                               ; preds = %65
  %69 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.7 = icmp eq i32 %69, 0
  br i1 %.not.7, label %70, label %.thread

70:                                               ; preds = %68
  %71 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.7 = icmp eq i32 %71, 0
  br i1 %.not57.7, label %72, label %.thread

72:                                               ; preds = %70
  %73 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %74 = icmp eq i32 %73, 0
  br i1 %74, label %75, label %100, !llvm.loop !14

75:                                               ; preds = %72
  %76 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.8 = icmp eq i32 %76, 0
  br i1 %.not.8, label %77, label %.thread

77:                                               ; preds = %75
  %78 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.8 = icmp eq i32 %78, 0
  br i1 %.not57.8, label %79, label %.thread

79:                                               ; preds = %77
  %80 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %81 = icmp eq i32 %80, 0
  br i1 %81, label %82, label %100, !llvm.loop !14

82:                                               ; preds = %79
  %83 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.9 = icmp eq i32 %83, 0
  br i1 %.not.9, label %84, label %.thread

84:                                               ; preds = %82
  %85 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.9 = icmp eq i32 %85, 0
  br i1 %.not57.9, label %86, label %.thread

86:                                               ; preds = %84
  %87 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %88 = icmp eq i32 %87, 0
  br i1 %88, label %89, label %100, !llvm.loop !14

89:                                               ; preds = %86
  %90 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.10 = icmp eq i32 %90, 0
  br i1 %.not.10, label %91, label %.thread

91:                                               ; preds = %89
  %92 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.10 = icmp eq i32 %92, 0
  br i1 %.not57.10, label %93, label %.thread

93:                                               ; preds = %91
  %94 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %1, i64 noundef 0) #3
  %95 = icmp eq i32 %94, 0
  br i1 %95, label %96, label %100, !llvm.loop !14

96:                                               ; preds = %93
  %97 = call i32 @mbedtls_ecp_gen_keypair(ptr noundef %0, ptr noundef nonnull %10, ptr noundef nonnull %9, ptr noundef %6, ptr noundef %7) #3
  %.not.11 = icmp eq i32 %97, 0
  br i1 %.not.11, label %98, label %.thread

98:                                               ; preds = %96
  %99 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %1, ptr noundef nonnull %9, ptr noundef nonnull %13) #3
  %.not57.11 = icmp eq i32 %99, 0
  %spec.select = select i1 %.not57.11, i32 -19712, i32 %99
  br label %.thread

100:                                              ; preds = %93, %86, %79, %72, %65, %58, %51, %44, %37, %30, %23
  %101 = call i32 @derive_mpi(ptr noundef %0, ptr noundef nonnull %11, ptr noundef %4, i64 noundef %5)
  %.not58 = icmp eq i32 %101, 0
  br i1 %.not58, label %.critedge.preheader, label %.thread

.critedge.preheader:                              ; preds = %100
  %102 = load i64, ptr %18, align 8, !tbaa !16
  %103 = add i64 %102, 7
  %104 = lshr i64 %103, 3
  %105 = call i32 @mbedtls_mpi_fill_random(ptr noundef nonnull %12, i64 noundef %104, ptr noundef %6, ptr noundef %7) #3
  %.not5979 = icmp eq i32 %105, 0
  br i1 %.not5979, label %.lr.ph, label %.thread

.lr.ph:                                           ; preds = %.critedge.preheader, %.critedge.backedge
  %106 = phi i64 [ %120, %.critedge.backedge ], [ %103, %.critedge.preheader ]
  %.03580 = phi i32 [ %112, %.critedge.backedge ], [ 0, %.critedge.preheader ]
  %107 = and i64 %106, -8
  %108 = load i64, ptr %18, align 8, !tbaa !16
  %109 = sub i64 %107, %108
  %110 = call i32 @mbedtls_mpi_shift_r(ptr noundef nonnull %12, i64 noundef %109) #3
  %.not60 = icmp eq i32 %110, 0
  br i1 %.not60, label %111, label %.thread

111:                                              ; preds = %.lr.ph
  %112 = add nuw nsw i32 %.03580, 1
  %exitcond = icmp eq i32 %.03580, 30
  br i1 %exitcond, label %.thread71, label %113

113:                                              ; preds = %111
  %114 = call i32 @mbedtls_mpi_cmp_int(ptr noundef nonnull %12, i64 noundef 1) #3
  %115 = icmp slt i32 %114, 0
  br i1 %115, label %.critedge.backedge, label %116

116:                                              ; preds = %113
  %117 = call i32 @mbedtls_mpi_cmp_mpi(ptr noundef nonnull %12, ptr noundef nonnull %13) #3
  %118 = icmp sgt i32 %117, -1
  br i1 %118, label %.critedge.backedge, label %123

.critedge.backedge:                               ; preds = %116, %113
  %119 = load i64, ptr %18, align 8, !tbaa !16
  %120 = add i64 %119, 7
  %121 = lshr i64 %120, 3
  %122 = call i32 @mbedtls_mpi_fill_random(ptr noundef nonnull %12, i64 noundef %121, ptr noundef %6, ptr noundef %7) #3
  %.not59 = icmp eq i32 %122, 0
  br i1 %.not59, label %.lr.ph, label %.thread, !llvm.loop !17

123:                                              ; preds = %116
  %124 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %2, ptr noundef %1, ptr noundef %3) #3
  %.not61 = icmp eq i32 %124, 0
  br i1 %.not61, label %125, label %.thread

125:                                              ; preds = %123
  %126 = call i32 @mbedtls_mpi_add_mpi(ptr noundef nonnull %11, ptr noundef nonnull %11, ptr noundef %2) #3
  %.not62 = icmp eq i32 %126, 0
  br i1 %.not62, label %127, label %.thread

127:                                              ; preds = %125
  %128 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %11, ptr noundef nonnull %11, ptr noundef nonnull %12) #3
  %.not63 = icmp eq i32 %128, 0
  br i1 %.not63, label %129, label %.thread

129:                                              ; preds = %127
  %130 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %10, ptr noundef nonnull %10, ptr noundef nonnull %12) #3
  %.not64 = icmp eq i32 %130, 0
  br i1 %.not64, label %131, label %.thread

131:                                              ; preds = %129
  %132 = call i32 @mbedtls_mpi_inv_mod(ptr noundef %2, ptr noundef nonnull %10, ptr noundef nonnull %13) #3
  %.not65 = icmp eq i32 %132, 0
  br i1 %.not65, label %133, label %.thread

133:                                              ; preds = %131
  %134 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %2, ptr noundef %2, ptr noundef nonnull %11) #3
  %.not66 = icmp eq i32 %134, 0
  br i1 %.not66, label %135, label %.thread

135:                                              ; preds = %133
  %136 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %2, ptr noundef %2, ptr noundef nonnull %13) #3
  %.not67 = icmp eq i32 %136, 0
  br i1 %.not67, label %137, label %.thread

137:                                              ; preds = %135
  %exitcond87 = icmp eq i32 %.037, 11
  br i1 %exitcond87, label %.thread, label %138

138:                                              ; preds = %137
  %139 = add nuw nsw i32 %.037, 1
  %140 = call i32 @mbedtls_mpi_cmp_int(ptr noundef %2, i64 noundef 0) #3
  %141 = icmp eq i32 %140, 0
  br i1 %141, label %19, label %.thread, !llvm.loop !18

.thread:                                          ; preds = %137, %138, %135, %133, %131, %129, %127, %125, %123, %100, %.critedge.preheader, %21, %19, %26, %28, %33, %35, %40, %42, %47, %49, %54, %56, %61, %63, %68, %70, %75, %77, %82, %84, %89, %91, %.critedge.backedge, %.lr.ph, %98, %96
  %.140 = phi i32 [ %97, %96 ], [ %spec.select, %98 ], [ %122, %.critedge.backedge ], [ %110, %.lr.ph ], [ %105, %.critedge.preheader ], [ -19712, %137 ], [ 0, %138 ], [ %136, %135 ], [ %134, %133 ], [ %132, %131 ], [ %130, %129 ], [ %128, %127 ], [ %126, %125 ], [ %124, %123 ], [ %101, %100 ], [ %92, %91 ], [ %90, %89 ], [ %85, %84 ], [ %83, %82 ], [ %78, %77 ], [ %76, %75 ], [ %71, %70 ], [ %69, %68 ], [ %64, %63 ], [ %62, %61 ], [ %57, %56 ], [ %55, %54 ], [ %50, %49 ], [ %48, %47 ], [ %43, %42 ], [ %41, %40 ], [ %36, %35 ], [ %34, %33 ], [ %29, %28 ], [ %27, %26 ], [ %22, %21 ], [ %20, %19 ]
  call void @mbedtls_ecp_point_free(ptr noundef nonnull %9) #3
  call void @mbedtls_mpi_free(ptr noundef nonnull %10) #3
  call void @mbedtls_mpi_free(ptr noundef nonnull %11) #3
  call void @mbedtls_mpi_free(ptr noundef nonnull %12) #3
  br label %.thread71

.thread71:                                        ; preds = %111, %8, %.thread
  %.3 = phi i32 [ %.140, %.thread ], [ -20352, %8 ], [ -19712, %111 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %12) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %11) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %10) #3
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %9) #3
  ret i32 %.3
}

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

declare void @mbedtls_ecp_point_init(ptr noundef) local_unnamed_addr #2

declare void @mbedtls_mpi_init(ptr noundef) local_unnamed_addr #2

declare i32 @mbedtls_ecp_gen_keypair(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @mbedtls_mpi_mod_mpi(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @mbedtls_mpi_cmp_int(ptr noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden i32 @derive_mpi(ptr noundef, ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #0

declare i32 @mbedtls_mpi_fill_random(ptr noundef, i64 noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @mbedtls_mpi_shift_r(ptr noundef, i64 noundef) local_unnamed_addr #2

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

declare i32 @mbedtls_mpi_cmp_mpi(ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @mbedtls_mpi_mul_mpi(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @mbedtls_mpi_add_mpi(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @mbedtls_mpi_inv_mod(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @mbedtls_ecp_point_free(ptr noundef) local_unnamed_addr #2

declare void @mbedtls_mpi_free(ptr noundef) local_unnamed_addr #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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, !12, i64 168}
!6 = !{!"", !7, i64 0, !10, i64 8, !10, i64 32, !10, i64 56, !13, i64 80, !10, i64 152, !11, i64 176, !11, i64 184, !7, i64 192, !12, i64 200, !12, i64 208, !12, i64 216, !12, i64 224, !12, i64 232, !11, i64 240}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"", !7, i64 0, !11, i64 8, !12, i64 16}
!11 = !{!"long", !8, i64 0}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!"", !10, i64 0, !10, i64 24, !10, i64 48}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = !{!6, !11, i64 184}
!17 = distinct !{!17, !15}
!18 = distinct !{!18, !15}


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