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

; 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._cpDLP = type { i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct._cpBigNum = type { i32, i32, i32, i32, ptr, ptr }

; Function Attrs: nounwind uwtable
define dso_local i32 @ippsDLPGenerateDSA(ptr noundef %0, i32 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 i32, align 4
  %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 ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca i32, align 4
  %34 = alloca ptr, align 8
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca [20 x i8], align 16
  %38 = alloca [20 x i8], align 16
  %39 = alloca [48 x i8], align 16
  %40 = alloca ptr, align 8
  %41 = alloca i32, align 4
  %42 = alloca i64, align 8
  %43 = alloca i32, align 4
  %44 = alloca i32, align 4
  store ptr %0, ptr %9, align 8, !tbaa !5
  store i32 %1, ptr %10, align 4, !tbaa !9
  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
  %45 = load ptr, ptr %11, align 8, !tbaa !5
  %46 = icmp eq ptr null, %45
  br i1 %46, label %47, label %48

47:                                               ; preds = %7
  store i32 -8, ptr %8, align 4
  br label %573

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

57:                                               ; preds = %48
  store i32 -13, ptr %8, align 4
  br label %573

58:                                               ; preds = %48
  %59 = load ptr, ptr %11, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct._cpDLP, ptr %59, i32 0, i32 3
  %61 = load i32, ptr %60, align 4, !tbaa !13
  %62 = icmp ne i32 160, %61
  br i1 %62, label %63, label %64

63:                                               ; preds = %58
  store i32 -6, ptr %8, align 4
  br label %573

64:                                               ; preds = %58
  %65 = load ptr, ptr %11, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct._cpDLP, ptr %65, i32 0, i32 2
  %67 = load i32, ptr %66, align 8, !tbaa !14
  %68 = icmp sgt i32 512, %67
  br i1 %68, label %69, label %70

69:                                               ; preds = %64
  store i32 -6, ptr %8, align 4
  br label %573

70:                                               ; preds = %64
  %71 = load ptr, ptr %11, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct._cpDLP, ptr %71, i32 0, i32 2
  %73 = load i32, ptr %72, align 8, !tbaa !14
  %74 = icmp slt i32 1024, %73
  br i1 %74, label %75, label %76

75:                                               ; preds = %70
  store i32 -6, ptr %8, align 4
  br label %573

76:                                               ; preds = %70
  %77 = load ptr, ptr %11, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct._cpDLP, ptr %77, i32 0, i32 2
  %79 = load i32, ptr %78, align 8, !tbaa !14
  %80 = srem i32 %79, 64
  %81 = icmp ne i32 %80, 0
  br i1 %81, label %82, label %83

82:                                               ; preds = %76
  store i32 -6, ptr %8, align 4
  br label %573

83:                                               ; preds = %76
  %84 = load i32, ptr %10, align 4, !tbaa !9
  %85 = icmp sle i32 %84, 0
  br i1 %85, label %86, label %87

86:                                               ; preds = %83
  store i32 -5, ptr %8, align 4
  br label %573

87:                                               ; preds = %83
  %88 = load ptr, ptr %14, align 8, !tbaa !5
  %89 = icmp eq ptr null, %88
  br i1 %89, label %90, label %91

90:                                               ; preds = %87
  store i32 -8, ptr %8, align 4
  br label %573

91:                                               ; preds = %87
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  %92 = load ptr, ptr %11, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct._cpDLP, ptr %92, i32 0, i32 13
  %94 = load ptr, ptr %93, align 8, !tbaa !15
  store ptr %94, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %95 = call ptr @cpBigNumListGet(ptr noundef %16)
  %96 = call ptr @cpBN_zero(ptr noundef %95)
  store ptr %96, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %97 = call ptr @cpBigNumListGet(ptr noundef %16)
  %98 = call ptr @cpBN_zero(ptr noundef %97)
  store ptr %98, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %99 = call ptr @cpBigNumListGet(ptr noundef %16)
  %100 = call ptr @cpBN_zero(ptr noundef %99)
  store ptr %100, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %101 = call ptr @cpBigNumListGet(ptr noundef %16)
  %102 = call ptr @cpBN_zero(ptr noundef %101)
  store ptr %102, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  %103 = call ptr @cpBigNumListGet(ptr noundef %16)
  %104 = call ptr @cpBN_zero(ptr noundef %103)
  store ptr %104, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %105 = call ptr @cpBigNumListGet(ptr noundef %16)
  %106 = call ptr @cpBN_zero(ptr noundef %105)
  store ptr %106, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  %107 = call ptr @cpBigNumListGet(ptr noundef %16)
  store ptr %107, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  store i32 160, ptr %24, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  store i32 1, ptr %25, align 4, !tbaa !9
  %108 = load ptr, ptr %11, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct._cpDLP, ptr %108, i32 0, i32 1
  store i32 0, ptr %109, align 4, !tbaa !16
  %110 = load ptr, ptr %9, align 8, !tbaa !5
  %111 = icmp ne ptr %110, null
  br i1 %111, label %112, label %153

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

121:                                              ; preds = %112
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %572

122:                                              ; preds = %112
  %123 = load ptr, ptr %9, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct._cpBigNum, ptr %123, i32 0, i32 2
  %125 = load i32, ptr %124, align 8, !tbaa !19
  %126 = mul nsw i32 %125, 64
  %127 = load ptr, ptr %9, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct._cpBigNum, ptr %127, i32 0, i32 4
  %129 = load ptr, ptr %128, align 8, !tbaa !20
  %130 = load ptr, ptr %9, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct._cpBigNum, ptr %130, i32 0, i32 2
  %132 = load i32, ptr %131, align 8, !tbaa !19
  %133 = sub nsw i32 %132, 1
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds i64, ptr %129, i64 %134
  %136 = load i64, ptr %135, align 8, !tbaa !21
  %137 = call i32 @cpNLZ_BNU(i64 noundef %136)
  %138 = sub nsw i32 %126, %137
  store i32 %138, ptr %24, align 4, !tbaa !9
  %139 = load i32, ptr %24, align 4, !tbaa !9
  %140 = icmp slt i32 %139, 160
  br i1 %140, label %141, label %142

141:                                              ; preds = %122
  store i32 160, ptr %24, align 4, !tbaa !9
  br label %142

142:                                              ; preds = %141, %122
  %143 = load ptr, ptr %11, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct._cpDLP, ptr %143, i32 0, i32 2
  %145 = load i32, ptr %144, align 8, !tbaa !14
  %146 = load i32, ptr %24, align 4, !tbaa !9
  %147 = icmp slt i32 %145, %146
  br i1 %147, label %148, label %149

148:                                              ; preds = %142
  store i32 -7, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %572

149:                                              ; preds = %142
  %150 = load ptr, ptr %23, align 8, !tbaa !5
  %151 = load ptr, ptr %9, align 8, !tbaa !5
  %152 = call ptr @cpBN_copy(ptr noundef %150, ptr noundef %151)
  store i32 0, ptr %25, align 4, !tbaa !9
  br label %153

153:                                              ; preds = %149, %91
  %154 = load ptr, ptr %12, align 8, !tbaa !5
  %155 = icmp ne ptr %154, null
  br i1 %155, label %156, label %175

156:                                              ; preds = %153
  %157 = load ptr, ptr %12, align 8, !tbaa !5
  %158 = getelementptr inbounds %struct._cpBigNum, ptr %157, i32 0, i32 0
  %159 = load i32, ptr %158, align 8, !tbaa !17
  %160 = load ptr, ptr %12, align 8, !tbaa !5
  %161 = call i64 @IPP_UINT_PTR(ptr noundef %160)
  %162 = trunc i64 %161 to i32
  %163 = xor i32 %159, %162
  %164 = icmp eq i32 %163, 1112098638
  br i1 %164, label %166, label %165

165:                                              ; preds = %156
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %572

166:                                              ; preds = %156
  %167 = load ptr, ptr %12, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct._cpBigNum, ptr %167, i32 0, i32 3
  %169 = load i32, ptr %168, align 4, !tbaa !23
  %170 = mul nsw i32 64, %169
  %171 = load i32, ptr %24, align 4, !tbaa !9
  %172 = icmp slt i32 %170, %171
  br i1 %172, label %173, label %174

173:                                              ; preds = %166
  store i32 -7, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %572

174:                                              ; preds = %166
  br label %175

175:                                              ; preds = %174, %153
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  %176 = load ptr, ptr %11, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct._cpDLP, ptr %176, i32 0, i32 11
  %178 = load ptr, ptr %177, align 8, !tbaa !24
  store ptr %178, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %179 = load ptr, ptr %23, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct._cpBigNum, ptr %179, i32 0, i32 4
  %181 = load ptr, ptr %180, align 8, !tbaa !20
  store ptr %181, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  %182 = load i32, ptr %24, align 4, !tbaa !9
  %183 = add nsw i32 %182, 31
  %184 = ashr i32 %183, 5
  store i32 %184, ptr %33, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #4
  %185 = load ptr, ptr %23, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct._cpBigNum, ptr %185, i32 0, i32 5
  %187 = load ptr, ptr %186, align 8, !tbaa !25
  store ptr %187, ptr %34, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #4
  %188 = load i32, ptr %24, align 4, !tbaa !9
  %189 = and i32 %188, 31
  %190 = sub nsw i32 32, %189
  %191 = and i32 %190, 31
  %192 = lshr i32 -1, %191
  store i32 %192, ptr %36, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 20, ptr %37) #4
  call void @llvm.lifetime.start.p0(i64 20, ptr %38) #4
  call void @llvm.lifetime.start.p0(i64 48, ptr %39) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #4
  %193 = getelementptr inbounds [48 x i8], ptr %39, i64 0, i64 0
  store ptr %193, ptr %40, align 8, !tbaa !5
  %194 = load ptr, ptr %40, align 8, !tbaa !5
  %195 = call i32 @ippsHashMethodSet_SHA1(ptr noundef %194)
  store i32 0, ptr %27, align 4, !tbaa !9
  br label %196

196:                                              ; preds = %320, %175
  %197 = load i32, ptr %27, align 4, !tbaa !9
  %198 = icmp slt i32 %197, 100
  br i1 %198, label %199, label %323

199:                                              ; preds = %196
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #4
  %200 = load i32, ptr %25, align 4, !tbaa !9
  %201 = icmp ne i32 %200, 0
  br i1 %201, label %202, label %208

202:                                              ; preds = %199
  %203 = load ptr, ptr %14, align 8, !tbaa !5
  %204 = load ptr, ptr %32, align 8, !tbaa !5
  %205 = load i32, ptr %24, align 4, !tbaa !9
  %206 = load ptr, ptr %15, align 8, !tbaa !5
  %207 = call i32 %203(ptr noundef %204, i32 noundef %205, ptr noundef %206)
  br label %208

208:                                              ; preds = %202, %199
  %209 = load ptr, ptr %12, align 8, !tbaa !5
  %210 = icmp ne ptr %209, null
  br i1 %210, label %211, label %215

211:                                              ; preds = %208
  %212 = load ptr, ptr %12, align 8, !tbaa !5
  %213 = load ptr, ptr %23, align 8, !tbaa !5
  %214 = call ptr @cpBN_copy(ptr noundef %212, ptr noundef %213)
  br label %215

215:                                              ; preds = %211, %208
  %216 = load i32, ptr %24, align 4, !tbaa !9
  %217 = add nsw i32 %216, 7
  %218 = ashr i32 %217, 3
  store i32 %218, ptr %35, align 4, !tbaa !9
  %219 = load ptr, ptr %34, align 8, !tbaa !5
  %220 = load i32, ptr %35, align 4, !tbaa !9
  %221 = load ptr, ptr %32, align 8, !tbaa !5
  %222 = load i32, ptr %33, align 4, !tbaa !9
  %223 = call i32 @cpToOctStr_BNU32(ptr noundef %219, i32 noundef %220, ptr noundef %221, i32 noundef %222)
  %224 = load ptr, ptr %34, align 8, !tbaa !5
  %225 = load i32, ptr %35, align 4, !tbaa !9
  %226 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %227 = load ptr, ptr %40, align 8, !tbaa !5
  %228 = call i32 @ippsHashMessage_rmf(ptr noundef %224, i32 noundef %225, ptr noundef %226, ptr noundef %227)
  %229 = load ptr, ptr %32, align 8, !tbaa !5
  %230 = load ptr, ptr %32, align 8, !tbaa !5
  %231 = load i32, ptr %33, align 4, !tbaa !9
  %232 = call i32 @cpInc_BNU32(ptr noundef %229, ptr noundef %230, i32 noundef %231, i32 noundef 1)
  %233 = load i32, ptr %36, align 4, !tbaa !9
  %234 = load ptr, ptr %32, align 8, !tbaa !5
  %235 = load i32, ptr %33, align 4, !tbaa !9
  %236 = sub nsw i32 %235, 1
  %237 = sext i32 %236 to i64
  %238 = getelementptr inbounds i32, ptr %234, i64 %237
  %239 = load i32, ptr %238, align 4, !tbaa !9
  %240 = and i32 %239, %233
  store i32 %240, ptr %238, align 4, !tbaa !9
  %241 = load ptr, ptr %34, align 8, !tbaa !5
  %242 = load i32, ptr %35, align 4, !tbaa !9
  %243 = load ptr, ptr %32, align 8, !tbaa !5
  %244 = load i32, ptr %33, align 4, !tbaa !9
  %245 = call i32 @cpToOctStr_BNU32(ptr noundef %241, i32 noundef %242, ptr noundef %243, i32 noundef %244)
  %246 = load ptr, ptr %34, align 8, !tbaa !5
  %247 = load i32, ptr %35, align 4, !tbaa !9
  %248 = getelementptr inbounds [20 x i8], ptr %38, i64 0, i64 0
  %249 = load ptr, ptr %40, align 8, !tbaa !5
  %250 = call i32 @ippsHashMessage_rmf(ptr noundef %246, i32 noundef %247, ptr noundef %248, ptr noundef %249)
  store i32 0, ptr %41, align 4, !tbaa !9
  br label %251

251:                                              ; preds = %267, %215
  %252 = load i32, ptr %41, align 4, !tbaa !9
  %253 = icmp slt i32 %252, 20
  br i1 %253, label %254, label %270

254:                                              ; preds = %251
  %255 = load i32, ptr %41, align 4, !tbaa !9
  %256 = sext i32 %255 to i64
  %257 = getelementptr inbounds [20 x i8], ptr %38, i64 0, i64 %256
  %258 = load i8, ptr %257, align 1, !tbaa !26
  %259 = zext i8 %258 to i32
  %260 = load i32, ptr %41, align 4, !tbaa !9
  %261 = sext i32 %260 to i64
  %262 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 %261
  %263 = load i8, ptr %262, align 1, !tbaa !26
  %264 = zext i8 %263 to i32
  %265 = xor i32 %264, %259
  %266 = trunc i32 %265 to i8
  store i8 %266, ptr %262, align 1, !tbaa !26
  br label %267

267:                                              ; preds = %254
  %268 = load i32, ptr %41, align 4, !tbaa !9
  %269 = add nsw i32 %268, 1
  store i32 %269, ptr %41, align 4, !tbaa !9
  br label %251, !llvm.loop !27

270:                                              ; preds = %251
  %271 = load ptr, ptr %18, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct._cpBigNum, ptr %271, i32 0, i32 4
  %273 = load ptr, ptr %272, align 8, !tbaa !20
  %274 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %275 = call i32 @cpFromOctStr_BNU(ptr noundef %273, ptr noundef %274, i32 noundef 20)
  %276 = load ptr, ptr %18, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct._cpBigNum, ptr %276, i32 0, i32 2
  store i32 %275, ptr %277, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #4
  store i64 4294967295, ptr %42, align 8, !tbaa !21
  %278 = load i64, ptr %42, align 8, !tbaa !21
  %279 = load ptr, ptr %18, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct._cpBigNum, ptr %279, i32 0, i32 4
  %281 = load ptr, ptr %280, align 8, !tbaa !20
  %282 = load ptr, ptr %18, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct._cpBigNum, ptr %282, i32 0, i32 2
  %284 = load i32, ptr %283, align 8, !tbaa !19
  %285 = sub nsw i32 %284, 1
  %286 = sext i32 %285 to i64
  %287 = getelementptr inbounds i64, ptr %281, i64 %286
  %288 = load i64, ptr %287, align 8, !tbaa !21
  %289 = and i64 %288, %278
  store i64 %289, ptr %287, align 8, !tbaa !21
  %290 = load ptr, ptr %18, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct._cpBigNum, ptr %290, i32 0, i32 4
  %292 = load ptr, ptr %291, align 8, !tbaa !20
  %293 = getelementptr inbounds i8, ptr %292, i64 19
  %294 = load i8, ptr %293, align 1, !tbaa !26
  %295 = zext i8 %294 to i32
  %296 = or i32 %295, 128
  %297 = trunc i32 %296 to i8
  store i8 %297, ptr %293, align 1, !tbaa !26
  %298 = load ptr, ptr %18, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct._cpBigNum, ptr %298, i32 0, i32 4
  %300 = load ptr, ptr %299, align 8, !tbaa !20
  %301 = getelementptr inbounds i64, ptr %300, i64 0
  %302 = load i64, ptr %301, align 8, !tbaa !21
  %303 = or i64 %302, 1
  store i64 %303, ptr %301, align 8, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  %304 = load ptr, ptr %18, align 8, !tbaa !5
  %305 = load ptr, ptr %31, align 8, !tbaa !5
  %306 = call i32 @ippsPrimeSet_BN(ptr noundef %304, ptr noundef %305)
  %307 = load i32, ptr %10, align 4, !tbaa !9
  %308 = load ptr, ptr %31, align 8, !tbaa !5
  %309 = load ptr, ptr %14, align 8, !tbaa !5
  %310 = load ptr, ptr %15, align 8, !tbaa !5
  %311 = call i32 @ippsPrimeTest(i32 noundef %307, ptr noundef %30, ptr noundef %308, ptr noundef %309, ptr noundef %310)
  %312 = load i32, ptr %30, align 4, !tbaa !9
  %313 = icmp eq i32 5, %312
  br i1 %313, label %314, label %315

314:                                              ; preds = %270
  store i32 2, ptr %26, align 4
  br label %317

315:                                              ; preds = %270
  store i32 1, ptr %25, align 4, !tbaa !9
  br label %316

316:                                              ; preds = %315
  store i32 0, ptr %26, align 4
  br label %317

317:                                              ; preds = %316, %314
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #4
  %318 = load i32, ptr %26, align 4
  switch i32 %318, label %575 [
    i32 0, label %319
    i32 2, label %323
  ]

319:                                              ; preds = %317
  br label %320

320:                                              ; preds = %319
  %321 = load i32, ptr %27, align 4, !tbaa !9
  %322 = add nsw i32 %321, 1
  store i32 %322, ptr %27, align 4, !tbaa !9
  br label %196, !llvm.loop !29

323:                                              ; preds = %317, %196
  %324 = load i32, ptr %27, align 4, !tbaa !9
  %325 = icmp eq i32 100, %324
  br i1 %325, label %326, label %327

326:                                              ; preds = %323
  store i32 25, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %567

327:                                              ; preds = %323
  %328 = load ptr, ptr %11, align 8, !tbaa !5
  %329 = getelementptr inbounds %struct._cpDLP, ptr %328, i32 0, i32 2
  %330 = load i32, ptr %329, align 8, !tbaa !14
  %331 = sub nsw i32 %330, 1
  %332 = sdiv i32 %331, 160
  store i32 %332, ptr %28, align 4, !tbaa !9
  %333 = load ptr, ptr %11, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct._cpDLP, ptr %333, i32 0, i32 2
  %335 = load i32, ptr %334, align 8, !tbaa !14
  %336 = sub nsw i32 %335, 1
  %337 = srem i32 %336, 160
  store i32 %337, ptr %29, align 4, !tbaa !9
  store i32 0, ptr %27, align 4, !tbaa !9
  br label %338

338:                                              ; preds = %471, %327
  %339 = load i32, ptr %27, align 4, !tbaa !9
  %340 = icmp slt i32 %339, 4096
  br i1 %340, label %341, label %474

341:                                              ; preds = %338
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #4
  %342 = load ptr, ptr %20, align 8, !tbaa !5
  %343 = call ptr @cpBN_zero(ptr noundef %342)
  store i32 0, ptr %43, align 4, !tbaa !9
  br label %344

344:                                              ; preds = %407, %341
  %345 = load i32, ptr %43, align 4, !tbaa !9
  %346 = load i32, ptr %28, align 4, !tbaa !9
  %347 = icmp sle i32 %345, %346
  br i1 %347, label %348, label %410

348:                                              ; preds = %344
  %349 = load ptr, ptr %32, align 8, !tbaa !5
  %350 = load ptr, ptr %32, align 8, !tbaa !5
  %351 = load i32, ptr %33, align 4, !tbaa !9
  %352 = call i32 @cpInc_BNU32(ptr noundef %349, ptr noundef %350, i32 noundef %351, i32 noundef 1)
  %353 = load i32, ptr %36, align 4, !tbaa !9
  %354 = load ptr, ptr %32, align 8, !tbaa !5
  %355 = load i32, ptr %33, align 4, !tbaa !9
  %356 = sub nsw i32 %355, 1
  %357 = sext i32 %356 to i64
  %358 = getelementptr inbounds i32, ptr %354, i64 %357
  %359 = load i32, ptr %358, align 4, !tbaa !9
  %360 = and i32 %359, %353
  store i32 %360, ptr %358, align 4, !tbaa !9
  %361 = load i32, ptr %24, align 4, !tbaa !9
  %362 = add nsw i32 %361, 7
  %363 = ashr i32 %362, 3
  store i32 %363, ptr %35, align 4, !tbaa !9
  %364 = load ptr, ptr %34, align 8, !tbaa !5
  %365 = load i32, ptr %35, align 4, !tbaa !9
  %366 = load ptr, ptr %32, align 8, !tbaa !5
  %367 = load i32, ptr %33, align 4, !tbaa !9
  %368 = call i32 @cpToOctStr_BNU32(ptr noundef %364, i32 noundef %365, ptr noundef %366, i32 noundef %367)
  %369 = load ptr, ptr %34, align 8, !tbaa !5
  %370 = load i32, ptr %35, align 4, !tbaa !9
  %371 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %372 = load ptr, ptr %40, align 8, !tbaa !5
  %373 = call i32 @ippsHashMessage_rmf(ptr noundef %369, i32 noundef %370, ptr noundef %371, ptr noundef %372)
  %374 = load i32, ptr %28, align 4, !tbaa !9
  %375 = load i32, ptr %43, align 4, !tbaa !9
  %376 = icmp ne i32 %374, %375
  br i1 %376, label %377, label %387

377:                                              ; preds = %348
  %378 = load ptr, ptr %20, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct._cpBigNum, ptr %378, i32 0, i32 4
  %380 = load ptr, ptr %379, align 8, !tbaa !20
  %381 = load i32, ptr %43, align 4, !tbaa !9
  %382 = mul nsw i32 %381, 5
  %383 = sext i32 %382 to i64
  %384 = getelementptr inbounds i32, ptr %380, i64 %383
  %385 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %386 = call i32 @cpFromOctStr_BNU32(ptr noundef %384, ptr noundef %385, i32 noundef 20)
  br label %406

387:                                              ; preds = %348
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #4
  %388 = load i32, ptr %29, align 4, !tbaa !9
  %389 = add nsw i32 %388, 7
  %390 = ashr i32 %389, 3
  store i32 %390, ptr %44, align 4, !tbaa !9
  %391 = load ptr, ptr %20, align 8, !tbaa !5
  %392 = getelementptr inbounds %struct._cpBigNum, ptr %391, i32 0, i32 4
  %393 = load ptr, ptr %392, align 8, !tbaa !20
  %394 = load i32, ptr %43, align 4, !tbaa !9
  %395 = mul nsw i32 %394, 5
  %396 = sext i32 %395 to i64
  %397 = getelementptr inbounds i32, ptr %393, i64 %396
  %398 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %399 = getelementptr inbounds i8, ptr %398, i64 20
  %400 = load i32, ptr %44, align 4, !tbaa !9
  %401 = sext i32 %400 to i64
  %402 = sub i64 0, %401
  %403 = getelementptr inbounds i8, ptr %399, i64 %402
  %404 = load i32, ptr %44, align 4, !tbaa !9
  %405 = call i32 @cpFromOctStr_BNU32(ptr noundef %397, ptr noundef %403, i32 noundef %404)
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #4
  br label %406

406:                                              ; preds = %387, %377
  br label %407

407:                                              ; preds = %406
  %408 = load i32, ptr %43, align 4, !tbaa !9
  %409 = add nsw i32 %408, 1
  store i32 %409, ptr %43, align 4, !tbaa !9
  br label %344, !llvm.loop !30

410:                                              ; preds = %344
  %411 = load ptr, ptr %11, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct._cpDLP, ptr %411, i32 0, i32 2
  %413 = load i32, ptr %412, align 8, !tbaa !14
  %414 = sub nsw i32 %413, 1
  %415 = srem i32 %414, 8
  %416 = shl i32 1, %415
  %417 = and i32 %416, 255
  %418 = load ptr, ptr %20, align 8, !tbaa !5
  %419 = getelementptr inbounds %struct._cpBigNum, ptr %418, i32 0, i32 4
  %420 = load ptr, ptr %419, align 8, !tbaa !20
  %421 = load ptr, ptr %11, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct._cpDLP, ptr %421, i32 0, i32 2
  %423 = load i32, ptr %422, align 8, !tbaa !14
  %424 = sub nsw i32 %423, 1
  %425 = sdiv i32 %424, 8
  %426 = sext i32 %425 to i64
  %427 = getelementptr inbounds i8, ptr %420, i64 %426
  %428 = load i8, ptr %427, align 1, !tbaa !26
  %429 = zext i8 %428 to i32
  %430 = or i32 %429, %417
  %431 = trunc i32 %430 to i8
  store i8 %431, ptr %427, align 1, !tbaa !26
  %432 = load ptr, ptr %11, align 8, !tbaa !5
  %433 = getelementptr inbounds %struct._cpDLP, ptr %432, i32 0, i32 2
  %434 = load i32, ptr %433, align 8, !tbaa !14
  %435 = add nsw i32 %434, 64
  %436 = sub nsw i32 %435, 1
  %437 = sdiv i32 %436, 64
  %438 = load ptr, ptr %20, align 8, !tbaa !5
  %439 = getelementptr inbounds %struct._cpBigNum, ptr %438, i32 0, i32 2
  store i32 %437, ptr %439, align 8, !tbaa !19
  %440 = load ptr, ptr %18, align 8, !tbaa !5
  %441 = load ptr, ptr %18, align 8, !tbaa !5
  %442 = load ptr, ptr %21, align 8, !tbaa !5
  %443 = call i32 @ippsAdd_BN(ptr noundef %440, ptr noundef %441, ptr noundef %442)
  %444 = load ptr, ptr %20, align 8, !tbaa !5
  %445 = load ptr, ptr %21, align 8, !tbaa !5
  %446 = load ptr, ptr %22, align 8, !tbaa !5
  %447 = call i32 @ippsMod_BN(ptr noundef %444, ptr noundef %445, ptr noundef %446)
  %448 = load ptr, ptr %20, align 8, !tbaa !5
  %449 = load ptr, ptr %22, align 8, !tbaa !5
  %450 = load ptr, ptr %20, align 8, !tbaa !5
  %451 = call i32 @ippsSub_BN(ptr noundef %448, ptr noundef %449, ptr noundef %450)
  %452 = load ptr, ptr %20, align 8, !tbaa !5
  %453 = call ptr @cpBN_OneRef()
  %454 = load ptr, ptr %17, align 8, !tbaa !5
  %455 = call i32 @ippsAdd_BN(ptr noundef %452, ptr noundef %453, ptr noundef %454)
  %456 = load ptr, ptr %17, align 8, !tbaa !5
  %457 = load ptr, ptr %31, align 8, !tbaa !5
  %458 = call i32 @ippsPrimeSet_BN(ptr noundef %456, ptr noundef %457)
  %459 = load i32, ptr %10, align 4, !tbaa !9
  %460 = load ptr, ptr %31, align 8, !tbaa !5
  %461 = load ptr, ptr %14, align 8, !tbaa !5
  %462 = load ptr, ptr %15, align 8, !tbaa !5
  %463 = call i32 @ippsPrimeTest(i32 noundef %459, ptr noundef %30, ptr noundef %460, ptr noundef %461, ptr noundef %462)
  %464 = load i32, ptr %30, align 4, !tbaa !9
  %465 = icmp eq i32 5, %464
  br i1 %465, label %466, label %467

466:                                              ; preds = %410
  store i32 8, ptr %26, align 4
  br label %468

467:                                              ; preds = %410
  store i32 0, ptr %26, align 4
  br label %468

468:                                              ; preds = %467, %466
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #4
  %469 = load i32, ptr %26, align 4
  switch i32 %469, label %575 [
    i32 0, label %470
    i32 8, label %474
  ]

470:                                              ; preds = %468
  br label %471

471:                                              ; preds = %470
  %472 = load i32, ptr %27, align 4, !tbaa !9
  %473 = add nsw i32 %472, 1
  store i32 %473, ptr %27, align 4, !tbaa !9
  br label %338, !llvm.loop !31

474:                                              ; preds = %468, %338
  %475 = load i32, ptr %27, align 4, !tbaa !9
  %476 = icmp eq i32 4096, %475
  br i1 %476, label %477, label %478

477:                                              ; preds = %474
  store i32 25, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %567

478:                                              ; preds = %474
  %479 = load ptr, ptr %13, align 8, !tbaa !5
  %480 = icmp ne ptr %479, null
  br i1 %480, label %481, label %484

481:                                              ; preds = %478
  %482 = load i32, ptr %27, align 4, !tbaa !9
  %483 = load ptr, ptr %13, align 8, !tbaa !5
  store i32 %482, ptr %483, align 4, !tbaa !9
  br label %484

484:                                              ; preds = %481, %478
  %485 = load ptr, ptr %11, align 8, !tbaa !5
  %486 = getelementptr inbounds %struct._cpDLP, ptr %485, i32 0, i32 7
  %487 = load ptr, ptr %486, align 8, !tbaa !32
  %488 = load ptr, ptr %18, align 8, !tbaa !5
  %489 = getelementptr inbounds %struct._cpBigNum, ptr %488, i32 0, i32 4
  %490 = load ptr, ptr %489, align 8, !tbaa !20
  %491 = load ptr, ptr %18, align 8, !tbaa !5
  %492 = call i32 @cpBN_bitsize(ptr noundef %491)
  %493 = call ptr @gsModArithDLP()
  %494 = call i32 @gsModEngineInit(ptr noundef %487, ptr noundef %490, i32 noundef %492, i32 noundef 6, ptr noundef %493)
  %495 = load ptr, ptr %11, align 8, !tbaa !5
  %496 = getelementptr inbounds %struct._cpDLP, ptr %495, i32 0, i32 5
  %497 = load ptr, ptr %496, align 8, !tbaa !33
  %498 = load ptr, ptr %17, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct._cpBigNum, ptr %498, i32 0, i32 4
  %500 = load ptr, ptr %499, align 8, !tbaa !20
  %501 = load ptr, ptr %17, align 8, !tbaa !5
  %502 = call i32 @cpBN_bitsize(ptr noundef %501)
  %503 = call ptr @gsModArithDLP()
  %504 = call i32 @gsModEngineInit(ptr noundef %497, ptr noundef %500, i32 noundef %502, i32 noundef 6, ptr noundef %503)
  %505 = load ptr, ptr %17, align 8, !tbaa !5
  %506 = call ptr @cpBN_OneRef()
  %507 = load ptr, ptr %17, align 8, !tbaa !5
  %508 = call i32 @ippsSub_BN(ptr noundef %505, ptr noundef %506, ptr noundef %507)
  %509 = load ptr, ptr %17, align 8, !tbaa !5
  %510 = load ptr, ptr %18, align 8, !tbaa !5
  %511 = load ptr, ptr %20, align 8, !tbaa !5
  %512 = load ptr, ptr %21, align 8, !tbaa !5
  %513 = call i32 @ippsDiv_BN(ptr noundef %509, ptr noundef %510, ptr noundef %511, ptr noundef %512)
  %514 = load ptr, ptr %22, align 8, !tbaa !5
  %515 = call ptr @cpBN_OneRef()
  %516 = load ptr, ptr %11, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct._cpDLP, ptr %516, i32 0, i32 5
  %518 = load ptr, ptr %517, align 8, !tbaa !33
  call void @cpMontEnc_BN(ptr noundef %514, ptr noundef %515, ptr noundef %518)
  %519 = load ptr, ptr %21, align 8, !tbaa !5
  %520 = call ptr @cpBN_TwoRef()
  %521 = call ptr @cpBN_copy(ptr noundef %519, ptr noundef %520)
  store i32 0, ptr %27, align 4, !tbaa !9
  br label %522

522:                                              ; preds = %559, %484
  %523 = load i32, ptr %27, align 4, !tbaa !9
  %524 = icmp slt i32 %523, 100
  br i1 %524, label %525, label %562

525:                                              ; preds = %522
  %526 = load ptr, ptr %19, align 8, !tbaa !5
  %527 = load ptr, ptr %21, align 8, !tbaa !5
  %528 = load ptr, ptr %11, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct._cpDLP, ptr %528, i32 0, i32 5
  %530 = load ptr, ptr %529, align 8, !tbaa !33
  call void @cpMontEnc_BN(ptr noundef %526, ptr noundef %527, ptr noundef %530)
  %531 = load ptr, ptr %11, align 8, !tbaa !5
  %532 = getelementptr inbounds %struct._cpDLP, ptr %531, i32 0, i32 8
  %533 = load ptr, ptr %532, align 8, !tbaa !34
  %534 = load ptr, ptr %19, align 8, !tbaa !5
  %535 = load ptr, ptr %20, align 8, !tbaa !5
  %536 = load ptr, ptr %11, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct._cpDLP, ptr %536, i32 0, i32 5
  %538 = load ptr, ptr %537, align 8, !tbaa !33
  call void @cpMontExpBin_BN(ptr noundef %533, ptr noundef %534, ptr noundef %535, ptr noundef %538)
  %539 = load ptr, ptr %19, align 8, !tbaa !5
  %540 = load ptr, ptr %11, align 8, !tbaa !5
  %541 = getelementptr inbounds %struct._cpDLP, ptr %540, i32 0, i32 8
  %542 = load ptr, ptr %541, align 8, !tbaa !34
  %543 = load ptr, ptr %11, align 8, !tbaa !5
  %544 = getelementptr inbounds %struct._cpDLP, ptr %543, i32 0, i32 5
  %545 = load ptr, ptr %544, align 8, !tbaa !33
  call void @cpMontDec_BN(ptr noundef %539, ptr noundef %542, ptr noundef %545)
  %546 = load ptr, ptr %11, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct._cpDLP, ptr %546, i32 0, i32 8
  %548 = load ptr, ptr %547, align 8, !tbaa !34
  %549 = load ptr, ptr %22, align 8, !tbaa !5
  %550 = call i32 @cpBN_cmp(ptr noundef %548, ptr noundef %549)
  %551 = icmp ne i32 %550, 0
  br i1 %551, label %552, label %553

552:                                              ; preds = %525
  br label %562

553:                                              ; preds = %525
  %554 = load ptr, ptr %21, align 8, !tbaa !5
  %555 = call ptr @cpBN_OneRef()
  %556 = load ptr, ptr %21, align 8, !tbaa !5
  %557 = call i32 @ippsAdd_BN(ptr noundef %554, ptr noundef %555, ptr noundef %556)
  br label %558

558:                                              ; preds = %553
  br label %559

559:                                              ; preds = %558
  %560 = load i32, ptr %27, align 4, !tbaa !9
  %561 = add nsw i32 %560, 1
  store i32 %561, ptr %27, align 4, !tbaa !9
  br label %522, !llvm.loop !35

562:                                              ; preds = %552, %522
  %563 = load i32, ptr %27, align 4, !tbaa !9
  %564 = icmp eq i32 100, %563
  br i1 %564, label %565, label %566

565:                                              ; preds = %562
  store i32 25, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %567

566:                                              ; preds = %562
  store i32 0, ptr %26, align 4
  br label %567

567:                                              ; preds = %566, %565, %477, %326
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  call void @llvm.lifetime.end.p0(i64 48, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 20, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 20, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #4
  %568 = load i32, ptr %26, align 4
  switch i32 %568, label %572 [
    i32 0, label %569
  ]

569:                                              ; preds = %567
  %570 = load ptr, ptr %11, align 8, !tbaa !5
  %571 = getelementptr inbounds %struct._cpDLP, ptr %570, i32 0, i32 1
  store i32 7, ptr %571, align 4, !tbaa !16
  store i32 0, ptr %8, align 4
  store i32 1, ptr %26, align 4
  br label %572

572:                                              ; preds = %569, %567, %173, %165, %148, %121
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  br label %573

573:                                              ; preds = %572, %90, %86, %82, %75, %69, %63, %57, %47
  %574 = load i32, ptr %8, align 4
  ret i32 %574

575:                                              ; preds = %468, %317
  unreachable
}

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

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

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

declare ptr @cpBigNumListGet(ptr noundef) #3

declare i32 @cpNLZ_BNU(i64 noundef) #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @cpBN_copy(ptr noundef, ptr noundef) #1

declare i32 @ippsHashMethodSet_SHA1(ptr noundef) #3

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

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

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

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

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

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

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

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

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

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

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

declare ptr @cpBN_OneRef() #3

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

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

declare ptr @gsModArithDLP() #3

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontEnc_BN(ptr noundef, ptr noundef, ptr noundef) #1

declare ptr @cpBN_TwoRef() #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontExpBin_BN(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontDec_BN(ptr noundef, ptr noundef, ptr noundef) #1

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { 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 #2 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 0}
!12 = !{!"_cpDLP", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, 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, !6, i64 88, !6, i64 96, !6, i64 104}
!13 = !{!12, !10, i64 12}
!14 = !{!12, !10, i64 8}
!15 = !{!12, !6, i64 88}
!16 = !{!12, !10, i64 4}
!17 = !{!18, !10, i64 0}
!18 = !{!"_cpBigNum", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !6, i64 16, !6, i64 24}
!19 = !{!18, !10, i64 8}
!20 = !{!18, !6, i64 16}
!21 = !{!22, !22, i64 0}
!22 = !{!"long long", !7, i64 0}
!23 = !{!18, !10, i64 12}
!24 = !{!12, !6, i64 72}
!25 = !{!18, !6, i64 24}
!26 = !{!7, !7, i64 0}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = distinct !{!29, !28}
!30 = distinct !{!30, !28}
!31 = distinct !{!31, !28}
!32 = !{!12, !6, i64 40}
!33 = !{!12, !6, i64 24}
!34 = !{!12, !6, i64 48}
!35 = distinct !{!35, !28}


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

; Function Attrs: nounwind uwtable
define dso_local range(i32 -13, 26) i32 @ippsDLPGenerateDSA(ptr noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef writeonly %4, ptr noundef %5, ptr noundef %6) local_unnamed_addr #0 {
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca [20 x i8], align 16
  %11 = alloca [20 x i8], align 16
  %12 = alloca [48 x i8], align 16
  %13 = icmp eq ptr %2, null
  br i1 %13, label %271, label %14

14:                                               ; preds = %7
  %15 = load i32, ptr %2, align 8, !tbaa !5
  %16 = tail call i64 @IPP_UINT_PTR(ptr noundef nonnull %2)
  %17 = trunc i64 %16 to i32
  %18 = xor i32 %15, %17
  %19 = icmp eq i32 %18, 541346896
  br i1 %19, label %20, label %271

20:                                               ; preds = %14
  %21 = getelementptr inbounds i8, ptr %2, i64 12
  %22 = load i32, ptr %21, align 4, !tbaa !11
  %.not = icmp eq i32 %22, 160
  br i1 %.not, label %23, label %271

23:                                               ; preds = %20
  %24 = getelementptr inbounds i8, ptr %2, i64 8
  %25 = load i32, ptr %24, align 8, !tbaa !12
  %26 = add i32 %25, -512
  %or.cond = icmp ult i32 %26, 513
  %27 = and i32 %25, 63
  %.not195 = icmp eq i32 %27, 0
  %or.cond205 = and i1 %or.cond, %.not195
  br i1 %or.cond205, label %28, label %271

28:                                               ; preds = %23
  %29 = icmp slt i32 %1, 1
  br i1 %29, label %271, label %30

30:                                               ; preds = %28
  %31 = icmp eq ptr %5, null
  br i1 %31, label %271, label %32

32:                                               ; preds = %30
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #5
  %33 = getelementptr inbounds i8, ptr %2, i64 88
  %34 = load ptr, ptr %33, align 8, !tbaa !13
  store ptr %34, ptr %8, align 8, !tbaa !14
  %35 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #5
  %36 = call ptr @cpBN_zero(ptr noundef %35)
  %37 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #5
  %38 = call ptr @cpBN_zero(ptr noundef %37)
  %39 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #5
  %40 = call ptr @cpBN_zero(ptr noundef %39)
  %41 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #5
  %42 = call ptr @cpBN_zero(ptr noundef %41)
  %43 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #5
  %44 = call ptr @cpBN_zero(ptr noundef %43)
  %45 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #5
  %46 = call ptr @cpBN_zero(ptr noundef %45)
  %47 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #5
  %48 = getelementptr inbounds i8, ptr %2, i64 4
  store i32 0, ptr %48, align 4, !tbaa !15
  %.not196.not = icmp eq ptr %0, null
  br i1 %.not196.not, label %71, label %49

49:                                               ; preds = %32
  %50 = load i32, ptr %0, align 8, !tbaa !16
  %51 = call i64 @IPP_UINT_PTR(ptr noundef nonnull %0)
  %52 = trunc i64 %51 to i32
  %53 = xor i32 %50, %52
  %54 = icmp eq i32 %53, 1112098638
  br i1 %54, label %55, label %270

55:                                               ; preds = %49
  %56 = getelementptr inbounds i8, ptr %0, i64 8
  %57 = load i32, ptr %56, align 8, !tbaa !18
  %58 = shl nsw i32 %57, 6
  %59 = getelementptr inbounds i8, ptr %0, i64 16
  %60 = load ptr, ptr %59, align 8, !tbaa !19
  %61 = sext i32 %57 to i64
  %62 = getelementptr i64, ptr %60, i64 %61
  %63 = getelementptr i8, ptr %62, i64 -8
  %64 = load i64, ptr %63, align 8, !tbaa !20
  %65 = call i32 @cpNLZ_BNU(i64 noundef %64) #5
  %66 = sub nsw i32 %58, %65
  %spec.store.select = call i32 @llvm.smax.i32(i32 %66, i32 160)
  %67 = load i32, ptr %24, align 8, !tbaa !12
  %68 = icmp slt i32 %67, %spec.store.select
  br i1 %68, label %270, label %69

69:                                               ; preds = %55
  %70 = call ptr @cpBN_copy(ptr noundef %47, ptr noundef nonnull %0)
  br label %71

71:                                               ; preds = %69, %32
  %.0176 = phi i32 [ %spec.store.select, %69 ], [ 160, %32 ]
  %.not197 = icmp eq ptr %3, null
  br i1 %.not197, label %.peel.begin, label %72

72:                                               ; preds = %71
  %73 = load i32, ptr %3, align 8, !tbaa !16
  %74 = call i64 @IPP_UINT_PTR(ptr noundef nonnull %3)
  %75 = trunc i64 %74 to i32
  %76 = xor i32 %73, %75
  %77 = icmp eq i32 %76, 1112098638
  br i1 %77, label %78, label %270

78:                                               ; preds = %72
  %79 = getelementptr inbounds i8, ptr %3, i64 12
  %80 = load i32, ptr %79, align 4, !tbaa !22
  %81 = shl nsw i32 %80, 6
  %82 = icmp slt i32 %81, %.0176
  br i1 %82, label %270, label %.peel.begin

.peel.begin:                                      ; preds = %78, %71
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #5
  %83 = getelementptr inbounds i8, ptr %2, i64 72
  %84 = load ptr, ptr %83, align 8, !tbaa !23
  %85 = getelementptr inbounds i8, ptr %47, i64 16
  %86 = load ptr, ptr %85, align 8, !tbaa !19
  %87 = add nuw nsw i32 %.0176, 31
  %88 = lshr i32 %87, 5
  %89 = getelementptr inbounds i8, ptr %47, i64 24
  %90 = load ptr, ptr %89, align 8, !tbaa !24
  %91 = sub nsw i32 0, %.0176
  %92 = and i32 %91, 31
  %93 = lshr i32 -1, %92
  call void @llvm.lifetime.start.p0(i64 20, ptr nonnull %10) #5
  call void @llvm.lifetime.start.p0(i64 20, ptr nonnull %11) #5
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %12) #5
  %94 = call i32 @ippsHashMethodSet_SHA1(ptr noundef nonnull %12) #5
  %95 = getelementptr inbounds i8, ptr %38, i64 16
  %invariant.gep = getelementptr i8, ptr %86, i64 -4
  %96 = add nuw nsw i32 %.0176, 7
  %97 = lshr i32 %96, 3
  %98 = zext nneg i32 %88 to i64
  %gep = getelementptr i32, ptr %invariant.gep, i64 %98
  %99 = getelementptr inbounds i8, ptr %38, i64 8
  %100 = getelementptr inbounds i8, ptr %11, i64 16
  %101 = getelementptr inbounds i8, ptr %10, i64 16
  br i1 %.not196.not, label %102, label %104

102:                                              ; preds = %.peel.begin
  %103 = call i32 %5(ptr noundef %86, i32 noundef %.0176, ptr noundef %6) #5
  br label %104

104:                                              ; preds = %102, %.peel.begin
  br i1 %.not197, label %107, label %105

105:                                              ; preds = %104
  %106 = call ptr @cpBN_copy(ptr noundef nonnull %3, ptr noundef %47)
  br label %107

107:                                              ; preds = %105, %104
  %108 = call i32 @cpToOctStr_BNU32(ptr noundef %90, i32 noundef %97, ptr noundef %86, i32 noundef %88) #5
  %109 = call i32 @ippsHashMessage_rmf(ptr noundef %90, i32 noundef %97, ptr noundef nonnull %10, ptr noundef nonnull %12) #5
  %110 = call i32 @cpInc_BNU32(ptr noundef %86, ptr noundef %86, i32 noundef %88, i32 noundef 1) #5
  %111 = load i32, ptr %gep, align 4, !tbaa !25
  %112 = and i32 %111, %93
  store i32 %112, ptr %gep, align 4, !tbaa !25
  %113 = call i32 @cpToOctStr_BNU32(ptr noundef %90, i32 noundef %97, ptr noundef %86, i32 noundef %88) #5
  %114 = call i32 @ippsHashMessage_rmf(ptr noundef %90, i32 noundef %97, ptr noundef nonnull %11, ptr noundef nonnull %12) #5
  %115 = load <16 x i8>, ptr %11, align 16, !tbaa !26
  %116 = load <16 x i8>, ptr %10, align 16, !tbaa !26
  %117 = xor <16 x i8> %116, %115
  store <16 x i8> %117, ptr %10, align 16, !tbaa !26
  %118 = load <4 x i8>, ptr %100, align 16, !tbaa !26
  %119 = load <4 x i8>, ptr %101, align 16, !tbaa !26
  %120 = xor <4 x i8> %119, %118
  store <4 x i8> %120, ptr %101, align 16, !tbaa !26
  %121 = load ptr, ptr %95, align 8, !tbaa !19
  %122 = call i32 @cpFromOctStr_BNU(ptr noundef %121, ptr noundef nonnull %10, i32 noundef 20) #5
  store i32 %122, ptr %99, align 8, !tbaa !18
  %123 = load ptr, ptr %95, align 8, !tbaa !19
  %124 = sext i32 %122 to i64
  %125 = getelementptr i64, ptr %123, i64 %124
  %126 = getelementptr i8, ptr %125, i64 -8
  %127 = load i64, ptr %126, align 8, !tbaa !20
  %128 = and i64 %127, 4294967295
  store i64 %128, ptr %126, align 8, !tbaa !20
  %129 = getelementptr inbounds i8, ptr %123, i64 19
  %130 = load i8, ptr %129, align 1, !tbaa !26
  %131 = or i8 %130, -128
  store i8 %131, ptr %129, align 1, !tbaa !26
  %132 = load ptr, ptr %95, align 8, !tbaa !19
  %133 = load i64, ptr %132, align 8, !tbaa !20
  %134 = or i64 %133, 1
  store i64 %134, ptr %132, align 8, !tbaa !20
  %135 = call i32 @ippsPrimeSet_BN(ptr noundef %38, ptr noundef %84) #5
  %136 = call i32 @ippsPrimeTest(i32 noundef %1, ptr noundef nonnull %9, ptr noundef %84, ptr noundef nonnull %5, ptr noundef %6) #5
  %137 = load i32, ptr %9, align 4, !tbaa !25
  %138 = icmp eq i32 %137, 5
  br i1 %138, label %.critedge243, label %.peel.newph

.peel.newph:                                      ; preds = %107, %174
  %.0184210 = phi i32 [ %175, %174 ], [ 1, %107 ]
  %139 = call i32 %5(ptr noundef %86, i32 noundef %.0176, ptr noundef %6) #5
  br i1 %.not197, label %142, label %140

140:                                              ; preds = %.peel.newph
  %141 = call ptr @cpBN_copy(ptr noundef nonnull %3, ptr noundef %47)
  br label %142

142:                                              ; preds = %140, %.peel.newph
  %143 = call i32 @cpToOctStr_BNU32(ptr noundef %90, i32 noundef %97, ptr noundef %86, i32 noundef %88) #5
  %144 = call i32 @ippsHashMessage_rmf(ptr noundef %90, i32 noundef %97, ptr noundef nonnull %10, ptr noundef nonnull %12) #5
  %145 = call i32 @cpInc_BNU32(ptr noundef %86, ptr noundef %86, i32 noundef %88, i32 noundef 1) #5
  %146 = load i32, ptr %gep, align 4, !tbaa !25
  %147 = and i32 %146, %93
  store i32 %147, ptr %gep, align 4, !tbaa !25
  %148 = call i32 @cpToOctStr_BNU32(ptr noundef %90, i32 noundef %97, ptr noundef %86, i32 noundef %88) #5
  %149 = call i32 @ippsHashMessage_rmf(ptr noundef %90, i32 noundef %97, ptr noundef nonnull %11, ptr noundef nonnull %12) #5
  %150 = load <16 x i8>, ptr %11, align 16, !tbaa !26
  %151 = load <16 x i8>, ptr %10, align 16, !tbaa !26
  %152 = xor <16 x i8> %151, %150
  store <16 x i8> %152, ptr %10, align 16, !tbaa !26
  %153 = load <4 x i8>, ptr %100, align 16, !tbaa !26
  %154 = load <4 x i8>, ptr %101, align 16, !tbaa !26
  %155 = xor <4 x i8> %154, %153
  store <4 x i8> %155, ptr %101, align 16, !tbaa !26
  %156 = load ptr, ptr %95, align 8, !tbaa !19
  %157 = call i32 @cpFromOctStr_BNU(ptr noundef %156, ptr noundef nonnull %10, i32 noundef 20) #5
  store i32 %157, ptr %99, align 8, !tbaa !18
  %158 = load ptr, ptr %95, align 8, !tbaa !19
  %159 = sext i32 %157 to i64
  %160 = getelementptr i64, ptr %158, i64 %159
  %161 = getelementptr i8, ptr %160, i64 -8
  %162 = load i64, ptr %161, align 8, !tbaa !20
  %163 = and i64 %162, 4294967295
  store i64 %163, ptr %161, align 8, !tbaa !20
  %164 = getelementptr inbounds i8, ptr %158, i64 19
  %165 = load i8, ptr %164, align 1, !tbaa !26
  %166 = or i8 %165, -128
  store i8 %166, ptr %164, align 1, !tbaa !26
  %167 = load ptr, ptr %95, align 8, !tbaa !19
  %168 = load i64, ptr %167, align 8, !tbaa !20
  %169 = or i64 %168, 1
  store i64 %169, ptr %167, align 8, !tbaa !20
  %170 = call i32 @ippsPrimeSet_BN(ptr noundef %38, ptr noundef %84) #5
  %171 = call i32 @ippsPrimeTest(i32 noundef %1, ptr noundef nonnull %9, ptr noundef %84, ptr noundef nonnull %5, ptr noundef %6) #5
  %172 = load i32, ptr %9, align 4, !tbaa !25
  %173 = icmp eq i32 %172, 5
  br i1 %173, label %.loopexit, label %174

174:                                              ; preds = %142
  %175 = add nuw nsw i32 %.0184210, 1
  %exitcond.not = icmp eq i32 %175, 100
  br i1 %exitcond.not, label %.critedge, label %.peel.newph, !llvm.loop !27

.loopexit:                                        ; preds = %142
  %176 = icmp eq i32 %.0184210, 100
  br i1 %176, label %.critedge, label %.critedge243

.critedge243:                                     ; preds = %107, %.loopexit
  %177 = load i32, ptr %24, align 8, !tbaa !12
  %178 = add nsw i32 %177, -1
  %179 = sdiv i32 %178, 160
  %180 = srem i32 %178, 160
  %.not199214 = icmp slt i32 %177, -158
  %181 = getelementptr inbounds i8, ptr %42, i64 16
  %182 = add nsw i32 %180, 7
  %183 = ashr i32 %182, 3
  %184 = getelementptr inbounds i8, ptr %10, i64 20
  %narrow = sub nsw i32 0, %183
  %185 = sext i32 %narrow to i64
  %186 = getelementptr inbounds i8, ptr %184, i64 %185
  %187 = getelementptr inbounds i8, ptr %42, i64 8
  %188 = zext i32 %179 to i64
  %smax = call i32 @llvm.smax.i32(i32 %179, i32 0)
  %189 = add nuw nsw i32 %smax, 1
  %wide.trip.count = zext nneg i32 %189 to i64
  %.idx224 = mul nuw nsw i64 %188, 20
  br label %190

190:                                              ; preds = %.critedge243, %228
  %.1185216 = phi i32 [ 0, %.critedge243 ], [ %229, %228 ]
  %191 = call ptr @cpBN_zero(ptr noundef %42)
  br i1 %.not199214, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %190, %204
  %indvars.iv = phi i64 [ %indvars.iv.next, %204 ], [ 0, %190 ]
  %192 = call i32 @cpInc_BNU32(ptr noundef %86, ptr noundef %86, i32 noundef %88, i32 noundef 1) #5
  %193 = load i32, ptr %gep, align 4, !tbaa !25
  %194 = and i32 %193, %93
  store i32 %194, ptr %gep, align 4, !tbaa !25
  %195 = call i32 @cpToOctStr_BNU32(ptr noundef %90, i32 noundef %97, ptr noundef %86, i32 noundef %88) #5
  %196 = call i32 @ippsHashMessage_rmf(ptr noundef %90, i32 noundef %97, ptr noundef nonnull %10, ptr noundef nonnull %12) #5
  %.not202 = icmp eq i64 %indvars.iv, %188
  %197 = load ptr, ptr %181, align 8, !tbaa !19
  br i1 %.not202, label %201, label %198

198:                                              ; preds = %.lr.ph
  %.idx = mul i64 %indvars.iv, 20
  %199 = getelementptr inbounds i8, ptr %197, i64 %.idx
  %200 = call i32 @cpFromOctStr_BNU32(ptr noundef %199, ptr noundef nonnull %10, i32 noundef 20) #5
  br label %204

201:                                              ; preds = %.lr.ph
  %202 = getelementptr inbounds i8, ptr %197, i64 %.idx224
  %203 = call i32 @cpFromOctStr_BNU32(ptr noundef %202, ptr noundef nonnull %186, i32 noundef %183) #5
  br label %204

204:                                              ; preds = %198, %201
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond220.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond220.not, label %._crit_edge, label %.lr.ph, !llvm.loop !30

._crit_edge:                                      ; preds = %204, %190
  %205 = load i32, ptr %24, align 8, !tbaa !12
  %206 = add nsw i32 %205, -1
  %207 = and i32 %206, 7
  %208 = shl nuw nsw i32 1, %207
  %209 = load ptr, ptr %181, align 8, !tbaa !19
  %210 = sdiv i32 %206, 8
  %211 = sext i32 %210 to i64
  %212 = getelementptr inbounds i8, ptr %209, i64 %211
  %213 = load i8, ptr %212, align 1, !tbaa !26
  %214 = trunc nuw i32 %208 to i8
  %215 = or i8 %213, %214
  store i8 %215, ptr %212, align 1, !tbaa !26
  %216 = load i32, ptr %24, align 8, !tbaa !12
  %217 = add nsw i32 %216, 63
  %218 = sdiv i32 %217, 64
  store i32 %218, ptr %187, align 8, !tbaa !18
  %219 = call i32 @ippsAdd_BN(ptr noundef %38, ptr noundef %38, ptr noundef %44) #5
  %220 = call i32 @ippsMod_BN(ptr noundef %42, ptr noundef %44, ptr noundef %46) #5
  %221 = call i32 @ippsSub_BN(ptr noundef %42, ptr noundef %46, ptr noundef %42) #5
  %222 = call ptr @cpBN_OneRef() #5
  %223 = call i32 @ippsAdd_BN(ptr noundef %42, ptr noundef %222, ptr noundef %36) #5
  %224 = call i32 @ippsPrimeSet_BN(ptr noundef %36, ptr noundef %84) #5
  %225 = call i32 @ippsPrimeTest(i32 noundef %1, ptr noundef nonnull %9, ptr noundef %84, ptr noundef nonnull %5, ptr noundef %6) #5
  %226 = load i32, ptr %9, align 4, !tbaa !25
  %227 = icmp eq i32 %226, 5
  br i1 %227, label %230, label %228

228:                                              ; preds = %._crit_edge
  %229 = add nuw nsw i32 %.1185216, 1
  %exitcond221.not = icmp eq i32 %229, 4096
  br i1 %exitcond221.not, label %.critedge, label %190, !llvm.loop !31

230:                                              ; preds = %._crit_edge
  %231 = icmp eq i32 %.1185216, 4096
  br i1 %231, label %.critedge, label %232

232:                                              ; preds = %230
  %.not200 = icmp eq ptr %4, null
  br i1 %.not200, label %234, label %233

233:                                              ; preds = %232
  store i32 %.1185216, ptr %4, align 4, !tbaa !25
  br label %234

234:                                              ; preds = %233, %232
  %235 = getelementptr inbounds i8, ptr %2, i64 40
  %236 = load ptr, ptr %235, align 8, !tbaa !32
  %237 = load ptr, ptr %95, align 8, !tbaa !19
  %238 = call i32 @cpBN_bitsize(ptr noundef %38)
  %239 = call ptr @gsModArithDLP() #5
  %240 = call i32 @gsModEngineInit(ptr noundef %236, ptr noundef %237, i32 noundef %238, i32 noundef 6, ptr noundef %239) #5
  %241 = getelementptr inbounds i8, ptr %2, i64 24
  %242 = load ptr, ptr %241, align 8, !tbaa !33
  %243 = getelementptr inbounds i8, ptr %36, i64 16
  %244 = load ptr, ptr %243, align 8, !tbaa !19
  %245 = call i32 @cpBN_bitsize(ptr noundef %36)
  %246 = call ptr @gsModArithDLP() #5
  %247 = call i32 @gsModEngineInit(ptr noundef %242, ptr noundef %244, i32 noundef %245, i32 noundef 6, ptr noundef %246) #5
  %248 = call ptr @cpBN_OneRef() #5
  %249 = call i32 @ippsSub_BN(ptr noundef %36, ptr noundef %248, ptr noundef %36) #5
  %250 = call i32 @ippsDiv_BN(ptr noundef %36, ptr noundef %38, ptr noundef nonnull %42, ptr noundef %44) #5
  %251 = call ptr @cpBN_OneRef() #5
  %252 = load ptr, ptr %241, align 8, !tbaa !33
  call void @cpMontEnc_BN(ptr noundef %46, ptr noundef %251, ptr noundef %252)
  %253 = call ptr @cpBN_TwoRef() #5
  %254 = call ptr @cpBN_copy(ptr noundef %44, ptr noundef %253)
  %255 = getelementptr inbounds i8, ptr %2, i64 48
  br label %256

256:                                              ; preds = %234, %264
  %.2186217 = phi i32 [ 0, %234 ], [ %267, %264 ]
  %257 = load ptr, ptr %241, align 8, !tbaa !33
  call void @cpMontEnc_BN(ptr noundef %40, ptr noundef %44, ptr noundef %257)
  %258 = load ptr, ptr %255, align 8, !tbaa !34
  %259 = load ptr, ptr %241, align 8, !tbaa !33
  call void @cpMontExpBin_BN(ptr noundef %258, ptr noundef %40, ptr noundef %42, ptr noundef %259)
  %260 = load ptr, ptr %255, align 8, !tbaa !34
  %261 = load ptr, ptr %241, align 8, !tbaa !33
  call void @cpMontDec_BN(ptr noundef %40, ptr noundef %260, ptr noundef %261)
  %262 = load ptr, ptr %255, align 8, !tbaa !34
  %263 = call i32 @cpBN_cmp(ptr noundef %262, ptr noundef %46)
  %.not201 = icmp eq i32 %263, 0
  br i1 %.not201, label %264, label %269

264:                                              ; preds = %256
  %265 = call ptr @cpBN_OneRef() #5
  %266 = call i32 @ippsAdd_BN(ptr noundef %44, ptr noundef %265, ptr noundef %44) #5
  %267 = add nuw nsw i32 %.2186217, 1
  %exitcond222.not = icmp eq i32 %267, 100
  br i1 %exitcond222.not, label %268, label %256, !llvm.loop !35

268:                                              ; preds = %264
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %12) #5
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %11) #5
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #5
  br label %270

269:                                              ; preds = %256
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %12) #5
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %11) #5
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #5
  store i32 7, ptr %48, align 4, !tbaa !15
  br label %270

.critedge:                                        ; preds = %174, %228, %230, %.loopexit
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %12) #5
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %11) #5
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #5
  br label %270

270:                                              ; preds = %268, %.critedge, %78, %72, %55, %49, %269
  %.1 = phi i32 [ 0, %269 ], [ 25, %268 ], [ -13, %49 ], [ -7, %55 ], [ -13, %72 ], [ -7, %78 ], [ 25, %.critedge ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #5
  br label %271

271:                                              ; preds = %30, %28, %23, %20, %14, %7, %270
  %.2 = phi i32 [ %.1, %270 ], [ -8, %7 ], [ -13, %14 ], [ -6, %20 ], [ -6, %23 ], [ -5, %28 ], [ -8, %30 ]
  ret i32 %.2
}

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

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

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

declare ptr @cpBigNumListGet(ptr noundef) local_unnamed_addr #3

declare i32 @cpNLZ_BNU(i64 noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @cpBN_copy(ptr noundef, ptr noundef) local_unnamed_addr #1

declare i32 @ippsHashMethodSet_SHA1(ptr noundef) local_unnamed_addr #3

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

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

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

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

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

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

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

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

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

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

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

declare ptr @cpBN_OneRef() local_unnamed_addr #3

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

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

declare ptr @gsModArithDLP() local_unnamed_addr #3

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontEnc_BN(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare ptr @cpBN_TwoRef() local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontExpBin_BN(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontDec_BN(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #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 = { 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 #2 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 nosync nounwind speculatable willreturn memory(none) }
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 = !{!"_cpDLP", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, 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, !10, i64 88, !10, i64 96, !10, i64 104}
!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 12}
!12 = !{!6, !7, i64 8}
!13 = !{!6, !10, i64 88}
!14 = !{!10, !10, i64 0}
!15 = !{!6, !7, i64 4}
!16 = !{!17, !7, i64 0}
!17 = !{!"_cpBigNum", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !10, i64 16, !10, i64 24}
!18 = !{!17, !7, i64 8}
!19 = !{!17, !10, i64 16}
!20 = !{!21, !21, i64 0}
!21 = !{!"long long", !8, i64 0}
!22 = !{!17, !7, i64 12}
!23 = !{!6, !10, i64 72}
!24 = !{!17, !10, i64 24}
!25 = !{!7, !7, i64 0}
!26 = !{!8, !8, i64 0}
!27 = distinct !{!27, !28, !29}
!28 = !{!"llvm.loop.mustprogress"}
!29 = !{!"llvm.loop.peeled.count", i32 1}
!30 = distinct !{!30, !28}
!31 = distinct !{!31, !28}
!32 = !{!6, !10, i64 40}
!33 = !{!6, !10, i64 24}
!34 = !{!6, !10, i64 48}
!35 = distinct !{!35, !28}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass