; LLVM IR from openanolis/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 }

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

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

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

declare i32 @EVP_MD_get_size(ptr noundef) #1

declare ptr @BN_CTX_new_ex(ptr noundef) #1

declare void @BN_CTX_start(ptr noundef) #1

declare ptr @BN_CTX_get(ptr noundef) #1

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

declare ptr @BN_value_one() #1

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

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

; 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) #2

declare ptr @BN_MONT_CTX_new() #1

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

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

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

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

; 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) #2

declare void @BN_free(ptr noundef) #1

declare ptr @BN_dup(ptr noundef) #1

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

declare void @BN_CTX_end(ptr noundef) #1

declare void @BN_CTX_free(ptr noundef) #1

declare void @BN_MONT_CTX_free(ptr noundef) #1

declare void @EVP_MD_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

; Function Attrs: nounwind uwtable
define dso_local i32 @ossl_ffc_params_FIPS186_2_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) #2 {
  %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 [32 x i8], align 16
  %19 = alloca [32 x i8], align 16
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca i64, align 8
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca ptr, align 8
  %36 = alloca i32, align 4
  %37 = alloca ptr, align 8
  %38 = alloca i64, align 8
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = 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 32, ptr %18) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr %19) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  store ptr null, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  store ptr null, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  store ptr null, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  store ptr null, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  store ptr null, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  store i32 0, ptr %29, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  store i32 0, ptr %30, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #4
  store i32 0, ptr %31, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #4
  store i32 0, ptr %32, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #4
  store ptr null, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #4
  store i32 -1, ptr %36, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  %42 = load ptr, ptr %10, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.ffc_params_st, ptr %42, i32 0, i32 4
  %44 = load ptr, ptr %43, align 8, !tbaa !13
  store ptr %44, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  %45 = load ptr, ptr %10, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.ffc_params_st, ptr %45, i32 0, i32 5
  %47 = load i64, ptr %46, align 8, !tbaa !15
  store i64 %47, ptr %38, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #4
  %48 = load i32, ptr %11, align 4, !tbaa !9
  %49 = icmp eq i32 %48, 0
  %50 = zext i1 %49 to i32
  store i32 %50, ptr %39, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #4
  %51 = load i32, ptr %39, align 4, !tbaa !9
  %52 = icmp ne i32 %51, 0
  br i1 %52, label %53, label %57

53:                                               ; preds = %8
  %54 = load ptr, ptr %10, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.ffc_params_st, ptr %54, i32 0, i32 10
  %56 = load i32, ptr %55, align 8, !tbaa !16
  br label %58

57:                                               ; preds = %8
  br label %58

58:                                               ; preds = %57, %53
  %59 = phi i32 [ %56, %53 ], [ 0, %57 ]
  store i32 %59, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #4
  %60 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 0, ptr %60, align 4, !tbaa !9
  %61 = load ptr, ptr %10, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.ffc_params_st, ptr %61, i32 0, i32 11
  %63 = load ptr, ptr %62, align 8, !tbaa !17
  %64 = icmp ne ptr %63, null
  br i1 %64, label %65, label %74

65:                                               ; preds = %58
  %66 = load ptr, ptr %9, align 8, !tbaa !5
  %67 = load ptr, ptr %10, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.ffc_params_st, ptr %67, i32 0, i32 11
  %69 = load ptr, ptr %68, align 8, !tbaa !17
  %70 = load ptr, ptr %10, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.ffc_params_st, ptr %70, i32 0, i32 12
  %72 = load ptr, ptr %71, align 8, !tbaa !18
  %73 = call ptr @EVP_MD_fetch(ptr noundef %66, ptr noundef %69, ptr noundef %72)
  store ptr %73, ptr %27, align 8, !tbaa !5
  br label %98

74:                                               ; preds = %58
  %75 = load i64, ptr %14, align 8, !tbaa !11
  %76 = icmp eq i64 %75, 0
  br i1 %76, label %77, label %84

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

84:                                               ; preds = %77, %74
  %85 = load i64, ptr %14, align 8, !tbaa !11
  %86 = call ptr @default_mdname(i64 noundef %85)
  store ptr %86, ptr %41, align 8, !tbaa !5
  %87 = load ptr, ptr %41, align 8, !tbaa !5
  %88 = icmp eq ptr %87, null
  br i1 %88, label %89, label %91

89:                                               ; preds = %84
  %90 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 32, ptr %90, align 4, !tbaa !9
  br label %492

91:                                               ; preds = %84
  %92 = load ptr, ptr %9, align 8, !tbaa !5
  %93 = load ptr, ptr %41, align 8, !tbaa !5
  %94 = load ptr, ptr %10, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.ffc_params_st, ptr %94, i32 0, i32 12
  %96 = load ptr, ptr %95, align 8, !tbaa !18
  %97 = call ptr @EVP_MD_fetch(ptr noundef %92, ptr noundef %93, ptr noundef %96)
  store ptr %97, ptr %27, align 8, !tbaa !5
  br label %98

98:                                               ; preds = %91, %65
  %99 = load ptr, ptr %27, align 8, !tbaa !5
  %100 = icmp eq ptr %99, null
  br i1 %100, label %101, label %102

101:                                              ; preds = %98
  br label %492

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

105:                                              ; preds = %102
  %106 = load ptr, ptr %27, align 8, !tbaa !5
  %107 = call i32 @EVP_MD_get_size(ptr noundef %106)
  %108 = mul nsw i32 %107, 8
  %109 = sext i32 %108 to i64
  store i64 %109, ptr %14, align 8, !tbaa !11
  br label %110

110:                                              ; preds = %105, %102
  %111 = load i64, ptr %14, align 8, !tbaa !11
  %112 = lshr i64 %111, 3
  store i64 %112, ptr %28, align 8, !tbaa !11
  %113 = load i64, ptr %13, align 8, !tbaa !11
  %114 = icmp ult i64 %113, 512
  br i1 %114, label %115, label %117

115:                                              ; preds = %110
  %116 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 128, ptr %116, align 4, !tbaa !9
  br label %492

117:                                              ; preds = %110
  %118 = load i64, ptr %28, align 8, !tbaa !11
  %119 = icmp ne i64 %118, 20
  br i1 %119, label %120, label %128

120:                                              ; preds = %117
  %121 = load i64, ptr %28, align 8, !tbaa !11
  %122 = icmp ne i64 %121, 28
  br i1 %122, label %123, label %128

123:                                              ; preds = %120
  %124 = load i64, ptr %28, align 8, !tbaa !11
  %125 = icmp ne i64 %124, 32
  br i1 %125, label %126, label %128

126:                                              ; preds = %123
  %127 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 32, ptr %127, align 4, !tbaa !9
  br label %492

128:                                              ; preds = %123, %120, %117
  %129 = load i64, ptr %13, align 8, !tbaa !11
  %130 = add i64 %129, 63
  %131 = udiv i64 %130, 64
  %132 = mul i64 %131, 64
  store i64 %132, ptr %13, align 8, !tbaa !11
  %133 = load ptr, ptr %37, align 8, !tbaa !5
  %134 = icmp ne ptr %133, null
  br i1 %134, label %135, label %151

135:                                              ; preds = %128
  %136 = load i64, ptr %38, align 8, !tbaa !11
  %137 = load i64, ptr %28, align 8, !tbaa !11
  %138 = icmp ult i64 %136, %137
  br i1 %138, label %139, label %141

139:                                              ; preds = %135
  %140 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 256, ptr %140, align 4, !tbaa !9
  br label %492

141:                                              ; preds = %135
  %142 = load i64, ptr %38, align 8, !tbaa !11
  %143 = load i64, ptr %28, align 8, !tbaa !11
  %144 = icmp ugt i64 %142, %143
  br i1 %144, label %145, label %147

145:                                              ; preds = %141
  %146 = load i64, ptr %28, align 8, !tbaa !11
  store i64 %146, ptr %38, align 8, !tbaa !11
  br label %147

147:                                              ; preds = %145, %141
  %148 = getelementptr inbounds [32 x i8], ptr %18, i64 0, i64 0
  %149 = load ptr, ptr %37, align 8, !tbaa !5
  %150 = load i64, ptr %38, align 8, !tbaa !11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %148, ptr align 1 %149, i64 %150, i1 false)
  br label %151

151:                                              ; preds = %147, %128
  %152 = load ptr, ptr %9, align 8, !tbaa !5
  %153 = call ptr @BN_CTX_new_ex(ptr noundef %152)
  store ptr %153, ptr %35, align 8, !tbaa !5
  %154 = load ptr, ptr %35, align 8, !tbaa !5
  %155 = icmp eq ptr %154, null
  br i1 %155, label %156, label %157

156:                                              ; preds = %151
  br label %492

157:                                              ; preds = %151
  %158 = load ptr, ptr %35, align 8, !tbaa !5
  call void @BN_CTX_start(ptr noundef %158)
  %159 = load ptr, ptr %35, align 8, !tbaa !5
  %160 = call ptr @BN_CTX_get(ptr noundef %159)
  store ptr %160, ptr %20, align 8, !tbaa !5
  %161 = load ptr, ptr %35, align 8, !tbaa !5
  %162 = call ptr @BN_CTX_get(ptr noundef %161)
  store ptr %162, ptr %23, align 8, !tbaa !5
  %163 = load ptr, ptr %35, align 8, !tbaa !5
  %164 = call ptr @BN_CTX_get(ptr noundef %163)
  store ptr %164, ptr %24, align 8, !tbaa !5
  %165 = load ptr, ptr %35, align 8, !tbaa !5
  %166 = call ptr @BN_CTX_get(ptr noundef %165)
  store ptr %166, ptr %25, align 8, !tbaa !5
  %167 = load ptr, ptr %35, align 8, !tbaa !5
  %168 = call ptr @BN_CTX_get(ptr noundef %167)
  store ptr %168, ptr %22, align 8, !tbaa !5
  %169 = load ptr, ptr %35, align 8, !tbaa !5
  %170 = call ptr @BN_CTX_get(ptr noundef %169)
  store ptr %170, ptr %21, align 8, !tbaa !5
  %171 = load ptr, ptr %21, align 8, !tbaa !5
  %172 = icmp eq ptr %171, null
  br i1 %172, label %173, label %174

173:                                              ; preds = %157
  br label %492

174:                                              ; preds = %157
  %175 = load ptr, ptr %21, align 8, !tbaa !5
  %176 = call ptr @BN_value_one()
  %177 = load i64, ptr %13, align 8, !tbaa !11
  %178 = sub i64 %177, 1
  %179 = trunc i64 %178 to i32
  %180 = call i32 @BN_lshift(ptr noundef %175, ptr noundef %176, i32 noundef %179)
  %181 = icmp ne i32 %180, 0
  br i1 %181, label %183, label %182

182:                                              ; preds = %174
  br label %492

183:                                              ; preds = %174
  %184 = load i32, ptr %39, align 4, !tbaa !9
  %185 = icmp ne i32 %184, 0
  br i1 %185, label %201, label %186

186:                                              ; preds = %183
  %187 = load ptr, ptr %10, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.ffc_params_st, ptr %187, i32 0, i32 0
  %189 = load ptr, ptr %188, align 8, !tbaa !19
  %190 = icmp ne ptr %189, null
  %191 = zext i1 %190 to i32
  %192 = load ptr, ptr %10, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.ffc_params_st, ptr %192, i32 0, i32 1
  %194 = load ptr, ptr %193, align 8, !tbaa !20
  %195 = icmp ne ptr %194, null
  %196 = zext i1 %195 to i32
  %197 = icmp ne i32 %191, %196
  br i1 %197, label %198, label %200

198:                                              ; preds = %186
  %199 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 2048, ptr %199, align 4, !tbaa !9
  br label %492

200:                                              ; preds = %186
  br label %229

201:                                              ; preds = %183
  %202 = load i32, ptr %40, align 4, !tbaa !9
  %203 = and i32 %202, 1
  %204 = icmp ne i32 %203, 0
  br i1 %204, label %205, label %216

205:                                              ; preds = %201
  %206 = load ptr, ptr %37, align 8, !tbaa !5
  %207 = icmp eq ptr %206, null
  br i1 %207, label %213, label %208

208:                                              ; preds = %205
  %209 = load ptr, ptr %10, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.ffc_params_st, ptr %209, i32 0, i32 6
  %211 = load i32, ptr %210, align 8, !tbaa !21
  %212 = icmp slt i32 %211, 0
  br i1 %212, label %213, label %215

213:                                              ; preds = %208, %205
  %214 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 512, ptr %214, align 4, !tbaa !9
  br label %492

215:                                              ; preds = %208
  br label %216

216:                                              ; preds = %215, %201
  %217 = load i32, ptr %40, align 4, !tbaa !9
  %218 = and i32 %217, 2
  %219 = icmp ne i32 %218, 0
  br i1 %219, label %220, label %228

220:                                              ; preds = %216
  %221 = load ptr, ptr %10, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.ffc_params_st, ptr %221, i32 0, i32 2
  %223 = load ptr, ptr %222, align 8, !tbaa !22
  %224 = icmp eq ptr %223, null
  br i1 %224, label %225, label %227

225:                                              ; preds = %220
  %226 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 1024, ptr %226, align 4, !tbaa !9
  br label %492

227:                                              ; preds = %220
  br label %228

228:                                              ; preds = %227, %216
  br label %229

229:                                              ; preds = %228, %200
  %230 = load ptr, ptr %10, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.ffc_params_st, ptr %230, i32 0, i32 0
  %232 = load ptr, ptr %231, align 8, !tbaa !19
  %233 = icmp ne ptr %232, null
  br i1 %233, label %234, label %245

234:                                              ; preds = %229
  %235 = load i32, ptr %40, align 4, !tbaa !9
  %236 = and i32 %235, 1
  %237 = icmp eq i32 %236, 0
  br i1 %237, label %238, label %245

238:                                              ; preds = %234
  %239 = load ptr, ptr %10, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.ffc_params_st, ptr %239, i32 0, i32 0
  %241 = load ptr, ptr %240, align 8, !tbaa !19
  store ptr %241, ptr %25, align 8, !tbaa !5
  %242 = load ptr, ptr %10, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.ffc_params_st, ptr %242, i32 0, i32 1
  %244 = load ptr, ptr %243, align 8, !tbaa !20
  store ptr %244, ptr %24, align 8, !tbaa !5
  br label %347

245:                                              ; preds = %234, %229
  %246 = load ptr, ptr %37, align 8, !tbaa !5
  %247 = icmp eq ptr %246, null
  %248 = zext i1 %247 to i32
  store i32 %248, ptr %33, align 4, !tbaa !9
  br label %249

249:                                              ; preds = %316, %245
  %250 = load ptr, ptr %35, align 8, !tbaa !5
  %251 = load ptr, ptr %24, align 8, !tbaa !5
  %252 = load ptr, ptr %27, align 8, !tbaa !5
  %253 = getelementptr inbounds [32 x i8], ptr %19, i64 0, i64 0
  %254 = getelementptr inbounds [32 x i8], ptr %18, i64 0, i64 0
  %255 = load i64, ptr %28, align 8, !tbaa !11
  %256 = load i32, ptr %33, align 4, !tbaa !9
  %257 = load ptr, ptr %15, align 8, !tbaa !5
  %258 = load ptr, ptr %16, align 8, !tbaa !5
  %259 = call i32 @generate_q_fips186_2(ptr noundef %250, ptr noundef %251, ptr noundef %252, ptr noundef %253, ptr noundef %254, i64 noundef %255, i32 noundef %256, ptr noundef %30, ptr noundef %257, ptr noundef %258)
  %260 = icmp ne i32 %259, 0
  br i1 %260, label %262, label %261

261:                                              ; preds = %249
  br label %492

262:                                              ; preds = %249
  %263 = load ptr, ptr %16, align 8, !tbaa !5
  %264 = call i32 @BN_GENCB_call(ptr noundef %263, i32 noundef 2, i32 noundef 0)
  %265 = icmp ne i32 %264, 0
  br i1 %265, label %267, label %266

266:                                              ; preds = %262
  br label %492

267:                                              ; preds = %262
  %268 = load ptr, ptr %16, align 8, !tbaa !5
  %269 = call i32 @BN_GENCB_call(ptr noundef %268, i32 noundef 3, i32 noundef 0)
  %270 = icmp ne i32 %269, 0
  br i1 %270, label %272, label %271

271:                                              ; preds = %267
  br label %492

272:                                              ; preds = %267
  %273 = load i64, ptr %13, align 8, !tbaa !11
  %274 = sub i64 %273, 1
  %275 = udiv i64 %274, 160
  %276 = trunc i64 %275 to i32
  store i32 %276, ptr %29, align 4, !tbaa !9
  %277 = load i64, ptr %13, align 8, !tbaa !11
  %278 = mul i64 4, %277
  %279 = sub i64 %278, 1
  %280 = trunc i64 %279 to i32
  store i32 %280, ptr %31, align 4, !tbaa !9
  %281 = load i32, ptr %39, align 4, !tbaa !9
  %282 = icmp ne i32 %281, 0
  br i1 %282, label %283, label %295

283:                                              ; preds = %272
  %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
  %287 = load i32, ptr %31, align 4, !tbaa !9
  %288 = icmp sgt i32 %286, %287
  br i1 %288, label %289, label %291

289:                                              ; preds = %283
  %290 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 4096, ptr %290, align 4, !tbaa !9
  br label %492

291:                                              ; preds = %283
  %292 = load ptr, ptr %10, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.ffc_params_st, ptr %292, i32 0, i32 6
  %294 = load i32, ptr %293, align 8, !tbaa !21
  store i32 %294, ptr %31, align 4, !tbaa !9
  br label %295

295:                                              ; preds = %291, %272
  %296 = load ptr, ptr %35, align 8, !tbaa !5
  %297 = load ptr, ptr %27, align 8, !tbaa !5
  %298 = load i32, ptr %31, align 4, !tbaa !9
  %299 = load i32, ptr %29, align 4, !tbaa !9
  %300 = getelementptr inbounds [32 x i8], ptr %19, i64 0, i64 0
  %301 = load i64, ptr %28, align 8, !tbaa !11
  %302 = load ptr, ptr %24, align 8, !tbaa !5
  %303 = load ptr, ptr %25, align 8, !tbaa !5
  %304 = load i64, ptr %13, align 8, !tbaa !11
  %305 = trunc i64 %304 to i32
  %306 = load ptr, ptr %16, align 8, !tbaa !5
  %307 = load ptr, ptr %15, align 8, !tbaa !5
  %308 = call i32 @generate_p(ptr noundef %296, ptr noundef %297, i32 noundef %298, i32 noundef %299, ptr noundef %300, i64 noundef %301, ptr noundef %302, ptr noundef %303, i32 noundef %305, ptr noundef %306, ptr noundef %32, ptr noundef %307)
  store i32 %308, ptr %34, align 4, !tbaa !9
  %309 = load i32, ptr %34, align 4, !tbaa !9
  %310 = icmp sgt i32 %309, 0
  br i1 %310, label %311, label %312

311:                                              ; preds = %295
  br label %317

312:                                              ; preds = %295
  %313 = load i32, ptr %34, align 4, !tbaa !9
  %314 = icmp eq i32 %313, -1
  br i1 %314, label %315, label %316

315:                                              ; preds = %312
  br label %492

316:                                              ; preds = %312
  store i32 1, ptr %33, align 4, !tbaa !9
  br label %249

317:                                              ; preds = %311
  %318 = load ptr, ptr %16, align 8, !tbaa !5
  %319 = call i32 @BN_GENCB_call(ptr noundef %318, i32 noundef 2, i32 noundef 1)
  %320 = icmp ne i32 %319, 0
  br i1 %320, label %322, label %321

321:                                              ; preds = %317
  br label %492

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

325:                                              ; preds = %322
  %326 = load i32, ptr %32, align 4, !tbaa !9
  %327 = load i32, ptr %31, align 4, !tbaa !9
  %328 = icmp ne i32 %326, %327
  br i1 %328, label %329, label %331

329:                                              ; preds = %325
  %330 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 65536, ptr %330, align 4, !tbaa !9
  br label %492

331:                                              ; preds = %325
  %332 = load ptr, ptr %25, align 8, !tbaa !5
  %333 = load ptr, ptr %10, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.ffc_params_st, ptr %333, i32 0, i32 0
  %335 = load ptr, ptr %334, align 8, !tbaa !19
  %336 = call i32 @BN_cmp(ptr noundef %332, ptr noundef %335)
  %337 = icmp ne i32 %336, 0
  br i1 %337, label %338, label %340

338:                                              ; preds = %331
  %339 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 8192, ptr %339, align 4, !tbaa !9
  br label %492

340:                                              ; preds = %331
  br label %341

341:                                              ; preds = %340, %322
  %342 = load i32, ptr %40, align 4, !tbaa !9
  %343 = and i32 %342, 3
  %344 = icmp eq i32 %343, 1
  br i1 %344, label %345, label %346

345:                                              ; preds = %341
  br label %485

346:                                              ; preds = %341
  br label %347

347:                                              ; preds = %346, %238
  %348 = call ptr @BN_MONT_CTX_new()
  store ptr %348, ptr %26, align 8, !tbaa !5
  %349 = icmp eq ptr %348, null
  br i1 %349, label %350, label %351

350:                                              ; preds = %347
  br label %492

351:                                              ; preds = %347
  %352 = load ptr, ptr %26, align 8, !tbaa !5
  %353 = load ptr, ptr %25, align 8, !tbaa !5
  %354 = load ptr, ptr %35, align 8, !tbaa !5
  %355 = call i32 @BN_MONT_CTX_set(ptr noundef %352, ptr noundef %353, ptr noundef %354)
  %356 = icmp ne i32 %355, 0
  br i1 %356, label %358, label %357

357:                                              ; preds = %351
  br label %492

358:                                              ; preds = %351
  %359 = load i32, ptr %39, align 4, !tbaa !9
  %360 = icmp ne i32 %359, 0
  br i1 %360, label %388, label %361

361:                                              ; preds = %358
  %362 = load ptr, ptr %21, align 8, !tbaa !5
  %363 = load ptr, ptr %25, align 8, !tbaa !5
  %364 = call ptr @BN_value_one()
  %365 = call i32 @BN_sub(ptr noundef %362, ptr noundef %363, ptr noundef %364)
  %366 = icmp ne i32 %365, 0
  br i1 %366, label %368, label %367

367:                                              ; preds = %361
  br label %492

368:                                              ; preds = %361
  %369 = load ptr, ptr %20, align 8, !tbaa !5
  %370 = load ptr, ptr %21, align 8, !tbaa !5
  %371 = load ptr, ptr %24, align 8, !tbaa !5
  %372 = load ptr, ptr %35, align 8, !tbaa !5
  %373 = call i32 @BN_div(ptr noundef %369, ptr noundef null, ptr noundef %370, ptr noundef %371, ptr noundef %372)
  %374 = icmp ne i32 %373, 0
  br i1 %374, label %376, label %375

375:                                              ; preds = %368
  br label %492

376:                                              ; preds = %368
  %377 = load ptr, ptr %35, align 8, !tbaa !5
  %378 = load ptr, ptr %26, align 8, !tbaa !5
  %379 = load ptr, ptr %23, align 8, !tbaa !5
  %380 = load ptr, ptr %22, align 8, !tbaa !5
  %381 = load ptr, ptr %25, align 8, !tbaa !5
  %382 = load ptr, ptr %20, align 8, !tbaa !5
  %383 = load ptr, ptr %21, align 8, !tbaa !5
  %384 = call i32 @generate_unverifiable_g(ptr noundef %377, ptr noundef %378, ptr noundef %379, ptr noundef %380, ptr noundef %381, ptr noundef %382, ptr noundef %383, ptr noundef %36)
  %385 = icmp ne i32 %384, 0
  br i1 %385, label %387, label %386

386:                                              ; preds = %376
  br label %492

387:                                              ; preds = %376
  br label %406

388:                                              ; preds = %358
  %389 = load i32, ptr %40, align 4, !tbaa !9
  %390 = and i32 %389, 2
  %391 = icmp ne i32 %390, 0
  br i1 %391, label %392, label %405

392:                                              ; preds = %388
  %393 = load ptr, ptr %35, align 8, !tbaa !5
  %394 = load ptr, ptr %26, align 8, !tbaa !5
  %395 = load ptr, ptr %25, align 8, !tbaa !5
  %396 = load ptr, ptr %24, align 8, !tbaa !5
  %397 = load ptr, ptr %10, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.ffc_params_st, ptr %397, i32 0, i32 2
  %399 = load ptr, ptr %398, align 8, !tbaa !22
  %400 = load ptr, ptr %22, align 8, !tbaa !5
  %401 = load ptr, ptr %15, align 8, !tbaa !5
  %402 = call i32 @ossl_ffc_params_validate_unverifiable_g(ptr noundef %393, ptr noundef %394, ptr noundef %395, ptr noundef %396, ptr noundef %399, ptr noundef %400, ptr noundef %401)
  %403 = icmp ne i32 %402, 0
  br i1 %403, label %405, label %404

404:                                              ; preds = %392
  br label %492

405:                                              ; preds = %392, %388
  br label %406

406:                                              ; preds = %405, %387
  %407 = load ptr, ptr %16, align 8, !tbaa !5
  %408 = call i32 @BN_GENCB_call(ptr noundef %407, i32 noundef 3, i32 noundef 1)
  %409 = icmp ne i32 %408, 0
  br i1 %409, label %411, label %410

410:                                              ; preds = %406
  br label %492

411:                                              ; preds = %406
  %412 = load i32, ptr %39, align 4, !tbaa !9
  %413 = icmp ne i32 %412, 0
  br i1 %413, label %484, label %414

414:                                              ; preds = %411
  %415 = load ptr, ptr %25, align 8, !tbaa !5
  %416 = load ptr, ptr %10, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.ffc_params_st, ptr %416, i32 0, i32 0
  %418 = load ptr, ptr %417, align 8, !tbaa !19
  %419 = icmp ne ptr %415, %418
  br i1 %419, label %420, label %428

420:                                              ; preds = %414
  %421 = load ptr, ptr %10, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.ffc_params_st, ptr %421, i32 0, i32 0
  %423 = load ptr, ptr %422, align 8, !tbaa !19
  call void @BN_free(ptr noundef %423)
  %424 = load ptr, ptr %25, align 8, !tbaa !5
  %425 = call ptr @BN_dup(ptr noundef %424)
  %426 = load ptr, ptr %10, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.ffc_params_st, ptr %426, i32 0, i32 0
  store ptr %425, ptr %427, align 8, !tbaa !19
  br label %428

428:                                              ; preds = %420, %414
  %429 = load ptr, ptr %24, align 8, !tbaa !5
  %430 = load ptr, ptr %10, align 8, !tbaa !5
  %431 = getelementptr inbounds %struct.ffc_params_st, ptr %430, i32 0, i32 1
  %432 = load ptr, ptr %431, align 8, !tbaa !20
  %433 = icmp ne ptr %429, %432
  br i1 %433, label %434, label %442

434:                                              ; preds = %428
  %435 = load ptr, ptr %10, align 8, !tbaa !5
  %436 = getelementptr inbounds %struct.ffc_params_st, ptr %435, i32 0, i32 1
  %437 = load ptr, ptr %436, align 8, !tbaa !20
  call void @BN_free(ptr noundef %437)
  %438 = load ptr, ptr %24, align 8, !tbaa !5
  %439 = call ptr @BN_dup(ptr noundef %438)
  %440 = load ptr, ptr %10, align 8, !tbaa !5
  %441 = getelementptr inbounds %struct.ffc_params_st, ptr %440, i32 0, i32 1
  store ptr %439, ptr %441, align 8, !tbaa !20
  br label %442

442:                                              ; preds = %434, %428
  %443 = load ptr, ptr %23, align 8, !tbaa !5
  %444 = load ptr, ptr %10, align 8, !tbaa !5
  %445 = getelementptr inbounds %struct.ffc_params_st, ptr %444, i32 0, i32 2
  %446 = load ptr, ptr %445, align 8, !tbaa !22
  %447 = icmp ne ptr %443, %446
  br i1 %447, label %448, label %456

448:                                              ; preds = %442
  %449 = load ptr, ptr %10, align 8, !tbaa !5
  %450 = getelementptr inbounds %struct.ffc_params_st, ptr %449, i32 0, i32 2
  %451 = load ptr, ptr %450, align 8, !tbaa !22
  call void @BN_free(ptr noundef %451)
  %452 = load ptr, ptr %23, align 8, !tbaa !5
  %453 = call ptr @BN_dup(ptr noundef %452)
  %454 = load ptr, ptr %10, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.ffc_params_st, ptr %454, i32 0, i32 2
  store ptr %453, ptr %455, align 8, !tbaa !22
  br label %456

456:                                              ; preds = %448, %442
  %457 = load ptr, ptr %10, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.ffc_params_st, ptr %457, i32 0, i32 0
  %459 = load ptr, ptr %458, align 8, !tbaa !19
  %460 = icmp eq ptr %459, null
  br i1 %460, label %471, label %461

461:                                              ; preds = %456
  %462 = load ptr, ptr %10, align 8, !tbaa !5
  %463 = getelementptr inbounds %struct.ffc_params_st, ptr %462, i32 0, i32 1
  %464 = load ptr, ptr %463, align 8, !tbaa !20
  %465 = icmp eq ptr %464, null
  br i1 %465, label %471, label %466

466:                                              ; preds = %461
  %467 = load ptr, ptr %10, align 8, !tbaa !5
  %468 = getelementptr inbounds %struct.ffc_params_st, ptr %467, i32 0, i32 2
  %469 = load ptr, ptr %468, align 8, !tbaa !22
  %470 = icmp eq ptr %469, null
  br i1 %470, label %471, label %472

471:                                              ; preds = %466, %461, %456
  br label %492

472:                                              ; preds = %466
  %473 = load ptr, ptr %10, align 8, !tbaa !5
  %474 = getelementptr inbounds [32 x i8], ptr %18, i64 0, i64 0
  %475 = load i64, ptr %28, align 8, !tbaa !11
  %476 = load i32, ptr %32, align 4, !tbaa !9
  %477 = call i32 @ossl_ffc_params_set_validate_params(ptr noundef %473, ptr noundef %474, i64 noundef %475, i32 noundef %476)
  %478 = icmp ne i32 %477, 0
  br i1 %478, label %480, label %479

479:                                              ; preds = %472
  br label %492

480:                                              ; preds = %472
  %481 = load i32, ptr %36, align 4, !tbaa !9
  %482 = load ptr, ptr %10, align 8, !tbaa !5
  %483 = getelementptr inbounds %struct.ffc_params_st, ptr %482, i32 0, i32 9
  store i32 %481, ptr %483, align 4, !tbaa !23
  br label %484

484:                                              ; preds = %480, %411
  br label %485

485:                                              ; preds = %484, %345
  %486 = load i32, ptr %40, align 4, !tbaa !9
  %487 = and i32 %486, 2
  %488 = icmp ne i32 %487, 0
  br i1 %488, label %489, label %490

489:                                              ; preds = %485
  store i32 2, ptr %17, align 4, !tbaa !9
  br label %491

490:                                              ; preds = %485
  store i32 1, ptr %17, align 4, !tbaa !9
  br label %491

491:                                              ; preds = %490, %489
  br label %492

492:                                              ; preds = %491, %479, %471, %410, %404, %386, %375, %367, %357, %350, %338, %329, %321, %315, %289, %271, %266, %261, %225, %213, %198, %182, %173, %156, %139, %126, %115, %101, %89
  %493 = load ptr, ptr %35, align 8, !tbaa !5
  %494 = icmp ne ptr %493, null
  br i1 %494, label %495, label %497

495:                                              ; preds = %492
  %496 = load ptr, ptr %35, align 8, !tbaa !5
  call void @BN_CTX_end(ptr noundef %496)
  br label %497

497:                                              ; preds = %495, %492
  %498 = load ptr, ptr %35, align 8, !tbaa !5
  call void @BN_CTX_free(ptr noundef %498)
  %499 = load ptr, ptr %26, align 8, !tbaa !5
  call void @BN_MONT_CTX_free(ptr noundef %499)
  %500 = load ptr, ptr %27, align 8, !tbaa !5
  call void @EVP_MD_free(ptr noundef %500)
  %501 = load i32, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 8, 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 4, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 4, 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 8, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  ret i32 %501
}

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

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 = { 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, !6, i64 32}
!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, !12, i64 40}
!16 = !{!14, !10, i64 64}
!17 = !{!14, !6, i64 72}
!18 = !{!14, !6, i64 80}
!19 = !{!14, !6, i64 0}
!20 = !{!14, !6, i64 8}
!21 = !{!14, !10, i64 48}
!22 = !{!14, !6, i64 16}
!23 = !{!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"

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

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

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

declare i32 @EVP_MD_get_size(ptr noundef) local_unnamed_addr #1

declare ptr @BN_CTX_new_ex(ptr noundef) local_unnamed_addr #1

declare void @BN_CTX_start(ptr noundef) local_unnamed_addr #1

declare ptr @BN_CTX_get(ptr noundef) local_unnamed_addr #1

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

declare ptr @BN_value_one() local_unnamed_addr #1

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

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

; 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 #2

declare ptr @BN_MONT_CTX_new() local_unnamed_addr #1

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

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 #1

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

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

; 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 #2

declare void @BN_free(ptr noundef) local_unnamed_addr #1

declare ptr @BN_dup(ptr noundef) local_unnamed_addr #1

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

declare void @BN_CTX_end(ptr noundef) local_unnamed_addr #1

declare void @BN_CTX_free(ptr noundef) local_unnamed_addr #1

declare void @BN_MONT_CTX_free(ptr noundef) local_unnamed_addr #1

declare void @EVP_MD_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

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 3) i32 @ossl_ffc_params_FIPS186_2_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 #2 {
  %9 = alloca [32 x i8], align 16
  %10 = alloca [32 x i8], align 16
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %9) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %10) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #4
  store i32 0, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #4
  store i32 0, ptr %12, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #4
  store i32 -1, ptr %13, align 4, !tbaa !5
  %14 = getelementptr inbounds i8, ptr %1, i64 32
  %15 = load ptr, ptr %14, align 8, !tbaa !9
  %16 = getelementptr inbounds i8, ptr %1, i64 40
  %17 = load i64, ptr %16, align 8, !tbaa !13
  %18 = icmp eq i32 %2, 0
  br i1 %18, label %19, label %22

19:                                               ; preds = %8
  %20 = getelementptr inbounds i8, ptr %1, i64 64
  %21 = load i32, ptr %20, align 8, !tbaa !14
  br label %22

22:                                               ; preds = %8, %19
  %23 = phi i32 [ %21, %19 ], [ 0, %8 ]
  store i32 0, ptr %6, align 4, !tbaa !5
  %24 = getelementptr inbounds i8, ptr %1, i64 72
  %25 = load ptr, ptr %24, align 8, !tbaa !15
  %.not = icmp eq ptr %25, null
  br i1 %.not, label %26, label %33

26:                                               ; preds = %22
  %27 = icmp eq i64 %5, 0
  %28 = icmp ugt i64 %4, 2047
  %29 = select i1 %28, i64 256, i64 160
  %.0 = select i1 %27, i64 %29, i64 %5
  %30 = tail call ptr @default_mdname(i64 noundef %.0)
  %31 = icmp eq ptr %30, null
  br i1 %31, label %32, label %33

32:                                               ; preds = %26
  store i32 32, ptr %6, align 4, !tbaa !5
  br label %.thread218

33:                                               ; preds = %26, %22
  %.sink = phi ptr [ %25, %22 ], [ %30, %26 ]
  %.1 = phi i64 [ %5, %22 ], [ %.0, %26 ]
  %34 = getelementptr inbounds i8, ptr %1, i64 80
  %35 = load ptr, ptr %34, align 8, !tbaa !16
  %36 = tail call ptr @EVP_MD_fetch(ptr noundef %0, ptr noundef nonnull %.sink, ptr noundef %35) #4
  %37 = icmp eq ptr %36, null
  br i1 %37, label %.thread218, label %38

38:                                               ; preds = %33
  %39 = icmp eq i64 %.1, 0
  br i1 %39, label %40, label %44

40:                                               ; preds = %38
  %41 = tail call i32 @EVP_MD_get_size(ptr noundef nonnull %36) #4
  %42 = shl nsw i32 %41, 3
  %43 = sext i32 %42 to i64
  br label %44

44:                                               ; preds = %40, %38
  %.2 = phi i64 [ %43, %40 ], [ %.1, %38 ]
  %45 = lshr i64 %.2, 3
  %46 = icmp ult i64 %4, 512
  br i1 %46, label %47, label %48

47:                                               ; preds = %44
  store i32 128, ptr %6, align 4, !tbaa !5
  br label %.thread218

48:                                               ; preds = %44
  %49 = and i64 %.2, -72
  %or.cond = icmp ne i64 %49, 160
  %50 = icmp ne i64 %45, 32
  %or.cond3 = and i1 %or.cond, %50
  br i1 %or.cond3, label %51, label %52

51:                                               ; preds = %48
  store i32 32, ptr %6, align 4, !tbaa !5
  br label %.thread218

52:                                               ; preds = %48
  %53 = add i64 %4, 63
  %54 = and i64 %53, -64
  %.not189 = icmp eq ptr %15, null
  br i1 %.not189, label %59, label %55

55:                                               ; preds = %52
  %56 = icmp ult i64 %17, %45
  br i1 %56, label %57, label %58

57:                                               ; preds = %55
  store i32 256, ptr %6, align 4, !tbaa !5
  br label %.thread218

58:                                               ; preds = %55
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %9, ptr nonnull align 1 %15, i64 %45, i1 false)
  br label %59

59:                                               ; preds = %58, %52
  %60 = tail call ptr @BN_CTX_new_ex(ptr noundef %0) #4
  %61 = icmp eq ptr %60, null
  br i1 %61, label %.thread218, label %62

62:                                               ; preds = %59
  tail call void @BN_CTX_start(ptr noundef nonnull %60) #4
  %63 = tail call ptr @BN_CTX_get(ptr noundef nonnull %60) #4
  %64 = tail call ptr @BN_CTX_get(ptr noundef nonnull %60) #4
  %65 = tail call ptr @BN_CTX_get(ptr noundef nonnull %60) #4
  %66 = tail call ptr @BN_CTX_get(ptr noundef nonnull %60) #4
  %67 = tail call ptr @BN_CTX_get(ptr noundef nonnull %60) #4
  %68 = tail call ptr @BN_CTX_get(ptr noundef nonnull %60) #4
  %69 = icmp eq ptr %68, null
  br i1 %69, label %.thread229, label %70

70:                                               ; preds = %62
  %71 = tail call ptr @BN_value_one() #4
  %72 = add i64 %54, -1
  %73 = trunc i64 %72 to i32
  %74 = tail call i32 @BN_lshift(ptr noundef nonnull %68, ptr noundef %71, i32 noundef %73) #4
  %.not190 = icmp eq i32 %74, 0
  br i1 %.not190, label %.thread229, label %75

75:                                               ; preds = %70
  br i1 %18, label %83, label %76

76:                                               ; preds = %75
  %77 = load ptr, ptr %1, align 8, !tbaa !17
  %78 = icmp ne ptr %77, null
  %79 = getelementptr inbounds i8, ptr %1, i64 8
  %80 = load ptr, ptr %79, align 8, !tbaa !18
  %81 = icmp eq ptr %80, null
  %.not191 = xor i1 %78, %81
  br i1 %.not191, label %._crit_edge, label %82

._crit_edge:                                      ; preds = %76
  %.pre = and i32 %23, 1
  br label %98

82:                                               ; preds = %76
  store i32 2048, ptr %6, align 4, !tbaa !5
  br label %.thread229

83:                                               ; preds = %75
  %84 = and i32 %23, 1
  %.not192 = icmp eq i32 %84, 0
  br i1 %.not192, label %91, label %85

85:                                               ; preds = %83
  br i1 %.not189, label %90, label %86

86:                                               ; preds = %85
  %87 = getelementptr inbounds i8, ptr %1, i64 48
  %88 = load i32, ptr %87, align 8, !tbaa !19
  %89 = icmp slt i32 %88, 0
  br i1 %89, label %90, label %91

90:                                               ; preds = %86, %85
  store i32 512, ptr %6, align 4, !tbaa !5
  br label %.thread229

91:                                               ; preds = %86, %83
  %92 = and i32 %23, 2
  %.not193 = icmp eq i32 %92, 0
  br i1 %.not193, label %98, label %93

93:                                               ; preds = %91
  %94 = getelementptr inbounds i8, ptr %1, i64 16
  %95 = load ptr, ptr %94, align 8, !tbaa !20
  %96 = icmp eq ptr %95, null
  br i1 %96, label %97, label %98

97:                                               ; preds = %93
  store i32 1024, ptr %6, align 4, !tbaa !5
  br label %.thread229

98:                                               ; preds = %._crit_edge, %91, %93
  %.pre-phi = phi i32 [ %.pre, %._crit_edge ], [ %84, %91 ], [ %84, %93 ]
  %99 = load ptr, ptr %1, align 8, !tbaa !17
  %.not194 = icmp ne ptr %99, null
  %100 = icmp eq i32 %.pre-phi, 0
  %or.cond215 = select i1 %.not194, i1 %100, i1 false
  br i1 %or.cond215, label %101, label %104

101:                                              ; preds = %98
  %102 = getelementptr inbounds i8, ptr %1, i64 8
  %103 = load ptr, ptr %102, align 8, !tbaa !18
  br label %168

104:                                              ; preds = %98
  %105 = zext i1 %.not189 to i32
  %106 = udiv i64 %72, 160
  %107 = trunc i64 %106 to i32
  %.tr = trunc i64 %54 to i32
  %108 = shl i32 %.tr, 2
  %109 = add i32 %108, -1
  %110 = getelementptr inbounds i8, ptr %1, i64 48
  %111 = call i32 @generate_q_fips186_2(ptr noundef nonnull %60, ptr noundef %65, ptr noundef nonnull %36, ptr noundef nonnull %10, ptr noundef nonnull %9, i64 noundef %45, i32 noundef %105, ptr noundef nonnull %11, ptr noundef nonnull %6, ptr noundef %7)
  %.not195.us.peel = icmp eq i32 %111, 0
  br i1 %18, label %.split.us.preheader, label %.split.preheader

.split.preheader:                                 ; preds = %104
  br i1 %.not195.us.peel, label %.thread229, label %112

112:                                              ; preds = %.split.preheader
  %113 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 0) #4
  %.not196.peel = icmp eq i32 %113, 0
  br i1 %.not196.peel, label %.thread229, label %114

114:                                              ; preds = %112
  %115 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 0) #4
  %.not197.peel = icmp eq i32 %115, 0
  br i1 %.not197.peel, label %.thread229, label %116

116:                                              ; preds = %114
  %117 = call i32 @generate_p(ptr noundef nonnull %60, ptr noundef nonnull %36, i32 noundef %109, i32 noundef %107, ptr noundef nonnull %10, i64 noundef %45, ptr noundef %65, ptr noundef %66, i32 noundef %.tr, ptr noundef %7, ptr noundef nonnull %12, ptr noundef nonnull %6)
  %118 = icmp sgt i32 %117, 0
  br i1 %118, label %.split242.us.thread, label %119

119:                                              ; preds = %116
  %120 = icmp eq i32 %117, -1
  br i1 %120, label %.thread229, label %.split

.split.us.preheader:                              ; preds = %104
  br i1 %.not195.us.peel, label %.thread229, label %121

121:                                              ; preds = %.split.us.preheader
  %122 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 0) #4
  %.not196.us.peel = icmp eq i32 %122, 0
  br i1 %.not196.us.peel, label %.thread229, label %123

123:                                              ; preds = %121
  %124 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 0) #4
  %.not197.us.peel = icmp eq i32 %124, 0
  br i1 %.not197.us.peel, label %.thread229, label %125

125:                                              ; preds = %123
  %126 = load i32, ptr %110, align 8, !tbaa !19
  %127 = icmp sgt i32 %126, %109
  br i1 %127, label %.split240.us, label %128

128:                                              ; preds = %125
  %129 = call i32 @generate_p(ptr noundef nonnull %60, ptr noundef nonnull %36, i32 noundef %126, i32 noundef %107, ptr noundef nonnull %10, i64 noundef %45, ptr noundef %65, ptr noundef %66, i32 noundef %.tr, ptr noundef %7, ptr noundef nonnull %12, ptr noundef nonnull %6)
  %130 = icmp sgt i32 %129, 0
  br i1 %130, label %.split242.us.thread253, label %131

131:                                              ; preds = %128
  %132 = icmp eq i32 %129, -1
  br i1 %132, label %.thread229, label %.split.us

.split.us:                                        ; preds = %131, %144
  %133 = call i32 @generate_q_fips186_2(ptr noundef nonnull %60, ptr noundef %65, ptr noundef nonnull %36, ptr noundef nonnull %10, ptr noundef nonnull %9, i64 noundef %45, i32 noundef 1, ptr noundef nonnull %11, ptr noundef nonnull %6, ptr noundef %7)
  %.not195.us = icmp eq i32 %133, 0
  br i1 %.not195.us, label %.thread229, label %134

134:                                              ; preds = %.split.us
  %135 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 0) #4
  %.not196.us = icmp eq i32 %135, 0
  br i1 %.not196.us, label %.thread229, label %136

136:                                              ; preds = %134
  %137 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 0) #4
  %.not197.us = icmp eq i32 %137, 0
  br i1 %.not197.us, label %.thread229, label %138

138:                                              ; preds = %136
  %139 = load i32, ptr %110, align 8, !tbaa !19
  %140 = icmp sgt i32 %139, %109
  br i1 %140, label %.split240.us, label %141

141:                                              ; preds = %138
  %142 = call i32 @generate_p(ptr noundef nonnull %60, ptr noundef nonnull %36, i32 noundef %139, i32 noundef %107, ptr noundef nonnull %10, i64 noundef %45, ptr noundef %65, ptr noundef %66, i32 noundef %.tr, ptr noundef %7, ptr noundef nonnull %12, ptr noundef nonnull %6)
  %143 = icmp sgt i32 %142, 0
  br i1 %143, label %.split242.us, label %144

144:                                              ; preds = %141
  %145 = icmp eq i32 %142, -1
  br i1 %145, label %.thread229, label %.split.us, !llvm.loop !21

.split:                                           ; preds = %119, %154
  %146 = call i32 @generate_q_fips186_2(ptr noundef nonnull %60, ptr noundef %65, ptr noundef nonnull %36, ptr noundef nonnull %10, ptr noundef nonnull %9, i64 noundef %45, i32 noundef 1, ptr noundef nonnull %11, ptr noundef nonnull %6, ptr noundef %7)
  %.not195 = icmp eq i32 %146, 0
  br i1 %.not195, label %.thread229, label %147

147:                                              ; preds = %.split
  %148 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 0) #4
  %.not196 = icmp eq i32 %148, 0
  br i1 %.not196, label %.thread229, label %149

149:                                              ; preds = %147
  %150 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 0) #4
  %.not197 = icmp eq i32 %150, 0
  br i1 %.not197, label %.thread229, label %151

151:                                              ; preds = %149
  %152 = call i32 @generate_p(ptr noundef nonnull %60, ptr noundef nonnull %36, i32 noundef %109, i32 noundef %107, ptr noundef nonnull %10, i64 noundef %45, ptr noundef %65, ptr noundef %66, i32 noundef %.tr, ptr noundef %7, ptr noundef nonnull %12, ptr noundef nonnull %6)
  %153 = icmp sgt i32 %152, 0
  br i1 %153, label %.split242.us, label %154

.split240.us:                                     ; preds = %138, %125
  store i32 4096, ptr %6, align 4, !tbaa !5
  br label %.thread229

154:                                              ; preds = %151
  %155 = icmp eq i32 %152, -1
  br i1 %155, label %.thread229, label %.split, !llvm.loop !23

.split242.us:                                     ; preds = %151, %141
  %.us-phi = phi i32 [ %139, %141 ], [ %109, %151 ]
  %156 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 1) #4
  %.not198 = icmp eq i32 %156, 0
  br i1 %.not198, label %.thread229, label %159

.split242.us.thread253:                           ; preds = %128
  %157 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 1) #4
  %.not198255 = icmp eq i32 %157, 0
  br i1 %.not198255, label %.thread229, label %.thread256

.split242.us.thread:                              ; preds = %116
  %158 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 1) #4
  %.not198249 = icmp eq i32 %158, 0
  br i1 %.not198249, label %.thread229, label %.thread251

159:                                              ; preds = %.split242.us
  br i1 %18, label %.thread256, label %.thread251

.thread256:                                       ; preds = %.split242.us.thread253, %159
  %.us-phi250258 = phi i32 [ %.us-phi, %159 ], [ %126, %.split242.us.thread253 ]
  %160 = load i32, ptr %12, align 4, !tbaa !5
  %.not199 = icmp eq i32 %160, %.us-phi250258
  br i1 %.not199, label %162, label %161

161:                                              ; preds = %.thread256
  store i32 65536, ptr %6, align 4, !tbaa !5
  br label %.thread229

162:                                              ; preds = %.thread256
  %163 = load ptr, ptr %1, align 8, !tbaa !17
  %164 = call i32 @BN_cmp(ptr noundef %66, ptr noundef %163) #4
  %.not200 = icmp eq i32 %164, 0
  br i1 %.not200, label %.thread251, label %165

165:                                              ; preds = %162
  store i32 8192, ptr %6, align 4, !tbaa !5
  br label %.thread229

.thread251:                                       ; preds = %.split242.us.thread, %162, %159
  %166 = and i32 %23, 3
  %167 = icmp eq i32 %166, 1
  br i1 %167, label %217, label %168

168:                                              ; preds = %.thread251, %101
  %.0165 = phi ptr [ %99, %101 ], [ %66, %.thread251 ]
  %.0162 = phi ptr [ %103, %101 ], [ %65, %.thread251 ]
  %169 = call ptr @BN_MONT_CTX_new() #4
  %170 = icmp eq ptr %169, null
  br i1 %170, label %.thread229, label %171

171:                                              ; preds = %168
  %172 = call i32 @BN_MONT_CTX_set(ptr noundef nonnull %169, ptr noundef %.0165, ptr noundef nonnull %60) #4
  %.not201 = icmp eq i32 %172, 0
  br i1 %.not201, label %.thread229, label %173

173:                                              ; preds = %171
  br i1 %18, label %181, label %174

174:                                              ; preds = %173
  %175 = call ptr @BN_value_one() #4
  %176 = call i32 @BN_sub(ptr noundef nonnull %68, ptr noundef %.0165, ptr noundef %175) #4
  %.not202 = icmp eq i32 %176, 0
  br i1 %.not202, label %.thread229, label %177

177:                                              ; preds = %174
  %178 = call i32 @BN_div(ptr noundef %63, ptr noundef null, ptr noundef nonnull %68, ptr noundef %.0162, ptr noundef nonnull %60) #4
  %.not203 = icmp eq i32 %178, 0
  br i1 %.not203, label %.thread229, label %179

179:                                              ; preds = %177
  %180 = call i32 @generate_unverifiable_g(ptr noundef nonnull %60, ptr noundef nonnull %169, ptr noundef %64, ptr noundef %67, ptr noundef %.0165, ptr noundef %63, ptr noundef nonnull %68, ptr noundef nonnull %13)
  %.not204 = icmp eq i32 %180, 0
  br i1 %.not204, label %.thread229, label %.thread

181:                                              ; preds = %173
  %182 = and i32 %23, 2
  %.not205 = icmp eq i32 %182, 0
  br i1 %.not205, label %187, label %183

183:                                              ; preds = %181
  %184 = getelementptr inbounds i8, ptr %1, i64 16
  %185 = load ptr, ptr %184, align 8, !tbaa !20
  %186 = call i32 @ossl_ffc_params_validate_unverifiable_g(ptr noundef nonnull %60, ptr noundef nonnull %169, ptr noundef %.0165, ptr noundef %.0162, ptr noundef %185, ptr noundef %67, ptr noundef nonnull %6) #4
  %.not206 = icmp eq i32 %186, 0
  br i1 %.not206, label %.thread229, label %187

187:                                              ; preds = %181, %183
  %188 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 1) #4
  %.not207 = icmp eq i32 %188, 0
  br i1 %.not207, label %.thread229, label %217

.thread:                                          ; preds = %179
  %189 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 1) #4
  %.not207216 = icmp eq i32 %189, 0
  br i1 %.not207216, label %.thread229, label %.thread217

.thread217:                                       ; preds = %.thread
  %190 = load ptr, ptr %1, align 8, !tbaa !17
  %.not208 = icmp eq ptr %.0165, %190
  br i1 %.not208, label %193, label %191

191:                                              ; preds = %.thread217
  call void @BN_free(ptr noundef %190) #4
  %192 = call ptr @BN_dup(ptr noundef %.0165) #4
  store ptr %192, ptr %1, align 8, !tbaa !17
  br label %193

193:                                              ; preds = %191, %.thread217
  %194 = getelementptr inbounds i8, ptr %1, i64 8
  %195 = load ptr, ptr %194, align 8, !tbaa !18
  %.not209 = icmp eq ptr %.0162, %195
  br i1 %.not209, label %198, label %196

196:                                              ; preds = %193
  call void @BN_free(ptr noundef %195) #4
  %197 = call ptr @BN_dup(ptr noundef %.0162) #4
  store ptr %197, ptr %194, align 8, !tbaa !18
  br label %198

198:                                              ; preds = %196, %193
  %199 = getelementptr inbounds i8, ptr %1, i64 16
  %200 = load ptr, ptr %199, align 8, !tbaa !20
  %.not210 = icmp eq ptr %64, %200
  br i1 %.not210, label %203, label %201

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

203:                                              ; preds = %201, %198
  %204 = phi ptr [ %202, %201 ], [ %64, %198 ]
  %205 = load ptr, ptr %1, align 8, !tbaa !17
  %206 = icmp eq ptr %205, null
  br i1 %206, label %.thread229, label %207

207:                                              ; preds = %203
  %208 = load ptr, ptr %194, align 8, !tbaa !18
  %209 = icmp eq ptr %208, null
  %210 = icmp eq ptr %204, null
  %or.cond264 = select i1 %209, i1 true, i1 %210
  br i1 %or.cond264, label %.thread229, label %211

211:                                              ; preds = %207
  %212 = load i32, ptr %12, align 4, !tbaa !5
  %213 = call i32 @ossl_ffc_params_set_validate_params(ptr noundef nonnull %1, ptr noundef nonnull %9, i64 noundef %45, i32 noundef %212) #4
  %.not211 = icmp eq i32 %213, 0
  br i1 %.not211, label %.thread229, label %214

214:                                              ; preds = %211
  %215 = load i32, ptr %13, align 4, !tbaa !5
  %216 = getelementptr inbounds i8, ptr %1, i64 60
  store i32 %215, ptr %216, align 4, !tbaa !24
  br label %217

217:                                              ; preds = %187, %214, %.thread251
  %.0168 = phi ptr [ %169, %214 ], [ null, %.thread251 ], [ %169, %187 ]
  %218 = and i32 %23, 2
  %.not212 = icmp eq i32 %218, 0
  %. = select i1 %.not212, i32 1, i32 2
  br label %.thread229

.thread229:                                       ; preds = %154, %149, %147, %.split, %.split.us, %134, %136, %144, %.split.preheader, %112, %114, %119, %.split.us.preheader, %121, %123, %131, %.split242.us.thread253, %.split242.us.thread, %.split240.us, %161, %165, %.split242.us, %168, %171, %174, %177, %179, %183, %187, %207, %203, %211, %217, %.thread, %70, %82, %97, %90, %62
  %.0159238 = phi i32 [ 0, %62 ], [ 0, %90 ], [ 0, %97 ], [ 0, %82 ], [ 0, %70 ], [ 0, %168 ], [ 0, %203 ], [ 0, %207 ], [ 0, %211 ], [ 0, %187 ], [ 0, %183 ], [ 0, %179 ], [ 0, %177 ], [ 0, %174 ], [ 0, %171 ], [ 0, %.split240.us ], [ 0, %161 ], [ 0, %165 ], [ 0, %.split242.us ], [ %., %217 ], [ 0, %.thread ], [ 0, %.split242.us.thread ], [ 0, %.split242.us.thread253 ], [ 0, %131 ], [ 0, %123 ], [ 0, %121 ], [ 0, %.split.us.preheader ], [ 0, %119 ], [ 0, %114 ], [ 0, %112 ], [ 0, %.split.preheader ], [ 0, %144 ], [ 0, %136 ], [ 0, %134 ], [ 0, %.split.us ], [ 0, %.split ], [ 0, %147 ], [ 0, %149 ], [ 0, %154 ]
  %.1169235 = phi ptr [ null, %62 ], [ null, %90 ], [ null, %97 ], [ null, %82 ], [ null, %70 ], [ null, %168 ], [ %169, %203 ], [ %169, %207 ], [ %169, %211 ], [ %169, %187 ], [ %169, %183 ], [ %169, %179 ], [ %169, %177 ], [ %169, %174 ], [ %169, %171 ], [ null, %.split240.us ], [ null, %161 ], [ null, %165 ], [ null, %.split242.us ], [ %.0168, %217 ], [ %169, %.thread ], [ null, %.split242.us.thread ], [ null, %.split242.us.thread253 ], [ null, %131 ], [ null, %123 ], [ null, %121 ], [ null, %.split.us.preheader ], [ null, %119 ], [ null, %114 ], [ null, %112 ], [ null, %.split.preheader ], [ null, %144 ], [ null, %136 ], [ null, %134 ], [ null, %.split.us ], [ null, %.split ], [ null, %147 ], [ null, %149 ], [ null, %154 ]
  call void @BN_CTX_end(ptr noundef nonnull %60) #4
  br label %.thread218

.thread218:                                       ; preds = %32, %59, %57, %51, %47, %33, %.thread229
  %.0159227 = phi i32 [ %.0159238, %.thread229 ], [ 0, %33 ], [ 0, %47 ], [ 0, %51 ], [ 0, %57 ], [ 0, %59 ], [ 0, %32 ]
  %.0161226 = phi ptr [ %60, %.thread229 ], [ null, %33 ], [ null, %47 ], [ null, %51 ], [ null, %57 ], [ null, %59 ], [ null, %32 ]
  %.1167225 = phi ptr [ %36, %.thread229 ], [ null, %33 ], [ %36, %47 ], [ %36, %51 ], [ %36, %57 ], [ %36, %59 ], [ null, %32 ]
  %.1169224 = phi ptr [ %.1169235, %.thread229 ], [ null, %33 ], [ null, %47 ], [ null, %51 ], [ null, %57 ], [ null, %59 ], [ null, %32 ]
  call void @BN_CTX_free(ptr noundef %.0161226) #4
  call void @BN_MONT_CTX_free(ptr noundef %.1169224) #4
  call void @EVP_MD_free(ptr noundef %.1167225) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %10) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %9) #4
  ret i32 %.0159227
}

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

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 = { 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, !11, i64 32}
!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, !12, i64 40}
!14 = !{!10, !6, i64 64}
!15 = !{!10, !11, i64 72}
!16 = !{!10, !11, i64 80}
!17 = !{!10, !11, i64 0}
!18 = !{!10, !11, i64 8}
!19 = !{!10, !6, i64 48}
!20 = !{!10, !11, i64 16}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.peeled.count", i32 1}
!23 = distinct !{!23, !22}
!24 = !{!10, !6, i64 60}


; Effective O3 passes: ConstraintEliminationPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopFullUnrollPass,LoopInstSimplifyPass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,SROAPass,SimplifyCFGPass,TailCallElimPass