; LLVM IR from intel/cryptography-primitives :: sources/ippcp/gfpec (pcpgfpecsignsm2)

; 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._cpGFpECPoint = type { i32, i32, i32, ptr }
%struct._cpGFpEC = type { i32, i32, ptr, i32, i32, i32, ptr, ptr, ptr, ptr, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct._cpGFp = type { i32, i32, ptr }
%struct._gsModEngine = type { ptr, i32, i32, i32, i32, i32, ptr, ptr, ptr, i64, ptr, ptr, ptr, ptr, i32, i32, ptr }
%struct._cpBigNum = type { i32, i32, i32, i32, ptr, ptr }
%struct._gsModMethod = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

; Function Attrs: nounwind uwtable
define dso_local i32 @ippsGFpECSignSM2(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6) #0 {
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %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 i32, align 4
  %28 = alloca ptr, align 8
  %29 = alloca i32, align 4
  %30 = alloca ptr, align 8
  %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 %struct._cpGFpECPoint, align 8
  %37 = alloca ptr, align 8
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  store ptr %0, ptr %9, align 8, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !5
  store ptr %2, ptr %11, align 8, !tbaa !5
  store ptr %3, ptr %12, align 8, !tbaa !5
  store ptr %4, ptr %13, align 8, !tbaa !5
  store ptr %5, ptr %14, align 8, !tbaa !5
  store ptr %6, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %42 = load ptr, ptr %14, align 8, !tbaa !5
  %43 = icmp eq ptr null, %42
  br i1 %43, label %44, label %45

44:                                               ; preds = %7
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

45:                                               ; preds = %7
  %46 = load ptr, ptr %15, align 8, !tbaa !5
  %47 = icmp eq ptr null, %46
  br i1 %47, label %48, label %49

48:                                               ; preds = %45
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

49:                                               ; preds = %45
  %50 = load ptr, ptr %14, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct._cpGFpEC, ptr %50, i32 0, i32 0
  %52 = load i32, ptr %51, align 8, !tbaa !9
  %53 = load ptr, ptr %14, align 8, !tbaa !5
  %54 = call i64 @IPP_UINT_PTR(ptr noundef %53)
  %55 = trunc i64 %54 to i32
  %56 = xor i32 %52, %55
  %57 = icmp eq i32 %56, 1129136461
  br i1 %57, label %59, label %58

58:                                               ; preds = %49
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

59:                                               ; preds = %49
  %60 = load ptr, ptr %14, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct._cpGFpEC, ptr %60, i32 0, i32 3
  %62 = load i32, ptr %61, align 8, !tbaa !12
  %63 = icmp ne i32 %62, 0
  br i1 %63, label %65, label %64

64:                                               ; preds = %59
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

65:                                               ; preds = %59
  %66 = load ptr, ptr %14, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct._cpGFpEC, ptr %66, i32 0, i32 2
  %68 = load ptr, ptr %67, align 8, !tbaa !13
  store ptr %68, ptr %16, align 8, !tbaa !5
  %69 = load ptr, ptr %16, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct._cpGFp, ptr %69, i32 0, i32 2
  %71 = load ptr, ptr %70, align 8, !tbaa !14
  store ptr %71, ptr %17, align 8, !tbaa !5
  %72 = load ptr, ptr %17, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct._gsModEngine, ptr %72, i32 0, i32 1
  %74 = load i32, ptr %73, align 8, !tbaa !16
  %75 = icmp slt i32 1, %74
  br i1 %75, label %76, label %77

76:                                               ; preds = %65
  store i32 -14, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

77:                                               ; preds = %65
  %78 = load ptr, ptr %9, align 8, !tbaa !5
  %79 = icmp eq ptr null, %78
  br i1 %79, label %80, label %81

80:                                               ; preds = %77
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

81:                                               ; preds = %77
  %82 = load ptr, ptr %9, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct._cpBigNum, ptr %82, i32 0, i32 0
  %84 = load i32, ptr %83, align 8, !tbaa !19
  %85 = load ptr, ptr %9, align 8, !tbaa !5
  %86 = call i64 @IPP_UINT_PTR(ptr noundef %85)
  %87 = trunc i64 %86 to i32
  %88 = xor i32 %84, %87
  %89 = icmp eq i32 %88, 1112098638
  br i1 %89, label %91, label %90

90:                                               ; preds = %81
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

91:                                               ; preds = %81
  %92 = load ptr, ptr %9, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct._cpBigNum, ptr %92, i32 0, i32 1
  %94 = load i32, ptr %93, align 4, !tbaa !21
  %95 = icmp eq i32 %94, 0
  br i1 %95, label %96, label %97

96:                                               ; preds = %91
  store i32 -1010, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

97:                                               ; preds = %91
  %98 = load ptr, ptr %14, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct._cpGFpEC, ptr %98, i32 0, i32 5
  %100 = load i32, ptr %99, align 8, !tbaa !22
  %101 = load ptr, ptr %9, align 8, !tbaa !5
  %102 = call i32 @cpBN_bitsize(ptr noundef %101)
  %103 = icmp slt i32 %100, %102
  br i1 %103, label %104, label %105

104:                                              ; preds = %97
  store i32 -1010, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

105:                                              ; preds = %97
  %106 = load ptr, ptr %13, align 8, !tbaa !5
  %107 = icmp eq ptr null, %106
  br i1 %107, label %108, label %109

108:                                              ; preds = %105
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

109:                                              ; preds = %105
  %110 = load ptr, ptr %12, align 8, !tbaa !5
  %111 = icmp eq ptr null, %110
  br i1 %111, label %112, label %113

112:                                              ; preds = %109
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

113:                                              ; preds = %109
  %114 = load ptr, ptr %12, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct._cpBigNum, ptr %114, i32 0, i32 0
  %116 = load i32, ptr %115, align 8, !tbaa !19
  %117 = load ptr, ptr %12, align 8, !tbaa !5
  %118 = call i64 @IPP_UINT_PTR(ptr noundef %117)
  %119 = trunc i64 %118 to i32
  %120 = xor i32 %116, %119
  %121 = icmp eq i32 %120, 1112098638
  br i1 %121, label %123, label %122

122:                                              ; preds = %113
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

123:                                              ; preds = %113
  %124 = load ptr, ptr %13, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct._cpBigNum, ptr %124, i32 0, i32 0
  %126 = load i32, ptr %125, align 8, !tbaa !19
  %127 = load ptr, ptr %13, align 8, !tbaa !5
  %128 = call i64 @IPP_UINT_PTR(ptr noundef %127)
  %129 = trunc i64 %128 to i32
  %130 = xor i32 %126, %129
  %131 = icmp eq i32 %130, 1112098638
  br i1 %131, label %133, label %132

132:                                              ; preds = %123
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

133:                                              ; preds = %123
  %134 = load ptr, ptr %12, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct._cpBigNum, ptr %134, i32 0, i32 3
  %136 = load i32, ptr %135, align 4, !tbaa !23
  %137 = mul nsw i32 %136, 64
  %138 = load ptr, ptr %14, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct._cpGFpEC, ptr %138, i32 0, i32 5
  %140 = load i32, ptr %139, align 8, !tbaa !22
  %141 = icmp slt i32 %137, %140
  br i1 %141, label %142, label %143

142:                                              ; preds = %133
  store i32 -7, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

143:                                              ; preds = %133
  %144 = load ptr, ptr %13, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct._cpBigNum, ptr %144, i32 0, i32 3
  %146 = load i32, ptr %145, align 4, !tbaa !23
  %147 = mul nsw i32 %146, 64
  %148 = load ptr, ptr %14, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct._cpGFpEC, ptr %148, i32 0, i32 5
  %150 = load i32, ptr %149, align 8, !tbaa !22
  %151 = icmp slt i32 %147, %150
  br i1 %151, label %152, label %153

152:                                              ; preds = %143
  store i32 -7, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

153:                                              ; preds = %143
  %154 = load ptr, ptr %10, align 8, !tbaa !5
  %155 = icmp eq ptr null, %154
  br i1 %155, label %156, label %157

156:                                              ; preds = %153
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

157:                                              ; preds = %153
  %158 = load ptr, ptr %11, align 8, !tbaa !5
  %159 = icmp eq ptr null, %158
  br i1 %159, label %160, label %161

160:                                              ; preds = %157
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

161:                                              ; preds = %157
  %162 = load ptr, ptr %10, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct._cpBigNum, ptr %162, i32 0, i32 0
  %164 = load i32, ptr %163, align 8, !tbaa !19
  %165 = load ptr, ptr %10, align 8, !tbaa !5
  %166 = call i64 @IPP_UINT_PTR(ptr noundef %165)
  %167 = trunc i64 %166 to i32
  %168 = xor i32 %164, %167
  %169 = icmp eq i32 %168, 1112098638
  br i1 %169, label %171, label %170

170:                                              ; preds = %161
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

171:                                              ; preds = %161
  %172 = load ptr, ptr %10, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct._cpBigNum, ptr %172, i32 0, i32 1
  %174 = load i32, ptr %173, align 4, !tbaa !21
  %175 = icmp eq i32 %174, 0
  br i1 %175, label %176, label %177

176:                                              ; preds = %171
  store i32 -1008, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

177:                                              ; preds = %171
  %178 = load ptr, ptr %11, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct._cpBigNum, ptr %178, i32 0, i32 0
  %180 = load i32, ptr %179, align 8, !tbaa !19
  %181 = load ptr, ptr %11, align 8, !tbaa !5
  %182 = call i64 @IPP_UINT_PTR(ptr noundef %181)
  %183 = trunc i64 %182 to i32
  %184 = xor i32 %180, %183
  %185 = icmp eq i32 %184, 1112098638
  br i1 %185, label %187, label %186

186:                                              ; preds = %177
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

187:                                              ; preds = %177
  %188 = load ptr, ptr %11, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct._cpBigNum, ptr %188, i32 0, i32 1
  %190 = load i32, ptr %189, align 4, !tbaa !21
  %191 = icmp eq i32 %190, 0
  br i1 %191, label %192, label %193

192:                                              ; preds = %187
  store i32 -1011, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %575

193:                                              ; preds = %187
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %194 = load ptr, ptr %14, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct._cpGFpEC, ptr %194, i32 0, i32 13
  %196 = load ptr, ptr %195, align 8, !tbaa !24
  store ptr %196, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %197 = load ptr, ptr %19, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct._gsModEngine, ptr %197, i32 0, i32 8
  %199 = load ptr, ptr %198, align 8, !tbaa !25
  store ptr %199, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  %200 = load ptr, ptr %19, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct._gsModEngine, ptr %200, i32 0, i32 3
  %202 = load i32, ptr %201, align 8, !tbaa !26
  store i32 %202, ptr %21, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %203 = load ptr, ptr %12, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct._cpBigNum, ptr %203, i32 0, i32 4
  %205 = load ptr, ptr %204, align 8, !tbaa !28
  store ptr %205, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  %206 = load ptr, ptr %13, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct._cpBigNum, ptr %206, i32 0, i32 4
  %208 = load ptr, ptr %207, align 8, !tbaa !28
  store ptr %208, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  %209 = load ptr, ptr %12, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct._cpBigNum, ptr %209, i32 0, i32 5
  %211 = load ptr, ptr %210, align 8, !tbaa !29
  store ptr %211, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %212 = load ptr, ptr %13, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct._cpBigNum, ptr %212, i32 0, i32 5
  %214 = load ptr, ptr %213, align 8, !tbaa !29
  store ptr %214, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  %215 = load ptr, ptr %10, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct._cpBigNum, ptr %215, i32 0, i32 4
  %217 = load ptr, ptr %216, align 8, !tbaa !28
  store ptr %217, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #4
  %218 = load ptr, ptr %10, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct._cpBigNum, ptr %218, i32 0, i32 2
  %220 = load i32, ptr %219, align 8, !tbaa !30
  store i32 %220, ptr %27, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  %221 = load ptr, ptr %11, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct._cpBigNum, ptr %221, i32 0, i32 4
  %223 = load ptr, ptr %222, align 8, !tbaa !28
  store ptr %223, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  %224 = load ptr, ptr %11, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct._cpBigNum, ptr %224, i32 0, i32 2
  %226 = load i32, ptr %225, align 8, !tbaa !30
  store i32 %226, ptr %29, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  %227 = load ptr, ptr %9, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct._cpBigNum, ptr %227, i32 0, i32 4
  %229 = load ptr, ptr %228, align 8, !tbaa !28
  store ptr %229, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #4
  %230 = load ptr, ptr %9, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct._cpBigNum, ptr %230, i32 0, i32 2
  %232 = load i32, ptr %231, align 8, !tbaa !30
  store i32 %232, ptr %31, align 4, !tbaa !27
  %233 = load ptr, ptr %26, align 8, !tbaa !5
  %234 = load i32, ptr %27, align 4, !tbaa !27
  %235 = call i32 @cpEqu_BNU_CHUNK(ptr noundef %233, i32 noundef %234, i64 noundef 0)
  %236 = icmp ne i32 %235, 0
  br i1 %236, label %244, label %237

237:                                              ; preds = %193
  %238 = load ptr, ptr %26, align 8, !tbaa !5
  %239 = load i32, ptr %27, align 4, !tbaa !27
  %240 = load ptr, ptr %20, align 8, !tbaa !5
  %241 = load i32, ptr %21, align 4, !tbaa !27
  %242 = call i32 @cpCmp_BNU(ptr noundef %238, i32 noundef %239, ptr noundef %240, i32 noundef %241)
  %243 = icmp sle i32 0, %242
  br i1 %243, label %244, label %245

244:                                              ; preds = %237, %193
  store i32 -1008, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %574

245:                                              ; preds = %237
  %246 = load ptr, ptr %28, align 8, !tbaa !5
  %247 = load i32, ptr %29, align 4, !tbaa !27
  %248 = call i32 @cpEqu_BNU_CHUNK(ptr noundef %246, i32 noundef %247, i64 noundef 0)
  %249 = icmp ne i32 %248, 0
  br i1 %249, label %257, label %250

250:                                              ; preds = %245
  %251 = load ptr, ptr %28, align 8, !tbaa !5
  %252 = load i32, ptr %29, align 4, !tbaa !27
  %253 = load ptr, ptr %20, align 8, !tbaa !5
  %254 = load i32, ptr %21, align 4, !tbaa !27
  %255 = call i32 @cpCmp_BNU(ptr noundef %251, i32 noundef %252, ptr noundef %253, i32 noundef %254)
  %256 = icmp sle i32 0, %255
  br i1 %256, label %257, label %258

257:                                              ; preds = %250, %245
  store i32 -1011, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %574

258:                                              ; preds = %250
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #4
  store i32 0, ptr %32, align 4, !tbaa !27
  br label %259

259:                                              ; preds = %273, %258
  %260 = load i32, ptr %32, align 4, !tbaa !27
  %261 = load i32, ptr %27, align 4, !tbaa !27
  %262 = icmp slt i32 %260, %261
  br i1 %262, label %263, label %276

263:                                              ; preds = %259
  %264 = load ptr, ptr %26, align 8, !tbaa !5
  %265 = load i32, ptr %32, align 4, !tbaa !27
  %266 = sext i32 %265 to i64
  %267 = getelementptr inbounds i64, ptr %264, i64 %266
  %268 = load i64, ptr %267, align 8, !tbaa !31
  %269 = load ptr, ptr %23, align 8, !tbaa !5
  %270 = load i32, ptr %32, align 4, !tbaa !27
  %271 = sext i32 %270 to i64
  %272 = getelementptr inbounds i64, ptr %269, i64 %271
  store i64 %268, ptr %272, align 8, !tbaa !31
  br label %273

273:                                              ; preds = %263
  %274 = load i32, ptr %32, align 4, !tbaa !27
  %275 = add nsw i32 %274, 1
  store i32 %275, ptr %32, align 4, !tbaa !27
  br label %259, !llvm.loop !32

276:                                              ; preds = %259
  br label %277

277:                                              ; preds = %286, %276
  %278 = load i32, ptr %32, align 4, !tbaa !27
  %279 = load i32, ptr %21, align 4, !tbaa !27
  %280 = icmp slt i32 %278, %279
  br i1 %280, label %281, label %289

281:                                              ; preds = %277
  %282 = load ptr, ptr %23, align 8, !tbaa !5
  %283 = load i32, ptr %32, align 4, !tbaa !27
  %284 = sext i32 %283 to i64
  %285 = getelementptr inbounds i64, ptr %282, i64 %284
  store i64 0, ptr %285, align 8, !tbaa !31
  br label %286

286:                                              ; preds = %281
  %287 = load i32, ptr %32, align 4, !tbaa !27
  %288 = add nsw i32 %287, 1
  store i32 %288, ptr %32, align 4, !tbaa !27
  br label %277, !llvm.loop !34

289:                                              ; preds = %277
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #4
  %290 = load ptr, ptr %23, align 8, !tbaa !5
  %291 = load ptr, ptr %23, align 8, !tbaa !5
  %292 = load i32, ptr %21, align 4, !tbaa !27
  %293 = call i64 @cpInc_BNU(ptr noundef %290, ptr noundef %291, i32 noundef %292, i64 noundef 1)
  %294 = load ptr, ptr %23, align 8, !tbaa !5
  %295 = load i32, ptr %21, align 4, !tbaa !27
  %296 = load ptr, ptr %20, align 8, !tbaa !5
  %297 = load i32, ptr %21, align 4, !tbaa !27
  %298 = call i32 @cpCmp_BNU(ptr noundef %294, i32 noundef %295, ptr noundef %296, i32 noundef %297)
  %299 = icmp eq i32 0, %298
  br i1 %299, label %300, label %301

300:                                              ; preds = %289
  store i32 -1008, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %574

301:                                              ; preds = %289
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  store i32 -1011, ptr %33, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #4
  %302 = load ptr, ptr %17, align 8, !tbaa !5
  %303 = getelementptr inbounds %struct._gsModEngine, ptr %302, i32 0, i32 3
  %304 = load i32, ptr %303, align 8, !tbaa !26
  store i32 %304, ptr %34, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %36) #4
  %305 = load ptr, ptr %14, align 8, !tbaa !5
  %306 = call ptr @cpEcGFpGetPool(i32 noundef 1, ptr noundef %305)
  %307 = load ptr, ptr %14, align 8, !tbaa !5
  %308 = call ptr @cpEcGFpInitPoint(ptr noundef %36, ptr noundef %306, i32 noundef 0, ptr noundef %307)
  %309 = load ptr, ptr %28, align 8, !tbaa !5
  %310 = load i32, ptr %29, align 4, !tbaa !27
  %311 = load ptr, ptr %14, align 8, !tbaa !5
  %312 = load ptr, ptr %15, align 8, !tbaa !5
  %313 = call ptr @gfec_MulBasePoint(ptr noundef %36, ptr noundef %309, i32 noundef %310, ptr noundef %311, ptr noundef %312)
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  %314 = load ptr, ptr %17, align 8, !tbaa !5
  %315 = call ptr @gsModPoolAlloc(ptr noundef %314, i32 noundef 1)
  store ptr %315, ptr %37, align 8, !tbaa !5
  %316 = load ptr, ptr %37, align 8, !tbaa !5
  %317 = icmp eq ptr null, %316
  br i1 %317, label %318, label %319

318:                                              ; preds = %301
  store i32 -8, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %343

319:                                              ; preds = %301
  %320 = load ptr, ptr %37, align 8, !tbaa !5
  %321 = load ptr, ptr %14, align 8, !tbaa !5
  %322 = call i32 @gfec_GetPoint(ptr noundef %320, ptr noundef null, ptr noundef %36, ptr noundef %321)
  %323 = load ptr, ptr %17, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct._gsModEngine, ptr %323, i32 0, i32 6
  %325 = load ptr, ptr %324, align 8, !tbaa !35
  %326 = getelementptr inbounds %struct._gsModMethod, ptr %325, i32 0, i32 1
  %327 = load ptr, ptr %326, align 8, !tbaa !36
  %328 = load ptr, ptr %37, align 8, !tbaa !5
  %329 = load ptr, ptr %37, align 8, !tbaa !5
  %330 = load ptr, ptr %17, align 8, !tbaa !5
  %331 = call ptr %327(ptr noundef %328, ptr noundef %329, ptr noundef %330)
  %332 = load ptr, ptr %37, align 8, !tbaa !5
  %333 = load i32, ptr %34, align 4, !tbaa !27
  %334 = load ptr, ptr %20, align 8, !tbaa !5
  %335 = load i32, ptr %21, align 4, !tbaa !27
  %336 = call i32 @cpMod_BNU(ptr noundef %332, i32 noundef %333, ptr noundef %334, i32 noundef %335)
  store i32 %336, ptr %35, align 4, !tbaa !27
  %337 = load ptr, ptr %22, align 8, !tbaa !5
  %338 = load i32, ptr %21, align 4, !tbaa !27
  %339 = load ptr, ptr %37, align 8, !tbaa !5
  %340 = load i32, ptr %35, align 4, !tbaa !27
  %341 = call ptr @cpGFpElementCopyPad(ptr noundef %337, i32 noundef %338, ptr noundef %339, i32 noundef %340)
  %342 = load ptr, ptr %17, align 8, !tbaa !5
  call void @gsModPoolFree(ptr noundef %342, i32 noundef 1)
  store i32 0, ptr %18, align 4
  br label %343

343:                                              ; preds = %319, %318
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  %344 = load i32, ptr %18, align 4
  switch i32 %344, label %567 [
    i32 0, label %345
  ]

345:                                              ; preds = %343
  %346 = load ptr, ptr %14, align 8, !tbaa !5
  call void @cpEcGFpReleasePool(i32 noundef 1, ptr noundef %346)
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #4
  store i32 0, ptr %38, align 4, !tbaa !27
  br label %347

347:                                              ; preds = %361, %345
  %348 = load i32, ptr %38, align 4, !tbaa !27
  %349 = load i32, ptr %31, align 4, !tbaa !27
  %350 = icmp slt i32 %348, %349
  br i1 %350, label %351, label %364

351:                                              ; preds = %347
  %352 = load ptr, ptr %30, align 8, !tbaa !5
  %353 = load i32, ptr %38, align 4, !tbaa !27
  %354 = sext i32 %353 to i64
  %355 = getelementptr inbounds i64, ptr %352, i64 %354
  %356 = load i64, ptr %355, align 8, !tbaa !31
  %357 = load ptr, ptr %25, align 8, !tbaa !5
  %358 = load i32, ptr %38, align 4, !tbaa !27
  %359 = sext i32 %358 to i64
  %360 = getelementptr inbounds i64, ptr %357, i64 %359
  store i64 %356, ptr %360, align 8, !tbaa !31
  br label %361

361:                                              ; preds = %351
  %362 = load i32, ptr %38, align 4, !tbaa !27
  %363 = add nsw i32 %362, 1
  store i32 %363, ptr %38, align 4, !tbaa !27
  br label %347, !llvm.loop !38

364:                                              ; preds = %347
  br label %365

365:                                              ; preds = %374, %364
  %366 = load i32, ptr %38, align 4, !tbaa !27
  %367 = load i32, ptr %21, align 4, !tbaa !27
  %368 = icmp slt i32 %366, %367
  br i1 %368, label %369, label %377

369:                                              ; preds = %365
  %370 = load ptr, ptr %25, align 8, !tbaa !5
  %371 = load i32, ptr %38, align 4, !tbaa !27
  %372 = sext i32 %371 to i64
  %373 = getelementptr inbounds i64, ptr %370, i64 %372
  store i64 0, ptr %373, align 8, !tbaa !31
  br label %374

374:                                              ; preds = %369
  %375 = load i32, ptr %38, align 4, !tbaa !27
  %376 = add nsw i32 %375, 1
  store i32 %376, ptr %38, align 4, !tbaa !27
  br label %365, !llvm.loop !39

377:                                              ; preds = %365
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #4
  %378 = load ptr, ptr %25, align 8, !tbaa !5
  %379 = load ptr, ptr %25, align 8, !tbaa !5
  %380 = load ptr, ptr %20, align 8, !tbaa !5
  %381 = load ptr, ptr %20, align 8, !tbaa !5
  %382 = load i32, ptr %21, align 4, !tbaa !27
  %383 = load ptr, ptr %24, align 8, !tbaa !5
  %384 = call ptr @cpModSub_BNU(ptr noundef %378, ptr noundef %379, ptr noundef %380, ptr noundef %381, i32 noundef %382, ptr noundef %383)
  %385 = load ptr, ptr %22, 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 i32, ptr %21, align 4, !tbaa !27
  %390 = load ptr, ptr %24, align 8, !tbaa !5
  %391 = call ptr @cpModAdd_BNU(ptr noundef %385, ptr noundef %386, ptr noundef %387, ptr noundef %388, i32 noundef %389, ptr noundef %390)
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #4
  store i32 0, ptr %39, align 4, !tbaa !27
  br label %392

392:                                              ; preds = %406, %377
  %393 = load i32, ptr %39, align 4, !tbaa !27
  %394 = load i32, ptr %29, align 4, !tbaa !27
  %395 = icmp slt i32 %393, %394
  br i1 %395, label %396, label %409

396:                                              ; preds = %392
  %397 = load ptr, ptr %28, align 8, !tbaa !5
  %398 = load i32, ptr %39, align 4, !tbaa !27
  %399 = sext i32 %398 to i64
  %400 = getelementptr inbounds i64, ptr %397, i64 %399
  %401 = load i64, ptr %400, align 8, !tbaa !31
  %402 = load ptr, ptr %24, align 8, !tbaa !5
  %403 = load i32, ptr %39, align 4, !tbaa !27
  %404 = sext i32 %403 to i64
  %405 = getelementptr inbounds i64, ptr %402, i64 %404
  store i64 %401, ptr %405, align 8, !tbaa !31
  br label %406

406:                                              ; preds = %396
  %407 = load i32, ptr %39, align 4, !tbaa !27
  %408 = add nsw i32 %407, 1
  store i32 %408, ptr %39, align 4, !tbaa !27
  br label %392, !llvm.loop !40

409:                                              ; preds = %392
  br label %410

410:                                              ; preds = %419, %409
  %411 = load i32, ptr %39, align 4, !tbaa !27
  %412 = load i32, ptr %21, align 4, !tbaa !27
  %413 = icmp slt i32 %411, %412
  br i1 %413, label %414, label %422

414:                                              ; preds = %410
  %415 = load ptr, ptr %24, align 8, !tbaa !5
  %416 = load i32, ptr %39, align 4, !tbaa !27
  %417 = sext i32 %416 to i64
  %418 = getelementptr inbounds i64, ptr %415, i64 %417
  store i64 0, ptr %418, align 8, !tbaa !31
  br label %419

419:                                              ; preds = %414
  %420 = load i32, ptr %39, align 4, !tbaa !27
  %421 = add nsw i32 %420, 1
  store i32 %421, ptr %39, align 4, !tbaa !27
  br label %410, !llvm.loop !41

422:                                              ; preds = %410
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #4
  %423 = load ptr, ptr %24, align 8, !tbaa !5
  %424 = load ptr, ptr %24, align 8, !tbaa !5
  %425 = load ptr, ptr %22, align 8, !tbaa !5
  %426 = load ptr, ptr %20, align 8, !tbaa !5
  %427 = load i32, ptr %21, align 4, !tbaa !27
  %428 = load ptr, ptr %25, align 8, !tbaa !5
  %429 = call ptr @cpModAdd_BNU(ptr noundef %423, ptr noundef %424, ptr noundef %425, ptr noundef %426, i32 noundef %427, ptr noundef %428)
  %430 = load ptr, ptr %22, align 8, !tbaa !5
  %431 = load i32, ptr %21, align 4, !tbaa !27
  %432 = call i32 @cpGFpElementIsEquChunk(ptr noundef %430, i32 noundef %431, i64 noundef 0)
  %433 = icmp ne i32 %432, 0
  br i1 %433, label %566, label %434

434:                                              ; preds = %422
  %435 = load ptr, ptr %24, align 8, !tbaa !5
  %436 = load i32, ptr %21, align 4, !tbaa !27
  %437 = call i32 @cpGFpElementIsEquChunk(ptr noundef %435, i32 noundef %436, i64 noundef 0)
  %438 = icmp ne i32 %437, 0
  br i1 %438, label %566, label %439

439:                                              ; preds = %434
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #4
  store i32 0, ptr %40, align 4, !tbaa !27
  br label %440

440:                                              ; preds = %454, %439
  %441 = load i32, ptr %40, align 4, !tbaa !27
  %442 = load i32, ptr %27, align 4, !tbaa !27
  %443 = icmp slt i32 %441, %442
  br i1 %443, label %444, label %457

444:                                              ; preds = %440
  %445 = load ptr, ptr %26, align 8, !tbaa !5
  %446 = load i32, ptr %40, align 4, !tbaa !27
  %447 = sext i32 %446 to i64
  %448 = getelementptr inbounds i64, ptr %445, i64 %447
  %449 = load i64, ptr %448, align 8, !tbaa !31
  %450 = load ptr, ptr %25, align 8, !tbaa !5
  %451 = load i32, ptr %40, align 4, !tbaa !27
  %452 = sext i32 %451 to i64
  %453 = getelementptr inbounds i64, ptr %450, i64 %452
  store i64 %449, ptr %453, align 8, !tbaa !31
  br label %454

454:                                              ; preds = %444
  %455 = load i32, ptr %40, align 4, !tbaa !27
  %456 = add nsw i32 %455, 1
  store i32 %456, ptr %40, align 4, !tbaa !27
  br label %440, !llvm.loop !42

457:                                              ; preds = %440
  br label %458

458:                                              ; preds = %467, %457
  %459 = load i32, ptr %40, align 4, !tbaa !27
  %460 = load i32, ptr %21, align 4, !tbaa !27
  %461 = icmp slt i32 %459, %460
  br i1 %461, label %462, label %470

462:                                              ; preds = %458
  %463 = load ptr, ptr %25, align 8, !tbaa !5
  %464 = load i32, ptr %40, align 4, !tbaa !27
  %465 = sext i32 %464 to i64
  %466 = getelementptr inbounds i64, ptr %463, i64 %465
  store i64 0, ptr %466, align 8, !tbaa !31
  br label %467

467:                                              ; preds = %462
  %468 = load i32, ptr %40, align 4, !tbaa !27
  %469 = add nsw i32 %468, 1
  store i32 %469, ptr %40, align 4, !tbaa !27
  br label %458, !llvm.loop !43

470:                                              ; preds = %458
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #4
  %471 = load ptr, ptr %19, align 8, !tbaa !5
  %472 = getelementptr inbounds %struct._gsModEngine, ptr %471, i32 0, i32 6
  %473 = load ptr, ptr %472, align 8, !tbaa !35
  %474 = getelementptr inbounds %struct._gsModMethod, ptr %473, i32 0, i32 0
  %475 = load ptr, ptr %474, align 8, !tbaa !44
  %476 = load ptr, ptr %25, align 8, !tbaa !5
  %477 = load ptr, ptr %25, align 8, !tbaa !5
  %478 = load ptr, ptr %19, align 8, !tbaa !5
  %479 = call ptr %475(ptr noundef %476, ptr noundef %477, ptr noundef %478)
  %480 = load ptr, ptr %19, align 8, !tbaa !5
  %481 = getelementptr inbounds %struct._gsModEngine, ptr %480, i32 0, i32 6
  %482 = load ptr, ptr %481, align 8, !tbaa !35
  %483 = getelementptr inbounds %struct._gsModMethod, ptr %482, i32 0, i32 2
  %484 = load ptr, ptr %483, align 8, !tbaa !45
  %485 = load ptr, ptr %25, align 8, !tbaa !5
  %486 = load ptr, ptr %25, align 8, !tbaa !5
  %487 = load ptr, ptr %22, align 8, !tbaa !5
  %488 = load ptr, ptr %19, align 8, !tbaa !5
  %489 = call ptr %484(ptr noundef %485, ptr noundef %486, ptr noundef %487, ptr noundef %488)
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #4
  store i32 0, ptr %41, align 4, !tbaa !27
  br label %490

490:                                              ; preds = %504, %470
  %491 = load i32, ptr %41, align 4, !tbaa !27
  %492 = load i32, ptr %29, align 4, !tbaa !27
  %493 = icmp slt i32 %491, %492
  br i1 %493, label %494, label %507

494:                                              ; preds = %490
  %495 = load ptr, ptr %28, align 8, !tbaa !5
  %496 = load i32, ptr %41, align 4, !tbaa !27
  %497 = sext i32 %496 to i64
  %498 = getelementptr inbounds i64, ptr %495, i64 %497
  %499 = load i64, ptr %498, align 8, !tbaa !31
  %500 = load ptr, ptr %24, align 8, !tbaa !5
  %501 = load i32, ptr %41, align 4, !tbaa !27
  %502 = sext i32 %501 to i64
  %503 = getelementptr inbounds i64, ptr %500, i64 %502
  store i64 %499, ptr %503, align 8, !tbaa !31
  br label %504

504:                                              ; preds = %494
  %505 = load i32, ptr %41, align 4, !tbaa !27
  %506 = add nsw i32 %505, 1
  store i32 %506, ptr %41, align 4, !tbaa !27
  br label %490, !llvm.loop !46

507:                                              ; preds = %490
  br label %508

508:                                              ; preds = %517, %507
  %509 = load i32, ptr %41, align 4, !tbaa !27
  %510 = load i32, ptr %21, align 4, !tbaa !27
  %511 = icmp slt i32 %509, %510
  br i1 %511, label %512, label %520

512:                                              ; preds = %508
  %513 = load ptr, ptr %24, align 8, !tbaa !5
  %514 = load i32, ptr %41, align 4, !tbaa !27
  %515 = sext i32 %514 to i64
  %516 = getelementptr inbounds i64, ptr %513, i64 %515
  store i64 0, ptr %516, align 8, !tbaa !31
  br label %517

517:                                              ; preds = %512
  %518 = load i32, ptr %41, align 4, !tbaa !27
  %519 = add nsw i32 %518, 1
  store i32 %519, ptr %41, align 4, !tbaa !27
  br label %508, !llvm.loop !47

520:                                              ; preds = %508
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #4
  %521 = load ptr, ptr %24, align 8, !tbaa !5
  %522 = load ptr, ptr %24, align 8, !tbaa !5
  %523 = load ptr, ptr %25, align 8, !tbaa !5
  %524 = load ptr, ptr %20, align 8, !tbaa !5
  %525 = load i32, ptr %21, align 4, !tbaa !27
  %526 = load ptr, ptr %25, align 8, !tbaa !5
  %527 = call ptr @cpModSub_BNU(ptr noundef %521, ptr noundef %522, ptr noundef %523, ptr noundef %524, i32 noundef %525, ptr noundef %526)
  %528 = load ptr, ptr %23, align 8, !tbaa !5
  %529 = load ptr, ptr %23, align 8, !tbaa !5
  %530 = load ptr, ptr %19, align 8, !tbaa !5
  %531 = call ptr @gs_mont_inv(ptr noundef %528, ptr noundef %529, ptr noundef %530, ptr noundef @alm_mont_inv_ct)
  %532 = load ptr, ptr %19, align 8, !tbaa !5
  %533 = getelementptr inbounds %struct._gsModEngine, ptr %532, i32 0, i32 6
  %534 = load ptr, ptr %533, align 8, !tbaa !35
  %535 = getelementptr inbounds %struct._gsModMethod, ptr %534, i32 0, i32 2
  %536 = load ptr, ptr %535, align 8, !tbaa !45
  %537 = load ptr, ptr %23, align 8, !tbaa !5
  %538 = load ptr, ptr %23, align 8, !tbaa !5
  %539 = load ptr, ptr %24, align 8, !tbaa !5
  %540 = load ptr, ptr %19, align 8, !tbaa !5
  %541 = call ptr %536(ptr noundef %537, ptr noundef %538, ptr noundef %539, ptr noundef %540)
  %542 = load ptr, ptr %23, align 8, !tbaa !5
  %543 = load i32, ptr %21, align 4, !tbaa !27
  %544 = call i32 @cpGFpElementIsEquChunk(ptr noundef %542, i32 noundef %543, i64 noundef 0)
  %545 = icmp ne i32 %544, 0
  br i1 %545, label %565, label %546

546:                                              ; preds = %520
  %547 = load i32, ptr %21, align 4, !tbaa !27
  store i32 %547, ptr %35, align 4, !tbaa !27
  %548 = load ptr, ptr %22, align 8, !tbaa !5
  %549 = load i32, ptr %35, align 4, !tbaa !27
  %550 = call i32 @cpFix_BNU(ptr noundef %548, i32 noundef %549)
  store i32 %550, ptr %35, align 4, !tbaa !27
  %551 = load ptr, ptr %12, align 8, !tbaa !5
  %552 = getelementptr inbounds %struct._cpBigNum, ptr %551, i32 0, i32 1
  store i32 1, ptr %552, align 4, !tbaa !21
  %553 = load i32, ptr %35, align 4, !tbaa !27
  %554 = load ptr, ptr %12, align 8, !tbaa !5
  %555 = getelementptr inbounds %struct._cpBigNum, ptr %554, i32 0, i32 2
  store i32 %553, ptr %555, align 8, !tbaa !30
  %556 = load i32, ptr %21, align 4, !tbaa !27
  store i32 %556, ptr %35, align 4, !tbaa !27
  %557 = load ptr, ptr %23, align 8, !tbaa !5
  %558 = load i32, ptr %35, align 4, !tbaa !27
  %559 = call i32 @cpFix_BNU(ptr noundef %557, i32 noundef %558)
  store i32 %559, ptr %35, align 4, !tbaa !27
  %560 = load ptr, ptr %13, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct._cpBigNum, ptr %560, i32 0, i32 1
  store i32 1, ptr %561, align 4, !tbaa !21
  %562 = load i32, ptr %35, align 4, !tbaa !27
  %563 = load ptr, ptr %13, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct._cpBigNum, ptr %563, i32 0, i32 2
  store i32 %562, ptr %564, align 8, !tbaa !30
  store i32 0, ptr %33, align 4, !tbaa !27
  br label %565

565:                                              ; preds = %546, %520
  br label %566

566:                                              ; preds = %565, %434, %422
  store i32 0, ptr %18, align 4
  br label %567

567:                                              ; preds = %566, %343
  call void @llvm.lifetime.end.p0(i64 24, 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
  %568 = load i32, ptr %18, align 4
  switch i32 %568, label %573 [
    i32 0, label %569
  ]

569:                                              ; preds = %567
  %570 = load ptr, ptr %11, align 8, !tbaa !5
  %571 = call ptr @cpBN_zero(ptr noundef %570)
  %572 = load i32, ptr %33, align 4, !tbaa !27
  store i32 %572, ptr %8, align 4
  store i32 1, ptr %18, align 4
  br label %573

573:                                              ; preds = %569, %567
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #4
  br label %574

574:                                              ; preds = %573, %300, %257, %244
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 4, 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 4, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  br label %575

575:                                              ; preds = %574, %192, %186, %176, %170, %160, %156, %152, %142, %132, %122, %112, %108, %104, %96, %90, %80, %76, %64, %58, %48, %44
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  %576 = load i32, ptr %8, align 4
  ret i32 %576
}

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

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

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

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

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

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

declare i64 @cpInc_BNU(ptr noundef, ptr noundef, i32 noundef, i64 noundef) #3

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

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

declare ptr @gfec_MulBasePoint(ptr noundef, ptr noundef, i32 noundef, ptr noundef, ptr noundef) #3

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

declare i32 @gfec_GetPoint(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #3

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

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

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

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

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

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

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

declare ptr @gs_mont_inv(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #3

declare i32 @alm_mont_inv_ct(ptr noundef, ptr noundef, ptr noundef) #3

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @cpBN_zero(ptr noundef) #2

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 = { inlinehint 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 = { "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 #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, !11, i64 0}
!10 = !{!"_cpGFpEC", !11, i64 0, !11, i64 4, !6, i64 8, !11, i64 16, !11, i64 20, !11, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !11, i64 64, !11, i64 68, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128}
!11 = !{!"int", !7, i64 0}
!12 = !{!10, !11, i64 16}
!13 = !{!10, !6, i64 8}
!14 = !{!15, !6, i64 8}
!15 = !{!"_cpGFp", !11, i64 0, !11, i64 4, !6, i64 8}
!16 = !{!17, !11, i64 8}
!17 = !{!"_gsModEngine", !6, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !18, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !11, i64 96, !11, i64 100, !6, i64 104}
!18 = !{!"long long", !7, i64 0}
!19 = !{!20, !11, i64 0}
!20 = !{!"_cpBigNum", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !6, i64 16, !6, i64 24}
!21 = !{!20, !11, i64 4}
!22 = !{!10, !11, i64 24}
!23 = !{!20, !11, i64 12}
!24 = !{!10, !6, i64 80}
!25 = !{!17, !6, i64 48}
!26 = !{!17, !11, i64 16}
!27 = !{!11, !11, i64 0}
!28 = !{!20, !6, i64 16}
!29 = !{!20, !6, i64 24}
!30 = !{!20, !11, i64 8}
!31 = !{!18, !18, i64 0}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}
!35 = !{!17, !6, i64 32}
!36 = !{!37, !6, i64 8}
!37 = !{!"_gsModMethod", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80}
!38 = distinct !{!38, !33}
!39 = distinct !{!39, !33}
!40 = distinct !{!40, !33}
!41 = distinct !{!41, !33}
!42 = distinct !{!42, !33}
!43 = distinct !{!43, !33}
!44 = !{!37, !6, i64 0}
!45 = !{!37, !6, i64 16}
!46 = distinct !{!46, !33}
!47 = distinct !{!47, !33}


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

%struct._cpGFpECPoint = type { i32, i32, i32, ptr }

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1011, 1) i32 @ippsGFpECSignSM2(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6) local_unnamed_addr #0 {
  %8 = alloca %struct._cpGFpECPoint, align 8
  %9 = icmp eq ptr %5, null
  %10 = icmp eq ptr %6, null
  %or.cond = or i1 %9, %10
  br i1 %or.cond, label %342, label %11

11:                                               ; preds = %7
  %12 = load i32, ptr %5, align 8, !tbaa !5
  %13 = tail call i64 @IPP_UINT_PTR(ptr noundef nonnull %5)
  %14 = trunc i64 %13 to i32
  %15 = xor i32 %12, %14
  %16 = icmp eq i32 %15, 1129136461
  br i1 %16, label %17, label %342

17:                                               ; preds = %11
  %18 = getelementptr inbounds i8, ptr %5, i64 16
  %19 = load i32, ptr %18, align 8, !tbaa !11
  %.not = icmp eq i32 %19, 0
  br i1 %.not, label %342, label %20

20:                                               ; preds = %17
  %21 = getelementptr inbounds i8, ptr %5, i64 8
  %22 = load ptr, ptr %21, align 8, !tbaa !12
  %23 = getelementptr inbounds i8, ptr %22, i64 8
  %24 = load ptr, ptr %23, align 8, !tbaa !13
  %25 = getelementptr inbounds i8, ptr %24, i64 8
  %26 = load i32, ptr %25, align 8, !tbaa !15
  %27 = icmp sgt i32 %26, 1
  br i1 %27, label %342, label %28

28:                                               ; preds = %20
  %29 = icmp eq ptr %0, null
  br i1 %29, label %342, label %30

30:                                               ; preds = %28
  %31 = load i32, ptr %0, align 8, !tbaa !18
  %32 = tail call i64 @IPP_UINT_PTR(ptr noundef nonnull %0)
  %33 = trunc i64 %32 to i32
  %34 = xor i32 %31, %33
  %35 = icmp eq i32 %34, 1112098638
  br i1 %35, label %36, label %342

36:                                               ; preds = %30
  %37 = getelementptr inbounds i8, ptr %0, i64 4
  %38 = load i32, ptr %37, align 4, !tbaa !20
  %39 = icmp eq i32 %38, 0
  br i1 %39, label %342, label %40

40:                                               ; preds = %36
  %41 = getelementptr inbounds i8, ptr %5, i64 24
  %42 = load i32, ptr %41, align 8, !tbaa !21
  %43 = tail call i32 @cpBN_bitsize(ptr noundef nonnull %0)
  %44 = icmp slt i32 %42, %43
  br i1 %44, label %342, label %45

45:                                               ; preds = %40
  %46 = icmp eq ptr %4, null
  %47 = icmp eq ptr %3, null
  %or.cond243 = or i1 %47, %46
  br i1 %or.cond243, label %342, label %48

48:                                               ; preds = %45
  %49 = load i32, ptr %3, align 8, !tbaa !18
  %50 = tail call i64 @IPP_UINT_PTR(ptr noundef nonnull %3)
  %51 = trunc i64 %50 to i32
  %52 = xor i32 %49, %51
  %53 = icmp eq i32 %52, 1112098638
  br i1 %53, label %54, label %342

54:                                               ; preds = %48
  %55 = load i32, ptr %4, align 8, !tbaa !18
  %56 = tail call i64 @IPP_UINT_PTR(ptr noundef nonnull %4)
  %57 = trunc i64 %56 to i32
  %58 = xor i32 %55, %57
  %59 = icmp eq i32 %58, 1112098638
  br i1 %59, label %60, label %342

60:                                               ; preds = %54
  %61 = getelementptr inbounds i8, ptr %3, i64 12
  %62 = load i32, ptr %61, align 4, !tbaa !22
  %63 = shl nsw i32 %62, 6
  %64 = load i32, ptr %41, align 8, !tbaa !21
  %65 = icmp slt i32 %63, %64
  br i1 %65, label %342, label %66

66:                                               ; preds = %60
  %67 = getelementptr inbounds i8, ptr %4, i64 12
  %68 = load i32, ptr %67, align 4, !tbaa !22
  %69 = shl nsw i32 %68, 6
  %70 = icmp slt i32 %69, %64
  br i1 %70, label %342, label %71

71:                                               ; preds = %66
  %72 = icmp eq ptr %1, null
  %73 = icmp eq ptr %2, null
  %or.cond244 = or i1 %72, %73
  br i1 %or.cond244, label %342, label %74

74:                                               ; preds = %71
  %75 = load i32, ptr %1, align 8, !tbaa !18
  %76 = tail call i64 @IPP_UINT_PTR(ptr noundef nonnull %1)
  %77 = trunc i64 %76 to i32
  %78 = xor i32 %75, %77
  %79 = icmp eq i32 %78, 1112098638
  br i1 %79, label %80, label %342

80:                                               ; preds = %74
  %81 = getelementptr inbounds i8, ptr %1, i64 4
  %82 = load i32, ptr %81, align 4, !tbaa !20
  %83 = icmp eq i32 %82, 0
  br i1 %83, label %342, label %84

84:                                               ; preds = %80
  %85 = load i32, ptr %2, align 8, !tbaa !18
  %86 = tail call i64 @IPP_UINT_PTR(ptr noundef nonnull %2)
  %87 = trunc i64 %86 to i32
  %88 = xor i32 %85, %87
  %89 = icmp eq i32 %88, 1112098638
  br i1 %89, label %90, label %342

90:                                               ; preds = %84
  %91 = getelementptr inbounds i8, ptr %2, i64 4
  %92 = load i32, ptr %91, align 4, !tbaa !20
  %93 = icmp eq i32 %92, 0
  br i1 %93, label %342, label %94

94:                                               ; preds = %90
  %95 = getelementptr inbounds i8, ptr %5, i64 80
  %96 = load ptr, ptr %95, align 8, !tbaa !23
  %97 = getelementptr inbounds i8, ptr %96, i64 48
  %98 = load ptr, ptr %97, align 8, !tbaa !24
  %99 = getelementptr inbounds i8, ptr %96, i64 16
  %100 = load i32, ptr %99, align 8, !tbaa !25
  %101 = getelementptr inbounds i8, ptr %3, i64 16
  %102 = load ptr, ptr %101, align 8, !tbaa !26
  %103 = getelementptr inbounds i8, ptr %4, i64 16
  %104 = load ptr, ptr %103, align 8, !tbaa !26
  %105 = ptrtoint ptr %104 to i64
  %106 = getelementptr inbounds i8, ptr %3, i64 24
  %107 = load ptr, ptr %106, align 8, !tbaa !27
  %108 = ptrtoint ptr %107 to i64
  %109 = getelementptr inbounds i8, ptr %4, i64 24
  %110 = load ptr, ptr %109, align 8, !tbaa !27
  %111 = ptrtoint ptr %110 to i64
  %112 = getelementptr inbounds i8, ptr %1, i64 16
  %113 = load ptr, ptr %112, align 8, !tbaa !26
  %114 = ptrtoint ptr %113 to i64
  %115 = getelementptr inbounds i8, ptr %1, i64 8
  %116 = load i32, ptr %115, align 8, !tbaa !28
  %117 = getelementptr inbounds i8, ptr %2, i64 16
  %118 = load ptr, ptr %117, align 8, !tbaa !26
  %119 = ptrtoint ptr %118 to i64
  %120 = getelementptr inbounds i8, ptr %2, i64 8
  %121 = load i32, ptr %120, align 8, !tbaa !28
  %122 = getelementptr inbounds i8, ptr %0, i64 16
  %123 = load ptr, ptr %122, align 8, !tbaa !26
  %124 = ptrtoint ptr %123 to i64
  %125 = getelementptr inbounds i8, ptr %0, i64 8
  %126 = load i32, ptr %125, align 8, !tbaa !28
  %127 = tail call i32 @cpEqu_BNU_CHUNK(ptr noundef %113, i32 noundef %116, i64 noundef 0)
  %.not237 = icmp eq i32 %127, 0
  br i1 %.not237, label %128, label %342

128:                                              ; preds = %94
  %129 = tail call i32 @cpCmp_BNU(ptr noundef %113, i32 noundef %116, ptr noundef %98, i32 noundef %100)
  %130 = icmp sgt i32 %129, -1
  br i1 %130, label %342, label %131

131:                                              ; preds = %128
  %132 = tail call i32 @cpEqu_BNU_CHUNK(ptr noundef %118, i32 noundef %121, i64 noundef 0)
  %.not238 = icmp eq i32 %132, 0
  br i1 %.not238, label %133, label %342

133:                                              ; preds = %131
  %134 = tail call i32 @cpCmp_BNU(ptr noundef %118, i32 noundef %121, ptr noundef %98, i32 noundef %100)
  %135 = icmp sgt i32 %134, -1
  br i1 %135, label %342, label %.preheader251

.preheader251:                                    ; preds = %133
  %136 = icmp sgt i32 %116, 0
  br i1 %136, label %.lr.ph.preheader, label %.preheader250

.lr.ph.preheader:                                 ; preds = %.preheader251
  %wide.trip.count = zext nneg i32 %116 to i64
  %min.iters.check = icmp ult i32 %116, 6
  %137 = sub i64 %105, %114
  %diff.check = icmp ult i64 %137, 32
  %or.cond387 = select i1 %min.iters.check, i1 true, i1 %diff.check
  br i1 %or.cond387, label %.lr.ph.preheader396, label %vector.ph

.lr.ph.preheader396:                              ; preds = %middle.block, %.lr.ph.preheader
  %indvars.iv.ph = phi i64 [ 0, %.lr.ph.preheader ], [ %n.vec, %middle.block ]
  %xtraiter = and i64 %wide.trip.count, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph.prol.loopexit, label %.lr.ph.prol

.lr.ph.prol:                                      ; preds = %.lr.ph.preheader396, %.lr.ph.prol
  %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %.lr.ph.prol ], [ %indvars.iv.ph, %.lr.ph.preheader396 ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph.prol ], [ 0, %.lr.ph.preheader396 ]
  %138 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv.prol
  %139 = load i64, ptr %138, align 8, !tbaa !29
  %140 = getelementptr inbounds i64, ptr %104, i64 %indvars.iv.prol
  store i64 %139, ptr %140, align 8, !tbaa !29
  %indvars.iv.next.prol = add nuw nsw i64 %indvars.iv.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph.prol.loopexit, label %.lr.ph.prol, !llvm.loop !30

.lr.ph.prol.loopexit:                             ; preds = %.lr.ph.prol, %.lr.ph.preheader396
  %indvars.iv.unr = phi i64 [ %indvars.iv.ph, %.lr.ph.preheader396 ], [ %indvars.iv.next.prol, %.lr.ph.prol ]
  %141 = sub nsw i64 %indvars.iv.ph, %wide.trip.count
  %142 = icmp ugt i64 %141, -4
  br i1 %142, label %.preheader250, label %.lr.ph

vector.ph:                                        ; preds = %.lr.ph.preheader
  %n.vec = and i64 %wide.trip.count, 2147483644
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %143 = getelementptr inbounds i64, ptr %113, i64 %index
  %144 = getelementptr inbounds i8, ptr %143, i64 16
  %wide.load = load <2 x i64>, ptr %143, align 8, !tbaa !29
  %wide.load326 = load <2 x i64>, ptr %144, align 8, !tbaa !29
  %145 = getelementptr inbounds i64, ptr %104, i64 %index
  %146 = getelementptr inbounds i8, ptr %145, i64 16
  store <2 x i64> %wide.load, ptr %145, align 8, !tbaa !29
  store <2 x i64> %wide.load326, ptr %146, align 8, !tbaa !29
  %index.next = add nuw i64 %index, 4
  %147 = icmp eq i64 %index.next, %n.vec
  br i1 %147, label %middle.block, label %vector.body, !llvm.loop !32

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %.preheader250, label %.lr.ph.preheader396

.preheader250:                                    ; preds = %.lr.ph.prol.loopexit, %.lr.ph, %middle.block, %.preheader251
  %.0225.lcssa = phi i32 [ 0, %.preheader251 ], [ %116, %middle.block ], [ %116, %.lr.ph ], [ %116, %.lr.ph.prol.loopexit ]
  %148 = icmp slt i32 %.0225.lcssa, %100
  br i1 %148, label %.lr.ph254.preheader, label %._crit_edge

.lr.ph254.preheader:                              ; preds = %.preheader250
  %149 = zext nneg i32 %.0225.lcssa to i64
  %150 = shl nuw nsw i64 %149, 3
  %scevgep = getelementptr i8, ptr %104, i64 %150
  %151 = xor i32 %.0225.lcssa, -1
  %152 = add i32 %100, %151
  %153 = zext i32 %152 to i64
  %154 = shl nuw nsw i64 %153, 3
  %155 = add nuw nsw i64 %154, 8
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %scevgep, i8 0, i64 %155, i1 false), !tbaa !29
  br label %._crit_edge

.lr.ph:                                           ; preds = %.lr.ph.prol.loopexit, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next.3, %.lr.ph ], [ %indvars.iv.unr, %.lr.ph.prol.loopexit ]
  %156 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv
  %157 = load i64, ptr %156, align 8, !tbaa !29
  %158 = getelementptr inbounds i64, ptr %104, i64 %indvars.iv
  store i64 %157, ptr %158, align 8, !tbaa !29
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %159 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv.next
  %160 = load i64, ptr %159, align 8, !tbaa !29
  %161 = getelementptr inbounds i64, ptr %104, i64 %indvars.iv.next
  store i64 %160, ptr %161, align 8, !tbaa !29
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %162 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv.next.1
  %163 = load i64, ptr %162, align 8, !tbaa !29
  %164 = getelementptr inbounds i64, ptr %104, i64 %indvars.iv.next.1
  store i64 %163, ptr %164, align 8, !tbaa !29
  %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
  %165 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv.next.2
  %166 = load i64, ptr %165, align 8, !tbaa !29
  %167 = getelementptr inbounds i64, ptr %104, i64 %indvars.iv.next.2
  store i64 %166, ptr %167, align 8, !tbaa !29
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next.3, %wide.trip.count
  br i1 %exitcond.not.3, label %.preheader250, label %.lr.ph, !llvm.loop !36

._crit_edge:                                      ; preds = %.lr.ph254.preheader, %.preheader250
  %168 = tail call i64 @cpInc_BNU(ptr noundef %104, ptr noundef %104, i32 noundef %100, i64 noundef 1) #5
  %169 = tail call i32 @cpCmp_BNU(ptr noundef %104, i32 noundef %100, ptr noundef %98, i32 noundef %100)
  %170 = icmp eq i32 %169, 0
  br i1 %170, label %342, label %171

171:                                              ; preds = %._crit_edge
  %172 = getelementptr inbounds i8, ptr %24, i64 16
  %173 = load i32, ptr %172, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %8) #5
  %174 = tail call ptr @cpEcGFpGetPool(i32 noundef 1, ptr noundef nonnull %5)
  %175 = call ptr @cpEcGFpInitPoint(ptr noundef nonnull %8, ptr noundef %174, i32 noundef 0, ptr noundef nonnull %5)
  %176 = call ptr @gfec_MulBasePoint(ptr noundef nonnull %8, ptr noundef %118, i32 noundef %121, ptr noundef nonnull %5, ptr noundef nonnull %6) #5
  %177 = call ptr @gsModPoolAlloc(ptr noundef %24, i32 noundef 1)
  %.not239.not = icmp eq ptr %177, null
  br i1 %.not239.not, label %.critedge.thread, label %178

.critedge.thread:                                 ; preds = %171
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %8) #5
  br label %342

178:                                              ; preds = %171
  %179 = call i32 @gfec_GetPoint(ptr noundef nonnull %177, ptr noundef null, ptr noundef nonnull %8, ptr noundef nonnull %5) #5
  %180 = getelementptr inbounds i8, ptr %24, i64 32
  %181 = load ptr, ptr %180, align 8, !tbaa !37
  %182 = getelementptr inbounds i8, ptr %181, i64 8
  %183 = load ptr, ptr %182, align 8, !tbaa !38
  %184 = call ptr %183(ptr noundef nonnull %177, ptr noundef nonnull %177, ptr noundef nonnull %24) #5
  %185 = call i32 @cpMod_BNU(ptr noundef nonnull %177, i32 noundef %173, ptr noundef %98, i32 noundef %100)
  %186 = call ptr @cpGFpElementCopyPad(ptr noundef %102, i32 noundef %100, ptr noundef nonnull %177, i32 noundef %185)
  call void @gsModPoolFree(ptr noundef nonnull %24, i32 noundef 1)
  call void @cpEcGFpReleasePool(i32 noundef 1, ptr noundef nonnull %5)
  %187 = icmp sgt i32 %126, 0
  br i1 %187, label %.lr.ph257.preheader, label %.preheader249

.lr.ph257.preheader:                              ; preds = %178
  %wide.trip.count293 = zext nneg i32 %126 to i64
  %min.iters.check331 = icmp ult i32 %126, 6
  %188 = sub i64 %111, %124
  %diff.check328 = icmp ult i64 %188, 32
  %or.cond388 = select i1 %min.iters.check331, i1 true, i1 %diff.check328
  br i1 %or.cond388, label %.lr.ph257.preheader395, label %vector.ph332

.lr.ph257.preheader395:                           ; preds = %middle.block329, %.lr.ph257.preheader
  %indvars.iv290.ph = phi i64 [ 0, %.lr.ph257.preheader ], [ %n.vec334, %middle.block329 ]
  %xtraiter397 = and i64 %wide.trip.count293, 3
  %lcmp.mod398.not = icmp eq i64 %xtraiter397, 0
  br i1 %lcmp.mod398.not, label %.lr.ph257.prol.loopexit, label %.lr.ph257.prol

.lr.ph257.prol:                                   ; preds = %.lr.ph257.preheader395, %.lr.ph257.prol
  %indvars.iv290.prol = phi i64 [ %indvars.iv.next291.prol, %.lr.ph257.prol ], [ %indvars.iv290.ph, %.lr.ph257.preheader395 ]
  %prol.iter399 = phi i64 [ %prol.iter399.next, %.lr.ph257.prol ], [ 0, %.lr.ph257.preheader395 ]
  %189 = getelementptr inbounds i64, ptr %123, i64 %indvars.iv290.prol
  %190 = load i64, ptr %189, align 8, !tbaa !29
  %191 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv290.prol
  store i64 %190, ptr %191, align 8, !tbaa !29
  %indvars.iv.next291.prol = add nuw nsw i64 %indvars.iv290.prol, 1
  %prol.iter399.next = add i64 %prol.iter399, 1
  %prol.iter399.cmp.not = icmp eq i64 %prol.iter399.next, %xtraiter397
  br i1 %prol.iter399.cmp.not, label %.lr.ph257.prol.loopexit, label %.lr.ph257.prol, !llvm.loop !40

.lr.ph257.prol.loopexit:                          ; preds = %.lr.ph257.prol, %.lr.ph257.preheader395
  %indvars.iv290.unr = phi i64 [ %indvars.iv290.ph, %.lr.ph257.preheader395 ], [ %indvars.iv.next291.prol, %.lr.ph257.prol ]
  %192 = sub nsw i64 %indvars.iv290.ph, %wide.trip.count293
  %193 = icmp ugt i64 %192, -4
  br i1 %193, label %.preheader249, label %.lr.ph257

vector.ph332:                                     ; preds = %.lr.ph257.preheader
  %n.vec334 = and i64 %wide.trip.count293, 2147483644
  br label %vector.body336

vector.body336:                                   ; preds = %vector.body336, %vector.ph332
  %index337 = phi i64 [ 0, %vector.ph332 ], [ %index.next340, %vector.body336 ]
  %194 = getelementptr inbounds i64, ptr %123, i64 %index337
  %195 = getelementptr inbounds i8, ptr %194, i64 16
  %wide.load338 = load <2 x i64>, ptr %194, align 8, !tbaa !29
  %wide.load339 = load <2 x i64>, ptr %195, align 8, !tbaa !29
  %196 = getelementptr inbounds i64, ptr %110, i64 %index337
  %197 = getelementptr inbounds i8, ptr %196, i64 16
  store <2 x i64> %wide.load338, ptr %196, align 8, !tbaa !29
  store <2 x i64> %wide.load339, ptr %197, align 8, !tbaa !29
  %index.next340 = add nuw i64 %index337, 4
  %198 = icmp eq i64 %index.next340, %n.vec334
  br i1 %198, label %middle.block329, label %vector.body336, !llvm.loop !41

middle.block329:                                  ; preds = %vector.body336
  %cmp.n341 = icmp eq i64 %n.vec334, %wide.trip.count293
  br i1 %cmp.n341, label %.preheader249, label %.lr.ph257.preheader395

.preheader249:                                    ; preds = %.lr.ph257.prol.loopexit, %.lr.ph257, %middle.block329, %178
  %.0217.lcssa = phi i32 [ 0, %178 ], [ %126, %middle.block329 ], [ %126, %.lr.ph257 ], [ %126, %.lr.ph257.prol.loopexit ]
  %199 = icmp slt i32 %.0217.lcssa, %100
  br i1 %199, label %.lr.ph260.preheader, label %._crit_edge261

.lr.ph260.preheader:                              ; preds = %.preheader249
  %200 = zext nneg i32 %.0217.lcssa to i64
  %201 = shl nuw nsw i64 %200, 3
  %scevgep295 = getelementptr i8, ptr %110, i64 %201
  %202 = xor i32 %.0217.lcssa, -1
  %203 = add i32 %100, %202
  %204 = zext i32 %203 to i64
  %205 = shl nuw nsw i64 %204, 3
  %206 = add nuw nsw i64 %205, 8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %scevgep295, i8 0, i64 %206, i1 false), !tbaa !29
  br label %._crit_edge261

.lr.ph257:                                        ; preds = %.lr.ph257.prol.loopexit, %.lr.ph257
  %indvars.iv290 = phi i64 [ %indvars.iv.next291.3, %.lr.ph257 ], [ %indvars.iv290.unr, %.lr.ph257.prol.loopexit ]
  %207 = getelementptr inbounds i64, ptr %123, i64 %indvars.iv290
  %208 = load i64, ptr %207, align 8, !tbaa !29
  %209 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv290
  store i64 %208, ptr %209, align 8, !tbaa !29
  %indvars.iv.next291 = add nuw nsw i64 %indvars.iv290, 1
  %210 = getelementptr inbounds i64, ptr %123, i64 %indvars.iv.next291
  %211 = load i64, ptr %210, align 8, !tbaa !29
  %212 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv.next291
  store i64 %211, ptr %212, align 8, !tbaa !29
  %indvars.iv.next291.1 = add nuw nsw i64 %indvars.iv290, 2
  %213 = getelementptr inbounds i64, ptr %123, i64 %indvars.iv.next291.1
  %214 = load i64, ptr %213, align 8, !tbaa !29
  %215 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv.next291.1
  store i64 %214, ptr %215, align 8, !tbaa !29
  %indvars.iv.next291.2 = add nuw nsw i64 %indvars.iv290, 3
  %216 = getelementptr inbounds i64, ptr %123, i64 %indvars.iv.next291.2
  %217 = load i64, ptr %216, align 8, !tbaa !29
  %218 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv.next291.2
  store i64 %217, ptr %218, align 8, !tbaa !29
  %indvars.iv.next291.3 = add nuw nsw i64 %indvars.iv290, 4
  %exitcond294.not.3 = icmp eq i64 %indvars.iv.next291.3, %wide.trip.count293
  br i1 %exitcond294.not.3, label %.preheader249, label %.lr.ph257, !llvm.loop !42

._crit_edge261:                                   ; preds = %.lr.ph260.preheader, %.preheader249
  %219 = call ptr @cpModSub_BNU(ptr noundef %110, ptr noundef %110, ptr noundef %98, ptr noundef %98, i32 noundef %100, ptr noundef %107)
  %220 = call ptr @cpModAdd_BNU(ptr noundef %102, ptr noundef %102, ptr noundef %110, ptr noundef %98, i32 noundef %100, ptr noundef %107)
  %221 = icmp sgt i32 %121, 0
  br i1 %221, label %.lr.ph264.preheader, label %.preheader248

.lr.ph264.preheader:                              ; preds = %._crit_edge261
  %wide.trip.count302 = zext nneg i32 %121 to i64
  %min.iters.check346 = icmp ult i32 %121, 6
  %222 = sub i64 %108, %119
  %diff.check343 = icmp ult i64 %222, 32
  %or.cond389 = select i1 %min.iters.check346, i1 true, i1 %diff.check343
  br i1 %or.cond389, label %.lr.ph264.preheader394, label %vector.ph347

.lr.ph264.preheader394:                           ; preds = %middle.block344, %.lr.ph264.preheader
  %indvars.iv299.ph = phi i64 [ 0, %.lr.ph264.preheader ], [ %n.vec349, %middle.block344 ]
  %xtraiter400 = and i64 %wide.trip.count302, 3
  %lcmp.mod401.not = icmp eq i64 %xtraiter400, 0
  br i1 %lcmp.mod401.not, label %.lr.ph264.prol.loopexit, label %.lr.ph264.prol

.lr.ph264.prol:                                   ; preds = %.lr.ph264.preheader394, %.lr.ph264.prol
  %indvars.iv299.prol = phi i64 [ %indvars.iv.next300.prol, %.lr.ph264.prol ], [ %indvars.iv299.ph, %.lr.ph264.preheader394 ]
  %prol.iter402 = phi i64 [ %prol.iter402.next, %.lr.ph264.prol ], [ 0, %.lr.ph264.preheader394 ]
  %223 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv299.prol
  %224 = load i64, ptr %223, align 8, !tbaa !29
  %225 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv299.prol
  store i64 %224, ptr %225, align 8, !tbaa !29
  %indvars.iv.next300.prol = add nuw nsw i64 %indvars.iv299.prol, 1
  %prol.iter402.next = add i64 %prol.iter402, 1
  %prol.iter402.cmp.not = icmp eq i64 %prol.iter402.next, %xtraiter400
  br i1 %prol.iter402.cmp.not, label %.lr.ph264.prol.loopexit, label %.lr.ph264.prol, !llvm.loop !43

.lr.ph264.prol.loopexit:                          ; preds = %.lr.ph264.prol, %.lr.ph264.preheader394
  %indvars.iv299.unr = phi i64 [ %indvars.iv299.ph, %.lr.ph264.preheader394 ], [ %indvars.iv.next300.prol, %.lr.ph264.prol ]
  %226 = sub nsw i64 %indvars.iv299.ph, %wide.trip.count302
  %227 = icmp ugt i64 %226, -4
  br i1 %227, label %.preheader248, label %.lr.ph264

vector.ph347:                                     ; preds = %.lr.ph264.preheader
  %n.vec349 = and i64 %wide.trip.count302, 2147483644
  br label %vector.body351

vector.body351:                                   ; preds = %vector.body351, %vector.ph347
  %index352 = phi i64 [ 0, %vector.ph347 ], [ %index.next355, %vector.body351 ]
  %228 = getelementptr inbounds i64, ptr %118, i64 %index352
  %229 = getelementptr inbounds i8, ptr %228, i64 16
  %wide.load353 = load <2 x i64>, ptr %228, align 8, !tbaa !29
  %wide.load354 = load <2 x i64>, ptr %229, align 8, !tbaa !29
  %230 = getelementptr inbounds i64, ptr %107, i64 %index352
  %231 = getelementptr inbounds i8, ptr %230, i64 16
  store <2 x i64> %wide.load353, ptr %230, align 8, !tbaa !29
  store <2 x i64> %wide.load354, ptr %231, align 8, !tbaa !29
  %index.next355 = add nuw i64 %index352, 4
  %232 = icmp eq i64 %index.next355, %n.vec349
  br i1 %232, label %middle.block344, label %vector.body351, !llvm.loop !44

middle.block344:                                  ; preds = %vector.body351
  %cmp.n356 = icmp eq i64 %n.vec349, %wide.trip.count302
  br i1 %cmp.n356, label %.preheader248, label %.lr.ph264.preheader394

.preheader248:                                    ; preds = %.lr.ph264.prol.loopexit, %.lr.ph264, %middle.block344, %._crit_edge261
  %.0215.lcssa = phi i32 [ 0, %._crit_edge261 ], [ %121, %middle.block344 ], [ %121, %.lr.ph264 ], [ %121, %.lr.ph264.prol.loopexit ]
  %233 = icmp slt i32 %.0215.lcssa, %100
  br i1 %233, label %.lr.ph267.preheader, label %._crit_edge268

.lr.ph267.preheader:                              ; preds = %.preheader248
  %234 = zext nneg i32 %.0215.lcssa to i64
  %235 = shl nuw nsw i64 %234, 3
  %scevgep304 = getelementptr i8, ptr %107, i64 %235
  %236 = xor i32 %.0215.lcssa, -1
  %237 = add i32 %100, %236
  %238 = zext i32 %237 to i64
  %239 = shl nuw nsw i64 %238, 3
  %240 = add nuw nsw i64 %239, 8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %scevgep304, i8 0, i64 %240, i1 false), !tbaa !29
  br label %._crit_edge268

.lr.ph264:                                        ; preds = %.lr.ph264.prol.loopexit, %.lr.ph264
  %indvars.iv299 = phi i64 [ %indvars.iv.next300.3, %.lr.ph264 ], [ %indvars.iv299.unr, %.lr.ph264.prol.loopexit ]
  %241 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv299
  %242 = load i64, ptr %241, align 8, !tbaa !29
  %243 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv299
  store i64 %242, ptr %243, align 8, !tbaa !29
  %indvars.iv.next300 = add nuw nsw i64 %indvars.iv299, 1
  %244 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv.next300
  %245 = load i64, ptr %244, align 8, !tbaa !29
  %246 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv.next300
  store i64 %245, ptr %246, align 8, !tbaa !29
  %indvars.iv.next300.1 = add nuw nsw i64 %indvars.iv299, 2
  %247 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv.next300.1
  %248 = load i64, ptr %247, align 8, !tbaa !29
  %249 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv.next300.1
  store i64 %248, ptr %249, align 8, !tbaa !29
  %indvars.iv.next300.2 = add nuw nsw i64 %indvars.iv299, 3
  %250 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv.next300.2
  %251 = load i64, ptr %250, align 8, !tbaa !29
  %252 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv.next300.2
  store i64 %251, ptr %252, align 8, !tbaa !29
  %indvars.iv.next300.3 = add nuw nsw i64 %indvars.iv299, 4
  %exitcond303.not.3 = icmp eq i64 %indvars.iv.next300.3, %wide.trip.count302
  br i1 %exitcond303.not.3, label %.preheader248, label %.lr.ph264, !llvm.loop !45

._crit_edge268:                                   ; preds = %.lr.ph267.preheader, %.preheader248
  %253 = call ptr @cpModAdd_BNU(ptr noundef %107, ptr noundef %107, ptr noundef %102, ptr noundef %98, i32 noundef %100, ptr noundef %110)
  %254 = call i32 @cpGFpElementIsEquChunk(ptr noundef %102, i32 noundef %100, i64 noundef 0)
  %.not240 = icmp eq i32 %254, 0
  br i1 %.not240, label %255, label %.critedge

255:                                              ; preds = %._crit_edge268
  %256 = call i32 @cpGFpElementIsEquChunk(ptr noundef %107, i32 noundef %100, i64 noundef 0)
  %.not241 = icmp eq i32 %256, 0
  br i1 %.not241, label %.preheader247, label %.critedge

.preheader247:                                    ; preds = %255
  br i1 %136, label %.lr.ph270.preheader, label %.preheader246

.lr.ph270.preheader:                              ; preds = %.preheader247
  %wide.trip.count311 = zext nneg i32 %116 to i64
  %min.iters.check361 = icmp ult i32 %116, 6
  %257 = sub i64 %111, %114
  %diff.check358 = icmp ult i64 %257, 32
  %or.cond390 = select i1 %min.iters.check361, i1 true, i1 %diff.check358
  br i1 %or.cond390, label %.lr.ph270.preheader393, label %vector.ph362

.lr.ph270.preheader393:                           ; preds = %middle.block359, %.lr.ph270.preheader
  %indvars.iv308.ph = phi i64 [ 0, %.lr.ph270.preheader ], [ %n.vec364, %middle.block359 ]
  %xtraiter403 = and i64 %wide.trip.count311, 3
  %lcmp.mod404.not = icmp eq i64 %xtraiter403, 0
  br i1 %lcmp.mod404.not, label %.lr.ph270.prol.loopexit, label %.lr.ph270.prol

.lr.ph270.prol:                                   ; preds = %.lr.ph270.preheader393, %.lr.ph270.prol
  %indvars.iv308.prol = phi i64 [ %indvars.iv.next309.prol, %.lr.ph270.prol ], [ %indvars.iv308.ph, %.lr.ph270.preheader393 ]
  %prol.iter405 = phi i64 [ %prol.iter405.next, %.lr.ph270.prol ], [ 0, %.lr.ph270.preheader393 ]
  %258 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv308.prol
  %259 = load i64, ptr %258, align 8, !tbaa !29
  %260 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv308.prol
  store i64 %259, ptr %260, align 8, !tbaa !29
  %indvars.iv.next309.prol = add nuw nsw i64 %indvars.iv308.prol, 1
  %prol.iter405.next = add i64 %prol.iter405, 1
  %prol.iter405.cmp.not = icmp eq i64 %prol.iter405.next, %xtraiter403
  br i1 %prol.iter405.cmp.not, label %.lr.ph270.prol.loopexit, label %.lr.ph270.prol, !llvm.loop !46

.lr.ph270.prol.loopexit:                          ; preds = %.lr.ph270.prol, %.lr.ph270.preheader393
  %indvars.iv308.unr = phi i64 [ %indvars.iv308.ph, %.lr.ph270.preheader393 ], [ %indvars.iv.next309.prol, %.lr.ph270.prol ]
  %261 = sub nsw i64 %indvars.iv308.ph, %wide.trip.count311
  %262 = icmp ugt i64 %261, -4
  br i1 %262, label %.preheader246, label %.lr.ph270

vector.ph362:                                     ; preds = %.lr.ph270.preheader
  %n.vec364 = and i64 %wide.trip.count311, 2147483644
  br label %vector.body366

vector.body366:                                   ; preds = %vector.body366, %vector.ph362
  %index367 = phi i64 [ 0, %vector.ph362 ], [ %index.next370, %vector.body366 ]
  %263 = getelementptr inbounds i64, ptr %113, i64 %index367
  %264 = getelementptr inbounds i8, ptr %263, i64 16
  %wide.load368 = load <2 x i64>, ptr %263, align 8, !tbaa !29
  %wide.load369 = load <2 x i64>, ptr %264, align 8, !tbaa !29
  %265 = getelementptr inbounds i64, ptr %110, i64 %index367
  %266 = getelementptr inbounds i8, ptr %265, i64 16
  store <2 x i64> %wide.load368, ptr %265, align 8, !tbaa !29
  store <2 x i64> %wide.load369, ptr %266, align 8, !tbaa !29
  %index.next370 = add nuw i64 %index367, 4
  %267 = icmp eq i64 %index.next370, %n.vec364
  br i1 %267, label %middle.block359, label %vector.body366, !llvm.loop !47

middle.block359:                                  ; preds = %vector.body366
  %cmp.n371 = icmp eq i64 %n.vec364, %wide.trip.count311
  br i1 %cmp.n371, label %.preheader246, label %.lr.ph270.preheader393

.preheader246:                                    ; preds = %.lr.ph270.prol.loopexit, %.lr.ph270, %middle.block359, %.preheader247
  %.0213.lcssa = phi i32 [ 0, %.preheader247 ], [ %116, %middle.block359 ], [ %116, %.lr.ph270 ], [ %116, %.lr.ph270.prol.loopexit ]
  %268 = icmp slt i32 %.0213.lcssa, %100
  br i1 %268, label %.lr.ph273.preheader, label %._crit_edge274

.lr.ph273.preheader:                              ; preds = %.preheader246
  %269 = zext nneg i32 %.0213.lcssa to i64
  %270 = shl nuw nsw i64 %269, 3
  %scevgep313 = getelementptr i8, ptr %110, i64 %270
  %271 = xor i32 %.0213.lcssa, -1
  %272 = add i32 %100, %271
  %273 = zext i32 %272 to i64
  %274 = shl nuw nsw i64 %273, 3
  %275 = add nuw nsw i64 %274, 8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %scevgep313, i8 0, i64 %275, i1 false), !tbaa !29
  br label %._crit_edge274

.lr.ph270:                                        ; preds = %.lr.ph270.prol.loopexit, %.lr.ph270
  %indvars.iv308 = phi i64 [ %indvars.iv.next309.3, %.lr.ph270 ], [ %indvars.iv308.unr, %.lr.ph270.prol.loopexit ]
  %276 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv308
  %277 = load i64, ptr %276, align 8, !tbaa !29
  %278 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv308
  store i64 %277, ptr %278, align 8, !tbaa !29
  %indvars.iv.next309 = add nuw nsw i64 %indvars.iv308, 1
  %279 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv.next309
  %280 = load i64, ptr %279, align 8, !tbaa !29
  %281 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv.next309
  store i64 %280, ptr %281, align 8, !tbaa !29
  %indvars.iv.next309.1 = add nuw nsw i64 %indvars.iv308, 2
  %282 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv.next309.1
  %283 = load i64, ptr %282, align 8, !tbaa !29
  %284 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv.next309.1
  store i64 %283, ptr %284, align 8, !tbaa !29
  %indvars.iv.next309.2 = add nuw nsw i64 %indvars.iv308, 3
  %285 = getelementptr inbounds i64, ptr %113, i64 %indvars.iv.next309.2
  %286 = load i64, ptr %285, align 8, !tbaa !29
  %287 = getelementptr inbounds i64, ptr %110, i64 %indvars.iv.next309.2
  store i64 %286, ptr %287, align 8, !tbaa !29
  %indvars.iv.next309.3 = add nuw nsw i64 %indvars.iv308, 4
  %exitcond312.not.3 = icmp eq i64 %indvars.iv.next309.3, %wide.trip.count311
  br i1 %exitcond312.not.3, label %.preheader246, label %.lr.ph270, !llvm.loop !48

._crit_edge274:                                   ; preds = %.lr.ph273.preheader, %.preheader246
  %288 = getelementptr inbounds i8, ptr %96, i64 32
  %289 = load ptr, ptr %288, align 8, !tbaa !37
  %290 = load ptr, ptr %289, align 8, !tbaa !49
  %291 = call ptr %290(ptr noundef %110, ptr noundef %110, ptr noundef %96) #5
  %292 = load ptr, ptr %288, align 8, !tbaa !37
  %293 = getelementptr inbounds i8, ptr %292, i64 16
  %294 = load ptr, ptr %293, align 8, !tbaa !50
  %295 = call ptr %294(ptr noundef %110, ptr noundef %110, ptr noundef %102, ptr noundef %96) #5
  br i1 %221, label %.lr.ph277.preheader, label %.preheader

.lr.ph277.preheader:                              ; preds = %._crit_edge274
  %wide.trip.count320 = zext nneg i32 %121 to i64
  %min.iters.check376 = icmp ult i32 %121, 6
  %296 = sub i64 %108, %119
  %diff.check373 = icmp ult i64 %296, 32
  %or.cond391 = select i1 %min.iters.check376, i1 true, i1 %diff.check373
  br i1 %or.cond391, label %.lr.ph277.preheader392, label %vector.ph377

.lr.ph277.preheader392:                           ; preds = %middle.block374, %.lr.ph277.preheader
  %indvars.iv317.ph = phi i64 [ 0, %.lr.ph277.preheader ], [ %n.vec379, %middle.block374 ]
  %xtraiter406 = and i64 %wide.trip.count320, 3
  %lcmp.mod407.not = icmp eq i64 %xtraiter406, 0
  br i1 %lcmp.mod407.not, label %.lr.ph277.prol.loopexit, label %.lr.ph277.prol

.lr.ph277.prol:                                   ; preds = %.lr.ph277.preheader392, %.lr.ph277.prol
  %indvars.iv317.prol = phi i64 [ %indvars.iv.next318.prol, %.lr.ph277.prol ], [ %indvars.iv317.ph, %.lr.ph277.preheader392 ]
  %prol.iter408 = phi i64 [ %prol.iter408.next, %.lr.ph277.prol ], [ 0, %.lr.ph277.preheader392 ]
  %297 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv317.prol
  %298 = load i64, ptr %297, align 8, !tbaa !29
  %299 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv317.prol
  store i64 %298, ptr %299, align 8, !tbaa !29
  %indvars.iv.next318.prol = add nuw nsw i64 %indvars.iv317.prol, 1
  %prol.iter408.next = add i64 %prol.iter408, 1
  %prol.iter408.cmp.not = icmp eq i64 %prol.iter408.next, %xtraiter406
  br i1 %prol.iter408.cmp.not, label %.lr.ph277.prol.loopexit, label %.lr.ph277.prol, !llvm.loop !51

.lr.ph277.prol.loopexit:                          ; preds = %.lr.ph277.prol, %.lr.ph277.preheader392
  %indvars.iv317.unr = phi i64 [ %indvars.iv317.ph, %.lr.ph277.preheader392 ], [ %indvars.iv.next318.prol, %.lr.ph277.prol ]
  %300 = sub nsw i64 %indvars.iv317.ph, %wide.trip.count320
  %301 = icmp ugt i64 %300, -4
  br i1 %301, label %.preheader, label %.lr.ph277

vector.ph377:                                     ; preds = %.lr.ph277.preheader
  %n.vec379 = and i64 %wide.trip.count320, 2147483644
  br label %vector.body381

vector.body381:                                   ; preds = %vector.body381, %vector.ph377
  %index382 = phi i64 [ 0, %vector.ph377 ], [ %index.next385, %vector.body381 ]
  %302 = getelementptr inbounds i64, ptr %118, i64 %index382
  %303 = getelementptr inbounds i8, ptr %302, i64 16
  %wide.load383 = load <2 x i64>, ptr %302, align 8, !tbaa !29
  %wide.load384 = load <2 x i64>, ptr %303, align 8, !tbaa !29
  %304 = getelementptr inbounds i64, ptr %107, i64 %index382
  %305 = getelementptr inbounds i8, ptr %304, i64 16
  store <2 x i64> %wide.load383, ptr %304, align 8, !tbaa !29
  store <2 x i64> %wide.load384, ptr %305, align 8, !tbaa !29
  %index.next385 = add nuw i64 %index382, 4
  %306 = icmp eq i64 %index.next385, %n.vec379
  br i1 %306, label %middle.block374, label %vector.body381, !llvm.loop !52

middle.block374:                                  ; preds = %vector.body381
  %cmp.n386 = icmp eq i64 %n.vec379, %wide.trip.count320
  br i1 %cmp.n386, label %.preheader, label %.lr.ph277.preheader392

.preheader:                                       ; preds = %.lr.ph277.prol.loopexit, %.lr.ph277, %middle.block374, %._crit_edge274
  %.0.lcssa = phi i32 [ 0, %._crit_edge274 ], [ %121, %middle.block374 ], [ %121, %.lr.ph277 ], [ %121, %.lr.ph277.prol.loopexit ]
  %307 = icmp slt i32 %.0.lcssa, %100
  br i1 %307, label %.lr.ph280.preheader, label %._crit_edge281

.lr.ph280.preheader:                              ; preds = %.preheader
  %308 = zext nneg i32 %.0.lcssa to i64
  %309 = shl nuw nsw i64 %308, 3
  %scevgep322 = getelementptr i8, ptr %107, i64 %309
  %310 = xor i32 %.0.lcssa, -1
  %311 = add i32 %100, %310
  %312 = zext i32 %311 to i64
  %313 = shl nuw nsw i64 %312, 3
  %314 = add nuw nsw i64 %313, 8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %scevgep322, i8 0, i64 %314, i1 false), !tbaa !29
  br label %._crit_edge281

.lr.ph277:                                        ; preds = %.lr.ph277.prol.loopexit, %.lr.ph277
  %indvars.iv317 = phi i64 [ %indvars.iv.next318.3, %.lr.ph277 ], [ %indvars.iv317.unr, %.lr.ph277.prol.loopexit ]
  %315 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv317
  %316 = load i64, ptr %315, align 8, !tbaa !29
  %317 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv317
  store i64 %316, ptr %317, align 8, !tbaa !29
  %indvars.iv.next318 = add nuw nsw i64 %indvars.iv317, 1
  %318 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv.next318
  %319 = load i64, ptr %318, align 8, !tbaa !29
  %320 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv.next318
  store i64 %319, ptr %320, align 8, !tbaa !29
  %indvars.iv.next318.1 = add nuw nsw i64 %indvars.iv317, 2
  %321 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv.next318.1
  %322 = load i64, ptr %321, align 8, !tbaa !29
  %323 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv.next318.1
  store i64 %322, ptr %323, align 8, !tbaa !29
  %indvars.iv.next318.2 = add nuw nsw i64 %indvars.iv317, 3
  %324 = getelementptr inbounds i64, ptr %118, i64 %indvars.iv.next318.2
  %325 = load i64, ptr %324, align 8, !tbaa !29
  %326 = getelementptr inbounds i64, ptr %107, i64 %indvars.iv.next318.2
  store i64 %325, ptr %326, align 8, !tbaa !29
  %indvars.iv.next318.3 = add nuw nsw i64 %indvars.iv317, 4
  %exitcond321.not.3 = icmp eq i64 %indvars.iv.next318.3, %wide.trip.count320
  br i1 %exitcond321.not.3, label %.preheader, label %.lr.ph277, !llvm.loop !53

._crit_edge281:                                   ; preds = %.lr.ph280.preheader, %.preheader
  %327 = call ptr @cpModSub_BNU(ptr noundef %107, ptr noundef %107, ptr noundef %110, ptr noundef %98, i32 noundef %100, ptr noundef %110)
  %328 = call ptr @gs_mont_inv(ptr noundef %104, ptr noundef %104, ptr noundef %96, ptr noundef nonnull @alm_mont_inv_ct) #5
  %329 = load ptr, ptr %288, align 8, !tbaa !37
  %330 = getelementptr inbounds i8, ptr %329, i64 16
  %331 = load ptr, ptr %330, align 8, !tbaa !50
  %332 = call ptr %331(ptr noundef %104, ptr noundef %104, ptr noundef %107, ptr noundef %96) #5
  %333 = call i32 @cpGFpElementIsEquChunk(ptr noundef %104, i32 noundef %100, i64 noundef 0)
  %.not242 = icmp eq i32 %333, 0
  br i1 %.not242, label %334, label %.critedge

334:                                              ; preds = %._crit_edge281
  %335 = call i32 @cpFix_BNU(ptr noundef %102, i32 noundef %100)
  %336 = getelementptr inbounds i8, ptr %3, i64 4
  store i32 1, ptr %336, align 4, !tbaa !20
  %337 = getelementptr inbounds i8, ptr %3, i64 8
  store i32 %335, ptr %337, align 8, !tbaa !28
  %338 = call i32 @cpFix_BNU(ptr noundef %104, i32 noundef %100)
  %339 = getelementptr inbounds i8, ptr %4, i64 4
  store i32 1, ptr %339, align 4, !tbaa !20
  %340 = getelementptr inbounds i8, ptr %4, i64 8
  store i32 %338, ptr %340, align 8, !tbaa !28
  br label %.critedge

.critedge:                                        ; preds = %._crit_edge268, %255, %334, %._crit_edge281
  %.1224 = phi i32 [ -1011, %._crit_edge268 ], [ -1011, %255 ], [ -1011, %._crit_edge281 ], [ 0, %334 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %8) #5
  %341 = call ptr @cpBN_zero(ptr noundef nonnull %2)
  br label %342

342:                                              ; preds = %.critedge.thread, %128, %94, %133, %131, %._crit_edge, %.critedge, %90, %84, %80, %74, %71, %66, %60, %54, %48, %45, %40, %36, %30, %28, %20, %17, %11, %7
  %.3 = phi i32 [ -8, %7 ], [ -13, %11 ], [ -13, %17 ], [ -14, %20 ], [ -8, %28 ], [ -13, %30 ], [ -1010, %36 ], [ -1010, %40 ], [ -8, %45 ], [ -13, %48 ], [ -13, %54 ], [ -7, %60 ], [ -7, %66 ], [ -8, %71 ], [ -13, %74 ], [ -1008, %80 ], [ -13, %84 ], [ -1011, %90 ], [ -1008, %128 ], [ -1008, %94 ], [ -1011, %133 ], [ -1011, %131 ], [ -1008, %._crit_edge ], [ %.1224, %.critedge ], [ -8, %.critedge.thread ]
  ret i32 %.3
}

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

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

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

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

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

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

declare i64 @cpInc_BNU(ptr noundef, ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #3

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

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

declare ptr @gfec_MulBasePoint(ptr noundef, ptr noundef, i32 noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

declare i32 @gfec_GetPoint(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

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

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

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

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

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

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

declare ptr @gs_mont_inv(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

declare i32 @alm_mont_inv_ct(ptr noundef, ptr noundef, ptr noundef) #3

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

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, 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 = { inlinehint 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 = { "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 #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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 0}
!6 = !{!"_cpGFpEC", !7, i64 0, !7, i64 4, !10, i64 8, !7, i64 16, !7, i64 20, !7, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !7, i64 64, !7, i64 68, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!6, !7, i64 16}
!12 = !{!6, !10, i64 8}
!13 = !{!14, !10, i64 8}
!14 = !{!"_cpGFp", !7, i64 0, !7, i64 4, !10, i64 8}
!15 = !{!16, !7, i64 8}
!16 = !{!"_gsModEngine", !10, i64 0, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !17, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !7, i64 96, !7, i64 100, !10, i64 104}
!17 = !{!"long long", !8, i64 0}
!18 = !{!19, !7, i64 0}
!19 = !{!"_cpBigNum", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !10, i64 16, !10, i64 24}
!20 = !{!19, !7, i64 4}
!21 = !{!6, !7, i64 24}
!22 = !{!19, !7, i64 12}
!23 = !{!6, !10, i64 80}
!24 = !{!16, !10, i64 48}
!25 = !{!16, !7, i64 16}
!26 = !{!19, !10, i64 16}
!27 = !{!19, !10, i64 24}
!28 = !{!19, !7, i64 8}
!29 = !{!17, !17, i64 0}
!30 = distinct !{!30, !31}
!31 = !{!"llvm.loop.unroll.disable"}
!32 = distinct !{!32, !33, !34, !35}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{!"llvm.loop.isvectorized", i32 1}
!35 = !{!"llvm.loop.unroll.runtime.disable"}
!36 = distinct !{!36, !33, !34}
!37 = !{!16, !10, i64 32}
!38 = !{!39, !10, i64 8}
!39 = !{!"_gsModMethod", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80}
!40 = distinct !{!40, !31}
!41 = distinct !{!41, !33, !34, !35}
!42 = distinct !{!42, !33, !34}
!43 = distinct !{!43, !31}
!44 = distinct !{!44, !33, !34, !35}
!45 = distinct !{!45, !33, !34}
!46 = distinct !{!46, !31}
!47 = distinct !{!47, !33, !34, !35}
!48 = distinct !{!48, !33, !34}
!49 = !{!39, !10, i64 0}
!50 = !{!39, !10, i64 16}
!51 = distinct !{!51, !31}
!52 = distinct !{!52, !33, !34, !35}
!53 = distinct !{!53, !33, !34}


; Effective O3 passes: ConstraintEliminationPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LoopIdiomRecognizePass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass