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

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

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

declare void @mbedtls_mpi_init(ptr noundef) #1

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

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

declare i32 @mbedtls_mpi_sub_int(ptr noundef, ptr noundef, i64 noundef) #1

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

declare void @mbedtls_mpi_free(ptr noundef) #1

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

declare i32 @mbedtls_mpi_read_binary(ptr noundef, ptr noundef, i64 noundef) #1

declare i32 @mbedtls_mpi_exp_mod(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

declare i32 @mbedtls_mpi_write_binary(ptr noundef, ptr noundef, i64 noundef) #1

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

34:                                               ; preds = %5
  %35 = load ptr, ptr %7, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %35, i32 0, i32 6
  %37 = getelementptr inbounds %struct.mbedtls_mpi, ptr %36, i32 0, i32 2
  %38 = load ptr, ptr %37, align 8, !tbaa !14
  %39 = icmp eq ptr %38, null
  br i1 %39, label %46, label %40

40:                                               ; preds = %34
  %41 = load ptr, ptr %7, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %41, i32 0, i32 4
  %43 = getelementptr inbounds %struct.mbedtls_mpi, ptr %42, i32 0, i32 2
  %44 = load ptr, ptr %43, align 8, !tbaa !15
  %45 = icmp eq ptr %44, null
  br i1 %45, label %46, label %47

46:                                               ; preds = %40, %34, %5
  store i32 -16512, ptr %6, align 4
  store i32 1, ptr %24, align 4
  br label %279

47:                                               ; preds = %40
  call void @mbedtls_mpi_init(ptr noundef %14)
  call void @mbedtls_mpi_init(ptr noundef %15)
  call void @mbedtls_mpi_init(ptr noundef %16)
  call void @mbedtls_mpi_init(ptr noundef %17)
  call void @mbedtls_mpi_init(ptr noundef %18)
  call void @mbedtls_mpi_init(ptr noundef %19)
  %48 = load ptr, ptr %8, align 8, !tbaa !5
  %49 = icmp ne ptr %48, null
  br i1 %49, label %50, label %51

50:                                               ; preds = %47
  call void @mbedtls_mpi_init(ptr noundef %20)
  call void @mbedtls_mpi_init(ptr noundef %21)
  br label %51

51:                                               ; preds = %50, %47
  br label %52

52:                                               ; preds = %51
  %53 = load ptr, ptr %10, align 8, !tbaa !5
  %54 = load ptr, ptr %7, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %54, i32 0, i32 1
  %56 = load i64, ptr %55, align 8, !tbaa !16
  %57 = call i32 @mbedtls_mpi_read_binary(ptr noundef %14, ptr noundef %53, i64 noundef %56)
  store i32 %57, ptr %12, align 4, !tbaa !17
  %58 = icmp ne i32 %57, 0
  br i1 %58, label %59, label %60

59:                                               ; preds = %52
  br label %268

60:                                               ; preds = %52
  br label %61

61:                                               ; preds = %60
  br label %62

62:                                               ; preds = %61
  %63 = load ptr, ptr %7, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %63, i32 0, i32 2
  %65 = call i32 @mbedtls_mpi_cmp_mpi(ptr noundef %14, ptr noundef %64)
  %66 = icmp sge i32 %65, 0
  br i1 %66, label %67, label %68

67:                                               ; preds = %62
  store i32 -4, ptr %12, align 4, !tbaa !17
  br label %268

68:                                               ; preds = %62
  %69 = load ptr, ptr %8, align 8, !tbaa !5
  %70 = icmp ne ptr %69, null
  br i1 %70, label %71, label %168

71:                                               ; preds = %68
  br label %72

72:                                               ; preds = %71
  %73 = load ptr, ptr %7, align 8, !tbaa !5
  %74 = load ptr, ptr %8, align 8, !tbaa !5
  %75 = load ptr, ptr %9, align 8, !tbaa !5
  %76 = call i32 @rsa_prepare_blinding(ptr noundef %73, ptr noundef %74, ptr noundef %75)
  store i32 %76, ptr %12, align 4, !tbaa !17
  %77 = icmp ne i32 %76, 0
  br i1 %77, label %78, label %79

78:                                               ; preds = %72
  br label %268

79:                                               ; preds = %72
  br label %80

80:                                               ; preds = %79
  br label %81

81:                                               ; preds = %80
  br label %82

82:                                               ; preds = %81
  %83 = load ptr, ptr %7, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %83, i32 0, i32 13
  %85 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %14, ptr noundef %14, ptr noundef %84)
  store i32 %85, ptr %12, align 4, !tbaa !17
  %86 = icmp ne i32 %85, 0
  br i1 %86, label %87, label %88

87:                                               ; preds = %82
  br label %268

88:                                               ; preds = %82
  br label %89

89:                                               ; preds = %88
  br label %90

90:                                               ; preds = %89
  br label %91

91:                                               ; preds = %90
  %92 = load ptr, ptr %7, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %92, i32 0, i32 2
  %94 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %14, ptr noundef %14, ptr noundef %93)
  store i32 %94, ptr %12, align 4, !tbaa !17
  %95 = icmp ne i32 %94, 0
  br i1 %95, label %96, label %97

96:                                               ; preds = %91
  br label %268

97:                                               ; preds = %91
  br label %98

98:                                               ; preds = %97
  br label %99

99:                                               ; preds = %98
  br label %100

100:                                              ; preds = %99
  %101 = load ptr, ptr %7, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %101, i32 0, i32 5
  %103 = call i32 @mbedtls_mpi_sub_int(ptr noundef %17, ptr noundef %102, i64 noundef 1)
  store i32 %103, ptr %12, align 4, !tbaa !17
  %104 = icmp ne i32 %103, 0
  br i1 %104, label %105, label %106

105:                                              ; preds = %100
  br label %268

106:                                              ; preds = %100
  br label %107

107:                                              ; preds = %106
  br label %108

108:                                              ; preds = %107
  br label %109

109:                                              ; preds = %108
  %110 = load ptr, ptr %7, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %110, i32 0, i32 6
  %112 = call i32 @mbedtls_mpi_sub_int(ptr noundef %18, ptr noundef %111, i64 noundef 1)
  store i32 %112, ptr %12, align 4, !tbaa !17
  %113 = icmp ne i32 %112, 0
  br i1 %113, label %114, label %115

114:                                              ; preds = %109
  br label %268

115:                                              ; preds = %109
  br label %116

116:                                              ; preds = %115
  br label %117

117:                                              ; preds = %116
  br label %118

118:                                              ; preds = %117
  %119 = load ptr, ptr %8, align 8, !tbaa !5
  %120 = load ptr, ptr %9, align 8, !tbaa !5
  %121 = call i32 @mbedtls_mpi_fill_random(ptr noundef %19, i64 noundef 28, ptr noundef %119, ptr noundef %120)
  store i32 %121, ptr %12, align 4, !tbaa !17
  %122 = icmp ne i32 %121, 0
  br i1 %122, label %123, label %124

123:                                              ; preds = %118
  br label %268

124:                                              ; preds = %118
  br label %125

125:                                              ; preds = %124
  br label %126

126:                                              ; preds = %125
  br label %127

127:                                              ; preds = %126
  %128 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %20, ptr noundef %17, ptr noundef %19)
  store i32 %128, ptr %12, align 4, !tbaa !17
  %129 = icmp ne i32 %128, 0
  br i1 %129, label %130, label %131

130:                                              ; preds = %127
  br label %268

131:                                              ; preds = %127
  br label %132

132:                                              ; preds = %131
  br label %133

133:                                              ; preds = %132
  br label %134

134:                                              ; preds = %133
  %135 = load ptr, ptr %7, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %135, i32 0, i32 7
  %137 = call i32 @mbedtls_mpi_add_mpi(ptr noundef %20, ptr noundef %20, ptr noundef %136)
  store i32 %137, ptr %12, align 4, !tbaa !17
  %138 = icmp ne i32 %137, 0
  br i1 %138, label %139, label %140

139:                                              ; preds = %134
  br label %268

140:                                              ; preds = %134
  br label %141

141:                                              ; preds = %140
  br label %142

142:                                              ; preds = %141
  store ptr %20, ptr %22, align 8, !tbaa !5
  br label %143

143:                                              ; preds = %142
  %144 = load ptr, ptr %8, align 8, !tbaa !5
  %145 = load ptr, ptr %9, align 8, !tbaa !5
  %146 = call i32 @mbedtls_mpi_fill_random(ptr noundef %19, i64 noundef 28, ptr noundef %144, ptr noundef %145)
  store i32 %146, ptr %12, align 4, !tbaa !17
  %147 = icmp ne i32 %146, 0
  br i1 %147, label %148, label %149

148:                                              ; preds = %143
  br label %268

149:                                              ; preds = %143
  br label %150

150:                                              ; preds = %149
  br label %151

151:                                              ; preds = %150
  br label %152

152:                                              ; preds = %151
  %153 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %21, ptr noundef %18, ptr noundef %19)
  store i32 %153, ptr %12, align 4, !tbaa !17
  %154 = icmp ne i32 %153, 0
  br i1 %154, label %155, label %156

155:                                              ; preds = %152
  br label %268

156:                                              ; preds = %152
  br label %157

157:                                              ; preds = %156
  br label %158

158:                                              ; preds = %157
  br label %159

159:                                              ; preds = %158
  %160 = load ptr, ptr %7, align 8, !tbaa !5
  %161 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %160, i32 0, i32 8
  %162 = call i32 @mbedtls_mpi_add_mpi(ptr noundef %21, ptr noundef %21, ptr noundef %161)
  store i32 %162, ptr %12, align 4, !tbaa !17
  %163 = icmp ne i32 %162, 0
  br i1 %163, label %164, label %165

164:                                              ; preds = %159
  br label %268

165:                                              ; preds = %159
  br label %166

166:                                              ; preds = %165
  br label %167

167:                                              ; preds = %166
  store ptr %21, ptr %23, align 8, !tbaa !5
  br label %168

168:                                              ; preds = %167, %68
  br label %169

169:                                              ; preds = %168
  %170 = load ptr, ptr %22, align 8, !tbaa !5
  %171 = load ptr, ptr %7, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %171, i32 0, i32 5
  %173 = load ptr, ptr %7, align 8, !tbaa !5
  %174 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %173, i32 0, i32 11
  %175 = call i32 @mbedtls_mpi_exp_mod(ptr noundef %15, ptr noundef %14, ptr noundef %170, ptr noundef %172, ptr noundef %174)
  store i32 %175, ptr %12, align 4, !tbaa !17
  %176 = icmp ne i32 %175, 0
  br i1 %176, label %177, label %178

177:                                              ; preds = %169
  br label %268

178:                                              ; preds = %169
  br label %179

179:                                              ; preds = %178
  br label %180

180:                                              ; preds = %179
  br label %181

181:                                              ; preds = %180
  %182 = load ptr, ptr %23, align 8, !tbaa !5
  %183 = load ptr, ptr %7, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %183, i32 0, i32 6
  %185 = load ptr, ptr %7, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %185, i32 0, i32 12
  %187 = call i32 @mbedtls_mpi_exp_mod(ptr noundef %16, ptr noundef %14, ptr noundef %182, ptr noundef %184, ptr noundef %186)
  store i32 %187, ptr %12, align 4, !tbaa !17
  %188 = icmp ne i32 %187, 0
  br i1 %188, label %189, label %190

189:                                              ; preds = %181
  br label %268

190:                                              ; preds = %181
  br label %191

191:                                              ; preds = %190
  br label %192

192:                                              ; preds = %191
  br label %193

193:                                              ; preds = %192
  %194 = call i32 @mbedtls_mpi_sub_mpi(ptr noundef %14, ptr noundef %15, ptr noundef %16)
  store i32 %194, ptr %12, align 4, !tbaa !17
  %195 = icmp ne i32 %194, 0
  br i1 %195, label %196, label %197

196:                                              ; preds = %193
  br label %268

197:                                              ; preds = %193
  br label %198

198:                                              ; preds = %197
  br label %199

199:                                              ; preds = %198
  br label %200

200:                                              ; preds = %199
  %201 = load ptr, ptr %7, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %201, i32 0, i32 9
  %203 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %15, ptr noundef %14, ptr noundef %202)
  store i32 %203, ptr %12, align 4, !tbaa !17
  %204 = icmp ne i32 %203, 0
  br i1 %204, label %205, label %206

205:                                              ; preds = %200
  br label %268

206:                                              ; preds = %200
  br label %207

207:                                              ; preds = %206
  br label %208

208:                                              ; preds = %207
  br label %209

209:                                              ; preds = %208
  %210 = load ptr, ptr %7, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %210, i32 0, i32 5
  %212 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %14, ptr noundef %15, ptr noundef %211)
  store i32 %212, ptr %12, align 4, !tbaa !17
  %213 = icmp ne i32 %212, 0
  br i1 %213, label %214, label %215

214:                                              ; preds = %209
  br label %268

215:                                              ; preds = %209
  br label %216

216:                                              ; preds = %215
  br label %217

217:                                              ; preds = %216
  br label %218

218:                                              ; preds = %217
  %219 = load ptr, ptr %7, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %219, i32 0, i32 6
  %221 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %15, ptr noundef %14, ptr noundef %220)
  store i32 %221, ptr %12, align 4, !tbaa !17
  %222 = icmp ne i32 %221, 0
  br i1 %222, label %223, label %224

223:                                              ; preds = %218
  br label %268

224:                                              ; preds = %218
  br label %225

225:                                              ; preds = %224
  br label %226

226:                                              ; preds = %225
  br label %227

227:                                              ; preds = %226
  %228 = call i32 @mbedtls_mpi_add_mpi(ptr noundef %14, ptr noundef %16, ptr noundef %15)
  store i32 %228, ptr %12, align 4, !tbaa !17
  %229 = icmp ne i32 %228, 0
  br i1 %229, label %230, label %231

230:                                              ; preds = %227
  br label %268

231:                                              ; preds = %227
  br label %232

232:                                              ; preds = %231
  br label %233

233:                                              ; preds = %232
  %234 = load ptr, ptr %8, align 8, !tbaa !5
  %235 = icmp ne ptr %234, null
  br i1 %235, label %236, label %255

236:                                              ; preds = %233
  br label %237

237:                                              ; preds = %236
  %238 = load ptr, ptr %7, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %238, i32 0, i32 14
  %240 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef %14, ptr noundef %14, ptr noundef %239)
  store i32 %240, ptr %12, align 4, !tbaa !17
  %241 = icmp ne i32 %240, 0
  br i1 %241, label %242, label %243

242:                                              ; preds = %237
  br label %268

243:                                              ; preds = %237
  br label %244

244:                                              ; preds = %243
  br label %245

245:                                              ; preds = %244
  br label %246

246:                                              ; preds = %245
  %247 = load ptr, ptr %7, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %247, i32 0, i32 2
  %249 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef %14, ptr noundef %14, ptr noundef %248)
  store i32 %249, ptr %12, align 4, !tbaa !17
  %250 = icmp ne i32 %249, 0
  br i1 %250, label %251, label %252

251:                                              ; preds = %246
  br label %268

252:                                              ; preds = %246
  br label %253

253:                                              ; preds = %252
  br label %254

254:                                              ; preds = %253
  br label %255

255:                                              ; preds = %254, %233
  %256 = load ptr, ptr %7, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %256, i32 0, i32 1
  %258 = load i64, ptr %257, align 8, !tbaa !16
  store i64 %258, ptr %13, align 8, !tbaa !18
  br label %259

259:                                              ; preds = %255
  %260 = load ptr, ptr %11, align 8, !tbaa !5
  %261 = load i64, ptr %13, align 8, !tbaa !18
  %262 = call i32 @mbedtls_mpi_write_binary(ptr noundef %14, ptr noundef %260, i64 noundef %261)
  store i32 %262, ptr %12, align 4, !tbaa !17
  %263 = icmp ne i32 %262, 0
  br i1 %263, label %264, label %265

264:                                              ; preds = %259
  br label %268

265:                                              ; preds = %259
  br label %266

266:                                              ; preds = %265
  br label %267

267:                                              ; preds = %266
  br label %268

268:                                              ; preds = %267, %264, %251, %242, %230, %223, %214, %205, %196, %189, %177, %164, %155, %148, %139, %130, %123, %114, %105, %96, %87, %78, %67, %59
  call void @mbedtls_mpi_free(ptr noundef %14)
  call void @mbedtls_mpi_free(ptr noundef %15)
  call void @mbedtls_mpi_free(ptr noundef %16)
  call void @mbedtls_mpi_free(ptr noundef %17)
  call void @mbedtls_mpi_free(ptr noundef %18)
  call void @mbedtls_mpi_free(ptr noundef %19)
  %269 = load ptr, ptr %8, align 8, !tbaa !5
  %270 = icmp ne ptr %269, null
  br i1 %270, label %271, label %272

271:                                              ; preds = %268
  call void @mbedtls_mpi_free(ptr noundef %20)
  call void @mbedtls_mpi_free(ptr noundef %21)
  br label %272

272:                                              ; preds = %271, %268
  %273 = load i32, ptr %12, align 4, !tbaa !17
  %274 = icmp ne i32 %273, 0
  br i1 %274, label %275, label %278

275:                                              ; preds = %272
  %276 = load i32, ptr %12, align 4, !tbaa !17
  %277 = add nsw i32 -17152, %276
  store i32 %277, ptr %6, align 4
  store i32 1, ptr %24, align 4
  br label %279

278:                                              ; preds = %272
  store i32 0, ptr %6, align 4
  store i32 1, ptr %24, align 4
  br label %279

279:                                              ; preds = %278, %275, %46
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  %280 = load i32, ptr %6, align 4
  ret i32 %280
}

; Function Attrs: nounwind uwtable
declare hidden i32 @rsa_prepare_blinding(ptr noundef, ptr noundef, ptr noundef) #2

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

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

declare i32 @mbedtls_mpi_sub_mpi(ptr noundef, ptr noundef, ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 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 #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, !6, i64 104}
!10 = !{!"", !11, i64 0, !12, i64 8, !13, i64 16, !13, i64 40, !13, i64 64, !13, i64 88, !13, i64 112, !13, i64 136, !13, i64 160, !13, i64 184, !13, i64 208, !13, i64 232, !13, i64 256, !13, i64 280, !13, i64 304, !11, i64 328, !11, i64 332}
!11 = !{!"int", !7, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!"", !11, i64 0, !12, i64 8, !6, i64 16}
!14 = !{!10, !6, i64 128}
!15 = !{!10, !6, i64 80}
!16 = !{!10, !12, i64 8}
!17 = !{!11, !11, i64 0}
!18 = !{!12, !12, i64 0}


; 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_mpi = type { i32, i64, ptr }

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

declare void @mbedtls_mpi_init(ptr noundef) local_unnamed_addr #1

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

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

declare i32 @mbedtls_mpi_sub_int(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

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

declare void @mbedtls_mpi_free(ptr noundef) local_unnamed_addr #1

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

declare i32 @mbedtls_mpi_read_binary(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

declare i32 @mbedtls_mpi_exp_mod(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare i32 @mbedtls_mpi_write_binary(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local range(i32 -2147483648, 2147466496) i32 @mbedtls_rsa_private(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4) local_unnamed_addr #2 {
  %6 = alloca %struct.mbedtls_mpi, align 8
  %7 = alloca %struct.mbedtls_mpi, align 8
  %8 = alloca %struct.mbedtls_mpi, align 8
  %9 = alloca %struct.mbedtls_mpi, align 8
  %10 = alloca %struct.mbedtls_mpi, align 8
  %11 = alloca %struct.mbedtls_mpi, align 8
  %12 = alloca %struct.mbedtls_mpi, align 8
  %13 = alloca %struct.mbedtls_mpi, align 8
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %6) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %7) #3
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %8) #3
  call void @llvm.lifetime.start.p0(i64 24, 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
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %13) #3
  %14 = getelementptr inbounds i8, ptr %0, i64 136
  %15 = getelementptr inbounds i8, ptr %0, i64 160
  %16 = getelementptr inbounds i8, ptr %0, i64 88
  %17 = getelementptr inbounds i8, ptr %0, i64 104
  %18 = load ptr, ptr %17, align 8, !tbaa !5
  %19 = icmp eq ptr %18, null
  br i1 %19, label %93, label %20

20:                                               ; preds = %5
  %21 = getelementptr inbounds i8, ptr %0, i64 112
  %22 = getelementptr inbounds i8, ptr %0, i64 128
  %23 = load ptr, ptr %22, align 8, !tbaa !13
  %24 = icmp eq ptr %23, null
  br i1 %24, label %93, label %25

25:                                               ; preds = %20
  %26 = getelementptr inbounds i8, ptr %0, i64 80
  %27 = load ptr, ptr %26, align 8, !tbaa !14
  %28 = icmp eq ptr %27, null
  br i1 %28, label %93, label %29

29:                                               ; preds = %25
  call void @mbedtls_mpi_init(ptr noundef nonnull %6) #3
  call void @mbedtls_mpi_init(ptr noundef nonnull %7) #3
  call void @mbedtls_mpi_init(ptr noundef nonnull %8) #3
  call void @mbedtls_mpi_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
  %.not = icmp eq ptr %1, null
  br i1 %.not, label %31, label %30

30:                                               ; preds = %29
  call void @mbedtls_mpi_init(ptr noundef nonnull %12) #3
  call void @mbedtls_mpi_init(ptr noundef nonnull %13) #3
  br label %31

31:                                               ; preds = %29, %30
  %32 = getelementptr inbounds i8, ptr %0, i64 8
  %33 = load i64, ptr %32, align 8, !tbaa !15
  %34 = call i32 @mbedtls_mpi_read_binary(ptr noundef nonnull %6, ptr noundef %3, i64 noundef %33) #3
  %.not66 = icmp eq i32 %34, 0
  br i1 %.not66, label %35, label %89

35:                                               ; preds = %31
  %36 = getelementptr inbounds i8, ptr %0, i64 16
  %37 = call i32 @mbedtls_mpi_cmp_mpi(ptr noundef nonnull %6, ptr noundef nonnull %36) #3
  %38 = icmp sgt i32 %37, -1
  br i1 %38, label %89, label %39

39:                                               ; preds = %35
  br i1 %.not, label %63, label %40

40:                                               ; preds = %39
  %41 = call i32 @rsa_prepare_blinding(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef %2)
  %.not67 = icmp eq i32 %41, 0
  br i1 %.not67, label %42, label %89

42:                                               ; preds = %40
  %43 = getelementptr inbounds i8, ptr %0, i64 280
  %44 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %6, ptr noundef nonnull %6, ptr noundef nonnull %43) #3
  %.not68 = icmp eq i32 %44, 0
  br i1 %.not68, label %45, label %89

45:                                               ; preds = %42
  %46 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef nonnull %6, ptr noundef nonnull %6, ptr noundef nonnull %36) #3
  %.not69 = icmp eq i32 %46, 0
  br i1 %.not69, label %47, label %89

47:                                               ; preds = %45
  %48 = call i32 @mbedtls_mpi_sub_int(ptr noundef nonnull %9, ptr noundef nonnull %16, i64 noundef 1) #3
  %.not70 = icmp eq i32 %48, 0
  br i1 %.not70, label %49, label %89

49:                                               ; preds = %47
  %50 = call i32 @mbedtls_mpi_sub_int(ptr noundef nonnull %10, ptr noundef nonnull %21, i64 noundef 1) #3
  %.not71 = icmp eq i32 %50, 0
  br i1 %.not71, label %51, label %89

51:                                               ; preds = %49
  %52 = call i32 @mbedtls_mpi_fill_random(ptr noundef nonnull %11, i64 noundef 28, ptr noundef nonnull %1, ptr noundef %2) #3
  %.not72 = icmp eq i32 %52, 0
  br i1 %.not72, label %53, label %89

53:                                               ; preds = %51
  %54 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %12, ptr noundef nonnull %9, ptr noundef nonnull %11) #3
  %.not73 = icmp eq i32 %54, 0
  br i1 %.not73, label %55, label %89

55:                                               ; preds = %53
  %56 = call i32 @mbedtls_mpi_add_mpi(ptr noundef nonnull %12, ptr noundef nonnull %12, ptr noundef nonnull %14) #3
  %.not74 = icmp eq i32 %56, 0
  br i1 %.not74, label %57, label %89

57:                                               ; preds = %55
  %58 = call i32 @mbedtls_mpi_fill_random(ptr noundef nonnull %11, i64 noundef 28, ptr noundef nonnull %1, ptr noundef %2) #3
  %.not75 = icmp eq i32 %58, 0
  br i1 %.not75, label %59, label %89

59:                                               ; preds = %57
  %60 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %13, ptr noundef nonnull %10, ptr noundef nonnull %11) #3
  %.not76 = icmp eq i32 %60, 0
  br i1 %.not76, label %61, label %89

61:                                               ; preds = %59
  %62 = call i32 @mbedtls_mpi_add_mpi(ptr noundef nonnull %13, ptr noundef nonnull %13, ptr noundef nonnull %15) #3
  %.not77 = icmp eq i32 %62, 0
  br i1 %.not77, label %63, label %89

63:                                               ; preds = %61, %39
  %.041 = phi ptr [ %14, %39 ], [ %12, %61 ]
  %.0 = phi ptr [ %15, %39 ], [ %13, %61 ]
  %64 = getelementptr inbounds i8, ptr %0, i64 232
  %65 = call i32 @mbedtls_mpi_exp_mod(ptr noundef nonnull %7, ptr noundef nonnull %6, ptr noundef nonnull %.041, ptr noundef nonnull %16, ptr noundef nonnull %64) #3
  %.not78 = icmp eq i32 %65, 0
  br i1 %.not78, label %66, label %89

66:                                               ; preds = %63
  %67 = getelementptr inbounds i8, ptr %0, i64 256
  %68 = call i32 @mbedtls_mpi_exp_mod(ptr noundef nonnull %8, ptr noundef nonnull %6, ptr noundef nonnull %.0, ptr noundef nonnull %21, ptr noundef nonnull %67) #3
  %.not79 = icmp eq i32 %68, 0
  br i1 %.not79, label %69, label %89

69:                                               ; preds = %66
  %70 = call i32 @mbedtls_mpi_sub_mpi(ptr noundef nonnull %6, ptr noundef nonnull %7, ptr noundef nonnull %8) #3
  %.not80 = icmp eq i32 %70, 0
  br i1 %.not80, label %71, label %89

71:                                               ; preds = %69
  %72 = getelementptr inbounds i8, ptr %0, i64 184
  %73 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %7, ptr noundef nonnull %6, ptr noundef nonnull %72) #3
  %.not81 = icmp eq i32 %73, 0
  br i1 %.not81, label %74, label %89

74:                                               ; preds = %71
  %75 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef nonnull %6, ptr noundef nonnull %7, ptr noundef nonnull %16) #3
  %.not82 = icmp eq i32 %75, 0
  br i1 %.not82, label %76, label %89

76:                                               ; preds = %74
  %77 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %7, ptr noundef nonnull %6, ptr noundef nonnull %21) #3
  %.not83 = icmp eq i32 %77, 0
  br i1 %.not83, label %78, label %89

78:                                               ; preds = %76
  %79 = call i32 @mbedtls_mpi_add_mpi(ptr noundef nonnull %6, ptr noundef nonnull %8, ptr noundef nonnull %7) #3
  %.not84 = icmp eq i32 %79, 0
  br i1 %.not84, label %80, label %89

80:                                               ; preds = %78
  br i1 %.not, label %86, label %81

81:                                               ; preds = %80
  %82 = getelementptr inbounds i8, ptr %0, i64 304
  %83 = call i32 @mbedtls_mpi_mul_mpi(ptr noundef nonnull %6, ptr noundef nonnull %6, ptr noundef nonnull %82) #3
  %.not85 = icmp eq i32 %83, 0
  br i1 %.not85, label %84, label %89

84:                                               ; preds = %81
  %85 = call i32 @mbedtls_mpi_mod_mpi(ptr noundef nonnull %6, ptr noundef nonnull %6, ptr noundef nonnull %36) #3
  %.not86 = icmp eq i32 %85, 0
  br i1 %.not86, label %86, label %89

86:                                               ; preds = %84, %80
  %87 = load i64, ptr %32, align 8, !tbaa !15
  %88 = call i32 @mbedtls_mpi_write_binary(ptr noundef nonnull %6, ptr noundef %4, i64 noundef %87) #3
  br label %89

89:                                               ; preds = %35, %86, %84, %81, %78, %76, %74, %71, %69, %66, %63, %61, %59, %57, %55, %53, %51, %49, %47, %45, %42, %40, %31
  %.043 = phi i32 [ %34, %31 ], [ %41, %40 ], [ %44, %42 ], [ %46, %45 ], [ %48, %47 ], [ %50, %49 ], [ %52, %51 ], [ %54, %53 ], [ %56, %55 ], [ %58, %57 ], [ %60, %59 ], [ %62, %61 ], [ %65, %63 ], [ %68, %66 ], [ %70, %69 ], [ %73, %71 ], [ %75, %74 ], [ %77, %76 ], [ %79, %78 ], [ %83, %81 ], [ %85, %84 ], [ %88, %86 ], [ -4, %35 ]
  call void @mbedtls_mpi_free(ptr noundef nonnull %6) #3
  call void @mbedtls_mpi_free(ptr noundef nonnull %7) #3
  call void @mbedtls_mpi_free(ptr noundef nonnull %8) #3
  call void @mbedtls_mpi_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
  br i1 %.not, label %91, label %90

90:                                               ; preds = %89
  call void @mbedtls_mpi_free(ptr noundef nonnull %12) #3
  call void @mbedtls_mpi_free(ptr noundef nonnull %13) #3
  br label %91

91:                                               ; preds = %90, %89
  %.not87 = icmp eq i32 %.043, 0
  %92 = add nsw i32 %.043, -17152
  %spec.select = select i1 %.not87, i32 0, i32 %92
  br label %93

93:                                               ; preds = %91, %5, %20, %25
  %.042 = phi i32 [ -16512, %25 ], [ -16512, %20 ], [ -16512, %5 ], [ %spec.select, %91 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %13) #3
  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 24, ptr nonnull %9) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %8) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %7) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %6) #3
  ret i32 %.042
}

; Function Attrs: nounwind uwtable
declare hidden i32 @rsa_prepare_blinding(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

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

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

declare i32 @mbedtls_mpi_sub_mpi(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 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 #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 104}
!6 = !{!"", !7, i64 0, !10, i64 8, !11, i64 16, !11, i64 40, !11, i64 64, !11, i64 88, !11, i64 112, !11, i64 136, !11, i64 160, !11, i64 184, !11, i64 208, !11, i64 232, !11, i64 256, !11, i64 280, !11, i64 304, !7, i64 328, !7, i64 332}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"long", !8, i64 0}
!11 = !{!"", !7, i64 0, !10, i64 8, !12, i64 16}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!6, !12, i64 128}
!14 = !{!6, !12, i64 80}
!15 = !{!6, !10, i64 8}


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