; LLVM IR from openssl/openssl :: crypto/ffc (ffc_params_generate)

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

@.str = external hidden unnamed_addr constant [82 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @ossl_ffc_params_FIPS186_4_gen_verify(ptr noundef %0, ptr noundef %1, i32 noundef %2, i32 noundef %3, i64 noundef %4, i64 noundef %5, ptr noundef %6, ptr noundef %7) #0 {
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i64, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca ptr, align 8
  store ptr %0, ptr %9, align 8, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !5
  store i32 %2, ptr %11, align 4, !tbaa !9
  store i32 %3, ptr %12, align 4, !tbaa !9
  store i64 %4, ptr %13, align 8, !tbaa !11
  store i64 %5, ptr %14, align 8, !tbaa !11
  store ptr %6, ptr %15, align 8, !tbaa !5
  store ptr %7, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #4
  store i32 0, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  store ptr null, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  store ptr null, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  store i32 0, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  store i32 0, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  store i32 0, ptr %23, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  store i64 0, ptr %24, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  store ptr null, ptr %29, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  store ptr null, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  store ptr null, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  store ptr null, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  store i32 0, ptr %33, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #4
  store i32 0, ptr %34, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #4
  store i32 0, ptr %36, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #4
  store i32 0, ptr %37, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  store ptr null, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  store ptr null, ptr %39, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #4
  store ptr null, ptr %40, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #4
  %44 = load i32, ptr %11, align 4, !tbaa !9
  %45 = icmp eq i32 %44, 0
  %46 = zext i1 %45 to i32
  store i32 %46, ptr %41, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #4
  %47 = load i32, ptr %41, align 4, !tbaa !9
  %48 = icmp ne i32 %47, 0
  br i1 %48, label %49, label %53

49:                                               ; preds = %8
  %50 = load ptr, ptr %10, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.ffc_params_st, ptr %50, i32 0, i32 10
  %52 = load i32, ptr %51, align 8, !tbaa !13
  br label %54

53:                                               ; preds = %8
  br label %54

54:                                               ; preds = %53, %49
  %55 = phi i32 [ %52, %49 ], [ 0, %53 ]
  store i32 %55, ptr %42, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #4
  %56 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 0, ptr %56, align 4, !tbaa !9
  %57 = load ptr, ptr %10, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.ffc_params_st, ptr %57, i32 0, i32 11
  %59 = load ptr, ptr %58, align 8, !tbaa !15
  %60 = icmp ne ptr %59, null
  br i1 %60, label %61, label %70

61:                                               ; preds = %54
  %62 = load ptr, ptr %9, align 8, !tbaa !5
  %63 = load ptr, ptr %10, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.ffc_params_st, ptr %63, i32 0, i32 11
  %65 = load ptr, ptr %64, align 8, !tbaa !15
  %66 = load ptr, ptr %10, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.ffc_params_st, ptr %66, i32 0, i32 12
  %68 = load ptr, ptr %67, align 8, !tbaa !16
  %69 = call ptr @EVP_MD_fetch(ptr noundef %62, ptr noundef %65, ptr noundef %68)
  store ptr %69, ptr %40, align 8, !tbaa !5
  br label %94

70:                                               ; preds = %54
  %71 = load i64, ptr %14, align 8, !tbaa !11
  %72 = icmp eq i64 %71, 0
  br i1 %72, label %73, label %80

73:                                               ; preds = %70
  %74 = load i64, ptr %13, align 8, !tbaa !11
  %75 = icmp uge i64 %74, 2048
  %76 = zext i1 %75 to i64
  %77 = select i1 %75, i32 32, i32 20
  %78 = mul nsw i32 %77, 8
  %79 = sext i32 %78 to i64
  store i64 %79, ptr %14, align 8, !tbaa !11
  br label %80

80:                                               ; preds = %73, %70
  %81 = load i64, ptr %14, align 8, !tbaa !11
  %82 = call ptr @default_mdname(i64 noundef %81)
  store ptr %82, ptr %43, align 8, !tbaa !5
  %83 = load ptr, ptr %43, align 8, !tbaa !5
  %84 = icmp eq ptr %83, null
  br i1 %84, label %85, label %87

85:                                               ; preds = %80
  %86 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 32, ptr %86, align 4, !tbaa !9
  br label %588

87:                                               ; preds = %80
  %88 = load ptr, ptr %9, align 8, !tbaa !5
  %89 = load ptr, ptr %43, align 8, !tbaa !5
  %90 = load ptr, ptr %10, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.ffc_params_st, ptr %90, i32 0, i32 12
  %92 = load ptr, ptr %91, align 8, !tbaa !16
  %93 = call ptr @EVP_MD_fetch(ptr noundef %88, ptr noundef %89, ptr noundef %92)
  store ptr %93, ptr %40, align 8, !tbaa !5
  br label %94

94:                                               ; preds = %87, %61
  %95 = load ptr, ptr %40, align 8, !tbaa !5
  %96 = icmp eq ptr %95, null
  br i1 %96, label %97, label %98

97:                                               ; preds = %94
  br label %588

98:                                               ; preds = %94
  %99 = load ptr, ptr %40, align 8, !tbaa !5
  %100 = call i32 @EVP_MD_get_size(ptr noundef %99)
  store i32 %100, ptr %20, align 4, !tbaa !9
  %101 = load i32, ptr %20, align 4, !tbaa !9
  %102 = icmp sle i32 %101, 0
  br i1 %102, label %103, label %104

103:                                              ; preds = %98
  br label %588

104:                                              ; preds = %98
  %105 = load i64, ptr %14, align 8, !tbaa !11
  %106 = icmp eq i64 %105, 0
  br i1 %106, label %107, label %111

107:                                              ; preds = %104
  %108 = load i32, ptr %20, align 4, !tbaa !9
  %109 = mul nsw i32 %108, 8
  %110 = sext i32 %109 to i64
  store i64 %110, ptr %14, align 8, !tbaa !11
  br label %111

111:                                              ; preds = %107, %104
  %112 = load i64, ptr %14, align 8, !tbaa !11
  %113 = lshr i64 %112, 3
  %114 = trunc i64 %113 to i32
  store i32 %114, ptr %35, align 4, !tbaa !9
  %115 = load i64, ptr %13, align 8, !tbaa !11
  %116 = load i64, ptr %14, align 8, !tbaa !11
  %117 = icmp ule i64 %115, %116
  br i1 %117, label %125, label %118

118:                                              ; preds = %111
  %119 = load i64, ptr %13, align 8, !tbaa !11
  %120 = load i64, ptr %14, align 8, !tbaa !11
  %121 = load i32, ptr %12, align 4, !tbaa !9
  %122 = load i32, ptr %41, align 4, !tbaa !9
  %123 = call i32 @ffc_validate_LN(i64 noundef %119, i64 noundef %120, i32 noundef %121, i32 noundef %122)
  %124 = icmp ne i32 %123, 0
  br i1 %124, label %127, label %125

125:                                              ; preds = %118, %111
  %126 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 131072, ptr %126, align 4, !tbaa !9
  br label %588

127:                                              ; preds = %118
  %128 = call ptr @EVP_MD_CTX_new()
  store ptr %128, ptr %39, align 8, !tbaa !5
  %129 = load ptr, ptr %39, align 8, !tbaa !5
  %130 = icmp eq ptr %129, null
  br i1 %130, label %131, label %132

131:                                              ; preds = %127
  br label %588

132:                                              ; preds = %127
  %133 = load ptr, ptr %9, align 8, !tbaa !5
  %134 = call ptr @BN_CTX_new_ex(ptr noundef %133)
  store ptr %134, ptr %38, align 8, !tbaa !5
  %135 = icmp eq ptr %134, null
  br i1 %135, label %136, label %137

136:                                              ; preds = %132
  br label %588

137:                                              ; preds = %132
  %138 = load ptr, ptr %38, align 8, !tbaa !5
  call void @BN_CTX_start(ptr noundef %138)
  %139 = load ptr, ptr %38, align 8, !tbaa !5
  %140 = call ptr @BN_CTX_get(ptr noundef %139)
  store ptr %140, ptr %29, align 8, !tbaa !5
  %141 = load ptr, ptr %38, align 8, !tbaa !5
  %142 = call ptr @BN_CTX_get(ptr noundef %141)
  store ptr %142, ptr %26, align 8, !tbaa !5
  %143 = load ptr, ptr %38, align 8, !tbaa !5
  %144 = call ptr @BN_CTX_get(ptr noundef %143)
  store ptr %144, ptr %27, align 8, !tbaa !5
  %145 = load ptr, ptr %38, align 8, !tbaa !5
  %146 = call ptr @BN_CTX_get(ptr noundef %145)
  store ptr %146, ptr %28, align 8, !tbaa !5
  %147 = load ptr, ptr %38, align 8, !tbaa !5
  %148 = call ptr @BN_CTX_get(ptr noundef %147)
  store ptr %148, ptr %25, align 8, !tbaa !5
  %149 = load ptr, ptr %25, align 8, !tbaa !5
  %150 = icmp eq ptr %149, null
  br i1 %150, label %151, label %152

151:                                              ; preds = %137
  br label %588

152:                                              ; preds = %137
  %153 = load ptr, ptr %10, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.ffc_params_st, ptr %153, i32 0, i32 5
  %155 = load i64, ptr %154, align 8, !tbaa !17
  store i64 %155, ptr %24, align 8, !tbaa !11
  %156 = load i64, ptr %24, align 8, !tbaa !11
  %157 = icmp eq i64 %156, 0
  br i1 %157, label %158, label %161

158:                                              ; preds = %152
  %159 = load i32, ptr %20, align 4, !tbaa !9
  %160 = sext i32 %159 to i64
  store i64 %160, ptr %24, align 8, !tbaa !11
  br label %161

161:                                              ; preds = %158, %152
  %162 = load ptr, ptr %10, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.ffc_params_st, ptr %162, i32 0, i32 4
  %164 = load ptr, ptr %163, align 8, !tbaa !18
  %165 = icmp ne ptr %164, null
  br i1 %165, label %166, label %170

166:                                              ; preds = %161
  %167 = load ptr, ptr %10, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct.ffc_params_st, ptr %167, i32 0, i32 4
  %169 = load ptr, ptr %168, align 8, !tbaa !18
  store ptr %169, ptr %18, align 8, !tbaa !5
  br label %170

170:                                              ; preds = %166, %161
  %171 = load i32, ptr %41, align 4, !tbaa !9
  %172 = icmp ne i32 %171, 0
  br i1 %172, label %188, label %173

173:                                              ; preds = %170
  %174 = load ptr, ptr %10, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.ffc_params_st, ptr %174, i32 0, i32 0
  %176 = load ptr, ptr %175, align 8, !tbaa !19
  %177 = icmp eq ptr %176, null
  %178 = zext i1 %177 to i32
  %179 = load ptr, ptr %10, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.ffc_params_st, ptr %179, i32 0, i32 1
  %181 = load ptr, ptr %180, align 8, !tbaa !20
  %182 = icmp eq ptr %181, null
  %183 = zext i1 %182 to i32
  %184 = icmp ne i32 %178, %183
  br i1 %184, label %185, label %187

185:                                              ; preds = %173
  %186 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 2048, ptr %186, align 4, !tbaa !9
  br label %588

187:                                              ; preds = %173
  br label %216

188:                                              ; preds = %170
  %189 = load i32, ptr %42, align 4, !tbaa !9
  %190 = and i32 %189, 1
  %191 = icmp ne i32 %190, 0
  br i1 %191, label %192, label %203

192:                                              ; preds = %188
  %193 = load ptr, ptr %18, align 8, !tbaa !5
  %194 = icmp eq ptr %193, null
  br i1 %194, label %200, label %195

195:                                              ; preds = %192
  %196 = load ptr, ptr %10, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.ffc_params_st, ptr %196, i32 0, i32 6
  %198 = load i32, ptr %197, align 8, !tbaa !21
  %199 = icmp slt i32 %198, 0
  br i1 %199, label %200, label %202

200:                                              ; preds = %195, %192
  %201 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 512, ptr %201, align 4, !tbaa !9
  br label %588

202:                                              ; preds = %195
  br label %203

203:                                              ; preds = %202, %188
  %204 = load i32, ptr %42, align 4, !tbaa !9
  %205 = and i32 %204, 2
  %206 = icmp ne i32 %205, 0
  br i1 %206, label %207, label %215

207:                                              ; preds = %203
  %208 = load ptr, ptr %10, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.ffc_params_st, ptr %208, i32 0, i32 2
  %210 = load ptr, ptr %209, align 8, !tbaa !22
  %211 = icmp eq ptr %210, null
  br i1 %211, label %212, label %214

212:                                              ; preds = %207
  %213 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 1024, ptr %213, align 4, !tbaa !9
  br label %588

214:                                              ; preds = %207
  br label %215

215:                                              ; preds = %214, %203
  br label %216

216:                                              ; preds = %215, %187
  %217 = load ptr, ptr %10, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.ffc_params_st, ptr %217, i32 0, i32 0
  %219 = load ptr, ptr %218, align 8, !tbaa !19
  %220 = icmp ne ptr %219, null
  br i1 %220, label %221, label %232

221:                                              ; preds = %216
  %222 = load i32, ptr %42, align 4, !tbaa !9
  %223 = and i32 %222, 1
  %224 = icmp eq i32 %223, 0
  br i1 %224, label %225, label %232

225:                                              ; preds = %221
  %226 = load ptr, ptr %10, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.ffc_params_st, ptr %226, i32 0, i32 0
  %228 = load ptr, ptr %227, align 8, !tbaa !19
  store ptr %228, ptr %31, align 8, !tbaa !5
  %229 = load ptr, ptr %10, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.ffc_params_st, ptr %229, i32 0, i32 1
  %231 = load ptr, ptr %230, align 8, !tbaa !20
  store ptr %231, ptr %30, align 8, !tbaa !5
  br label %403

232:                                              ; preds = %221, %216
  %233 = load ptr, ptr %38, align 8, !tbaa !5
  %234 = call ptr @BN_CTX_get(ptr noundef %233)
  store ptr %234, ptr %31, align 8, !tbaa !5
  %235 = load ptr, ptr %38, align 8, !tbaa !5
  %236 = call ptr @BN_CTX_get(ptr noundef %235)
  store ptr %236, ptr %30, align 8, !tbaa !5
  %237 = load ptr, ptr %30, align 8, !tbaa !5
  %238 = icmp eq ptr %237, null
  br i1 %238, label %239, label %240

239:                                              ; preds = %232
  br label %588

240:                                              ; preds = %232
  %241 = load i64, ptr %24, align 8, !tbaa !11
  %242 = mul i64 %241, 8
  %243 = load i64, ptr %14, align 8, !tbaa !11
  %244 = icmp ult i64 %242, %243
  br i1 %244, label %245, label %247

245:                                              ; preds = %240
  %246 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 262144, ptr %246, align 4, !tbaa !9
  br label %588

247:                                              ; preds = %240
  %248 = load i64, ptr %24, align 8, !tbaa !11
  %249 = call ptr @CRYPTO_malloc(i64 noundef %248, ptr noundef @.str, i32 noundef 646)
  store ptr %249, ptr %19, align 8, !tbaa !5
  %250 = load ptr, ptr %19, align 8, !tbaa !5
  %251 = icmp eq ptr %250, null
  br i1 %251, label %252, label %253

252:                                              ; preds = %247
  br label %588

253:                                              ; preds = %247
  %254 = load ptr, ptr %18, align 8, !tbaa !5
  %255 = icmp eq ptr %254, null
  br i1 %255, label %256, label %268

256:                                              ; preds = %253
  %257 = load i32, ptr %41, align 4, !tbaa !9
  %258 = icmp ne i32 %257, 0
  br i1 %258, label %259, label %261

259:                                              ; preds = %256
  %260 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 512, ptr %260, align 4, !tbaa !9
  br label %588

261:                                              ; preds = %256
  %262 = load i64, ptr %24, align 8, !tbaa !11
  %263 = call ptr @CRYPTO_malloc(i64 noundef %262, ptr noundef @.str, i32 noundef 657)
  store ptr %263, ptr %18, align 8, !tbaa !5
  %264 = load ptr, ptr %18, align 8, !tbaa !5
  %265 = icmp eq ptr %264, null
  br i1 %265, label %266, label %267

266:                                              ; preds = %261
  br label %588

267:                                              ; preds = %261
  br label %268

268:                                              ; preds = %267, %253
  %269 = load i64, ptr %13, align 8, !tbaa !11
  %270 = mul i64 4, %269
  %271 = sub i64 %270, 1
  %272 = trunc i64 %271 to i32
  store i32 %272, ptr %21, align 4, !tbaa !9
  %273 = load i32, ptr %41, align 4, !tbaa !9
  %274 = icmp ne i32 %273, 0
  br i1 %274, label %275, label %287

275:                                              ; preds = %268
  %276 = load ptr, ptr %10, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.ffc_params_st, ptr %276, i32 0, i32 6
  %278 = load i32, ptr %277, align 8, !tbaa !21
  %279 = load i32, ptr %21, align 4, !tbaa !9
  %280 = icmp sgt i32 %278, %279
  br i1 %280, label %281, label %283

281:                                              ; preds = %275
  %282 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 4096, ptr %282, align 4, !tbaa !9
  br label %588

283:                                              ; preds = %275
  %284 = load ptr, ptr %10, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.ffc_params_st, ptr %284, i32 0, i32 6
  %286 = load i32, ptr %285, align 8, !tbaa !21
  store i32 %286, ptr %21, align 4, !tbaa !9
  br label %287

287:                                              ; preds = %283, %268
  %288 = load i64, ptr %13, align 8, !tbaa !11
  %289 = sub i64 %288, 1
  %290 = load i32, ptr %20, align 4, !tbaa !9
  %291 = shl i32 %290, 3
  %292 = sext i32 %291 to i64
  %293 = udiv i64 %289, %292
  %294 = trunc i64 %293 to i32
  store i32 %294, ptr %33, align 4, !tbaa !9
  %295 = load ptr, ptr %28, align 8, !tbaa !5
  %296 = call ptr @BN_value_one()
  %297 = load i64, ptr %13, align 8, !tbaa !11
  %298 = sub i64 %297, 1
  %299 = trunc i64 %298 to i32
  %300 = call i32 @BN_lshift(ptr noundef %295, ptr noundef %296, i32 noundef %299)
  %301 = icmp ne i32 %300, 0
  br i1 %301, label %303, label %302

302:                                              ; preds = %287
  br label %588

303:                                              ; preds = %287
  br label %304

304:                                              ; preds = %376, %303
  %305 = load ptr, ptr %38, align 8, !tbaa !5
  %306 = load ptr, ptr %30, align 8, !tbaa !5
  %307 = load ptr, ptr %40, align 8, !tbaa !5
  %308 = load i32, ptr %35, align 4, !tbaa !9
  %309 = load ptr, ptr %18, align 8, !tbaa !5
  %310 = load i64, ptr %24, align 8, !tbaa !11
  %311 = load ptr, ptr %18, align 8, !tbaa !5
  %312 = load ptr, ptr %10, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.ffc_params_st, ptr %312, i32 0, i32 4
  %314 = load ptr, ptr %313, align 8, !tbaa !18
  %315 = icmp ne ptr %311, %314
  %316 = zext i1 %315 to i32
  %317 = load ptr, ptr %15, align 8, !tbaa !5
  %318 = load ptr, ptr %16, align 8, !tbaa !5
  %319 = call i32 @generate_q_fips186_4(ptr noundef %305, ptr noundef %306, ptr noundef %307, i32 noundef %308, ptr noundef %309, i64 noundef %310, i32 noundef %316, ptr noundef %34, ptr noundef %317, ptr noundef %318)
  %320 = icmp ne i32 %319, 0
  br i1 %320, label %322, label %321

321:                                              ; preds = %304
  br label %588

322:                                              ; preds = %304
  %323 = load i32, ptr %41, align 4, !tbaa !9
  %324 = icmp ne i32 %323, 0
  br i1 %324, label %325, label %334

325:                                              ; preds = %322
  %326 = load ptr, ptr %30, align 8, !tbaa !5
  %327 = load ptr, ptr %10, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.ffc_params_st, ptr %327, i32 0, i32 1
  %329 = load ptr, ptr %328, align 8, !tbaa !20
  %330 = call i32 @BN_cmp(ptr noundef %326, ptr noundef %329)
  %331 = icmp ne i32 %330, 0
  br i1 %331, label %332, label %334

332:                                              ; preds = %325
  %333 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 16384, ptr %333, align 4, !tbaa !9
  br label %588

334:                                              ; preds = %325, %322
  %335 = load ptr, ptr %16, align 8, !tbaa !5
  %336 = call i32 @BN_GENCB_call(ptr noundef %335, i32 noundef 2, i32 noundef 0)
  %337 = icmp ne i32 %336, 0
  br i1 %337, label %339, label %338

338:                                              ; preds = %334
  br label %588

339:                                              ; preds = %334
  %340 = load ptr, ptr %16, align 8, !tbaa !5
  %341 = call i32 @BN_GENCB_call(ptr noundef %340, i32 noundef 3, i32 noundef 0)
  %342 = icmp ne i32 %341, 0
  br i1 %342, label %344, label %343

343:                                              ; preds = %339
  br label %588

344:                                              ; preds = %339
  %345 = load ptr, ptr %19, align 8, !tbaa !5
  %346 = load ptr, ptr %18, align 8, !tbaa !5
  %347 = load i64, ptr %24, align 8, !tbaa !11
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %345, ptr align 1 %346, i64 %347, i1 false)
  %348 = load ptr, ptr %38, align 8, !tbaa !5
  %349 = load ptr, ptr %40, align 8, !tbaa !5
  %350 = load i32, ptr %21, align 4, !tbaa !9
  %351 = load i32, ptr %33, align 4, !tbaa !9
  %352 = load ptr, ptr %19, align 8, !tbaa !5
  %353 = load i64, ptr %24, align 8, !tbaa !11
  %354 = load ptr, ptr %30, align 8, !tbaa !5
  %355 = load ptr, ptr %31, align 8, !tbaa !5
  %356 = load i64, ptr %13, align 8, !tbaa !11
  %357 = trunc i64 %356 to i32
  %358 = load ptr, ptr %16, align 8, !tbaa !5
  %359 = load ptr, ptr %15, align 8, !tbaa !5
  %360 = call i32 @generate_p(ptr noundef %348, ptr noundef %349, i32 noundef %350, i32 noundef %351, ptr noundef %352, i64 noundef %353, ptr noundef %354, ptr noundef %355, i32 noundef %357, ptr noundef %358, ptr noundef %22, ptr noundef %359)
  store i32 %360, ptr %23, align 4, !tbaa !9
  %361 = load i32, ptr %23, align 4, !tbaa !9
  %362 = icmp sgt i32 %361, 0
  br i1 %362, label %363, label %364

363:                                              ; preds = %344
  br label %377

364:                                              ; preds = %344
  %365 = load i32, ptr %23, align 4, !tbaa !9
  %366 = icmp slt i32 %365, 0
  br i1 %366, label %367, label %368

367:                                              ; preds = %364
  br label %588

368:                                              ; preds = %364
  %369 = load ptr, ptr %18, align 8, !tbaa !5
  %370 = load ptr, ptr %10, align 8, !tbaa !5
  %371 = getelementptr inbounds %struct.ffc_params_st, ptr %370, i32 0, i32 4
  %372 = load ptr, ptr %371, align 8, !tbaa !18
  %373 = icmp eq ptr %369, %372
  br i1 %373, label %374, label %376

374:                                              ; preds = %368
  %375 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 1, ptr %375, align 4, !tbaa !9
  br label %588

376:                                              ; preds = %368
  br label %304

377:                                              ; preds = %363
  %378 = load ptr, ptr %16, align 8, !tbaa !5
  %379 = call i32 @BN_GENCB_call(ptr noundef %378, i32 noundef 2, i32 noundef 1)
  %380 = icmp ne i32 %379, 0
  br i1 %380, label %382, label %381

381:                                              ; preds = %377
  br label %588

382:                                              ; preds = %377
  %383 = load i32, ptr %41, align 4, !tbaa !9
  %384 = icmp ne i32 %383, 0
  br i1 %384, label %385, label %397

385:                                              ; preds = %382
  %386 = load i32, ptr %22, align 4, !tbaa !9
  %387 = load i32, ptr %21, align 4, !tbaa !9
  %388 = icmp ne i32 %386, %387
  br i1 %388, label %396, label %389

389:                                              ; preds = %385
  %390 = load ptr, ptr %31, align 8, !tbaa !5
  %391 = load ptr, ptr %10, align 8, !tbaa !5
  %392 = getelementptr inbounds %struct.ffc_params_st, ptr %391, i32 0, i32 0
  %393 = load ptr, ptr %392, align 8, !tbaa !19
  %394 = call i32 @BN_cmp(ptr noundef %390, ptr noundef %393)
  %395 = icmp ne i32 %394, 0
  br i1 %395, label %396, label %397

396:                                              ; preds = %389, %385
  br label %588

397:                                              ; preds = %389, %382
  %398 = load i32, ptr %42, align 4, !tbaa !9
  %399 = and i32 %398, 3
  %400 = icmp eq i32 %399, 1
  br i1 %400, label %401, label %402

401:                                              ; preds = %397
  br label %578

402:                                              ; preds = %397
  br label %403

403:                                              ; preds = %402, %225
  %404 = call ptr @BN_MONT_CTX_new()
  store ptr %404, ptr %32, align 8, !tbaa !5
  %405 = icmp eq ptr %404, null
  br i1 %405, label %406, label %407

406:                                              ; preds = %403
  br label %588

407:                                              ; preds = %403
  %408 = load ptr, ptr %32, align 8, !tbaa !5
  %409 = load ptr, ptr %31, align 8, !tbaa !5
  %410 = load ptr, ptr %38, align 8, !tbaa !5
  %411 = call i32 @BN_MONT_CTX_set(ptr noundef %408, ptr noundef %409, ptr noundef %410)
  %412 = icmp ne i32 %411, 0
  br i1 %412, label %414, label %413

413:                                              ; preds = %407
  br label %588

414:                                              ; preds = %407
  %415 = load i32, ptr %42, align 4, !tbaa !9
  %416 = and i32 %415, 2
  %417 = icmp ne i32 %416, 0
  br i1 %417, label %418, label %431

418:                                              ; preds = %414
  %419 = load ptr, ptr %38, align 8, !tbaa !5
  %420 = load ptr, ptr %32, align 8, !tbaa !5
  %421 = load ptr, ptr %31, align 8, !tbaa !5
  %422 = load ptr, ptr %30, align 8, !tbaa !5
  %423 = load ptr, ptr %10, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.ffc_params_st, ptr %423, i32 0, i32 2
  %425 = load ptr, ptr %424, align 8, !tbaa !22
  %426 = load ptr, ptr %25, align 8, !tbaa !5
  %427 = load ptr, ptr %15, align 8, !tbaa !5
  %428 = call i32 @ossl_ffc_params_validate_unverifiable_g(ptr noundef %419, ptr noundef %420, ptr noundef %421, ptr noundef %422, ptr noundef %425, ptr noundef %426, ptr noundef %427)
  %429 = icmp ne i32 %428, 0
  br i1 %429, label %431, label %430

430:                                              ; preds = %418
  br label %588

431:                                              ; preds = %418, %414
  %432 = load ptr, ptr %26, align 8, !tbaa !5
  %433 = load ptr, ptr %31, align 8, !tbaa !5
  %434 = call ptr @BN_value_one()
  %435 = call i32 @BN_sub(ptr noundef %432, ptr noundef %433, ptr noundef %434)
  %436 = icmp ne i32 %435, 0
  br i1 %436, label %437, label %444

437:                                              ; preds = %431
  %438 = load ptr, ptr %27, align 8, !tbaa !5
  %439 = load ptr, ptr %26, align 8, !tbaa !5
  %440 = load ptr, ptr %30, align 8, !tbaa !5
  %441 = load ptr, ptr %38, align 8, !tbaa !5
  %442 = call i32 @BN_div(ptr noundef %438, ptr noundef null, ptr noundef %439, ptr noundef %440, ptr noundef %441)
  %443 = icmp ne i32 %442, 0
  br i1 %443, label %445, label %444

444:                                              ; preds = %437, %431
  br label %588

445:                                              ; preds = %437
  %446 = load ptr, ptr %18, align 8, !tbaa !5
  %447 = icmp ne ptr %446, null
  br i1 %447, label %448, label %483

448:                                              ; preds = %445
  %449 = load ptr, ptr %10, align 8, !tbaa !5
  %450 = getelementptr inbounds %struct.ffc_params_st, ptr %449, i32 0, i32 8
  %451 = load i32, ptr %450, align 8, !tbaa !23
  %452 = icmp ne i32 %451, -1
  br i1 %452, label %453, label %483

453:                                              ; preds = %448
  store i32 1, ptr %36, align 4, !tbaa !9
  %454 = load ptr, ptr %38, align 8, !tbaa !5
  %455 = load ptr, ptr %32, align 8, !tbaa !5
  %456 = load ptr, ptr %40, align 8, !tbaa !5
  %457 = load ptr, ptr %29, align 8, !tbaa !5
  %458 = load ptr, ptr %25, align 8, !tbaa !5
  %459 = load ptr, ptr %31, align 8, !tbaa !5
  %460 = load ptr, ptr %27, align 8, !tbaa !5
  %461 = load ptr, ptr %10, align 8, !tbaa !5
  %462 = getelementptr inbounds %struct.ffc_params_st, ptr %461, i32 0, i32 8
  %463 = load i32, ptr %462, align 8, !tbaa !23
  %464 = load ptr, ptr %18, align 8, !tbaa !5
  %465 = load i64, ptr %24, align 8, !tbaa !11
  %466 = call i32 @generate_canonical_g(ptr noundef %454, ptr noundef %455, ptr noundef %456, ptr noundef %457, ptr noundef %458, ptr noundef %459, ptr noundef %460, i32 noundef %463, ptr noundef %464, i64 noundef %465)
  %467 = icmp ne i32 %466, 0
  br i1 %467, label %470, label %468

468:                                              ; preds = %453
  %469 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 1024, ptr %469, align 4, !tbaa !9
  br label %588

470:                                              ; preds = %453
  %471 = load i32, ptr %41, align 4, !tbaa !9
  %472 = icmp ne i32 %471, 0
  br i1 %472, label %473, label %482

473:                                              ; preds = %470
  %474 = load ptr, ptr %29, align 8, !tbaa !5
  %475 = load ptr, ptr %10, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.ffc_params_st, ptr %475, i32 0, i32 2
  %477 = load ptr, ptr %476, align 8, !tbaa !22
  %478 = call i32 @BN_cmp(ptr noundef %474, ptr noundef %477)
  %479 = icmp ne i32 %478, 0
  br i1 %479, label %480, label %482

480:                                              ; preds = %473
  %481 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 32768, ptr %481, align 4, !tbaa !9
  br label %588

482:                                              ; preds = %473, %470
  br label %499

483:                                              ; preds = %448, %445
  %484 = load i32, ptr %41, align 4, !tbaa !9
  %485 = icmp ne i32 %484, 0
  br i1 %485, label %498, label %486

486:                                              ; preds = %483
  %487 = load ptr, ptr %38, align 8, !tbaa !5
  %488 = load ptr, ptr %32, align 8, !tbaa !5
  %489 = load ptr, ptr %29, align 8, !tbaa !5
  %490 = load ptr, ptr %25, align 8, !tbaa !5
  %491 = load ptr, ptr %31, align 8, !tbaa !5
  %492 = load ptr, ptr %27, align 8, !tbaa !5
  %493 = load ptr, ptr %26, align 8, !tbaa !5
  %494 = call i32 @generate_unverifiable_g(ptr noundef %487, ptr noundef %488, ptr noundef %489, ptr noundef %490, ptr noundef %491, ptr noundef %492, ptr noundef %493, ptr noundef %37)
  %495 = icmp ne i32 %494, 0
  br i1 %495, label %497, label %496

496:                                              ; preds = %486
  br label %588

497:                                              ; preds = %486
  br label %498

498:                                              ; preds = %497, %483
  br label %499

499:                                              ; preds = %498, %482
  %500 = load ptr, ptr %16, align 8, !tbaa !5
  %501 = call i32 @BN_GENCB_call(ptr noundef %500, i32 noundef 3, i32 noundef 1)
  %502 = icmp ne i32 %501, 0
  br i1 %502, label %504, label %503

503:                                              ; preds = %499
  br label %588

504:                                              ; preds = %499
  %505 = load i32, ptr %41, align 4, !tbaa !9
  %506 = icmp ne i32 %505, 0
  br i1 %506, label %577, label %507

507:                                              ; preds = %504
  %508 = load ptr, ptr %31, align 8, !tbaa !5
  %509 = load ptr, ptr %10, align 8, !tbaa !5
  %510 = getelementptr inbounds %struct.ffc_params_st, ptr %509, i32 0, i32 0
  %511 = load ptr, ptr %510, align 8, !tbaa !19
  %512 = icmp ne ptr %508, %511
  br i1 %512, label %513, label %521

513:                                              ; preds = %507
  %514 = load ptr, ptr %10, align 8, !tbaa !5
  %515 = getelementptr inbounds %struct.ffc_params_st, ptr %514, i32 0, i32 0
  %516 = load ptr, ptr %515, align 8, !tbaa !19
  call void @BN_free(ptr noundef %516)
  %517 = load ptr, ptr %31, align 8, !tbaa !5
  %518 = call ptr @BN_dup(ptr noundef %517)
  %519 = load ptr, ptr %10, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.ffc_params_st, ptr %519, i32 0, i32 0
  store ptr %518, ptr %520, align 8, !tbaa !19
  br label %521

521:                                              ; preds = %513, %507
  %522 = load ptr, ptr %30, align 8, !tbaa !5
  %523 = load ptr, ptr %10, align 8, !tbaa !5
  %524 = getelementptr inbounds %struct.ffc_params_st, ptr %523, i32 0, i32 1
  %525 = load ptr, ptr %524, align 8, !tbaa !20
  %526 = icmp ne ptr %522, %525
  br i1 %526, label %527, label %535

527:                                              ; preds = %521
  %528 = load ptr, ptr %10, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.ffc_params_st, ptr %528, i32 0, i32 1
  %530 = load ptr, ptr %529, align 8, !tbaa !20
  call void @BN_free(ptr noundef %530)
  %531 = load ptr, ptr %30, align 8, !tbaa !5
  %532 = call ptr @BN_dup(ptr noundef %531)
  %533 = load ptr, ptr %10, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.ffc_params_st, ptr %533, i32 0, i32 1
  store ptr %532, ptr %534, align 8, !tbaa !20
  br label %535

535:                                              ; preds = %527, %521
  %536 = load ptr, ptr %29, align 8, !tbaa !5
  %537 = load ptr, ptr %10, align 8, !tbaa !5
  %538 = getelementptr inbounds %struct.ffc_params_st, ptr %537, i32 0, i32 2
  %539 = load ptr, ptr %538, align 8, !tbaa !22
  %540 = icmp ne ptr %536, %539
  br i1 %540, label %541, label %549

541:                                              ; preds = %535
  %542 = load ptr, ptr %10, align 8, !tbaa !5
  %543 = getelementptr inbounds %struct.ffc_params_st, ptr %542, i32 0, i32 2
  %544 = load ptr, ptr %543, align 8, !tbaa !22
  call void @BN_free(ptr noundef %544)
  %545 = load ptr, ptr %29, align 8, !tbaa !5
  %546 = call ptr @BN_dup(ptr noundef %545)
  %547 = load ptr, ptr %10, align 8, !tbaa !5
  %548 = getelementptr inbounds %struct.ffc_params_st, ptr %547, i32 0, i32 2
  store ptr %546, ptr %548, align 8, !tbaa !22
  br label %549

549:                                              ; preds = %541, %535
  %550 = load ptr, ptr %10, align 8, !tbaa !5
  %551 = getelementptr inbounds %struct.ffc_params_st, ptr %550, i32 0, i32 0
  %552 = load ptr, ptr %551, align 8, !tbaa !19
  %553 = icmp eq ptr %552, null
  br i1 %553, label %564, label %554

554:                                              ; preds = %549
  %555 = load ptr, ptr %10, align 8, !tbaa !5
  %556 = getelementptr inbounds %struct.ffc_params_st, ptr %555, i32 0, i32 1
  %557 = load ptr, ptr %556, align 8, !tbaa !20
  %558 = icmp eq ptr %557, null
  br i1 %558, label %564, label %559

559:                                              ; preds = %554
  %560 = load ptr, ptr %10, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct.ffc_params_st, ptr %560, i32 0, i32 2
  %562 = load ptr, ptr %561, align 8, !tbaa !22
  %563 = icmp eq ptr %562, null
  br i1 %563, label %564, label %565

564:                                              ; preds = %559, %554, %549
  br label %588

565:                                              ; preds = %559
  %566 = load ptr, ptr %10, align 8, !tbaa !5
  %567 = load ptr, ptr %18, align 8, !tbaa !5
  %568 = load i64, ptr %24, align 8, !tbaa !11
  %569 = load i32, ptr %22, align 4, !tbaa !9
  %570 = call i32 @ossl_ffc_params_set_validate_params(ptr noundef %566, ptr noundef %567, i64 noundef %568, i32 noundef %569)
  %571 = icmp ne i32 %570, 0
  br i1 %571, label %573, label %572

572:                                              ; preds = %565
  br label %588

573:                                              ; preds = %565
  %574 = load i32, ptr %37, align 4, !tbaa !9
  %575 = load ptr, ptr %10, align 8, !tbaa !5
  %576 = getelementptr inbounds %struct.ffc_params_st, ptr %575, i32 0, i32 9
  store i32 %574, ptr %576, align 4, !tbaa !24
  br label %577

577:                                              ; preds = %573, %504
  br label %578

578:                                              ; preds = %577, %401
  %579 = load i32, ptr %42, align 4, !tbaa !9
  %580 = and i32 %579, 2
  %581 = icmp ne i32 %580, 0
  br i1 %581, label %582, label %586

582:                                              ; preds = %578
  %583 = load i32, ptr %36, align 4, !tbaa !9
  %584 = icmp eq i32 %583, 0
  br i1 %584, label %585, label %586

585:                                              ; preds = %582
  store i32 2, ptr %17, align 4, !tbaa !9
  br label %587

586:                                              ; preds = %582, %578
  store i32 1, ptr %17, align 4, !tbaa !9
  br label %587

587:                                              ; preds = %586, %585
  br label %588

588:                                              ; preds = %587, %572, %564, %503, %496, %480, %468, %444, %430, %413, %406, %396, %381, %374, %367, %343, %338, %332, %321, %302, %281, %266, %259, %252, %245, %239, %212, %200, %185, %151, %136, %131, %125, %103, %97, %85
  %589 = load ptr, ptr %18, align 8, !tbaa !5
  %590 = load ptr, ptr %10, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct.ffc_params_st, ptr %590, i32 0, i32 4
  %592 = load ptr, ptr %591, align 8, !tbaa !18
  %593 = icmp ne ptr %589, %592
  br i1 %593, label %594, label %596

594:                                              ; preds = %588
  %595 = load ptr, ptr %18, align 8, !tbaa !5
  call void @CRYPTO_free(ptr noundef %595, ptr noundef @.str, i32 noundef 797)
  br label %596

596:                                              ; preds = %594, %588
  %597 = load ptr, ptr %19, align 8, !tbaa !5
  call void @CRYPTO_free(ptr noundef %597, ptr noundef @.str, i32 noundef 798)
  %598 = load ptr, ptr %38, align 8, !tbaa !5
  %599 = icmp ne ptr %598, null
  br i1 %599, label %600, label %602

600:                                              ; preds = %596
  %601 = load ptr, ptr %38, align 8, !tbaa !5
  call void @BN_CTX_end(ptr noundef %601)
  br label %602

602:                                              ; preds = %600, %596
  %603 = load ptr, ptr %38, align 8, !tbaa !5
  call void @BN_CTX_free(ptr noundef %603)
  %604 = load ptr, ptr %32, align 8, !tbaa !5
  call void @BN_MONT_CTX_free(ptr noundef %604)
  %605 = load ptr, ptr %39, align 8, !tbaa !5
  call void @EVP_MD_CTX_free(ptr noundef %605)
  %606 = load ptr, ptr %40, align 8, !tbaa !5
  call void @EVP_MD_free(ptr noundef %606)
  %607 = load i32, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  ret i32 %607
}

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

declare ptr @EVP_MD_fetch(ptr noundef, ptr noundef, ptr noundef) #2

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

declare i32 @EVP_MD_get_size(ptr noundef) #2

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

declare ptr @EVP_MD_CTX_new() #2

declare ptr @BN_CTX_new_ex(ptr noundef) #2

declare void @BN_CTX_start(ptr noundef) #2

declare ptr @BN_CTX_get(ptr noundef) #2

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

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

declare ptr @BN_value_one() #2

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

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

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

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

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

declare ptr @BN_MONT_CTX_new() #2

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

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

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

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

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

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

declare void @BN_free(ptr noundef) #2

declare ptr @BN_dup(ptr noundef) #2

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

declare void @CRYPTO_free(ptr noundef, ptr noundef, i32 noundef) #2

declare void @BN_CTX_end(ptr noundef) #2

declare void @BN_CTX_free(ptr noundef) #2

declare void @BN_MONT_CTX_free(ptr noundef) #2

declare void @EVP_MD_CTX_free(ptr noundef) #2

declare void @EVP_MD_free(ptr noundef) #2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!14, !10, i64 64}
!14 = !{!"ffc_params_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !6, i64 72, !6, i64 80, !10, i64 88}
!15 = !{!14, !6, i64 72}
!16 = !{!14, !6, i64 80}
!17 = !{!14, !12, i64 40}
!18 = !{!14, !6, i64 32}
!19 = !{!14, !6, i64 0}
!20 = !{!14, !6, i64 8}
!21 = !{!14, !10, i64 48}
!22 = !{!14, !6, i64 16}
!23 = !{!14, !10, i64 56}
!24 = !{!14, !10, i64 60}


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

@.str = external hidden unnamed_addr constant [82 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 3) i32 @ossl_ffc_params_FIPS186_4_gen_verify(ptr noundef %0, ptr noundef %1, i32 noundef %2, i32 noundef %3, i64 noundef %4, i64 noundef %5, ptr noundef %6, ptr noundef %7) local_unnamed_addr #0 {
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #4
  store i32 0, ptr %9, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #4
  store i32 0, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #4
  store i32 0, ptr %11, align 4, !tbaa !5
  %12 = icmp eq i32 %2, 0
  %13 = zext i1 %12 to i32
  br i1 %12, label %14, label %17

14:                                               ; preds = %8
  %15 = getelementptr inbounds i8, ptr %1, i64 64
  %16 = load i32, ptr %15, align 8, !tbaa !9
  br label %17

17:                                               ; preds = %8, %14
  %18 = phi i32 [ %16, %14 ], [ 0, %8 ]
  store i32 0, ptr %6, align 4, !tbaa !5
  %19 = getelementptr inbounds i8, ptr %1, i64 72
  %20 = load ptr, ptr %19, align 8, !tbaa !13
  %.not = icmp eq ptr %20, null
  br i1 %.not, label %21, label %28

21:                                               ; preds = %17
  %22 = icmp eq i64 %5, 0
  %23 = icmp ugt i64 %4, 2047
  %24 = select i1 %23, i64 256, i64 160
  %.0 = select i1 %22, i64 %24, i64 %5
  %25 = tail call ptr @default_mdname(i64 noundef %.0)
  %26 = icmp eq ptr %25, null
  br i1 %26, label %27, label %28

27:                                               ; preds = %21
  store i32 32, ptr %6, align 4, !tbaa !5
  br label %.loopexit

28:                                               ; preds = %21, %17
  %.sink = phi ptr [ %20, %17 ], [ %25, %21 ]
  %.1 = phi i64 [ %5, %17 ], [ %.0, %21 ]
  %29 = getelementptr inbounds i8, ptr %1, i64 80
  %30 = load ptr, ptr %29, align 8, !tbaa !14
  %31 = tail call ptr @EVP_MD_fetch(ptr noundef %0, ptr noundef nonnull %.sink, ptr noundef %30) #4
  %32 = icmp eq ptr %31, null
  br i1 %32, label %.loopexit, label %33

33:                                               ; preds = %28
  %34 = tail call i32 @EVP_MD_get_size(ptr noundef nonnull %31) #4
  %35 = icmp slt i32 %34, 1
  br i1 %35, label %.loopexit, label %36

36:                                               ; preds = %33
  %37 = icmp eq i64 %.1, 0
  %38 = shl i32 %34, 3
  %39 = zext nneg i32 %38 to i64
  %.2 = select i1 %37, i64 %39, i64 %.1
  %40 = lshr i64 %.2, 3
  %41 = trunc i64 %40 to i32
  %.not247 = icmp ult i64 %.2, %4
  br i1 %.not247, label %42, label %44

42:                                               ; preds = %36
  %43 = tail call i32 @ffc_validate_LN(i64 noundef %4, i64 noundef %.2, i32 noundef %3, i32 noundef %13)
  %.not248 = icmp eq i32 %43, 0
  br i1 %.not248, label %44, label %45

44:                                               ; preds = %42, %36
  store i32 131072, ptr %6, align 4, !tbaa !5
  br label %.loopexit

45:                                               ; preds = %42
  %46 = tail call ptr @EVP_MD_CTX_new() #4
  %47 = icmp eq ptr %46, null
  br i1 %47, label %.loopexit, label %48

48:                                               ; preds = %45
  %49 = tail call ptr @BN_CTX_new_ex(ptr noundef %0) #4
  %50 = icmp eq ptr %49, null
  br i1 %50, label %.loopexit, label %51

51:                                               ; preds = %48
  tail call void @BN_CTX_start(ptr noundef nonnull %49) #4
  %52 = tail call ptr @BN_CTX_get(ptr noundef nonnull %49) #4
  %53 = tail call ptr @BN_CTX_get(ptr noundef nonnull %49) #4
  %54 = tail call ptr @BN_CTX_get(ptr noundef nonnull %49) #4
  %55 = tail call ptr @BN_CTX_get(ptr noundef nonnull %49) #4
  %56 = tail call ptr @BN_CTX_get(ptr noundef nonnull %49) #4
  %57 = icmp eq ptr %56, null
  br i1 %57, label %.loopexit, label %58

58:                                               ; preds = %51
  %59 = getelementptr inbounds i8, ptr %1, i64 40
  %60 = load i64, ptr %59, align 8, !tbaa !15
  %61 = icmp eq i64 %60, 0
  %62 = zext nneg i32 %34 to i64
  %spec.select = select i1 %61, i64 %62, i64 %60
  %63 = getelementptr inbounds i8, ptr %1, i64 32
  %64 = load ptr, ptr %63, align 8, !tbaa !16
  %.not249 = icmp eq ptr %64, null
  br i1 %12, label %72, label %65

65:                                               ; preds = %58
  %66 = load ptr, ptr %1, align 8, !tbaa !17
  %67 = icmp eq ptr %66, null
  %68 = getelementptr inbounds i8, ptr %1, i64 8
  %69 = load ptr, ptr %68, align 8, !tbaa !18
  %70 = icmp ne ptr %69, null
  %.not250 = xor i1 %67, %70
  br i1 %.not250, label %._crit_edge285, label %71

._crit_edge285:                                   ; preds = %65
  %.pre286 = and i32 %18, 1
  br label %87

71:                                               ; preds = %65
  store i32 2048, ptr %6, align 4, !tbaa !5
  br label %.loopexit

72:                                               ; preds = %58
  %73 = and i32 %18, 1
  %.not251 = icmp eq i32 %73, 0
  br i1 %.not251, label %80, label %74

74:                                               ; preds = %72
  br i1 %.not249, label %79, label %75

75:                                               ; preds = %74
  %76 = getelementptr inbounds i8, ptr %1, i64 48
  %77 = load i32, ptr %76, align 8, !tbaa !19
  %78 = icmp slt i32 %77, 0
  br i1 %78, label %79, label %80

79:                                               ; preds = %75, %74
  store i32 512, ptr %6, align 4, !tbaa !5
  br label %.loopexit

80:                                               ; preds = %75, %72
  %81 = and i32 %18, 2
  %.not252 = icmp eq i32 %81, 0
  br i1 %.not252, label %87, label %82

82:                                               ; preds = %80
  %83 = getelementptr inbounds i8, ptr %1, i64 16
  %84 = load ptr, ptr %83, align 8, !tbaa !20
  %85 = icmp eq ptr %84, null
  br i1 %85, label %86, label %87

86:                                               ; preds = %82
  store i32 1024, ptr %6, align 4, !tbaa !5
  br label %.loopexit

87:                                               ; preds = %._crit_edge285, %80, %82
  %.pre-phi = phi i32 [ %.pre286, %._crit_edge285 ], [ %73, %80 ], [ %73, %82 ]
  %88 = load ptr, ptr %1, align 8, !tbaa !17
  %.not253 = icmp ne ptr %88, null
  %89 = icmp eq i32 %.pre-phi, 0
  %or.cond280 = select i1 %.not253, i1 %89, i1 false
  br i1 %or.cond280, label %90, label %93

90:                                               ; preds = %87
  %91 = getelementptr inbounds i8, ptr %1, i64 8
  %92 = load ptr, ptr %91, align 8, !tbaa !18
  br label %163

93:                                               ; preds = %87
  %94 = tail call ptr @BN_CTX_get(ptr noundef nonnull %49) #4
  %95 = tail call ptr @BN_CTX_get(ptr noundef nonnull %49) #4
  %96 = icmp eq ptr %95, null
  br i1 %96, label %.loopexit, label %97

97:                                               ; preds = %93
  %98 = shl i64 %spec.select, 3
  %99 = icmp ult i64 %98, %.2
  br i1 %99, label %100, label %101

100:                                              ; preds = %97
  store i32 262144, ptr %6, align 4, !tbaa !5
  br label %.loopexit

101:                                              ; preds = %97
  %102 = tail call ptr @CRYPTO_malloc(i64 noundef %spec.select, ptr noundef nonnull @.str, i32 noundef 646) #4
  %103 = icmp eq ptr %102, null
  br i1 %103, label %.loopexit, label %104

104:                                              ; preds = %101
  br i1 %.not249, label %105, label %112

105:                                              ; preds = %104
  br i1 %12, label %106, label %107

106:                                              ; preds = %105
  store i32 512, ptr %6, align 4, !tbaa !5
  br label %.loopexit

107:                                              ; preds = %105
  %108 = tail call ptr @CRYPTO_malloc(i64 noundef %spec.select, ptr noundef nonnull @.str, i32 noundef 657) #4
  %109 = icmp eq ptr %108, null
  br i1 %109, label %.loopexit, label %.thread

.thread:                                          ; preds = %107
  %.tr282 = trunc i64 %4 to i32
  %110 = shl i32 %.tr282, 2
  %111 = add i32 %110, -1
  br label %120

112:                                              ; preds = %104
  %.tr = trunc i64 %4 to i32
  %113 = shl i32 %.tr, 2
  %114 = add i32 %113, -1
  br i1 %12, label %115, label %120

115:                                              ; preds = %112
  %116 = getelementptr inbounds i8, ptr %1, i64 48
  %117 = load i32, ptr %116, align 8, !tbaa !19
  %118 = icmp sgt i32 %117, %114
  br i1 %118, label %119, label %120

119:                                              ; preds = %115
  store i32 4096, ptr %6, align 4, !tbaa !5
  br label %.loopexit

120:                                              ; preds = %.thread, %115, %112
  %.tr284 = phi i32 [ %.tr, %112 ], [ %.tr, %115 ], [ %.tr282, %.thread ]
  %.1203283 = phi ptr [ %64, %112 ], [ %64, %115 ], [ %108, %.thread ]
  %.0218 = phi i32 [ %114, %112 ], [ %117, %115 ], [ %111, %.thread ]
  %121 = add i64 %4, -1
  %122 = sext i32 %38 to i64
  %123 = udiv i64 %121, %122
  %124 = trunc i64 %123 to i32
  %125 = tail call ptr @BN_value_one() #4
  %126 = trunc i64 %121 to i32
  %127 = tail call i32 @BN_lshift(ptr noundef %55, ptr noundef %125, i32 noundef %126) #4
  %.not254 = icmp eq i32 %127, 0
  br i1 %.not254, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %120
  %128 = getelementptr inbounds i8, ptr %1, i64 8
  %.pre = load ptr, ptr %63, align 8, !tbaa !16
  br label %129

129:                                              ; preds = %.preheader, %148
  %130 = phi ptr [ %.pre, %.preheader ], [ %149, %148 ]
  %131 = icmp ne ptr %.1203283, %130
  %132 = zext i1 %131 to i32
  %133 = call i32 @generate_q_fips186_4(ptr noundef %49, ptr noundef nonnull %95, ptr noundef %31, i32 noundef %41, ptr noundef nonnull %.1203283, i64 noundef %spec.select, i32 noundef %132, ptr noundef nonnull %10, ptr noundef nonnull %6, ptr noundef %7)
  %.not255 = icmp eq i32 %133, 0
  br i1 %.not255, label %.loopexit, label %134

134:                                              ; preds = %129
  br i1 %12, label %135, label %139

135:                                              ; preds = %134
  %136 = load ptr, ptr %128, align 8, !tbaa !18
  %137 = call i32 @BN_cmp(ptr noundef nonnull %95, ptr noundef %136) #4
  %.not256 = icmp eq i32 %137, 0
  br i1 %.not256, label %139, label %138

138:                                              ; preds = %135
  store i32 16384, ptr %6, align 4, !tbaa !5
  br label %.loopexit

139:                                              ; preds = %135, %134
  %140 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 0) #4
  %.not257 = icmp eq i32 %140, 0
  br i1 %.not257, label %.loopexit, label %141

141:                                              ; preds = %139
  %142 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 0) #4
  %.not258 = icmp eq i32 %142, 0
  br i1 %.not258, label %.loopexit, label %143

143:                                              ; preds = %141
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %102, ptr nonnull align 1 %.1203283, i64 %spec.select, i1 false)
  %144 = call i32 @generate_p(ptr noundef %49, ptr noundef %31, i32 noundef %.0218, i32 noundef %124, ptr noundef nonnull %102, i64 noundef %spec.select, ptr noundef nonnull %95, ptr noundef %94, i32 noundef %.tr284, ptr noundef %7, ptr noundef nonnull %9, ptr noundef nonnull %6)
  %145 = icmp sgt i32 %144, 0
  br i1 %145, label %152, label %146

146:                                              ; preds = %143
  %147 = icmp slt i32 %144, 0
  br i1 %147, label %.loopexit, label %148

148:                                              ; preds = %146
  %149 = load ptr, ptr %63, align 8, !tbaa !16
  %150 = icmp eq ptr %.1203283, %149
  br i1 %150, label %151, label %129

151:                                              ; preds = %148
  store i32 1, ptr %6, align 4, !tbaa !5
  br label %.loopexit

152:                                              ; preds = %143
  %153 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 1) #4
  %.not259 = icmp eq i32 %153, 0
  br i1 %.not259, label %.loopexit, label %154

154:                                              ; preds = %152
  br i1 %12, label %155, label %160

155:                                              ; preds = %154
  %156 = load i32, ptr %9, align 4, !tbaa !5
  %.not260 = icmp eq i32 %156, %.0218
  br i1 %.not260, label %157, label %.loopexit

157:                                              ; preds = %155
  %158 = load ptr, ptr %1, align 8, !tbaa !17
  %159 = call i32 @BN_cmp(ptr noundef %94, ptr noundef %158) #4
  %.not261 = icmp eq i32 %159, 0
  br i1 %.not261, label %160, label %.loopexit

160:                                              ; preds = %157, %154
  %161 = and i32 %18, 3
  %162 = icmp eq i32 %161, 1
  br i1 %162, label %._crit_edge, label %163

163:                                              ; preds = %160, %90
  %.0217 = phi ptr [ %92, %90 ], [ %95, %160 ]
  %.0216 = phi ptr [ %88, %90 ], [ %94, %160 ]
  %.0211 = phi ptr [ null, %90 ], [ %102, %160 ]
  %.2204 = phi ptr [ %64, %90 ], [ %.1203283, %160 ]
  %164 = call ptr @BN_MONT_CTX_new() #4
  %165 = icmp eq ptr %164, null
  br i1 %165, label %.loopexit, label %166

166:                                              ; preds = %163
  %167 = call i32 @BN_MONT_CTX_set(ptr noundef nonnull %164, ptr noundef %.0216, ptr noundef %49) #4
  %.not262 = icmp eq i32 %167, 0
  br i1 %.not262, label %.loopexit, label %168

168:                                              ; preds = %166
  %169 = and i32 %18, 2
  %.not263 = icmp eq i32 %169, 0
  br i1 %.not263, label %174, label %170

170:                                              ; preds = %168
  %171 = getelementptr inbounds i8, ptr %1, i64 16
  %172 = load ptr, ptr %171, align 8, !tbaa !20
  %173 = call i32 @ossl_ffc_params_validate_unverifiable_g(ptr noundef %49, ptr noundef nonnull %164, ptr noundef %.0216, ptr noundef %.0217, ptr noundef %172, ptr noundef nonnull %56, ptr noundef nonnull %6) #4
  %.not264 = icmp eq i32 %173, 0
  br i1 %.not264, label %.loopexit, label %174

174:                                              ; preds = %170, %168
  %175 = call ptr @BN_value_one() #4
  %176 = call i32 @BN_sub(ptr noundef %53, ptr noundef %.0216, ptr noundef %175) #4
  %.not265 = icmp eq i32 %176, 0
  br i1 %.not265, label %.loopexit, label %177

177:                                              ; preds = %174
  %178 = call i32 @BN_div(ptr noundef %54, ptr noundef null, ptr noundef %53, ptr noundef %.0217, ptr noundef %49) #4
  %.not266 = icmp eq i32 %178, 0
  br i1 %.not266, label %.loopexit, label %179

179:                                              ; preds = %177
  %.not267 = icmp eq ptr %.2204, null
  br i1 %.not267, label %192, label %180

180:                                              ; preds = %179
  %181 = getelementptr inbounds i8, ptr %1, i64 56
  %182 = load i32, ptr %181, align 8, !tbaa !21
  %.not268 = icmp eq i32 %182, -1
  br i1 %.not268, label %192, label %183

183:                                              ; preds = %180
  %184 = call i32 @generate_canonical_g(ptr noundef %49, ptr noundef nonnull %164, ptr noundef %31, ptr noundef %52, ptr noundef nonnull %56, ptr noundef %.0216, ptr noundef %54, i32 noundef %182, ptr noundef nonnull %.2204, i64 noundef %spec.select)
  %.not270 = icmp eq i32 %184, 0
  br i1 %.not270, label %185, label %186

185:                                              ; preds = %183
  store i32 1024, ptr %6, align 4, !tbaa !5
  br label %.loopexit

186:                                              ; preds = %183
  br i1 %12, label %187, label %195

187:                                              ; preds = %186
  %188 = getelementptr inbounds i8, ptr %1, i64 16
  %189 = load ptr, ptr %188, align 8, !tbaa !20
  %190 = call i32 @BN_cmp(ptr noundef %52, ptr noundef %189) #4
  %.not271 = icmp eq i32 %190, 0
  br i1 %.not271, label %195, label %191

191:                                              ; preds = %187
  store i32 32768, ptr %6, align 4, !tbaa !5
  br label %.loopexit

192:                                              ; preds = %180, %179
  br i1 %12, label %195, label %193

193:                                              ; preds = %192
  %194 = call i32 @generate_unverifiable_g(ptr noundef %49, ptr noundef nonnull %164, ptr noundef %52, ptr noundef nonnull %56, ptr noundef %.0216, ptr noundef %54, ptr noundef %53, ptr noundef nonnull %11)
  %.not269 = icmp eq i32 %194, 0
  br i1 %.not269, label %.loopexit, label %195

195:                                              ; preds = %192, %193, %186, %187
  %.0209 = phi i32 [ 1, %187 ], [ 1, %186 ], [ 0, %192 ], [ 0, %193 ]
  %196 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 1) #4
  %.not272 = icmp eq i32 %196, 0
  br i1 %.not272, label %.loopexit, label %197

197:                                              ; preds = %195
  br i1 %12, label %._crit_edge, label %198

198:                                              ; preds = %197
  %199 = load ptr, ptr %1, align 8, !tbaa !17
  %.not273 = icmp eq ptr %.0216, %199
  br i1 %.not273, label %202, label %200

200:                                              ; preds = %198
  call void @BN_free(ptr noundef %199) #4
  %201 = call ptr @BN_dup(ptr noundef %.0216) #4
  store ptr %201, ptr %1, align 8, !tbaa !17
  br label %202

202:                                              ; preds = %200, %198
  %203 = getelementptr inbounds i8, ptr %1, i64 8
  %204 = load ptr, ptr %203, align 8, !tbaa !18
  %.not274 = icmp eq ptr %.0217, %204
  br i1 %.not274, label %207, label %205

205:                                              ; preds = %202
  call void @BN_free(ptr noundef %204) #4
  %206 = call ptr @BN_dup(ptr noundef %.0217) #4
  store ptr %206, ptr %203, align 8, !tbaa !18
  br label %207

207:                                              ; preds = %205, %202
  %208 = getelementptr inbounds i8, ptr %1, i64 16
  %209 = load ptr, ptr %208, align 8, !tbaa !20
  %.not275 = icmp eq ptr %52, %209
  br i1 %.not275, label %212, label %210

210:                                              ; preds = %207
  call void @BN_free(ptr noundef %209) #4
  %211 = call ptr @BN_dup(ptr noundef %52) #4
  store ptr %211, ptr %208, align 8, !tbaa !20
  br label %212

212:                                              ; preds = %210, %207
  %213 = phi ptr [ %211, %210 ], [ %52, %207 ]
  %214 = load ptr, ptr %1, align 8, !tbaa !17
  %215 = icmp eq ptr %214, null
  br i1 %215, label %.loopexit, label %216

216:                                              ; preds = %212
  %217 = load ptr, ptr %203, align 8, !tbaa !18
  %218 = icmp eq ptr %217, null
  %219 = icmp eq ptr %213, null
  %or.cond291 = select i1 %218, i1 true, i1 %219
  br i1 %or.cond291, label %.loopexit, label %220

220:                                              ; preds = %216
  %221 = load i32, ptr %9, align 4, !tbaa !5
  %222 = call i32 @ossl_ffc_params_set_validate_params(ptr noundef nonnull %1, ptr noundef %.2204, i64 noundef %spec.select, i32 noundef %221) #4
  %.not276 = icmp eq i32 %222, 0
  br i1 %.not276, label %.loopexit, label %223

223:                                              ; preds = %220
  %224 = load i32, ptr %11, align 4, !tbaa !5
  %225 = getelementptr inbounds i8, ptr %1, i64 60
  store i32 %224, ptr %225, align 4, !tbaa !22
  br label %._crit_edge

._crit_edge:                                      ; preds = %160, %197, %223
  %.pre-phi288 = phi i32 [ %169, %197 ], [ %169, %223 ], [ 0, %160 ]
  %.0214 = phi ptr [ %164, %197 ], [ %164, %223 ], [ null, %160 ]
  %.1212 = phi ptr [ %.0211, %197 ], [ %.0211, %223 ], [ %102, %160 ]
  %.1210 = phi i32 [ %.0209, %197 ], [ %.0209, %223 ], [ 0, %160 ]
  %.3 = phi ptr [ %.2204, %197 ], [ %.2204, %223 ], [ %.1203283, %160 ]
  %226 = icmp ne i32 %.pre-phi288, 0
  %227 = icmp eq i32 %.1210, 0
  %or.cond = and i1 %226, %227
  %. = select i1 %or.cond, i32 2, i32 1
  br label %.loopexit

.loopexit:                                        ; preds = %146, %141, %139, %129, %._crit_edge, %220, %212, %216, %195, %193, %174, %177, %170, %166, %163, %155, %157, %152, %120, %107, %101, %93, %51, %48, %45, %33, %28, %191, %185, %151, %138, %119, %106, %100, %86, %79, %71, %44, %27
  %.1215 = phi ptr [ null, %28 ], [ null, %33 ], [ null, %44 ], [ null, %45 ], [ null, %48 ], [ null, %51 ], [ null, %79 ], [ null, %86 ], [ null, %163 ], [ %164, %191 ], [ %164, %212 ], [ %164, %216 ], [ %164, %220 ], [ %164, %195 ], [ %164, %185 ], [ %164, %193 ], [ %164, %177 ], [ %164, %174 ], [ %164, %170 ], [ %164, %166 ], [ null, %93 ], [ null, %100 ], [ null, %101 ], [ null, %106 ], [ null, %107 ], [ null, %119 ], [ null, %138 ], [ null, %155 ], [ null, %157 ], [ null, %152 ], [ null, %151 ], [ null, %120 ], [ null, %71 ], [ null, %27 ], [ %.0214, %._crit_edge ], [ null, %129 ], [ null, %139 ], [ null, %141 ], [ null, %146 ]
  %.2213 = phi ptr [ null, %28 ], [ null, %33 ], [ null, %44 ], [ null, %45 ], [ null, %48 ], [ null, %51 ], [ null, %79 ], [ null, %86 ], [ %.0211, %163 ], [ %.0211, %191 ], [ %.0211, %212 ], [ %.0211, %216 ], [ %.0211, %220 ], [ %.0211, %195 ], [ %.0211, %185 ], [ %.0211, %193 ], [ %.0211, %177 ], [ %.0211, %174 ], [ %.0211, %170 ], [ %.0211, %166 ], [ null, %93 ], [ null, %100 ], [ null, %101 ], [ %102, %106 ], [ %102, %107 ], [ %102, %119 ], [ %102, %138 ], [ %102, %155 ], [ %102, %157 ], [ %102, %152 ], [ %102, %151 ], [ %102, %120 ], [ null, %71 ], [ null, %27 ], [ %.1212, %._crit_edge ], [ %102, %129 ], [ %102, %139 ], [ %102, %141 ], [ %102, %146 ]
  %.0208 = phi ptr [ null, %28 ], [ null, %33 ], [ null, %44 ], [ null, %45 ], [ null, %48 ], [ %49, %51 ], [ %49, %79 ], [ %49, %86 ], [ %49, %163 ], [ %49, %191 ], [ %49, %212 ], [ %49, %216 ], [ %49, %220 ], [ %49, %195 ], [ %49, %185 ], [ %49, %193 ], [ %49, %177 ], [ %49, %174 ], [ %49, %170 ], [ %49, %166 ], [ %49, %93 ], [ %49, %100 ], [ %49, %101 ], [ %49, %106 ], [ %49, %107 ], [ %49, %119 ], [ %49, %138 ], [ %49, %155 ], [ %49, %157 ], [ %49, %152 ], [ %49, %151 ], [ %49, %120 ], [ %49, %71 ], [ null, %27 ], [ %49, %._crit_edge ], [ %49, %129 ], [ %49, %139 ], [ %49, %141 ], [ %49, %146 ]
  %.0207 = phi ptr [ null, %28 ], [ null, %33 ], [ null, %44 ], [ null, %45 ], [ %46, %48 ], [ %46, %51 ], [ %46, %79 ], [ %46, %86 ], [ %46, %163 ], [ %46, %191 ], [ %46, %212 ], [ %46, %216 ], [ %46, %220 ], [ %46, %195 ], [ %46, %185 ], [ %46, %193 ], [ %46, %177 ], [ %46, %174 ], [ %46, %170 ], [ %46, %166 ], [ %46, %93 ], [ %46, %100 ], [ %46, %101 ], [ %46, %106 ], [ %46, %107 ], [ %46, %119 ], [ %46, %138 ], [ %46, %155 ], [ %46, %157 ], [ %46, %152 ], [ %46, %151 ], [ %46, %120 ], [ %46, %71 ], [ null, %27 ], [ %46, %._crit_edge ], [ %46, %129 ], [ %46, %139 ], [ %46, %141 ], [ %46, %146 ]
  %.1206 = phi ptr [ null, %28 ], [ %31, %33 ], [ %31, %44 ], [ %31, %45 ], [ %31, %48 ], [ %31, %51 ], [ %31, %79 ], [ %31, %86 ], [ %31, %163 ], [ %31, %191 ], [ %31, %212 ], [ %31, %216 ], [ %31, %220 ], [ %31, %195 ], [ %31, %185 ], [ %31, %193 ], [ %31, %177 ], [ %31, %174 ], [ %31, %170 ], [ %31, %166 ], [ %31, %93 ], [ %31, %100 ], [ %31, %101 ], [ %31, %106 ], [ %31, %107 ], [ %31, %119 ], [ %31, %138 ], [ %31, %155 ], [ %31, %157 ], [ %31, %152 ], [ %31, %151 ], [ %31, %120 ], [ %31, %71 ], [ null, %27 ], [ %31, %._crit_edge ], [ %31, %129 ], [ %31, %139 ], [ %31, %141 ], [ %31, %146 ]
  %.4 = phi ptr [ null, %28 ], [ null, %33 ], [ null, %44 ], [ null, %45 ], [ null, %48 ], [ null, %51 ], [ %64, %79 ], [ %64, %86 ], [ %.2204, %163 ], [ %.2204, %191 ], [ %.2204, %212 ], [ %.2204, %216 ], [ %.2204, %220 ], [ %.2204, %195 ], [ %.2204, %185 ], [ %.2204, %193 ], [ %.2204, %177 ], [ %.2204, %174 ], [ %.2204, %170 ], [ %.2204, %166 ], [ %64, %93 ], [ %64, %100 ], [ %64, %101 ], [ null, %106 ], [ null, %107 ], [ %64, %119 ], [ %.1203283, %138 ], [ %.1203283, %155 ], [ %.1203283, %157 ], [ %.1203283, %152 ], [ %.1203283, %151 ], [ %.1203283, %120 ], [ %64, %71 ], [ null, %27 ], [ %.3, %._crit_edge ], [ %.1203283, %129 ], [ %.1203283, %139 ], [ %.1203283, %141 ], [ %.1203283, %146 ]
  %.0201 = phi i32 [ 0, %28 ], [ 0, %33 ], [ 0, %44 ], [ 0, %45 ], [ 0, %48 ], [ 0, %51 ], [ 0, %79 ], [ 0, %86 ], [ 0, %163 ], [ 0, %191 ], [ 0, %212 ], [ 0, %216 ], [ 0, %220 ], [ 0, %195 ], [ 0, %185 ], [ 0, %193 ], [ 0, %177 ], [ 0, %174 ], [ 0, %170 ], [ 0, %166 ], [ 0, %93 ], [ 0, %100 ], [ 0, %101 ], [ 0, %106 ], [ 0, %107 ], [ 0, %119 ], [ 0, %138 ], [ 0, %155 ], [ 0, %157 ], [ 0, %152 ], [ 0, %151 ], [ 0, %120 ], [ 0, %71 ], [ 0, %27 ], [ %., %._crit_edge ], [ 0, %129 ], [ 0, %139 ], [ 0, %141 ], [ 0, %146 ]
  %228 = getelementptr inbounds i8, ptr %1, i64 32
  %229 = load ptr, ptr %228, align 8, !tbaa !16
  %.not277 = icmp eq ptr %.4, %229
  br i1 %.not277, label %231, label %230

230:                                              ; preds = %.loopexit
  call void @CRYPTO_free(ptr noundef %.4, ptr noundef nonnull @.str, i32 noundef 797) #4
  br label %231

231:                                              ; preds = %230, %.loopexit
  call void @CRYPTO_free(ptr noundef %.2213, ptr noundef nonnull @.str, i32 noundef 798) #4
  %.not278 = icmp eq ptr %.0208, null
  br i1 %.not278, label %233, label %232

232:                                              ; preds = %231
  call void @BN_CTX_end(ptr noundef nonnull %.0208) #4
  br label %233

233:                                              ; preds = %232, %231
  call void @BN_CTX_free(ptr noundef %.0208) #4
  call void @BN_MONT_CTX_free(ptr noundef %.1215) #4
  call void @EVP_MD_CTX_free(ptr noundef %.0207) #4
  call void @EVP_MD_free(ptr noundef %.1206) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #4
  ret i32 %.0201
}

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

declare ptr @EVP_MD_fetch(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

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

declare i32 @EVP_MD_get_size(ptr noundef) local_unnamed_addr #2

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

declare ptr @EVP_MD_CTX_new() local_unnamed_addr #2

declare ptr @BN_CTX_new_ex(ptr noundef) local_unnamed_addr #2

declare void @BN_CTX_start(ptr noundef) local_unnamed_addr #2

declare ptr @BN_CTX_get(ptr noundef) local_unnamed_addr #2

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

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

declare ptr @BN_value_one() local_unnamed_addr #2

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

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

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

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

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

declare ptr @BN_MONT_CTX_new() local_unnamed_addr #2

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

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

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

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

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

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

declare void @BN_free(ptr noundef) local_unnamed_addr #2

declare ptr @BN_dup(ptr noundef) local_unnamed_addr #2

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

declare void @CRYPTO_free(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

declare void @BN_CTX_end(ptr noundef) local_unnamed_addr #2

declare void @BN_CTX_free(ptr noundef) local_unnamed_addr #2

declare void @BN_MONT_CTX_free(ptr noundef) local_unnamed_addr #2

declare void @EVP_MD_CTX_free(ptr noundef) local_unnamed_addr #2

declare void @EVP_MD_free(ptr 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

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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 64}
!10 = !{!"ffc_params_st", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !12, i64 40, !6, i64 48, !6, i64 52, !6, i64 56, !6, i64 60, !6, i64 64, !11, i64 72, !11, i64 80, !6, i64 88}
!11 = !{!"any pointer", !7, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!10, !11, i64 72}
!14 = !{!10, !11, i64 80}
!15 = !{!10, !12, i64 40}
!16 = !{!10, !11, i64 32}
!17 = !{!10, !11, i64 0}
!18 = !{!10, !11, i64 8}
!19 = !{!10, !6, i64 48}
!20 = !{!10, !11, i64 16}
!21 = !{!10, !6, i64 56}
!22 = !{!10, !6, i64 60}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass