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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @ippsDLPGenerateDH(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 i32, align 4
  %23 = alloca i32, align 4
  %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 ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca i32, align 4
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %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 i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca i32, align 4
  %45 = alloca i32, align 4
  %46 = alloca i32, align 4
  %47 = alloca i64, align 8
  %48 = alloca i32, align 4
  %49 = alloca i32, align 4
  %50 = alloca i64, align 8
  %51 = alloca i32, align 4
  %52 = 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
  %53 = load ptr, ptr %11, align 8, !tbaa !5
  %54 = icmp eq ptr null, %53
  br i1 %54, label %55, label %56

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

56:                                               ; preds = %7
  %57 = load ptr, ptr %11, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct._cpDLP, ptr %57, i32 0, i32 0
  %59 = load i32, ptr %58, align 8, !tbaa !11
  %60 = load ptr, ptr %11, align 8, !tbaa !5
  %61 = call i64 @IPP_UINT_PTR(ptr noundef %60)
  %62 = trunc i64 %61 to i32
  %63 = xor i32 %59, %62
  %64 = icmp eq i32 %63, 541346896
  br i1 %64, label %66, label %65

65:                                               ; preds = %56
  store i32 -13, ptr %8, align 4
  br label %796

66:                                               ; preds = %56
  %67 = load ptr, ptr %11, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct._cpDLP, ptr %67, i32 0, i32 3
  %69 = load i32, ptr %68, align 4, !tbaa !13
  %70 = icmp sgt i32 160, %69
  br i1 %70, label %71, label %72

71:                                               ; preds = %66
  store i32 -6, ptr %8, align 4
  br label %796

72:                                               ; preds = %66
  %73 = load ptr, ptr %11, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct._cpDLP, ptr %73, i32 0, i32 2
  %75 = load i32, ptr %74, align 8, !tbaa !14
  %76 = icmp sgt i32 512, %75
  br i1 %76, label %77, label %78

77:                                               ; preds = %72
  store i32 -6, ptr %8, align 4
  br label %796

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

84:                                               ; preds = %78
  store i32 -6, ptr %8, align 4
  br label %796

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

88:                                               ; preds = %85
  store i32 -5, ptr %8, align 4
  br label %796

89:                                               ; preds = %85
  %90 = load ptr, ptr %14, align 8, !tbaa !5
  %91 = icmp eq ptr null, %90
  br i1 %91, label %92, label %93

92:                                               ; preds = %89
  store i32 -8, ptr %8, align 4
  br label %796

93:                                               ; preds = %89
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  %94 = load ptr, ptr %11, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct._cpDLP, ptr %94, i32 0, i32 13
  %96 = load ptr, ptr %95, align 8, !tbaa !15
  store ptr %96, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %97 = call ptr @cpBigNumListGet(ptr noundef %16)
  store ptr %97, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %98 = call ptr @cpBigNumListGet(ptr noundef %16)
  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)
  store ptr %99, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %100 = call ptr @cpBigNumListGet(ptr noundef %16)
  store ptr %100, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  %101 = call ptr @cpBigNumListGet(ptr noundef %16)
  store ptr %101, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  store i32 1, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  %102 = load ptr, ptr %11, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct._cpDLP, ptr %102, i32 0, i32 3
  %104 = load i32, ptr %103, align 4, !tbaa !13
  store i32 %104, ptr %23, align 4, !tbaa !9
  %105 = load ptr, ptr %11, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct._cpDLP, ptr %105, i32 0, i32 1
  store i32 0, ptr %106, align 4, !tbaa !16
  %107 = load ptr, ptr %9, align 8, !tbaa !5
  %108 = icmp ne ptr %107, null
  br i1 %108, label %109, label %155

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

118:                                              ; preds = %109
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %795

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

141:                                              ; preds = %119
  store i32 -7, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %795

142:                                              ; preds = %119
  %143 = load ptr, ptr %20, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct._cpBigNum, ptr %143, i32 0, i32 3
  %145 = load i32, ptr %144, align 4, !tbaa !23
  %146 = load ptr, ptr %9, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct._cpBigNum, ptr %146, i32 0, i32 2
  %148 = load i32, ptr %147, align 8, !tbaa !19
  %149 = icmp slt i32 %145, %148
  br i1 %149, label %150, label %151

150:                                              ; preds = %142
  store i32 -7, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %795

151:                                              ; preds = %142
  %152 = load ptr, ptr %20, align 8, !tbaa !5
  %153 = load ptr, ptr %9, align 8, !tbaa !5
  %154 = call ptr @cpBN_copy(ptr noundef %152, ptr noundef %153)
  store i32 0, ptr %22, align 4, !tbaa !9
  br label %155

155:                                              ; preds = %151, %93
  %156 = load ptr, ptr %12, align 8, !tbaa !5
  %157 = icmp ne ptr %156, null
  br i1 %157, label %158, label %179

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

167:                                              ; preds = %158
  store i32 -13, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %795

168:                                              ; preds = %158
  %169 = load ptr, ptr %11, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct._cpDLP, ptr %169, i32 0, i32 3
  %171 = load i32, ptr %170, align 4, !tbaa !13
  %172 = load ptr, ptr %12, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct._cpBigNum, ptr %172, i32 0, i32 3
  %174 = load i32, ptr %173, align 4, !tbaa !23
  %175 = mul nsw i32 64, %174
  %176 = icmp sgt i32 %171, %175
  br i1 %176, label %177, label %178

177:                                              ; preds = %168
  store i32 -7, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %795

178:                                              ; preds = %168
  br label %179

179:                                              ; preds = %178, %155
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  %180 = load ptr, ptr %11, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct._cpDLP, ptr %180, i32 0, i32 2
  %182 = load i32, ptr %181, align 8, !tbaa !14
  store i32 %182, ptr %25, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #4
  %183 = load ptr, ptr %11, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct._cpDLP, ptr %183, i32 0, i32 3
  %185 = load i32, ptr %184, align 4, !tbaa !13
  store i32 %185, ptr %26, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #4
  %186 = load i32, ptr %26, align 4, !tbaa !9
  %187 = add nsw i32 %186, 160
  %188 = sub nsw i32 %187, 1
  %189 = sdiv i32 %188, 160
  store i32 %189, ptr %27, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %190 = load i32, ptr %25, align 4, !tbaa !9
  %191 = add nsw i32 %190, 160
  %192 = sub nsw i32 %191, 1
  %193 = sdiv i32 %192, 160
  store i32 %193, ptr %28, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  %194 = load i32, ptr %25, align 4, !tbaa !9
  %195 = add nsw i32 %194, 1023
  %196 = sdiv i32 %195, 1024
  store i32 %196, ptr %29, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  %197 = load ptr, ptr %11, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct._cpDLP, ptr %197, i32 0, i32 11
  %199 = load ptr, ptr %198, align 8, !tbaa !24
  store ptr %199, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  %200 = load ptr, ptr %20, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct._cpBigNum, ptr %200, i32 0, i32 4
  %202 = load ptr, ptr %201, align 8, !tbaa !20
  store ptr %202, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %203 = load ptr, ptr %21, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct._cpBigNum, ptr %203, i32 0, i32 4
  %205 = load ptr, ptr %204, align 8, !tbaa !20
  store ptr %205, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  %206 = load i32, ptr %23, align 4, !tbaa !9
  %207 = add nsw i32 %206, 31
  %208 = ashr i32 %207, 5
  store i32 %208, ptr %33, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #4
  %209 = load ptr, ptr %20, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct._cpBigNum, ptr %209, i32 0, i32 5
  %211 = load ptr, ptr %210, align 8, !tbaa !25
  store ptr %211, ptr %34, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #4
  %212 = load ptr, ptr %21, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct._cpBigNum, ptr %212, i32 0, i32 5
  %214 = load ptr, ptr %213, align 8, !tbaa !25
  store ptr %214, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #4
  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
  %215 = getelementptr inbounds [48 x i8], ptr %39, i64 0, i64 0
  store ptr %215, ptr %40, align 8, !tbaa !5
  %216 = load ptr, ptr %40, align 8, !tbaa !5
  %217 = call i32 @ippsHashMethodSet_SHA1(ptr noundef %216)
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #4
  store i32 0, ptr %41, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #4
  %218 = load ptr, ptr %17, align 8, !tbaa !5
  %219 = call i32 @ippsSet_BN(i32 noundef 1, i32 noundef 1, ptr noundef %27, ptr noundef %218)
  store i32 0, ptr %42, align 4, !tbaa !9
  br label %220

220:                                              ; preds = %444, %179
  %221 = load i32, ptr %42, align 4, !tbaa !9
  %222 = icmp slt i32 %221, 4096
  br i1 %222, label %223, label %227

223:                                              ; preds = %220
  %224 = load i32, ptr %41, align 4, !tbaa !9
  %225 = icmp ne i32 %224, 0
  %226 = xor i1 %225, true
  br label %227

227:                                              ; preds = %223, %220
  %228 = phi i1 [ false, %220 ], [ %226, %223 ]
  br i1 %228, label %229, label %447

229:                                              ; preds = %227
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #4
  %230 = load i32, ptr %22, align 4, !tbaa !9
  %231 = icmp ne i32 %230, 0
  br i1 %231, label %232, label %242

232:                                              ; preds = %229
  %233 = load ptr, ptr %14, align 8, !tbaa !5
  %234 = load ptr, ptr %31, align 8, !tbaa !5
  %235 = load i32, ptr %23, align 4, !tbaa !9
  %236 = load ptr, ptr %15, align 8, !tbaa !5
  %237 = call i32 %233(ptr noundef %234, i32 noundef %235, ptr noundef %236)
  %238 = load i32, ptr %33, align 4, !tbaa !9
  %239 = load ptr, ptr %31, align 8, !tbaa !5
  %240 = load ptr, ptr %20, align 8, !tbaa !5
  %241 = call i32 @ippsSet_BN(i32 noundef 1, i32 noundef %238, ptr noundef %239, ptr noundef %240)
  br label %242

242:                                              ; preds = %232, %229
  %243 = load ptr, ptr %12, align 8, !tbaa !5
  %244 = icmp ne ptr %243, null
  br i1 %244, label %245, label %249

245:                                              ; preds = %242
  %246 = load ptr, ptr %12, align 8, !tbaa !5
  %247 = load ptr, ptr %20, align 8, !tbaa !5
  %248 = call ptr @cpBN_copy(ptr noundef %246, ptr noundef %247)
  br label %249

249:                                              ; preds = %245, %242
  %250 = load ptr, ptr %20, align 8, !tbaa !5
  %251 = load ptr, ptr %17, align 8, !tbaa !5
  %252 = load ptr, ptr %21, align 8, !tbaa !5
  %253 = call i32 @ippsAdd_BN(ptr noundef %250, ptr noundef %251, ptr noundef %252)
  %254 = load ptr, ptr %18, align 8, !tbaa !5
  %255 = call ptr @cpBN_zero(ptr noundef %254)
  store i32 0, ptr %43, align 4, !tbaa !9
  br label %256

256:                                              ; preds = %378, %249
  %257 = load i32, ptr %43, align 4, !tbaa !9
  %258 = load i32, ptr %27, align 4, !tbaa !9
  %259 = icmp slt i32 %257, %258
  br i1 %259, label %260, label %381

260:                                              ; preds = %256
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #4
  %261 = load ptr, ptr %20, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct._cpBigNum, ptr %261, i32 0, i32 2
  %263 = load i32, ptr %262, align 8, !tbaa !19
  %264 = mul nsw i32 %263, 2
  store i32 %264, ptr %45, align 4, !tbaa !9
  %265 = load i32, ptr %45, align 4, !tbaa !9
  %266 = mul nsw i32 %265, 32
  %267 = load ptr, ptr %31, align 8, !tbaa !5
  %268 = load i32, ptr %45, align 4, !tbaa !9
  %269 = sub nsw i32 %268, 1
  %270 = sext i32 %269 to i64
  %271 = getelementptr inbounds i32, ptr %267, i64 %270
  %272 = load i32, ptr %271, align 4, !tbaa !9
  %273 = call i32 @cpNLZ_BNU32(i32 noundef %272)
  %274 = sub nsw i32 %266, %273
  %275 = add nsw i32 %274, 7
  %276 = ashr i32 %275, 3
  store i32 %276, ptr %36, align 4, !tbaa !9
  %277 = load ptr, ptr %34, align 8, !tbaa !5
  %278 = load i32, ptr %36, align 4, !tbaa !9
  %279 = load ptr, ptr %31, align 8, !tbaa !5
  %280 = load i32, ptr %45, align 4, !tbaa !9
  %281 = call i32 @cpToOctStr_BNU32(ptr noundef %277, i32 noundef %278, ptr noundef %279, i32 noundef %280)
  %282 = load ptr, ptr %34, align 8, !tbaa !5
  %283 = load i32, ptr %36, align 4, !tbaa !9
  %284 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %285 = load ptr, ptr %40, align 8, !tbaa !5
  %286 = call i32 @ippsHashMessage_rmf(ptr noundef %282, i32 noundef %283, ptr noundef %284, ptr noundef %285)
  %287 = load ptr, ptr %21, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct._cpBigNum, ptr %287, i32 0, i32 2
  %289 = load i32, ptr %288, align 8, !tbaa !19
  %290 = mul nsw i32 %289, 2
  store i32 %290, ptr %46, align 4, !tbaa !9
  %291 = load i32, ptr %46, align 4, !tbaa !9
  %292 = mul nsw i32 %291, 32
  %293 = load ptr, ptr %32, align 8, !tbaa !5
  %294 = load i32, ptr %46, align 4, !tbaa !9
  %295 = sub nsw i32 %294, 1
  %296 = sext i32 %295 to i64
  %297 = getelementptr inbounds i32, ptr %293, i64 %296
  %298 = load i32, ptr %297, align 4, !tbaa !9
  %299 = call i32 @cpNLZ_BNU32(i32 noundef %298)
  %300 = sub nsw i32 %292, %299
  %301 = add nsw i32 %300, 7
  %302 = ashr i32 %301, 3
  store i32 %302, ptr %36, align 4, !tbaa !9
  %303 = load ptr, ptr %35, align 8, !tbaa !5
  %304 = load i32, ptr %36, align 4, !tbaa !9
  %305 = load ptr, ptr %32, align 8, !tbaa !5
  %306 = load i32, ptr %33, align 4, !tbaa !9
  %307 = call i32 @cpToOctStr_BNU32(ptr noundef %303, i32 noundef %304, ptr noundef %305, i32 noundef %306)
  %308 = load ptr, ptr %35, align 8, !tbaa !5
  %309 = load i32, ptr %36, align 4, !tbaa !9
  %310 = getelementptr inbounds [20 x i8], ptr %38, i64 0, i64 0
  %311 = load ptr, ptr %40, align 8, !tbaa !5
  %312 = call i32 @ippsHashMessage_rmf(ptr noundef %308, i32 noundef %309, ptr noundef %310, ptr noundef %311)
  store i32 0, ptr %44, align 4, !tbaa !9
  br label %313

313:                                              ; preds = %329, %260
  %314 = load i32, ptr %44, align 4, !tbaa !9
  %315 = icmp slt i32 %314, 20
  br i1 %315, label %316, label %332

316:                                              ; preds = %313
  %317 = load i32, ptr %44, align 4, !tbaa !9
  %318 = sext i32 %317 to i64
  %319 = getelementptr inbounds [20 x i8], ptr %38, i64 0, i64 %318
  %320 = load i8, ptr %319, align 1, !tbaa !26
  %321 = zext i8 %320 to i32
  %322 = load i32, ptr %44, align 4, !tbaa !9
  %323 = sext i32 %322 to i64
  %324 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 %323
  %325 = load i8, ptr %324, align 1, !tbaa !26
  %326 = zext i8 %325 to i32
  %327 = xor i32 %326, %321
  %328 = trunc i32 %327 to i8
  store i8 %328, ptr %324, align 1, !tbaa !26
  br label %329

329:                                              ; preds = %316
  %330 = load i32, ptr %44, align 4, !tbaa !9
  %331 = add nsw i32 %330, 1
  store i32 %331, ptr %44, align 4, !tbaa !9
  br label %313, !llvm.loop !27

332:                                              ; preds = %313
  %333 = load i32, ptr %43, align 4, !tbaa !9
  %334 = load i32, ptr %27, align 4, !tbaa !9
  %335 = sub nsw i32 %334, 1
  %336 = icmp ne i32 %333, %335
  br i1 %336, label %337, label %347

337:                                              ; preds = %332
  %338 = load ptr, ptr %18, align 8, !tbaa !5
  %339 = getelementptr inbounds %struct._cpBigNum, ptr %338, i32 0, i32 4
  %340 = load ptr, ptr %339, align 8, !tbaa !20
  %341 = load i32, ptr %43, align 4, !tbaa !9
  %342 = mul nsw i32 %341, 5
  %343 = sext i32 %342 to i64
  %344 = getelementptr inbounds i32, ptr %340, i64 %343
  %345 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %346 = call i32 @cpFromOctStr_BNU32(ptr noundef %344, ptr noundef %345, i32 noundef 20)
  br label %369

347:                                              ; preds = %332
  %348 = load i32, ptr %26, align 4, !tbaa !9
  %349 = load i32, ptr %43, align 4, !tbaa !9
  %350 = mul nsw i32 160, %349
  %351 = sub nsw i32 %348, %350
  %352 = add nsw i32 %351, 7
  %353 = ashr i32 %352, 3
  store i32 %353, ptr %36, align 4, !tbaa !9
  %354 = load ptr, ptr %18, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct._cpBigNum, ptr %354, i32 0, i32 4
  %356 = load ptr, ptr %355, align 8, !tbaa !20
  %357 = load i32, ptr %43, align 4, !tbaa !9
  %358 = mul nsw i32 %357, 5
  %359 = sext i32 %358 to i64
  %360 = getelementptr inbounds i32, ptr %356, i64 %359
  %361 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %362 = getelementptr inbounds i8, ptr %361, i64 20
  %363 = load i32, ptr %36, align 4, !tbaa !9
  %364 = sext i32 %363 to i64
  %365 = sub i64 0, %364
  %366 = getelementptr inbounds i8, ptr %362, i64 %365
  %367 = load i32, ptr %36, align 4, !tbaa !9
  %368 = call i32 @cpFromOctStr_BNU32(ptr noundef %360, ptr noundef %366, i32 noundef %367)
  br label %369

369:                                              ; preds = %347, %337
  %370 = load ptr, ptr %20, align 8, !tbaa !5
  %371 = call ptr @cpBN_OneRef()
  %372 = load ptr, ptr %20, align 8, !tbaa !5
  %373 = call i32 @ippsAdd_BN(ptr noundef %370, ptr noundef %371, ptr noundef %372)
  %374 = load ptr, ptr %21, align 8, !tbaa !5
  %375 = call ptr @cpBN_OneRef()
  %376 = load ptr, ptr %21, align 8, !tbaa !5
  %377 = call i32 @ippsAdd_BN(ptr noundef %374, ptr noundef %375, ptr noundef %376)
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #4
  br label %378

378:                                              ; preds = %369
  %379 = load i32, ptr %43, align 4, !tbaa !9
  %380 = add nsw i32 %379, 1
  store i32 %380, ptr %43, align 4, !tbaa !9
  br label %256, !llvm.loop !29

381:                                              ; preds = %256
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #4
  %382 = load i32, ptr %26, align 4, !tbaa !9
  %383 = and i32 %382, 63
  %384 = sub nsw i32 64, %383
  %385 = and i32 %384, 63
  %386 = zext i32 %385 to i64
  %387 = lshr i64 -1, %386
  store i64 %387, ptr %47, align 8, !tbaa !21
  %388 = load i32, ptr %26, align 4, !tbaa !9
  %389 = add nsw i32 %388, 64
  %390 = sub nsw i32 %389, 1
  %391 = sdiv i32 %390, 64
  %392 = load ptr, ptr %18, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct._cpBigNum, ptr %392, i32 0, i32 2
  store i32 %391, ptr %393, align 8, !tbaa !19
  %394 = load i64, ptr %47, align 8, !tbaa !21
  %395 = load ptr, ptr %18, align 8, !tbaa !5
  %396 = getelementptr inbounds %struct._cpBigNum, ptr %395, i32 0, i32 4
  %397 = load ptr, ptr %396, align 8, !tbaa !20
  %398 = load ptr, ptr %18, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct._cpBigNum, ptr %398, i32 0, i32 2
  %400 = load i32, ptr %399, align 8, !tbaa !19
  %401 = sub nsw i32 %400, 1
  %402 = sext i32 %401 to i64
  %403 = getelementptr inbounds i64, ptr %397, i64 %402
  %404 = load i64, ptr %403, align 8, !tbaa !21
  %405 = and i64 %404, %394
  store i64 %405, ptr %403, align 8, !tbaa !21
  %406 = load i32, ptr %26, align 4, !tbaa !9
  %407 = sub nsw i32 %406, 1
  %408 = srem i32 %407, 8
  %409 = shl i32 1, %408
  %410 = and i32 %409, 255
  %411 = load ptr, ptr %18, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct._cpBigNum, ptr %411, i32 0, i32 4
  %413 = load ptr, ptr %412, align 8, !tbaa !20
  %414 = load i32, ptr %26, align 4, !tbaa !9
  %415 = sub nsw i32 %414, 1
  %416 = sdiv i32 %415, 8
  %417 = sext i32 %416 to i64
  %418 = getelementptr inbounds i8, ptr %413, i64 %417
  %419 = load i8, ptr %418, align 1, !tbaa !26
  %420 = zext i8 %419 to i32
  %421 = or i32 %420, %410
  %422 = trunc i32 %421 to i8
  store i8 %422, ptr %418, align 1, !tbaa !26
  %423 = load ptr, ptr %18, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct._cpBigNum, ptr %423, i32 0, i32 4
  %425 = load ptr, ptr %424, align 8, !tbaa !20
  %426 = getelementptr inbounds i64, ptr %425, i64 0
  %427 = load i64, ptr %426, align 8, !tbaa !21
  %428 = or i64 %427, 1
  store i64 %428, ptr %426, align 8, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #4
  %429 = load ptr, ptr %18, align 8, !tbaa !5
  %430 = getelementptr inbounds %struct._cpBigNum, ptr %429, i32 0, i32 4
  %431 = load ptr, ptr %430, align 8, !tbaa !20
  %432 = load ptr, ptr %18, align 8, !tbaa !5
  %433 = getelementptr inbounds %struct._cpBigNum, ptr %432, i32 0, i32 2
  %434 = load i32, ptr %433, align 8, !tbaa !19
  %435 = load i32, ptr %10, align 4, !tbaa !9
  %436 = load ptr, ptr %30, align 8, !tbaa !5
  %437 = load ptr, ptr %14, align 8, !tbaa !5
  %438 = load ptr, ptr %15, align 8, !tbaa !5
  %439 = call i32 @cpPrimeTest(ptr noundef %431, i32 noundef %434, i32 noundef %435, ptr noundef %436, ptr noundef %437, ptr noundef %438)
  store i32 %439, ptr %41, align 4, !tbaa !9
  %440 = load i32, ptr %41, align 4, !tbaa !9
  %441 = icmp ne i32 %440, 0
  br i1 %441, label %443, label %442

442:                                              ; preds = %381
  store i32 1, ptr %22, align 4, !tbaa !9
  br label %443

443:                                              ; preds = %442, %381
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #4
  br label %444

444:                                              ; preds = %443
  %445 = load i32, ptr %42, align 4, !tbaa !9
  %446 = add nsw i32 %445, 1
  store i32 %446, ptr %42, align 4, !tbaa !9
  br label %220, !llvm.loop !30

447:                                              ; preds = %227
  %448 = load i32, ptr %42, align 4, !tbaa !9
  %449 = icmp eq i32 4096, %448
  br i1 %449, label %450, label %451

450:                                              ; preds = %447
  store i32 25, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %790

451:                                              ; preds = %447
  %452 = load ptr, ptr %20, align 8, !tbaa !5
  %453 = load ptr, ptr %17, align 8, !tbaa !5
  %454 = load ptr, ptr %20, align 8, !tbaa !5
  %455 = call i32 @ippsAdd_BN(ptr noundef %452, ptr noundef %453, ptr noundef %454)
  %456 = load ptr, ptr %19, align 8, !tbaa !5
  %457 = load i32, ptr %25, align 4, !tbaa !9
  %458 = sub nsw i32 %457, 1
  %459 = call ptr @cpBN_power2(ptr noundef %456, i32 noundef %458)
  store i32 0, ptr %42, align 4, !tbaa !9
  store i32 0, ptr %41, align 4, !tbaa !9
  br label %460

460:                                              ; preds = %631, %451
  %461 = load i32, ptr %42, align 4, !tbaa !9
  %462 = load i32, ptr %29, align 4, !tbaa !9
  %463 = mul nsw i32 4096, %462
  %464 = icmp slt i32 %461, %463
  br i1 %464, label %465, label %469

465:                                              ; preds = %460
  %466 = load i32, ptr %41, align 4, !tbaa !9
  %467 = icmp ne i32 %466, 0
  %468 = xor i1 %467, true
  br label %469

469:                                              ; preds = %465, %460
  %470 = phi i1 [ false, %460 ], [ %468, %465 ]
  br i1 %470, label %471, label %634

471:                                              ; preds = %469
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #4
  %472 = load ptr, ptr %17, align 8, !tbaa !5
  %473 = call ptr @cpBN_zero(ptr noundef %472)
  store i32 0, ptr %48, align 4, !tbaa !9
  br label %474

474:                                              ; preds = %546, %471
  %475 = load i32, ptr %48, align 4, !tbaa !9
  %476 = load i32, ptr %28, align 4, !tbaa !9
  %477 = icmp slt i32 %475, %476
  br i1 %477, label %478, label %549

478:                                              ; preds = %474
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #4
  %479 = load ptr, ptr %20, align 8, !tbaa !5
  %480 = getelementptr inbounds %struct._cpBigNum, ptr %479, i32 0, i32 2
  %481 = load i32, ptr %480, align 8, !tbaa !19
  %482 = mul nsw i32 %481, 2
  store i32 %482, ptr %49, align 4, !tbaa !9
  %483 = load i32, ptr %49, align 4, !tbaa !9
  %484 = mul nsw i32 %483, 32
  %485 = load ptr, ptr %31, align 8, !tbaa !5
  %486 = load i32, ptr %49, align 4, !tbaa !9
  %487 = sub nsw i32 %486, 1
  %488 = sext i32 %487 to i64
  %489 = getelementptr inbounds i32, ptr %485, i64 %488
  %490 = load i32, ptr %489, align 4, !tbaa !9
  %491 = call i32 @cpNLZ_BNU32(i32 noundef %490)
  %492 = sub nsw i32 %484, %491
  %493 = add nsw i32 %492, 7
  %494 = ashr i32 %493, 3
  store i32 %494, ptr %36, align 4, !tbaa !9
  %495 = load ptr, ptr %34, align 8, !tbaa !5
  %496 = load i32, ptr %36, align 4, !tbaa !9
  %497 = load ptr, ptr %31, align 8, !tbaa !5
  %498 = load i32, ptr %49, align 4, !tbaa !9
  %499 = call i32 @cpToOctStr_BNU32(ptr noundef %495, i32 noundef %496, ptr noundef %497, i32 noundef %498)
  %500 = load ptr, ptr %34, align 8, !tbaa !5
  %501 = load i32, ptr %36, align 4, !tbaa !9
  %502 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %503 = load ptr, ptr %40, align 8, !tbaa !5
  %504 = call i32 @ippsHashMessage_rmf(ptr noundef %500, i32 noundef %501, ptr noundef %502, ptr noundef %503)
  %505 = load i32, ptr %48, align 4, !tbaa !9
  %506 = load i32, ptr %28, align 4, !tbaa !9
  %507 = sub nsw i32 %506, 1
  %508 = icmp ne i32 %505, %507
  br i1 %508, label %509, label %519

509:                                              ; preds = %478
  %510 = load ptr, ptr %17, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct._cpBigNum, ptr %510, i32 0, i32 4
  %512 = load ptr, ptr %511, align 8, !tbaa !20
  %513 = load i32, ptr %48, align 4, !tbaa !9
  %514 = mul nsw i32 %513, 5
  %515 = sext i32 %514 to i64
  %516 = getelementptr inbounds i32, ptr %512, i64 %515
  %517 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %518 = call i32 @cpFromOctStr_BNU32(ptr noundef %516, ptr noundef %517, i32 noundef 20)
  br label %541

519:                                              ; preds = %478
  %520 = load i32, ptr %25, align 4, !tbaa !9
  %521 = load i32, ptr %48, align 4, !tbaa !9
  %522 = mul nsw i32 160, %521
  %523 = sub nsw i32 %520, %522
  %524 = add nsw i32 %523, 7
  %525 = ashr i32 %524, 3
  store i32 %525, ptr %36, align 4, !tbaa !9
  %526 = load ptr, ptr %17, align 8, !tbaa !5
  %527 = getelementptr inbounds %struct._cpBigNum, ptr %526, i32 0, i32 4
  %528 = load ptr, ptr %527, align 8, !tbaa !20
  %529 = load i32, ptr %48, align 4, !tbaa !9
  %530 = mul nsw i32 %529, 5
  %531 = sext i32 %530 to i64
  %532 = getelementptr inbounds i32, ptr %528, i64 %531
  %533 = getelementptr inbounds [20 x i8], ptr %37, i64 0, i64 0
  %534 = getelementptr inbounds i8, ptr %533, i64 20
  %535 = load i32, ptr %36, align 4, !tbaa !9
  %536 = sext i32 %535 to i64
  %537 = sub i64 0, %536
  %538 = getelementptr inbounds i8, ptr %534, i64 %537
  %539 = load i32, ptr %36, align 4, !tbaa !9
  %540 = call i32 @cpFromOctStr_BNU32(ptr noundef %532, ptr noundef %538, i32 noundef %539)
  br label %541

541:                                              ; preds = %519, %509
  %542 = load ptr, ptr %20, align 8, !tbaa !5
  %543 = call ptr @cpBN_OneRef()
  %544 = load ptr, ptr %20, align 8, !tbaa !5
  %545 = call i32 @ippsAdd_BN(ptr noundef %542, ptr noundef %543, ptr noundef %544)
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #4
  br label %546

546:                                              ; preds = %541
  %547 = load i32, ptr %48, align 4, !tbaa !9
  %548 = add nsw i32 %547, 1
  store i32 %548, ptr %48, align 4, !tbaa !9
  br label %474, !llvm.loop !31

549:                                              ; preds = %474
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #4
  %550 = load i32, ptr %25, align 4, !tbaa !9
  %551 = and i32 %550, 63
  %552 = sub nsw i32 64, %551
  %553 = and i32 %552, 63
  %554 = zext i32 %553 to i64
  %555 = lshr i64 -1, %554
  store i64 %555, ptr %50, align 8, !tbaa !21
  %556 = load i32, ptr %25, align 4, !tbaa !9
  %557 = add nsw i32 %556, 64
  %558 = sub nsw i32 %557, 1
  %559 = sdiv i32 %558, 64
  %560 = load ptr, ptr %17, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct._cpBigNum, ptr %560, i32 0, i32 2
  store i32 %559, ptr %561, align 8, !tbaa !19
  %562 = load i64, ptr %50, align 8, !tbaa !21
  %563 = load ptr, ptr %17, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct._cpBigNum, ptr %563, i32 0, i32 4
  %565 = load ptr, ptr %564, align 8, !tbaa !20
  %566 = load ptr, ptr %17, align 8, !tbaa !5
  %567 = getelementptr inbounds %struct._cpBigNum, ptr %566, i32 0, i32 2
  %568 = load i32, ptr %567, align 8, !tbaa !19
  %569 = sub nsw i32 %568, 1
  %570 = sext i32 %569 to i64
  %571 = getelementptr inbounds i64, ptr %565, i64 %570
  %572 = load i64, ptr %571, align 8, !tbaa !21
  %573 = and i64 %572, %562
  store i64 %573, ptr %571, align 8, !tbaa !21
  %574 = load i32, ptr %25, align 4, !tbaa !9
  %575 = sub nsw i32 %574, 1
  %576 = srem i32 %575, 8
  %577 = shl i32 1, %576
  %578 = and i32 %577, 255
  %579 = load ptr, ptr %17, align 8, !tbaa !5
  %580 = getelementptr inbounds %struct._cpBigNum, ptr %579, i32 0, i32 4
  %581 = load ptr, ptr %580, align 8, !tbaa !20
  %582 = load i32, ptr %25, align 4, !tbaa !9
  %583 = sub nsw i32 %582, 1
  %584 = sdiv i32 %583, 8
  %585 = sext i32 %584 to i64
  %586 = getelementptr inbounds i8, ptr %581, i64 %585
  %587 = load i8, ptr %586, align 1, !tbaa !26
  %588 = zext i8 %587 to i32
  %589 = or i32 %588, %578
  %590 = trunc i32 %589 to i8
  store i8 %590, ptr %586, align 1, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #4
  %591 = load ptr, ptr %18, align 8, !tbaa !5
  %592 = load ptr, ptr %18, align 8, !tbaa !5
  %593 = load ptr, ptr %21, align 8, !tbaa !5
  %594 = call i32 @ippsAdd_BN(ptr noundef %591, ptr noundef %592, ptr noundef %593)
  %595 = load ptr, ptr %17, align 8, !tbaa !5
  %596 = load ptr, ptr %21, align 8, !tbaa !5
  %597 = load ptr, ptr %21, align 8, !tbaa !5
  %598 = call i32 @ippsMod_BN(ptr noundef %595, ptr noundef %596, ptr noundef %597)
  %599 = load ptr, ptr %17, align 8, !tbaa !5
  %600 = load ptr, ptr %21, align 8, !tbaa !5
  %601 = load ptr, ptr %17, align 8, !tbaa !5
  %602 = call i32 @ippsSub_BN(ptr noundef %599, ptr noundef %600, ptr noundef %601)
  %603 = load ptr, ptr %17, align 8, !tbaa !5
  %604 = call ptr @cpBN_OneRef()
  %605 = load ptr, ptr %17, align 8, !tbaa !5
  %606 = call i32 @ippsAdd_BN(ptr noundef %603, ptr noundef %604, ptr noundef %605)
  %607 = load ptr, ptr %17, align 8, !tbaa !5
  %608 = load ptr, ptr %19, align 8, !tbaa !5
  %609 = call i32 @cpBN_cmp(ptr noundef %607, ptr noundef %608)
  %610 = icmp slt i32 0, %609
  br i1 %610, label %611, label %627

611:                                              ; preds = %549
  %612 = load ptr, ptr %17, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct._cpBigNum, ptr %612, i32 0, i32 4
  %614 = load ptr, ptr %613, align 8, !tbaa !20
  %615 = load ptr, ptr %17, align 8, !tbaa !5
  %616 = getelementptr inbounds %struct._cpBigNum, ptr %615, i32 0, i32 2
  %617 = load i32, ptr %616, align 8, !tbaa !19
  %618 = load i32, ptr %10, align 4, !tbaa !9
  %619 = load ptr, ptr %30, align 8, !tbaa !5
  %620 = load ptr, ptr %14, align 8, !tbaa !5
  %621 = load ptr, ptr %15, align 8, !tbaa !5
  %622 = call i32 @cpPrimeTest(ptr noundef %614, i32 noundef %617, i32 noundef %618, ptr noundef %619, ptr noundef %620, ptr noundef %621)
  store i32 %622, ptr %41, align 4, !tbaa !9
  %623 = load i32, ptr %41, align 4, !tbaa !9
  %624 = icmp ne i32 %623, 0
  br i1 %624, label %625, label %626

625:                                              ; preds = %611
  store i32 11, ptr %24, align 4
  br label %628

626:                                              ; preds = %611
  br label %627

627:                                              ; preds = %626, %549
  store i32 0, ptr %24, align 4
  br label %628

628:                                              ; preds = %627, %625
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #4
  %629 = load i32, ptr %24, align 4
  switch i32 %629, label %798 [
    i32 0, label %630
    i32 11, label %634
  ]

630:                                              ; preds = %628
  br label %631

631:                                              ; preds = %630
  %632 = load i32, ptr %42, align 4, !tbaa !9
  %633 = add nsw i32 %632, 1
  store i32 %633, ptr %42, align 4, !tbaa !9
  br label %460, !llvm.loop !32

634:                                              ; preds = %628, %469
  %635 = load i32, ptr %29, align 4, !tbaa !9
  %636 = mul nsw i32 %635, 4096
  %637 = load i32, ptr %42, align 4, !tbaa !9
  %638 = icmp sle i32 %636, %637
  br i1 %638, label %639, label %640

639:                                              ; preds = %634
  store i32 25, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %790

640:                                              ; preds = %634
  %641 = load ptr, ptr %13, align 8, !tbaa !5
  %642 = icmp ne ptr %641, null
  br i1 %642, label %643, label %646

643:                                              ; preds = %640
  %644 = load i32, ptr %42, align 4, !tbaa !9
  %645 = load ptr, ptr %13, align 8, !tbaa !5
  store i32 %644, ptr %645, align 4, !tbaa !9
  br label %646

646:                                              ; preds = %643, %640
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #4
  store i32 0, ptr %51, align 4, !tbaa !9
  br label %647

647:                                              ; preds = %669, %646
  %648 = load i32, ptr %51, align 4, !tbaa !9
  %649 = load ptr, ptr %18, align 8, !tbaa !5
  %650 = getelementptr inbounds %struct._cpBigNum, ptr %649, i32 0, i32 2
  %651 = load i32, ptr %650, align 8, !tbaa !19
  %652 = icmp slt i32 %648, %651
  br i1 %652, label %653, label %672

653:                                              ; preds = %647
  %654 = load ptr, ptr %18, align 8, !tbaa !5
  %655 = getelementptr inbounds %struct._cpBigNum, ptr %654, i32 0, i32 4
  %656 = load ptr, ptr %655, align 8, !tbaa !20
  %657 = load i32, ptr %51, align 4, !tbaa !9
  %658 = sext i32 %657 to i64
  %659 = getelementptr inbounds i64, ptr %656, i64 %658
  %660 = load i64, ptr %659, align 8, !tbaa !21
  %661 = load ptr, ptr %11, align 8, !tbaa !5
  %662 = getelementptr inbounds %struct._cpDLP, ptr %661, i32 0, i32 7
  %663 = load ptr, ptr %662, align 8, !tbaa !33
  %664 = getelementptr inbounds %struct._gsModEngine, ptr %663, i32 0, i32 8
  %665 = load ptr, ptr %664, align 8, !tbaa !34
  %666 = load i32, ptr %51, align 4, !tbaa !9
  %667 = sext i32 %666 to i64
  %668 = getelementptr inbounds i64, ptr %665, i64 %667
  store i64 %660, ptr %668, align 8, !tbaa !21
  br label %669

669:                                              ; preds = %653
  %670 = load i32, ptr %51, align 4, !tbaa !9
  %671 = add nsw i32 %670, 1
  store i32 %671, ptr %51, align 4, !tbaa !9
  br label %647, !llvm.loop !36

672:                                              ; preds = %647
  br label %673

673:                                              ; preds = %691, %672
  %674 = load i32, ptr %51, align 4, !tbaa !9
  %675 = load ptr, ptr %11, align 8, !tbaa !5
  %676 = getelementptr inbounds %struct._cpDLP, ptr %675, i32 0, i32 3
  %677 = load i32, ptr %676, align 4, !tbaa !13
  %678 = add nsw i32 %677, 64
  %679 = sub nsw i32 %678, 1
  %680 = sdiv i32 %679, 64
  %681 = icmp slt i32 %674, %680
  br i1 %681, label %682, label %694

682:                                              ; preds = %673
  %683 = load ptr, ptr %11, align 8, !tbaa !5
  %684 = getelementptr inbounds %struct._cpDLP, ptr %683, i32 0, i32 7
  %685 = load ptr, ptr %684, align 8, !tbaa !33
  %686 = getelementptr inbounds %struct._gsModEngine, ptr %685, i32 0, i32 8
  %687 = load ptr, ptr %686, align 8, !tbaa !34
  %688 = load i32, ptr %51, align 4, !tbaa !9
  %689 = sext i32 %688 to i64
  %690 = getelementptr inbounds i64, ptr %687, i64 %689
  store i64 0, ptr %690, align 8, !tbaa !21
  br label %691

691:                                              ; preds = %682
  %692 = load i32, ptr %51, align 4, !tbaa !9
  %693 = add nsw i32 %692, 1
  store i32 %693, ptr %51, align 4, !tbaa !9
  br label %673, !llvm.loop !37

694:                                              ; preds = %673
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #4
  %695 = load ptr, ptr %11, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct._cpDLP, ptr %695, i32 0, i32 5
  %697 = load ptr, ptr %696, align 8, !tbaa !38
  %698 = load ptr, ptr %17, align 8, !tbaa !5
  %699 = getelementptr inbounds %struct._cpBigNum, ptr %698, i32 0, i32 4
  %700 = load ptr, ptr %699, align 8, !tbaa !20
  %701 = load i32, ptr %25, align 4, !tbaa !9
  %702 = call ptr @gsModArithDLP()
  %703 = call i32 @gsModEngineInit(ptr noundef %697, ptr noundef %700, i32 noundef %701, i32 noundef 6, ptr noundef %702)
  %704 = load ptr, ptr %17, align 8, !tbaa !5
  %705 = call ptr @cpBN_OneRef()
  %706 = load ptr, ptr %21, align 8, !tbaa !5
  %707 = call i32 @ippsSub_BN(ptr noundef %704, ptr noundef %705, ptr noundef %706)
  %708 = load ptr, ptr %21, align 8, !tbaa !5
  %709 = load ptr, ptr %18, align 8, !tbaa !5
  %710 = load ptr, ptr %20, align 8, !tbaa !5
  %711 = load ptr, ptr %19, align 8, !tbaa !5
  %712 = call i32 @ippsDiv_BN(ptr noundef %708, ptr noundef %709, ptr noundef %710, ptr noundef %711)
  %713 = load ptr, ptr %18, align 8, !tbaa !5
  %714 = call ptr @cpBN_OneRef()
  %715 = load ptr, ptr %11, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct._cpDLP, ptr %715, i32 0, i32 5
  %717 = load ptr, ptr %716, align 8, !tbaa !38
  call void @cpMontEnc_BN(ptr noundef %713, ptr noundef %714, ptr noundef %717)
  %718 = load ptr, ptr %19, align 8, !tbaa !5
  %719 = getelementptr inbounds %struct._cpBigNum, ptr %718, i32 0, i32 1
  store i32 1, ptr %719, align 4, !tbaa !39
  store i32 0, ptr %42, align 4, !tbaa !9
  br label %720

720:                                              ; preds = %777, %694
  %721 = load i32, ptr %42, align 4, !tbaa !9
  %722 = icmp slt i32 %721, 4096
  br i1 %722, label %723, label %780

723:                                              ; preds = %720
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #4
  %724 = load i32, ptr %25, align 4, !tbaa !9
  %725 = add nsw i32 %724, 64
  %726 = sub nsw i32 %725, 1
  %727 = sdiv i32 %726, 64
  store i32 %727, ptr %52, align 4, !tbaa !9
  %728 = load ptr, ptr %14, align 8, !tbaa !5
  %729 = load ptr, ptr %19, align 8, !tbaa !5
  %730 = getelementptr inbounds %struct._cpBigNum, ptr %729, i32 0, i32 4
  %731 = load ptr, ptr %730, align 8, !tbaa !20
  %732 = load i32, ptr %25, align 4, !tbaa !9
  %733 = load ptr, ptr %15, align 8, !tbaa !5
  %734 = call i32 %728(ptr noundef %731, i32 noundef %732, ptr noundef %733)
  %735 = load ptr, ptr %19, align 8, !tbaa !5
  %736 = getelementptr inbounds %struct._cpBigNum, ptr %735, i32 0, i32 4
  %737 = load ptr, ptr %736, align 8, !tbaa !20
  %738 = load i32, ptr %52, align 4, !tbaa !9
  %739 = call i32 @cpFix_BNU(ptr noundef %737, i32 noundef %738)
  store i32 %739, ptr %52, align 4, !tbaa !9
  %740 = load i32, ptr %52, align 4, !tbaa !9
  %741 = load ptr, ptr %19, align 8, !tbaa !5
  %742 = getelementptr inbounds %struct._cpBigNum, ptr %741, i32 0, i32 2
  store i32 %740, ptr %742, align 8, !tbaa !19
  %743 = load ptr, ptr %19, align 8, !tbaa !5
  %744 = load ptr, ptr %17, align 8, !tbaa !5
  %745 = load ptr, ptr %19, align 8, !tbaa !5
  %746 = call i32 @ippsMod_BN(ptr noundef %743, ptr noundef %744, ptr noundef %745)
  %747 = load ptr, ptr %19, align 8, !tbaa !5
  %748 = getelementptr inbounds %struct._cpBigNum, ptr %747, i32 0, i32 4
  %749 = load ptr, ptr %748, align 8, !tbaa !20
  %750 = load ptr, ptr %19, align 8, !tbaa !5
  %751 = getelementptr inbounds %struct._cpBigNum, ptr %750, i32 0, i32 2
  %752 = load i32, ptr %751, align 8, !tbaa !19
  %753 = call i32 @cpEqu_BNU_CHUNK(ptr noundef %749, i32 noundef %752, i64 noundef 0)
  %754 = icmp ne i32 %753, 0
  br i1 %754, label %773, label %755

755:                                              ; preds = %723
  %756 = load ptr, ptr %19, align 8, !tbaa !5
  %757 = load ptr, ptr %19, align 8, !tbaa !5
  %758 = load ptr, ptr %11, align 8, !tbaa !5
  %759 = getelementptr inbounds %struct._cpDLP, ptr %758, i32 0, i32 5
  %760 = load ptr, ptr %759, align 8, !tbaa !38
  call void @cpMontEnc_BN(ptr noundef %756, ptr noundef %757, ptr noundef %760)
  %761 = load ptr, ptr %19, align 8, !tbaa !5
  %762 = load ptr, ptr %19, align 8, !tbaa !5
  %763 = load ptr, ptr %20, align 8, !tbaa !5
  %764 = load ptr, ptr %11, align 8, !tbaa !5
  %765 = getelementptr inbounds %struct._cpDLP, ptr %764, i32 0, i32 5
  %766 = load ptr, ptr %765, align 8, !tbaa !38
  call void @cpMontExpBin_BN(ptr noundef %761, ptr noundef %762, ptr noundef %763, ptr noundef %766)
  %767 = load ptr, ptr %19, align 8, !tbaa !5
  %768 = load ptr, ptr %18, align 8, !tbaa !5
  %769 = call i32 @cpBN_cmp(ptr noundef %767, ptr noundef %768)
  %770 = icmp ne i32 %769, 0
  br i1 %770, label %771, label %772

771:                                              ; preds = %755
  store i32 23, ptr %24, align 4
  br label %774

772:                                              ; preds = %755
  br label %773

773:                                              ; preds = %772, %723
  store i32 0, ptr %24, align 4
  br label %774

774:                                              ; preds = %773, %771
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #4
  %775 = load i32, ptr %24, align 4
  switch i32 %775, label %798 [
    i32 0, label %776
    i32 23, label %780
  ]

776:                                              ; preds = %774
  br label %777

777:                                              ; preds = %776
  %778 = load i32, ptr %42, align 4, !tbaa !9
  %779 = add nsw i32 %778, 1
  store i32 %779, ptr %42, align 4, !tbaa !9
  br label %720, !llvm.loop !40

780:                                              ; preds = %774, %720
  %781 = load i32, ptr %42, align 4, !tbaa !9
  %782 = icmp eq i32 4096, %781
  br i1 %782, label %783, label %784

783:                                              ; preds = %780
  store i32 25, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %790

784:                                              ; preds = %780
  %785 = load ptr, ptr %11, align 8, !tbaa !5
  %786 = getelementptr inbounds %struct._cpDLP, ptr %785, i32 0, i32 8
  %787 = load ptr, ptr %786, align 8, !tbaa !41
  %788 = load ptr, ptr %19, align 8, !tbaa !5
  %789 = call ptr @cpBN_copy(ptr noundef %787, ptr noundef %788)
  store i32 0, ptr %24, align 4
  br label %790

790:                                              ; preds = %784, %783, %639, %450
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #4
  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 8, 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 8, 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
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  %791 = load i32, ptr %24, align 4
  switch i32 %791, label %795 [
    i32 0, label %792
  ]

792:                                              ; preds = %790
  %793 = load ptr, ptr %11, align 8, !tbaa !5
  %794 = getelementptr inbounds %struct._cpDLP, ptr %793, i32 0, i32 1
  store i32 7, ptr %794, align 4, !tbaa !16
  store i32 0, ptr %8, align 4
  store i32 1, ptr %24, align 4
  br label %795

795:                                              ; preds = %792, %790, %177, %167, %150, %141, %118
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 4, 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 %796

796:                                              ; preds = %795, %92, %88, %84, %77, %71, %65, %55
  %797 = load i32, ptr %8, align 4
  ret i32 %797

798:                                              ; preds = %774, %628
  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

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 @ippsSet_BN(i32 noundef, i32 noundef, ptr noundef, ptr noundef) #3

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

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

declare i32 @cpNLZ_BNU32(i32 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 @cpFromOctStr_BNU32(ptr noundef, ptr noundef, i32 noundef) #3

declare ptr @cpBN_OneRef() #3

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

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

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

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

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontExpBin_BN(ptr noundef, ptr noundef, 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 = distinct !{!32, !28}
!33 = !{!12, !6, i64 40}
!34 = !{!35, !6, i64 48}
!35 = !{!"_gsModEngine", !6, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !22, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !10, i64 96, !10, i64 100, !6, i64 104}
!36 = distinct !{!36, !28}
!37 = distinct !{!37, !28}
!38 = !{!12, !6, i64 24}
!39 = !{!18, !10, i64 4}
!40 = distinct !{!40, !28}
!41 = !{!12, !6, i64 48}


; 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 noundef i32 @ippsDLPGenerateDH(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 %360, 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 %360

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

24:                                               ; preds = %20
  %25 = getelementptr inbounds i8, ptr %2, i64 8
  %26 = load i32, ptr %25, align 8, !tbaa !12
  %27 = icmp sgt i32 %26, 511
  %28 = and i32 %26, 255
  %.not = icmp eq i32 %28, 0
  %or.cond = and i1 %27, %.not
  br i1 %or.cond, label %29, label %360

29:                                               ; preds = %24
  %30 = icmp slt i32 %1, 1
  br i1 %30, label %360, label %31

31:                                               ; preds = %29
  %32 = icmp eq ptr %5, null
  br i1 %32, label %360, label %33

33:                                               ; preds = %31
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #6
  %34 = getelementptr inbounds i8, ptr %2, i64 88
  %35 = load ptr, ptr %34, align 8, !tbaa !13
  store ptr %35, ptr %8, align 8, !tbaa !14
  %36 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #6
  %37 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #6
  %38 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #6
  %39 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #6
  %40 = call ptr @cpBigNumListGet(ptr noundef nonnull %8) #6
  %41 = load i32, ptr %21, align 4, !tbaa !11
  %42 = getelementptr inbounds i8, ptr %2, i64 4
  store i32 0, ptr %42, align 4, !tbaa !15
  %.not273 = icmp eq ptr %0, null
  br i1 %.not273, label %70, label %43

43:                                               ; preds = %33
  %44 = load i32, ptr %0, align 8, !tbaa !16
  %45 = call i64 @IPP_UINT_PTR(ptr noundef nonnull %0)
  %46 = trunc i64 %45 to i32
  %47 = xor i32 %44, %46
  %48 = icmp eq i32 %47, 1112098638
  br i1 %48, label %49, label %359

49:                                               ; preds = %43
  %50 = getelementptr inbounds i8, ptr %0, i64 8
  %51 = load i32, ptr %50, align 8, !tbaa !18
  %52 = shl nsw i32 %51, 6
  %53 = getelementptr inbounds i8, ptr %0, i64 16
  %54 = load ptr, ptr %53, align 8, !tbaa !19
  %55 = sext i32 %51 to i64
  %56 = getelementptr i64, ptr %54, i64 %55
  %57 = getelementptr i8, ptr %56, i64 -8
  %58 = load i64, ptr %57, align 8, !tbaa !20
  %59 = call i32 @cpNLZ_BNU(i64 noundef %58) #6
  %60 = sub nsw i32 %52, %59
  %61 = load i32, ptr %21, align 4, !tbaa !11
  %62 = icmp sgt i32 %61, %60
  br i1 %62, label %359, label %63

63:                                               ; preds = %49
  %64 = getelementptr inbounds i8, ptr %39, i64 12
  %65 = load i32, ptr %64, align 4, !tbaa !22
  %66 = load i32, ptr %50, align 8, !tbaa !18
  %67 = icmp slt i32 %65, %66
  br i1 %67, label %359, label %68

68:                                               ; preds = %63
  %69 = call ptr @cpBN_copy(ptr noundef nonnull %39, ptr noundef nonnull %0)
  br label %70

70:                                               ; preds = %68, %33
  %.0249 = phi i32 [ %60, %68 ], [ %41, %33 ]
  %.0246 = phi i32 [ 0, %68 ], [ 1, %33 ]
  %.not274 = icmp eq ptr %3, null
  br i1 %.not274, label %._crit_edge348, label %71

._crit_edge348:                                   ; preds = %70
  %.pre = load i32, ptr %21, align 4, !tbaa !11
  br label %83

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

77:                                               ; preds = %71
  %78 = load i32, ptr %21, align 4, !tbaa !11
  %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 sgt i32 %78, %81
  br i1 %82, label %359, label %83

83:                                               ; preds = %._crit_edge348, %77
  %84 = phi i32 [ %.pre, %._crit_edge348 ], [ %78, %77 ]
  %85 = load i32, ptr %25, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #6
  %86 = add nsw i32 %84, 159
  %87 = sdiv i32 %86, 160
  store i32 %87, ptr %9, align 4, !tbaa !23
  %88 = add nsw i32 %85, 159
  %89 = getelementptr inbounds i8, ptr %2, i64 72
  %90 = load ptr, ptr %89, align 8, !tbaa !24
  %91 = getelementptr inbounds i8, ptr %39, i64 16
  %92 = load ptr, ptr %91, align 8, !tbaa !19
  %93 = getelementptr inbounds i8, ptr %40, i64 16
  %94 = load ptr, ptr %93, align 8, !tbaa !19
  %95 = add nsw i32 %.0249, 31
  %96 = ashr i32 %95, 5
  %97 = getelementptr inbounds i8, ptr %39, i64 24
  %98 = load ptr, ptr %97, align 8, !tbaa !25
  %99 = getelementptr inbounds i8, ptr %40, i64 24
  %100 = load ptr, ptr %99, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 20, ptr nonnull %10) #6
  call void @llvm.lifetime.start.p0(i64 20, ptr nonnull %11) #6
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %12) #6
  %101 = call i32 @ippsHashMethodSet_SHA1(ptr noundef nonnull %12) #6
  %102 = call i32 @ippsSet_BN(i32 noundef 1, i32 noundef 1, ptr noundef nonnull %9, ptr noundef %36) #6
  %invariant.gep = getelementptr i8, ptr %92, i64 -4
  %invariant.gep308 = getelementptr i8, ptr %94, i64 -4
  %103 = getelementptr inbounds i8, ptr %39, i64 8
  %104 = getelementptr inbounds i8, ptr %40, i64 8
  %105 = getelementptr inbounds i8, ptr %37, i64 16
  %106 = add i32 %84, 7
  %107 = getelementptr inbounds i8, ptr %10, i64 20
  %108 = sub i32 0, %84
  %109 = and i32 %108, 63
  %110 = zext nneg i32 %109 to i64
  %111 = lshr i64 -1, %110
  %112 = add nsw i32 %84, 63
  %113 = sdiv i32 %112, 64
  %114 = getelementptr inbounds i8, ptr %37, i64 8
  %115 = sext i32 %113 to i64
  %116 = add nsw i32 %84, -1
  %117 = and i32 %116, 7
  %118 = shl nuw nsw i32 1, %117
  %119 = sdiv i32 %116, 8
  %120 = sext i32 %119 to i64
  %121 = trunc nuw i32 %118 to i8
  %122 = getelementptr inbounds i8, ptr %11, i64 16
  %123 = getelementptr inbounds i8, ptr %10, i64 16
  br label %124

124:                                              ; preds = %83, %._crit_edge
  %.1247312 = phi i32 [ %.0246, %83 ], [ %spec.select, %._crit_edge ]
  %.0259311 = phi i32 [ 0, %83 ], [ %201, %._crit_edge ]
  %.not283 = icmp eq i32 %.1247312, 0
  br i1 %.not283, label %128, label %125

125:                                              ; preds = %124
  %126 = call i32 %5(ptr noundef %92, i32 noundef %.0249, ptr noundef %6) #6
  %127 = call i32 @ippsSet_BN(i32 noundef 1, i32 noundef %96, ptr noundef %92, ptr noundef %39) #6
  br label %128

128:                                              ; preds = %125, %124
  br i1 %.not274, label %131, label %129

129:                                              ; preds = %128
  %130 = call ptr @cpBN_copy(ptr noundef nonnull %3, ptr noundef %39)
  br label %131

131:                                              ; preds = %129, %128
  %132 = call i32 @ippsAdd_BN(ptr noundef %39, ptr noundef %36, ptr noundef %40) #6
  %133 = call ptr @cpBN_zero(ptr noundef %37)
  %134 = load i32, ptr %9, align 4, !tbaa !23
  %135 = icmp sgt i32 %134, 0
  br i1 %135, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %131, %180
  %indvars.iv = phi i64 [ %indvars.iv.next, %180 ], [ 0, %131 ]
  %136 = load i32, ptr %103, align 8, !tbaa !18
  %137 = shl nsw i32 %136, 1
  %138 = shl nsw i32 %136, 6
  %139 = sext i32 %137 to i64
  %gep = getelementptr i32, ptr %invariant.gep, i64 %139
  %140 = load i32, ptr %gep, align 4, !tbaa !23
  %141 = call i32 @cpNLZ_BNU32(i32 noundef %140) #6
  %142 = or disjoint i32 %138, 7
  %143 = sub i32 %142, %141
  %144 = ashr i32 %143, 3
  %145 = call i32 @cpToOctStr_BNU32(ptr noundef %98, i32 noundef %144, ptr noundef %92, i32 noundef %137) #6
  %146 = call i32 @ippsHashMessage_rmf(ptr noundef %98, i32 noundef %144, ptr noundef nonnull %10, ptr noundef nonnull %12) #6
  %147 = load i32, ptr %104, align 8, !tbaa !18
  %148 = shl nsw i32 %147, 1
  %149 = shl nsw i32 %147, 6
  %150 = sext i32 %148 to i64
  %gep309 = getelementptr i32, ptr %invariant.gep308, i64 %150
  %151 = load i32, ptr %gep309, align 4, !tbaa !23
  %152 = call i32 @cpNLZ_BNU32(i32 noundef %151) #6
  %153 = or disjoint i32 %149, 7
  %154 = sub i32 %153, %152
  %155 = ashr i32 %154, 3
  %156 = call i32 @cpToOctStr_BNU32(ptr noundef %100, i32 noundef %155, ptr noundef %94, i32 noundef %96) #6
  %157 = call i32 @ippsHashMessage_rmf(ptr noundef %100, i32 noundef %155, ptr noundef nonnull %11, ptr noundef nonnull %12) #6
  %158 = load <16 x i8>, ptr %11, align 16, !tbaa !26
  %159 = load <16 x i8>, ptr %10, align 16, !tbaa !26
  %160 = xor <16 x i8> %159, %158
  store <16 x i8> %160, ptr %10, align 16, !tbaa !26
  %161 = load <4 x i8>, ptr %122, align 16, !tbaa !26
  %162 = load <4 x i8>, ptr %123, align 16, !tbaa !26
  %163 = xor <4 x i8> %162, %161
  store <4 x i8> %163, ptr %123, align 16, !tbaa !26
  %164 = load i32, ptr %9, align 4, !tbaa !23
  %165 = add nsw i32 %164, -1
  %166 = zext i32 %165 to i64
  %.not285 = icmp eq i64 %indvars.iv, %166
  br i1 %.not285, label %171, label %167

167:                                              ; preds = %.lr.ph
  %168 = load ptr, ptr %105, align 8, !tbaa !19
  %.idx = mul i64 %indvars.iv, 20
  %169 = getelementptr inbounds i8, ptr %168, i64 %.idx
  %170 = call i32 @cpFromOctStr_BNU32(ptr noundef %169, ptr noundef nonnull %10, i32 noundef 20) #6
  br label %180

171:                                              ; preds = %.lr.ph
  %172 = trunc nuw nsw i64 %indvars.iv to i32
  %.neg286 = mul i32 %172, -160
  %173 = add i32 %106, %.neg286
  %174 = ashr i32 %173, 3
  %175 = load ptr, ptr %105, align 8, !tbaa !19
  %.idx349 = mul nuw nsw i64 %indvars.iv, 20
  %176 = getelementptr inbounds i8, ptr %175, i64 %.idx349
  %narrow287 = sub nsw i32 0, %174
  %177 = sext i32 %narrow287 to i64
  %178 = getelementptr inbounds i8, ptr %107, i64 %177
  %179 = call i32 @cpFromOctStr_BNU32(ptr noundef %176, ptr noundef nonnull %178, i32 noundef %174) #6
  br label %180

180:                                              ; preds = %171, %167
  %181 = call ptr @cpBN_OneRef() #6
  %182 = call i32 @ippsAdd_BN(ptr noundef nonnull %39, ptr noundef %181, ptr noundef nonnull %39) #6
  %183 = call ptr @cpBN_OneRef() #6
  %184 = call i32 @ippsAdd_BN(ptr noundef nonnull %40, ptr noundef %183, ptr noundef nonnull %40) #6
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %185 = load i32, ptr %9, align 4, !tbaa !23
  %186 = sext i32 %185 to i64
  %187 = icmp slt i64 %indvars.iv.next, %186
  br i1 %187, label %.lr.ph, label %._crit_edge, !llvm.loop !27

._crit_edge:                                      ; preds = %180, %131
  store i32 %113, ptr %114, align 8, !tbaa !18
  %188 = load ptr, ptr %105, align 8, !tbaa !19
  %189 = getelementptr i64, ptr %188, i64 %115
  %190 = getelementptr i8, ptr %189, i64 -8
  %191 = load i64, ptr %190, align 8, !tbaa !20
  %192 = and i64 %191, %111
  store i64 %192, ptr %190, align 8, !tbaa !20
  %193 = getelementptr inbounds i8, ptr %188, i64 %120
  %194 = load i8, ptr %193, align 1, !tbaa !26
  %195 = or i8 %194, %121
  store i8 %195, ptr %193, align 1, !tbaa !26
  %196 = load ptr, ptr %105, align 8, !tbaa !19
  %197 = load i64, ptr %196, align 8, !tbaa !20
  %198 = or i64 %197, 1
  store i64 %198, ptr %196, align 8, !tbaa !20
  %199 = load i32, ptr %114, align 8, !tbaa !18
  %200 = call i32 @cpPrimeTest(ptr noundef nonnull %196, i32 noundef %199, i32 noundef %1, ptr noundef %90, ptr noundef nonnull %5, ptr noundef %6) #6
  %.not284 = icmp eq i32 %200, 0
  %spec.select = select i1 %.not284, i32 1, i32 %.1247312
  %201 = add nuw nsw i32 %.0259311, 1
  %202 = icmp ult i32 %.0259311, 4095
  %203 = and i1 %202, %.not284
  br i1 %203, label %124, label %204, !llvm.loop !29

204:                                              ; preds = %._crit_edge
  %205 = sdiv i32 %88, 160
  %206 = icmp eq i32 %201, 4096
  br i1 %206, label %.critedge301, label %207

207:                                              ; preds = %204
  %208 = call i32 @ippsAdd_BN(ptr noundef %39, ptr noundef %36, ptr noundef %39) #6
  %209 = add nsw i32 %85, -1
  %210 = call ptr @cpBN_power2(ptr noundef %38, i32 noundef %209)
  %211 = icmp sgt i32 %85, 0
  br i1 %211, label %.lr.ph321, label %.critedge301

.lr.ph321:                                        ; preds = %207
  %212 = shl i32 %85, 2
  %213 = add i32 %212, 4092
  %214 = and i32 %213, -4096
  %215 = add nsw i32 %205, -1
  %216 = getelementptr inbounds i8, ptr %36, i64 16
  %217 = add nuw i32 %85, 7
  %218 = sub nsw i32 0, %85
  %219 = and i32 %218, 63
  %220 = zext nneg i32 %219 to i64
  %221 = lshr i64 -1, %220
  %222 = add nuw nsw i32 %85, 63
  %223 = lshr i32 %222, 6
  %224 = getelementptr inbounds i8, ptr %36, i64 8
  %225 = zext nneg i32 %223 to i64
  %226 = and i32 %209, 7
  %227 = shl nuw nsw i32 1, %226
  %228 = lshr i32 %209, 3
  %229 = zext nneg i32 %228 to i64
  %230 = trunc nuw i32 %227 to i8
  %231 = zext i32 %215 to i64
  %smax = call i32 @llvm.smax.i32(i32 %205, i32 1)
  %smax337 = call i32 @llvm.smax.i32(i32 %214, i32 1)
  %wide.trip.count = zext nneg i32 %smax to i64
  %.neg = mul nsw i32 %215, -160
  %232 = add i32 %217, %.neg
  %233 = ashr i32 %232, 3
  %.idx351 = mul nuw nsw i64 %231, 20
  %narrow = sub nsw i32 0, %233
  %234 = sext i32 %narrow to i64
  %235 = getelementptr inbounds i8, ptr %107, i64 %234
  br label %.lr.ph317.preheader

.lr.ph317.preheader:                              ; preds = %select.unfold, %.lr.ph321
  %.1260319 = phi i32 [ 0, %.lr.ph321 ], [ %277, %select.unfold ]
  %236 = call ptr @cpBN_zero(ptr noundef %36)
  br label %.lr.ph317

.lr.ph317:                                        ; preds = %.lr.ph317.preheader, %255
  %indvars.iv334 = phi i64 [ 0, %.lr.ph317.preheader ], [ %indvars.iv.next335, %255 ]
  %237 = load i32, ptr %103, align 8, !tbaa !18
  %238 = shl nsw i32 %237, 1
  %239 = shl nsw i32 %237, 6
  %240 = sext i32 %238 to i64
  %gep314 = getelementptr i32, ptr %invariant.gep, i64 %240
  %241 = load i32, ptr %gep314, align 4, !tbaa !23
  %242 = call i32 @cpNLZ_BNU32(i32 noundef %241) #6
  %243 = or disjoint i32 %239, 7
  %244 = sub i32 %243, %242
  %245 = ashr i32 %244, 3
  %246 = call i32 @cpToOctStr_BNU32(ptr noundef %98, i32 noundef %245, ptr noundef %92, i32 noundef %238) #6
  %247 = call i32 @ippsHashMessage_rmf(ptr noundef %98, i32 noundef %245, ptr noundef nonnull %10, ptr noundef nonnull %12) #6
  %.not282 = icmp eq i64 %indvars.iv334, %231
  %248 = load ptr, ptr %216, align 8, !tbaa !19
  br i1 %.not282, label %252, label %249

249:                                              ; preds = %.lr.ph317
  %.idx350 = mul i64 %indvars.iv334, 20
  %250 = getelementptr inbounds i8, ptr %248, i64 %.idx350
  %251 = call i32 @cpFromOctStr_BNU32(ptr noundef %250, ptr noundef nonnull %10, i32 noundef 20) #6
  br label %255

252:                                              ; preds = %.lr.ph317
  %253 = getelementptr inbounds i8, ptr %248, i64 %.idx351
  %254 = call i32 @cpFromOctStr_BNU32(ptr noundef %253, ptr noundef nonnull %235, i32 noundef %233) #6
  br label %255

255:                                              ; preds = %252, %249
  %256 = call ptr @cpBN_OneRef() #6
  %257 = call i32 @ippsAdd_BN(ptr noundef nonnull %39, ptr noundef %256, ptr noundef nonnull %39) #6
  %indvars.iv.next335 = add nuw nsw i64 %indvars.iv334, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next335, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge318, label %.lr.ph317, !llvm.loop !30

._crit_edge318:                                   ; preds = %255
  store i32 %223, ptr %224, align 8, !tbaa !18
  %258 = load ptr, ptr %216, align 8, !tbaa !19
  %259 = getelementptr i64, ptr %258, i64 %225
  %260 = getelementptr i8, ptr %259, i64 -8
  %261 = load i64, ptr %260, align 8, !tbaa !20
  %262 = and i64 %261, %221
  store i64 %262, ptr %260, align 8, !tbaa !20
  %263 = getelementptr inbounds i8, ptr %258, i64 %229
  %264 = load i8, ptr %263, align 1, !tbaa !26
  %265 = or i8 %264, %230
  store i8 %265, ptr %263, align 1, !tbaa !26
  %266 = call i32 @ippsAdd_BN(ptr noundef %37, ptr noundef %37, ptr noundef %40) #6
  %267 = call i32 @ippsMod_BN(ptr noundef nonnull %36, ptr noundef %40, ptr noundef %40) #6
  %268 = call i32 @ippsSub_BN(ptr noundef nonnull %36, ptr noundef %40, ptr noundef nonnull %36) #6
  %269 = call ptr @cpBN_OneRef() #6
  %270 = call i32 @ippsAdd_BN(ptr noundef nonnull %36, ptr noundef %269, ptr noundef nonnull %36) #6
  %271 = call i32 @cpBN_cmp(ptr noundef nonnull %36, ptr noundef %38)
  %272 = icmp sgt i32 %271, 0
  br i1 %272, label %273, label %select.unfold

273:                                              ; preds = %._crit_edge318
  %274 = load ptr, ptr %216, align 8, !tbaa !19
  %275 = load i32, ptr %224, align 8, !tbaa !18
  %276 = call i32 @cpPrimeTest(ptr noundef %274, i32 noundef %275, i32 noundef %1, ptr noundef %90, ptr noundef nonnull %5, ptr noundef %6) #6
  %.not277 = icmp eq i32 %276, 0
  br i1 %.not277, label %select.unfold, label %278

select.unfold:                                    ; preds = %273, %._crit_edge318
  %277 = add nuw nsw i32 %.1260319, 1
  %exitcond338.not = icmp eq i32 %277, %smax337
  br i1 %exitcond338.not, label %.critedge301, label %.lr.ph317.preheader, !llvm.loop !31

278:                                              ; preds = %273
  %.not279 = icmp eq ptr %4, null
  br i1 %.not279, label %280, label %279

279:                                              ; preds = %278
  store i32 %.1260319, ptr %4, align 4, !tbaa !23
  br label %280

280:                                              ; preds = %279, %278
  %281 = load i32, ptr %114, align 8, !tbaa !18
  %282 = icmp sgt i32 %281, 0
  br i1 %282, label %.lr.ph324, label %.preheader

.lr.ph324:                                        ; preds = %280
  %283 = load ptr, ptr %105, align 8, !tbaa !19
  %284 = getelementptr inbounds i8, ptr %2, i64 40
  %285 = load ptr, ptr %284, align 8, !tbaa !32
  %286 = getelementptr inbounds i8, ptr %285, i64 48
  %287 = load ptr, ptr %286, align 8, !tbaa !33
  %wide.trip.count342 = zext nneg i32 %281 to i64
  %min.iters.check = icmp ult i32 %281, 6
  %288 = ptrtoint ptr %287 to i64
  %289 = ptrtoint ptr %283 to i64
  %290 = sub i64 %288, %289
  %diff.check = icmp ult i64 %290, 32
  %or.cond359 = select i1 %min.iters.check, i1 true, i1 %diff.check
  br i1 %or.cond359, label %scalar.ph.preheader, label %vector.ph

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

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader, %scalar.ph.prol
  %indvars.iv339.prol = phi i64 [ %indvars.iv.next340.prol, %scalar.ph.prol ], [ %indvars.iv339.ph, %scalar.ph.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph.prol ], [ 0, %scalar.ph.preheader ]
  %291 = getelementptr inbounds i64, ptr %283, i64 %indvars.iv339.prol
  %292 = load i64, ptr %291, align 8, !tbaa !20
  %293 = getelementptr inbounds i64, ptr %287, i64 %indvars.iv339.prol
  store i64 %292, ptr %293, align 8, !tbaa !20
  %indvars.iv.next340.prol = add nuw nsw i64 %indvars.iv339.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 %scalar.ph.prol.loopexit, label %scalar.ph.prol, !llvm.loop !35

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv339.unr = phi i64 [ %indvars.iv339.ph, %scalar.ph.preheader ], [ %indvars.iv.next340.prol, %scalar.ph.prol ]
  %294 = sub nsw i64 %indvars.iv339.ph, %wide.trip.count342
  %295 = icmp ugt i64 %294, -4
  br i1 %295, label %.preheader, label %scalar.ph

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

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %296 = getelementptr inbounds i64, ptr %283, i64 %index
  %297 = getelementptr inbounds i8, ptr %296, i64 16
  %wide.load = load <2 x i64>, ptr %296, align 8, !tbaa !20
  %wide.load356 = load <2 x i64>, ptr %297, align 8, !tbaa !20
  %298 = getelementptr inbounds i64, ptr %287, i64 %index
  %299 = getelementptr inbounds i8, ptr %298, i64 16
  store <2 x i64> %wide.load, ptr %298, align 8, !tbaa !20
  store <2 x i64> %wide.load356, ptr %299, align 8, !tbaa !20
  %index.next = add nuw i64 %index, 4
  %300 = icmp eq i64 %index.next, %n.vec
  br i1 %300, label %middle.block, label %vector.body, !llvm.loop !37

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count342
  br i1 %cmp.n, label %.preheader, label %scalar.ph.preheader

.preheader:                                       ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block, %280
  %.0244.lcssa = phi i32 [ 0, %280 ], [ %281, %middle.block ], [ %281, %scalar.ph ], [ %281, %scalar.ph.prol.loopexit ]
  %301 = load i32, ptr %21, align 4, !tbaa !11
  %302 = add nsw i32 %301, 63
  %303 = sdiv i32 %302, 64
  %304 = icmp slt i32 %.0244.lcssa, %303
  br i1 %304, label %.lr.ph326, label %._crit_edge327

.lr.ph326:                                        ; preds = %.preheader
  %305 = getelementptr inbounds i8, ptr %2, i64 40
  %306 = load ptr, ptr %305, align 8, !tbaa !32
  %307 = getelementptr inbounds i8, ptr %306, i64 48
  %308 = load ptr, ptr %307, align 8, !tbaa !33
  %309 = zext nneg i32 %.0244.lcssa to i64
  %310 = shl nuw nsw i64 %309, 3
  %scevgep = getelementptr i8, ptr %308, i64 %310
  %311 = xor i32 %.0244.lcssa, -1
  %312 = add i32 %303, %311
  %313 = zext i32 %312 to i64
  %314 = shl nuw nsw i64 %313, 3
  %315 = add nuw nsw i64 %314, 8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %scevgep, i8 0, i64 %315, i1 false), !tbaa !20
  br label %._crit_edge327

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv339 = phi i64 [ %indvars.iv.next340.3, %scalar.ph ], [ %indvars.iv339.unr, %scalar.ph.prol.loopexit ]
  %316 = getelementptr inbounds i64, ptr %283, i64 %indvars.iv339
  %317 = load i64, ptr %316, align 8, !tbaa !20
  %318 = getelementptr inbounds i64, ptr %287, i64 %indvars.iv339
  store i64 %317, ptr %318, align 8, !tbaa !20
  %indvars.iv.next340 = add nuw nsw i64 %indvars.iv339, 1
  %319 = getelementptr inbounds i64, ptr %283, i64 %indvars.iv.next340
  %320 = load i64, ptr %319, align 8, !tbaa !20
  %321 = getelementptr inbounds i64, ptr %287, i64 %indvars.iv.next340
  store i64 %320, ptr %321, align 8, !tbaa !20
  %indvars.iv.next340.1 = add nuw nsw i64 %indvars.iv339, 2
  %322 = getelementptr inbounds i64, ptr %283, i64 %indvars.iv.next340.1
  %323 = load i64, ptr %322, align 8, !tbaa !20
  %324 = getelementptr inbounds i64, ptr %287, i64 %indvars.iv.next340.1
  store i64 %323, ptr %324, align 8, !tbaa !20
  %indvars.iv.next340.2 = add nuw nsw i64 %indvars.iv339, 3
  %325 = getelementptr inbounds i64, ptr %283, i64 %indvars.iv.next340.2
  %326 = load i64, ptr %325, align 8, !tbaa !20
  %327 = getelementptr inbounds i64, ptr %287, i64 %indvars.iv.next340.2
  store i64 %326, ptr %327, align 8, !tbaa !20
  %indvars.iv.next340.3 = add nuw nsw i64 %indvars.iv339, 4
  %exitcond343.not.3 = icmp eq i64 %indvars.iv.next340.3, %wide.trip.count342
  br i1 %exitcond343.not.3, label %.preheader, label %scalar.ph, !llvm.loop !40

._crit_edge327:                                   ; preds = %.lr.ph326, %.preheader
  %328 = getelementptr inbounds i8, ptr %2, i64 24
  %329 = load ptr, ptr %328, align 8, !tbaa !41
  %330 = load ptr, ptr %216, align 8, !tbaa !19
  %331 = call ptr @gsModArithDLP() #6
  %332 = call i32 @gsModEngineInit(ptr noundef %329, ptr noundef %330, i32 noundef %85, i32 noundef 6, ptr noundef %331) #6
  %333 = call ptr @cpBN_OneRef() #6
  %334 = call i32 @ippsSub_BN(ptr noundef %36, ptr noundef %333, ptr noundef %40) #6
  %335 = call i32 @ippsDiv_BN(ptr noundef %40, ptr noundef %37, ptr noundef %39, ptr noundef %38) #6
  %336 = call ptr @cpBN_OneRef() #6
  %337 = load ptr, ptr %328, align 8, !tbaa !41
  call void @cpMontEnc_BN(ptr noundef %37, ptr noundef %336, ptr noundef %337)
  %338 = getelementptr inbounds i8, ptr %38, i64 4
  store i32 1, ptr %338, align 4, !tbaa !42
  %339 = getelementptr inbounds i8, ptr %38, i64 16
  %340 = getelementptr inbounds i8, ptr %38, i64 8
  br label %341

341:                                              ; preds = %._crit_edge327, %354
  %.2261328 = phi i32 [ 0, %._crit_edge327 ], [ %355, %354 ]
  %342 = load ptr, ptr %339, align 8, !tbaa !19
  %343 = call i32 %5(ptr noundef %342, i32 noundef %85, ptr noundef %6) #6
  %344 = load ptr, ptr %339, align 8, !tbaa !19
  %345 = call i32 @cpFix_BNU(ptr noundef %344, i32 noundef %223)
  store i32 %345, ptr %340, align 8, !tbaa !18
  %346 = call i32 @ippsMod_BN(ptr noundef nonnull %38, ptr noundef %36, ptr noundef nonnull %38) #6
  %347 = load ptr, ptr %339, align 8, !tbaa !19
  %348 = load i32, ptr %340, align 8, !tbaa !18
  %349 = call i32 @cpEqu_BNU_CHUNK(ptr noundef %347, i32 noundef %348, i64 noundef 0)
  %.not280 = icmp eq i32 %349, 0
  br i1 %.not280, label %350, label %354

350:                                              ; preds = %341
  %351 = load ptr, ptr %328, align 8, !tbaa !41
  call void @cpMontEnc_BN(ptr noundef nonnull %38, ptr noundef nonnull %38, ptr noundef %351)
  %352 = load ptr, ptr %328, align 8, !tbaa !41
  call void @cpMontExpBin_BN(ptr noundef nonnull %38, ptr noundef nonnull %38, ptr noundef %39, ptr noundef %352)
  %353 = call i32 @cpBN_cmp(ptr noundef nonnull %38, ptr noundef %37)
  %.not281 = icmp eq i32 %353, 0
  br i1 %.not281, label %354, label %.critedge

354:                                              ; preds = %341, %350
  %355 = add nuw nsw i32 %.2261328, 1
  %exitcond347.not = icmp eq i32 %355, 4096
  br i1 %exitcond347.not, label %.critedge301, label %341, !llvm.loop !43

.critedge:                                        ; preds = %350
  %356 = getelementptr inbounds i8, ptr %2, i64 48
  %357 = load ptr, ptr %356, align 8, !tbaa !44
  %358 = call ptr @cpBN_copy(ptr noundef %357, ptr noundef nonnull %38)
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %12) #6
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %10) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #6
  store i32 7, ptr %42, align 4, !tbaa !15
  br label %359

.critedge301:                                     ; preds = %select.unfold, %354, %207, %204
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %12) #6
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 20, ptr nonnull %10) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #6
  br label %359

359:                                              ; preds = %.critedge301, %77, %71, %63, %49, %43, %.critedge
  %.1 = phi i32 [ 0, %.critedge ], [ 25, %.critedge301 ], [ -13, %43 ], [ -7, %49 ], [ -7, %63 ], [ -13, %71 ], [ -7, %77 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #6
  br label %360

360:                                              ; preds = %31, %29, %24, %20, %14, %7, %359
  %.2 = phi i32 [ %.1, %359 ], [ -8, %7 ], [ -13, %14 ], [ -6, %20 ], [ -6, %24 ], [ -5, %29 ], [ -8, %31 ]
  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

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 @ippsSet_BN(i32 noundef, i32 noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

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

declare i32 @cpNLZ_BNU32(i32 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 @cpFromOctStr_BNU32(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #3

declare ptr @cpBN_OneRef() 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 @cpPrimeTest(ptr noundef, i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cpMontExpBin_BN(ptr noundef, ptr noundef, 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

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

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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { 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 = !{!7, !7, i64 0}
!24 = !{!6, !10, i64 72}
!25 = !{!17, !10, i64 24}
!26 = !{!8, !8, i64 0}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = distinct !{!29, !28}
!30 = distinct !{!30, !28}
!31 = distinct !{!31, !28}
!32 = !{!6, !10, i64 40}
!33 = !{!34, !10, i64 48}
!34 = !{!"_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, !21, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !7, i64 96, !7, i64 100, !10, i64 104}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.unroll.disable"}
!37 = distinct !{!37, !28, !38, !39}
!38 = !{!"llvm.loop.isvectorized", i32 1}
!39 = !{!"llvm.loop.unroll.runtime.disable"}
!40 = distinct !{!40, !28, !38}
!41 = !{!6, !10, i64 24}
!42 = !{!17, !7, i64 4}
!43 = distinct !{!43, !28}
!44 = !{!6, !10, i64 48}


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