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

; 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 i32, align 4
  %29 = alloca i64, align 8
  %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 i32, align 4
  %36 = alloca ptr, align 8
  %37 = alloca i32, align 4
  %38 = alloca ptr, align 8
  %39 = alloca i64, align 8
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = 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 4, ptr %28) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  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
  store i32 0, ptr %33, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  store ptr null, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #4
  store i32 -1, ptr %37, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  %43 = load ptr, ptr %10, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.ffc_params_st, ptr %43, i32 0, i32 4
  %45 = load ptr, ptr %44, align 8, !tbaa !13
  store ptr %45, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  %46 = load ptr, ptr %10, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.ffc_params_st, ptr %46, i32 0, i32 5
  %48 = load i64, ptr %47, align 8, !tbaa !15
  store i64 %48, ptr %39, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #4
  %49 = load i32, ptr %11, align 4, !tbaa !9
  %50 = icmp eq i32 %49, 0
  %51 = zext i1 %50 to i32
  store i32 %51, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #4
  %52 = load i32, ptr %40, align 4, !tbaa !9
  %53 = icmp ne i32 %52, 0
  br i1 %53, label %54, label %58

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

58:                                               ; preds = %8
  br label %59

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

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

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

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

85:                                               ; preds = %78, %75
  %86 = load i64, ptr %14, align 8, !tbaa !11
  %87 = call ptr @default_mdname(i64 noundef %86)
  store ptr %87, ptr %42, align 8, !tbaa !5
  %88 = load ptr, ptr %42, align 8, !tbaa !5
  %89 = icmp eq ptr %88, null
  br i1 %89, label %90, label %92

90:                                               ; preds = %85
  %91 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 32, ptr %91, align 4, !tbaa !9
  br label %498

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

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

102:                                              ; preds = %99
  br label %498

103:                                              ; preds = %99
  %104 = load ptr, ptr %27, align 8, !tbaa !5
  %105 = call i32 @EVP_MD_get_size(ptr noundef %104)
  store i32 %105, ptr %28, align 4, !tbaa !9
  %106 = load i32, ptr %28, align 4, !tbaa !9
  %107 = icmp sle i32 %106, 0
  br i1 %107, label %108, label %109

108:                                              ; preds = %103
  br label %498

109:                                              ; preds = %103
  %110 = load i64, ptr %14, align 8, !tbaa !11
  %111 = icmp eq i64 %110, 0
  br i1 %111, label %112, label %116

112:                                              ; preds = %109
  %113 = load i32, ptr %28, align 4, !tbaa !9
  %114 = mul nsw i32 %113, 8
  %115 = sext i32 %114 to i64
  store i64 %115, ptr %14, align 8, !tbaa !11
  br label %116

116:                                              ; preds = %112, %109
  %117 = load i64, ptr %14, align 8, !tbaa !11
  %118 = lshr i64 %117, 3
  store i64 %118, ptr %29, align 8, !tbaa !11
  %119 = load i64, ptr %13, align 8, !tbaa !11
  %120 = icmp ult i64 %119, 512
  br i1 %120, label %121, label %123

121:                                              ; preds = %116
  %122 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 131072, ptr %122, align 4, !tbaa !9
  br label %498

123:                                              ; preds = %116
  %124 = load i64, ptr %29, align 8, !tbaa !11
  %125 = icmp ne i64 %124, 20
  br i1 %125, label %126, label %134

126:                                              ; preds = %123
  %127 = load i64, ptr %29, align 8, !tbaa !11
  %128 = icmp ne i64 %127, 28
  br i1 %128, label %129, label %134

129:                                              ; preds = %126
  %130 = load i64, ptr %29, align 8, !tbaa !11
  %131 = icmp ne i64 %130, 32
  br i1 %131, label %132, label %134

132:                                              ; preds = %129
  %133 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 32, ptr %133, align 4, !tbaa !9
  br label %498

134:                                              ; preds = %129, %126, %123
  %135 = load i64, ptr %13, align 8, !tbaa !11
  %136 = add i64 %135, 63
  %137 = udiv i64 %136, 64
  %138 = mul i64 %137, 64
  store i64 %138, ptr %13, align 8, !tbaa !11
  %139 = load ptr, ptr %38, align 8, !tbaa !5
  %140 = icmp ne ptr %139, null
  br i1 %140, label %141, label %157

141:                                              ; preds = %134
  %142 = load i64, ptr %39, align 8, !tbaa !11
  %143 = load i64, ptr %29, align 8, !tbaa !11
  %144 = icmp ult i64 %142, %143
  br i1 %144, label %145, label %147

145:                                              ; preds = %141
  %146 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 262144, ptr %146, align 4, !tbaa !9
  br label %498

147:                                              ; preds = %141
  %148 = load i64, ptr %39, align 8, !tbaa !11
  %149 = load i64, ptr %29, align 8, !tbaa !11
  %150 = icmp ugt i64 %148, %149
  br i1 %150, label %151, label %153

151:                                              ; preds = %147
  %152 = load i64, ptr %29, align 8, !tbaa !11
  store i64 %152, ptr %39, align 8, !tbaa !11
  br label %153

153:                                              ; preds = %151, %147
  %154 = getelementptr inbounds [32 x i8], ptr %18, i64 0, i64 0
  %155 = load ptr, ptr %38, align 8, !tbaa !5
  %156 = load i64, ptr %39, align 8, !tbaa !11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %154, ptr align 1 %155, i64 %156, i1 false)
  br label %157

157:                                              ; preds = %153, %134
  %158 = load ptr, ptr %9, align 8, !tbaa !5
  %159 = call ptr @BN_CTX_new_ex(ptr noundef %158)
  store ptr %159, ptr %36, align 8, !tbaa !5
  %160 = load ptr, ptr %36, align 8, !tbaa !5
  %161 = icmp eq ptr %160, null
  br i1 %161, label %162, label %163

162:                                              ; preds = %157
  br label %498

163:                                              ; preds = %157
  %164 = load ptr, ptr %36, align 8, !tbaa !5
  call void @BN_CTX_start(ptr noundef %164)
  %165 = load ptr, ptr %36, align 8, !tbaa !5
  %166 = call ptr @BN_CTX_get(ptr noundef %165)
  store ptr %166, ptr %20, align 8, !tbaa !5
  %167 = load ptr, ptr %36, align 8, !tbaa !5
  %168 = call ptr @BN_CTX_get(ptr noundef %167)
  store ptr %168, ptr %23, align 8, !tbaa !5
  %169 = load ptr, ptr %36, align 8, !tbaa !5
  %170 = call ptr @BN_CTX_get(ptr noundef %169)
  store ptr %170, ptr %24, align 8, !tbaa !5
  %171 = load ptr, ptr %36, align 8, !tbaa !5
  %172 = call ptr @BN_CTX_get(ptr noundef %171)
  store ptr %172, ptr %25, align 8, !tbaa !5
  %173 = load ptr, ptr %36, align 8, !tbaa !5
  %174 = call ptr @BN_CTX_get(ptr noundef %173)
  store ptr %174, ptr %22, align 8, !tbaa !5
  %175 = load ptr, ptr %36, align 8, !tbaa !5
  %176 = call ptr @BN_CTX_get(ptr noundef %175)
  store ptr %176, ptr %21, align 8, !tbaa !5
  %177 = load ptr, ptr %21, align 8, !tbaa !5
  %178 = icmp eq ptr %177, null
  br i1 %178, label %179, label %180

179:                                              ; preds = %163
  br label %498

180:                                              ; preds = %163
  %181 = load ptr, ptr %21, align 8, !tbaa !5
  %182 = call ptr @BN_value_one()
  %183 = load i64, ptr %13, align 8, !tbaa !11
  %184 = sub i64 %183, 1
  %185 = trunc i64 %184 to i32
  %186 = call i32 @BN_lshift(ptr noundef %181, ptr noundef %182, i32 noundef %185)
  %187 = icmp ne i32 %186, 0
  br i1 %187, label %189, label %188

188:                                              ; preds = %180
  br label %498

189:                                              ; preds = %180
  %190 = load i32, ptr %40, align 4, !tbaa !9
  %191 = icmp ne i32 %190, 0
  br i1 %191, label %207, label %192

192:                                              ; preds = %189
  %193 = load ptr, ptr %10, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.ffc_params_st, ptr %193, i32 0, i32 0
  %195 = load ptr, ptr %194, align 8, !tbaa !19
  %196 = icmp ne ptr %195, null
  %197 = zext i1 %196 to i32
  %198 = load ptr, ptr %10, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.ffc_params_st, ptr %198, i32 0, i32 1
  %200 = load ptr, ptr %199, align 8, !tbaa !20
  %201 = icmp ne ptr %200, null
  %202 = zext i1 %201 to i32
  %203 = icmp ne i32 %197, %202
  br i1 %203, label %204, label %206

204:                                              ; preds = %192
  %205 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 2048, ptr %205, align 4, !tbaa !9
  br label %498

206:                                              ; preds = %192
  br label %235

207:                                              ; preds = %189
  %208 = load i32, ptr %41, align 4, !tbaa !9
  %209 = and i32 %208, 1
  %210 = icmp ne i32 %209, 0
  br i1 %210, label %211, label %222

211:                                              ; preds = %207
  %212 = load ptr, ptr %38, align 8, !tbaa !5
  %213 = icmp eq ptr %212, null
  br i1 %213, label %219, label %214

214:                                              ; preds = %211
  %215 = load ptr, ptr %10, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.ffc_params_st, ptr %215, i32 0, i32 6
  %217 = load i32, ptr %216, align 8, !tbaa !21
  %218 = icmp slt i32 %217, 0
  br i1 %218, label %219, label %221

219:                                              ; preds = %214, %211
  %220 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 512, ptr %220, align 4, !tbaa !9
  br label %498

221:                                              ; preds = %214
  br label %222

222:                                              ; preds = %221, %207
  %223 = load i32, ptr %41, align 4, !tbaa !9
  %224 = and i32 %223, 2
  %225 = icmp ne i32 %224, 0
  br i1 %225, label %226, label %234

226:                                              ; preds = %222
  %227 = load ptr, ptr %10, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.ffc_params_st, ptr %227, i32 0, i32 2
  %229 = load ptr, ptr %228, align 8, !tbaa !22
  %230 = icmp eq ptr %229, null
  br i1 %230, label %231, label %233

231:                                              ; preds = %226
  %232 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 1024, ptr %232, align 4, !tbaa !9
  br label %498

233:                                              ; preds = %226
  br label %234

234:                                              ; preds = %233, %222
  br label %235

235:                                              ; preds = %234, %206
  %236 = load ptr, ptr %10, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.ffc_params_st, ptr %236, i32 0, i32 0
  %238 = load ptr, ptr %237, align 8, !tbaa !19
  %239 = icmp ne ptr %238, null
  br i1 %239, label %240, label %251

240:                                              ; preds = %235
  %241 = load i32, ptr %41, align 4, !tbaa !9
  %242 = and i32 %241, 1
  %243 = icmp eq i32 %242, 0
  br i1 %243, label %244, label %251

244:                                              ; preds = %240
  %245 = load ptr, ptr %10, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.ffc_params_st, ptr %245, i32 0, i32 0
  %247 = load ptr, ptr %246, align 8, !tbaa !19
  store ptr %247, ptr %25, align 8, !tbaa !5
  %248 = load ptr, ptr %10, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.ffc_params_st, ptr %248, i32 0, i32 1
  %250 = load ptr, ptr %249, align 8, !tbaa !20
  store ptr %250, ptr %24, align 8, !tbaa !5
  br label %353

251:                                              ; preds = %240, %235
  %252 = load ptr, ptr %38, align 8, !tbaa !5
  %253 = icmp eq ptr %252, null
  %254 = zext i1 %253 to i32
  store i32 %254, ptr %34, align 4, !tbaa !9
  br label %255

255:                                              ; preds = %322, %251
  %256 = load ptr, ptr %36, align 8, !tbaa !5
  %257 = load ptr, ptr %24, align 8, !tbaa !5
  %258 = load ptr, ptr %27, align 8, !tbaa !5
  %259 = getelementptr inbounds [32 x i8], ptr %19, i64 0, i64 0
  %260 = getelementptr inbounds [32 x i8], ptr %18, i64 0, i64 0
  %261 = load i64, ptr %29, align 8, !tbaa !11
  %262 = load i32, ptr %34, align 4, !tbaa !9
  %263 = load ptr, ptr %15, align 8, !tbaa !5
  %264 = load ptr, ptr %16, align 8, !tbaa !5
  %265 = call i32 @generate_q_fips186_2(ptr noundef %256, ptr noundef %257, ptr noundef %258, ptr noundef %259, ptr noundef %260, i64 noundef %261, i32 noundef %262, ptr noundef %31, ptr noundef %263, ptr noundef %264)
  %266 = icmp ne i32 %265, 0
  br i1 %266, label %268, label %267

267:                                              ; preds = %255
  br label %498

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

272:                                              ; preds = %268
  br label %498

273:                                              ; preds = %268
  %274 = load ptr, ptr %16, align 8, !tbaa !5
  %275 = call i32 @BN_GENCB_call(ptr noundef %274, i32 noundef 3, i32 noundef 0)
  %276 = icmp ne i32 %275, 0
  br i1 %276, label %278, label %277

277:                                              ; preds = %273
  br label %498

278:                                              ; preds = %273
  %279 = load i64, ptr %13, align 8, !tbaa !11
  %280 = sub i64 %279, 1
  %281 = udiv i64 %280, 160
  %282 = trunc i64 %281 to i32
  store i32 %282, ptr %30, align 4, !tbaa !9
  %283 = load i64, ptr %13, align 8, !tbaa !11
  %284 = mul i64 4, %283
  %285 = sub i64 %284, 1
  %286 = trunc i64 %285 to i32
  store i32 %286, ptr %32, align 4, !tbaa !9
  %287 = load i32, ptr %40, align 4, !tbaa !9
  %288 = icmp ne i32 %287, 0
  br i1 %288, label %289, label %301

289:                                              ; preds = %278
  %290 = load ptr, ptr %10, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.ffc_params_st, ptr %290, i32 0, i32 6
  %292 = load i32, ptr %291, align 8, !tbaa !21
  %293 = load i32, ptr %32, align 4, !tbaa !9
  %294 = icmp sgt i32 %292, %293
  br i1 %294, label %295, label %297

295:                                              ; preds = %289
  %296 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 4096, ptr %296, align 4, !tbaa !9
  br label %498

297:                                              ; preds = %289
  %298 = load ptr, ptr %10, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.ffc_params_st, ptr %298, i32 0, i32 6
  %300 = load i32, ptr %299, align 8, !tbaa !21
  store i32 %300, ptr %32, align 4, !tbaa !9
  br label %301

301:                                              ; preds = %297, %278
  %302 = load ptr, ptr %36, align 8, !tbaa !5
  %303 = load ptr, ptr %27, align 8, !tbaa !5
  %304 = load i32, ptr %32, align 4, !tbaa !9
  %305 = load i32, ptr %30, align 4, !tbaa !9
  %306 = getelementptr inbounds [32 x i8], ptr %19, i64 0, i64 0
  %307 = load i64, ptr %29, align 8, !tbaa !11
  %308 = load ptr, ptr %24, align 8, !tbaa !5
  %309 = load ptr, ptr %25, align 8, !tbaa !5
  %310 = load i64, ptr %13, align 8, !tbaa !11
  %311 = trunc i64 %310 to i32
  %312 = load ptr, ptr %16, align 8, !tbaa !5
  %313 = load ptr, ptr %15, align 8, !tbaa !5
  %314 = call i32 @generate_p(ptr noundef %302, ptr noundef %303, i32 noundef %304, i32 noundef %305, ptr noundef %306, i64 noundef %307, ptr noundef %308, ptr noundef %309, i32 noundef %311, ptr noundef %312, ptr noundef %33, ptr noundef %313)
  store i32 %314, ptr %35, align 4, !tbaa !9
  %315 = load i32, ptr %35, align 4, !tbaa !9
  %316 = icmp sgt i32 %315, 0
  br i1 %316, label %317, label %318

317:                                              ; preds = %301
  br label %323

318:                                              ; preds = %301
  %319 = load i32, ptr %35, align 4, !tbaa !9
  %320 = icmp eq i32 %319, -1
  br i1 %320, label %321, label %322

321:                                              ; preds = %318
  br label %498

322:                                              ; preds = %318
  store i32 1, ptr %34, align 4, !tbaa !9
  br label %255

323:                                              ; preds = %317
  %324 = load ptr, ptr %16, align 8, !tbaa !5
  %325 = call i32 @BN_GENCB_call(ptr noundef %324, i32 noundef 2, i32 noundef 1)
  %326 = icmp ne i32 %325, 0
  br i1 %326, label %328, label %327

327:                                              ; preds = %323
  br label %498

328:                                              ; preds = %323
  %329 = load i32, ptr %40, align 4, !tbaa !9
  %330 = icmp ne i32 %329, 0
  br i1 %330, label %331, label %347

331:                                              ; preds = %328
  %332 = load i32, ptr %33, align 4, !tbaa !9
  %333 = load i32, ptr %32, align 4, !tbaa !9
  %334 = icmp ne i32 %332, %333
  br i1 %334, label %335, label %337

335:                                              ; preds = %331
  %336 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 65536, ptr %336, align 4, !tbaa !9
  br label %498

337:                                              ; preds = %331
  %338 = load ptr, ptr %25, align 8, !tbaa !5
  %339 = load ptr, ptr %10, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.ffc_params_st, ptr %339, i32 0, i32 0
  %341 = load ptr, ptr %340, align 8, !tbaa !19
  %342 = call i32 @BN_cmp(ptr noundef %338, ptr noundef %341)
  %343 = icmp ne i32 %342, 0
  br i1 %343, label %344, label %346

344:                                              ; preds = %337
  %345 = load ptr, ptr %15, align 8, !tbaa !5
  store i32 8192, ptr %345, align 4, !tbaa !9
  br label %498

346:                                              ; preds = %337
  br label %347

347:                                              ; preds = %346, %328
  %348 = load i32, ptr %41, align 4, !tbaa !9
  %349 = and i32 %348, 3
  %350 = icmp eq i32 %349, 1
  br i1 %350, label %351, label %352

351:                                              ; preds = %347
  br label %491

352:                                              ; preds = %347
  br label %353

353:                                              ; preds = %352, %244
  %354 = call ptr @BN_MONT_CTX_new()
  store ptr %354, ptr %26, align 8, !tbaa !5
  %355 = icmp eq ptr %354, null
  br i1 %355, label %356, label %357

356:                                              ; preds = %353
  br label %498

357:                                              ; preds = %353
  %358 = load ptr, ptr %26, align 8, !tbaa !5
  %359 = load ptr, ptr %25, align 8, !tbaa !5
  %360 = load ptr, ptr %36, align 8, !tbaa !5
  %361 = call i32 @BN_MONT_CTX_set(ptr noundef %358, ptr noundef %359, ptr noundef %360)
  %362 = icmp ne i32 %361, 0
  br i1 %362, label %364, label %363

363:                                              ; preds = %357
  br label %498

364:                                              ; preds = %357
  %365 = load i32, ptr %40, align 4, !tbaa !9
  %366 = icmp ne i32 %365, 0
  br i1 %366, label %394, label %367

367:                                              ; preds = %364
  %368 = load ptr, ptr %21, align 8, !tbaa !5
  %369 = load ptr, ptr %25, align 8, !tbaa !5
  %370 = call ptr @BN_value_one()
  %371 = call i32 @BN_sub(ptr noundef %368, ptr noundef %369, ptr noundef %370)
  %372 = icmp ne i32 %371, 0
  br i1 %372, label %374, label %373

373:                                              ; preds = %367
  br label %498

374:                                              ; preds = %367
  %375 = load ptr, ptr %20, align 8, !tbaa !5
  %376 = load ptr, ptr %21, align 8, !tbaa !5
  %377 = load ptr, ptr %24, align 8, !tbaa !5
  %378 = load ptr, ptr %36, align 8, !tbaa !5
  %379 = call i32 @BN_div(ptr noundef %375, ptr noundef null, ptr noundef %376, ptr noundef %377, ptr noundef %378)
  %380 = icmp ne i32 %379, 0
  br i1 %380, label %382, label %381

381:                                              ; preds = %374
  br label %498

382:                                              ; preds = %374
  %383 = load ptr, ptr %36, align 8, !tbaa !5
  %384 = load ptr, ptr %26, align 8, !tbaa !5
  %385 = load ptr, ptr %23, align 8, !tbaa !5
  %386 = load ptr, ptr %22, align 8, !tbaa !5
  %387 = load ptr, ptr %25, align 8, !tbaa !5
  %388 = load ptr, ptr %20, align 8, !tbaa !5
  %389 = load ptr, ptr %21, align 8, !tbaa !5
  %390 = call i32 @generate_unverifiable_g(ptr noundef %383, ptr noundef %384, ptr noundef %385, ptr noundef %386, ptr noundef %387, ptr noundef %388, ptr noundef %389, ptr noundef %37)
  %391 = icmp ne i32 %390, 0
  br i1 %391, label %393, label %392

392:                                              ; preds = %382
  br label %498

393:                                              ; preds = %382
  br label %412

394:                                              ; preds = %364
  %395 = load i32, ptr %41, align 4, !tbaa !9
  %396 = and i32 %395, 2
  %397 = icmp ne i32 %396, 0
  br i1 %397, label %398, label %411

398:                                              ; preds = %394
  %399 = load ptr, ptr %36, align 8, !tbaa !5
  %400 = load ptr, ptr %26, align 8, !tbaa !5
  %401 = load ptr, ptr %25, align 8, !tbaa !5
  %402 = load ptr, ptr %24, align 8, !tbaa !5
  %403 = load ptr, ptr %10, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.ffc_params_st, ptr %403, i32 0, i32 2
  %405 = load ptr, ptr %404, align 8, !tbaa !22
  %406 = load ptr, ptr %22, align 8, !tbaa !5
  %407 = load ptr, ptr %15, align 8, !tbaa !5
  %408 = call i32 @ossl_ffc_params_validate_unverifiable_g(ptr noundef %399, ptr noundef %400, ptr noundef %401, ptr noundef %402, ptr noundef %405, ptr noundef %406, ptr noundef %407)
  %409 = icmp ne i32 %408, 0
  br i1 %409, label %411, label %410

410:                                              ; preds = %398
  br label %498

411:                                              ; preds = %398, %394
  br label %412

412:                                              ; preds = %411, %393
  %413 = load ptr, ptr %16, align 8, !tbaa !5
  %414 = call i32 @BN_GENCB_call(ptr noundef %413, i32 noundef 3, i32 noundef 1)
  %415 = icmp ne i32 %414, 0
  br i1 %415, label %417, label %416

416:                                              ; preds = %412
  br label %498

417:                                              ; preds = %412
  %418 = load i32, ptr %40, align 4, !tbaa !9
  %419 = icmp ne i32 %418, 0
  br i1 %419, label %490, label %420

420:                                              ; preds = %417
  %421 = load ptr, ptr %25, align 8, !tbaa !5
  %422 = load ptr, ptr %10, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.ffc_params_st, ptr %422, i32 0, i32 0
  %424 = load ptr, ptr %423, align 8, !tbaa !19
  %425 = icmp ne ptr %421, %424
  br i1 %425, label %426, label %434

426:                                              ; preds = %420
  %427 = load ptr, ptr %10, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.ffc_params_st, ptr %427, i32 0, i32 0
  %429 = load ptr, ptr %428, align 8, !tbaa !19
  call void @BN_free(ptr noundef %429)
  %430 = load ptr, ptr %25, align 8, !tbaa !5
  %431 = call ptr @BN_dup(ptr noundef %430)
  %432 = load ptr, ptr %10, align 8, !tbaa !5
  %433 = getelementptr inbounds %struct.ffc_params_st, ptr %432, i32 0, i32 0
  store ptr %431, ptr %433, align 8, !tbaa !19
  br label %434

434:                                              ; preds = %426, %420
  %435 = load ptr, ptr %24, align 8, !tbaa !5
  %436 = load ptr, ptr %10, align 8, !tbaa !5
  %437 = getelementptr inbounds %struct.ffc_params_st, ptr %436, i32 0, i32 1
  %438 = load ptr, ptr %437, align 8, !tbaa !20
  %439 = icmp ne ptr %435, %438
  br i1 %439, label %440, label %448

440:                                              ; preds = %434
  %441 = load ptr, ptr %10, align 8, !tbaa !5
  %442 = getelementptr inbounds %struct.ffc_params_st, ptr %441, i32 0, i32 1
  %443 = load ptr, ptr %442, align 8, !tbaa !20
  call void @BN_free(ptr noundef %443)
  %444 = load ptr, ptr %24, align 8, !tbaa !5
  %445 = call ptr @BN_dup(ptr noundef %444)
  %446 = load ptr, ptr %10, align 8, !tbaa !5
  %447 = getelementptr inbounds %struct.ffc_params_st, ptr %446, i32 0, i32 1
  store ptr %445, ptr %447, align 8, !tbaa !20
  br label %448

448:                                              ; preds = %440, %434
  %449 = load ptr, ptr %23, align 8, !tbaa !5
  %450 = load ptr, ptr %10, align 8, !tbaa !5
  %451 = getelementptr inbounds %struct.ffc_params_st, ptr %450, i32 0, i32 2
  %452 = load ptr, ptr %451, align 8, !tbaa !22
  %453 = icmp ne ptr %449, %452
  br i1 %453, label %454, label %462

454:                                              ; preds = %448
  %455 = load ptr, ptr %10, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.ffc_params_st, ptr %455, i32 0, i32 2
  %457 = load ptr, ptr %456, align 8, !tbaa !22
  call void @BN_free(ptr noundef %457)
  %458 = load ptr, ptr %23, align 8, !tbaa !5
  %459 = call ptr @BN_dup(ptr noundef %458)
  %460 = load ptr, ptr %10, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.ffc_params_st, ptr %460, i32 0, i32 2
  store ptr %459, ptr %461, align 8, !tbaa !22
  br label %462

462:                                              ; preds = %454, %448
  %463 = load ptr, ptr %10, align 8, !tbaa !5
  %464 = getelementptr inbounds %struct.ffc_params_st, ptr %463, i32 0, i32 0
  %465 = load ptr, ptr %464, align 8, !tbaa !19
  %466 = icmp eq ptr %465, null
  br i1 %466, label %477, label %467

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

472:                                              ; preds = %467
  %473 = load ptr, ptr %10, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.ffc_params_st, ptr %473, i32 0, i32 2
  %475 = load ptr, ptr %474, align 8, !tbaa !22
  %476 = icmp eq ptr %475, null
  br i1 %476, label %477, label %478

477:                                              ; preds = %472, %467, %462
  br label %498

478:                                              ; preds = %472
  %479 = load ptr, ptr %10, align 8, !tbaa !5
  %480 = getelementptr inbounds [32 x i8], ptr %18, i64 0, i64 0
  %481 = load i64, ptr %29, align 8, !tbaa !11
  %482 = load i32, ptr %33, align 4, !tbaa !9
  %483 = call i32 @ossl_ffc_params_set_validate_params(ptr noundef %479, ptr noundef %480, i64 noundef %481, i32 noundef %482)
  %484 = icmp ne i32 %483, 0
  br i1 %484, label %486, label %485

485:                                              ; preds = %478
  br label %498

486:                                              ; preds = %478
  %487 = load i32, ptr %37, align 4, !tbaa !9
  %488 = load ptr, ptr %10, align 8, !tbaa !5
  %489 = getelementptr inbounds %struct.ffc_params_st, ptr %488, i32 0, i32 9
  store i32 %487, ptr %489, align 4, !tbaa !23
  br label %490

490:                                              ; preds = %486, %417
  br label %491

491:                                              ; preds = %490, %351
  %492 = load i32, ptr %41, align 4, !tbaa !9
  %493 = and i32 %492, 2
  %494 = icmp ne i32 %493, 0
  br i1 %494, label %495, label %496

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

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

497:                                              ; preds = %496, %495
  br label %498

498:                                              ; preds = %497, %485, %477, %416, %410, %392, %381, %373, %363, %356, %344, %335, %327, %321, %295, %277, %272, %267, %231, %219, %204, %188, %179, %162, %145, %132, %121, %108, %102, %90
  %499 = load ptr, ptr %36, align 8, !tbaa !5
  %500 = icmp ne ptr %499, null
  br i1 %500, label %501, label %503

501:                                              ; preds = %498
  %502 = load ptr, ptr %36, align 8, !tbaa !5
  call void @BN_CTX_end(ptr noundef %502)
  br label %503

503:                                              ; preds = %501, %498
  %504 = load ptr, ptr %36, align 8, !tbaa !5
  call void @BN_CTX_free(ptr noundef %504)
  %505 = load ptr, ptr %26, align 8, !tbaa !5
  call void @BN_MONT_CTX_free(ptr noundef %505)
  %506 = load ptr, ptr %27, align 8, !tbaa !5
  call void @EVP_MD_free(ptr noundef %506)
  %507 = load i32, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #4
  call void @llvm.lifetime.end.p0(i64 4, 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 8, 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 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 8, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 4, 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 %507
}

; 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 %.thread221

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 %.thread221, label %38

38:                                               ; preds = %33
  %39 = tail call i32 @EVP_MD_get_size(ptr noundef nonnull %36) #4
  %40 = icmp slt i32 %39, 1
  br i1 %40, label %.thread221, label %41

41:                                               ; preds = %38
  %42 = icmp eq i64 %.1, 0
  %43 = shl nsw i32 %39, 3
  %44 = zext nneg i32 %43 to i64
  %.2 = select i1 %42, i64 %44, i64 %.1
  %45 = lshr i64 %.2, 3
  %46 = icmp ult i64 %4, 512
  br i1 %46, label %47, label %48

47:                                               ; preds = %41
  store i32 131072, ptr %6, align 4, !tbaa !5
  br label %.thread221

48:                                               ; preds = %41
  %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 %.thread221

52:                                               ; preds = %48
  %53 = add i64 %4, 63
  %54 = and i64 %53, -64
  %.not192 = icmp eq ptr %15, null
  br i1 %.not192, 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 262144, ptr %6, align 4, !tbaa !5
  br label %.thread221

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 %.thread221, 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 %.thread232, 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
  %.not193 = icmp eq i32 %74, 0
  br i1 %.not193, label %.thread232, 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
  %.not194 = xor i1 %78, %81
  br i1 %.not194, 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 %.thread232

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

85:                                               ; preds = %83
  br i1 %.not192, 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 %.thread232

91:                                               ; preds = %86, %83
  %92 = and i32 %23, 2
  %.not196 = icmp eq i32 %92, 0
  br i1 %.not196, 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 %.thread232

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
  %.not197 = icmp ne ptr %99, null
  %100 = icmp eq i32 %.pre-phi, 0
  %or.cond218 = select i1 %.not197, i1 %100, i1 false
  br i1 %or.cond218, 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 %.not192 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)
  %.not198.us.peel = icmp eq i32 %111, 0
  br i1 %18, label %.split.us.preheader, label %.split.preheader

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

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

114:                                              ; preds = %112
  %115 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 0) #4
  %.not200.peel = icmp eq i32 %115, 0
  br i1 %.not200.peel, label %.thread232, 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 %.split245.us.thread, label %119

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

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

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

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

125:                                              ; preds = %123
  %126 = load i32, ptr %110, align 8, !tbaa !19
  %127 = icmp sgt i32 %126, %109
  br i1 %127, label %.split243.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 %.split245.us.thread256, label %131

131:                                              ; preds = %128
  %132 = icmp eq i32 %129, -1
  br i1 %132, label %.thread232, 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)
  %.not198.us = icmp eq i32 %133, 0
  br i1 %.not198.us, label %.thread232, label %134

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

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

138:                                              ; preds = %136
  %139 = load i32, ptr %110, align 8, !tbaa !19
  %140 = icmp sgt i32 %139, %109
  br i1 %140, label %.split243.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 %.split245.us, label %144

144:                                              ; preds = %141
  %145 = icmp eq i32 %142, -1
  br i1 %145, label %.thread232, 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)
  %.not198 = icmp eq i32 %146, 0
  br i1 %.not198, label %.thread232, label %147

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

149:                                              ; preds = %147
  %150 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 3, i32 noundef 0) #4
  %.not200 = icmp eq i32 %150, 0
  br i1 %.not200, label %.thread232, 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 %.split245.us, label %154

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

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

.split245.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
  %.not201 = icmp eq i32 %156, 0
  br i1 %.not201, label %.thread232, label %159

.split245.us.thread256:                           ; preds = %128
  %157 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 1) #4
  %.not201258 = icmp eq i32 %157, 0
  br i1 %.not201258, label %.thread232, label %.thread259

.split245.us.thread:                              ; preds = %116
  %158 = call i32 @BN_GENCB_call(ptr noundef %7, i32 noundef 2, i32 noundef 1) #4
  %.not201252 = icmp eq i32 %158, 0
  br i1 %.not201252, label %.thread232, label %.thread254

159:                                              ; preds = %.split245.us
  br i1 %18, label %.thread259, label %.thread254

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

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

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

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

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

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

171:                                              ; preds = %168
  %172 = call i32 @BN_MONT_CTX_set(ptr noundef nonnull %169, ptr noundef %.0167, ptr noundef nonnull %60) #4
  %.not204 = icmp eq i32 %172, 0
  br i1 %.not204, label %.thread232, 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 %.0167, ptr noundef %175) #4
  %.not205 = icmp eq i32 %176, 0
  br i1 %.not205, label %.thread232, label %177

177:                                              ; preds = %174
  %178 = call i32 @BN_div(ptr noundef %63, ptr noundef null, ptr noundef nonnull %68, ptr noundef %.0164, ptr noundef nonnull %60) #4
  %.not206 = icmp eq i32 %178, 0
  br i1 %.not206, label %.thread232, 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 %.0167, ptr noundef %63, ptr noundef nonnull %68, ptr noundef nonnull %13)
  %.not207 = icmp eq i32 %180, 0
  br i1 %.not207, label %.thread232, label %.thread

181:                                              ; preds = %173
  %182 = and i32 %23, 2
  %.not208 = icmp eq i32 %182, 0
  br i1 %.not208, 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 %.0167, ptr noundef %.0164, ptr noundef %185, ptr noundef %67, ptr noundef nonnull %6) #4
  %.not209 = icmp eq i32 %186, 0
  br i1 %.not209, label %.thread232, label %187

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

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

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

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

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

196:                                              ; preds = %193
  call void @BN_free(ptr noundef %195) #4
  %197 = call ptr @BN_dup(ptr noundef %.0164) #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
  %.not213 = icmp eq ptr %64, %200
  br i1 %.not213, 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 %.thread232, 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.cond267 = select i1 %209, i1 true, i1 %210
  br i1 %or.cond267, label %.thread232, 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
  %.not214 = icmp eq i32 %213, 0
  br i1 %.not214, label %.thread232, 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, %.thread254
  %.0168 = phi ptr [ %169, %214 ], [ null, %.thread254 ], [ %169, %187 ]
  %218 = and i32 %23, 2
  %.not215 = icmp eq i32 %218, 0
  %. = select i1 %.not215, i32 1, i32 2
  br label %.thread232

.thread232:                                       ; preds = %154, %149, %147, %.split, %.split.us, %134, %136, %144, %.split.preheader, %112, %114, %119, %.split.us.preheader, %121, %123, %131, %.split245.us.thread256, %.split245.us.thread, %.split243.us, %161, %165, %.split245.us, %168, %171, %174, %177, %179, %183, %187, %207, %203, %211, %217, %.thread, %70, %82, %97, %90, %62
  %.0161241 = 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, %.split243.us ], [ 0, %161 ], [ 0, %165 ], [ 0, %.split245.us ], [ %., %217 ], [ 0, %.thread ], [ 0, %.split245.us.thread ], [ 0, %.split245.us.thread256 ], [ 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 ]
  %.1169239 = 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, %.split243.us ], [ null, %161 ], [ null, %165 ], [ null, %.split245.us ], [ %.0168, %217 ], [ %169, %.thread ], [ null, %.split245.us.thread ], [ null, %.split245.us.thread256 ], [ 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 %.thread221

.thread221:                                       ; preds = %32, %59, %57, %51, %47, %38, %33, %.thread232
  %.0161230 = phi i32 [ %.0161241, %.thread232 ], [ 0, %33 ], [ 0, %38 ], [ 0, %47 ], [ 0, %51 ], [ 0, %57 ], [ 0, %59 ], [ 0, %32 ]
  %.0163229 = phi ptr [ %60, %.thread232 ], [ null, %33 ], [ null, %38 ], [ null, %47 ], [ null, %51 ], [ null, %57 ], [ null, %59 ], [ null, %32 ]
  %.1169228 = phi ptr [ %.1169239, %.thread232 ], [ null, %33 ], [ null, %38 ], [ null, %47 ], [ null, %51 ], [ null, %57 ], [ null, %59 ], [ null, %32 ]
  %.1171227 = phi ptr [ %36, %.thread232 ], [ null, %33 ], [ %36, %38 ], [ %36, %47 ], [ %36, %51 ], [ %36, %57 ], [ %36, %59 ], [ null, %32 ]
  call void @BN_CTX_free(ptr noundef %.0163229) #4
  call void @BN_MONT_CTX_free(ptr noundef %.1169228) #4
  call void @EVP_MD_free(ptr noundef %.1171227) #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 %.0161230
}

; 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