; LLVM IR from openssl/openssl :: crypto/ec (ecp_nistp224)

; 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.ec_group_st = type { ptr, ptr, ptr, ptr, i32, i32, i32, i32, ptr, i64, ptr, [6 x i32], ptr, ptr, i32, ptr, ptr, ptr, ptr, i32, %union.anon, ptr, ptr }
%union.anon = type { ptr }
%struct.nistp224_pre_comp_st = type { [2 x [16 x [3 x [4 x i64]]]], %struct.CRYPTO_REF_COUNT }
%struct.CRYPTO_REF_COUNT = type { i32 }
%struct.ec_point_st = type { ptr, i32, ptr, ptr, ptr, i32 }

@nistp224_curve_params = external hidden constant [5 x [28 x i8]], align 16
@gmul = external hidden constant [2 x [16 x [3 x [4 x i64]]]], align 16

; Function Attrs: nounwind uwtable
define dso_local i32 @ossl_ec_GFp_nistp224_precompute_mult(ptr noundef %0, ptr noundef %1) #0 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca [32 x [4 x i64]], align 16
  %14 = alloca ptr, align 8
  %15 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  store i32 0, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #5
  store ptr null, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  store ptr null, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1024, ptr %13) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  store ptr null, ptr %14, align 8, !tbaa !5
  %16 = load ptr, ptr %4, align 8, !tbaa !5
  call void @EC_pre_comp_free(ptr noundef %16)
  %17 = load ptr, ptr %5, align 8, !tbaa !5
  %18 = icmp eq ptr %17, null
  br i1 %18, label %19, label %21

19:                                               ; preds = %2
  %20 = call ptr @BN_CTX_new()
  store ptr %20, ptr %14, align 8, !tbaa !5
  store ptr %20, ptr %5, align 8, !tbaa !5
  br label %21

21:                                               ; preds = %19, %2
  %22 = load ptr, ptr %5, align 8, !tbaa !5
  %23 = icmp eq ptr %22, null
  br i1 %23, label %24, label %25

24:                                               ; preds = %21
  store i32 0, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %770

25:                                               ; preds = %21
  %26 = load ptr, ptr %5, align 8, !tbaa !5
  call void @BN_CTX_start(ptr noundef %26)
  %27 = load ptr, ptr %5, align 8, !tbaa !5
  %28 = call ptr @BN_CTX_get(ptr noundef %27)
  store ptr %28, ptr %10, align 8, !tbaa !5
  %29 = load ptr, ptr %5, align 8, !tbaa !5
  %30 = call ptr @BN_CTX_get(ptr noundef %29)
  store ptr %30, ptr %11, align 8, !tbaa !5
  %31 = load ptr, ptr %11, align 8, !tbaa !5
  %32 = icmp eq ptr %31, null
  br i1 %32, label %33, label %34

33:                                               ; preds = %25
  br label %764

34:                                               ; preds = %25
  %35 = load ptr, ptr %4, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.ec_group_st, ptr %35, i32 0, i32 1
  %37 = load ptr, ptr %36, align 8, !tbaa !11
  %38 = icmp eq ptr %37, null
  br i1 %38, label %39, label %40

39:                                               ; preds = %34
  br label %764

40:                                               ; preds = %34
  %41 = load ptr, ptr %4, align 8, !tbaa !5
  %42 = call ptr @EC_POINT_new(ptr noundef %41)
  store ptr %42, ptr %12, align 8, !tbaa !5
  %43 = load ptr, ptr %12, align 8, !tbaa !5
  %44 = icmp eq ptr %43, null
  br i1 %44, label %45, label %46

45:                                               ; preds = %40
  br label %764

46:                                               ; preds = %40
  %47 = load ptr, ptr %10, align 8, !tbaa !5
  %48 = call ptr @BN_bin2bn(ptr noundef getelementptr inbounds ([5 x [28 x i8]], ptr @nistp224_curve_params, i64 0, i64 3), i32 noundef 28, ptr noundef %47)
  %49 = load ptr, ptr %11, align 8, !tbaa !5
  %50 = call ptr @BN_bin2bn(ptr noundef getelementptr inbounds ([5 x [28 x i8]], ptr @nistp224_curve_params, i64 0, i64 4), i32 noundef 28, ptr noundef %49)
  %51 = load ptr, ptr %4, align 8, !tbaa !5
  %52 = load ptr, ptr %12, align 8, !tbaa !5
  %53 = load ptr, ptr %10, align 8, !tbaa !5
  %54 = load ptr, ptr %11, align 8, !tbaa !5
  %55 = load ptr, ptr %5, align 8, !tbaa !5
  %56 = call i32 @EC_POINT_set_affine_coordinates(ptr noundef %51, ptr noundef %52, ptr noundef %53, ptr noundef %54, ptr noundef %55)
  %57 = icmp ne i32 %56, 0
  br i1 %57, label %59, label %58

58:                                               ; preds = %46
  br label %764

59:                                               ; preds = %46
  %60 = call ptr @nistp224_pre_comp_new()
  store ptr %60, ptr %7, align 8, !tbaa !5
  %61 = icmp eq ptr %60, null
  br i1 %61, label %62, label %63

62:                                               ; preds = %59
  br label %764

63:                                               ; preds = %59
  %64 = load ptr, ptr %4, align 8, !tbaa !5
  %65 = load ptr, ptr %12, align 8, !tbaa !5
  %66 = load ptr, ptr %4, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.ec_group_st, ptr %66, i32 0, i32 1
  %68 = load ptr, ptr %67, align 8, !tbaa !11
  %69 = load ptr, ptr %5, align 8, !tbaa !5
  %70 = call i32 @EC_POINT_cmp(ptr noundef %64, ptr noundef %65, ptr noundef %68, ptr noundef %69)
  %71 = icmp eq i32 0, %70
  br i1 %71, label %72, label %76

72:                                               ; preds = %63
  %73 = load ptr, ptr %7, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %73, i32 0, i32 0
  %75 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %74, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %75, ptr align 16 @gmul, i64 3072, i1 false)
  br label %758

76:                                               ; preds = %63
  %77 = load ptr, ptr %7, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %77, i32 0, i32 0
  %79 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %78, i64 0, i64 0
  %80 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %79, i64 0, i64 1
  %81 = getelementptr inbounds [3 x [4 x i64]], ptr %80, i64 0, i64 0
  %82 = getelementptr inbounds [4 x i64], ptr %81, i64 0, i64 0
  %83 = load ptr, ptr %4, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.ec_group_st, ptr %83, i32 0, i32 1
  %85 = load ptr, ptr %84, align 8, !tbaa !11
  %86 = getelementptr inbounds %struct.ec_point_st, ptr %85, i32 0, i32 2
  %87 = load ptr, ptr %86, align 8, !tbaa !14
  %88 = call i32 @BN_to_felem(ptr noundef %82, ptr noundef %87)
  %89 = icmp ne i32 %88, 0
  br i1 %89, label %90, label %118

90:                                               ; preds = %76
  %91 = load ptr, ptr %7, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %91, i32 0, i32 0
  %93 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %92, i64 0, i64 0
  %94 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %93, i64 0, i64 1
  %95 = getelementptr inbounds [3 x [4 x i64]], ptr %94, i64 0, i64 1
  %96 = getelementptr inbounds [4 x i64], ptr %95, i64 0, i64 0
  %97 = load ptr, ptr %4, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.ec_group_st, ptr %97, i32 0, i32 1
  %99 = load ptr, ptr %98, align 8, !tbaa !11
  %100 = getelementptr inbounds %struct.ec_point_st, ptr %99, i32 0, i32 3
  %101 = load ptr, ptr %100, align 8, !tbaa !16
  %102 = call i32 @BN_to_felem(ptr noundef %96, ptr noundef %101)
  %103 = icmp ne i32 %102, 0
  br i1 %103, label %104, label %118

104:                                              ; preds = %90
  %105 = load ptr, ptr %7, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %105, i32 0, i32 0
  %107 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %106, i64 0, i64 0
  %108 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %107, i64 0, i64 1
  %109 = getelementptr inbounds [3 x [4 x i64]], ptr %108, i64 0, i64 2
  %110 = getelementptr inbounds [4 x i64], ptr %109, i64 0, i64 0
  %111 = load ptr, ptr %4, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.ec_group_st, ptr %111, i32 0, i32 1
  %113 = load ptr, ptr %112, align 8, !tbaa !11
  %114 = getelementptr inbounds %struct.ec_point_st, ptr %113, i32 0, i32 4
  %115 = load ptr, ptr %114, align 8, !tbaa !17
  %116 = call i32 @BN_to_felem(ptr noundef %110, ptr noundef %115)
  %117 = icmp ne i32 %116, 0
  br i1 %117, label %119, label %118

118:                                              ; preds = %104, %90, %76
  br label %764

119:                                              ; preds = %104
  store i32 1, ptr %8, align 4, !tbaa !9
  br label %120

120:                                              ; preds = %345, %119
  %121 = load i32, ptr %8, align 4, !tbaa !9
  %122 = icmp sle i32 %121, 8
  br i1 %122, label %123, label %348

123:                                              ; preds = %120
  %124 = load ptr, ptr %7, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %124, i32 0, i32 0
  %126 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %125, i64 0, i64 1
  %127 = load i32, ptr %8, align 4, !tbaa !9
  %128 = sext i32 %127 to i64
  %129 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %126, i64 0, i64 %128
  %130 = getelementptr inbounds [3 x [4 x i64]], ptr %129, i64 0, i64 0
  %131 = getelementptr inbounds [4 x i64], ptr %130, i64 0, i64 0
  %132 = load ptr, ptr %7, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %132, i32 0, i32 0
  %134 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %133, i64 0, i64 1
  %135 = load i32, ptr %8, align 4, !tbaa !9
  %136 = sext i32 %135 to i64
  %137 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %134, i64 0, i64 %136
  %138 = getelementptr inbounds [3 x [4 x i64]], ptr %137, i64 0, i64 1
  %139 = getelementptr inbounds [4 x i64], ptr %138, i64 0, i64 0
  %140 = load ptr, ptr %7, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %140, i32 0, i32 0
  %142 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %141, i64 0, i64 1
  %143 = load i32, ptr %8, align 4, !tbaa !9
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %142, i64 0, i64 %144
  %146 = getelementptr inbounds [3 x [4 x i64]], ptr %145, i64 0, i64 2
  %147 = getelementptr inbounds [4 x i64], ptr %146, i64 0, i64 0
  %148 = load ptr, ptr %7, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %148, i32 0, i32 0
  %150 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %149, i64 0, i64 0
  %151 = load i32, ptr %8, align 4, !tbaa !9
  %152 = sext i32 %151 to i64
  %153 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %150, i64 0, i64 %152
  %154 = getelementptr inbounds [3 x [4 x i64]], ptr %153, i64 0, i64 0
  %155 = getelementptr inbounds [4 x i64], ptr %154, i64 0, i64 0
  %156 = load ptr, ptr %7, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %156, i32 0, i32 0
  %158 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %157, i64 0, i64 0
  %159 = load i32, ptr %8, align 4, !tbaa !9
  %160 = sext i32 %159 to i64
  %161 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %158, i64 0, i64 %160
  %162 = getelementptr inbounds [3 x [4 x i64]], ptr %161, i64 0, i64 1
  %163 = getelementptr inbounds [4 x i64], ptr %162, i64 0, i64 0
  %164 = load ptr, ptr %7, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %164, i32 0, i32 0
  %166 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %165, i64 0, i64 0
  %167 = load i32, ptr %8, align 4, !tbaa !9
  %168 = sext i32 %167 to i64
  %169 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %166, i64 0, i64 %168
  %170 = getelementptr inbounds [3 x [4 x i64]], ptr %169, i64 0, i64 2
  %171 = getelementptr inbounds [4 x i64], ptr %170, i64 0, i64 0
  call void @point_double(ptr noundef %131, ptr noundef %139, ptr noundef %147, ptr noundef %155, ptr noundef %163, ptr noundef %171)
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %172

172:                                              ; preds = %224, %123
  %173 = load i32, ptr %9, align 4, !tbaa !9
  %174 = icmp slt i32 %173, 27
  br i1 %174, label %175, label %227

175:                                              ; preds = %172
  %176 = load ptr, ptr %7, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %176, i32 0, i32 0
  %178 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %177, i64 0, i64 1
  %179 = load i32, ptr %8, align 4, !tbaa !9
  %180 = sext i32 %179 to i64
  %181 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %178, i64 0, i64 %180
  %182 = getelementptr inbounds [3 x [4 x i64]], ptr %181, i64 0, i64 0
  %183 = getelementptr inbounds [4 x i64], ptr %182, i64 0, i64 0
  %184 = load ptr, ptr %7, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %184, i32 0, i32 0
  %186 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %185, i64 0, i64 1
  %187 = load i32, ptr %8, align 4, !tbaa !9
  %188 = sext i32 %187 to i64
  %189 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %186, i64 0, i64 %188
  %190 = getelementptr inbounds [3 x [4 x i64]], ptr %189, i64 0, i64 1
  %191 = getelementptr inbounds [4 x i64], ptr %190, i64 0, i64 0
  %192 = load ptr, ptr %7, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %192, i32 0, i32 0
  %194 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %193, i64 0, i64 1
  %195 = load i32, ptr %8, align 4, !tbaa !9
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %194, i64 0, i64 %196
  %198 = getelementptr inbounds [3 x [4 x i64]], ptr %197, i64 0, i64 2
  %199 = getelementptr inbounds [4 x i64], ptr %198, i64 0, i64 0
  %200 = load ptr, ptr %7, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %200, i32 0, i32 0
  %202 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %201, i64 0, i64 1
  %203 = load i32, ptr %8, align 4, !tbaa !9
  %204 = sext i32 %203 to i64
  %205 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %202, i64 0, i64 %204
  %206 = getelementptr inbounds [3 x [4 x i64]], ptr %205, i64 0, i64 0
  %207 = getelementptr inbounds [4 x i64], ptr %206, i64 0, i64 0
  %208 = load ptr, ptr %7, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %208, i32 0, i32 0
  %210 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %209, i64 0, i64 1
  %211 = load i32, ptr %8, align 4, !tbaa !9
  %212 = sext i32 %211 to i64
  %213 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %210, i64 0, i64 %212
  %214 = getelementptr inbounds [3 x [4 x i64]], ptr %213, i64 0, i64 1
  %215 = getelementptr inbounds [4 x i64], ptr %214, i64 0, i64 0
  %216 = load ptr, ptr %7, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %216, i32 0, i32 0
  %218 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %217, i64 0, i64 1
  %219 = load i32, ptr %8, align 4, !tbaa !9
  %220 = sext i32 %219 to i64
  %221 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %218, i64 0, i64 %220
  %222 = getelementptr inbounds [3 x [4 x i64]], ptr %221, i64 0, i64 2
  %223 = getelementptr inbounds [4 x i64], ptr %222, i64 0, i64 0
  call void @point_double(ptr noundef %183, ptr noundef %191, ptr noundef %199, ptr noundef %207, ptr noundef %215, ptr noundef %223)
  br label %224

224:                                              ; preds = %175
  %225 = load i32, ptr %9, align 4, !tbaa !9
  %226 = add nsw i32 %225, 1
  store i32 %226, ptr %9, align 4, !tbaa !9
  br label %172, !llvm.loop !18

227:                                              ; preds = %172
  %228 = load i32, ptr %8, align 4, !tbaa !9
  %229 = icmp eq i32 %228, 8
  br i1 %229, label %230, label %231

230:                                              ; preds = %227
  br label %348

231:                                              ; preds = %227
  %232 = load ptr, ptr %7, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %232, i32 0, i32 0
  %234 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %233, i64 0, i64 0
  %235 = load i32, ptr %8, align 4, !tbaa !9
  %236 = mul nsw i32 2, %235
  %237 = sext i32 %236 to i64
  %238 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %234, i64 0, i64 %237
  %239 = getelementptr inbounds [3 x [4 x i64]], ptr %238, i64 0, i64 0
  %240 = getelementptr inbounds [4 x i64], ptr %239, i64 0, i64 0
  %241 = load ptr, ptr %7, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %241, i32 0, i32 0
  %243 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %242, i64 0, i64 0
  %244 = load i32, ptr %8, align 4, !tbaa !9
  %245 = mul nsw i32 2, %244
  %246 = sext i32 %245 to i64
  %247 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %243, i64 0, i64 %246
  %248 = getelementptr inbounds [3 x [4 x i64]], ptr %247, i64 0, i64 1
  %249 = getelementptr inbounds [4 x i64], ptr %248, i64 0, i64 0
  %250 = load ptr, ptr %7, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %250, i32 0, i32 0
  %252 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %251, i64 0, i64 0
  %253 = load i32, ptr %8, align 4, !tbaa !9
  %254 = mul nsw i32 2, %253
  %255 = sext i32 %254 to i64
  %256 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %252, i64 0, i64 %255
  %257 = getelementptr inbounds [3 x [4 x i64]], ptr %256, i64 0, i64 2
  %258 = getelementptr inbounds [4 x i64], ptr %257, i64 0, i64 0
  %259 = load ptr, ptr %7, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %259, i32 0, i32 0
  %261 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %260, i64 0, i64 1
  %262 = load i32, ptr %8, align 4, !tbaa !9
  %263 = sext i32 %262 to i64
  %264 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %261, i64 0, i64 %263
  %265 = getelementptr inbounds [3 x [4 x i64]], ptr %264, i64 0, i64 0
  %266 = getelementptr inbounds [4 x i64], ptr %265, i64 0, i64 0
  %267 = load ptr, ptr %7, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %267, i32 0, i32 0
  %269 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %268, i64 0, i64 1
  %270 = load i32, ptr %8, align 4, !tbaa !9
  %271 = sext i32 %270 to i64
  %272 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %269, i64 0, i64 %271
  %273 = getelementptr inbounds [3 x [4 x i64]], ptr %272, i64 0, i64 1
  %274 = getelementptr inbounds [4 x i64], ptr %273, i64 0, i64 0
  %275 = load ptr, ptr %7, align 8, !tbaa !5
  %276 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %275, i32 0, i32 0
  %277 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %276, i64 0, i64 1
  %278 = load i32, ptr %8, align 4, !tbaa !9
  %279 = sext i32 %278 to i64
  %280 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %277, i64 0, i64 %279
  %281 = getelementptr inbounds [3 x [4 x i64]], ptr %280, i64 0, i64 2
  %282 = getelementptr inbounds [4 x i64], ptr %281, i64 0, i64 0
  call void @point_double(ptr noundef %240, ptr noundef %249, ptr noundef %258, ptr noundef %266, ptr noundef %274, ptr noundef %282)
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %283

283:                                              ; preds = %341, %231
  %284 = load i32, ptr %9, align 4, !tbaa !9
  %285 = icmp slt i32 %284, 27
  br i1 %285, label %286, label %344

286:                                              ; preds = %283
  %287 = load ptr, ptr %7, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %287, i32 0, i32 0
  %289 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %288, i64 0, i64 0
  %290 = load i32, ptr %8, align 4, !tbaa !9
  %291 = mul nsw i32 2, %290
  %292 = sext i32 %291 to i64
  %293 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %289, i64 0, i64 %292
  %294 = getelementptr inbounds [3 x [4 x i64]], ptr %293, i64 0, i64 0
  %295 = getelementptr inbounds [4 x i64], ptr %294, i64 0, i64 0
  %296 = load ptr, ptr %7, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %296, i32 0, i32 0
  %298 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %297, i64 0, i64 0
  %299 = load i32, ptr %8, align 4, !tbaa !9
  %300 = mul nsw i32 2, %299
  %301 = sext i32 %300 to i64
  %302 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %298, i64 0, i64 %301
  %303 = getelementptr inbounds [3 x [4 x i64]], ptr %302, i64 0, i64 1
  %304 = getelementptr inbounds [4 x i64], ptr %303, i64 0, i64 0
  %305 = load ptr, ptr %7, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %305, i32 0, i32 0
  %307 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %306, i64 0, i64 0
  %308 = load i32, ptr %8, align 4, !tbaa !9
  %309 = mul nsw i32 2, %308
  %310 = sext i32 %309 to i64
  %311 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %307, i64 0, i64 %310
  %312 = getelementptr inbounds [3 x [4 x i64]], ptr %311, i64 0, i64 2
  %313 = getelementptr inbounds [4 x i64], ptr %312, i64 0, i64 0
  %314 = load ptr, ptr %7, align 8, !tbaa !5
  %315 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %314, i32 0, i32 0
  %316 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %315, i64 0, i64 0
  %317 = load i32, ptr %8, align 4, !tbaa !9
  %318 = mul nsw i32 2, %317
  %319 = sext i32 %318 to i64
  %320 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %316, i64 0, i64 %319
  %321 = getelementptr inbounds [3 x [4 x i64]], ptr %320, i64 0, i64 0
  %322 = getelementptr inbounds [4 x i64], ptr %321, i64 0, i64 0
  %323 = load ptr, ptr %7, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %323, i32 0, i32 0
  %325 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %324, i64 0, i64 0
  %326 = load i32, ptr %8, align 4, !tbaa !9
  %327 = mul nsw i32 2, %326
  %328 = sext i32 %327 to i64
  %329 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %325, i64 0, i64 %328
  %330 = getelementptr inbounds [3 x [4 x i64]], ptr %329, i64 0, i64 1
  %331 = getelementptr inbounds [4 x i64], ptr %330, i64 0, i64 0
  %332 = load ptr, ptr %7, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %332, i32 0, i32 0
  %334 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %333, i64 0, i64 0
  %335 = load i32, ptr %8, align 4, !tbaa !9
  %336 = mul nsw i32 2, %335
  %337 = sext i32 %336 to i64
  %338 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %334, i64 0, i64 %337
  %339 = getelementptr inbounds [3 x [4 x i64]], ptr %338, i64 0, i64 2
  %340 = getelementptr inbounds [4 x i64], ptr %339, i64 0, i64 0
  call void @point_double(ptr noundef %295, ptr noundef %304, ptr noundef %313, ptr noundef %322, ptr noundef %331, ptr noundef %340)
  br label %341

341:                                              ; preds = %286
  %342 = load i32, ptr %9, align 4, !tbaa !9
  %343 = add nsw i32 %342, 1
  store i32 %343, ptr %9, align 4, !tbaa !9
  br label %283, !llvm.loop !20

344:                                              ; preds = %283
  br label %345

345:                                              ; preds = %344
  %346 = load i32, ptr %8, align 4, !tbaa !9
  %347 = shl i32 %346, 1
  store i32 %347, ptr %8, align 4, !tbaa !9
  br label %120, !llvm.loop !21

348:                                              ; preds = %230, %120
  store i32 0, ptr %8, align 4, !tbaa !9
  br label %349

349:                                              ; preds = %749, %348
  %350 = load i32, ptr %8, align 4, !tbaa !9
  %351 = icmp slt i32 %350, 2
  br i1 %351, label %352, label %752

352:                                              ; preds = %349
  %353 = load ptr, ptr %7, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %353, i32 0, i32 0
  %355 = load i32, ptr %8, align 4, !tbaa !9
  %356 = sext i32 %355 to i64
  %357 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %354, i64 0, i64 %356
  %358 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %357, i64 0, i64 0
  %359 = getelementptr inbounds [3 x [4 x i64]], ptr %358, i64 0, i64 0
  call void @llvm.memset.p0.i64(ptr align 8 %359, i8 0, i64 96, i1 false)
  %360 = load ptr, ptr %7, align 8, !tbaa !5
  %361 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %360, i32 0, i32 0
  %362 = load i32, ptr %8, align 4, !tbaa !9
  %363 = sext i32 %362 to i64
  %364 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %361, i64 0, i64 %363
  %365 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %364, i64 0, i64 6
  %366 = getelementptr inbounds [3 x [4 x i64]], ptr %365, i64 0, i64 0
  %367 = getelementptr inbounds [4 x i64], ptr %366, i64 0, i64 0
  %368 = load ptr, ptr %7, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %368, i32 0, i32 0
  %370 = load i32, ptr %8, align 4, !tbaa !9
  %371 = sext i32 %370 to i64
  %372 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %369, i64 0, i64 %371
  %373 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %372, i64 0, i64 6
  %374 = getelementptr inbounds [3 x [4 x i64]], ptr %373, i64 0, i64 1
  %375 = getelementptr inbounds [4 x i64], ptr %374, i64 0, i64 0
  %376 = load ptr, ptr %7, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %376, i32 0, i32 0
  %378 = load i32, ptr %8, align 4, !tbaa !9
  %379 = sext i32 %378 to i64
  %380 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %377, i64 0, i64 %379
  %381 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %380, i64 0, i64 6
  %382 = getelementptr inbounds [3 x [4 x i64]], ptr %381, i64 0, i64 2
  %383 = getelementptr inbounds [4 x i64], ptr %382, i64 0, i64 0
  %384 = load ptr, ptr %7, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %384, i32 0, i32 0
  %386 = load i32, ptr %8, align 4, !tbaa !9
  %387 = sext i32 %386 to i64
  %388 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %385, i64 0, i64 %387
  %389 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %388, i64 0, i64 4
  %390 = getelementptr inbounds [3 x [4 x i64]], ptr %389, i64 0, i64 0
  %391 = getelementptr inbounds [4 x i64], ptr %390, i64 0, i64 0
  %392 = load ptr, ptr %7, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %392, i32 0, i32 0
  %394 = load i32, ptr %8, align 4, !tbaa !9
  %395 = sext i32 %394 to i64
  %396 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %393, i64 0, i64 %395
  %397 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %396, i64 0, i64 4
  %398 = getelementptr inbounds [3 x [4 x i64]], ptr %397, i64 0, i64 1
  %399 = getelementptr inbounds [4 x i64], ptr %398, i64 0, i64 0
  %400 = load ptr, ptr %7, align 8, !tbaa !5
  %401 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %400, i32 0, i32 0
  %402 = load i32, ptr %8, align 4, !tbaa !9
  %403 = sext i32 %402 to i64
  %404 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %401, i64 0, i64 %403
  %405 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %404, i64 0, i64 4
  %406 = getelementptr inbounds [3 x [4 x i64]], ptr %405, i64 0, i64 2
  %407 = getelementptr inbounds [4 x i64], ptr %406, i64 0, i64 0
  %408 = load ptr, ptr %7, align 8, !tbaa !5
  %409 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %408, i32 0, i32 0
  %410 = load i32, ptr %8, align 4, !tbaa !9
  %411 = sext i32 %410 to i64
  %412 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %409, i64 0, i64 %411
  %413 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %412, i64 0, i64 2
  %414 = getelementptr inbounds [3 x [4 x i64]], ptr %413, i64 0, i64 0
  %415 = getelementptr inbounds [4 x i64], ptr %414, i64 0, i64 0
  %416 = load ptr, ptr %7, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %416, i32 0, i32 0
  %418 = load i32, ptr %8, align 4, !tbaa !9
  %419 = sext i32 %418 to i64
  %420 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %417, i64 0, i64 %419
  %421 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %420, i64 0, i64 2
  %422 = getelementptr inbounds [3 x [4 x i64]], ptr %421, i64 0, i64 1
  %423 = getelementptr inbounds [4 x i64], ptr %422, i64 0, i64 0
  %424 = load ptr, ptr %7, align 8, !tbaa !5
  %425 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %424, i32 0, i32 0
  %426 = load i32, ptr %8, align 4, !tbaa !9
  %427 = sext i32 %426 to i64
  %428 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %425, i64 0, i64 %427
  %429 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %428, i64 0, i64 2
  %430 = getelementptr inbounds [3 x [4 x i64]], ptr %429, i64 0, i64 2
  %431 = getelementptr inbounds [4 x i64], ptr %430, i64 0, i64 0
  call void @point_add(ptr noundef %367, ptr noundef %375, ptr noundef %383, ptr noundef %391, ptr noundef %399, ptr noundef %407, i32 noundef 0, ptr noundef %415, ptr noundef %423, ptr noundef %431)
  %432 = load ptr, ptr %7, align 8, !tbaa !5
  %433 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %432, i32 0, i32 0
  %434 = load i32, ptr %8, align 4, !tbaa !9
  %435 = sext i32 %434 to i64
  %436 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %433, i64 0, i64 %435
  %437 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %436, i64 0, i64 10
  %438 = getelementptr inbounds [3 x [4 x i64]], ptr %437, i64 0, i64 0
  %439 = getelementptr inbounds [4 x i64], ptr %438, i64 0, i64 0
  %440 = load ptr, ptr %7, align 8, !tbaa !5
  %441 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %440, i32 0, i32 0
  %442 = load i32, ptr %8, align 4, !tbaa !9
  %443 = sext i32 %442 to i64
  %444 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %441, i64 0, i64 %443
  %445 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %444, i64 0, i64 10
  %446 = getelementptr inbounds [3 x [4 x i64]], ptr %445, i64 0, i64 1
  %447 = getelementptr inbounds [4 x i64], ptr %446, i64 0, i64 0
  %448 = load ptr, ptr %7, align 8, !tbaa !5
  %449 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %448, i32 0, i32 0
  %450 = load i32, ptr %8, align 4, !tbaa !9
  %451 = sext i32 %450 to i64
  %452 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %449, i64 0, i64 %451
  %453 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %452, i64 0, i64 10
  %454 = getelementptr inbounds [3 x [4 x i64]], ptr %453, i64 0, i64 2
  %455 = getelementptr inbounds [4 x i64], ptr %454, i64 0, i64 0
  %456 = load ptr, ptr %7, align 8, !tbaa !5
  %457 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %456, i32 0, i32 0
  %458 = load i32, ptr %8, align 4, !tbaa !9
  %459 = sext i32 %458 to i64
  %460 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %457, i64 0, i64 %459
  %461 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %460, i64 0, i64 8
  %462 = getelementptr inbounds [3 x [4 x i64]], ptr %461, i64 0, i64 0
  %463 = getelementptr inbounds [4 x i64], ptr %462, i64 0, i64 0
  %464 = load ptr, ptr %7, align 8, !tbaa !5
  %465 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %464, i32 0, i32 0
  %466 = load i32, ptr %8, align 4, !tbaa !9
  %467 = sext i32 %466 to i64
  %468 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %465, i64 0, i64 %467
  %469 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %468, i64 0, i64 8
  %470 = getelementptr inbounds [3 x [4 x i64]], ptr %469, i64 0, i64 1
  %471 = getelementptr inbounds [4 x i64], ptr %470, i64 0, i64 0
  %472 = load ptr, ptr %7, align 8, !tbaa !5
  %473 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %472, i32 0, i32 0
  %474 = load i32, ptr %8, align 4, !tbaa !9
  %475 = sext i32 %474 to i64
  %476 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %473, i64 0, i64 %475
  %477 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %476, i64 0, i64 8
  %478 = getelementptr inbounds [3 x [4 x i64]], ptr %477, i64 0, i64 2
  %479 = getelementptr inbounds [4 x i64], ptr %478, i64 0, i64 0
  %480 = load ptr, ptr %7, align 8, !tbaa !5
  %481 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %480, i32 0, i32 0
  %482 = load i32, ptr %8, align 4, !tbaa !9
  %483 = sext i32 %482 to i64
  %484 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %481, i64 0, i64 %483
  %485 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %484, i64 0, i64 2
  %486 = getelementptr inbounds [3 x [4 x i64]], ptr %485, i64 0, i64 0
  %487 = getelementptr inbounds [4 x i64], ptr %486, i64 0, i64 0
  %488 = load ptr, ptr %7, align 8, !tbaa !5
  %489 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %488, i32 0, i32 0
  %490 = load i32, ptr %8, align 4, !tbaa !9
  %491 = sext i32 %490 to i64
  %492 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %489, i64 0, i64 %491
  %493 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %492, i64 0, i64 2
  %494 = getelementptr inbounds [3 x [4 x i64]], ptr %493, i64 0, i64 1
  %495 = getelementptr inbounds [4 x i64], ptr %494, i64 0, i64 0
  %496 = load ptr, ptr %7, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %496, i32 0, i32 0
  %498 = load i32, ptr %8, align 4, !tbaa !9
  %499 = sext i32 %498 to i64
  %500 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %497, i64 0, i64 %499
  %501 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %500, i64 0, i64 2
  %502 = getelementptr inbounds [3 x [4 x i64]], ptr %501, i64 0, i64 2
  %503 = getelementptr inbounds [4 x i64], ptr %502, i64 0, i64 0
  call void @point_add(ptr noundef %439, ptr noundef %447, ptr noundef %455, ptr noundef %463, ptr noundef %471, ptr noundef %479, i32 noundef 0, ptr noundef %487, ptr noundef %495, ptr noundef %503)
  %504 = load ptr, ptr %7, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %504, i32 0, i32 0
  %506 = load i32, ptr %8, align 4, !tbaa !9
  %507 = sext i32 %506 to i64
  %508 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %505, i64 0, i64 %507
  %509 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %508, i64 0, i64 12
  %510 = getelementptr inbounds [3 x [4 x i64]], ptr %509, i64 0, i64 0
  %511 = getelementptr inbounds [4 x i64], ptr %510, i64 0, i64 0
  %512 = load ptr, ptr %7, align 8, !tbaa !5
  %513 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %512, i32 0, i32 0
  %514 = load i32, ptr %8, align 4, !tbaa !9
  %515 = sext i32 %514 to i64
  %516 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %513, i64 0, i64 %515
  %517 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %516, i64 0, i64 12
  %518 = getelementptr inbounds [3 x [4 x i64]], ptr %517, i64 0, i64 1
  %519 = getelementptr inbounds [4 x i64], ptr %518, i64 0, i64 0
  %520 = load ptr, ptr %7, align 8, !tbaa !5
  %521 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %520, i32 0, i32 0
  %522 = load i32, ptr %8, align 4, !tbaa !9
  %523 = sext i32 %522 to i64
  %524 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %521, i64 0, i64 %523
  %525 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %524, i64 0, i64 12
  %526 = getelementptr inbounds [3 x [4 x i64]], ptr %525, i64 0, i64 2
  %527 = getelementptr inbounds [4 x i64], ptr %526, i64 0, i64 0
  %528 = load ptr, ptr %7, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %528, i32 0, i32 0
  %530 = load i32, ptr %8, align 4, !tbaa !9
  %531 = sext i32 %530 to i64
  %532 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %529, i64 0, i64 %531
  %533 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %532, i64 0, i64 8
  %534 = getelementptr inbounds [3 x [4 x i64]], ptr %533, i64 0, i64 0
  %535 = getelementptr inbounds [4 x i64], ptr %534, i64 0, i64 0
  %536 = load ptr, ptr %7, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %536, i32 0, i32 0
  %538 = load i32, ptr %8, align 4, !tbaa !9
  %539 = sext i32 %538 to i64
  %540 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %537, i64 0, i64 %539
  %541 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %540, i64 0, i64 8
  %542 = getelementptr inbounds [3 x [4 x i64]], ptr %541, i64 0, i64 1
  %543 = getelementptr inbounds [4 x i64], ptr %542, i64 0, i64 0
  %544 = load ptr, ptr %7, align 8, !tbaa !5
  %545 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %544, i32 0, i32 0
  %546 = load i32, ptr %8, align 4, !tbaa !9
  %547 = sext i32 %546 to i64
  %548 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %545, i64 0, i64 %547
  %549 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %548, i64 0, i64 8
  %550 = getelementptr inbounds [3 x [4 x i64]], ptr %549, i64 0, i64 2
  %551 = getelementptr inbounds [4 x i64], ptr %550, i64 0, i64 0
  %552 = load ptr, ptr %7, align 8, !tbaa !5
  %553 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %552, i32 0, i32 0
  %554 = load i32, ptr %8, align 4, !tbaa !9
  %555 = sext i32 %554 to i64
  %556 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %553, i64 0, i64 %555
  %557 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %556, i64 0, i64 4
  %558 = getelementptr inbounds [3 x [4 x i64]], ptr %557, i64 0, i64 0
  %559 = getelementptr inbounds [4 x i64], ptr %558, i64 0, i64 0
  %560 = load ptr, ptr %7, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %560, i32 0, i32 0
  %562 = load i32, ptr %8, align 4, !tbaa !9
  %563 = sext i32 %562 to i64
  %564 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %561, i64 0, i64 %563
  %565 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %564, i64 0, i64 4
  %566 = getelementptr inbounds [3 x [4 x i64]], ptr %565, i64 0, i64 1
  %567 = getelementptr inbounds [4 x i64], ptr %566, i64 0, i64 0
  %568 = load ptr, ptr %7, align 8, !tbaa !5
  %569 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %568, i32 0, i32 0
  %570 = load i32, ptr %8, align 4, !tbaa !9
  %571 = sext i32 %570 to i64
  %572 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %569, i64 0, i64 %571
  %573 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %572, i64 0, i64 4
  %574 = getelementptr inbounds [3 x [4 x i64]], ptr %573, i64 0, i64 2
  %575 = getelementptr inbounds [4 x i64], ptr %574, i64 0, i64 0
  call void @point_add(ptr noundef %511, ptr noundef %519, ptr noundef %527, ptr noundef %535, ptr noundef %543, ptr noundef %551, i32 noundef 0, ptr noundef %559, ptr noundef %567, ptr noundef %575)
  %576 = load ptr, ptr %7, align 8, !tbaa !5
  %577 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %576, i32 0, i32 0
  %578 = load i32, ptr %8, align 4, !tbaa !9
  %579 = sext i32 %578 to i64
  %580 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %577, i64 0, i64 %579
  %581 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %580, i64 0, i64 14
  %582 = getelementptr inbounds [3 x [4 x i64]], ptr %581, i64 0, i64 0
  %583 = getelementptr inbounds [4 x i64], ptr %582, i64 0, i64 0
  %584 = load ptr, ptr %7, align 8, !tbaa !5
  %585 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %584, i32 0, i32 0
  %586 = load i32, ptr %8, align 4, !tbaa !9
  %587 = sext i32 %586 to i64
  %588 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %585, i64 0, i64 %587
  %589 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %588, i64 0, i64 14
  %590 = getelementptr inbounds [3 x [4 x i64]], ptr %589, i64 0, i64 1
  %591 = getelementptr inbounds [4 x i64], ptr %590, i64 0, i64 0
  %592 = load ptr, ptr %7, align 8, !tbaa !5
  %593 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %592, i32 0, i32 0
  %594 = load i32, ptr %8, align 4, !tbaa !9
  %595 = sext i32 %594 to i64
  %596 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %593, i64 0, i64 %595
  %597 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %596, i64 0, i64 14
  %598 = getelementptr inbounds [3 x [4 x i64]], ptr %597, i64 0, i64 2
  %599 = getelementptr inbounds [4 x i64], ptr %598, i64 0, i64 0
  %600 = load ptr, ptr %7, align 8, !tbaa !5
  %601 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %600, i32 0, i32 0
  %602 = load i32, ptr %8, align 4, !tbaa !9
  %603 = sext i32 %602 to i64
  %604 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %601, i64 0, i64 %603
  %605 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %604, i64 0, i64 12
  %606 = getelementptr inbounds [3 x [4 x i64]], ptr %605, i64 0, i64 0
  %607 = getelementptr inbounds [4 x i64], ptr %606, i64 0, i64 0
  %608 = load ptr, ptr %7, align 8, !tbaa !5
  %609 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %608, i32 0, i32 0
  %610 = load i32, ptr %8, align 4, !tbaa !9
  %611 = sext i32 %610 to i64
  %612 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %609, i64 0, i64 %611
  %613 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %612, i64 0, i64 12
  %614 = getelementptr inbounds [3 x [4 x i64]], ptr %613, i64 0, i64 1
  %615 = getelementptr inbounds [4 x i64], ptr %614, i64 0, i64 0
  %616 = load ptr, ptr %7, align 8, !tbaa !5
  %617 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %616, i32 0, i32 0
  %618 = load i32, ptr %8, align 4, !tbaa !9
  %619 = sext i32 %618 to i64
  %620 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %617, i64 0, i64 %619
  %621 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %620, i64 0, i64 12
  %622 = getelementptr inbounds [3 x [4 x i64]], ptr %621, i64 0, i64 2
  %623 = getelementptr inbounds [4 x i64], ptr %622, i64 0, i64 0
  %624 = load ptr, ptr %7, align 8, !tbaa !5
  %625 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %624, i32 0, i32 0
  %626 = load i32, ptr %8, align 4, !tbaa !9
  %627 = sext i32 %626 to i64
  %628 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %625, i64 0, i64 %627
  %629 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %628, i64 0, i64 2
  %630 = getelementptr inbounds [3 x [4 x i64]], ptr %629, i64 0, i64 0
  %631 = getelementptr inbounds [4 x i64], ptr %630, i64 0, i64 0
  %632 = load ptr, ptr %7, align 8, !tbaa !5
  %633 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %632, i32 0, i32 0
  %634 = load i32, ptr %8, align 4, !tbaa !9
  %635 = sext i32 %634 to i64
  %636 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %633, i64 0, i64 %635
  %637 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %636, i64 0, i64 2
  %638 = getelementptr inbounds [3 x [4 x i64]], ptr %637, i64 0, i64 1
  %639 = getelementptr inbounds [4 x i64], ptr %638, i64 0, i64 0
  %640 = load ptr, ptr %7, align 8, !tbaa !5
  %641 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %640, i32 0, i32 0
  %642 = load i32, ptr %8, align 4, !tbaa !9
  %643 = sext i32 %642 to i64
  %644 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %641, i64 0, i64 %643
  %645 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %644, i64 0, i64 2
  %646 = getelementptr inbounds [3 x [4 x i64]], ptr %645, i64 0, i64 2
  %647 = getelementptr inbounds [4 x i64], ptr %646, i64 0, i64 0
  call void @point_add(ptr noundef %583, ptr noundef %591, ptr noundef %599, ptr noundef %607, ptr noundef %615, ptr noundef %623, i32 noundef 0, ptr noundef %631, ptr noundef %639, ptr noundef %647)
  store i32 1, ptr %9, align 4, !tbaa !9
  br label %648

648:                                              ; preds = %745, %352
  %649 = load i32, ptr %9, align 4, !tbaa !9
  %650 = icmp slt i32 %649, 8
  br i1 %650, label %651, label %748

651:                                              ; preds = %648
  %652 = load ptr, ptr %7, align 8, !tbaa !5
  %653 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %652, i32 0, i32 0
  %654 = load i32, ptr %8, align 4, !tbaa !9
  %655 = sext i32 %654 to i64
  %656 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %653, i64 0, i64 %655
  %657 = load i32, ptr %9, align 4, !tbaa !9
  %658 = mul nsw i32 2, %657
  %659 = add nsw i32 %658, 1
  %660 = sext i32 %659 to i64
  %661 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %656, i64 0, i64 %660
  %662 = getelementptr inbounds [3 x [4 x i64]], ptr %661, i64 0, i64 0
  %663 = getelementptr inbounds [4 x i64], ptr %662, i64 0, i64 0
  %664 = load ptr, ptr %7, align 8, !tbaa !5
  %665 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %664, i32 0, i32 0
  %666 = load i32, ptr %8, align 4, !tbaa !9
  %667 = sext i32 %666 to i64
  %668 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %665, i64 0, i64 %667
  %669 = load i32, ptr %9, align 4, !tbaa !9
  %670 = mul nsw i32 2, %669
  %671 = add nsw i32 %670, 1
  %672 = sext i32 %671 to i64
  %673 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %668, i64 0, i64 %672
  %674 = getelementptr inbounds [3 x [4 x i64]], ptr %673, i64 0, i64 1
  %675 = getelementptr inbounds [4 x i64], ptr %674, i64 0, i64 0
  %676 = load ptr, ptr %7, align 8, !tbaa !5
  %677 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %676, i32 0, i32 0
  %678 = load i32, ptr %8, align 4, !tbaa !9
  %679 = sext i32 %678 to i64
  %680 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %677, i64 0, i64 %679
  %681 = load i32, ptr %9, align 4, !tbaa !9
  %682 = mul nsw i32 2, %681
  %683 = add nsw i32 %682, 1
  %684 = sext i32 %683 to i64
  %685 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %680, i64 0, i64 %684
  %686 = getelementptr inbounds [3 x [4 x i64]], ptr %685, i64 0, i64 2
  %687 = getelementptr inbounds [4 x i64], ptr %686, i64 0, i64 0
  %688 = load ptr, ptr %7, align 8, !tbaa !5
  %689 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %688, i32 0, i32 0
  %690 = load i32, ptr %8, align 4, !tbaa !9
  %691 = sext i32 %690 to i64
  %692 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %689, i64 0, i64 %691
  %693 = load i32, ptr %9, align 4, !tbaa !9
  %694 = mul nsw i32 2, %693
  %695 = sext i32 %694 to i64
  %696 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %692, i64 0, i64 %695
  %697 = getelementptr inbounds [3 x [4 x i64]], ptr %696, i64 0, i64 0
  %698 = getelementptr inbounds [4 x i64], ptr %697, i64 0, i64 0
  %699 = load ptr, ptr %7, align 8, !tbaa !5
  %700 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %699, i32 0, i32 0
  %701 = load i32, ptr %8, align 4, !tbaa !9
  %702 = sext i32 %701 to i64
  %703 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %700, i64 0, i64 %702
  %704 = load i32, ptr %9, align 4, !tbaa !9
  %705 = mul nsw i32 2, %704
  %706 = sext i32 %705 to i64
  %707 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %703, i64 0, i64 %706
  %708 = getelementptr inbounds [3 x [4 x i64]], ptr %707, i64 0, i64 1
  %709 = getelementptr inbounds [4 x i64], ptr %708, i64 0, i64 0
  %710 = load ptr, ptr %7, align 8, !tbaa !5
  %711 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %710, i32 0, i32 0
  %712 = load i32, ptr %8, align 4, !tbaa !9
  %713 = sext i32 %712 to i64
  %714 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %711, i64 0, i64 %713
  %715 = load i32, ptr %9, align 4, !tbaa !9
  %716 = mul nsw i32 2, %715
  %717 = sext i32 %716 to i64
  %718 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %714, i64 0, i64 %717
  %719 = getelementptr inbounds [3 x [4 x i64]], ptr %718, i64 0, i64 2
  %720 = getelementptr inbounds [4 x i64], ptr %719, i64 0, i64 0
  %721 = load ptr, ptr %7, align 8, !tbaa !5
  %722 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %721, i32 0, i32 0
  %723 = load i32, ptr %8, align 4, !tbaa !9
  %724 = sext i32 %723 to i64
  %725 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %722, i64 0, i64 %724
  %726 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %725, i64 0, i64 1
  %727 = getelementptr inbounds [3 x [4 x i64]], ptr %726, i64 0, i64 0
  %728 = getelementptr inbounds [4 x i64], ptr %727, i64 0, i64 0
  %729 = load ptr, ptr %7, align 8, !tbaa !5
  %730 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %729, i32 0, i32 0
  %731 = load i32, ptr %8, align 4, !tbaa !9
  %732 = sext i32 %731 to i64
  %733 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %730, i64 0, i64 %732
  %734 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %733, i64 0, i64 1
  %735 = getelementptr inbounds [3 x [4 x i64]], ptr %734, i64 0, i64 1
  %736 = getelementptr inbounds [4 x i64], ptr %735, i64 0, i64 0
  %737 = load ptr, ptr %7, align 8, !tbaa !5
  %738 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %737, i32 0, i32 0
  %739 = load i32, ptr %8, align 4, !tbaa !9
  %740 = sext i32 %739 to i64
  %741 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %738, i64 0, i64 %740
  %742 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %741, i64 0, i64 1
  %743 = getelementptr inbounds [3 x [4 x i64]], ptr %742, i64 0, i64 2
  %744 = getelementptr inbounds [4 x i64], ptr %743, i64 0, i64 0
  call void @point_add(ptr noundef %663, ptr noundef %675, ptr noundef %687, ptr noundef %698, ptr noundef %709, ptr noundef %720, i32 noundef 0, ptr noundef %728, ptr noundef %736, ptr noundef %744)
  br label %745

745:                                              ; preds = %651
  %746 = load i32, ptr %9, align 4, !tbaa !9
  %747 = add nsw i32 %746, 1
  store i32 %747, ptr %9, align 4, !tbaa !9
  br label %648, !llvm.loop !22

748:                                              ; preds = %648
  br label %749

749:                                              ; preds = %748
  %750 = load i32, ptr %8, align 4, !tbaa !9
  %751 = add nsw i32 %750, 1
  store i32 %751, ptr %8, align 4, !tbaa !9
  br label %349, !llvm.loop !23

752:                                              ; preds = %349
  %753 = load ptr, ptr %7, align 8, !tbaa !5
  %754 = getelementptr inbounds %struct.nistp224_pre_comp_st, ptr %753, i32 0, i32 0
  %755 = getelementptr inbounds [2 x [16 x [3 x [4 x i64]]]], ptr %754, i64 0, i64 0
  %756 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %755, i64 0, i64 1
  %757 = getelementptr inbounds [32 x [4 x i64]], ptr %13, i64 0, i64 0
  call void @make_points_affine(i64 noundef 31, ptr noundef %756, ptr noundef %757)
  br label %758

758:                                              ; preds = %752, %72
  %759 = load ptr, ptr %4, align 8, !tbaa !5
  %760 = getelementptr inbounds %struct.ec_group_st, ptr %759, i32 0, i32 19
  store i32 1, ptr %760, align 8, !tbaa !24
  %761 = load ptr, ptr %7, align 8, !tbaa !5
  %762 = load ptr, ptr %4, align 8, !tbaa !5
  %763 = getelementptr inbounds %struct.ec_group_st, ptr %762, i32 0, i32 20
  store ptr %761, ptr %763, align 8, !tbaa !25
  store ptr null, ptr %7, align 8, !tbaa !5
  store i32 1, ptr %6, align 4, !tbaa !9
  br label %764

764:                                              ; preds = %758, %118, %62, %58, %45, %39, %33
  %765 = load ptr, ptr %5, align 8, !tbaa !5
  call void @BN_CTX_end(ptr noundef %765)
  %766 = load ptr, ptr %12, align 8, !tbaa !5
  call void @EC_POINT_free(ptr noundef %766)
  %767 = load ptr, ptr %14, align 8, !tbaa !5
  call void @BN_CTX_free(ptr noundef %767)
  %768 = load ptr, ptr %7, align 8, !tbaa !5
  call void @EC_nistp224_pre_comp_free(ptr noundef %768)
  %769 = load i32, ptr %6, align 4, !tbaa !9
  store i32 %769, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %770

770:                                              ; preds = %764, %24
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 1024, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  %771 = load i32, ptr %3, align 4
  ret i32 %771
}

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @EC_nistp224_pre_comp_free(ptr noundef) #0

declare ptr @BN_CTX_new() #2

declare void @BN_CTX_start(ptr noundef) #2

declare ptr @BN_CTX_get(ptr noundef) #2

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

declare void @BN_CTX_end(ptr noundef) #2

declare void @BN_CTX_free(ptr noundef) #2

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

declare ptr @EC_POINT_new(ptr noundef) #2

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

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

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

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #3

declare void @EC_POINT_free(ptr noundef) #2

declare void @EC_pre_comp_free(ptr noundef) #2

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

; Function Attrs: nounwind uwtable
declare hidden ptr @nistp224_pre_comp_new() #0

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { 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, !6, i64 8}
!12 = !{!"ec_group_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !6, i64 48, !13, i64 56, !6, i64 64, !7, i64 72, !6, i64 96, !6, i64 104, !10, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !10, i64 152, !7, i64 160, !6, i64 168, !6, i64 176}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !6, i64 16}
!15 = !{!"ec_point_st", !6, i64 0, !10, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !10, i64 40}
!16 = !{!15, !6, i64 24}
!17 = !{!15, !6, i64 32}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = distinct !{!20, !19}
!21 = distinct !{!21, !19}
!22 = distinct !{!22, !19}
!23 = distinct !{!23, !19}
!24 = !{!12, !10, i64 152}
!25 = !{!7, !7, i64 0}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@nistp224_curve_params = external hidden constant [5 x [28 x i8]], align 16
@gmul = external hidden local_unnamed_addr constant [2 x [16 x [3 x [4 x i64]]]], align 16

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @ossl_ec_GFp_nistp224_precompute_mult(ptr noundef %0, ptr noundef %1) local_unnamed_addr #0 {
  %3 = alloca [32 x [4 x i64]], align 16
  call void @llvm.lifetime.start.p0(i64 1024, ptr nonnull %3) #5
  tail call void @EC_pre_comp_free(ptr noundef %0) #5
  %4 = icmp eq ptr %1, null
  br i1 %4, label %5, label %.thread

5:                                                ; preds = %2
  %6 = tail call ptr @BN_CTX_new() #5
  %7 = icmp eq ptr %6, null
  br i1 %7, label %189, label %.thread

.thread:                                          ; preds = %2, %5
  %.0214 = phi ptr [ %6, %5 ], [ null, %2 ]
  %.0196213 = phi ptr [ %6, %5 ], [ %1, %2 ]
  tail call void @BN_CTX_start(ptr noundef nonnull %.0196213) #5
  %8 = tail call ptr @BN_CTX_get(ptr noundef nonnull %.0196213) #5
  %9 = tail call ptr @BN_CTX_get(ptr noundef nonnull %.0196213) #5
  %10 = icmp eq ptr %9, null
  br i1 %10, label %188, label %11

11:                                               ; preds = %.thread
  %12 = getelementptr inbounds i8, ptr %0, i64 8
  %13 = load ptr, ptr %12, align 8, !tbaa !5
  %14 = icmp eq ptr %13, null
  br i1 %14, label %188, label %15

15:                                               ; preds = %11
  %16 = tail call ptr @EC_POINT_new(ptr noundef nonnull %0) #5
  %17 = icmp eq ptr %16, null
  br i1 %17, label %188, label %18

18:                                               ; preds = %15
  %19 = tail call ptr @BN_bin2bn(ptr noundef nonnull getelementptr inbounds (i8, ptr @nistp224_curve_params, i64 84), i32 noundef 28, ptr noundef %8) #5
  %20 = tail call ptr @BN_bin2bn(ptr noundef nonnull getelementptr inbounds (i8, ptr @nistp224_curve_params, i64 112), i32 noundef 28, ptr noundef nonnull %9) #5
  %21 = tail call i32 @EC_POINT_set_affine_coordinates(ptr noundef nonnull %0, ptr noundef nonnull %16, ptr noundef %8, ptr noundef nonnull %9, ptr noundef nonnull %.0196213) #5
  %.not = icmp eq i32 %21, 0
  br i1 %.not, label %188, label %22

22:                                               ; preds = %18
  %23 = tail call ptr @nistp224_pre_comp_new()
  %24 = icmp eq ptr %23, null
  br i1 %24, label %188, label %25

25:                                               ; preds = %22
  %26 = load ptr, ptr %12, align 8, !tbaa !5
  %27 = tail call i32 @EC_POINT_cmp(ptr noundef nonnull %0, ptr noundef nonnull %16, ptr noundef %26, ptr noundef nonnull %.0196213) #5
  %28 = icmp eq i32 %27, 0
  br i1 %28, label %29, label %30

29:                                               ; preds = %25
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(3072) %23, ptr noundef nonnull align 16 dereferenceable(3072) @gmul, i64 3072, i1 false)
  br label %185

30:                                               ; preds = %25
  %31 = getelementptr inbounds i8, ptr %23, i64 96
  %32 = load ptr, ptr %12, align 8, !tbaa !5
  %33 = getelementptr inbounds i8, ptr %32, i64 16
  %34 = load ptr, ptr %33, align 8, !tbaa !12
  %35 = tail call i32 @BN_to_felem(ptr noundef nonnull %31, ptr noundef %34)
  %.not208 = icmp eq i32 %35, 0
  br i1 %.not208, label %188, label %36

36:                                               ; preds = %30
  %37 = getelementptr inbounds i8, ptr %23, i64 128
  %38 = load ptr, ptr %12, align 8, !tbaa !5
  %39 = getelementptr inbounds i8, ptr %38, i64 24
  %40 = load ptr, ptr %39, align 8, !tbaa !14
  %41 = tail call i32 @BN_to_felem(ptr noundef nonnull %37, ptr noundef %40)
  %.not209 = icmp eq i32 %41, 0
  br i1 %.not209, label %188, label %42

42:                                               ; preds = %36
  %43 = getelementptr inbounds i8, ptr %23, i64 160
  %44 = load ptr, ptr %12, align 8, !tbaa !5
  %45 = getelementptr inbounds i8, ptr %44, i64 32
  %46 = load ptr, ptr %45, align 8, !tbaa !15
  %47 = tail call i32 @BN_to_felem(ptr noundef nonnull %43, ptr noundef %46)
  %.not210 = icmp eq i32 %47, 0
  br i1 %.not210, label %188, label %.preheader

.preheader:                                       ; preds = %42
  %48 = getelementptr inbounds i8, ptr %23, i64 1536
  br label %49

49:                                               ; preds = %.loopexit, %.preheader
  %.0198217 = phi i32 [ 1, %.preheader ], [ %58, %.loopexit ]
  %50 = sext i32 %.0198217 to i64
  %51 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %48, i64 0, i64 %50
  %52 = getelementptr inbounds i8, ptr %51, i64 32
  %53 = getelementptr inbounds i8, ptr %51, i64 64
  %54 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %23, i64 0, i64 %50
  %55 = getelementptr inbounds i8, ptr %54, i64 32
  %56 = getelementptr inbounds i8, ptr %54, i64 64
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %54, ptr noundef nonnull %55, ptr noundef nonnull %56)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  %57 = icmp eq i32 %.0198217, 8
  br i1 %57, label %split, label %.loopexit

.loopexit:                                        ; preds = %49
  %58 = shl nsw i32 %.0198217, 1
  %59 = sext i32 %58 to i64
  %60 = getelementptr inbounds [16 x [3 x [4 x i64]]], ptr %23, i64 0, i64 %59
  %61 = getelementptr inbounds i8, ptr %60, i64 32
  %62 = getelementptr inbounds i8, ptr %60, i64 64
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  tail call void @point_double(ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62, ptr noundef nonnull %60, ptr noundef nonnull %61, ptr noundef nonnull %62)
  br label %49

split:                                            ; preds = %49
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(96) %23, i8 0, i64 96, i1 false)
  %63 = getelementptr inbounds i8, ptr %23, i64 576
  %64 = getelementptr inbounds i8, ptr %23, i64 608
  %65 = getelementptr inbounds i8, ptr %23, i64 640
  %66 = getelementptr inbounds i8, ptr %23, i64 384
  %67 = getelementptr inbounds i8, ptr %23, i64 416
  %68 = getelementptr inbounds i8, ptr %23, i64 448
  %69 = getelementptr inbounds i8, ptr %23, i64 192
  %70 = getelementptr inbounds i8, ptr %23, i64 224
  %71 = getelementptr inbounds i8, ptr %23, i64 256
  tail call void @point_add(ptr noundef nonnull %63, ptr noundef nonnull %64, ptr noundef nonnull %65, ptr noundef nonnull %66, ptr noundef nonnull %67, ptr noundef nonnull %68, i32 noundef 0, ptr noundef nonnull %69, ptr noundef nonnull %70, ptr noundef nonnull %71)
  %72 = getelementptr inbounds i8, ptr %23, i64 960
  %73 = getelementptr inbounds i8, ptr %23, i64 992
  %74 = getelementptr inbounds i8, ptr %23, i64 1024
  %75 = getelementptr inbounds i8, ptr %23, i64 768
  %76 = getelementptr inbounds i8, ptr %23, i64 800
  %77 = getelementptr inbounds i8, ptr %23, i64 832
  tail call void @point_add(ptr noundef nonnull %72, ptr noundef nonnull %73, ptr noundef nonnull %74, ptr noundef nonnull %75, ptr noundef nonnull %76, ptr noundef nonnull %77, i32 noundef 0, ptr noundef nonnull %69, ptr noundef nonnull %70, ptr noundef nonnull %71)
  %78 = getelementptr inbounds i8, ptr %23, i64 1152
  %79 = getelementptr inbounds i8, ptr %23, i64 1184
  %80 = getelementptr inbounds i8, ptr %23, i64 1216
  tail call void @point_add(ptr noundef nonnull %78, ptr noundef nonnull %79, ptr noundef nonnull %80, ptr noundef nonnull %75, ptr noundef nonnull %76, ptr noundef nonnull %77, i32 noundef 0, ptr noundef nonnull %66, ptr noundef nonnull %67, ptr noundef nonnull %68)
  %81 = getelementptr inbounds i8, ptr %23, i64 1344
  %82 = getelementptr inbounds i8, ptr %23, i64 1376
  %83 = getelementptr inbounds i8, ptr %23, i64 1408
  tail call void @point_add(ptr noundef nonnull %81, ptr noundef nonnull %82, ptr noundef nonnull %83, ptr noundef nonnull %78, ptr noundef nonnull %79, ptr noundef nonnull %80, i32 noundef 0, ptr noundef nonnull %69, ptr noundef nonnull %70, ptr noundef nonnull %71)
  %84 = getelementptr inbounds i8, ptr %23, i64 288
  %85 = getelementptr inbounds i8, ptr %23, i64 320
  %86 = getelementptr inbounds i8, ptr %23, i64 352
  %87 = getelementptr inbounds i8, ptr %23, i64 224
  %88 = getelementptr inbounds i8, ptr %23, i64 256
  tail call void @point_add(ptr noundef nonnull %84, ptr noundef nonnull %85, ptr noundef nonnull %86, ptr noundef nonnull %69, ptr noundef nonnull %87, ptr noundef nonnull %88, i32 noundef 0, ptr noundef nonnull %31, ptr noundef nonnull %37, ptr noundef nonnull %43)
  %89 = getelementptr inbounds i8, ptr %23, i64 480
  %90 = getelementptr inbounds i8, ptr %23, i64 512
  %91 = getelementptr inbounds i8, ptr %23, i64 544
  %92 = getelementptr inbounds i8, ptr %23, i64 416
  %93 = getelementptr inbounds i8, ptr %23, i64 448
  tail call void @point_add(ptr noundef nonnull %89, ptr noundef nonnull %90, ptr noundef nonnull %91, ptr noundef nonnull %66, ptr noundef nonnull %92, ptr noundef nonnull %93, i32 noundef 0, ptr noundef nonnull %31, ptr noundef nonnull %37, ptr noundef nonnull %43)
  %94 = getelementptr inbounds i8, ptr %23, i64 672
  %95 = getelementptr inbounds i8, ptr %23, i64 704
  %96 = getelementptr inbounds i8, ptr %23, i64 736
  %97 = getelementptr inbounds i8, ptr %23, i64 608
  %98 = getelementptr inbounds i8, ptr %23, i64 640
  tail call void @point_add(ptr noundef nonnull %94, ptr noundef nonnull %95, ptr noundef nonnull %96, ptr noundef nonnull %63, ptr noundef nonnull %97, ptr noundef nonnull %98, i32 noundef 0, ptr noundef nonnull %31, ptr noundef nonnull %37, ptr noundef nonnull %43)
  %99 = getelementptr inbounds i8, ptr %23, i64 864
  %100 = getelementptr inbounds i8, ptr %23, i64 896
  %101 = getelementptr inbounds i8, ptr %23, i64 928
  %102 = getelementptr inbounds i8, ptr %23, i64 800
  %103 = getelementptr inbounds i8, ptr %23, i64 832
  tail call void @point_add(ptr noundef nonnull %99, ptr noundef nonnull %100, ptr noundef nonnull %101, ptr noundef nonnull %75, ptr noundef nonnull %102, ptr noundef nonnull %103, i32 noundef 0, ptr noundef nonnull %31, ptr noundef nonnull %37, ptr noundef nonnull %43)
  %104 = getelementptr inbounds i8, ptr %23, i64 1056
  %105 = getelementptr inbounds i8, ptr %23, i64 1088
  %106 = getelementptr inbounds i8, ptr %23, i64 1120
  %107 = getelementptr inbounds i8, ptr %23, i64 992
  %108 = getelementptr inbounds i8, ptr %23, i64 1024
  tail call void @point_add(ptr noundef nonnull %104, ptr noundef nonnull %105, ptr noundef nonnull %106, ptr noundef nonnull %72, ptr noundef nonnull %107, ptr noundef nonnull %108, i32 noundef 0, ptr noundef nonnull %31, ptr noundef nonnull %37, ptr noundef nonnull %43)
  %109 = getelementptr inbounds i8, ptr %23, i64 1248
  %110 = getelementptr inbounds i8, ptr %23, i64 1280
  %111 = getelementptr inbounds i8, ptr %23, i64 1312
  %112 = getelementptr inbounds i8, ptr %23, i64 1184
  %113 = getelementptr inbounds i8, ptr %23, i64 1216
  tail call void @point_add(ptr noundef nonnull %109, ptr noundef nonnull %110, ptr noundef nonnull %111, ptr noundef nonnull %78, ptr noundef nonnull %112, ptr noundef nonnull %113, i32 noundef 0, ptr noundef nonnull %31, ptr noundef nonnull %37, ptr noundef nonnull %43)
  %114 = getelementptr inbounds i8, ptr %23, i64 1440
  %115 = getelementptr inbounds i8, ptr %23, i64 1472
  %116 = getelementptr inbounds i8, ptr %23, i64 1504
  %117 = getelementptr inbounds i8, ptr %23, i64 1376
  %118 = getelementptr inbounds i8, ptr %23, i64 1408
  tail call void @point_add(ptr noundef nonnull %114, ptr noundef nonnull %115, ptr noundef nonnull %116, ptr noundef nonnull %81, ptr noundef nonnull %117, ptr noundef nonnull %118, i32 noundef 0, ptr noundef nonnull %31, ptr noundef nonnull %37, ptr noundef nonnull %43)
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(96) %48, i8 0, i64 96, i1 false)
  %119 = getelementptr inbounds i8, ptr %23, i64 2112
  %120 = getelementptr inbounds i8, ptr %23, i64 2144
  %121 = getelementptr inbounds i8, ptr %23, i64 2176
  %122 = getelementptr inbounds i8, ptr %23, i64 1920
  %123 = getelementptr inbounds i8, ptr %23, i64 1952
  %124 = getelementptr inbounds i8, ptr %23, i64 1984
  %125 = getelementptr inbounds i8, ptr %23, i64 1728
  %126 = getelementptr inbounds i8, ptr %23, i64 1760
  %127 = getelementptr inbounds i8, ptr %23, i64 1792
  tail call void @point_add(ptr noundef nonnull %119, ptr noundef nonnull %120, ptr noundef nonnull %121, ptr noundef nonnull %122, ptr noundef nonnull %123, ptr noundef nonnull %124, i32 noundef 0, ptr noundef nonnull %125, ptr noundef nonnull %126, ptr noundef nonnull %127)
  %128 = getelementptr inbounds i8, ptr %23, i64 2496
  %129 = getelementptr inbounds i8, ptr %23, i64 2528
  %130 = getelementptr inbounds i8, ptr %23, i64 2560
  %131 = getelementptr inbounds i8, ptr %23, i64 2304
  %132 = getelementptr inbounds i8, ptr %23, i64 2336
  %133 = getelementptr inbounds i8, ptr %23, i64 2368
  tail call void @point_add(ptr noundef nonnull %128, ptr noundef nonnull %129, ptr noundef nonnull %130, ptr noundef nonnull %131, ptr noundef nonnull %132, ptr noundef nonnull %133, i32 noundef 0, ptr noundef nonnull %125, ptr noundef nonnull %126, ptr noundef nonnull %127)
  %134 = getelementptr inbounds i8, ptr %23, i64 2688
  %135 = getelementptr inbounds i8, ptr %23, i64 2720
  %136 = getelementptr inbounds i8, ptr %23, i64 2752
  tail call void @point_add(ptr noundef nonnull %134, ptr noundef nonnull %135, ptr noundef nonnull %136, ptr noundef nonnull %131, ptr noundef nonnull %132, ptr noundef nonnull %133, i32 noundef 0, ptr noundef nonnull %122, ptr noundef nonnull %123, ptr noundef nonnull %124)
  %137 = getelementptr inbounds i8, ptr %23, i64 2880
  %138 = getelementptr inbounds i8, ptr %23, i64 2912
  %139 = getelementptr inbounds i8, ptr %23, i64 2944
  tail call void @point_add(ptr noundef nonnull %137, ptr noundef nonnull %138, ptr noundef nonnull %139, ptr noundef nonnull %134, ptr noundef nonnull %135, ptr noundef nonnull %136, i32 noundef 0, ptr noundef nonnull %125, ptr noundef nonnull %126, ptr noundef nonnull %127)
  %140 = getelementptr inbounds i8, ptr %23, i64 1632
  %141 = getelementptr inbounds i8, ptr %23, i64 1664
  %142 = getelementptr inbounds i8, ptr %23, i64 1696
  %143 = getelementptr inbounds i8, ptr %23, i64 1824
  %144 = getelementptr inbounds i8, ptr %23, i64 1856
  %145 = getelementptr inbounds i8, ptr %23, i64 1888
  %146 = getelementptr inbounds i8, ptr %23, i64 1728
  %147 = getelementptr inbounds i8, ptr %23, i64 1760
  %148 = getelementptr inbounds i8, ptr %23, i64 1792
  tail call void @point_add(ptr noundef nonnull %143, ptr noundef nonnull %144, ptr noundef nonnull %145, ptr noundef nonnull %146, ptr noundef nonnull %147, ptr noundef nonnull %148, i32 noundef 0, ptr noundef nonnull %140, ptr noundef nonnull %141, ptr noundef nonnull %142)
  %149 = getelementptr inbounds i8, ptr %23, i64 2016
  %150 = getelementptr inbounds i8, ptr %23, i64 2048
  %151 = getelementptr inbounds i8, ptr %23, i64 2080
  %152 = getelementptr inbounds i8, ptr %23, i64 1920
  %153 = getelementptr inbounds i8, ptr %23, i64 1952
  %154 = getelementptr inbounds i8, ptr %23, i64 1984
  tail call void @point_add(ptr noundef nonnull %149, ptr noundef nonnull %150, ptr noundef nonnull %151, ptr noundef nonnull %152, ptr noundef nonnull %153, ptr noundef nonnull %154, i32 noundef 0, ptr noundef nonnull %140, ptr noundef nonnull %141, ptr noundef nonnull %142)
  %155 = getelementptr inbounds i8, ptr %23, i64 2208
  %156 = getelementptr inbounds i8, ptr %23, i64 2240
  %157 = getelementptr inbounds i8, ptr %23, i64 2272
  %158 = getelementptr inbounds i8, ptr %23, i64 2112
  %159 = getelementptr inbounds i8, ptr %23, i64 2144
  %160 = getelementptr inbounds i8, ptr %23, i64 2176
  tail call void @point_add(ptr noundef nonnull %155, ptr noundef nonnull %156, ptr noundef nonnull %157, ptr noundef nonnull %158, ptr noundef nonnull %159, ptr noundef nonnull %160, i32 noundef 0, ptr noundef nonnull %140, ptr noundef nonnull %141, ptr noundef nonnull %142)
  %161 = getelementptr inbounds i8, ptr %23, i64 2400
  %162 = getelementptr inbounds i8, ptr %23, i64 2432
  %163 = getelementptr inbounds i8, ptr %23, i64 2464
  %164 = getelementptr inbounds i8, ptr %23, i64 2304
  %165 = getelementptr inbounds i8, ptr %23, i64 2336
  %166 = getelementptr inbounds i8, ptr %23, i64 2368
  tail call void @point_add(ptr noundef nonnull %161, ptr noundef nonnull %162, ptr noundef nonnull %163, ptr noundef nonnull %164, ptr noundef nonnull %165, ptr noundef nonnull %166, i32 noundef 0, ptr noundef nonnull %140, ptr noundef nonnull %141, ptr noundef nonnull %142)
  %167 = getelementptr inbounds i8, ptr %23, i64 2592
  %168 = getelementptr inbounds i8, ptr %23, i64 2624
  %169 = getelementptr inbounds i8, ptr %23, i64 2656
  %170 = getelementptr inbounds i8, ptr %23, i64 2496
  %171 = getelementptr inbounds i8, ptr %23, i64 2528
  %172 = getelementptr inbounds i8, ptr %23, i64 2560
  tail call void @point_add(ptr noundef nonnull %167, ptr noundef nonnull %168, ptr noundef nonnull %169, ptr noundef nonnull %170, ptr noundef nonnull %171, ptr noundef nonnull %172, i32 noundef 0, ptr noundef nonnull %140, ptr noundef nonnull %141, ptr noundef nonnull %142)
  %173 = getelementptr inbounds i8, ptr %23, i64 2784
  %174 = getelementptr inbounds i8, ptr %23, i64 2816
  %175 = getelementptr inbounds i8, ptr %23, i64 2848
  %176 = getelementptr inbounds i8, ptr %23, i64 2688
  %177 = getelementptr inbounds i8, ptr %23, i64 2720
  %178 = getelementptr inbounds i8, ptr %23, i64 2752
  tail call void @point_add(ptr noundef nonnull %173, ptr noundef nonnull %174, ptr noundef nonnull %175, ptr noundef nonnull %176, ptr noundef nonnull %177, ptr noundef nonnull %178, i32 noundef 0, ptr noundef nonnull %140, ptr noundef nonnull %141, ptr noundef nonnull %142)
  %179 = getelementptr inbounds i8, ptr %23, i64 2976
  %180 = getelementptr inbounds i8, ptr %23, i64 3008
  %181 = getelementptr inbounds i8, ptr %23, i64 3040
  %182 = getelementptr inbounds i8, ptr %23, i64 2880
  %183 = getelementptr inbounds i8, ptr %23, i64 2912
  %184 = getelementptr inbounds i8, ptr %23, i64 2944
  tail call void @point_add(ptr noundef nonnull %179, ptr noundef nonnull %180, ptr noundef nonnull %181, ptr noundef nonnull %182, ptr noundef nonnull %183, ptr noundef nonnull %184, i32 noundef 0, ptr noundef nonnull %140, ptr noundef nonnull %141, ptr noundef nonnull %142)
  call void @make_points_affine(i64 noundef 31, ptr noundef nonnull %31, ptr noundef nonnull %3)
  br label %185

185:                                              ; preds = %split, %29
  %186 = getelementptr inbounds i8, ptr %0, i64 152
  store i32 1, ptr %186, align 8, !tbaa !16
  %187 = getelementptr inbounds i8, ptr %0, i64 160
  store ptr %23, ptr %187, align 8, !tbaa !17
  br label %188

188:                                              ; preds = %30, %36, %42, %22, %18, %15, %11, %.thread, %185
  %.0201 = phi i32 [ 0, %.thread ], [ 0, %11 ], [ 0, %15 ], [ 0, %22 ], [ 1, %185 ], [ 0, %42 ], [ 0, %36 ], [ 0, %30 ], [ 0, %18 ]
  %.0200 = phi ptr [ null, %.thread ], [ null, %11 ], [ null, %15 ], [ null, %22 ], [ null, %185 ], [ %23, %42 ], [ %23, %36 ], [ %23, %30 ], [ null, %18 ]
  %.0194 = phi ptr [ null, %.thread ], [ null, %11 ], [ null, %15 ], [ %16, %22 ], [ %16, %185 ], [ %16, %42 ], [ %16, %36 ], [ %16, %30 ], [ %16, %18 ]
  call void @BN_CTX_end(ptr noundef nonnull %.0196213) #5
  call void @EC_POINT_free(ptr noundef %.0194) #5
  call void @BN_CTX_free(ptr noundef %.0214) #5
  call void @EC_nistp224_pre_comp_free(ptr noundef %.0200)
  br label %189

189:                                              ; preds = %5, %188
  %.0195 = phi i32 [ %.0201, %188 ], [ 0, %5 ]
  call void @llvm.lifetime.end.p0(i64 1024, ptr nonnull %3) #5
  ret i32 %.0195
}

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @EC_nistp224_pre_comp_free(ptr noundef) local_unnamed_addr #0

declare ptr @BN_CTX_new() local_unnamed_addr #2

declare void @BN_CTX_start(ptr noundef) local_unnamed_addr #2

declare ptr @BN_CTX_get(ptr noundef) local_unnamed_addr #2

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

declare void @BN_CTX_end(ptr noundef) local_unnamed_addr #2

declare void @BN_CTX_free(ptr noundef) local_unnamed_addr #2

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

declare ptr @EC_POINT_new(ptr noundef) local_unnamed_addr #2

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

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

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

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

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

declare void @EC_POINT_free(ptr noundef) local_unnamed_addr #2

declare void @EC_pre_comp_free(ptr noundef) local_unnamed_addr #2

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

; Function Attrs: nounwind uwtable
declare hidden ptr @nistp224_pre_comp_new() local_unnamed_addr #0

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { 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, !7, i64 8}
!6 = !{!"ec_group_st", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !7, i64 48, !11, i64 56, !7, i64 64, !8, i64 72, !7, i64 96, !7, i64 104, !10, i64 112, !7, i64 120, !7, i64 128, !7, i64 136, !7, i64 144, !10, i64 152, !8, i64 160, !7, i64 168, !7, i64 176}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"long", !8, i64 0}
!12 = !{!13, !7, i64 16}
!13 = !{!"ec_point_st", !7, i64 0, !10, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !10, i64 40}
!14 = !{!13, !7, i64 24}
!15 = !{!13, !7, i64 32}
!16 = !{!6, !10, i64 152}
!17 = !{!8, !8, i64 0}


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