; LLVM IR from cryspen/libcrux :: sys/hacl/c/src/msvc (Hacl_GenericField64)

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

@.str = external hidden unnamed_addr constant [70 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [91 x i8], align 1

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

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

declare i32 @printf(ptr noundef, ...) #1

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #3

; Function Attrs: nounwind uwtable
declare dso_local i32 @Hacl_GenericField64_field_get_len(ptr noundef) #4

declare void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef) #1

declare void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) #1

declare void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @Hacl_GenericField64_exp_consttime(ptr noundef %0, ptr noundef %1, i32 noundef %2, ptr noundef %3, ptr noundef %4) #4 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i32, align 4
  %26 = alloca i64, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca i64, align 8
  %30 = alloca i32, align 4
  %31 = alloca i64, align 8
  %32 = alloca i32, align 4
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca i32, align 4
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca ptr, align 8
  %45 = alloca ptr, align 8
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca ptr, align 8
  %55 = alloca ptr, align 8
  %56 = alloca ptr, align 8
  %57 = alloca ptr, align 8
  %58 = alloca ptr, align 8
  %59 = alloca ptr, align 8
  %60 = alloca ptr, align 8
  %61 = alloca ptr, align 8
  %62 = alloca ptr, align 8
  %63 = alloca ptr, align 8
  %64 = alloca ptr, align 8
  %65 = alloca ptr, align 8
  %66 = alloca ptr, align 8
  %67 = alloca ptr, align 8
  %68 = alloca ptr, align 8
  %69 = alloca i32, align 4
  %70 = alloca i64, align 8
  %71 = alloca i32, align 4
  %72 = alloca i64, align 8
  %73 = alloca ptr, align 8
  %74 = alloca i32, align 4
  %75 = alloca ptr, align 8
  %76 = alloca i64, align 8
  %77 = alloca i64, align 8
  %78 = alloca ptr, align 8
  %79 = alloca i32, align 4
  %80 = alloca ptr, align 8
  %81 = alloca i64, align 8
  %82 = alloca i64, align 8
  %83 = alloca ptr, align 8
  %84 = alloca i32, align 4
  %85 = alloca ptr, align 8
  %86 = alloca i64, align 8
  %87 = alloca i64, align 8
  %88 = alloca ptr, align 8
  %89 = alloca i32, align 4
  %90 = alloca ptr, align 8
  %91 = alloca i64, align 8
  %92 = alloca i64, align 8
  %93 = alloca ptr, align 8
  %94 = alloca i32, align 4
  %95 = alloca ptr, align 8
  %96 = alloca i64, align 8
  %97 = alloca i64, align 8
  %98 = alloca ptr, align 8
  %99 = alloca i32, align 4
  %100 = alloca ptr, align 8
  %101 = alloca i64, align 8
  %102 = alloca i64, align 8
  %103 = alloca ptr, align 8
  %104 = alloca i32, align 4
  %105 = alloca ptr, align 8
  %106 = alloca i64, align 8
  %107 = alloca i64, align 8
  %108 = alloca ptr, align 8
  %109 = alloca i32, align 4
  %110 = alloca ptr, align 8
  %111 = alloca i64, align 8
  %112 = alloca i64, align 8
  %113 = alloca ptr, align 8
  %114 = alloca i32, align 4
  %115 = alloca ptr, align 8
  %116 = alloca i64, align 8
  %117 = alloca i64, align 8
  %118 = alloca ptr, align 8
  %119 = alloca i32, align 4
  %120 = alloca ptr, align 8
  %121 = alloca i64, align 8
  %122 = alloca i64, align 8
  %123 = alloca ptr, align 8
  %124 = alloca i32, align 4
  %125 = alloca ptr, align 8
  %126 = alloca i64, align 8
  %127 = alloca i64, align 8
  %128 = alloca ptr, align 8
  %129 = alloca i32, align 4
  %130 = alloca ptr, align 8
  %131 = alloca i64, align 8
  %132 = alloca i64, align 8
  %133 = alloca ptr, align 8
  %134 = alloca i32, align 4
  %135 = alloca ptr, align 8
  %136 = alloca i64, align 8
  %137 = alloca i64, align 8
  %138 = alloca ptr, align 8
  %139 = alloca i32, align 4
  %140 = alloca ptr, align 8
  %141 = alloca i64, align 8
  %142 = alloca i64, align 8
  %143 = alloca ptr, align 8
  %144 = alloca i32, align 4
  %145 = alloca ptr, align 8
  %146 = alloca i64, align 8
  %147 = alloca ptr, align 8
  %148 = alloca ptr, align 8
  %149 = alloca ptr, align 8
  %150 = alloca i32, align 4
  %151 = alloca i32, align 4
  %152 = alloca ptr, align 8
  %153 = alloca ptr, align 8
  %154 = alloca ptr, align 8
  %155 = alloca ptr, align 8
  %156 = alloca i32, align 4
  %157 = alloca i64, align 8
  %158 = alloca i32, align 4
  %159 = alloca i64, align 8
  %160 = alloca ptr, align 8
  %161 = alloca i32, align 4
  %162 = alloca ptr, align 8
  %163 = alloca i64, align 8
  %164 = alloca i64, align 8
  %165 = alloca ptr, align 8
  %166 = alloca i32, align 4
  %167 = alloca ptr, align 8
  %168 = alloca i64, align 8
  %169 = alloca i64, align 8
  %170 = alloca ptr, align 8
  %171 = alloca i32, align 4
  %172 = alloca ptr, align 8
  %173 = alloca i64, align 8
  %174 = alloca i64, align 8
  %175 = alloca ptr, align 8
  %176 = alloca i32, align 4
  %177 = alloca ptr, align 8
  %178 = alloca i64, align 8
  %179 = alloca i64, align 8
  %180 = alloca ptr, align 8
  %181 = alloca i32, align 4
  %182 = alloca ptr, align 8
  %183 = alloca i64, align 8
  %184 = alloca i64, align 8
  %185 = alloca ptr, align 8
  %186 = alloca i32, align 4
  %187 = alloca ptr, align 8
  %188 = alloca i64, align 8
  %189 = alloca i64, align 8
  %190 = alloca ptr, align 8
  %191 = alloca i32, align 4
  %192 = alloca ptr, align 8
  %193 = alloca i64, align 8
  %194 = alloca i64, align 8
  %195 = alloca ptr, align 8
  %196 = alloca i32, align 4
  %197 = alloca ptr, align 8
  %198 = alloca i64, align 8
  %199 = alloca i64, align 8
  %200 = alloca ptr, align 8
  %201 = alloca i32, align 4
  %202 = alloca ptr, align 8
  %203 = alloca i64, align 8
  %204 = alloca i64, align 8
  %205 = alloca ptr, align 8
  %206 = alloca i32, align 4
  %207 = alloca ptr, align 8
  %208 = alloca i64, align 8
  %209 = alloca i64, align 8
  %210 = alloca ptr, align 8
  %211 = alloca i32, align 4
  %212 = alloca ptr, align 8
  %213 = alloca i64, align 8
  %214 = alloca i64, align 8
  %215 = alloca ptr, align 8
  %216 = alloca i32, align 4
  %217 = alloca ptr, align 8
  %218 = alloca i64, align 8
  %219 = alloca i64, align 8
  %220 = alloca ptr, align 8
  %221 = alloca i32, align 4
  %222 = alloca ptr, align 8
  %223 = alloca i64, align 8
  %224 = alloca i64, align 8
  %225 = alloca ptr, align 8
  %226 = alloca i32, align 4
  %227 = alloca ptr, align 8
  %228 = alloca i64, align 8
  %229 = alloca i64, align 8
  %230 = alloca ptr, align 8
  %231 = alloca i32, align 4
  %232 = alloca ptr, align 8
  %233 = alloca i64, align 8
  %234 = alloca ptr, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store i32 %2, ptr %8, align 4, !tbaa !9
  store ptr %3, ptr %9, align 8, !tbaa !5
  store ptr %4, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #8
  %235 = load ptr, ptr %6, align 8, !tbaa !5
  %236 = call i32 @Hacl_GenericField64_field_get_len(ptr noundef %235)
  store i32 %236, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %12) #8
  %237 = load ptr, ptr %6, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %12, ptr align 8 %237, i64 32, i1 false), !tbaa.struct !11
  br label %238

238:                                              ; preds = %5
  %239 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 0
  %240 = load i32, ptr %239, align 8, !tbaa !14
  %241 = zext i32 %240 to i64
  %242 = icmp ugt i64 %241, 2305843009213693951
  br i1 %242, label %243, label %245

243:                                              ; preds = %238
  %244 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 281)
  call void @exit(i32 noundef 253) #9
  unreachable

245:                                              ; preds = %238
  br label %246

246:                                              ; preds = %245
  br label %247

247:                                              ; preds = %246
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #8
  %248 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 0
  %249 = load i32, ptr %248, align 8, !tbaa !14
  %250 = zext i32 %249 to i64
  %251 = mul i64 %250, 8
  %252 = alloca i8, i64 %251, align 16
  store ptr %252, ptr %13, align 8, !tbaa !5
  %253 = load ptr, ptr %13, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 0
  %255 = load i32, ptr %254, align 8, !tbaa !14
  %256 = zext i32 %255 to i64
  %257 = mul i64 %256, 8
  call void @llvm.memset.p0.i64(ptr align 8 %253, i8 0, i64 %257, i1 false)
  %258 = load ptr, ptr %13, align 8, !tbaa !5
  %259 = load ptr, ptr %7, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 0
  %261 = load i32, ptr %260, align 8, !tbaa !14
  %262 = zext i32 %261 to i64
  %263 = mul i64 %262, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %258, ptr align 8 %259, i64 %263, i1 false)
  %264 = load i32, ptr %8, align 4, !tbaa !9
  %265 = icmp ult i32 %264, 200
  br i1 %265, label %266, label %458

266:                                              ; preds = %247
  br label %267

267:                                              ; preds = %266
  %268 = load i32, ptr %11, align 4, !tbaa !9
  %269 = load i32, ptr %11, align 4, !tbaa !9
  %270 = add i32 %268, %269
  %271 = zext i32 %270 to i64
  %272 = icmp ugt i64 %271, 2305843009213693951
  br i1 %272, label %273, label %275

273:                                              ; preds = %267
  %274 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 287)
  call void @exit(i32 noundef 253) #9
  unreachable

275:                                              ; preds = %267
  br label %276

276:                                              ; preds = %275
  br label %277

277:                                              ; preds = %276
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #8
  %278 = load i32, ptr %11, align 4, !tbaa !9
  %279 = load i32, ptr %11, align 4, !tbaa !9
  %280 = add i32 %278, %279
  %281 = zext i32 %280 to i64
  %282 = mul i64 %281, 8
  %283 = alloca i8, i64 %282, align 16
  store ptr %283, ptr %14, align 8, !tbaa !5
  %284 = load ptr, ptr %14, align 8, !tbaa !5
  %285 = load i32, ptr %11, align 4, !tbaa !9
  %286 = load i32, ptr %11, align 4, !tbaa !9
  %287 = add i32 %285, %286
  %288 = zext i32 %287 to i64
  %289 = mul i64 %288, 8
  call void @llvm.memset.p0.i64(ptr align 8 %284, i8 0, i64 %289, i1 false)
  %290 = load ptr, ptr %14, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 1
  %292 = load ptr, ptr %291, align 8, !tbaa !16
  %293 = load i32, ptr %11, align 4, !tbaa !9
  %294 = zext i32 %293 to i64
  %295 = mul i64 %294, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %290, ptr align 8 %292, i64 %295, i1 false)
  %296 = load ptr, ptr %14, align 8, !tbaa !5
  %297 = load i32, ptr %11, align 4, !tbaa !9
  %298 = zext i32 %297 to i64
  %299 = getelementptr inbounds i64, ptr %296, i64 %298
  %300 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 3
  %301 = load ptr, ptr %300, align 8, !tbaa !17
  %302 = load i32, ptr %11, align 4, !tbaa !9
  %303 = zext i32 %302 to i64
  %304 = mul i64 %303, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %299, ptr align 8 %301, i64 %304, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #8
  store i64 0, ptr %15, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #8
  %305 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %305, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #8
  %306 = load ptr, ptr %14, align 8, !tbaa !5
  %307 = load i32, ptr %11, align 4, !tbaa !9
  %308 = zext i32 %307 to i64
  %309 = getelementptr inbounds i64, ptr %306, i64 %308
  store ptr %309, ptr %17, align 8, !tbaa !5
  %310 = load i32, ptr %11, align 4, !tbaa !9
  %311 = load ptr, ptr %16, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %313 = load i64, ptr %312, align 8, !tbaa !18
  %314 = load ptr, ptr %17, align 8, !tbaa !5
  %315 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef %310, ptr noundef %311, i64 noundef %313, ptr noundef %314, ptr noundef %315)
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #8
  store i32 0, ptr %18, align 4, !tbaa !9
  br label %316

316:                                              ; preds = %407, %277
  %317 = load i32, ptr %18, align 4, !tbaa !9
  %318 = load i32, ptr %8, align 4, !tbaa !9
  %319 = icmp ult i32 %317, %318
  br i1 %319, label %321, label %320

320:                                              ; preds = %316
  store i32 6, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #8
  br label %410

321:                                              ; preds = %316
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #8
  %322 = load i32, ptr %8, align 4, !tbaa !9
  %323 = load i32, ptr %18, align 4, !tbaa !9
  %324 = sub i32 %322, %323
  %325 = sub i32 %324, 1
  %326 = udiv i32 %325, 64
  store i32 %326, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #8
  %327 = load i32, ptr %8, align 4, !tbaa !9
  %328 = load i32, ptr %18, align 4, !tbaa !9
  %329 = sub i32 %327, %328
  %330 = sub i32 %329, 1
  %331 = urem i32 %330, 64
  store i32 %331, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  %332 = load ptr, ptr %9, align 8, !tbaa !5
  %333 = load i32, ptr %20, align 4, !tbaa !9
  %334 = zext i32 %333 to i64
  %335 = getelementptr inbounds i64, ptr %332, i64 %334
  %336 = load i64, ptr %335, align 8, !tbaa !12
  store i64 %336, ptr %22, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #8
  %337 = load i64, ptr %22, align 8, !tbaa !12
  %338 = load i32, ptr %21, align 4, !tbaa !9
  %339 = zext i32 %338 to i64
  %340 = lshr i64 %337, %339
  %341 = and i64 %340, 1
  store i64 %341, ptr %23, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #8
  %342 = load i64, ptr %23, align 8, !tbaa !12
  %343 = load i64, ptr %15, align 8, !tbaa !12
  %344 = xor i64 %342, %343
  store i64 %344, ptr %24, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #8
  store i32 0, ptr %25, align 4, !tbaa !9
  br label %345

345:                                              ; preds = %387, %321
  %346 = load i32, ptr %25, align 4, !tbaa !9
  %347 = load i32, ptr %11, align 4, !tbaa !9
  %348 = icmp ult i32 %346, %347
  br i1 %348, label %350, label %349

349:                                              ; preds = %345
  store i32 9, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #8
  br label %390

350:                                              ; preds = %345
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #8
  %351 = load i64, ptr %24, align 8, !tbaa !12
  %352 = sub i64 0, %351
  %353 = load ptr, ptr %10, align 8, !tbaa !5
  %354 = load i32, ptr %25, align 4, !tbaa !9
  %355 = zext i32 %354 to i64
  %356 = getelementptr inbounds i64, ptr %353, i64 %355
  %357 = load i64, ptr %356, align 8, !tbaa !12
  %358 = load ptr, ptr %13, align 8, !tbaa !5
  %359 = load i32, ptr %25, align 4, !tbaa !9
  %360 = zext i32 %359 to i64
  %361 = getelementptr inbounds i64, ptr %358, i64 %360
  %362 = load i64, ptr %361, align 8, !tbaa !12
  %363 = xor i64 %357, %362
  %364 = and i64 %352, %363
  store i64 %364, ptr %26, align 8, !tbaa !12
  %365 = load ptr, ptr %10, align 8, !tbaa !5
  %366 = load i32, ptr %25, align 4, !tbaa !9
  %367 = zext i32 %366 to i64
  %368 = getelementptr inbounds i64, ptr %365, i64 %367
  %369 = load i64, ptr %368, align 8, !tbaa !12
  %370 = load i64, ptr %26, align 8, !tbaa !12
  %371 = xor i64 %369, %370
  %372 = load ptr, ptr %10, align 8, !tbaa !5
  %373 = load i32, ptr %25, align 4, !tbaa !9
  %374 = zext i32 %373 to i64
  %375 = getelementptr inbounds i64, ptr %372, i64 %374
  store i64 %371, ptr %375, align 8, !tbaa !12
  %376 = load ptr, ptr %13, align 8, !tbaa !5
  %377 = load i32, ptr %25, align 4, !tbaa !9
  %378 = zext i32 %377 to i64
  %379 = getelementptr inbounds i64, ptr %376, i64 %378
  %380 = load i64, ptr %379, align 8, !tbaa !12
  %381 = load i64, ptr %26, align 8, !tbaa !12
  %382 = xor i64 %380, %381
  %383 = load ptr, ptr %13, align 8, !tbaa !5
  %384 = load i32, ptr %25, align 4, !tbaa !9
  %385 = zext i32 %384 to i64
  %386 = getelementptr inbounds i64, ptr %383, i64 %385
  store i64 %382, ptr %386, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #8
  br label %387

387:                                              ; preds = %350
  %388 = load i32, ptr %25, align 4, !tbaa !9
  %389 = add i32 %388, 1
  store i32 %389, ptr %25, align 4, !tbaa !9
  br label %345, !llvm.loop !19

390:                                              ; preds = %349
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #8
  %391 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %391, ptr %27, align 8, !tbaa !5
  %392 = load i32, ptr %11, align 4, !tbaa !9
  %393 = load ptr, ptr %27, align 8, !tbaa !5
  %394 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %395 = load i64, ptr %394, align 8, !tbaa !18
  %396 = load ptr, ptr %13, align 8, !tbaa !5
  %397 = load ptr, ptr %10, align 8, !tbaa !5
  %398 = load ptr, ptr %13, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %392, ptr noundef %393, i64 noundef %395, ptr noundef %396, ptr noundef %397, ptr noundef %398)
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #8
  %399 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %399, ptr %28, align 8, !tbaa !5
  %400 = load i32, ptr %11, align 4, !tbaa !9
  %401 = load ptr, ptr %28, align 8, !tbaa !5
  %402 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %403 = load i64, ptr %402, align 8, !tbaa !18
  %404 = load ptr, ptr %10, align 8, !tbaa !5
  %405 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %400, ptr noundef %401, i64 noundef %403, ptr noundef %404, ptr noundef %405)
  %406 = load i64, ptr %23, align 8, !tbaa !12
  store i64 %406, ptr %15, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #8
  br label %407

407:                                              ; preds = %390
  %408 = load i32, ptr %18, align 4, !tbaa !9
  %409 = add i32 %408, 1
  store i32 %409, ptr %18, align 4, !tbaa !9
  br label %316, !llvm.loop !21

410:                                              ; preds = %320
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #8
  %411 = load i64, ptr %15, align 8, !tbaa !12
  store i64 %411, ptr %29, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #8
  store i32 0, ptr %30, align 4, !tbaa !9
  br label %412

412:                                              ; preds = %454, %410
  %413 = load i32, ptr %30, align 4, !tbaa !9
  %414 = load i32, ptr %11, align 4, !tbaa !9
  %415 = icmp ult i32 %413, %414
  br i1 %415, label %417, label %416

416:                                              ; preds = %412
  store i32 12, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #8
  br label %457

417:                                              ; preds = %412
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #8
  %418 = load i64, ptr %29, align 8, !tbaa !12
  %419 = sub i64 0, %418
  %420 = load ptr, ptr %10, align 8, !tbaa !5
  %421 = load i32, ptr %30, align 4, !tbaa !9
  %422 = zext i32 %421 to i64
  %423 = getelementptr inbounds i64, ptr %420, i64 %422
  %424 = load i64, ptr %423, align 8, !tbaa !12
  %425 = load ptr, ptr %13, align 8, !tbaa !5
  %426 = load i32, ptr %30, align 4, !tbaa !9
  %427 = zext i32 %426 to i64
  %428 = getelementptr inbounds i64, ptr %425, i64 %427
  %429 = load i64, ptr %428, align 8, !tbaa !12
  %430 = xor i64 %424, %429
  %431 = and i64 %419, %430
  store i64 %431, ptr %31, align 8, !tbaa !12
  %432 = load ptr, ptr %10, align 8, !tbaa !5
  %433 = load i32, ptr %30, align 4, !tbaa !9
  %434 = zext i32 %433 to i64
  %435 = getelementptr inbounds i64, ptr %432, i64 %434
  %436 = load i64, ptr %435, align 8, !tbaa !12
  %437 = load i64, ptr %31, align 8, !tbaa !12
  %438 = xor i64 %436, %437
  %439 = load ptr, ptr %10, align 8, !tbaa !5
  %440 = load i32, ptr %30, align 4, !tbaa !9
  %441 = zext i32 %440 to i64
  %442 = getelementptr inbounds i64, ptr %439, i64 %441
  store i64 %438, ptr %442, align 8, !tbaa !12
  %443 = load ptr, ptr %13, align 8, !tbaa !5
  %444 = load i32, ptr %30, align 4, !tbaa !9
  %445 = zext i32 %444 to i64
  %446 = getelementptr inbounds i64, ptr %443, i64 %445
  %447 = load i64, ptr %446, align 8, !tbaa !12
  %448 = load i64, ptr %31, align 8, !tbaa !12
  %449 = xor i64 %447, %448
  %450 = load ptr, ptr %13, align 8, !tbaa !5
  %451 = load i32, ptr %30, align 4, !tbaa !9
  %452 = zext i32 %451 to i64
  %453 = getelementptr inbounds i64, ptr %450, i64 %452
  store i64 %449, ptr %453, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #8
  br label %454

454:                                              ; preds = %417
  %455 = load i32, ptr %30, align 4, !tbaa !9
  %456 = add i32 %455, 1
  store i32 %456, ptr %30, align 4, !tbaa !9
  br label %412, !llvm.loop !22

457:                                              ; preds = %416
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #8
  br label %2515

458:                                              ; preds = %247
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #8
  %459 = load i32, ptr %8, align 4, !tbaa !9
  %460 = icmp eq i32 %459, 0
  br i1 %460, label %461, label %462

461:                                              ; preds = %458
  store i32 1, ptr %32, align 4, !tbaa !9
  br label %467

462:                                              ; preds = %458
  %463 = load i32, ptr %8, align 4, !tbaa !9
  %464 = sub i32 %463, 1
  %465 = udiv i32 %464, 64
  %466 = add i32 %465, 1
  store i32 %466, ptr %32, align 4, !tbaa !9
  br label %467

467:                                              ; preds = %462, %461
  br label %468

468:                                              ; preds = %467
  %469 = load i32, ptr %11, align 4, !tbaa !9
  %470 = load i32, ptr %11, align 4, !tbaa !9
  %471 = add i32 %469, %470
  %472 = zext i32 %471 to i64
  %473 = icmp ugt i64 %472, 2305843009213693951
  br i1 %473, label %474, label %476

474:                                              ; preds = %468
  %475 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 334)
  call void @exit(i32 noundef 253) #9
  unreachable

476:                                              ; preds = %468
  br label %477

477:                                              ; preds = %476
  br label %478

478:                                              ; preds = %477
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #8
  %479 = load i32, ptr %11, align 4, !tbaa !9
  %480 = load i32, ptr %11, align 4, !tbaa !9
  %481 = add i32 %479, %480
  %482 = zext i32 %481 to i64
  %483 = mul i64 %482, 8
  %484 = alloca i8, i64 %483, align 16
  store ptr %484, ptr %33, align 8, !tbaa !5
  %485 = load ptr, ptr %33, align 8, !tbaa !5
  %486 = load i32, ptr %11, align 4, !tbaa !9
  %487 = load i32, ptr %11, align 4, !tbaa !9
  %488 = add i32 %486, %487
  %489 = zext i32 %488 to i64
  %490 = mul i64 %489, 8
  call void @llvm.memset.p0.i64(ptr align 8 %485, i8 0, i64 %490, i1 false)
  %491 = load ptr, ptr %33, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 1
  %493 = load ptr, ptr %492, align 8, !tbaa !16
  %494 = load i32, ptr %11, align 4, !tbaa !9
  %495 = zext i32 %494 to i64
  %496 = mul i64 %495, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %491, ptr align 8 %493, i64 %496, i1 false)
  %497 = load ptr, ptr %33, align 8, !tbaa !5
  %498 = load i32, ptr %11, align 4, !tbaa !9
  %499 = zext i32 %498 to i64
  %500 = getelementptr inbounds i64, ptr %497, i64 %499
  %501 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 3
  %502 = load ptr, ptr %501, align 8, !tbaa !17
  %503 = load i32, ptr %11, align 4, !tbaa !9
  %504 = zext i32 %503 to i64
  %505 = mul i64 %504, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %500, ptr align 8 %502, i64 %505, i1 false)
  br label %506

506:                                              ; preds = %478
  %507 = load i32, ptr %11, align 4, !tbaa !9
  %508 = mul i32 16, %507
  %509 = zext i32 %508 to i64
  %510 = icmp ugt i64 %509, 2305843009213693951
  br i1 %510, label %511, label %513

511:                                              ; preds = %506
  %512 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 339)
  call void @exit(i32 noundef 253) #9
  unreachable

513:                                              ; preds = %506
  br label %514

514:                                              ; preds = %513
  br label %515

515:                                              ; preds = %514
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #8
  %516 = load i32, ptr %11, align 4, !tbaa !9
  %517 = mul i32 16, %516
  %518 = zext i32 %517 to i64
  %519 = mul i64 %518, 8
  %520 = alloca i8, i64 %519, align 16
  store ptr %520, ptr %34, align 8, !tbaa !5
  %521 = load ptr, ptr %34, align 8, !tbaa !5
  %522 = load i32, ptr %11, align 4, !tbaa !9
  %523 = mul i32 16, %522
  %524 = zext i32 %523 to i64
  %525 = mul i64 %524, 8
  call void @llvm.memset.p0.i64(ptr align 8 %521, i8 0, i64 %525, i1 false)
  br label %526

526:                                              ; preds = %515
  %527 = load i32, ptr %11, align 4, !tbaa !9
  %528 = zext i32 %527 to i64
  %529 = icmp ugt i64 %528, 2305843009213693951
  br i1 %529, label %530, label %532

530:                                              ; preds = %526
  %531 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 342)
  call void @exit(i32 noundef 253) #9
  unreachable

532:                                              ; preds = %526
  br label %533

533:                                              ; preds = %532
  br label %534

534:                                              ; preds = %533
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #8
  %535 = load i32, ptr %11, align 4, !tbaa !9
  %536 = zext i32 %535 to i64
  %537 = mul i64 %536, 8
  %538 = alloca i8, i64 %537, align 16
  store ptr %538, ptr %35, align 8, !tbaa !5
  %539 = load ptr, ptr %35, align 8, !tbaa !5
  %540 = load i32, ptr %11, align 4, !tbaa !9
  %541 = zext i32 %540 to i64
  %542 = mul i64 %541, 8
  call void @llvm.memset.p0.i64(ptr align 8 %539, i8 0, i64 %542, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #8
  %543 = load ptr, ptr %34, align 8, !tbaa !5
  store ptr %543, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #8
  %544 = load ptr, ptr %34, align 8, !tbaa !5
  %545 = load i32, ptr %11, align 4, !tbaa !9
  %546 = zext i32 %545 to i64
  %547 = getelementptr inbounds i64, ptr %544, i64 %546
  store ptr %547, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #8
  %548 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %548, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #8
  %549 = load ptr, ptr %33, align 8, !tbaa !5
  %550 = load i32, ptr %11, align 4, !tbaa !9
  %551 = zext i32 %550 to i64
  %552 = getelementptr inbounds i64, ptr %549, i64 %551
  store ptr %552, ptr %39, align 8, !tbaa !5
  %553 = load i32, ptr %11, align 4, !tbaa !9
  %554 = load ptr, ptr %38, align 8, !tbaa !5
  %555 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %556 = load i64, ptr %555, align 8, !tbaa !18
  %557 = load ptr, ptr %39, align 8, !tbaa !5
  %558 = load ptr, ptr %36, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef %553, ptr noundef %554, i64 noundef %556, ptr noundef %557, ptr noundef %558)
  %559 = load ptr, ptr %37, align 8, !tbaa !5
  %560 = load ptr, ptr %13, align 8, !tbaa !5
  %561 = load i32, ptr %11, align 4, !tbaa !9
  %562 = zext i32 %561 to i64
  %563 = mul i64 %562, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %559, ptr align 8 %560, i64 %563, i1 false)
  br label %564

564:                                              ; preds = %534
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #8
  store i32 0, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #8
  %565 = load ptr, ptr %34, align 8, !tbaa !5
  %566 = load i32, ptr %40, align 4, !tbaa !9
  %567 = add i32 %566, 1
  %568 = load i32, ptr %11, align 4, !tbaa !9
  %569 = mul i32 %567, %568
  %570 = zext i32 %569 to i64
  %571 = getelementptr inbounds i64, ptr %565, i64 %570
  store ptr %571, ptr %41, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #8
  %572 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %572, ptr %42, align 8, !tbaa !5
  %573 = load i32, ptr %11, align 4, !tbaa !9
  %574 = load ptr, ptr %42, align 8, !tbaa !5
  %575 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %576 = load i64, ptr %575, align 8, !tbaa !18
  %577 = load ptr, ptr %41, align 8, !tbaa !5
  %578 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %573, ptr noundef %574, i64 noundef %576, ptr noundef %577, ptr noundef %578)
  %579 = load ptr, ptr %34, align 8, !tbaa !5
  %580 = load i32, ptr %40, align 4, !tbaa !9
  %581 = mul i32 2, %580
  %582 = add i32 %581, 2
  %583 = load i32, ptr %11, align 4, !tbaa !9
  %584 = mul i32 %582, %583
  %585 = zext i32 %584 to i64
  %586 = getelementptr inbounds i64, ptr %579, i64 %585
  %587 = load ptr, ptr %35, align 8, !tbaa !5
  %588 = load i32, ptr %11, align 4, !tbaa !9
  %589 = zext i32 %588 to i64
  %590 = mul i64 %589, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %586, ptr align 8 %587, i64 %590, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #8
  %591 = load ptr, ptr %34, align 8, !tbaa !5
  %592 = load i32, ptr %40, align 4, !tbaa !9
  %593 = mul i32 2, %592
  %594 = add i32 %593, 2
  %595 = load i32, ptr %11, align 4, !tbaa !9
  %596 = mul i32 %594, %595
  %597 = zext i32 %596 to i64
  %598 = getelementptr inbounds i64, ptr %591, i64 %597
  store ptr %598, ptr %43, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #8
  %599 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %599, ptr %44, align 8, !tbaa !5
  %600 = load i32, ptr %11, align 4, !tbaa !9
  %601 = load ptr, ptr %44, align 8, !tbaa !5
  %602 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %603 = load i64, ptr %602, align 8, !tbaa !18
  %604 = load ptr, ptr %13, align 8, !tbaa !5
  %605 = load ptr, ptr %43, align 8, !tbaa !5
  %606 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %600, ptr noundef %601, i64 noundef %603, ptr noundef %604, ptr noundef %605, ptr noundef %606)
  %607 = load ptr, ptr %34, align 8, !tbaa !5
  %608 = load i32, ptr %40, align 4, !tbaa !9
  %609 = mul i32 2, %608
  %610 = add i32 %609, 3
  %611 = load i32, ptr %11, align 4, !tbaa !9
  %612 = mul i32 %610, %611
  %613 = zext i32 %612 to i64
  %614 = getelementptr inbounds i64, ptr %607, i64 %613
  %615 = load ptr, ptr %35, align 8, !tbaa !5
  %616 = load i32, ptr %11, align 4, !tbaa !9
  %617 = zext i32 %616 to i64
  %618 = mul i64 %617, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %614, ptr align 8 %615, i64 %618, i1 false)
  %619 = load i32, ptr %40, align 4, !tbaa !9
  %620 = add i32 %619, 1
  store i32 %620, ptr %40, align 4, !tbaa !9
  %621 = load i32, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #8
  %622 = load ptr, ptr %34, align 8, !tbaa !5
  %623 = load i32, ptr %40, align 4, !tbaa !9
  %624 = add i32 %623, 1
  %625 = load i32, ptr %11, align 4, !tbaa !9
  %626 = mul i32 %624, %625
  %627 = zext i32 %626 to i64
  %628 = getelementptr inbounds i64, ptr %622, i64 %627
  store ptr %628, ptr %45, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #8
  %629 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %629, ptr %46, align 8, !tbaa !5
  %630 = load i32, ptr %11, align 4, !tbaa !9
  %631 = load ptr, ptr %46, align 8, !tbaa !5
  %632 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %633 = load i64, ptr %632, align 8, !tbaa !18
  %634 = load ptr, ptr %45, align 8, !tbaa !5
  %635 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %630, ptr noundef %631, i64 noundef %633, ptr noundef %634, ptr noundef %635)
  %636 = load ptr, ptr %34, align 8, !tbaa !5
  %637 = load i32, ptr %40, align 4, !tbaa !9
  %638 = mul i32 2, %637
  %639 = add i32 %638, 2
  %640 = load i32, ptr %11, align 4, !tbaa !9
  %641 = mul i32 %639, %640
  %642 = zext i32 %641 to i64
  %643 = getelementptr inbounds i64, ptr %636, i64 %642
  %644 = load ptr, ptr %35, align 8, !tbaa !5
  %645 = load i32, ptr %11, align 4, !tbaa !9
  %646 = zext i32 %645 to i64
  %647 = mul i64 %646, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %643, ptr align 8 %644, i64 %647, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #8
  %648 = load ptr, ptr %34, align 8, !tbaa !5
  %649 = load i32, ptr %40, align 4, !tbaa !9
  %650 = mul i32 2, %649
  %651 = add i32 %650, 2
  %652 = load i32, ptr %11, align 4, !tbaa !9
  %653 = mul i32 %651, %652
  %654 = zext i32 %653 to i64
  %655 = getelementptr inbounds i64, ptr %648, i64 %654
  store ptr %655, ptr %47, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #8
  %656 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %656, ptr %48, align 8, !tbaa !5
  %657 = load i32, ptr %11, align 4, !tbaa !9
  %658 = load ptr, ptr %48, align 8, !tbaa !5
  %659 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %660 = load i64, ptr %659, align 8, !tbaa !18
  %661 = load ptr, ptr %13, align 8, !tbaa !5
  %662 = load ptr, ptr %47, align 8, !tbaa !5
  %663 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %657, ptr noundef %658, i64 noundef %660, ptr noundef %661, ptr noundef %662, ptr noundef %663)
  %664 = load ptr, ptr %34, align 8, !tbaa !5
  %665 = load i32, ptr %40, align 4, !tbaa !9
  %666 = mul i32 2, %665
  %667 = add i32 %666, 3
  %668 = load i32, ptr %11, align 4, !tbaa !9
  %669 = mul i32 %667, %668
  %670 = zext i32 %669 to i64
  %671 = getelementptr inbounds i64, ptr %664, i64 %670
  %672 = load ptr, ptr %35, align 8, !tbaa !5
  %673 = load i32, ptr %11, align 4, !tbaa !9
  %674 = zext i32 %673 to i64
  %675 = mul i64 %674, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %671, ptr align 8 %672, i64 %675, i1 false)
  %676 = load i32, ptr %40, align 4, !tbaa !9
  %677 = add i32 %676, 1
  store i32 %677, ptr %40, align 4, !tbaa !9
  %678 = load i32, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #8
  %679 = load ptr, ptr %34, align 8, !tbaa !5
  %680 = load i32, ptr %40, align 4, !tbaa !9
  %681 = add i32 %680, 1
  %682 = load i32, ptr %11, align 4, !tbaa !9
  %683 = mul i32 %681, %682
  %684 = zext i32 %683 to i64
  %685 = getelementptr inbounds i64, ptr %679, i64 %684
  store ptr %685, ptr %49, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #8
  %686 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %686, ptr %50, align 8, !tbaa !5
  %687 = load i32, ptr %11, align 4, !tbaa !9
  %688 = load ptr, ptr %50, align 8, !tbaa !5
  %689 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %690 = load i64, ptr %689, align 8, !tbaa !18
  %691 = load ptr, ptr %49, align 8, !tbaa !5
  %692 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %687, ptr noundef %688, i64 noundef %690, ptr noundef %691, ptr noundef %692)
  %693 = load ptr, ptr %34, align 8, !tbaa !5
  %694 = load i32, ptr %40, align 4, !tbaa !9
  %695 = mul i32 2, %694
  %696 = add i32 %695, 2
  %697 = load i32, ptr %11, align 4, !tbaa !9
  %698 = mul i32 %696, %697
  %699 = zext i32 %698 to i64
  %700 = getelementptr inbounds i64, ptr %693, i64 %699
  %701 = load ptr, ptr %35, align 8, !tbaa !5
  %702 = load i32, ptr %11, align 4, !tbaa !9
  %703 = zext i32 %702 to i64
  %704 = mul i64 %703, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %700, ptr align 8 %701, i64 %704, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #8
  %705 = load ptr, ptr %34, align 8, !tbaa !5
  %706 = load i32, ptr %40, align 4, !tbaa !9
  %707 = mul i32 2, %706
  %708 = add i32 %707, 2
  %709 = load i32, ptr %11, align 4, !tbaa !9
  %710 = mul i32 %708, %709
  %711 = zext i32 %710 to i64
  %712 = getelementptr inbounds i64, ptr %705, i64 %711
  store ptr %712, ptr %51, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #8
  %713 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %713, ptr %52, align 8, !tbaa !5
  %714 = load i32, ptr %11, align 4, !tbaa !9
  %715 = load ptr, ptr %52, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %717 = load i64, ptr %716, align 8, !tbaa !18
  %718 = load ptr, ptr %13, align 8, !tbaa !5
  %719 = load ptr, ptr %51, align 8, !tbaa !5
  %720 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %714, ptr noundef %715, i64 noundef %717, ptr noundef %718, ptr noundef %719, ptr noundef %720)
  %721 = load ptr, ptr %34, align 8, !tbaa !5
  %722 = load i32, ptr %40, align 4, !tbaa !9
  %723 = mul i32 2, %722
  %724 = add i32 %723, 3
  %725 = load i32, ptr %11, align 4, !tbaa !9
  %726 = mul i32 %724, %725
  %727 = zext i32 %726 to i64
  %728 = getelementptr inbounds i64, ptr %721, i64 %727
  %729 = load ptr, ptr %35, align 8, !tbaa !5
  %730 = load i32, ptr %11, align 4, !tbaa !9
  %731 = zext i32 %730 to i64
  %732 = mul i64 %731, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %728, ptr align 8 %729, i64 %732, i1 false)
  %733 = load i32, ptr %40, align 4, !tbaa !9
  %734 = add i32 %733, 1
  store i32 %734, ptr %40, align 4, !tbaa !9
  %735 = load i32, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #8
  %736 = load ptr, ptr %34, align 8, !tbaa !5
  %737 = load i32, ptr %40, align 4, !tbaa !9
  %738 = add i32 %737, 1
  %739 = load i32, ptr %11, align 4, !tbaa !9
  %740 = mul i32 %738, %739
  %741 = zext i32 %740 to i64
  %742 = getelementptr inbounds i64, ptr %736, i64 %741
  store ptr %742, ptr %53, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #8
  %743 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %743, ptr %54, align 8, !tbaa !5
  %744 = load i32, ptr %11, align 4, !tbaa !9
  %745 = load ptr, ptr %54, align 8, !tbaa !5
  %746 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %747 = load i64, ptr %746, align 8, !tbaa !18
  %748 = load ptr, ptr %53, align 8, !tbaa !5
  %749 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %744, ptr noundef %745, i64 noundef %747, ptr noundef %748, ptr noundef %749)
  %750 = load ptr, ptr %34, align 8, !tbaa !5
  %751 = load i32, ptr %40, align 4, !tbaa !9
  %752 = mul i32 2, %751
  %753 = add i32 %752, 2
  %754 = load i32, ptr %11, align 4, !tbaa !9
  %755 = mul i32 %753, %754
  %756 = zext i32 %755 to i64
  %757 = getelementptr inbounds i64, ptr %750, i64 %756
  %758 = load ptr, ptr %35, align 8, !tbaa !5
  %759 = load i32, ptr %11, align 4, !tbaa !9
  %760 = zext i32 %759 to i64
  %761 = mul i64 %760, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %757, ptr align 8 %758, i64 %761, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #8
  %762 = load ptr, ptr %34, align 8, !tbaa !5
  %763 = load i32, ptr %40, align 4, !tbaa !9
  %764 = mul i32 2, %763
  %765 = add i32 %764, 2
  %766 = load i32, ptr %11, align 4, !tbaa !9
  %767 = mul i32 %765, %766
  %768 = zext i32 %767 to i64
  %769 = getelementptr inbounds i64, ptr %762, i64 %768
  store ptr %769, ptr %55, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #8
  %770 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %770, ptr %56, align 8, !tbaa !5
  %771 = load i32, ptr %11, align 4, !tbaa !9
  %772 = load ptr, ptr %56, align 8, !tbaa !5
  %773 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %774 = load i64, ptr %773, align 8, !tbaa !18
  %775 = load ptr, ptr %13, align 8, !tbaa !5
  %776 = load ptr, ptr %55, align 8, !tbaa !5
  %777 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %771, ptr noundef %772, i64 noundef %774, ptr noundef %775, ptr noundef %776, ptr noundef %777)
  %778 = load ptr, ptr %34, align 8, !tbaa !5
  %779 = load i32, ptr %40, align 4, !tbaa !9
  %780 = mul i32 2, %779
  %781 = add i32 %780, 3
  %782 = load i32, ptr %11, align 4, !tbaa !9
  %783 = mul i32 %781, %782
  %784 = zext i32 %783 to i64
  %785 = getelementptr inbounds i64, ptr %778, i64 %784
  %786 = load ptr, ptr %35, align 8, !tbaa !5
  %787 = load i32, ptr %11, align 4, !tbaa !9
  %788 = zext i32 %787 to i64
  %789 = mul i64 %788, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %785, ptr align 8 %786, i64 %789, i1 false)
  %790 = load i32, ptr %40, align 4, !tbaa !9
  %791 = add i32 %790, 1
  store i32 %791, ptr %40, align 4, !tbaa !9
  %792 = load i32, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #8
  %793 = load ptr, ptr %34, align 8, !tbaa !5
  %794 = load i32, ptr %40, align 4, !tbaa !9
  %795 = add i32 %794, 1
  %796 = load i32, ptr %11, align 4, !tbaa !9
  %797 = mul i32 %795, %796
  %798 = zext i32 %797 to i64
  %799 = getelementptr inbounds i64, ptr %793, i64 %798
  store ptr %799, ptr %57, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #8
  %800 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %800, ptr %58, align 8, !tbaa !5
  %801 = load i32, ptr %11, align 4, !tbaa !9
  %802 = load ptr, ptr %58, align 8, !tbaa !5
  %803 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %804 = load i64, ptr %803, align 8, !tbaa !18
  %805 = load ptr, ptr %57, align 8, !tbaa !5
  %806 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %801, ptr noundef %802, i64 noundef %804, ptr noundef %805, ptr noundef %806)
  %807 = load ptr, ptr %34, align 8, !tbaa !5
  %808 = load i32, ptr %40, align 4, !tbaa !9
  %809 = mul i32 2, %808
  %810 = add i32 %809, 2
  %811 = load i32, ptr %11, align 4, !tbaa !9
  %812 = mul i32 %810, %811
  %813 = zext i32 %812 to i64
  %814 = getelementptr inbounds i64, ptr %807, i64 %813
  %815 = load ptr, ptr %35, align 8, !tbaa !5
  %816 = load i32, ptr %11, align 4, !tbaa !9
  %817 = zext i32 %816 to i64
  %818 = mul i64 %817, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %814, ptr align 8 %815, i64 %818, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #8
  %819 = load ptr, ptr %34, align 8, !tbaa !5
  %820 = load i32, ptr %40, align 4, !tbaa !9
  %821 = mul i32 2, %820
  %822 = add i32 %821, 2
  %823 = load i32, ptr %11, align 4, !tbaa !9
  %824 = mul i32 %822, %823
  %825 = zext i32 %824 to i64
  %826 = getelementptr inbounds i64, ptr %819, i64 %825
  store ptr %826, ptr %59, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #8
  %827 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %827, ptr %60, align 8, !tbaa !5
  %828 = load i32, ptr %11, align 4, !tbaa !9
  %829 = load ptr, ptr %60, align 8, !tbaa !5
  %830 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %831 = load i64, ptr %830, align 8, !tbaa !18
  %832 = load ptr, ptr %13, align 8, !tbaa !5
  %833 = load ptr, ptr %59, align 8, !tbaa !5
  %834 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %828, ptr noundef %829, i64 noundef %831, ptr noundef %832, ptr noundef %833, ptr noundef %834)
  %835 = load ptr, ptr %34, align 8, !tbaa !5
  %836 = load i32, ptr %40, align 4, !tbaa !9
  %837 = mul i32 2, %836
  %838 = add i32 %837, 3
  %839 = load i32, ptr %11, align 4, !tbaa !9
  %840 = mul i32 %838, %839
  %841 = zext i32 %840 to i64
  %842 = getelementptr inbounds i64, ptr %835, i64 %841
  %843 = load ptr, ptr %35, align 8, !tbaa !5
  %844 = load i32, ptr %11, align 4, !tbaa !9
  %845 = zext i32 %844 to i64
  %846 = mul i64 %845, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %842, ptr align 8 %843, i64 %846, i1 false)
  %847 = load i32, ptr %40, align 4, !tbaa !9
  %848 = add i32 %847, 1
  store i32 %848, ptr %40, align 4, !tbaa !9
  %849 = load i32, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #8
  %850 = load ptr, ptr %34, align 8, !tbaa !5
  %851 = load i32, ptr %40, align 4, !tbaa !9
  %852 = add i32 %851, 1
  %853 = load i32, ptr %11, align 4, !tbaa !9
  %854 = mul i32 %852, %853
  %855 = zext i32 %854 to i64
  %856 = getelementptr inbounds i64, ptr %850, i64 %855
  store ptr %856, ptr %61, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #8
  %857 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %857, ptr %62, align 8, !tbaa !5
  %858 = load i32, ptr %11, align 4, !tbaa !9
  %859 = load ptr, ptr %62, align 8, !tbaa !5
  %860 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %861 = load i64, ptr %860, align 8, !tbaa !18
  %862 = load ptr, ptr %61, align 8, !tbaa !5
  %863 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %858, ptr noundef %859, i64 noundef %861, ptr noundef %862, ptr noundef %863)
  %864 = load ptr, ptr %34, align 8, !tbaa !5
  %865 = load i32, ptr %40, align 4, !tbaa !9
  %866 = mul i32 2, %865
  %867 = add i32 %866, 2
  %868 = load i32, ptr %11, align 4, !tbaa !9
  %869 = mul i32 %867, %868
  %870 = zext i32 %869 to i64
  %871 = getelementptr inbounds i64, ptr %864, i64 %870
  %872 = load ptr, ptr %35, align 8, !tbaa !5
  %873 = load i32, ptr %11, align 4, !tbaa !9
  %874 = zext i32 %873 to i64
  %875 = mul i64 %874, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %871, ptr align 8 %872, i64 %875, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #8
  %876 = load ptr, ptr %34, align 8, !tbaa !5
  %877 = load i32, ptr %40, align 4, !tbaa !9
  %878 = mul i32 2, %877
  %879 = add i32 %878, 2
  %880 = load i32, ptr %11, align 4, !tbaa !9
  %881 = mul i32 %879, %880
  %882 = zext i32 %881 to i64
  %883 = getelementptr inbounds i64, ptr %876, i64 %882
  store ptr %883, ptr %63, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #8
  %884 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %884, ptr %64, align 8, !tbaa !5
  %885 = load i32, ptr %11, align 4, !tbaa !9
  %886 = load ptr, ptr %64, align 8, !tbaa !5
  %887 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %888 = load i64, ptr %887, align 8, !tbaa !18
  %889 = load ptr, ptr %13, align 8, !tbaa !5
  %890 = load ptr, ptr %63, align 8, !tbaa !5
  %891 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %885, ptr noundef %886, i64 noundef %888, ptr noundef %889, ptr noundef %890, ptr noundef %891)
  %892 = load ptr, ptr %34, align 8, !tbaa !5
  %893 = load i32, ptr %40, align 4, !tbaa !9
  %894 = mul i32 2, %893
  %895 = add i32 %894, 3
  %896 = load i32, ptr %11, align 4, !tbaa !9
  %897 = mul i32 %895, %896
  %898 = zext i32 %897 to i64
  %899 = getelementptr inbounds i64, ptr %892, i64 %898
  %900 = load ptr, ptr %35, align 8, !tbaa !5
  %901 = load i32, ptr %11, align 4, !tbaa !9
  %902 = zext i32 %901 to i64
  %903 = mul i64 %902, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %899, ptr align 8 %900, i64 %903, i1 false)
  %904 = load i32, ptr %40, align 4, !tbaa !9
  %905 = add i32 %904, 1
  store i32 %905, ptr %40, align 4, !tbaa !9
  %906 = load i32, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #8
  %907 = load ptr, ptr %34, align 8, !tbaa !5
  %908 = load i32, ptr %40, align 4, !tbaa !9
  %909 = add i32 %908, 1
  %910 = load i32, ptr %11, align 4, !tbaa !9
  %911 = mul i32 %909, %910
  %912 = zext i32 %911 to i64
  %913 = getelementptr inbounds i64, ptr %907, i64 %912
  store ptr %913, ptr %65, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #8
  %914 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %914, ptr %66, align 8, !tbaa !5
  %915 = load i32, ptr %11, align 4, !tbaa !9
  %916 = load ptr, ptr %66, align 8, !tbaa !5
  %917 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %918 = load i64, ptr %917, align 8, !tbaa !18
  %919 = load ptr, ptr %65, align 8, !tbaa !5
  %920 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %915, ptr noundef %916, i64 noundef %918, ptr noundef %919, ptr noundef %920)
  %921 = load ptr, ptr %34, align 8, !tbaa !5
  %922 = load i32, ptr %40, align 4, !tbaa !9
  %923 = mul i32 2, %922
  %924 = add i32 %923, 2
  %925 = load i32, ptr %11, align 4, !tbaa !9
  %926 = mul i32 %924, %925
  %927 = zext i32 %926 to i64
  %928 = getelementptr inbounds i64, ptr %921, i64 %927
  %929 = load ptr, ptr %35, align 8, !tbaa !5
  %930 = load i32, ptr %11, align 4, !tbaa !9
  %931 = zext i32 %930 to i64
  %932 = mul i64 %931, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %928, ptr align 8 %929, i64 %932, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #8
  %933 = load ptr, ptr %34, align 8, !tbaa !5
  %934 = load i32, ptr %40, align 4, !tbaa !9
  %935 = mul i32 2, %934
  %936 = add i32 %935, 2
  %937 = load i32, ptr %11, align 4, !tbaa !9
  %938 = mul i32 %936, %937
  %939 = zext i32 %938 to i64
  %940 = getelementptr inbounds i64, ptr %933, i64 %939
  store ptr %940, ptr %67, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #8
  %941 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %941, ptr %68, align 8, !tbaa !5
  %942 = load i32, ptr %11, align 4, !tbaa !9
  %943 = load ptr, ptr %68, align 8, !tbaa !5
  %944 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %945 = load i64, ptr %944, align 8, !tbaa !18
  %946 = load ptr, ptr %13, align 8, !tbaa !5
  %947 = load ptr, ptr %67, align 8, !tbaa !5
  %948 = load ptr, ptr %35, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %942, ptr noundef %943, i64 noundef %945, ptr noundef %946, ptr noundef %947, ptr noundef %948)
  %949 = load ptr, ptr %34, align 8, !tbaa !5
  %950 = load i32, ptr %40, align 4, !tbaa !9
  %951 = mul i32 2, %950
  %952 = add i32 %951, 3
  %953 = load i32, ptr %11, align 4, !tbaa !9
  %954 = mul i32 %952, %953
  %955 = zext i32 %954 to i64
  %956 = getelementptr inbounds i64, ptr %949, i64 %955
  %957 = load ptr, ptr %35, align 8, !tbaa !5
  %958 = load i32, ptr %11, align 4, !tbaa !9
  %959 = zext i32 %958 to i64
  %960 = mul i64 %959, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %956, ptr align 8 %957, i64 %960, i1 false)
  %961 = load i32, ptr %40, align 4, !tbaa !9
  %962 = add i32 %961, 1
  store i32 %962, ptr %40, align 4, !tbaa !9
  %963 = load i32, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #8
  br label %964

964:                                              ; preds = %564
  br label %965

965:                                              ; preds = %964
  %966 = load i32, ptr %8, align 4, !tbaa !9
  %967 = urem i32 %966, 4
  %968 = icmp ne i32 %967, 0
  br i1 %968, label %969, label %1694

969:                                              ; preds = %965
  call void @llvm.lifetime.start.p0(i64 4, ptr %69) #8
  %970 = load i32, ptr %8, align 4, !tbaa !9
  %971 = udiv i32 %970, 4
  %972 = mul i32 %971, 4
  store i32 %972, ptr %69, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %70) #8
  %973 = load i32, ptr %32, align 4, !tbaa !9
  %974 = load ptr, ptr %9, align 8, !tbaa !5
  %975 = load i32, ptr %69, align 4, !tbaa !9
  %976 = call i64 @Hacl_Bignum_Lib_bn_get_bits_u64(i32 noundef %973, ptr noundef %974, i32 noundef %975, i32 noundef 4)
  store i64 %976, ptr %70, align 8, !tbaa !12
  %977 = load ptr, ptr %10, align 8, !tbaa !5
  %978 = load ptr, ptr %34, align 8, !tbaa !5
  %979 = load i32, ptr %11, align 4, !tbaa !9
  %980 = mul i32 0, %979
  %981 = zext i32 %980 to i64
  %982 = getelementptr inbounds i64, ptr %978, i64 %981
  %983 = load i32, ptr %11, align 4, !tbaa !9
  %984 = zext i32 %983 to i64
  %985 = mul i64 %984, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %977, ptr align 8 %982, i64 %985, i1 false)
  br label %986

986:                                              ; preds = %969
  call void @llvm.lifetime.start.p0(i64 4, ptr %71) #8
  store i32 0, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #8
  %987 = load i64, ptr %70, align 8, !tbaa !12
  %988 = load i32, ptr %71, align 4, !tbaa !9
  %989 = add i32 %988, 1
  %990 = zext i32 %989 to i64
  %991 = call i64 @FStar_UInt64_eq_mask(i64 noundef %987, i64 noundef %990)
  store i64 %991, ptr %72, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #8
  %992 = load ptr, ptr %34, align 8, !tbaa !5
  %993 = load i32, ptr %71, align 4, !tbaa !9
  %994 = add i32 %993, 1
  %995 = load i32, ptr %11, align 4, !tbaa !9
  %996 = mul i32 %994, %995
  %997 = zext i32 %996 to i64
  %998 = getelementptr inbounds i64, ptr %992, i64 %997
  store ptr %998, ptr %73, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %74) #8
  store i32 0, ptr %74, align 4, !tbaa !9
  br label %999

999:                                              ; preds = %1027, %986
  %1000 = load i32, ptr %74, align 4, !tbaa !9
  %1001 = load i32, ptr %11, align 4, !tbaa !9
  %1002 = icmp ult i32 %1000, %1001
  br i1 %1002, label %1004, label %1003

1003:                                             ; preds = %999
  store i32 25, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %74) #8
  br label %1030

1004:                                             ; preds = %999
  call void @llvm.lifetime.start.p0(i64 8, ptr %75) #8
  %1005 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1005, ptr %75, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %76) #8
  %1006 = load i64, ptr %72, align 8, !tbaa !12
  %1007 = load ptr, ptr %73, align 8, !tbaa !5
  %1008 = load i32, ptr %74, align 4, !tbaa !9
  %1009 = zext i32 %1008 to i64
  %1010 = getelementptr inbounds i64, ptr %1007, i64 %1009
  %1011 = load i64, ptr %1010, align 8, !tbaa !12
  %1012 = and i64 %1006, %1011
  %1013 = load i64, ptr %72, align 8, !tbaa !12
  %1014 = xor i64 %1013, -1
  %1015 = load ptr, ptr %10, align 8, !tbaa !5
  %1016 = load i32, ptr %74, align 4, !tbaa !9
  %1017 = zext i32 %1016 to i64
  %1018 = getelementptr inbounds i64, ptr %1015, i64 %1017
  %1019 = load i64, ptr %1018, align 8, !tbaa !12
  %1020 = and i64 %1014, %1019
  %1021 = or i64 %1012, %1020
  store i64 %1021, ptr %76, align 8, !tbaa !12
  %1022 = load i64, ptr %76, align 8, !tbaa !12
  %1023 = load ptr, ptr %75, align 8, !tbaa !5
  %1024 = load i32, ptr %74, align 4, !tbaa !9
  %1025 = zext i32 %1024 to i64
  %1026 = getelementptr inbounds i64, ptr %1023, i64 %1025
  store i64 %1022, ptr %1026, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %76) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #8
  br label %1027

1027:                                             ; preds = %1004
  %1028 = load i32, ptr %74, align 4, !tbaa !9
  %1029 = add i32 %1028, 1
  store i32 %1029, ptr %74, align 4, !tbaa !9
  br label %999, !llvm.loop !23

1030:                                             ; preds = %1003
  %1031 = load i32, ptr %71, align 4, !tbaa !9
  %1032 = add i32 %1031, 1
  store i32 %1032, ptr %71, align 4, !tbaa !9
  %1033 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %77) #8
  %1034 = load i64, ptr %70, align 8, !tbaa !12
  %1035 = load i32, ptr %71, align 4, !tbaa !9
  %1036 = add i32 %1035, 1
  %1037 = zext i32 %1036 to i64
  %1038 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1034, i64 noundef %1037)
  store i64 %1038, ptr %77, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %78) #8
  %1039 = load ptr, ptr %34, align 8, !tbaa !5
  %1040 = load i32, ptr %71, align 4, !tbaa !9
  %1041 = add i32 %1040, 1
  %1042 = load i32, ptr %11, align 4, !tbaa !9
  %1043 = mul i32 %1041, %1042
  %1044 = zext i32 %1043 to i64
  %1045 = getelementptr inbounds i64, ptr %1039, i64 %1044
  store ptr %1045, ptr %78, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %79) #8
  store i32 0, ptr %79, align 4, !tbaa !9
  br label %1046

1046:                                             ; preds = %1074, %1030
  %1047 = load i32, ptr %79, align 4, !tbaa !9
  %1048 = load i32, ptr %11, align 4, !tbaa !9
  %1049 = icmp ult i32 %1047, %1048
  br i1 %1049, label %1051, label %1050

1050:                                             ; preds = %1046
  store i32 28, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %79) #8
  br label %1077

1051:                                             ; preds = %1046
  call void @llvm.lifetime.start.p0(i64 8, ptr %80) #8
  %1052 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1052, ptr %80, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %81) #8
  %1053 = load i64, ptr %77, align 8, !tbaa !12
  %1054 = load ptr, ptr %78, align 8, !tbaa !5
  %1055 = load i32, ptr %79, align 4, !tbaa !9
  %1056 = zext i32 %1055 to i64
  %1057 = getelementptr inbounds i64, ptr %1054, i64 %1056
  %1058 = load i64, ptr %1057, align 8, !tbaa !12
  %1059 = and i64 %1053, %1058
  %1060 = load i64, ptr %77, align 8, !tbaa !12
  %1061 = xor i64 %1060, -1
  %1062 = load ptr, ptr %10, align 8, !tbaa !5
  %1063 = load i32, ptr %79, align 4, !tbaa !9
  %1064 = zext i32 %1063 to i64
  %1065 = getelementptr inbounds i64, ptr %1062, i64 %1064
  %1066 = load i64, ptr %1065, align 8, !tbaa !12
  %1067 = and i64 %1061, %1066
  %1068 = or i64 %1059, %1067
  store i64 %1068, ptr %81, align 8, !tbaa !12
  %1069 = load i64, ptr %81, align 8, !tbaa !12
  %1070 = load ptr, ptr %80, align 8, !tbaa !5
  %1071 = load i32, ptr %79, align 4, !tbaa !9
  %1072 = zext i32 %1071 to i64
  %1073 = getelementptr inbounds i64, ptr %1070, i64 %1072
  store i64 %1069, ptr %1073, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %80) #8
  br label %1074

1074:                                             ; preds = %1051
  %1075 = load i32, ptr %79, align 4, !tbaa !9
  %1076 = add i32 %1075, 1
  store i32 %1076, ptr %79, align 4, !tbaa !9
  br label %1046, !llvm.loop !24

1077:                                             ; preds = %1050
  %1078 = load i32, ptr %71, align 4, !tbaa !9
  %1079 = add i32 %1078, 1
  store i32 %1079, ptr %71, align 4, !tbaa !9
  %1080 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #8
  %1081 = load i64, ptr %70, align 8, !tbaa !12
  %1082 = load i32, ptr %71, align 4, !tbaa !9
  %1083 = add i32 %1082, 1
  %1084 = zext i32 %1083 to i64
  %1085 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1081, i64 noundef %1084)
  store i64 %1085, ptr %82, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #8
  %1086 = load ptr, ptr %34, align 8, !tbaa !5
  %1087 = load i32, ptr %71, align 4, !tbaa !9
  %1088 = add i32 %1087, 1
  %1089 = load i32, ptr %11, align 4, !tbaa !9
  %1090 = mul i32 %1088, %1089
  %1091 = zext i32 %1090 to i64
  %1092 = getelementptr inbounds i64, ptr %1086, i64 %1091
  store ptr %1092, ptr %83, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %84) #8
  store i32 0, ptr %84, align 4, !tbaa !9
  br label %1093

1093:                                             ; preds = %1121, %1077
  %1094 = load i32, ptr %84, align 4, !tbaa !9
  %1095 = load i32, ptr %11, align 4, !tbaa !9
  %1096 = icmp ult i32 %1094, %1095
  br i1 %1096, label %1098, label %1097

1097:                                             ; preds = %1093
  store i32 31, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %84) #8
  br label %1124

1098:                                             ; preds = %1093
  call void @llvm.lifetime.start.p0(i64 8, ptr %85) #8
  %1099 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1099, ptr %85, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %86) #8
  %1100 = load i64, ptr %82, align 8, !tbaa !12
  %1101 = load ptr, ptr %83, align 8, !tbaa !5
  %1102 = load i32, ptr %84, align 4, !tbaa !9
  %1103 = zext i32 %1102 to i64
  %1104 = getelementptr inbounds i64, ptr %1101, i64 %1103
  %1105 = load i64, ptr %1104, align 8, !tbaa !12
  %1106 = and i64 %1100, %1105
  %1107 = load i64, ptr %82, align 8, !tbaa !12
  %1108 = xor i64 %1107, -1
  %1109 = load ptr, ptr %10, align 8, !tbaa !5
  %1110 = load i32, ptr %84, align 4, !tbaa !9
  %1111 = zext i32 %1110 to i64
  %1112 = getelementptr inbounds i64, ptr %1109, i64 %1111
  %1113 = load i64, ptr %1112, align 8, !tbaa !12
  %1114 = and i64 %1108, %1113
  %1115 = or i64 %1106, %1114
  store i64 %1115, ptr %86, align 8, !tbaa !12
  %1116 = load i64, ptr %86, align 8, !tbaa !12
  %1117 = load ptr, ptr %85, align 8, !tbaa !5
  %1118 = load i32, ptr %84, align 4, !tbaa !9
  %1119 = zext i32 %1118 to i64
  %1120 = getelementptr inbounds i64, ptr %1117, i64 %1119
  store i64 %1116, ptr %1120, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %86) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %85) #8
  br label %1121

1121:                                             ; preds = %1098
  %1122 = load i32, ptr %84, align 4, !tbaa !9
  %1123 = add i32 %1122, 1
  store i32 %1123, ptr %84, align 4, !tbaa !9
  br label %1093, !llvm.loop !25

1124:                                             ; preds = %1097
  %1125 = load i32, ptr %71, align 4, !tbaa !9
  %1126 = add i32 %1125, 1
  store i32 %1126, ptr %71, align 4, !tbaa !9
  %1127 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %87) #8
  %1128 = load i64, ptr %70, align 8, !tbaa !12
  %1129 = load i32, ptr %71, align 4, !tbaa !9
  %1130 = add i32 %1129, 1
  %1131 = zext i32 %1130 to i64
  %1132 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1128, i64 noundef %1131)
  store i64 %1132, ptr %87, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %88) #8
  %1133 = load ptr, ptr %34, align 8, !tbaa !5
  %1134 = load i32, ptr %71, align 4, !tbaa !9
  %1135 = add i32 %1134, 1
  %1136 = load i32, ptr %11, align 4, !tbaa !9
  %1137 = mul i32 %1135, %1136
  %1138 = zext i32 %1137 to i64
  %1139 = getelementptr inbounds i64, ptr %1133, i64 %1138
  store ptr %1139, ptr %88, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %89) #8
  store i32 0, ptr %89, align 4, !tbaa !9
  br label %1140

1140:                                             ; preds = %1168, %1124
  %1141 = load i32, ptr %89, align 4, !tbaa !9
  %1142 = load i32, ptr %11, align 4, !tbaa !9
  %1143 = icmp ult i32 %1141, %1142
  br i1 %1143, label %1145, label %1144

1144:                                             ; preds = %1140
  store i32 34, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %89) #8
  br label %1171

1145:                                             ; preds = %1140
  call void @llvm.lifetime.start.p0(i64 8, ptr %90) #8
  %1146 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1146, ptr %90, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %91) #8
  %1147 = load i64, ptr %87, align 8, !tbaa !12
  %1148 = load ptr, ptr %88, align 8, !tbaa !5
  %1149 = load i32, ptr %89, align 4, !tbaa !9
  %1150 = zext i32 %1149 to i64
  %1151 = getelementptr inbounds i64, ptr %1148, i64 %1150
  %1152 = load i64, ptr %1151, align 8, !tbaa !12
  %1153 = and i64 %1147, %1152
  %1154 = load i64, ptr %87, align 8, !tbaa !12
  %1155 = xor i64 %1154, -1
  %1156 = load ptr, ptr %10, align 8, !tbaa !5
  %1157 = load i32, ptr %89, align 4, !tbaa !9
  %1158 = zext i32 %1157 to i64
  %1159 = getelementptr inbounds i64, ptr %1156, i64 %1158
  %1160 = load i64, ptr %1159, align 8, !tbaa !12
  %1161 = and i64 %1155, %1160
  %1162 = or i64 %1153, %1161
  store i64 %1162, ptr %91, align 8, !tbaa !12
  %1163 = load i64, ptr %91, align 8, !tbaa !12
  %1164 = load ptr, ptr %90, align 8, !tbaa !5
  %1165 = load i32, ptr %89, align 4, !tbaa !9
  %1166 = zext i32 %1165 to i64
  %1167 = getelementptr inbounds i64, ptr %1164, i64 %1166
  store i64 %1163, ptr %1167, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %91) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %90) #8
  br label %1168

1168:                                             ; preds = %1145
  %1169 = load i32, ptr %89, align 4, !tbaa !9
  %1170 = add i32 %1169, 1
  store i32 %1170, ptr %89, align 4, !tbaa !9
  br label %1140, !llvm.loop !26

1171:                                             ; preds = %1144
  %1172 = load i32, ptr %71, align 4, !tbaa !9
  %1173 = add i32 %1172, 1
  store i32 %1173, ptr %71, align 4, !tbaa !9
  %1174 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %87) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %92) #8
  %1175 = load i64, ptr %70, align 8, !tbaa !12
  %1176 = load i32, ptr %71, align 4, !tbaa !9
  %1177 = add i32 %1176, 1
  %1178 = zext i32 %1177 to i64
  %1179 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1175, i64 noundef %1178)
  store i64 %1179, ptr %92, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %93) #8
  %1180 = load ptr, ptr %34, align 8, !tbaa !5
  %1181 = load i32, ptr %71, align 4, !tbaa !9
  %1182 = add i32 %1181, 1
  %1183 = load i32, ptr %11, align 4, !tbaa !9
  %1184 = mul i32 %1182, %1183
  %1185 = zext i32 %1184 to i64
  %1186 = getelementptr inbounds i64, ptr %1180, i64 %1185
  store ptr %1186, ptr %93, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %94) #8
  store i32 0, ptr %94, align 4, !tbaa !9
  br label %1187

1187:                                             ; preds = %1215, %1171
  %1188 = load i32, ptr %94, align 4, !tbaa !9
  %1189 = load i32, ptr %11, align 4, !tbaa !9
  %1190 = icmp ult i32 %1188, %1189
  br i1 %1190, label %1192, label %1191

1191:                                             ; preds = %1187
  store i32 37, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %94) #8
  br label %1218

1192:                                             ; preds = %1187
  call void @llvm.lifetime.start.p0(i64 8, ptr %95) #8
  %1193 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1193, ptr %95, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %96) #8
  %1194 = load i64, ptr %92, align 8, !tbaa !12
  %1195 = load ptr, ptr %93, align 8, !tbaa !5
  %1196 = load i32, ptr %94, align 4, !tbaa !9
  %1197 = zext i32 %1196 to i64
  %1198 = getelementptr inbounds i64, ptr %1195, i64 %1197
  %1199 = load i64, ptr %1198, align 8, !tbaa !12
  %1200 = and i64 %1194, %1199
  %1201 = load i64, ptr %92, align 8, !tbaa !12
  %1202 = xor i64 %1201, -1
  %1203 = load ptr, ptr %10, align 8, !tbaa !5
  %1204 = load i32, ptr %94, align 4, !tbaa !9
  %1205 = zext i32 %1204 to i64
  %1206 = getelementptr inbounds i64, ptr %1203, i64 %1205
  %1207 = load i64, ptr %1206, align 8, !tbaa !12
  %1208 = and i64 %1202, %1207
  %1209 = or i64 %1200, %1208
  store i64 %1209, ptr %96, align 8, !tbaa !12
  %1210 = load i64, ptr %96, align 8, !tbaa !12
  %1211 = load ptr, ptr %95, align 8, !tbaa !5
  %1212 = load i32, ptr %94, align 4, !tbaa !9
  %1213 = zext i32 %1212 to i64
  %1214 = getelementptr inbounds i64, ptr %1211, i64 %1213
  store i64 %1210, ptr %1214, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %96) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %95) #8
  br label %1215

1215:                                             ; preds = %1192
  %1216 = load i32, ptr %94, align 4, !tbaa !9
  %1217 = add i32 %1216, 1
  store i32 %1217, ptr %94, align 4, !tbaa !9
  br label %1187, !llvm.loop !27

1218:                                             ; preds = %1191
  %1219 = load i32, ptr %71, align 4, !tbaa !9
  %1220 = add i32 %1219, 1
  store i32 %1220, ptr %71, align 4, !tbaa !9
  %1221 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %93) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %92) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %97) #8
  %1222 = load i64, ptr %70, align 8, !tbaa !12
  %1223 = load i32, ptr %71, align 4, !tbaa !9
  %1224 = add i32 %1223, 1
  %1225 = zext i32 %1224 to i64
  %1226 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1222, i64 noundef %1225)
  store i64 %1226, ptr %97, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %98) #8
  %1227 = load ptr, ptr %34, align 8, !tbaa !5
  %1228 = load i32, ptr %71, align 4, !tbaa !9
  %1229 = add i32 %1228, 1
  %1230 = load i32, ptr %11, align 4, !tbaa !9
  %1231 = mul i32 %1229, %1230
  %1232 = zext i32 %1231 to i64
  %1233 = getelementptr inbounds i64, ptr %1227, i64 %1232
  store ptr %1233, ptr %98, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %99) #8
  store i32 0, ptr %99, align 4, !tbaa !9
  br label %1234

1234:                                             ; preds = %1262, %1218
  %1235 = load i32, ptr %99, align 4, !tbaa !9
  %1236 = load i32, ptr %11, align 4, !tbaa !9
  %1237 = icmp ult i32 %1235, %1236
  br i1 %1237, label %1239, label %1238

1238:                                             ; preds = %1234
  store i32 40, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %99) #8
  br label %1265

1239:                                             ; preds = %1234
  call void @llvm.lifetime.start.p0(i64 8, ptr %100) #8
  %1240 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1240, ptr %100, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %101) #8
  %1241 = load i64, ptr %97, align 8, !tbaa !12
  %1242 = load ptr, ptr %98, align 8, !tbaa !5
  %1243 = load i32, ptr %99, align 4, !tbaa !9
  %1244 = zext i32 %1243 to i64
  %1245 = getelementptr inbounds i64, ptr %1242, i64 %1244
  %1246 = load i64, ptr %1245, align 8, !tbaa !12
  %1247 = and i64 %1241, %1246
  %1248 = load i64, ptr %97, align 8, !tbaa !12
  %1249 = xor i64 %1248, -1
  %1250 = load ptr, ptr %10, align 8, !tbaa !5
  %1251 = load i32, ptr %99, align 4, !tbaa !9
  %1252 = zext i32 %1251 to i64
  %1253 = getelementptr inbounds i64, ptr %1250, i64 %1252
  %1254 = load i64, ptr %1253, align 8, !tbaa !12
  %1255 = and i64 %1249, %1254
  %1256 = or i64 %1247, %1255
  store i64 %1256, ptr %101, align 8, !tbaa !12
  %1257 = load i64, ptr %101, align 8, !tbaa !12
  %1258 = load ptr, ptr %100, align 8, !tbaa !5
  %1259 = load i32, ptr %99, align 4, !tbaa !9
  %1260 = zext i32 %1259 to i64
  %1261 = getelementptr inbounds i64, ptr %1258, i64 %1260
  store i64 %1257, ptr %1261, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %101) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %100) #8
  br label %1262

1262:                                             ; preds = %1239
  %1263 = load i32, ptr %99, align 4, !tbaa !9
  %1264 = add i32 %1263, 1
  store i32 %1264, ptr %99, align 4, !tbaa !9
  br label %1234, !llvm.loop !28

1265:                                             ; preds = %1238
  %1266 = load i32, ptr %71, align 4, !tbaa !9
  %1267 = add i32 %1266, 1
  store i32 %1267, ptr %71, align 4, !tbaa !9
  %1268 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %98) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %97) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %102) #8
  %1269 = load i64, ptr %70, align 8, !tbaa !12
  %1270 = load i32, ptr %71, align 4, !tbaa !9
  %1271 = add i32 %1270, 1
  %1272 = zext i32 %1271 to i64
  %1273 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1269, i64 noundef %1272)
  store i64 %1273, ptr %102, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %103) #8
  %1274 = load ptr, ptr %34, align 8, !tbaa !5
  %1275 = load i32, ptr %71, align 4, !tbaa !9
  %1276 = add i32 %1275, 1
  %1277 = load i32, ptr %11, align 4, !tbaa !9
  %1278 = mul i32 %1276, %1277
  %1279 = zext i32 %1278 to i64
  %1280 = getelementptr inbounds i64, ptr %1274, i64 %1279
  store ptr %1280, ptr %103, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %104) #8
  store i32 0, ptr %104, align 4, !tbaa !9
  br label %1281

1281:                                             ; preds = %1309, %1265
  %1282 = load i32, ptr %104, align 4, !tbaa !9
  %1283 = load i32, ptr %11, align 4, !tbaa !9
  %1284 = icmp ult i32 %1282, %1283
  br i1 %1284, label %1286, label %1285

1285:                                             ; preds = %1281
  store i32 43, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %104) #8
  br label %1312

1286:                                             ; preds = %1281
  call void @llvm.lifetime.start.p0(i64 8, ptr %105) #8
  %1287 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1287, ptr %105, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %106) #8
  %1288 = load i64, ptr %102, align 8, !tbaa !12
  %1289 = load ptr, ptr %103, align 8, !tbaa !5
  %1290 = load i32, ptr %104, align 4, !tbaa !9
  %1291 = zext i32 %1290 to i64
  %1292 = getelementptr inbounds i64, ptr %1289, i64 %1291
  %1293 = load i64, ptr %1292, align 8, !tbaa !12
  %1294 = and i64 %1288, %1293
  %1295 = load i64, ptr %102, align 8, !tbaa !12
  %1296 = xor i64 %1295, -1
  %1297 = load ptr, ptr %10, align 8, !tbaa !5
  %1298 = load i32, ptr %104, align 4, !tbaa !9
  %1299 = zext i32 %1298 to i64
  %1300 = getelementptr inbounds i64, ptr %1297, i64 %1299
  %1301 = load i64, ptr %1300, align 8, !tbaa !12
  %1302 = and i64 %1296, %1301
  %1303 = or i64 %1294, %1302
  store i64 %1303, ptr %106, align 8, !tbaa !12
  %1304 = load i64, ptr %106, align 8, !tbaa !12
  %1305 = load ptr, ptr %105, align 8, !tbaa !5
  %1306 = load i32, ptr %104, align 4, !tbaa !9
  %1307 = zext i32 %1306 to i64
  %1308 = getelementptr inbounds i64, ptr %1305, i64 %1307
  store i64 %1304, ptr %1308, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %106) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %105) #8
  br label %1309

1309:                                             ; preds = %1286
  %1310 = load i32, ptr %104, align 4, !tbaa !9
  %1311 = add i32 %1310, 1
  store i32 %1311, ptr %104, align 4, !tbaa !9
  br label %1281, !llvm.loop !29

1312:                                             ; preds = %1285
  %1313 = load i32, ptr %71, align 4, !tbaa !9
  %1314 = add i32 %1313, 1
  store i32 %1314, ptr %71, align 4, !tbaa !9
  %1315 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %103) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %102) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %107) #8
  %1316 = load i64, ptr %70, align 8, !tbaa !12
  %1317 = load i32, ptr %71, align 4, !tbaa !9
  %1318 = add i32 %1317, 1
  %1319 = zext i32 %1318 to i64
  %1320 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1316, i64 noundef %1319)
  store i64 %1320, ptr %107, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %108) #8
  %1321 = load ptr, ptr %34, align 8, !tbaa !5
  %1322 = load i32, ptr %71, align 4, !tbaa !9
  %1323 = add i32 %1322, 1
  %1324 = load i32, ptr %11, align 4, !tbaa !9
  %1325 = mul i32 %1323, %1324
  %1326 = zext i32 %1325 to i64
  %1327 = getelementptr inbounds i64, ptr %1321, i64 %1326
  store ptr %1327, ptr %108, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %109) #8
  store i32 0, ptr %109, align 4, !tbaa !9
  br label %1328

1328:                                             ; preds = %1356, %1312
  %1329 = load i32, ptr %109, align 4, !tbaa !9
  %1330 = load i32, ptr %11, align 4, !tbaa !9
  %1331 = icmp ult i32 %1329, %1330
  br i1 %1331, label %1333, label %1332

1332:                                             ; preds = %1328
  store i32 46, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %109) #8
  br label %1359

1333:                                             ; preds = %1328
  call void @llvm.lifetime.start.p0(i64 8, ptr %110) #8
  %1334 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1334, ptr %110, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %111) #8
  %1335 = load i64, ptr %107, align 8, !tbaa !12
  %1336 = load ptr, ptr %108, align 8, !tbaa !5
  %1337 = load i32, ptr %109, align 4, !tbaa !9
  %1338 = zext i32 %1337 to i64
  %1339 = getelementptr inbounds i64, ptr %1336, i64 %1338
  %1340 = load i64, ptr %1339, align 8, !tbaa !12
  %1341 = and i64 %1335, %1340
  %1342 = load i64, ptr %107, align 8, !tbaa !12
  %1343 = xor i64 %1342, -1
  %1344 = load ptr, ptr %10, align 8, !tbaa !5
  %1345 = load i32, ptr %109, align 4, !tbaa !9
  %1346 = zext i32 %1345 to i64
  %1347 = getelementptr inbounds i64, ptr %1344, i64 %1346
  %1348 = load i64, ptr %1347, align 8, !tbaa !12
  %1349 = and i64 %1343, %1348
  %1350 = or i64 %1341, %1349
  store i64 %1350, ptr %111, align 8, !tbaa !12
  %1351 = load i64, ptr %111, align 8, !tbaa !12
  %1352 = load ptr, ptr %110, align 8, !tbaa !5
  %1353 = load i32, ptr %109, align 4, !tbaa !9
  %1354 = zext i32 %1353 to i64
  %1355 = getelementptr inbounds i64, ptr %1352, i64 %1354
  store i64 %1351, ptr %1355, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %111) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %110) #8
  br label %1356

1356:                                             ; preds = %1333
  %1357 = load i32, ptr %109, align 4, !tbaa !9
  %1358 = add i32 %1357, 1
  store i32 %1358, ptr %109, align 4, !tbaa !9
  br label %1328, !llvm.loop !30

1359:                                             ; preds = %1332
  %1360 = load i32, ptr %71, align 4, !tbaa !9
  %1361 = add i32 %1360, 1
  store i32 %1361, ptr %71, align 4, !tbaa !9
  %1362 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %108) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %107) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %112) #8
  %1363 = load i64, ptr %70, align 8, !tbaa !12
  %1364 = load i32, ptr %71, align 4, !tbaa !9
  %1365 = add i32 %1364, 1
  %1366 = zext i32 %1365 to i64
  %1367 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1363, i64 noundef %1366)
  store i64 %1367, ptr %112, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %113) #8
  %1368 = load ptr, ptr %34, align 8, !tbaa !5
  %1369 = load i32, ptr %71, align 4, !tbaa !9
  %1370 = add i32 %1369, 1
  %1371 = load i32, ptr %11, align 4, !tbaa !9
  %1372 = mul i32 %1370, %1371
  %1373 = zext i32 %1372 to i64
  %1374 = getelementptr inbounds i64, ptr %1368, i64 %1373
  store ptr %1374, ptr %113, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %114) #8
  store i32 0, ptr %114, align 4, !tbaa !9
  br label %1375

1375:                                             ; preds = %1403, %1359
  %1376 = load i32, ptr %114, align 4, !tbaa !9
  %1377 = load i32, ptr %11, align 4, !tbaa !9
  %1378 = icmp ult i32 %1376, %1377
  br i1 %1378, label %1380, label %1379

1379:                                             ; preds = %1375
  store i32 49, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %114) #8
  br label %1406

1380:                                             ; preds = %1375
  call void @llvm.lifetime.start.p0(i64 8, ptr %115) #8
  %1381 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1381, ptr %115, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %116) #8
  %1382 = load i64, ptr %112, align 8, !tbaa !12
  %1383 = load ptr, ptr %113, align 8, !tbaa !5
  %1384 = load i32, ptr %114, align 4, !tbaa !9
  %1385 = zext i32 %1384 to i64
  %1386 = getelementptr inbounds i64, ptr %1383, i64 %1385
  %1387 = load i64, ptr %1386, align 8, !tbaa !12
  %1388 = and i64 %1382, %1387
  %1389 = load i64, ptr %112, align 8, !tbaa !12
  %1390 = xor i64 %1389, -1
  %1391 = load ptr, ptr %10, align 8, !tbaa !5
  %1392 = load i32, ptr %114, align 4, !tbaa !9
  %1393 = zext i32 %1392 to i64
  %1394 = getelementptr inbounds i64, ptr %1391, i64 %1393
  %1395 = load i64, ptr %1394, align 8, !tbaa !12
  %1396 = and i64 %1390, %1395
  %1397 = or i64 %1388, %1396
  store i64 %1397, ptr %116, align 8, !tbaa !12
  %1398 = load i64, ptr %116, align 8, !tbaa !12
  %1399 = load ptr, ptr %115, align 8, !tbaa !5
  %1400 = load i32, ptr %114, align 4, !tbaa !9
  %1401 = zext i32 %1400 to i64
  %1402 = getelementptr inbounds i64, ptr %1399, i64 %1401
  store i64 %1398, ptr %1402, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %116) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %115) #8
  br label %1403

1403:                                             ; preds = %1380
  %1404 = load i32, ptr %114, align 4, !tbaa !9
  %1405 = add i32 %1404, 1
  store i32 %1405, ptr %114, align 4, !tbaa !9
  br label %1375, !llvm.loop !31

1406:                                             ; preds = %1379
  %1407 = load i32, ptr %71, align 4, !tbaa !9
  %1408 = add i32 %1407, 1
  store i32 %1408, ptr %71, align 4, !tbaa !9
  %1409 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %113) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %112) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %117) #8
  %1410 = load i64, ptr %70, align 8, !tbaa !12
  %1411 = load i32, ptr %71, align 4, !tbaa !9
  %1412 = add i32 %1411, 1
  %1413 = zext i32 %1412 to i64
  %1414 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1410, i64 noundef %1413)
  store i64 %1414, ptr %117, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %118) #8
  %1415 = load ptr, ptr %34, align 8, !tbaa !5
  %1416 = load i32, ptr %71, align 4, !tbaa !9
  %1417 = add i32 %1416, 1
  %1418 = load i32, ptr %11, align 4, !tbaa !9
  %1419 = mul i32 %1417, %1418
  %1420 = zext i32 %1419 to i64
  %1421 = getelementptr inbounds i64, ptr %1415, i64 %1420
  store ptr %1421, ptr %118, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %119) #8
  store i32 0, ptr %119, align 4, !tbaa !9
  br label %1422

1422:                                             ; preds = %1450, %1406
  %1423 = load i32, ptr %119, align 4, !tbaa !9
  %1424 = load i32, ptr %11, align 4, !tbaa !9
  %1425 = icmp ult i32 %1423, %1424
  br i1 %1425, label %1427, label %1426

1426:                                             ; preds = %1422
  store i32 52, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %119) #8
  br label %1453

1427:                                             ; preds = %1422
  call void @llvm.lifetime.start.p0(i64 8, ptr %120) #8
  %1428 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1428, ptr %120, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %121) #8
  %1429 = load i64, ptr %117, align 8, !tbaa !12
  %1430 = load ptr, ptr %118, align 8, !tbaa !5
  %1431 = load i32, ptr %119, align 4, !tbaa !9
  %1432 = zext i32 %1431 to i64
  %1433 = getelementptr inbounds i64, ptr %1430, i64 %1432
  %1434 = load i64, ptr %1433, align 8, !tbaa !12
  %1435 = and i64 %1429, %1434
  %1436 = load i64, ptr %117, align 8, !tbaa !12
  %1437 = xor i64 %1436, -1
  %1438 = load ptr, ptr %10, align 8, !tbaa !5
  %1439 = load i32, ptr %119, align 4, !tbaa !9
  %1440 = zext i32 %1439 to i64
  %1441 = getelementptr inbounds i64, ptr %1438, i64 %1440
  %1442 = load i64, ptr %1441, align 8, !tbaa !12
  %1443 = and i64 %1437, %1442
  %1444 = or i64 %1435, %1443
  store i64 %1444, ptr %121, align 8, !tbaa !12
  %1445 = load i64, ptr %121, align 8, !tbaa !12
  %1446 = load ptr, ptr %120, align 8, !tbaa !5
  %1447 = load i32, ptr %119, align 4, !tbaa !9
  %1448 = zext i32 %1447 to i64
  %1449 = getelementptr inbounds i64, ptr %1446, i64 %1448
  store i64 %1445, ptr %1449, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %121) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %120) #8
  br label %1450

1450:                                             ; preds = %1427
  %1451 = load i32, ptr %119, align 4, !tbaa !9
  %1452 = add i32 %1451, 1
  store i32 %1452, ptr %119, align 4, !tbaa !9
  br label %1422, !llvm.loop !32

1453:                                             ; preds = %1426
  %1454 = load i32, ptr %71, align 4, !tbaa !9
  %1455 = add i32 %1454, 1
  store i32 %1455, ptr %71, align 4, !tbaa !9
  %1456 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %118) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %117) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %122) #8
  %1457 = load i64, ptr %70, align 8, !tbaa !12
  %1458 = load i32, ptr %71, align 4, !tbaa !9
  %1459 = add i32 %1458, 1
  %1460 = zext i32 %1459 to i64
  %1461 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1457, i64 noundef %1460)
  store i64 %1461, ptr %122, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %123) #8
  %1462 = load ptr, ptr %34, align 8, !tbaa !5
  %1463 = load i32, ptr %71, align 4, !tbaa !9
  %1464 = add i32 %1463, 1
  %1465 = load i32, ptr %11, align 4, !tbaa !9
  %1466 = mul i32 %1464, %1465
  %1467 = zext i32 %1466 to i64
  %1468 = getelementptr inbounds i64, ptr %1462, i64 %1467
  store ptr %1468, ptr %123, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %124) #8
  store i32 0, ptr %124, align 4, !tbaa !9
  br label %1469

1469:                                             ; preds = %1497, %1453
  %1470 = load i32, ptr %124, align 4, !tbaa !9
  %1471 = load i32, ptr %11, align 4, !tbaa !9
  %1472 = icmp ult i32 %1470, %1471
  br i1 %1472, label %1474, label %1473

1473:                                             ; preds = %1469
  store i32 55, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %124) #8
  br label %1500

1474:                                             ; preds = %1469
  call void @llvm.lifetime.start.p0(i64 8, ptr %125) #8
  %1475 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1475, ptr %125, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %126) #8
  %1476 = load i64, ptr %122, align 8, !tbaa !12
  %1477 = load ptr, ptr %123, align 8, !tbaa !5
  %1478 = load i32, ptr %124, align 4, !tbaa !9
  %1479 = zext i32 %1478 to i64
  %1480 = getelementptr inbounds i64, ptr %1477, i64 %1479
  %1481 = load i64, ptr %1480, align 8, !tbaa !12
  %1482 = and i64 %1476, %1481
  %1483 = load i64, ptr %122, align 8, !tbaa !12
  %1484 = xor i64 %1483, -1
  %1485 = load ptr, ptr %10, align 8, !tbaa !5
  %1486 = load i32, ptr %124, align 4, !tbaa !9
  %1487 = zext i32 %1486 to i64
  %1488 = getelementptr inbounds i64, ptr %1485, i64 %1487
  %1489 = load i64, ptr %1488, align 8, !tbaa !12
  %1490 = and i64 %1484, %1489
  %1491 = or i64 %1482, %1490
  store i64 %1491, ptr %126, align 8, !tbaa !12
  %1492 = load i64, ptr %126, align 8, !tbaa !12
  %1493 = load ptr, ptr %125, align 8, !tbaa !5
  %1494 = load i32, ptr %124, align 4, !tbaa !9
  %1495 = zext i32 %1494 to i64
  %1496 = getelementptr inbounds i64, ptr %1493, i64 %1495
  store i64 %1492, ptr %1496, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %126) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %125) #8
  br label %1497

1497:                                             ; preds = %1474
  %1498 = load i32, ptr %124, align 4, !tbaa !9
  %1499 = add i32 %1498, 1
  store i32 %1499, ptr %124, align 4, !tbaa !9
  br label %1469, !llvm.loop !33

1500:                                             ; preds = %1473
  %1501 = load i32, ptr %71, align 4, !tbaa !9
  %1502 = add i32 %1501, 1
  store i32 %1502, ptr %71, align 4, !tbaa !9
  %1503 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %123) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %122) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %127) #8
  %1504 = load i64, ptr %70, align 8, !tbaa !12
  %1505 = load i32, ptr %71, align 4, !tbaa !9
  %1506 = add i32 %1505, 1
  %1507 = zext i32 %1506 to i64
  %1508 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1504, i64 noundef %1507)
  store i64 %1508, ptr %127, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %128) #8
  %1509 = load ptr, ptr %34, align 8, !tbaa !5
  %1510 = load i32, ptr %71, align 4, !tbaa !9
  %1511 = add i32 %1510, 1
  %1512 = load i32, ptr %11, align 4, !tbaa !9
  %1513 = mul i32 %1511, %1512
  %1514 = zext i32 %1513 to i64
  %1515 = getelementptr inbounds i64, ptr %1509, i64 %1514
  store ptr %1515, ptr %128, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %129) #8
  store i32 0, ptr %129, align 4, !tbaa !9
  br label %1516

1516:                                             ; preds = %1544, %1500
  %1517 = load i32, ptr %129, align 4, !tbaa !9
  %1518 = load i32, ptr %11, align 4, !tbaa !9
  %1519 = icmp ult i32 %1517, %1518
  br i1 %1519, label %1521, label %1520

1520:                                             ; preds = %1516
  store i32 58, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %129) #8
  br label %1547

1521:                                             ; preds = %1516
  call void @llvm.lifetime.start.p0(i64 8, ptr %130) #8
  %1522 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1522, ptr %130, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %131) #8
  %1523 = load i64, ptr %127, align 8, !tbaa !12
  %1524 = load ptr, ptr %128, align 8, !tbaa !5
  %1525 = load i32, ptr %129, align 4, !tbaa !9
  %1526 = zext i32 %1525 to i64
  %1527 = getelementptr inbounds i64, ptr %1524, i64 %1526
  %1528 = load i64, ptr %1527, align 8, !tbaa !12
  %1529 = and i64 %1523, %1528
  %1530 = load i64, ptr %127, align 8, !tbaa !12
  %1531 = xor i64 %1530, -1
  %1532 = load ptr, ptr %10, align 8, !tbaa !5
  %1533 = load i32, ptr %129, align 4, !tbaa !9
  %1534 = zext i32 %1533 to i64
  %1535 = getelementptr inbounds i64, ptr %1532, i64 %1534
  %1536 = load i64, ptr %1535, align 8, !tbaa !12
  %1537 = and i64 %1531, %1536
  %1538 = or i64 %1529, %1537
  store i64 %1538, ptr %131, align 8, !tbaa !12
  %1539 = load i64, ptr %131, align 8, !tbaa !12
  %1540 = load ptr, ptr %130, align 8, !tbaa !5
  %1541 = load i32, ptr %129, align 4, !tbaa !9
  %1542 = zext i32 %1541 to i64
  %1543 = getelementptr inbounds i64, ptr %1540, i64 %1542
  store i64 %1539, ptr %1543, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %131) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %130) #8
  br label %1544

1544:                                             ; preds = %1521
  %1545 = load i32, ptr %129, align 4, !tbaa !9
  %1546 = add i32 %1545, 1
  store i32 %1546, ptr %129, align 4, !tbaa !9
  br label %1516, !llvm.loop !34

1547:                                             ; preds = %1520
  %1548 = load i32, ptr %71, align 4, !tbaa !9
  %1549 = add i32 %1548, 1
  store i32 %1549, ptr %71, align 4, !tbaa !9
  %1550 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %128) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %127) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %132) #8
  %1551 = load i64, ptr %70, align 8, !tbaa !12
  %1552 = load i32, ptr %71, align 4, !tbaa !9
  %1553 = add i32 %1552, 1
  %1554 = zext i32 %1553 to i64
  %1555 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1551, i64 noundef %1554)
  store i64 %1555, ptr %132, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %133) #8
  %1556 = load ptr, ptr %34, align 8, !tbaa !5
  %1557 = load i32, ptr %71, align 4, !tbaa !9
  %1558 = add i32 %1557, 1
  %1559 = load i32, ptr %11, align 4, !tbaa !9
  %1560 = mul i32 %1558, %1559
  %1561 = zext i32 %1560 to i64
  %1562 = getelementptr inbounds i64, ptr %1556, i64 %1561
  store ptr %1562, ptr %133, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %134) #8
  store i32 0, ptr %134, align 4, !tbaa !9
  br label %1563

1563:                                             ; preds = %1591, %1547
  %1564 = load i32, ptr %134, align 4, !tbaa !9
  %1565 = load i32, ptr %11, align 4, !tbaa !9
  %1566 = icmp ult i32 %1564, %1565
  br i1 %1566, label %1568, label %1567

1567:                                             ; preds = %1563
  store i32 61, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %134) #8
  br label %1594

1568:                                             ; preds = %1563
  call void @llvm.lifetime.start.p0(i64 8, ptr %135) #8
  %1569 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1569, ptr %135, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %136) #8
  %1570 = load i64, ptr %132, align 8, !tbaa !12
  %1571 = load ptr, ptr %133, align 8, !tbaa !5
  %1572 = load i32, ptr %134, align 4, !tbaa !9
  %1573 = zext i32 %1572 to i64
  %1574 = getelementptr inbounds i64, ptr %1571, i64 %1573
  %1575 = load i64, ptr %1574, align 8, !tbaa !12
  %1576 = and i64 %1570, %1575
  %1577 = load i64, ptr %132, align 8, !tbaa !12
  %1578 = xor i64 %1577, -1
  %1579 = load ptr, ptr %10, align 8, !tbaa !5
  %1580 = load i32, ptr %134, align 4, !tbaa !9
  %1581 = zext i32 %1580 to i64
  %1582 = getelementptr inbounds i64, ptr %1579, i64 %1581
  %1583 = load i64, ptr %1582, align 8, !tbaa !12
  %1584 = and i64 %1578, %1583
  %1585 = or i64 %1576, %1584
  store i64 %1585, ptr %136, align 8, !tbaa !12
  %1586 = load i64, ptr %136, align 8, !tbaa !12
  %1587 = load ptr, ptr %135, align 8, !tbaa !5
  %1588 = load i32, ptr %134, align 4, !tbaa !9
  %1589 = zext i32 %1588 to i64
  %1590 = getelementptr inbounds i64, ptr %1587, i64 %1589
  store i64 %1586, ptr %1590, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %136) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %135) #8
  br label %1591

1591:                                             ; preds = %1568
  %1592 = load i32, ptr %134, align 4, !tbaa !9
  %1593 = add i32 %1592, 1
  store i32 %1593, ptr %134, align 4, !tbaa !9
  br label %1563, !llvm.loop !35

1594:                                             ; preds = %1567
  %1595 = load i32, ptr %71, align 4, !tbaa !9
  %1596 = add i32 %1595, 1
  store i32 %1596, ptr %71, align 4, !tbaa !9
  %1597 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %133) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %132) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %137) #8
  %1598 = load i64, ptr %70, align 8, !tbaa !12
  %1599 = load i32, ptr %71, align 4, !tbaa !9
  %1600 = add i32 %1599, 1
  %1601 = zext i32 %1600 to i64
  %1602 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1598, i64 noundef %1601)
  store i64 %1602, ptr %137, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %138) #8
  %1603 = load ptr, ptr %34, align 8, !tbaa !5
  %1604 = load i32, ptr %71, align 4, !tbaa !9
  %1605 = add i32 %1604, 1
  %1606 = load i32, ptr %11, align 4, !tbaa !9
  %1607 = mul i32 %1605, %1606
  %1608 = zext i32 %1607 to i64
  %1609 = getelementptr inbounds i64, ptr %1603, i64 %1608
  store ptr %1609, ptr %138, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %139) #8
  store i32 0, ptr %139, align 4, !tbaa !9
  br label %1610

1610:                                             ; preds = %1638, %1594
  %1611 = load i32, ptr %139, align 4, !tbaa !9
  %1612 = load i32, ptr %11, align 4, !tbaa !9
  %1613 = icmp ult i32 %1611, %1612
  br i1 %1613, label %1615, label %1614

1614:                                             ; preds = %1610
  store i32 64, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %139) #8
  br label %1641

1615:                                             ; preds = %1610
  call void @llvm.lifetime.start.p0(i64 8, ptr %140) #8
  %1616 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1616, ptr %140, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %141) #8
  %1617 = load i64, ptr %137, align 8, !tbaa !12
  %1618 = load ptr, ptr %138, align 8, !tbaa !5
  %1619 = load i32, ptr %139, align 4, !tbaa !9
  %1620 = zext i32 %1619 to i64
  %1621 = getelementptr inbounds i64, ptr %1618, i64 %1620
  %1622 = load i64, ptr %1621, align 8, !tbaa !12
  %1623 = and i64 %1617, %1622
  %1624 = load i64, ptr %137, align 8, !tbaa !12
  %1625 = xor i64 %1624, -1
  %1626 = load ptr, ptr %10, align 8, !tbaa !5
  %1627 = load i32, ptr %139, align 4, !tbaa !9
  %1628 = zext i32 %1627 to i64
  %1629 = getelementptr inbounds i64, ptr %1626, i64 %1628
  %1630 = load i64, ptr %1629, align 8, !tbaa !12
  %1631 = and i64 %1625, %1630
  %1632 = or i64 %1623, %1631
  store i64 %1632, ptr %141, align 8, !tbaa !12
  %1633 = load i64, ptr %141, align 8, !tbaa !12
  %1634 = load ptr, ptr %140, align 8, !tbaa !5
  %1635 = load i32, ptr %139, align 4, !tbaa !9
  %1636 = zext i32 %1635 to i64
  %1637 = getelementptr inbounds i64, ptr %1634, i64 %1636
  store i64 %1633, ptr %1637, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %141) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %140) #8
  br label %1638

1638:                                             ; preds = %1615
  %1639 = load i32, ptr %139, align 4, !tbaa !9
  %1640 = add i32 %1639, 1
  store i32 %1640, ptr %139, align 4, !tbaa !9
  br label %1610, !llvm.loop !36

1641:                                             ; preds = %1614
  %1642 = load i32, ptr %71, align 4, !tbaa !9
  %1643 = add i32 %1642, 1
  store i32 %1643, ptr %71, align 4, !tbaa !9
  %1644 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %138) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %137) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %142) #8
  %1645 = load i64, ptr %70, align 8, !tbaa !12
  %1646 = load i32, ptr %71, align 4, !tbaa !9
  %1647 = add i32 %1646, 1
  %1648 = zext i32 %1647 to i64
  %1649 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1645, i64 noundef %1648)
  store i64 %1649, ptr %142, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %143) #8
  %1650 = load ptr, ptr %34, align 8, !tbaa !5
  %1651 = load i32, ptr %71, align 4, !tbaa !9
  %1652 = add i32 %1651, 1
  %1653 = load i32, ptr %11, align 4, !tbaa !9
  %1654 = mul i32 %1652, %1653
  %1655 = zext i32 %1654 to i64
  %1656 = getelementptr inbounds i64, ptr %1650, i64 %1655
  store ptr %1656, ptr %143, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %144) #8
  store i32 0, ptr %144, align 4, !tbaa !9
  br label %1657

1657:                                             ; preds = %1685, %1641
  %1658 = load i32, ptr %144, align 4, !tbaa !9
  %1659 = load i32, ptr %11, align 4, !tbaa !9
  %1660 = icmp ult i32 %1658, %1659
  br i1 %1660, label %1662, label %1661

1661:                                             ; preds = %1657
  store i32 67, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %144) #8
  br label %1688

1662:                                             ; preds = %1657
  call void @llvm.lifetime.start.p0(i64 8, ptr %145) #8
  %1663 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %1663, ptr %145, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %146) #8
  %1664 = load i64, ptr %142, align 8, !tbaa !12
  %1665 = load ptr, ptr %143, align 8, !tbaa !5
  %1666 = load i32, ptr %144, align 4, !tbaa !9
  %1667 = zext i32 %1666 to i64
  %1668 = getelementptr inbounds i64, ptr %1665, i64 %1667
  %1669 = load i64, ptr %1668, align 8, !tbaa !12
  %1670 = and i64 %1664, %1669
  %1671 = load i64, ptr %142, align 8, !tbaa !12
  %1672 = xor i64 %1671, -1
  %1673 = load ptr, ptr %10, align 8, !tbaa !5
  %1674 = load i32, ptr %144, align 4, !tbaa !9
  %1675 = zext i32 %1674 to i64
  %1676 = getelementptr inbounds i64, ptr %1673, i64 %1675
  %1677 = load i64, ptr %1676, align 8, !tbaa !12
  %1678 = and i64 %1672, %1677
  %1679 = or i64 %1670, %1678
  store i64 %1679, ptr %146, align 8, !tbaa !12
  %1680 = load i64, ptr %146, align 8, !tbaa !12
  %1681 = load ptr, ptr %145, align 8, !tbaa !5
  %1682 = load i32, ptr %144, align 4, !tbaa !9
  %1683 = zext i32 %1682 to i64
  %1684 = getelementptr inbounds i64, ptr %1681, i64 %1683
  store i64 %1680, ptr %1684, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %146) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %145) #8
  br label %1685

1685:                                             ; preds = %1662
  %1686 = load i32, ptr %144, align 4, !tbaa !9
  %1687 = add i32 %1686, 1
  store i32 %1687, ptr %144, align 4, !tbaa !9
  br label %1657, !llvm.loop !37

1688:                                             ; preds = %1661
  %1689 = load i32, ptr %71, align 4, !tbaa !9
  %1690 = add i32 %1689, 1
  store i32 %1690, ptr %71, align 4, !tbaa !9
  %1691 = load i32, ptr %71, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %143) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %142) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %71) #8
  br label %1692

1692:                                             ; preds = %1688
  br label %1693

1693:                                             ; preds = %1692
  call void @llvm.lifetime.end.p0(i64 8, ptr %70) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %69) #8
  br label %1706

1694:                                             ; preds = %965
  call void @llvm.lifetime.start.p0(i64 8, ptr %147) #8
  %1695 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %1695, ptr %147, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %148) #8
  %1696 = load ptr, ptr %33, align 8, !tbaa !5
  %1697 = load i32, ptr %11, align 4, !tbaa !9
  %1698 = zext i32 %1697 to i64
  %1699 = getelementptr inbounds i64, ptr %1696, i64 %1698
  store ptr %1699, ptr %148, align 8, !tbaa !5
  %1700 = load i32, ptr %11, align 4, !tbaa !9
  %1701 = load ptr, ptr %147, align 8, !tbaa !5
  %1702 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %1703 = load i64, ptr %1702, align 8, !tbaa !18
  %1704 = load ptr, ptr %148, align 8, !tbaa !5
  %1705 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef %1700, ptr noundef %1701, i64 noundef %1703, ptr noundef %1704, ptr noundef %1705)
  call void @llvm.lifetime.end.p0(i64 8, ptr %148) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %147) #8
  br label %1706

1706:                                             ; preds = %1694, %1693
  br label %1707

1707:                                             ; preds = %1706
  %1708 = load i32, ptr %11, align 4, !tbaa !9
  %1709 = zext i32 %1708 to i64
  %1710 = icmp ugt i64 %1709, 2305843009213693951
  br i1 %1710, label %1711, label %1713

1711:                                             ; preds = %1707
  %1712 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 387)
  call void @exit(i32 noundef 253) #9
  unreachable

1713:                                             ; preds = %1707
  br label %1714

1714:                                             ; preds = %1713
  br label %1715

1715:                                             ; preds = %1714
  call void @llvm.lifetime.start.p0(i64 8, ptr %149) #8
  %1716 = load i32, ptr %11, align 4, !tbaa !9
  %1717 = zext i32 %1716 to i64
  %1718 = mul i64 %1717, 8
  %1719 = alloca i8, i64 %1718, align 16
  store ptr %1719, ptr %149, align 8, !tbaa !5
  %1720 = load ptr, ptr %149, align 8, !tbaa !5
  %1721 = load i32, ptr %11, align 4, !tbaa !9
  %1722 = zext i32 %1721 to i64
  %1723 = mul i64 %1722, 8
  call void @llvm.memset.p0.i64(ptr align 8 %1720, i8 0, i64 %1723, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %150) #8
  store i32 0, ptr %150, align 4, !tbaa !9
  br label %1724

1724:                                             ; preds = %2511, %1715
  %1725 = load i32, ptr %150, align 4, !tbaa !9
  %1726 = load i32, ptr %8, align 4, !tbaa !9
  %1727 = udiv i32 %1726, 4
  %1728 = icmp ult i32 %1725, %1727
  br i1 %1728, label %1730, label %1729

1729:                                             ; preds = %1724
  store i32 72, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %150) #8
  br label %2514

1730:                                             ; preds = %1724
  br label %1731

1731:                                             ; preds = %1730
  call void @llvm.lifetime.start.p0(i64 4, ptr %151) #8
  store i32 0, ptr %151, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %152) #8
  %1732 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %1732, ptr %152, align 8, !tbaa !5
  %1733 = load i32, ptr %11, align 4, !tbaa !9
  %1734 = load ptr, ptr %152, align 8, !tbaa !5
  %1735 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %1736 = load i64, ptr %1735, align 8, !tbaa !18
  %1737 = load ptr, ptr %10, align 8, !tbaa !5
  %1738 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %1733, ptr noundef %1734, i64 noundef %1736, ptr noundef %1737, ptr noundef %1738)
  %1739 = load i32, ptr %151, align 4, !tbaa !9
  %1740 = add i32 %1739, 1
  store i32 %1740, ptr %151, align 4, !tbaa !9
  %1741 = load i32, ptr %151, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %152) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %153) #8
  %1742 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %1742, ptr %153, align 8, !tbaa !5
  %1743 = load i32, ptr %11, align 4, !tbaa !9
  %1744 = load ptr, ptr %153, align 8, !tbaa !5
  %1745 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %1746 = load i64, ptr %1745, align 8, !tbaa !18
  %1747 = load ptr, ptr %10, align 8, !tbaa !5
  %1748 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %1743, ptr noundef %1744, i64 noundef %1746, ptr noundef %1747, ptr noundef %1748)
  %1749 = load i32, ptr %151, align 4, !tbaa !9
  %1750 = add i32 %1749, 1
  store i32 %1750, ptr %151, align 4, !tbaa !9
  %1751 = load i32, ptr %151, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %153) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %154) #8
  %1752 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %1752, ptr %154, align 8, !tbaa !5
  %1753 = load i32, ptr %11, align 4, !tbaa !9
  %1754 = load ptr, ptr %154, align 8, !tbaa !5
  %1755 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %1756 = load i64, ptr %1755, align 8, !tbaa !18
  %1757 = load ptr, ptr %10, align 8, !tbaa !5
  %1758 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %1753, ptr noundef %1754, i64 noundef %1756, ptr noundef %1757, ptr noundef %1758)
  %1759 = load i32, ptr %151, align 4, !tbaa !9
  %1760 = add i32 %1759, 1
  store i32 %1760, ptr %151, align 4, !tbaa !9
  %1761 = load i32, ptr %151, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %154) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %155) #8
  %1762 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %1762, ptr %155, align 8, !tbaa !5
  %1763 = load i32, ptr %11, align 4, !tbaa !9
  %1764 = load ptr, ptr %155, align 8, !tbaa !5
  %1765 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %1766 = load i64, ptr %1765, align 8, !tbaa !18
  %1767 = load ptr, ptr %10, align 8, !tbaa !5
  %1768 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %1763, ptr noundef %1764, i64 noundef %1766, ptr noundef %1767, ptr noundef %1768)
  %1769 = load i32, ptr %151, align 4, !tbaa !9
  %1770 = add i32 %1769, 1
  store i32 %1770, ptr %151, align 4, !tbaa !9
  %1771 = load i32, ptr %151, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %155) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %151) #8
  br label %1772

1772:                                             ; preds = %1731
  br label %1773

1773:                                             ; preds = %1772
  call void @llvm.lifetime.start.p0(i64 4, ptr %156) #8
  %1774 = load i32, ptr %8, align 4, !tbaa !9
  %1775 = load i32, ptr %8, align 4, !tbaa !9
  %1776 = urem i32 %1775, 4
  %1777 = sub i32 %1774, %1776
  %1778 = load i32, ptr %150, align 4, !tbaa !9
  %1779 = mul i32 4, %1778
  %1780 = sub i32 %1777, %1779
  %1781 = sub i32 %1780, 4
  store i32 %1781, ptr %156, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %157) #8
  %1782 = load i32, ptr %32, align 4, !tbaa !9
  %1783 = load ptr, ptr %9, align 8, !tbaa !5
  %1784 = load i32, ptr %156, align 4, !tbaa !9
  %1785 = call i64 @Hacl_Bignum_Lib_bn_get_bits_u64(i32 noundef %1782, ptr noundef %1783, i32 noundef %1784, i32 noundef 4)
  store i64 %1785, ptr %157, align 8, !tbaa !12
  %1786 = load ptr, ptr %149, align 8, !tbaa !5
  %1787 = load ptr, ptr %34, align 8, !tbaa !5
  %1788 = load i32, ptr %11, align 4, !tbaa !9
  %1789 = mul i32 0, %1788
  %1790 = zext i32 %1789 to i64
  %1791 = getelementptr inbounds i64, ptr %1787, i64 %1790
  %1792 = load i32, ptr %11, align 4, !tbaa !9
  %1793 = zext i32 %1792 to i64
  %1794 = mul i64 %1793, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %1786, ptr align 8 %1791, i64 %1794, i1 false)
  br label %1795

1795:                                             ; preds = %1773
  call void @llvm.lifetime.start.p0(i64 4, ptr %158) #8
  store i32 0, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %159) #8
  %1796 = load i64, ptr %157, align 8, !tbaa !12
  %1797 = load i32, ptr %158, align 4, !tbaa !9
  %1798 = add i32 %1797, 1
  %1799 = zext i32 %1798 to i64
  %1800 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1796, i64 noundef %1799)
  store i64 %1800, ptr %159, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %160) #8
  %1801 = load ptr, ptr %34, align 8, !tbaa !5
  %1802 = load i32, ptr %158, align 4, !tbaa !9
  %1803 = add i32 %1802, 1
  %1804 = load i32, ptr %11, align 4, !tbaa !9
  %1805 = mul i32 %1803, %1804
  %1806 = zext i32 %1805 to i64
  %1807 = getelementptr inbounds i64, ptr %1801, i64 %1806
  store ptr %1807, ptr %160, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %161) #8
  store i32 0, ptr %161, align 4, !tbaa !9
  br label %1808

1808:                                             ; preds = %1836, %1795
  %1809 = load i32, ptr %161, align 4, !tbaa !9
  %1810 = load i32, ptr %11, align 4, !tbaa !9
  %1811 = icmp ult i32 %1809, %1810
  br i1 %1811, label %1813, label %1812

1812:                                             ; preds = %1808
  store i32 79, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %161) #8
  br label %1839

1813:                                             ; preds = %1808
  call void @llvm.lifetime.start.p0(i64 8, ptr %162) #8
  %1814 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %1814, ptr %162, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %163) #8
  %1815 = load i64, ptr %159, align 8, !tbaa !12
  %1816 = load ptr, ptr %160, align 8, !tbaa !5
  %1817 = load i32, ptr %161, align 4, !tbaa !9
  %1818 = zext i32 %1817 to i64
  %1819 = getelementptr inbounds i64, ptr %1816, i64 %1818
  %1820 = load i64, ptr %1819, align 8, !tbaa !12
  %1821 = and i64 %1815, %1820
  %1822 = load i64, ptr %159, align 8, !tbaa !12
  %1823 = xor i64 %1822, -1
  %1824 = load ptr, ptr %149, align 8, !tbaa !5
  %1825 = load i32, ptr %161, align 4, !tbaa !9
  %1826 = zext i32 %1825 to i64
  %1827 = getelementptr inbounds i64, ptr %1824, i64 %1826
  %1828 = load i64, ptr %1827, align 8, !tbaa !12
  %1829 = and i64 %1823, %1828
  %1830 = or i64 %1821, %1829
  store i64 %1830, ptr %163, align 8, !tbaa !12
  %1831 = load i64, ptr %163, align 8, !tbaa !12
  %1832 = load ptr, ptr %162, align 8, !tbaa !5
  %1833 = load i32, ptr %161, align 4, !tbaa !9
  %1834 = zext i32 %1833 to i64
  %1835 = getelementptr inbounds i64, ptr %1832, i64 %1834
  store i64 %1831, ptr %1835, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %163) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %162) #8
  br label %1836

1836:                                             ; preds = %1813
  %1837 = load i32, ptr %161, align 4, !tbaa !9
  %1838 = add i32 %1837, 1
  store i32 %1838, ptr %161, align 4, !tbaa !9
  br label %1808, !llvm.loop !38

1839:                                             ; preds = %1812
  %1840 = load i32, ptr %158, align 4, !tbaa !9
  %1841 = add i32 %1840, 1
  store i32 %1841, ptr %158, align 4, !tbaa !9
  %1842 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %160) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %159) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %164) #8
  %1843 = load i64, ptr %157, align 8, !tbaa !12
  %1844 = load i32, ptr %158, align 4, !tbaa !9
  %1845 = add i32 %1844, 1
  %1846 = zext i32 %1845 to i64
  %1847 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1843, i64 noundef %1846)
  store i64 %1847, ptr %164, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %165) #8
  %1848 = load ptr, ptr %34, align 8, !tbaa !5
  %1849 = load i32, ptr %158, align 4, !tbaa !9
  %1850 = add i32 %1849, 1
  %1851 = load i32, ptr %11, align 4, !tbaa !9
  %1852 = mul i32 %1850, %1851
  %1853 = zext i32 %1852 to i64
  %1854 = getelementptr inbounds i64, ptr %1848, i64 %1853
  store ptr %1854, ptr %165, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %166) #8
  store i32 0, ptr %166, align 4, !tbaa !9
  br label %1855

1855:                                             ; preds = %1883, %1839
  %1856 = load i32, ptr %166, align 4, !tbaa !9
  %1857 = load i32, ptr %11, align 4, !tbaa !9
  %1858 = icmp ult i32 %1856, %1857
  br i1 %1858, label %1860, label %1859

1859:                                             ; preds = %1855
  store i32 82, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %166) #8
  br label %1886

1860:                                             ; preds = %1855
  call void @llvm.lifetime.start.p0(i64 8, ptr %167) #8
  %1861 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %1861, ptr %167, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %168) #8
  %1862 = load i64, ptr %164, align 8, !tbaa !12
  %1863 = load ptr, ptr %165, align 8, !tbaa !5
  %1864 = load i32, ptr %166, align 4, !tbaa !9
  %1865 = zext i32 %1864 to i64
  %1866 = getelementptr inbounds i64, ptr %1863, i64 %1865
  %1867 = load i64, ptr %1866, align 8, !tbaa !12
  %1868 = and i64 %1862, %1867
  %1869 = load i64, ptr %164, align 8, !tbaa !12
  %1870 = xor i64 %1869, -1
  %1871 = load ptr, ptr %149, align 8, !tbaa !5
  %1872 = load i32, ptr %166, align 4, !tbaa !9
  %1873 = zext i32 %1872 to i64
  %1874 = getelementptr inbounds i64, ptr %1871, i64 %1873
  %1875 = load i64, ptr %1874, align 8, !tbaa !12
  %1876 = and i64 %1870, %1875
  %1877 = or i64 %1868, %1876
  store i64 %1877, ptr %168, align 8, !tbaa !12
  %1878 = load i64, ptr %168, align 8, !tbaa !12
  %1879 = load ptr, ptr %167, align 8, !tbaa !5
  %1880 = load i32, ptr %166, align 4, !tbaa !9
  %1881 = zext i32 %1880 to i64
  %1882 = getelementptr inbounds i64, ptr %1879, i64 %1881
  store i64 %1878, ptr %1882, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %168) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %167) #8
  br label %1883

1883:                                             ; preds = %1860
  %1884 = load i32, ptr %166, align 4, !tbaa !9
  %1885 = add i32 %1884, 1
  store i32 %1885, ptr %166, align 4, !tbaa !9
  br label %1855, !llvm.loop !39

1886:                                             ; preds = %1859
  %1887 = load i32, ptr %158, align 4, !tbaa !9
  %1888 = add i32 %1887, 1
  store i32 %1888, ptr %158, align 4, !tbaa !9
  %1889 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %165) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %164) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %169) #8
  %1890 = load i64, ptr %157, align 8, !tbaa !12
  %1891 = load i32, ptr %158, align 4, !tbaa !9
  %1892 = add i32 %1891, 1
  %1893 = zext i32 %1892 to i64
  %1894 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1890, i64 noundef %1893)
  store i64 %1894, ptr %169, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %170) #8
  %1895 = load ptr, ptr %34, align 8, !tbaa !5
  %1896 = load i32, ptr %158, align 4, !tbaa !9
  %1897 = add i32 %1896, 1
  %1898 = load i32, ptr %11, align 4, !tbaa !9
  %1899 = mul i32 %1897, %1898
  %1900 = zext i32 %1899 to i64
  %1901 = getelementptr inbounds i64, ptr %1895, i64 %1900
  store ptr %1901, ptr %170, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %171) #8
  store i32 0, ptr %171, align 4, !tbaa !9
  br label %1902

1902:                                             ; preds = %1930, %1886
  %1903 = load i32, ptr %171, align 4, !tbaa !9
  %1904 = load i32, ptr %11, align 4, !tbaa !9
  %1905 = icmp ult i32 %1903, %1904
  br i1 %1905, label %1907, label %1906

1906:                                             ; preds = %1902
  store i32 85, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %171) #8
  br label %1933

1907:                                             ; preds = %1902
  call void @llvm.lifetime.start.p0(i64 8, ptr %172) #8
  %1908 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %1908, ptr %172, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %173) #8
  %1909 = load i64, ptr %169, align 8, !tbaa !12
  %1910 = load ptr, ptr %170, align 8, !tbaa !5
  %1911 = load i32, ptr %171, align 4, !tbaa !9
  %1912 = zext i32 %1911 to i64
  %1913 = getelementptr inbounds i64, ptr %1910, i64 %1912
  %1914 = load i64, ptr %1913, align 8, !tbaa !12
  %1915 = and i64 %1909, %1914
  %1916 = load i64, ptr %169, align 8, !tbaa !12
  %1917 = xor i64 %1916, -1
  %1918 = load ptr, ptr %149, align 8, !tbaa !5
  %1919 = load i32, ptr %171, align 4, !tbaa !9
  %1920 = zext i32 %1919 to i64
  %1921 = getelementptr inbounds i64, ptr %1918, i64 %1920
  %1922 = load i64, ptr %1921, align 8, !tbaa !12
  %1923 = and i64 %1917, %1922
  %1924 = or i64 %1915, %1923
  store i64 %1924, ptr %173, align 8, !tbaa !12
  %1925 = load i64, ptr %173, align 8, !tbaa !12
  %1926 = load ptr, ptr %172, align 8, !tbaa !5
  %1927 = load i32, ptr %171, align 4, !tbaa !9
  %1928 = zext i32 %1927 to i64
  %1929 = getelementptr inbounds i64, ptr %1926, i64 %1928
  store i64 %1925, ptr %1929, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %173) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %172) #8
  br label %1930

1930:                                             ; preds = %1907
  %1931 = load i32, ptr %171, align 4, !tbaa !9
  %1932 = add i32 %1931, 1
  store i32 %1932, ptr %171, align 4, !tbaa !9
  br label %1902, !llvm.loop !40

1933:                                             ; preds = %1906
  %1934 = load i32, ptr %158, align 4, !tbaa !9
  %1935 = add i32 %1934, 1
  store i32 %1935, ptr %158, align 4, !tbaa !9
  %1936 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %170) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %169) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %174) #8
  %1937 = load i64, ptr %157, align 8, !tbaa !12
  %1938 = load i32, ptr %158, align 4, !tbaa !9
  %1939 = add i32 %1938, 1
  %1940 = zext i32 %1939 to i64
  %1941 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1937, i64 noundef %1940)
  store i64 %1941, ptr %174, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %175) #8
  %1942 = load ptr, ptr %34, align 8, !tbaa !5
  %1943 = load i32, ptr %158, align 4, !tbaa !9
  %1944 = add i32 %1943, 1
  %1945 = load i32, ptr %11, align 4, !tbaa !9
  %1946 = mul i32 %1944, %1945
  %1947 = zext i32 %1946 to i64
  %1948 = getelementptr inbounds i64, ptr %1942, i64 %1947
  store ptr %1948, ptr %175, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %176) #8
  store i32 0, ptr %176, align 4, !tbaa !9
  br label %1949

1949:                                             ; preds = %1977, %1933
  %1950 = load i32, ptr %176, align 4, !tbaa !9
  %1951 = load i32, ptr %11, align 4, !tbaa !9
  %1952 = icmp ult i32 %1950, %1951
  br i1 %1952, label %1954, label %1953

1953:                                             ; preds = %1949
  store i32 88, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %176) #8
  br label %1980

1954:                                             ; preds = %1949
  call void @llvm.lifetime.start.p0(i64 8, ptr %177) #8
  %1955 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %1955, ptr %177, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %178) #8
  %1956 = load i64, ptr %174, align 8, !tbaa !12
  %1957 = load ptr, ptr %175, align 8, !tbaa !5
  %1958 = load i32, ptr %176, align 4, !tbaa !9
  %1959 = zext i32 %1958 to i64
  %1960 = getelementptr inbounds i64, ptr %1957, i64 %1959
  %1961 = load i64, ptr %1960, align 8, !tbaa !12
  %1962 = and i64 %1956, %1961
  %1963 = load i64, ptr %174, align 8, !tbaa !12
  %1964 = xor i64 %1963, -1
  %1965 = load ptr, ptr %149, align 8, !tbaa !5
  %1966 = load i32, ptr %176, align 4, !tbaa !9
  %1967 = zext i32 %1966 to i64
  %1968 = getelementptr inbounds i64, ptr %1965, i64 %1967
  %1969 = load i64, ptr %1968, align 8, !tbaa !12
  %1970 = and i64 %1964, %1969
  %1971 = or i64 %1962, %1970
  store i64 %1971, ptr %178, align 8, !tbaa !12
  %1972 = load i64, ptr %178, align 8, !tbaa !12
  %1973 = load ptr, ptr %177, align 8, !tbaa !5
  %1974 = load i32, ptr %176, align 4, !tbaa !9
  %1975 = zext i32 %1974 to i64
  %1976 = getelementptr inbounds i64, ptr %1973, i64 %1975
  store i64 %1972, ptr %1976, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %178) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %177) #8
  br label %1977

1977:                                             ; preds = %1954
  %1978 = load i32, ptr %176, align 4, !tbaa !9
  %1979 = add i32 %1978, 1
  store i32 %1979, ptr %176, align 4, !tbaa !9
  br label %1949, !llvm.loop !41

1980:                                             ; preds = %1953
  %1981 = load i32, ptr %158, align 4, !tbaa !9
  %1982 = add i32 %1981, 1
  store i32 %1982, ptr %158, align 4, !tbaa !9
  %1983 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %175) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %174) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %179) #8
  %1984 = load i64, ptr %157, align 8, !tbaa !12
  %1985 = load i32, ptr %158, align 4, !tbaa !9
  %1986 = add i32 %1985, 1
  %1987 = zext i32 %1986 to i64
  %1988 = call i64 @FStar_UInt64_eq_mask(i64 noundef %1984, i64 noundef %1987)
  store i64 %1988, ptr %179, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %180) #8
  %1989 = load ptr, ptr %34, align 8, !tbaa !5
  %1990 = load i32, ptr %158, align 4, !tbaa !9
  %1991 = add i32 %1990, 1
  %1992 = load i32, ptr %11, align 4, !tbaa !9
  %1993 = mul i32 %1991, %1992
  %1994 = zext i32 %1993 to i64
  %1995 = getelementptr inbounds i64, ptr %1989, i64 %1994
  store ptr %1995, ptr %180, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %181) #8
  store i32 0, ptr %181, align 4, !tbaa !9
  br label %1996

1996:                                             ; preds = %2024, %1980
  %1997 = load i32, ptr %181, align 4, !tbaa !9
  %1998 = load i32, ptr %11, align 4, !tbaa !9
  %1999 = icmp ult i32 %1997, %1998
  br i1 %1999, label %2001, label %2000

2000:                                             ; preds = %1996
  store i32 91, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %181) #8
  br label %2027

2001:                                             ; preds = %1996
  call void @llvm.lifetime.start.p0(i64 8, ptr %182) #8
  %2002 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2002, ptr %182, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %183) #8
  %2003 = load i64, ptr %179, align 8, !tbaa !12
  %2004 = load ptr, ptr %180, align 8, !tbaa !5
  %2005 = load i32, ptr %181, align 4, !tbaa !9
  %2006 = zext i32 %2005 to i64
  %2007 = getelementptr inbounds i64, ptr %2004, i64 %2006
  %2008 = load i64, ptr %2007, align 8, !tbaa !12
  %2009 = and i64 %2003, %2008
  %2010 = load i64, ptr %179, align 8, !tbaa !12
  %2011 = xor i64 %2010, -1
  %2012 = load ptr, ptr %149, align 8, !tbaa !5
  %2013 = load i32, ptr %181, align 4, !tbaa !9
  %2014 = zext i32 %2013 to i64
  %2015 = getelementptr inbounds i64, ptr %2012, i64 %2014
  %2016 = load i64, ptr %2015, align 8, !tbaa !12
  %2017 = and i64 %2011, %2016
  %2018 = or i64 %2009, %2017
  store i64 %2018, ptr %183, align 8, !tbaa !12
  %2019 = load i64, ptr %183, align 8, !tbaa !12
  %2020 = load ptr, ptr %182, align 8, !tbaa !5
  %2021 = load i32, ptr %181, align 4, !tbaa !9
  %2022 = zext i32 %2021 to i64
  %2023 = getelementptr inbounds i64, ptr %2020, i64 %2022
  store i64 %2019, ptr %2023, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %183) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %182) #8
  br label %2024

2024:                                             ; preds = %2001
  %2025 = load i32, ptr %181, align 4, !tbaa !9
  %2026 = add i32 %2025, 1
  store i32 %2026, ptr %181, align 4, !tbaa !9
  br label %1996, !llvm.loop !42

2027:                                             ; preds = %2000
  %2028 = load i32, ptr %158, align 4, !tbaa !9
  %2029 = add i32 %2028, 1
  store i32 %2029, ptr %158, align 4, !tbaa !9
  %2030 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %180) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %179) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %184) #8
  %2031 = load i64, ptr %157, align 8, !tbaa !12
  %2032 = load i32, ptr %158, align 4, !tbaa !9
  %2033 = add i32 %2032, 1
  %2034 = zext i32 %2033 to i64
  %2035 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2031, i64 noundef %2034)
  store i64 %2035, ptr %184, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %185) #8
  %2036 = load ptr, ptr %34, align 8, !tbaa !5
  %2037 = load i32, ptr %158, align 4, !tbaa !9
  %2038 = add i32 %2037, 1
  %2039 = load i32, ptr %11, align 4, !tbaa !9
  %2040 = mul i32 %2038, %2039
  %2041 = zext i32 %2040 to i64
  %2042 = getelementptr inbounds i64, ptr %2036, i64 %2041
  store ptr %2042, ptr %185, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %186) #8
  store i32 0, ptr %186, align 4, !tbaa !9
  br label %2043

2043:                                             ; preds = %2071, %2027
  %2044 = load i32, ptr %186, align 4, !tbaa !9
  %2045 = load i32, ptr %11, align 4, !tbaa !9
  %2046 = icmp ult i32 %2044, %2045
  br i1 %2046, label %2048, label %2047

2047:                                             ; preds = %2043
  store i32 94, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %186) #8
  br label %2074

2048:                                             ; preds = %2043
  call void @llvm.lifetime.start.p0(i64 8, ptr %187) #8
  %2049 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2049, ptr %187, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %188) #8
  %2050 = load i64, ptr %184, align 8, !tbaa !12
  %2051 = load ptr, ptr %185, align 8, !tbaa !5
  %2052 = load i32, ptr %186, align 4, !tbaa !9
  %2053 = zext i32 %2052 to i64
  %2054 = getelementptr inbounds i64, ptr %2051, i64 %2053
  %2055 = load i64, ptr %2054, align 8, !tbaa !12
  %2056 = and i64 %2050, %2055
  %2057 = load i64, ptr %184, align 8, !tbaa !12
  %2058 = xor i64 %2057, -1
  %2059 = load ptr, ptr %149, align 8, !tbaa !5
  %2060 = load i32, ptr %186, align 4, !tbaa !9
  %2061 = zext i32 %2060 to i64
  %2062 = getelementptr inbounds i64, ptr %2059, i64 %2061
  %2063 = load i64, ptr %2062, align 8, !tbaa !12
  %2064 = and i64 %2058, %2063
  %2065 = or i64 %2056, %2064
  store i64 %2065, ptr %188, align 8, !tbaa !12
  %2066 = load i64, ptr %188, align 8, !tbaa !12
  %2067 = load ptr, ptr %187, align 8, !tbaa !5
  %2068 = load i32, ptr %186, align 4, !tbaa !9
  %2069 = zext i32 %2068 to i64
  %2070 = getelementptr inbounds i64, ptr %2067, i64 %2069
  store i64 %2066, ptr %2070, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %188) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %187) #8
  br label %2071

2071:                                             ; preds = %2048
  %2072 = load i32, ptr %186, align 4, !tbaa !9
  %2073 = add i32 %2072, 1
  store i32 %2073, ptr %186, align 4, !tbaa !9
  br label %2043, !llvm.loop !43

2074:                                             ; preds = %2047
  %2075 = load i32, ptr %158, align 4, !tbaa !9
  %2076 = add i32 %2075, 1
  store i32 %2076, ptr %158, align 4, !tbaa !9
  %2077 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %185) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %184) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %189) #8
  %2078 = load i64, ptr %157, align 8, !tbaa !12
  %2079 = load i32, ptr %158, align 4, !tbaa !9
  %2080 = add i32 %2079, 1
  %2081 = zext i32 %2080 to i64
  %2082 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2078, i64 noundef %2081)
  store i64 %2082, ptr %189, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %190) #8
  %2083 = load ptr, ptr %34, align 8, !tbaa !5
  %2084 = load i32, ptr %158, align 4, !tbaa !9
  %2085 = add i32 %2084, 1
  %2086 = load i32, ptr %11, align 4, !tbaa !9
  %2087 = mul i32 %2085, %2086
  %2088 = zext i32 %2087 to i64
  %2089 = getelementptr inbounds i64, ptr %2083, i64 %2088
  store ptr %2089, ptr %190, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %191) #8
  store i32 0, ptr %191, align 4, !tbaa !9
  br label %2090

2090:                                             ; preds = %2118, %2074
  %2091 = load i32, ptr %191, align 4, !tbaa !9
  %2092 = load i32, ptr %11, align 4, !tbaa !9
  %2093 = icmp ult i32 %2091, %2092
  br i1 %2093, label %2095, label %2094

2094:                                             ; preds = %2090
  store i32 97, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %191) #8
  br label %2121

2095:                                             ; preds = %2090
  call void @llvm.lifetime.start.p0(i64 8, ptr %192) #8
  %2096 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2096, ptr %192, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %193) #8
  %2097 = load i64, ptr %189, align 8, !tbaa !12
  %2098 = load ptr, ptr %190, align 8, !tbaa !5
  %2099 = load i32, ptr %191, align 4, !tbaa !9
  %2100 = zext i32 %2099 to i64
  %2101 = getelementptr inbounds i64, ptr %2098, i64 %2100
  %2102 = load i64, ptr %2101, align 8, !tbaa !12
  %2103 = and i64 %2097, %2102
  %2104 = load i64, ptr %189, align 8, !tbaa !12
  %2105 = xor i64 %2104, -1
  %2106 = load ptr, ptr %149, align 8, !tbaa !5
  %2107 = load i32, ptr %191, align 4, !tbaa !9
  %2108 = zext i32 %2107 to i64
  %2109 = getelementptr inbounds i64, ptr %2106, i64 %2108
  %2110 = load i64, ptr %2109, align 8, !tbaa !12
  %2111 = and i64 %2105, %2110
  %2112 = or i64 %2103, %2111
  store i64 %2112, ptr %193, align 8, !tbaa !12
  %2113 = load i64, ptr %193, align 8, !tbaa !12
  %2114 = load ptr, ptr %192, align 8, !tbaa !5
  %2115 = load i32, ptr %191, align 4, !tbaa !9
  %2116 = zext i32 %2115 to i64
  %2117 = getelementptr inbounds i64, ptr %2114, i64 %2116
  store i64 %2113, ptr %2117, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %193) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %192) #8
  br label %2118

2118:                                             ; preds = %2095
  %2119 = load i32, ptr %191, align 4, !tbaa !9
  %2120 = add i32 %2119, 1
  store i32 %2120, ptr %191, align 4, !tbaa !9
  br label %2090, !llvm.loop !44

2121:                                             ; preds = %2094
  %2122 = load i32, ptr %158, align 4, !tbaa !9
  %2123 = add i32 %2122, 1
  store i32 %2123, ptr %158, align 4, !tbaa !9
  %2124 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %190) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %189) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %194) #8
  %2125 = load i64, ptr %157, align 8, !tbaa !12
  %2126 = load i32, ptr %158, align 4, !tbaa !9
  %2127 = add i32 %2126, 1
  %2128 = zext i32 %2127 to i64
  %2129 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2125, i64 noundef %2128)
  store i64 %2129, ptr %194, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %195) #8
  %2130 = load ptr, ptr %34, align 8, !tbaa !5
  %2131 = load i32, ptr %158, align 4, !tbaa !9
  %2132 = add i32 %2131, 1
  %2133 = load i32, ptr %11, align 4, !tbaa !9
  %2134 = mul i32 %2132, %2133
  %2135 = zext i32 %2134 to i64
  %2136 = getelementptr inbounds i64, ptr %2130, i64 %2135
  store ptr %2136, ptr %195, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %196) #8
  store i32 0, ptr %196, align 4, !tbaa !9
  br label %2137

2137:                                             ; preds = %2165, %2121
  %2138 = load i32, ptr %196, align 4, !tbaa !9
  %2139 = load i32, ptr %11, align 4, !tbaa !9
  %2140 = icmp ult i32 %2138, %2139
  br i1 %2140, label %2142, label %2141

2141:                                             ; preds = %2137
  store i32 100, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %196) #8
  br label %2168

2142:                                             ; preds = %2137
  call void @llvm.lifetime.start.p0(i64 8, ptr %197) #8
  %2143 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2143, ptr %197, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %198) #8
  %2144 = load i64, ptr %194, align 8, !tbaa !12
  %2145 = load ptr, ptr %195, align 8, !tbaa !5
  %2146 = load i32, ptr %196, align 4, !tbaa !9
  %2147 = zext i32 %2146 to i64
  %2148 = getelementptr inbounds i64, ptr %2145, i64 %2147
  %2149 = load i64, ptr %2148, align 8, !tbaa !12
  %2150 = and i64 %2144, %2149
  %2151 = load i64, ptr %194, align 8, !tbaa !12
  %2152 = xor i64 %2151, -1
  %2153 = load ptr, ptr %149, align 8, !tbaa !5
  %2154 = load i32, ptr %196, align 4, !tbaa !9
  %2155 = zext i32 %2154 to i64
  %2156 = getelementptr inbounds i64, ptr %2153, i64 %2155
  %2157 = load i64, ptr %2156, align 8, !tbaa !12
  %2158 = and i64 %2152, %2157
  %2159 = or i64 %2150, %2158
  store i64 %2159, ptr %198, align 8, !tbaa !12
  %2160 = load i64, ptr %198, align 8, !tbaa !12
  %2161 = load ptr, ptr %197, align 8, !tbaa !5
  %2162 = load i32, ptr %196, align 4, !tbaa !9
  %2163 = zext i32 %2162 to i64
  %2164 = getelementptr inbounds i64, ptr %2161, i64 %2163
  store i64 %2160, ptr %2164, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %198) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %197) #8
  br label %2165

2165:                                             ; preds = %2142
  %2166 = load i32, ptr %196, align 4, !tbaa !9
  %2167 = add i32 %2166, 1
  store i32 %2167, ptr %196, align 4, !tbaa !9
  br label %2137, !llvm.loop !45

2168:                                             ; preds = %2141
  %2169 = load i32, ptr %158, align 4, !tbaa !9
  %2170 = add i32 %2169, 1
  store i32 %2170, ptr %158, align 4, !tbaa !9
  %2171 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %195) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %194) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %199) #8
  %2172 = load i64, ptr %157, align 8, !tbaa !12
  %2173 = load i32, ptr %158, align 4, !tbaa !9
  %2174 = add i32 %2173, 1
  %2175 = zext i32 %2174 to i64
  %2176 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2172, i64 noundef %2175)
  store i64 %2176, ptr %199, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %200) #8
  %2177 = load ptr, ptr %34, align 8, !tbaa !5
  %2178 = load i32, ptr %158, align 4, !tbaa !9
  %2179 = add i32 %2178, 1
  %2180 = load i32, ptr %11, align 4, !tbaa !9
  %2181 = mul i32 %2179, %2180
  %2182 = zext i32 %2181 to i64
  %2183 = getelementptr inbounds i64, ptr %2177, i64 %2182
  store ptr %2183, ptr %200, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %201) #8
  store i32 0, ptr %201, align 4, !tbaa !9
  br label %2184

2184:                                             ; preds = %2212, %2168
  %2185 = load i32, ptr %201, align 4, !tbaa !9
  %2186 = load i32, ptr %11, align 4, !tbaa !9
  %2187 = icmp ult i32 %2185, %2186
  br i1 %2187, label %2189, label %2188

2188:                                             ; preds = %2184
  store i32 103, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %201) #8
  br label %2215

2189:                                             ; preds = %2184
  call void @llvm.lifetime.start.p0(i64 8, ptr %202) #8
  %2190 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2190, ptr %202, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %203) #8
  %2191 = load i64, ptr %199, align 8, !tbaa !12
  %2192 = load ptr, ptr %200, align 8, !tbaa !5
  %2193 = load i32, ptr %201, align 4, !tbaa !9
  %2194 = zext i32 %2193 to i64
  %2195 = getelementptr inbounds i64, ptr %2192, i64 %2194
  %2196 = load i64, ptr %2195, align 8, !tbaa !12
  %2197 = and i64 %2191, %2196
  %2198 = load i64, ptr %199, align 8, !tbaa !12
  %2199 = xor i64 %2198, -1
  %2200 = load ptr, ptr %149, align 8, !tbaa !5
  %2201 = load i32, ptr %201, align 4, !tbaa !9
  %2202 = zext i32 %2201 to i64
  %2203 = getelementptr inbounds i64, ptr %2200, i64 %2202
  %2204 = load i64, ptr %2203, align 8, !tbaa !12
  %2205 = and i64 %2199, %2204
  %2206 = or i64 %2197, %2205
  store i64 %2206, ptr %203, align 8, !tbaa !12
  %2207 = load i64, ptr %203, align 8, !tbaa !12
  %2208 = load ptr, ptr %202, align 8, !tbaa !5
  %2209 = load i32, ptr %201, align 4, !tbaa !9
  %2210 = zext i32 %2209 to i64
  %2211 = getelementptr inbounds i64, ptr %2208, i64 %2210
  store i64 %2207, ptr %2211, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %203) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %202) #8
  br label %2212

2212:                                             ; preds = %2189
  %2213 = load i32, ptr %201, align 4, !tbaa !9
  %2214 = add i32 %2213, 1
  store i32 %2214, ptr %201, align 4, !tbaa !9
  br label %2184, !llvm.loop !46

2215:                                             ; preds = %2188
  %2216 = load i32, ptr %158, align 4, !tbaa !9
  %2217 = add i32 %2216, 1
  store i32 %2217, ptr %158, align 4, !tbaa !9
  %2218 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %200) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %199) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %204) #8
  %2219 = load i64, ptr %157, align 8, !tbaa !12
  %2220 = load i32, ptr %158, align 4, !tbaa !9
  %2221 = add i32 %2220, 1
  %2222 = zext i32 %2221 to i64
  %2223 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2219, i64 noundef %2222)
  store i64 %2223, ptr %204, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %205) #8
  %2224 = load ptr, ptr %34, align 8, !tbaa !5
  %2225 = load i32, ptr %158, align 4, !tbaa !9
  %2226 = add i32 %2225, 1
  %2227 = load i32, ptr %11, align 4, !tbaa !9
  %2228 = mul i32 %2226, %2227
  %2229 = zext i32 %2228 to i64
  %2230 = getelementptr inbounds i64, ptr %2224, i64 %2229
  store ptr %2230, ptr %205, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %206) #8
  store i32 0, ptr %206, align 4, !tbaa !9
  br label %2231

2231:                                             ; preds = %2259, %2215
  %2232 = load i32, ptr %206, align 4, !tbaa !9
  %2233 = load i32, ptr %11, align 4, !tbaa !9
  %2234 = icmp ult i32 %2232, %2233
  br i1 %2234, label %2236, label %2235

2235:                                             ; preds = %2231
  store i32 106, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %206) #8
  br label %2262

2236:                                             ; preds = %2231
  call void @llvm.lifetime.start.p0(i64 8, ptr %207) #8
  %2237 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2237, ptr %207, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %208) #8
  %2238 = load i64, ptr %204, align 8, !tbaa !12
  %2239 = load ptr, ptr %205, align 8, !tbaa !5
  %2240 = load i32, ptr %206, align 4, !tbaa !9
  %2241 = zext i32 %2240 to i64
  %2242 = getelementptr inbounds i64, ptr %2239, i64 %2241
  %2243 = load i64, ptr %2242, align 8, !tbaa !12
  %2244 = and i64 %2238, %2243
  %2245 = load i64, ptr %204, align 8, !tbaa !12
  %2246 = xor i64 %2245, -1
  %2247 = load ptr, ptr %149, align 8, !tbaa !5
  %2248 = load i32, ptr %206, align 4, !tbaa !9
  %2249 = zext i32 %2248 to i64
  %2250 = getelementptr inbounds i64, ptr %2247, i64 %2249
  %2251 = load i64, ptr %2250, align 8, !tbaa !12
  %2252 = and i64 %2246, %2251
  %2253 = or i64 %2244, %2252
  store i64 %2253, ptr %208, align 8, !tbaa !12
  %2254 = load i64, ptr %208, align 8, !tbaa !12
  %2255 = load ptr, ptr %207, align 8, !tbaa !5
  %2256 = load i32, ptr %206, align 4, !tbaa !9
  %2257 = zext i32 %2256 to i64
  %2258 = getelementptr inbounds i64, ptr %2255, i64 %2257
  store i64 %2254, ptr %2258, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %208) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %207) #8
  br label %2259

2259:                                             ; preds = %2236
  %2260 = load i32, ptr %206, align 4, !tbaa !9
  %2261 = add i32 %2260, 1
  store i32 %2261, ptr %206, align 4, !tbaa !9
  br label %2231, !llvm.loop !47

2262:                                             ; preds = %2235
  %2263 = load i32, ptr %158, align 4, !tbaa !9
  %2264 = add i32 %2263, 1
  store i32 %2264, ptr %158, align 4, !tbaa !9
  %2265 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %205) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %204) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %209) #8
  %2266 = load i64, ptr %157, align 8, !tbaa !12
  %2267 = load i32, ptr %158, align 4, !tbaa !9
  %2268 = add i32 %2267, 1
  %2269 = zext i32 %2268 to i64
  %2270 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2266, i64 noundef %2269)
  store i64 %2270, ptr %209, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %210) #8
  %2271 = load ptr, ptr %34, align 8, !tbaa !5
  %2272 = load i32, ptr %158, align 4, !tbaa !9
  %2273 = add i32 %2272, 1
  %2274 = load i32, ptr %11, align 4, !tbaa !9
  %2275 = mul i32 %2273, %2274
  %2276 = zext i32 %2275 to i64
  %2277 = getelementptr inbounds i64, ptr %2271, i64 %2276
  store ptr %2277, ptr %210, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %211) #8
  store i32 0, ptr %211, align 4, !tbaa !9
  br label %2278

2278:                                             ; preds = %2306, %2262
  %2279 = load i32, ptr %211, align 4, !tbaa !9
  %2280 = load i32, ptr %11, align 4, !tbaa !9
  %2281 = icmp ult i32 %2279, %2280
  br i1 %2281, label %2283, label %2282

2282:                                             ; preds = %2278
  store i32 109, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %211) #8
  br label %2309

2283:                                             ; preds = %2278
  call void @llvm.lifetime.start.p0(i64 8, ptr %212) #8
  %2284 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2284, ptr %212, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %213) #8
  %2285 = load i64, ptr %209, align 8, !tbaa !12
  %2286 = load ptr, ptr %210, align 8, !tbaa !5
  %2287 = load i32, ptr %211, align 4, !tbaa !9
  %2288 = zext i32 %2287 to i64
  %2289 = getelementptr inbounds i64, ptr %2286, i64 %2288
  %2290 = load i64, ptr %2289, align 8, !tbaa !12
  %2291 = and i64 %2285, %2290
  %2292 = load i64, ptr %209, align 8, !tbaa !12
  %2293 = xor i64 %2292, -1
  %2294 = load ptr, ptr %149, align 8, !tbaa !5
  %2295 = load i32, ptr %211, align 4, !tbaa !9
  %2296 = zext i32 %2295 to i64
  %2297 = getelementptr inbounds i64, ptr %2294, i64 %2296
  %2298 = load i64, ptr %2297, align 8, !tbaa !12
  %2299 = and i64 %2293, %2298
  %2300 = or i64 %2291, %2299
  store i64 %2300, ptr %213, align 8, !tbaa !12
  %2301 = load i64, ptr %213, align 8, !tbaa !12
  %2302 = load ptr, ptr %212, align 8, !tbaa !5
  %2303 = load i32, ptr %211, align 4, !tbaa !9
  %2304 = zext i32 %2303 to i64
  %2305 = getelementptr inbounds i64, ptr %2302, i64 %2304
  store i64 %2301, ptr %2305, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %213) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %212) #8
  br label %2306

2306:                                             ; preds = %2283
  %2307 = load i32, ptr %211, align 4, !tbaa !9
  %2308 = add i32 %2307, 1
  store i32 %2308, ptr %211, align 4, !tbaa !9
  br label %2278, !llvm.loop !48

2309:                                             ; preds = %2282
  %2310 = load i32, ptr %158, align 4, !tbaa !9
  %2311 = add i32 %2310, 1
  store i32 %2311, ptr %158, align 4, !tbaa !9
  %2312 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %210) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %209) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %214) #8
  %2313 = load i64, ptr %157, align 8, !tbaa !12
  %2314 = load i32, ptr %158, align 4, !tbaa !9
  %2315 = add i32 %2314, 1
  %2316 = zext i32 %2315 to i64
  %2317 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2313, i64 noundef %2316)
  store i64 %2317, ptr %214, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %215) #8
  %2318 = load ptr, ptr %34, align 8, !tbaa !5
  %2319 = load i32, ptr %158, align 4, !tbaa !9
  %2320 = add i32 %2319, 1
  %2321 = load i32, ptr %11, align 4, !tbaa !9
  %2322 = mul i32 %2320, %2321
  %2323 = zext i32 %2322 to i64
  %2324 = getelementptr inbounds i64, ptr %2318, i64 %2323
  store ptr %2324, ptr %215, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %216) #8
  store i32 0, ptr %216, align 4, !tbaa !9
  br label %2325

2325:                                             ; preds = %2353, %2309
  %2326 = load i32, ptr %216, align 4, !tbaa !9
  %2327 = load i32, ptr %11, align 4, !tbaa !9
  %2328 = icmp ult i32 %2326, %2327
  br i1 %2328, label %2330, label %2329

2329:                                             ; preds = %2325
  store i32 112, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %216) #8
  br label %2356

2330:                                             ; preds = %2325
  call void @llvm.lifetime.start.p0(i64 8, ptr %217) #8
  %2331 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2331, ptr %217, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %218) #8
  %2332 = load i64, ptr %214, align 8, !tbaa !12
  %2333 = load ptr, ptr %215, align 8, !tbaa !5
  %2334 = load i32, ptr %216, align 4, !tbaa !9
  %2335 = zext i32 %2334 to i64
  %2336 = getelementptr inbounds i64, ptr %2333, i64 %2335
  %2337 = load i64, ptr %2336, align 8, !tbaa !12
  %2338 = and i64 %2332, %2337
  %2339 = load i64, ptr %214, align 8, !tbaa !12
  %2340 = xor i64 %2339, -1
  %2341 = load ptr, ptr %149, align 8, !tbaa !5
  %2342 = load i32, ptr %216, align 4, !tbaa !9
  %2343 = zext i32 %2342 to i64
  %2344 = getelementptr inbounds i64, ptr %2341, i64 %2343
  %2345 = load i64, ptr %2344, align 8, !tbaa !12
  %2346 = and i64 %2340, %2345
  %2347 = or i64 %2338, %2346
  store i64 %2347, ptr %218, align 8, !tbaa !12
  %2348 = load i64, ptr %218, align 8, !tbaa !12
  %2349 = load ptr, ptr %217, align 8, !tbaa !5
  %2350 = load i32, ptr %216, align 4, !tbaa !9
  %2351 = zext i32 %2350 to i64
  %2352 = getelementptr inbounds i64, ptr %2349, i64 %2351
  store i64 %2348, ptr %2352, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %218) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %217) #8
  br label %2353

2353:                                             ; preds = %2330
  %2354 = load i32, ptr %216, align 4, !tbaa !9
  %2355 = add i32 %2354, 1
  store i32 %2355, ptr %216, align 4, !tbaa !9
  br label %2325, !llvm.loop !49

2356:                                             ; preds = %2329
  %2357 = load i32, ptr %158, align 4, !tbaa !9
  %2358 = add i32 %2357, 1
  store i32 %2358, ptr %158, align 4, !tbaa !9
  %2359 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %215) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %214) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %219) #8
  %2360 = load i64, ptr %157, align 8, !tbaa !12
  %2361 = load i32, ptr %158, align 4, !tbaa !9
  %2362 = add i32 %2361, 1
  %2363 = zext i32 %2362 to i64
  %2364 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2360, i64 noundef %2363)
  store i64 %2364, ptr %219, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %220) #8
  %2365 = load ptr, ptr %34, align 8, !tbaa !5
  %2366 = load i32, ptr %158, align 4, !tbaa !9
  %2367 = add i32 %2366, 1
  %2368 = load i32, ptr %11, align 4, !tbaa !9
  %2369 = mul i32 %2367, %2368
  %2370 = zext i32 %2369 to i64
  %2371 = getelementptr inbounds i64, ptr %2365, i64 %2370
  store ptr %2371, ptr %220, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %221) #8
  store i32 0, ptr %221, align 4, !tbaa !9
  br label %2372

2372:                                             ; preds = %2400, %2356
  %2373 = load i32, ptr %221, align 4, !tbaa !9
  %2374 = load i32, ptr %11, align 4, !tbaa !9
  %2375 = icmp ult i32 %2373, %2374
  br i1 %2375, label %2377, label %2376

2376:                                             ; preds = %2372
  store i32 115, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %221) #8
  br label %2403

2377:                                             ; preds = %2372
  call void @llvm.lifetime.start.p0(i64 8, ptr %222) #8
  %2378 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2378, ptr %222, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %223) #8
  %2379 = load i64, ptr %219, align 8, !tbaa !12
  %2380 = load ptr, ptr %220, align 8, !tbaa !5
  %2381 = load i32, ptr %221, align 4, !tbaa !9
  %2382 = zext i32 %2381 to i64
  %2383 = getelementptr inbounds i64, ptr %2380, i64 %2382
  %2384 = load i64, ptr %2383, align 8, !tbaa !12
  %2385 = and i64 %2379, %2384
  %2386 = load i64, ptr %219, align 8, !tbaa !12
  %2387 = xor i64 %2386, -1
  %2388 = load ptr, ptr %149, align 8, !tbaa !5
  %2389 = load i32, ptr %221, align 4, !tbaa !9
  %2390 = zext i32 %2389 to i64
  %2391 = getelementptr inbounds i64, ptr %2388, i64 %2390
  %2392 = load i64, ptr %2391, align 8, !tbaa !12
  %2393 = and i64 %2387, %2392
  %2394 = or i64 %2385, %2393
  store i64 %2394, ptr %223, align 8, !tbaa !12
  %2395 = load i64, ptr %223, align 8, !tbaa !12
  %2396 = load ptr, ptr %222, align 8, !tbaa !5
  %2397 = load i32, ptr %221, align 4, !tbaa !9
  %2398 = zext i32 %2397 to i64
  %2399 = getelementptr inbounds i64, ptr %2396, i64 %2398
  store i64 %2395, ptr %2399, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %223) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %222) #8
  br label %2400

2400:                                             ; preds = %2377
  %2401 = load i32, ptr %221, align 4, !tbaa !9
  %2402 = add i32 %2401, 1
  store i32 %2402, ptr %221, align 4, !tbaa !9
  br label %2372, !llvm.loop !50

2403:                                             ; preds = %2376
  %2404 = load i32, ptr %158, align 4, !tbaa !9
  %2405 = add i32 %2404, 1
  store i32 %2405, ptr %158, align 4, !tbaa !9
  %2406 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %220) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %219) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %224) #8
  %2407 = load i64, ptr %157, align 8, !tbaa !12
  %2408 = load i32, ptr %158, align 4, !tbaa !9
  %2409 = add i32 %2408, 1
  %2410 = zext i32 %2409 to i64
  %2411 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2407, i64 noundef %2410)
  store i64 %2411, ptr %224, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %225) #8
  %2412 = load ptr, ptr %34, align 8, !tbaa !5
  %2413 = load i32, ptr %158, align 4, !tbaa !9
  %2414 = add i32 %2413, 1
  %2415 = load i32, ptr %11, align 4, !tbaa !9
  %2416 = mul i32 %2414, %2415
  %2417 = zext i32 %2416 to i64
  %2418 = getelementptr inbounds i64, ptr %2412, i64 %2417
  store ptr %2418, ptr %225, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %226) #8
  store i32 0, ptr %226, align 4, !tbaa !9
  br label %2419

2419:                                             ; preds = %2447, %2403
  %2420 = load i32, ptr %226, align 4, !tbaa !9
  %2421 = load i32, ptr %11, align 4, !tbaa !9
  %2422 = icmp ult i32 %2420, %2421
  br i1 %2422, label %2424, label %2423

2423:                                             ; preds = %2419
  store i32 118, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %226) #8
  br label %2450

2424:                                             ; preds = %2419
  call void @llvm.lifetime.start.p0(i64 8, ptr %227) #8
  %2425 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2425, ptr %227, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %228) #8
  %2426 = load i64, ptr %224, align 8, !tbaa !12
  %2427 = load ptr, ptr %225, align 8, !tbaa !5
  %2428 = load i32, ptr %226, align 4, !tbaa !9
  %2429 = zext i32 %2428 to i64
  %2430 = getelementptr inbounds i64, ptr %2427, i64 %2429
  %2431 = load i64, ptr %2430, align 8, !tbaa !12
  %2432 = and i64 %2426, %2431
  %2433 = load i64, ptr %224, align 8, !tbaa !12
  %2434 = xor i64 %2433, -1
  %2435 = load ptr, ptr %149, align 8, !tbaa !5
  %2436 = load i32, ptr %226, align 4, !tbaa !9
  %2437 = zext i32 %2436 to i64
  %2438 = getelementptr inbounds i64, ptr %2435, i64 %2437
  %2439 = load i64, ptr %2438, align 8, !tbaa !12
  %2440 = and i64 %2434, %2439
  %2441 = or i64 %2432, %2440
  store i64 %2441, ptr %228, align 8, !tbaa !12
  %2442 = load i64, ptr %228, align 8, !tbaa !12
  %2443 = load ptr, ptr %227, align 8, !tbaa !5
  %2444 = load i32, ptr %226, align 4, !tbaa !9
  %2445 = zext i32 %2444 to i64
  %2446 = getelementptr inbounds i64, ptr %2443, i64 %2445
  store i64 %2442, ptr %2446, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %228) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %227) #8
  br label %2447

2447:                                             ; preds = %2424
  %2448 = load i32, ptr %226, align 4, !tbaa !9
  %2449 = add i32 %2448, 1
  store i32 %2449, ptr %226, align 4, !tbaa !9
  br label %2419, !llvm.loop !51

2450:                                             ; preds = %2423
  %2451 = load i32, ptr %158, align 4, !tbaa !9
  %2452 = add i32 %2451, 1
  store i32 %2452, ptr %158, align 4, !tbaa !9
  %2453 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %225) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %224) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %229) #8
  %2454 = load i64, ptr %157, align 8, !tbaa !12
  %2455 = load i32, ptr %158, align 4, !tbaa !9
  %2456 = add i32 %2455, 1
  %2457 = zext i32 %2456 to i64
  %2458 = call i64 @FStar_UInt64_eq_mask(i64 noundef %2454, i64 noundef %2457)
  store i64 %2458, ptr %229, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %230) #8
  %2459 = load ptr, ptr %34, align 8, !tbaa !5
  %2460 = load i32, ptr %158, align 4, !tbaa !9
  %2461 = add i32 %2460, 1
  %2462 = load i32, ptr %11, align 4, !tbaa !9
  %2463 = mul i32 %2461, %2462
  %2464 = zext i32 %2463 to i64
  %2465 = getelementptr inbounds i64, ptr %2459, i64 %2464
  store ptr %2465, ptr %230, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %231) #8
  store i32 0, ptr %231, align 4, !tbaa !9
  br label %2466

2466:                                             ; preds = %2494, %2450
  %2467 = load i32, ptr %231, align 4, !tbaa !9
  %2468 = load i32, ptr %11, align 4, !tbaa !9
  %2469 = icmp ult i32 %2467, %2468
  br i1 %2469, label %2471, label %2470

2470:                                             ; preds = %2466
  store i32 121, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %231) #8
  br label %2497

2471:                                             ; preds = %2466
  call void @llvm.lifetime.start.p0(i64 8, ptr %232) #8
  %2472 = load ptr, ptr %149, align 8, !tbaa !5
  store ptr %2472, ptr %232, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %233) #8
  %2473 = load i64, ptr %229, align 8, !tbaa !12
  %2474 = load ptr, ptr %230, align 8, !tbaa !5
  %2475 = load i32, ptr %231, align 4, !tbaa !9
  %2476 = zext i32 %2475 to i64
  %2477 = getelementptr inbounds i64, ptr %2474, i64 %2476
  %2478 = load i64, ptr %2477, align 8, !tbaa !12
  %2479 = and i64 %2473, %2478
  %2480 = load i64, ptr %229, align 8, !tbaa !12
  %2481 = xor i64 %2480, -1
  %2482 = load ptr, ptr %149, align 8, !tbaa !5
  %2483 = load i32, ptr %231, align 4, !tbaa !9
  %2484 = zext i32 %2483 to i64
  %2485 = getelementptr inbounds i64, ptr %2482, i64 %2484
  %2486 = load i64, ptr %2485, align 8, !tbaa !12
  %2487 = and i64 %2481, %2486
  %2488 = or i64 %2479, %2487
  store i64 %2488, ptr %233, align 8, !tbaa !12
  %2489 = load i64, ptr %233, align 8, !tbaa !12
  %2490 = load ptr, ptr %232, align 8, !tbaa !5
  %2491 = load i32, ptr %231, align 4, !tbaa !9
  %2492 = zext i32 %2491 to i64
  %2493 = getelementptr inbounds i64, ptr %2490, i64 %2492
  store i64 %2489, ptr %2493, align 8, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %233) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %232) #8
  br label %2494

2494:                                             ; preds = %2471
  %2495 = load i32, ptr %231, align 4, !tbaa !9
  %2496 = add i32 %2495, 1
  store i32 %2496, ptr %231, align 4, !tbaa !9
  br label %2466, !llvm.loop !52

2497:                                             ; preds = %2470
  %2498 = load i32, ptr %158, align 4, !tbaa !9
  %2499 = add i32 %2498, 1
  store i32 %2499, ptr %158, align 4, !tbaa !9
  %2500 = load i32, ptr %158, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %230) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %229) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %158) #8
  br label %2501

2501:                                             ; preds = %2497
  br label %2502

2502:                                             ; preds = %2501
  call void @llvm.lifetime.start.p0(i64 8, ptr %234) #8
  %2503 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %2503, ptr %234, align 8, !tbaa !5
  %2504 = load i32, ptr %11, align 4, !tbaa !9
  %2505 = load ptr, ptr %234, align 8, !tbaa !5
  %2506 = getelementptr inbounds %struct.Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s, ptr %12, i32 0, i32 2
  %2507 = load i64, ptr %2506, align 8, !tbaa !18
  %2508 = load ptr, ptr %10, align 8, !tbaa !5
  %2509 = load ptr, ptr %149, align 8, !tbaa !5
  %2510 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %2504, ptr noundef %2505, i64 noundef %2507, ptr noundef %2508, ptr noundef %2509, ptr noundef %2510)
  call void @llvm.lifetime.end.p0(i64 8, ptr %234) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %157) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %156) #8
  br label %2511

2511:                                             ; preds = %2502
  %2512 = load i32, ptr %150, align 4, !tbaa !9
  %2513 = add i32 %2512, 1
  store i32 %2513, ptr %150, align 4, !tbaa !9
  br label %1724, !llvm.loop !53

2514:                                             ; preds = %1729
  call void @llvm.lifetime.end.p0(i64 8, ptr %149) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #8
  br label %2515

2515:                                             ; preds = %2514, %457
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #8
  ret void
}

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

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

; Function Attrs: noinline nounwind uwtable
declare hidden i64 @FStar_UInt64_eq_mask(i64 noundef, i64 noundef) #7

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nounwind 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 #5 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { 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 #7 = { noinline 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 #8 = { nounwind }
attributes #9 = { noreturn 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 = !{i64 0, i64 4, !9, i64 8, i64 8, !5, i64 16, i64 8, !12, i64 24, i64 8, !5}
!12 = !{!13, !13, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !10, i64 0}
!15 = !{!"Hacl_Bignum_MontArithmetic_bn_mont_ctx_u64_s", !10, i64 0, !6, i64 8, !13, i64 16, !6, i64 24}
!16 = !{!15, !6, i64 8}
!17 = !{!15, !6, i64 24}
!18 = !{!15, !13, i64 16}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = distinct !{!21, !20}
!22 = distinct !{!22, !20}
!23 = distinct !{!23, !20}
!24 = distinct !{!24, !20}
!25 = distinct !{!25, !20}
!26 = distinct !{!26, !20}
!27 = distinct !{!27, !20}
!28 = distinct !{!28, !20}
!29 = distinct !{!29, !20}
!30 = distinct !{!30, !20}
!31 = distinct !{!31, !20}
!32 = distinct !{!32, !20}
!33 = distinct !{!33, !20}
!34 = distinct !{!34, !20}
!35 = distinct !{!35, !20}
!36 = distinct !{!36, !20}
!37 = distinct !{!37, !20}
!38 = distinct !{!38, !20}
!39 = distinct !{!39, !20}
!40 = distinct !{!40, !20}
!41 = distinct !{!41, !20}
!42 = distinct !{!42, !20}
!43 = distinct !{!43, !20}
!44 = distinct !{!44, !20}
!45 = distinct !{!45, !20}
!46 = distinct !{!46, !20}
!47 = distinct !{!47, !20}
!48 = distinct !{!48, !20}
!49 = distinct !{!49, !20}
!50 = distinct !{!50, !20}
!51 = distinct !{!51, !20}
!52 = distinct !{!52, !20}
!53 = distinct !{!53, !20}


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

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #0

; Function Attrs: nounwind uwtable
declare dso_local i32 @Hacl_GenericField64_field_get_len(ptr noundef) local_unnamed_addr #1

declare void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local void @Hacl_GenericField64_exp_consttime(ptr noundef %0, ptr nocapture noundef readonly %1, i32 noundef %2, ptr noundef %3, ptr noundef %4) local_unnamed_addr #1 {
  %6 = tail call i32 @Hacl_GenericField64_field_get_len(ptr noundef %0)
  %.sroa.7761.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 8
  %.sroa.7761.0.copyload = load ptr, ptr %.sroa.7761.0..sroa_idx, align 8, !tbaa !5
  %.sroa.9.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 16
  %.sroa.9.0.copyload = load i64, ptr %.sroa.9.0..sroa_idx, align 8, !tbaa !9
  %.sroa.33.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 24
  %.sroa.33.0.copyload = load ptr, ptr %.sroa.33.0..sroa_idx, align 8, !tbaa !5
  %.sroa.0.0.copyload = load i32, ptr %0, align 8, !tbaa !11
  %7 = zext i32 %.sroa.0.0.copyload to i64
  %8 = shl nuw nsw i64 %7, 3
  %9 = alloca i8, i64 %8, align 16
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %9, ptr align 8 %1, i64 %8, i1 false)
  %10 = icmp ult i32 %2, 200
  br i1 %10, label %11, label %76

11:                                               ; preds = %5
  %12 = shl i32 %6, 1
  %13 = zext i32 %12 to i64
  %14 = shl nuw nsw i64 %13, 3
  %15 = alloca i8, i64 %14, align 16
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %15, i8 0, i64 %14, i1 false)
  %16 = zext i32 %6 to i64
  %17 = shl nuw nsw i64 %16, 3
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %15, ptr align 8 %.sroa.7761.0.copyload, i64 %17, i1 false)
  %18 = getelementptr inbounds i64, ptr %15, i64 %16
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %18, ptr align 8 %.sroa.33.0.copyload, i64 %17, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef %6, ptr noundef nonnull %15, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %18, ptr noundef %4) #7
  %.not1220 = icmp eq i32 %2, 0
  br i1 %.not1220, label %.preheader, label %.lr.ph1185

.lr.ph1185:                                       ; preds = %11
  %.not1221 = icmp eq i32 %6, 0
  %min.iters.check1942 = icmp ult i32 %6, 4
  %n.vec1945 = and i64 %16, 4294967292
  %cmp.n1956 = icmp eq i64 %n.vec1945, %16
  br label %33

.preheader:                                       ; preds = %._crit_edge1181, %11
  %.0.lcssa = phi i64 [ 0, %11 ], [ %43, %._crit_edge1181 ]
  %.not1222 = icmp eq i32 %6, 0
  br i1 %.not1222, label %.loopexit, label %.lr.ph1187

.lr.ph1187:                                       ; preds = %.preheader
  %19 = sub nsw i64 0, %.0.lcssa
  %min.iters.check1959 = icmp ult i32 %6, 4
  br i1 %min.iters.check1959, label %scalar.ph1958.preheader, label %vector.ph1960

scalar.ph1958.preheader:                          ; preds = %middle.block1957, %.lr.ph1187
  %indvars.iv1377.ph = phi i64 [ 0, %.lr.ph1187 ], [ %n.vec1962, %middle.block1957 ]
  br label %scalar.ph1958

vector.ph1960:                                    ; preds = %.lr.ph1187
  %n.vec1962 = and i64 %16, 4294967292
  %broadcast.splatinsert1970 = insertelement <2 x i64> poison, i64 %19, i64 0
  %broadcast.splat1971 = shufflevector <2 x i64> %broadcast.splatinsert1970, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1964

vector.body1964:                                  ; preds = %vector.body1964, %vector.ph1960
  %index1965 = phi i64 [ 0, %vector.ph1960 ], [ %index.next1972, %vector.body1964 ]
  %20 = getelementptr inbounds i64, ptr %4, i64 %index1965
  %21 = getelementptr inbounds i8, ptr %20, i64 16
  %wide.load1966 = load <2 x i64>, ptr %20, align 8, !tbaa !9
  %wide.load1967 = load <2 x i64>, ptr %21, align 8, !tbaa !9
  %22 = getelementptr inbounds i64, ptr %9, i64 %index1965
  %23 = getelementptr inbounds i8, ptr %22, i64 16
  %wide.load1968 = load <2 x i64>, ptr %22, align 16, !tbaa !9
  %wide.load1969 = load <2 x i64>, ptr %23, align 16, !tbaa !9
  %24 = xor <2 x i64> %wide.load1968, %wide.load1966
  %25 = xor <2 x i64> %wide.load1969, %wide.load1967
  %26 = and <2 x i64> %24, %broadcast.splat1971
  %27 = and <2 x i64> %25, %broadcast.splat1971
  %28 = xor <2 x i64> %26, %wide.load1966
  %29 = xor <2 x i64> %27, %wide.load1967
  store <2 x i64> %28, ptr %20, align 8, !tbaa !9
  store <2 x i64> %29, ptr %21, align 8, !tbaa !9
  %30 = xor <2 x i64> %26, %wide.load1968
  %31 = xor <2 x i64> %27, %wide.load1969
  store <2 x i64> %30, ptr %22, align 16, !tbaa !9
  store <2 x i64> %31, ptr %23, align 16, !tbaa !9
  %index.next1972 = add nuw i64 %index1965, 4
  %32 = icmp eq i64 %index.next1972, %n.vec1962
  br i1 %32, label %middle.block1957, label %vector.body1964, !llvm.loop !13

middle.block1957:                                 ; preds = %vector.body1964
  %cmp.n1973 = icmp eq i64 %n.vec1962, %16
  br i1 %cmp.n1973, label %.loopexit, label %scalar.ph1958.preheader

33:                                               ; preds = %.lr.ph1185, %._crit_edge1181
  %.01183 = phi i64 [ 0, %.lr.ph1185 ], [ %43, %._crit_edge1181 ]
  %.010201182 = phi i32 [ 0, %.lr.ph1185 ], [ %59, %._crit_edge1181 ]
  %34 = xor i32 %.010201182, -1
  %35 = add nsw i32 %34, %2
  %36 = lshr i32 %35, 6
  %37 = and i32 %35, 63
  %38 = zext nneg i32 %36 to i64
  %39 = getelementptr inbounds i64, ptr %3, i64 %38
  %40 = load i64, ptr %39, align 8, !tbaa !9
  %41 = zext nneg i32 %37 to i64
  %42 = lshr i64 %40, %41
  %43 = and i64 %42, 1
  br i1 %.not1221, label %._crit_edge1181, label %.lr.ph1180

.lr.ph1180:                                       ; preds = %33
  %44 = xor i64 %43, %.01183
  %45 = sub nsw i64 0, %44
  br i1 %min.iters.check1942, label %scalar.ph1941.preheader, label %vector.ph1943

scalar.ph1941.preheader:                          ; preds = %middle.block1940, %.lr.ph1180
  %indvars.iv1371.ph = phi i64 [ 0, %.lr.ph1180 ], [ %n.vec1945, %middle.block1940 ]
  br label %scalar.ph1941

vector.ph1943:                                    ; preds = %.lr.ph1180
  %broadcast.splatinsert1953 = insertelement <2 x i64> poison, i64 %45, i64 0
  %broadcast.splat1954 = shufflevector <2 x i64> %broadcast.splatinsert1953, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1947

vector.body1947:                                  ; preds = %vector.body1947, %vector.ph1943
  %index1948 = phi i64 [ 0, %vector.ph1943 ], [ %index.next1955, %vector.body1947 ]
  %46 = getelementptr inbounds i64, ptr %4, i64 %index1948
  %47 = getelementptr inbounds i8, ptr %46, i64 16
  %wide.load1949 = load <2 x i64>, ptr %46, align 8, !tbaa !9
  %wide.load1950 = load <2 x i64>, ptr %47, align 8, !tbaa !9
  %48 = getelementptr inbounds i64, ptr %9, i64 %index1948
  %49 = getelementptr inbounds i8, ptr %48, i64 16
  %wide.load1951 = load <2 x i64>, ptr %48, align 16, !tbaa !9
  %wide.load1952 = load <2 x i64>, ptr %49, align 16, !tbaa !9
  %50 = xor <2 x i64> %wide.load1951, %wide.load1949
  %51 = xor <2 x i64> %wide.load1952, %wide.load1950
  %52 = and <2 x i64> %50, %broadcast.splat1954
  %53 = and <2 x i64> %51, %broadcast.splat1954
  %54 = xor <2 x i64> %52, %wide.load1949
  %55 = xor <2 x i64> %53, %wide.load1950
  store <2 x i64> %54, ptr %46, align 8, !tbaa !9
  store <2 x i64> %55, ptr %47, align 8, !tbaa !9
  %56 = xor <2 x i64> %52, %wide.load1951
  %57 = xor <2 x i64> %53, %wide.load1952
  store <2 x i64> %56, ptr %48, align 16, !tbaa !9
  store <2 x i64> %57, ptr %49, align 16, !tbaa !9
  %index.next1955 = add nuw i64 %index1948, 4
  %58 = icmp eq i64 %index.next1955, %n.vec1945
  br i1 %58, label %middle.block1940, label %vector.body1947, !llvm.loop !17

middle.block1940:                                 ; preds = %vector.body1947
  br i1 %cmp.n1956, label %._crit_edge1181, label %scalar.ph1941.preheader

._crit_edge1181:                                  ; preds = %scalar.ph1941, %middle.block1940, %33
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %15, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef %4, ptr noundef nonnull %9) #7
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %15, i64 noundef %.sroa.9.0.copyload, ptr noundef %4, ptr noundef %4) #7
  %59 = add nuw i32 %.010201182, 1
  %exitcond1376.not = icmp eq i32 %59, %2
  br i1 %exitcond1376.not, label %.preheader, label %33, !llvm.loop !18

scalar.ph1941:                                    ; preds = %scalar.ph1941.preheader, %scalar.ph1941
  %indvars.iv1371 = phi i64 [ %indvars.iv.next1372, %scalar.ph1941 ], [ %indvars.iv1371.ph, %scalar.ph1941.preheader ]
  %60 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1371
  %61 = load i64, ptr %60, align 8, !tbaa !9
  %62 = getelementptr inbounds i64, ptr %9, i64 %indvars.iv1371
  %63 = load i64, ptr %62, align 8, !tbaa !9
  %64 = xor i64 %63, %61
  %65 = and i64 %64, %45
  %66 = xor i64 %65, %61
  store i64 %66, ptr %60, align 8, !tbaa !9
  %67 = xor i64 %65, %63
  store i64 %67, ptr %62, align 8, !tbaa !9
  %indvars.iv.next1372 = add nuw nsw i64 %indvars.iv1371, 1
  %exitcond1375.not = icmp eq i64 %indvars.iv.next1372, %16
  br i1 %exitcond1375.not, label %._crit_edge1181, label %scalar.ph1941, !llvm.loop !19

scalar.ph1958:                                    ; preds = %scalar.ph1958.preheader, %scalar.ph1958
  %indvars.iv1377 = phi i64 [ %indvars.iv.next1378, %scalar.ph1958 ], [ %indvars.iv1377.ph, %scalar.ph1958.preheader ]
  %68 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1377
  %69 = load i64, ptr %68, align 8, !tbaa !9
  %70 = getelementptr inbounds i64, ptr %9, i64 %indvars.iv1377
  %71 = load i64, ptr %70, align 8, !tbaa !9
  %72 = xor i64 %71, %69
  %73 = and i64 %72, %19
  %74 = xor i64 %73, %69
  store i64 %74, ptr %68, align 8, !tbaa !9
  %75 = xor i64 %73, %71
  store i64 %75, ptr %70, align 8, !tbaa !9
  %indvars.iv.next1378 = add nuw nsw i64 %indvars.iv1377, 1
  %exitcond1381.not = icmp eq i64 %indvars.iv.next1378, %16
  br i1 %exitcond1381.not, label %.loopexit, label %scalar.ph1958, !llvm.loop !20

76:                                               ; preds = %5
  %77 = add i32 %2, -1
  %78 = lshr i32 %77, 6
  %79 = add nuw nsw i32 %78, 1
  %80 = shl i32 %6, 1
  %81 = zext i32 %80 to i64
  %82 = shl nuw nsw i64 %81, 3
  %83 = alloca i8, i64 %82, align 16
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %83, i8 0, i64 %82, i1 false)
  %84 = zext i32 %6 to i64
  %85 = shl nuw nsw i64 %84, 3
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %83, ptr align 8 %.sroa.7761.0.copyload, i64 %85, i1 false)
  %86 = getelementptr inbounds i64, ptr %83, i64 %84
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %86, ptr align 8 %.sroa.33.0.copyload, i64 %85, i1 false)
  %87 = shl i32 %6, 4
  %88 = zext i32 %87 to i64
  %89 = shl nuw nsw i64 %88, 3
  %90 = alloca i8, i64 %89, align 16
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %90, i8 0, i64 %89, i1 false)
  %91 = alloca i8, i64 %85, align 16
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %91, i8 0, i64 %85, i1 false)
  %92 = getelementptr inbounds i64, ptr %90, i64 %84
  call void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %86, ptr noundef nonnull %90) #7
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %92, ptr nonnull align 16 %9, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %92, ptr noundef nonnull %91) #7
  %93 = getelementptr inbounds i64, ptr %90, i64 %81
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %93, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef nonnull %93, ptr noundef nonnull %91) #7
  %94 = mul i32 %6, 3
  %95 = zext i32 %94 to i64
  %96 = getelementptr inbounds i64, ptr %90, i64 %95
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %96, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %93, ptr noundef nonnull %91) #7
  %97 = shl i32 %6, 2
  %98 = zext i32 %97 to i64
  %99 = getelementptr inbounds i64, ptr %90, i64 %98
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %99, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef nonnull %99, ptr noundef nonnull %91) #7
  %100 = mul i32 %6, 5
  %101 = zext i32 %100 to i64
  %102 = getelementptr inbounds i64, ptr %90, i64 %101
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %102, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %96, ptr noundef nonnull %91) #7
  %103 = mul i32 %6, 6
  %104 = zext i32 %103 to i64
  %105 = getelementptr inbounds i64, ptr %90, i64 %104
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %105, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef nonnull %105, ptr noundef nonnull %91) #7
  %106 = mul i32 %6, 7
  %107 = zext i32 %106 to i64
  %108 = getelementptr inbounds i64, ptr %90, i64 %107
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %108, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %99, ptr noundef nonnull %91) #7
  %109 = shl i32 %6, 3
  %110 = zext i32 %109 to i64
  %111 = getelementptr inbounds i64, ptr %90, i64 %110
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %111, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef nonnull %111, ptr noundef nonnull %91) #7
  %112 = mul i32 %6, 9
  %113 = zext i32 %112 to i64
  %114 = getelementptr inbounds i64, ptr %90, i64 %113
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %114, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %102, ptr noundef nonnull %91) #7
  %115 = mul i32 %6, 10
  %116 = zext i32 %115 to i64
  %117 = getelementptr inbounds i64, ptr %90, i64 %116
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %117, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef nonnull %117, ptr noundef nonnull %91) #7
  %118 = mul i32 %6, 11
  %119 = zext i32 %118 to i64
  %120 = getelementptr inbounds i64, ptr %90, i64 %119
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %120, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %105, ptr noundef nonnull %91) #7
  %121 = mul i32 %6, 12
  %122 = zext i32 %121 to i64
  %123 = getelementptr inbounds i64, ptr %90, i64 %122
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %123, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef nonnull %123, ptr noundef nonnull %91) #7
  %124 = mul i32 %6, 13
  %125 = zext i32 %124 to i64
  %126 = getelementptr inbounds i64, ptr %90, i64 %125
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %126, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %108, ptr noundef nonnull %91) #7
  %127 = mul i32 %6, 14
  %128 = zext i32 %127 to i64
  %129 = getelementptr inbounds i64, ptr %90, i64 %128
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %129, ptr nonnull align 16 %91, i64 %85, i1 false)
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %9, ptr noundef nonnull %129, ptr noundef nonnull %91) #7
  %130 = mul i32 %6, 15
  %131 = zext i32 %130 to i64
  %132 = getelementptr inbounds i64, ptr %90, i64 %131
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %132, ptr nonnull align 16 %91, i64 %85, i1 false)
  %133 = and i32 %2, 3
  %.not = icmp eq i32 %133, 0
  br i1 %.not, label %451, label %134

134:                                              ; preds = %76
  %135 = and i32 %2, -4
  %136 = call i64 @Hacl_Bignum_Lib_bn_get_bits_u64(i32 noundef %79, ptr noundef %3, i32 noundef %135, i32 noundef 4)
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %4, ptr nonnull align 16 %90, i64 %85, i1 false)
  %137 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 1)
  %.not1188 = icmp eq i32 %6, 0
  br i1 %.not1188, label %._crit_edge.thread, label %.lr.ph

._crit_edge.thread:                               ; preds = %134
  %138 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 2)
  br label %._crit_edge1063.thread

.lr.ph:                                           ; preds = %134
  %139 = xor i64 %137, -1
  %min.iters.check = icmp ult i32 %6, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

scalar.ph.preheader:                              ; preds = %middle.block, %.lr.ph
  %indvars.iv.ph = phi i64 [ 0, %.lr.ph ], [ %n.vec, %middle.block ]
  br label %scalar.ph

vector.ph:                                        ; preds = %.lr.ph
  %n.vec = and i64 %84, 4294967292
  %broadcast.splatinsert = insertelement <2 x i64> poison, i64 %137, i64 0
  %broadcast.splat = shufflevector <2 x i64> %broadcast.splatinsert, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1387 = insertelement <2 x i64> poison, i64 %139, i64 0
  %broadcast.splat1388 = shufflevector <2 x i64> %broadcast.splatinsert1387, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %140 = getelementptr inbounds i64, ptr %92, i64 %index
  %141 = getelementptr inbounds i8, ptr %140, i64 16
  %wide.load = load <2 x i64>, ptr %140, align 8, !tbaa !9
  %wide.load1384 = load <2 x i64>, ptr %141, align 8, !tbaa !9
  %142 = and <2 x i64> %wide.load, %broadcast.splat
  %143 = and <2 x i64> %wide.load1384, %broadcast.splat
  %144 = getelementptr inbounds i64, ptr %4, i64 %index
  %145 = getelementptr inbounds i8, ptr %144, i64 16
  %wide.load1385 = load <2 x i64>, ptr %144, align 8, !tbaa !9
  %wide.load1386 = load <2 x i64>, ptr %145, align 8, !tbaa !9
  %146 = and <2 x i64> %wide.load1385, %broadcast.splat1388
  %147 = and <2 x i64> %wide.load1386, %broadcast.splat1388
  %148 = or <2 x i64> %146, %142
  %149 = or <2 x i64> %147, %143
  store <2 x i64> %148, ptr %144, align 8, !tbaa !9
  store <2 x i64> %149, ptr %145, align 8, !tbaa !9
  %index.next = add nuw i64 %index, 4
  %150 = icmp eq i64 %index.next, %n.vec
  br i1 %150, label %middle.block, label %vector.body, !llvm.loop !21

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

._crit_edge:                                      ; preds = %scalar.ph, %middle.block
  %151 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 2)
  br i1 %.not1188, label %._crit_edge1063.thread, label %.lr.ph1062

.lr.ph1062:                                       ; preds = %._crit_edge
  %152 = xor i64 %151, -1
  %min.iters.check1391 = icmp ult i32 %6, 4
  br i1 %min.iters.check1391, label %scalar.ph1390.preheader, label %vector.ph1392

scalar.ph1390.preheader:                          ; preds = %middle.block1389, %.lr.ph1062
  %indvars.iv1225.ph = phi i64 [ 0, %.lr.ph1062 ], [ %n.vec1394, %middle.block1389 ]
  br label %scalar.ph1390

vector.ph1392:                                    ; preds = %.lr.ph1062
  %n.vec1394 = and i64 %84, 4294967292
  %broadcast.splatinsert1400 = insertelement <2 x i64> poison, i64 %151, i64 0
  %broadcast.splat1401 = shufflevector <2 x i64> %broadcast.splatinsert1400, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1404 = insertelement <2 x i64> poison, i64 %152, i64 0
  %broadcast.splat1405 = shufflevector <2 x i64> %broadcast.splatinsert1404, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1396

vector.body1396:                                  ; preds = %vector.body1396, %vector.ph1392
  %index1397 = phi i64 [ 0, %vector.ph1392 ], [ %index.next1406, %vector.body1396 ]
  %153 = getelementptr inbounds i64, ptr %93, i64 %index1397
  %154 = getelementptr inbounds i8, ptr %153, i64 16
  %wide.load1398 = load <2 x i64>, ptr %153, align 16, !tbaa !9
  %wide.load1399 = load <2 x i64>, ptr %154, align 16, !tbaa !9
  %155 = and <2 x i64> %wide.load1398, %broadcast.splat1401
  %156 = and <2 x i64> %wide.load1399, %broadcast.splat1401
  %157 = getelementptr inbounds i64, ptr %4, i64 %index1397
  %158 = getelementptr inbounds i8, ptr %157, i64 16
  %wide.load1402 = load <2 x i64>, ptr %157, align 8, !tbaa !9
  %wide.load1403 = load <2 x i64>, ptr %158, align 8, !tbaa !9
  %159 = and <2 x i64> %wide.load1402, %broadcast.splat1405
  %160 = and <2 x i64> %wide.load1403, %broadcast.splat1405
  %161 = or <2 x i64> %159, %155
  %162 = or <2 x i64> %160, %156
  store <2 x i64> %161, ptr %157, align 8, !tbaa !9
  store <2 x i64> %162, ptr %158, align 8, !tbaa !9
  %index.next1406 = add nuw i64 %index1397, 4
  %163 = icmp eq i64 %index.next1406, %n.vec1394
  br i1 %163, label %middle.block1389, label %vector.body1396, !llvm.loop !22

middle.block1389:                                 ; preds = %vector.body1396
  %cmp.n1407 = icmp eq i64 %n.vec1394, %84
  br i1 %cmp.n1407, label %._crit_edge1063, label %scalar.ph1390.preheader

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %scalar.ph ], [ %indvars.iv.ph, %scalar.ph.preheader ]
  %164 = getelementptr inbounds i64, ptr %92, i64 %indvars.iv
  %165 = load i64, ptr %164, align 8, !tbaa !9
  %166 = and i64 %165, %137
  %167 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv
  %168 = load i64, ptr %167, align 8, !tbaa !9
  %169 = and i64 %168, %139
  %170 = or i64 %169, %166
  store i64 %170, ptr %167, align 8, !tbaa !9
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %84
  br i1 %exitcond.not, label %._crit_edge, label %scalar.ph, !llvm.loop !23

._crit_edge1063.thread:                           ; preds = %._crit_edge.thread, %._crit_edge
  %171 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 3)
  br label %._crit_edge1067.thread

._crit_edge1063:                                  ; preds = %scalar.ph1390, %middle.block1389
  %172 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 3)
  br i1 %.not1188, label %._crit_edge1067.thread, label %.lr.ph1066

.lr.ph1066:                                       ; preds = %._crit_edge1063
  %173 = xor i64 %172, -1
  %min.iters.check1410 = icmp ult i32 %6, 4
  br i1 %min.iters.check1410, label %scalar.ph1409.preheader, label %vector.ph1411

scalar.ph1409.preheader:                          ; preds = %middle.block1408, %.lr.ph1066
  %indvars.iv1230.ph = phi i64 [ 0, %.lr.ph1066 ], [ %n.vec1413, %middle.block1408 ]
  br label %scalar.ph1409

vector.ph1411:                                    ; preds = %.lr.ph1066
  %n.vec1413 = and i64 %84, 4294967292
  %broadcast.splatinsert1419 = insertelement <2 x i64> poison, i64 %172, i64 0
  %broadcast.splat1420 = shufflevector <2 x i64> %broadcast.splatinsert1419, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1423 = insertelement <2 x i64> poison, i64 %173, i64 0
  %broadcast.splat1424 = shufflevector <2 x i64> %broadcast.splatinsert1423, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1415

vector.body1415:                                  ; preds = %vector.body1415, %vector.ph1411
  %index1416 = phi i64 [ 0, %vector.ph1411 ], [ %index.next1425, %vector.body1415 ]
  %174 = getelementptr inbounds i64, ptr %96, i64 %index1416
  %175 = getelementptr inbounds i8, ptr %174, i64 16
  %wide.load1417 = load <2 x i64>, ptr %174, align 8, !tbaa !9
  %wide.load1418 = load <2 x i64>, ptr %175, align 8, !tbaa !9
  %176 = and <2 x i64> %wide.load1417, %broadcast.splat1420
  %177 = and <2 x i64> %wide.load1418, %broadcast.splat1420
  %178 = getelementptr inbounds i64, ptr %4, i64 %index1416
  %179 = getelementptr inbounds i8, ptr %178, i64 16
  %wide.load1421 = load <2 x i64>, ptr %178, align 8, !tbaa !9
  %wide.load1422 = load <2 x i64>, ptr %179, align 8, !tbaa !9
  %180 = and <2 x i64> %wide.load1421, %broadcast.splat1424
  %181 = and <2 x i64> %wide.load1422, %broadcast.splat1424
  %182 = or <2 x i64> %180, %176
  %183 = or <2 x i64> %181, %177
  store <2 x i64> %182, ptr %178, align 8, !tbaa !9
  store <2 x i64> %183, ptr %179, align 8, !tbaa !9
  %index.next1425 = add nuw i64 %index1416, 4
  %184 = icmp eq i64 %index.next1425, %n.vec1413
  br i1 %184, label %middle.block1408, label %vector.body1415, !llvm.loop !24

middle.block1408:                                 ; preds = %vector.body1415
  %cmp.n1426 = icmp eq i64 %n.vec1413, %84
  br i1 %cmp.n1426, label %._crit_edge1067, label %scalar.ph1409.preheader

scalar.ph1390:                                    ; preds = %scalar.ph1390.preheader, %scalar.ph1390
  %indvars.iv1225 = phi i64 [ %indvars.iv.next1226, %scalar.ph1390 ], [ %indvars.iv1225.ph, %scalar.ph1390.preheader ]
  %185 = getelementptr inbounds i64, ptr %93, i64 %indvars.iv1225
  %186 = load i64, ptr %185, align 8, !tbaa !9
  %187 = and i64 %186, %151
  %188 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1225
  %189 = load i64, ptr %188, align 8, !tbaa !9
  %190 = and i64 %189, %152
  %191 = or i64 %190, %187
  store i64 %191, ptr %188, align 8, !tbaa !9
  %indvars.iv.next1226 = add nuw nsw i64 %indvars.iv1225, 1
  %exitcond1229.not = icmp eq i64 %indvars.iv.next1226, %84
  br i1 %exitcond1229.not, label %._crit_edge1063, label %scalar.ph1390, !llvm.loop !25

._crit_edge1067.thread:                           ; preds = %._crit_edge1063.thread, %._crit_edge1063
  %192 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 4)
  br label %._crit_edge1071.thread

._crit_edge1067:                                  ; preds = %scalar.ph1409, %middle.block1408
  %193 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 4)
  br i1 %.not1188, label %._crit_edge1071.thread, label %.lr.ph1070

.lr.ph1070:                                       ; preds = %._crit_edge1067
  %194 = xor i64 %193, -1
  %min.iters.check1429 = icmp ult i32 %6, 4
  br i1 %min.iters.check1429, label %scalar.ph1428.preheader, label %vector.ph1430

scalar.ph1428.preheader:                          ; preds = %middle.block1427, %.lr.ph1070
  %indvars.iv1235.ph = phi i64 [ 0, %.lr.ph1070 ], [ %n.vec1432, %middle.block1427 ]
  br label %scalar.ph1428

vector.ph1430:                                    ; preds = %.lr.ph1070
  %n.vec1432 = and i64 %84, 4294967292
  %broadcast.splatinsert1438 = insertelement <2 x i64> poison, i64 %193, i64 0
  %broadcast.splat1439 = shufflevector <2 x i64> %broadcast.splatinsert1438, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1442 = insertelement <2 x i64> poison, i64 %194, i64 0
  %broadcast.splat1443 = shufflevector <2 x i64> %broadcast.splatinsert1442, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1434

vector.body1434:                                  ; preds = %vector.body1434, %vector.ph1430
  %index1435 = phi i64 [ 0, %vector.ph1430 ], [ %index.next1444, %vector.body1434 ]
  %195 = getelementptr inbounds i64, ptr %99, i64 %index1435
  %196 = getelementptr inbounds i8, ptr %195, i64 16
  %wide.load1436 = load <2 x i64>, ptr %195, align 16, !tbaa !9
  %wide.load1437 = load <2 x i64>, ptr %196, align 16, !tbaa !9
  %197 = and <2 x i64> %wide.load1436, %broadcast.splat1439
  %198 = and <2 x i64> %wide.load1437, %broadcast.splat1439
  %199 = getelementptr inbounds i64, ptr %4, i64 %index1435
  %200 = getelementptr inbounds i8, ptr %199, i64 16
  %wide.load1440 = load <2 x i64>, ptr %199, align 8, !tbaa !9
  %wide.load1441 = load <2 x i64>, ptr %200, align 8, !tbaa !9
  %201 = and <2 x i64> %wide.load1440, %broadcast.splat1443
  %202 = and <2 x i64> %wide.load1441, %broadcast.splat1443
  %203 = or <2 x i64> %201, %197
  %204 = or <2 x i64> %202, %198
  store <2 x i64> %203, ptr %199, align 8, !tbaa !9
  store <2 x i64> %204, ptr %200, align 8, !tbaa !9
  %index.next1444 = add nuw i64 %index1435, 4
  %205 = icmp eq i64 %index.next1444, %n.vec1432
  br i1 %205, label %middle.block1427, label %vector.body1434, !llvm.loop !26

middle.block1427:                                 ; preds = %vector.body1434
  %cmp.n1445 = icmp eq i64 %n.vec1432, %84
  br i1 %cmp.n1445, label %._crit_edge1071, label %scalar.ph1428.preheader

scalar.ph1409:                                    ; preds = %scalar.ph1409.preheader, %scalar.ph1409
  %indvars.iv1230 = phi i64 [ %indvars.iv.next1231, %scalar.ph1409 ], [ %indvars.iv1230.ph, %scalar.ph1409.preheader ]
  %206 = getelementptr inbounds i64, ptr %96, i64 %indvars.iv1230
  %207 = load i64, ptr %206, align 8, !tbaa !9
  %208 = and i64 %207, %172
  %209 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1230
  %210 = load i64, ptr %209, align 8, !tbaa !9
  %211 = and i64 %210, %173
  %212 = or i64 %211, %208
  store i64 %212, ptr %209, align 8, !tbaa !9
  %indvars.iv.next1231 = add nuw nsw i64 %indvars.iv1230, 1
  %exitcond1234.not = icmp eq i64 %indvars.iv.next1231, %84
  br i1 %exitcond1234.not, label %._crit_edge1067, label %scalar.ph1409, !llvm.loop !27

._crit_edge1071.thread:                           ; preds = %._crit_edge1067.thread, %._crit_edge1067
  %213 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 5)
  br label %._crit_edge1075.thread

._crit_edge1071:                                  ; preds = %scalar.ph1428, %middle.block1427
  %214 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 5)
  br i1 %.not1188, label %._crit_edge1075.thread, label %.lr.ph1074

.lr.ph1074:                                       ; preds = %._crit_edge1071
  %215 = xor i64 %214, -1
  %min.iters.check1448 = icmp ult i32 %6, 4
  br i1 %min.iters.check1448, label %scalar.ph1447.preheader, label %vector.ph1449

scalar.ph1447.preheader:                          ; preds = %middle.block1446, %.lr.ph1074
  %indvars.iv1240.ph = phi i64 [ 0, %.lr.ph1074 ], [ %n.vec1451, %middle.block1446 ]
  br label %scalar.ph1447

vector.ph1449:                                    ; preds = %.lr.ph1074
  %n.vec1451 = and i64 %84, 4294967292
  %broadcast.splatinsert1457 = insertelement <2 x i64> poison, i64 %214, i64 0
  %broadcast.splat1458 = shufflevector <2 x i64> %broadcast.splatinsert1457, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1461 = insertelement <2 x i64> poison, i64 %215, i64 0
  %broadcast.splat1462 = shufflevector <2 x i64> %broadcast.splatinsert1461, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1453

vector.body1453:                                  ; preds = %vector.body1453, %vector.ph1449
  %index1454 = phi i64 [ 0, %vector.ph1449 ], [ %index.next1463, %vector.body1453 ]
  %216 = getelementptr inbounds i64, ptr %102, i64 %index1454
  %217 = getelementptr inbounds i8, ptr %216, i64 16
  %wide.load1455 = load <2 x i64>, ptr %216, align 8, !tbaa !9
  %wide.load1456 = load <2 x i64>, ptr %217, align 8, !tbaa !9
  %218 = and <2 x i64> %wide.load1455, %broadcast.splat1458
  %219 = and <2 x i64> %wide.load1456, %broadcast.splat1458
  %220 = getelementptr inbounds i64, ptr %4, i64 %index1454
  %221 = getelementptr inbounds i8, ptr %220, i64 16
  %wide.load1459 = load <2 x i64>, ptr %220, align 8, !tbaa !9
  %wide.load1460 = load <2 x i64>, ptr %221, align 8, !tbaa !9
  %222 = and <2 x i64> %wide.load1459, %broadcast.splat1462
  %223 = and <2 x i64> %wide.load1460, %broadcast.splat1462
  %224 = or <2 x i64> %222, %218
  %225 = or <2 x i64> %223, %219
  store <2 x i64> %224, ptr %220, align 8, !tbaa !9
  store <2 x i64> %225, ptr %221, align 8, !tbaa !9
  %index.next1463 = add nuw i64 %index1454, 4
  %226 = icmp eq i64 %index.next1463, %n.vec1451
  br i1 %226, label %middle.block1446, label %vector.body1453, !llvm.loop !28

middle.block1446:                                 ; preds = %vector.body1453
  %cmp.n1464 = icmp eq i64 %n.vec1451, %84
  br i1 %cmp.n1464, label %._crit_edge1075, label %scalar.ph1447.preheader

scalar.ph1428:                                    ; preds = %scalar.ph1428.preheader, %scalar.ph1428
  %indvars.iv1235 = phi i64 [ %indvars.iv.next1236, %scalar.ph1428 ], [ %indvars.iv1235.ph, %scalar.ph1428.preheader ]
  %227 = getelementptr inbounds i64, ptr %99, i64 %indvars.iv1235
  %228 = load i64, ptr %227, align 8, !tbaa !9
  %229 = and i64 %228, %193
  %230 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1235
  %231 = load i64, ptr %230, align 8, !tbaa !9
  %232 = and i64 %231, %194
  %233 = or i64 %232, %229
  store i64 %233, ptr %230, align 8, !tbaa !9
  %indvars.iv.next1236 = add nuw nsw i64 %indvars.iv1235, 1
  %exitcond1239.not = icmp eq i64 %indvars.iv.next1236, %84
  br i1 %exitcond1239.not, label %._crit_edge1071, label %scalar.ph1428, !llvm.loop !29

._crit_edge1075.thread:                           ; preds = %._crit_edge1071.thread, %._crit_edge1071
  %234 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 6)
  br label %._crit_edge1079.thread

._crit_edge1075:                                  ; preds = %scalar.ph1447, %middle.block1446
  %235 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 6)
  br i1 %.not1188, label %._crit_edge1079.thread, label %.lr.ph1078

.lr.ph1078:                                       ; preds = %._crit_edge1075
  %236 = xor i64 %235, -1
  %min.iters.check1467 = icmp ult i32 %6, 4
  br i1 %min.iters.check1467, label %scalar.ph1466.preheader, label %vector.ph1468

scalar.ph1466.preheader:                          ; preds = %middle.block1465, %.lr.ph1078
  %indvars.iv1245.ph = phi i64 [ 0, %.lr.ph1078 ], [ %n.vec1470, %middle.block1465 ]
  br label %scalar.ph1466

vector.ph1468:                                    ; preds = %.lr.ph1078
  %n.vec1470 = and i64 %84, 4294967292
  %broadcast.splatinsert1476 = insertelement <2 x i64> poison, i64 %235, i64 0
  %broadcast.splat1477 = shufflevector <2 x i64> %broadcast.splatinsert1476, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1480 = insertelement <2 x i64> poison, i64 %236, i64 0
  %broadcast.splat1481 = shufflevector <2 x i64> %broadcast.splatinsert1480, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1472

vector.body1472:                                  ; preds = %vector.body1472, %vector.ph1468
  %index1473 = phi i64 [ 0, %vector.ph1468 ], [ %index.next1482, %vector.body1472 ]
  %237 = getelementptr inbounds i64, ptr %105, i64 %index1473
  %238 = getelementptr inbounds i8, ptr %237, i64 16
  %wide.load1474 = load <2 x i64>, ptr %237, align 16, !tbaa !9
  %wide.load1475 = load <2 x i64>, ptr %238, align 16, !tbaa !9
  %239 = and <2 x i64> %wide.load1474, %broadcast.splat1477
  %240 = and <2 x i64> %wide.load1475, %broadcast.splat1477
  %241 = getelementptr inbounds i64, ptr %4, i64 %index1473
  %242 = getelementptr inbounds i8, ptr %241, i64 16
  %wide.load1478 = load <2 x i64>, ptr %241, align 8, !tbaa !9
  %wide.load1479 = load <2 x i64>, ptr %242, align 8, !tbaa !9
  %243 = and <2 x i64> %wide.load1478, %broadcast.splat1481
  %244 = and <2 x i64> %wide.load1479, %broadcast.splat1481
  %245 = or <2 x i64> %243, %239
  %246 = or <2 x i64> %244, %240
  store <2 x i64> %245, ptr %241, align 8, !tbaa !9
  store <2 x i64> %246, ptr %242, align 8, !tbaa !9
  %index.next1482 = add nuw i64 %index1473, 4
  %247 = icmp eq i64 %index.next1482, %n.vec1470
  br i1 %247, label %middle.block1465, label %vector.body1472, !llvm.loop !30

middle.block1465:                                 ; preds = %vector.body1472
  %cmp.n1483 = icmp eq i64 %n.vec1470, %84
  br i1 %cmp.n1483, label %._crit_edge1079, label %scalar.ph1466.preheader

scalar.ph1447:                                    ; preds = %scalar.ph1447.preheader, %scalar.ph1447
  %indvars.iv1240 = phi i64 [ %indvars.iv.next1241, %scalar.ph1447 ], [ %indvars.iv1240.ph, %scalar.ph1447.preheader ]
  %248 = getelementptr inbounds i64, ptr %102, i64 %indvars.iv1240
  %249 = load i64, ptr %248, align 8, !tbaa !9
  %250 = and i64 %249, %214
  %251 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1240
  %252 = load i64, ptr %251, align 8, !tbaa !9
  %253 = and i64 %252, %215
  %254 = or i64 %253, %250
  store i64 %254, ptr %251, align 8, !tbaa !9
  %indvars.iv.next1241 = add nuw nsw i64 %indvars.iv1240, 1
  %exitcond1244.not = icmp eq i64 %indvars.iv.next1241, %84
  br i1 %exitcond1244.not, label %._crit_edge1075, label %scalar.ph1447, !llvm.loop !31

._crit_edge1079.thread:                           ; preds = %._crit_edge1075.thread, %._crit_edge1075
  %255 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 7)
  br label %._crit_edge1083.thread

._crit_edge1079:                                  ; preds = %scalar.ph1466, %middle.block1465
  %256 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 7)
  br i1 %.not1188, label %._crit_edge1083.thread, label %.lr.ph1082

.lr.ph1082:                                       ; preds = %._crit_edge1079
  %257 = xor i64 %256, -1
  %min.iters.check1486 = icmp ult i32 %6, 4
  br i1 %min.iters.check1486, label %scalar.ph1485.preheader, label %vector.ph1487

scalar.ph1485.preheader:                          ; preds = %middle.block1484, %.lr.ph1082
  %indvars.iv1250.ph = phi i64 [ 0, %.lr.ph1082 ], [ %n.vec1489, %middle.block1484 ]
  br label %scalar.ph1485

vector.ph1487:                                    ; preds = %.lr.ph1082
  %n.vec1489 = and i64 %84, 4294967292
  %broadcast.splatinsert1495 = insertelement <2 x i64> poison, i64 %256, i64 0
  %broadcast.splat1496 = shufflevector <2 x i64> %broadcast.splatinsert1495, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1499 = insertelement <2 x i64> poison, i64 %257, i64 0
  %broadcast.splat1500 = shufflevector <2 x i64> %broadcast.splatinsert1499, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1491

vector.body1491:                                  ; preds = %vector.body1491, %vector.ph1487
  %index1492 = phi i64 [ 0, %vector.ph1487 ], [ %index.next1501, %vector.body1491 ]
  %258 = getelementptr inbounds i64, ptr %108, i64 %index1492
  %259 = getelementptr inbounds i8, ptr %258, i64 16
  %wide.load1493 = load <2 x i64>, ptr %258, align 8, !tbaa !9
  %wide.load1494 = load <2 x i64>, ptr %259, align 8, !tbaa !9
  %260 = and <2 x i64> %wide.load1493, %broadcast.splat1496
  %261 = and <2 x i64> %wide.load1494, %broadcast.splat1496
  %262 = getelementptr inbounds i64, ptr %4, i64 %index1492
  %263 = getelementptr inbounds i8, ptr %262, i64 16
  %wide.load1497 = load <2 x i64>, ptr %262, align 8, !tbaa !9
  %wide.load1498 = load <2 x i64>, ptr %263, align 8, !tbaa !9
  %264 = and <2 x i64> %wide.load1497, %broadcast.splat1500
  %265 = and <2 x i64> %wide.load1498, %broadcast.splat1500
  %266 = or <2 x i64> %264, %260
  %267 = or <2 x i64> %265, %261
  store <2 x i64> %266, ptr %262, align 8, !tbaa !9
  store <2 x i64> %267, ptr %263, align 8, !tbaa !9
  %index.next1501 = add nuw i64 %index1492, 4
  %268 = icmp eq i64 %index.next1501, %n.vec1489
  br i1 %268, label %middle.block1484, label %vector.body1491, !llvm.loop !32

middle.block1484:                                 ; preds = %vector.body1491
  %cmp.n1502 = icmp eq i64 %n.vec1489, %84
  br i1 %cmp.n1502, label %._crit_edge1083, label %scalar.ph1485.preheader

scalar.ph1466:                                    ; preds = %scalar.ph1466.preheader, %scalar.ph1466
  %indvars.iv1245 = phi i64 [ %indvars.iv.next1246, %scalar.ph1466 ], [ %indvars.iv1245.ph, %scalar.ph1466.preheader ]
  %269 = getelementptr inbounds i64, ptr %105, i64 %indvars.iv1245
  %270 = load i64, ptr %269, align 8, !tbaa !9
  %271 = and i64 %270, %235
  %272 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1245
  %273 = load i64, ptr %272, align 8, !tbaa !9
  %274 = and i64 %273, %236
  %275 = or i64 %274, %271
  store i64 %275, ptr %272, align 8, !tbaa !9
  %indvars.iv.next1246 = add nuw nsw i64 %indvars.iv1245, 1
  %exitcond1249.not = icmp eq i64 %indvars.iv.next1246, %84
  br i1 %exitcond1249.not, label %._crit_edge1079, label %scalar.ph1466, !llvm.loop !33

._crit_edge1083.thread:                           ; preds = %._crit_edge1079.thread, %._crit_edge1079
  %276 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 8)
  br label %._crit_edge1087.thread

._crit_edge1083:                                  ; preds = %scalar.ph1485, %middle.block1484
  %277 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 8)
  br i1 %.not1188, label %._crit_edge1087.thread, label %.lr.ph1086

.lr.ph1086:                                       ; preds = %._crit_edge1083
  %278 = xor i64 %277, -1
  %min.iters.check1505 = icmp ult i32 %6, 4
  br i1 %min.iters.check1505, label %scalar.ph1504.preheader, label %vector.ph1506

scalar.ph1504.preheader:                          ; preds = %middle.block1503, %.lr.ph1086
  %indvars.iv1255.ph = phi i64 [ 0, %.lr.ph1086 ], [ %n.vec1508, %middle.block1503 ]
  br label %scalar.ph1504

vector.ph1506:                                    ; preds = %.lr.ph1086
  %n.vec1508 = and i64 %84, 4294967292
  %broadcast.splatinsert1514 = insertelement <2 x i64> poison, i64 %277, i64 0
  %broadcast.splat1515 = shufflevector <2 x i64> %broadcast.splatinsert1514, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1518 = insertelement <2 x i64> poison, i64 %278, i64 0
  %broadcast.splat1519 = shufflevector <2 x i64> %broadcast.splatinsert1518, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1510

vector.body1510:                                  ; preds = %vector.body1510, %vector.ph1506
  %index1511 = phi i64 [ 0, %vector.ph1506 ], [ %index.next1520, %vector.body1510 ]
  %279 = getelementptr inbounds i64, ptr %111, i64 %index1511
  %280 = getelementptr inbounds i8, ptr %279, i64 16
  %wide.load1512 = load <2 x i64>, ptr %279, align 16, !tbaa !9
  %wide.load1513 = load <2 x i64>, ptr %280, align 16, !tbaa !9
  %281 = and <2 x i64> %wide.load1512, %broadcast.splat1515
  %282 = and <2 x i64> %wide.load1513, %broadcast.splat1515
  %283 = getelementptr inbounds i64, ptr %4, i64 %index1511
  %284 = getelementptr inbounds i8, ptr %283, i64 16
  %wide.load1516 = load <2 x i64>, ptr %283, align 8, !tbaa !9
  %wide.load1517 = load <2 x i64>, ptr %284, align 8, !tbaa !9
  %285 = and <2 x i64> %wide.load1516, %broadcast.splat1519
  %286 = and <2 x i64> %wide.load1517, %broadcast.splat1519
  %287 = or <2 x i64> %285, %281
  %288 = or <2 x i64> %286, %282
  store <2 x i64> %287, ptr %283, align 8, !tbaa !9
  store <2 x i64> %288, ptr %284, align 8, !tbaa !9
  %index.next1520 = add nuw i64 %index1511, 4
  %289 = icmp eq i64 %index.next1520, %n.vec1508
  br i1 %289, label %middle.block1503, label %vector.body1510, !llvm.loop !34

middle.block1503:                                 ; preds = %vector.body1510
  %cmp.n1521 = icmp eq i64 %n.vec1508, %84
  br i1 %cmp.n1521, label %._crit_edge1087, label %scalar.ph1504.preheader

scalar.ph1485:                                    ; preds = %scalar.ph1485.preheader, %scalar.ph1485
  %indvars.iv1250 = phi i64 [ %indvars.iv.next1251, %scalar.ph1485 ], [ %indvars.iv1250.ph, %scalar.ph1485.preheader ]
  %290 = getelementptr inbounds i64, ptr %108, i64 %indvars.iv1250
  %291 = load i64, ptr %290, align 8, !tbaa !9
  %292 = and i64 %291, %256
  %293 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1250
  %294 = load i64, ptr %293, align 8, !tbaa !9
  %295 = and i64 %294, %257
  %296 = or i64 %295, %292
  store i64 %296, ptr %293, align 8, !tbaa !9
  %indvars.iv.next1251 = add nuw nsw i64 %indvars.iv1250, 1
  %exitcond1254.not = icmp eq i64 %indvars.iv.next1251, %84
  br i1 %exitcond1254.not, label %._crit_edge1083, label %scalar.ph1485, !llvm.loop !35

._crit_edge1087.thread:                           ; preds = %._crit_edge1083.thread, %._crit_edge1083
  %297 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 9)
  br label %._crit_edge1091.thread

._crit_edge1087:                                  ; preds = %scalar.ph1504, %middle.block1503
  %298 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 9)
  br i1 %.not1188, label %._crit_edge1091.thread, label %.lr.ph1090

.lr.ph1090:                                       ; preds = %._crit_edge1087
  %299 = xor i64 %298, -1
  %min.iters.check1524 = icmp ult i32 %6, 4
  br i1 %min.iters.check1524, label %scalar.ph1523.preheader, label %vector.ph1525

scalar.ph1523.preheader:                          ; preds = %middle.block1522, %.lr.ph1090
  %indvars.iv1260.ph = phi i64 [ 0, %.lr.ph1090 ], [ %n.vec1527, %middle.block1522 ]
  br label %scalar.ph1523

vector.ph1525:                                    ; preds = %.lr.ph1090
  %n.vec1527 = and i64 %84, 4294967292
  %broadcast.splatinsert1533 = insertelement <2 x i64> poison, i64 %298, i64 0
  %broadcast.splat1534 = shufflevector <2 x i64> %broadcast.splatinsert1533, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1537 = insertelement <2 x i64> poison, i64 %299, i64 0
  %broadcast.splat1538 = shufflevector <2 x i64> %broadcast.splatinsert1537, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1529

vector.body1529:                                  ; preds = %vector.body1529, %vector.ph1525
  %index1530 = phi i64 [ 0, %vector.ph1525 ], [ %index.next1539, %vector.body1529 ]
  %300 = getelementptr inbounds i64, ptr %114, i64 %index1530
  %301 = getelementptr inbounds i8, ptr %300, i64 16
  %wide.load1531 = load <2 x i64>, ptr %300, align 8, !tbaa !9
  %wide.load1532 = load <2 x i64>, ptr %301, align 8, !tbaa !9
  %302 = and <2 x i64> %wide.load1531, %broadcast.splat1534
  %303 = and <2 x i64> %wide.load1532, %broadcast.splat1534
  %304 = getelementptr inbounds i64, ptr %4, i64 %index1530
  %305 = getelementptr inbounds i8, ptr %304, i64 16
  %wide.load1535 = load <2 x i64>, ptr %304, align 8, !tbaa !9
  %wide.load1536 = load <2 x i64>, ptr %305, align 8, !tbaa !9
  %306 = and <2 x i64> %wide.load1535, %broadcast.splat1538
  %307 = and <2 x i64> %wide.load1536, %broadcast.splat1538
  %308 = or <2 x i64> %306, %302
  %309 = or <2 x i64> %307, %303
  store <2 x i64> %308, ptr %304, align 8, !tbaa !9
  store <2 x i64> %309, ptr %305, align 8, !tbaa !9
  %index.next1539 = add nuw i64 %index1530, 4
  %310 = icmp eq i64 %index.next1539, %n.vec1527
  br i1 %310, label %middle.block1522, label %vector.body1529, !llvm.loop !36

middle.block1522:                                 ; preds = %vector.body1529
  %cmp.n1540 = icmp eq i64 %n.vec1527, %84
  br i1 %cmp.n1540, label %._crit_edge1091, label %scalar.ph1523.preheader

scalar.ph1504:                                    ; preds = %scalar.ph1504.preheader, %scalar.ph1504
  %indvars.iv1255 = phi i64 [ %indvars.iv.next1256, %scalar.ph1504 ], [ %indvars.iv1255.ph, %scalar.ph1504.preheader ]
  %311 = getelementptr inbounds i64, ptr %111, i64 %indvars.iv1255
  %312 = load i64, ptr %311, align 8, !tbaa !9
  %313 = and i64 %312, %277
  %314 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1255
  %315 = load i64, ptr %314, align 8, !tbaa !9
  %316 = and i64 %315, %278
  %317 = or i64 %316, %313
  store i64 %317, ptr %314, align 8, !tbaa !9
  %indvars.iv.next1256 = add nuw nsw i64 %indvars.iv1255, 1
  %exitcond1259.not = icmp eq i64 %indvars.iv.next1256, %84
  br i1 %exitcond1259.not, label %._crit_edge1087, label %scalar.ph1504, !llvm.loop !37

._crit_edge1091.thread:                           ; preds = %._crit_edge1087.thread, %._crit_edge1087
  %318 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 10)
  br label %._crit_edge1095.thread

._crit_edge1091:                                  ; preds = %scalar.ph1523, %middle.block1522
  %319 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 10)
  br i1 %.not1188, label %._crit_edge1095.thread, label %.lr.ph1094

.lr.ph1094:                                       ; preds = %._crit_edge1091
  %320 = xor i64 %319, -1
  %min.iters.check1543 = icmp ult i32 %6, 4
  br i1 %min.iters.check1543, label %scalar.ph1542.preheader, label %vector.ph1544

scalar.ph1542.preheader:                          ; preds = %middle.block1541, %.lr.ph1094
  %indvars.iv1265.ph = phi i64 [ 0, %.lr.ph1094 ], [ %n.vec1546, %middle.block1541 ]
  br label %scalar.ph1542

vector.ph1544:                                    ; preds = %.lr.ph1094
  %n.vec1546 = and i64 %84, 4294967292
  %broadcast.splatinsert1552 = insertelement <2 x i64> poison, i64 %319, i64 0
  %broadcast.splat1553 = shufflevector <2 x i64> %broadcast.splatinsert1552, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1556 = insertelement <2 x i64> poison, i64 %320, i64 0
  %broadcast.splat1557 = shufflevector <2 x i64> %broadcast.splatinsert1556, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1548

vector.body1548:                                  ; preds = %vector.body1548, %vector.ph1544
  %index1549 = phi i64 [ 0, %vector.ph1544 ], [ %index.next1558, %vector.body1548 ]
  %321 = getelementptr inbounds i64, ptr %117, i64 %index1549
  %322 = getelementptr inbounds i8, ptr %321, i64 16
  %wide.load1550 = load <2 x i64>, ptr %321, align 16, !tbaa !9
  %wide.load1551 = load <2 x i64>, ptr %322, align 16, !tbaa !9
  %323 = and <2 x i64> %wide.load1550, %broadcast.splat1553
  %324 = and <2 x i64> %wide.load1551, %broadcast.splat1553
  %325 = getelementptr inbounds i64, ptr %4, i64 %index1549
  %326 = getelementptr inbounds i8, ptr %325, i64 16
  %wide.load1554 = load <2 x i64>, ptr %325, align 8, !tbaa !9
  %wide.load1555 = load <2 x i64>, ptr %326, align 8, !tbaa !9
  %327 = and <2 x i64> %wide.load1554, %broadcast.splat1557
  %328 = and <2 x i64> %wide.load1555, %broadcast.splat1557
  %329 = or <2 x i64> %327, %323
  %330 = or <2 x i64> %328, %324
  store <2 x i64> %329, ptr %325, align 8, !tbaa !9
  store <2 x i64> %330, ptr %326, align 8, !tbaa !9
  %index.next1558 = add nuw i64 %index1549, 4
  %331 = icmp eq i64 %index.next1558, %n.vec1546
  br i1 %331, label %middle.block1541, label %vector.body1548, !llvm.loop !38

middle.block1541:                                 ; preds = %vector.body1548
  %cmp.n1559 = icmp eq i64 %n.vec1546, %84
  br i1 %cmp.n1559, label %._crit_edge1095, label %scalar.ph1542.preheader

scalar.ph1523:                                    ; preds = %scalar.ph1523.preheader, %scalar.ph1523
  %indvars.iv1260 = phi i64 [ %indvars.iv.next1261, %scalar.ph1523 ], [ %indvars.iv1260.ph, %scalar.ph1523.preheader ]
  %332 = getelementptr inbounds i64, ptr %114, i64 %indvars.iv1260
  %333 = load i64, ptr %332, align 8, !tbaa !9
  %334 = and i64 %333, %298
  %335 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1260
  %336 = load i64, ptr %335, align 8, !tbaa !9
  %337 = and i64 %336, %299
  %338 = or i64 %337, %334
  store i64 %338, ptr %335, align 8, !tbaa !9
  %indvars.iv.next1261 = add nuw nsw i64 %indvars.iv1260, 1
  %exitcond1264.not = icmp eq i64 %indvars.iv.next1261, %84
  br i1 %exitcond1264.not, label %._crit_edge1091, label %scalar.ph1523, !llvm.loop !39

._crit_edge1095.thread:                           ; preds = %._crit_edge1091.thread, %._crit_edge1091
  %339 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 11)
  br label %._crit_edge1099.thread

._crit_edge1095:                                  ; preds = %scalar.ph1542, %middle.block1541
  %340 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 11)
  br i1 %.not1188, label %._crit_edge1099.thread, label %.lr.ph1098

.lr.ph1098:                                       ; preds = %._crit_edge1095
  %341 = xor i64 %340, -1
  %min.iters.check1562 = icmp ult i32 %6, 4
  br i1 %min.iters.check1562, label %scalar.ph1561.preheader, label %vector.ph1563

scalar.ph1561.preheader:                          ; preds = %middle.block1560, %.lr.ph1098
  %indvars.iv1270.ph = phi i64 [ 0, %.lr.ph1098 ], [ %n.vec1565, %middle.block1560 ]
  br label %scalar.ph1561

vector.ph1563:                                    ; preds = %.lr.ph1098
  %n.vec1565 = and i64 %84, 4294967292
  %broadcast.splatinsert1571 = insertelement <2 x i64> poison, i64 %340, i64 0
  %broadcast.splat1572 = shufflevector <2 x i64> %broadcast.splatinsert1571, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1575 = insertelement <2 x i64> poison, i64 %341, i64 0
  %broadcast.splat1576 = shufflevector <2 x i64> %broadcast.splatinsert1575, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1567

vector.body1567:                                  ; preds = %vector.body1567, %vector.ph1563
  %index1568 = phi i64 [ 0, %vector.ph1563 ], [ %index.next1577, %vector.body1567 ]
  %342 = getelementptr inbounds i64, ptr %120, i64 %index1568
  %343 = getelementptr inbounds i8, ptr %342, i64 16
  %wide.load1569 = load <2 x i64>, ptr %342, align 8, !tbaa !9
  %wide.load1570 = load <2 x i64>, ptr %343, align 8, !tbaa !9
  %344 = and <2 x i64> %wide.load1569, %broadcast.splat1572
  %345 = and <2 x i64> %wide.load1570, %broadcast.splat1572
  %346 = getelementptr inbounds i64, ptr %4, i64 %index1568
  %347 = getelementptr inbounds i8, ptr %346, i64 16
  %wide.load1573 = load <2 x i64>, ptr %346, align 8, !tbaa !9
  %wide.load1574 = load <2 x i64>, ptr %347, align 8, !tbaa !9
  %348 = and <2 x i64> %wide.load1573, %broadcast.splat1576
  %349 = and <2 x i64> %wide.load1574, %broadcast.splat1576
  %350 = or <2 x i64> %348, %344
  %351 = or <2 x i64> %349, %345
  store <2 x i64> %350, ptr %346, align 8, !tbaa !9
  store <2 x i64> %351, ptr %347, align 8, !tbaa !9
  %index.next1577 = add nuw i64 %index1568, 4
  %352 = icmp eq i64 %index.next1577, %n.vec1565
  br i1 %352, label %middle.block1560, label %vector.body1567, !llvm.loop !40

middle.block1560:                                 ; preds = %vector.body1567
  %cmp.n1578 = icmp eq i64 %n.vec1565, %84
  br i1 %cmp.n1578, label %._crit_edge1099, label %scalar.ph1561.preheader

scalar.ph1542:                                    ; preds = %scalar.ph1542.preheader, %scalar.ph1542
  %indvars.iv1265 = phi i64 [ %indvars.iv.next1266, %scalar.ph1542 ], [ %indvars.iv1265.ph, %scalar.ph1542.preheader ]
  %353 = getelementptr inbounds i64, ptr %117, i64 %indvars.iv1265
  %354 = load i64, ptr %353, align 8, !tbaa !9
  %355 = and i64 %354, %319
  %356 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1265
  %357 = load i64, ptr %356, align 8, !tbaa !9
  %358 = and i64 %357, %320
  %359 = or i64 %358, %355
  store i64 %359, ptr %356, align 8, !tbaa !9
  %indvars.iv.next1266 = add nuw nsw i64 %indvars.iv1265, 1
  %exitcond1269.not = icmp eq i64 %indvars.iv.next1266, %84
  br i1 %exitcond1269.not, label %._crit_edge1095, label %scalar.ph1542, !llvm.loop !41

._crit_edge1099.thread:                           ; preds = %._crit_edge1095.thread, %._crit_edge1095
  %360 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 12)
  br label %._crit_edge1103.thread

._crit_edge1099:                                  ; preds = %scalar.ph1561, %middle.block1560
  %361 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 12)
  br i1 %.not1188, label %._crit_edge1103.thread, label %.lr.ph1102

.lr.ph1102:                                       ; preds = %._crit_edge1099
  %362 = xor i64 %361, -1
  %min.iters.check1581 = icmp ult i32 %6, 4
  br i1 %min.iters.check1581, label %scalar.ph1580.preheader, label %vector.ph1582

scalar.ph1580.preheader:                          ; preds = %middle.block1579, %.lr.ph1102
  %indvars.iv1275.ph = phi i64 [ 0, %.lr.ph1102 ], [ %n.vec1584, %middle.block1579 ]
  br label %scalar.ph1580

vector.ph1582:                                    ; preds = %.lr.ph1102
  %n.vec1584 = and i64 %84, 4294967292
  %broadcast.splatinsert1590 = insertelement <2 x i64> poison, i64 %361, i64 0
  %broadcast.splat1591 = shufflevector <2 x i64> %broadcast.splatinsert1590, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1594 = insertelement <2 x i64> poison, i64 %362, i64 0
  %broadcast.splat1595 = shufflevector <2 x i64> %broadcast.splatinsert1594, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1586

vector.body1586:                                  ; preds = %vector.body1586, %vector.ph1582
  %index1587 = phi i64 [ 0, %vector.ph1582 ], [ %index.next1596, %vector.body1586 ]
  %363 = getelementptr inbounds i64, ptr %123, i64 %index1587
  %364 = getelementptr inbounds i8, ptr %363, i64 16
  %wide.load1588 = load <2 x i64>, ptr %363, align 16, !tbaa !9
  %wide.load1589 = load <2 x i64>, ptr %364, align 16, !tbaa !9
  %365 = and <2 x i64> %wide.load1588, %broadcast.splat1591
  %366 = and <2 x i64> %wide.load1589, %broadcast.splat1591
  %367 = getelementptr inbounds i64, ptr %4, i64 %index1587
  %368 = getelementptr inbounds i8, ptr %367, i64 16
  %wide.load1592 = load <2 x i64>, ptr %367, align 8, !tbaa !9
  %wide.load1593 = load <2 x i64>, ptr %368, align 8, !tbaa !9
  %369 = and <2 x i64> %wide.load1592, %broadcast.splat1595
  %370 = and <2 x i64> %wide.load1593, %broadcast.splat1595
  %371 = or <2 x i64> %369, %365
  %372 = or <2 x i64> %370, %366
  store <2 x i64> %371, ptr %367, align 8, !tbaa !9
  store <2 x i64> %372, ptr %368, align 8, !tbaa !9
  %index.next1596 = add nuw i64 %index1587, 4
  %373 = icmp eq i64 %index.next1596, %n.vec1584
  br i1 %373, label %middle.block1579, label %vector.body1586, !llvm.loop !42

middle.block1579:                                 ; preds = %vector.body1586
  %cmp.n1597 = icmp eq i64 %n.vec1584, %84
  br i1 %cmp.n1597, label %._crit_edge1103, label %scalar.ph1580.preheader

scalar.ph1561:                                    ; preds = %scalar.ph1561.preheader, %scalar.ph1561
  %indvars.iv1270 = phi i64 [ %indvars.iv.next1271, %scalar.ph1561 ], [ %indvars.iv1270.ph, %scalar.ph1561.preheader ]
  %374 = getelementptr inbounds i64, ptr %120, i64 %indvars.iv1270
  %375 = load i64, ptr %374, align 8, !tbaa !9
  %376 = and i64 %375, %340
  %377 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1270
  %378 = load i64, ptr %377, align 8, !tbaa !9
  %379 = and i64 %378, %341
  %380 = or i64 %379, %376
  store i64 %380, ptr %377, align 8, !tbaa !9
  %indvars.iv.next1271 = add nuw nsw i64 %indvars.iv1270, 1
  %exitcond1274.not = icmp eq i64 %indvars.iv.next1271, %84
  br i1 %exitcond1274.not, label %._crit_edge1099, label %scalar.ph1561, !llvm.loop !43

._crit_edge1103.thread:                           ; preds = %._crit_edge1099.thread, %._crit_edge1099
  %381 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 13)
  br label %._crit_edge1107.thread

._crit_edge1103:                                  ; preds = %scalar.ph1580, %middle.block1579
  %382 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 13)
  br i1 %.not1188, label %._crit_edge1107.thread, label %.lr.ph1106

.lr.ph1106:                                       ; preds = %._crit_edge1103
  %383 = xor i64 %382, -1
  %min.iters.check1600 = icmp ult i32 %6, 4
  br i1 %min.iters.check1600, label %scalar.ph1599.preheader, label %vector.ph1601

scalar.ph1599.preheader:                          ; preds = %middle.block1598, %.lr.ph1106
  %indvars.iv1280.ph = phi i64 [ 0, %.lr.ph1106 ], [ %n.vec1603, %middle.block1598 ]
  br label %scalar.ph1599

vector.ph1601:                                    ; preds = %.lr.ph1106
  %n.vec1603 = and i64 %84, 4294967292
  %broadcast.splatinsert1609 = insertelement <2 x i64> poison, i64 %382, i64 0
  %broadcast.splat1610 = shufflevector <2 x i64> %broadcast.splatinsert1609, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1613 = insertelement <2 x i64> poison, i64 %383, i64 0
  %broadcast.splat1614 = shufflevector <2 x i64> %broadcast.splatinsert1613, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1605

vector.body1605:                                  ; preds = %vector.body1605, %vector.ph1601
  %index1606 = phi i64 [ 0, %vector.ph1601 ], [ %index.next1615, %vector.body1605 ]
  %384 = getelementptr inbounds i64, ptr %126, i64 %index1606
  %385 = getelementptr inbounds i8, ptr %384, i64 16
  %wide.load1607 = load <2 x i64>, ptr %384, align 8, !tbaa !9
  %wide.load1608 = load <2 x i64>, ptr %385, align 8, !tbaa !9
  %386 = and <2 x i64> %wide.load1607, %broadcast.splat1610
  %387 = and <2 x i64> %wide.load1608, %broadcast.splat1610
  %388 = getelementptr inbounds i64, ptr %4, i64 %index1606
  %389 = getelementptr inbounds i8, ptr %388, i64 16
  %wide.load1611 = load <2 x i64>, ptr %388, align 8, !tbaa !9
  %wide.load1612 = load <2 x i64>, ptr %389, align 8, !tbaa !9
  %390 = and <2 x i64> %wide.load1611, %broadcast.splat1614
  %391 = and <2 x i64> %wide.load1612, %broadcast.splat1614
  %392 = or <2 x i64> %390, %386
  %393 = or <2 x i64> %391, %387
  store <2 x i64> %392, ptr %388, align 8, !tbaa !9
  store <2 x i64> %393, ptr %389, align 8, !tbaa !9
  %index.next1615 = add nuw i64 %index1606, 4
  %394 = icmp eq i64 %index.next1615, %n.vec1603
  br i1 %394, label %middle.block1598, label %vector.body1605, !llvm.loop !44

middle.block1598:                                 ; preds = %vector.body1605
  %cmp.n1616 = icmp eq i64 %n.vec1603, %84
  br i1 %cmp.n1616, label %._crit_edge1107, label %scalar.ph1599.preheader

scalar.ph1580:                                    ; preds = %scalar.ph1580.preheader, %scalar.ph1580
  %indvars.iv1275 = phi i64 [ %indvars.iv.next1276, %scalar.ph1580 ], [ %indvars.iv1275.ph, %scalar.ph1580.preheader ]
  %395 = getelementptr inbounds i64, ptr %123, i64 %indvars.iv1275
  %396 = load i64, ptr %395, align 8, !tbaa !9
  %397 = and i64 %396, %361
  %398 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1275
  %399 = load i64, ptr %398, align 8, !tbaa !9
  %400 = and i64 %399, %362
  %401 = or i64 %400, %397
  store i64 %401, ptr %398, align 8, !tbaa !9
  %indvars.iv.next1276 = add nuw nsw i64 %indvars.iv1275, 1
  %exitcond1279.not = icmp eq i64 %indvars.iv.next1276, %84
  br i1 %exitcond1279.not, label %._crit_edge1103, label %scalar.ph1580, !llvm.loop !45

._crit_edge1107.thread:                           ; preds = %._crit_edge1103.thread, %._crit_edge1103
  %402 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 14)
  br label %._crit_edge1111.thread

._crit_edge1107:                                  ; preds = %scalar.ph1599, %middle.block1598
  %403 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 14)
  br i1 %.not1188, label %._crit_edge1111.thread, label %.lr.ph1110

.lr.ph1110:                                       ; preds = %._crit_edge1107
  %404 = xor i64 %403, -1
  %min.iters.check1619 = icmp ult i32 %6, 4
  br i1 %min.iters.check1619, label %scalar.ph1618.preheader, label %vector.ph1620

scalar.ph1618.preheader:                          ; preds = %middle.block1617, %.lr.ph1110
  %indvars.iv1285.ph = phi i64 [ 0, %.lr.ph1110 ], [ %n.vec1622, %middle.block1617 ]
  br label %scalar.ph1618

vector.ph1620:                                    ; preds = %.lr.ph1110
  %n.vec1622 = and i64 %84, 4294967292
  %broadcast.splatinsert1628 = insertelement <2 x i64> poison, i64 %403, i64 0
  %broadcast.splat1629 = shufflevector <2 x i64> %broadcast.splatinsert1628, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1632 = insertelement <2 x i64> poison, i64 %404, i64 0
  %broadcast.splat1633 = shufflevector <2 x i64> %broadcast.splatinsert1632, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1624

vector.body1624:                                  ; preds = %vector.body1624, %vector.ph1620
  %index1625 = phi i64 [ 0, %vector.ph1620 ], [ %index.next1634, %vector.body1624 ]
  %405 = getelementptr inbounds i64, ptr %129, i64 %index1625
  %406 = getelementptr inbounds i8, ptr %405, i64 16
  %wide.load1626 = load <2 x i64>, ptr %405, align 16, !tbaa !9
  %wide.load1627 = load <2 x i64>, ptr %406, align 16, !tbaa !9
  %407 = and <2 x i64> %wide.load1626, %broadcast.splat1629
  %408 = and <2 x i64> %wide.load1627, %broadcast.splat1629
  %409 = getelementptr inbounds i64, ptr %4, i64 %index1625
  %410 = getelementptr inbounds i8, ptr %409, i64 16
  %wide.load1630 = load <2 x i64>, ptr %409, align 8, !tbaa !9
  %wide.load1631 = load <2 x i64>, ptr %410, align 8, !tbaa !9
  %411 = and <2 x i64> %wide.load1630, %broadcast.splat1633
  %412 = and <2 x i64> %wide.load1631, %broadcast.splat1633
  %413 = or <2 x i64> %411, %407
  %414 = or <2 x i64> %412, %408
  store <2 x i64> %413, ptr %409, align 8, !tbaa !9
  store <2 x i64> %414, ptr %410, align 8, !tbaa !9
  %index.next1634 = add nuw i64 %index1625, 4
  %415 = icmp eq i64 %index.next1634, %n.vec1622
  br i1 %415, label %middle.block1617, label %vector.body1624, !llvm.loop !46

middle.block1617:                                 ; preds = %vector.body1624
  %cmp.n1635 = icmp eq i64 %n.vec1622, %84
  br i1 %cmp.n1635, label %._crit_edge1111, label %scalar.ph1618.preheader

scalar.ph1599:                                    ; preds = %scalar.ph1599.preheader, %scalar.ph1599
  %indvars.iv1280 = phi i64 [ %indvars.iv.next1281, %scalar.ph1599 ], [ %indvars.iv1280.ph, %scalar.ph1599.preheader ]
  %416 = getelementptr inbounds i64, ptr %126, i64 %indvars.iv1280
  %417 = load i64, ptr %416, align 8, !tbaa !9
  %418 = and i64 %417, %382
  %419 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1280
  %420 = load i64, ptr %419, align 8, !tbaa !9
  %421 = and i64 %420, %383
  %422 = or i64 %421, %418
  store i64 %422, ptr %419, align 8, !tbaa !9
  %indvars.iv.next1281 = add nuw nsw i64 %indvars.iv1280, 1
  %exitcond1284.not = icmp eq i64 %indvars.iv.next1281, %84
  br i1 %exitcond1284.not, label %._crit_edge1107, label %scalar.ph1599, !llvm.loop !47

._crit_edge1111.thread:                           ; preds = %._crit_edge1107.thread, %._crit_edge1107
  %423 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 15)
  br label %.lr.ph1177

._crit_edge1111:                                  ; preds = %scalar.ph1618, %middle.block1617
  %424 = call i64 @FStar_UInt64_eq_mask(i64 noundef %136, i64 noundef 15)
  br i1 %.not1188, label %.lr.ph1177, label %.lr.ph1114

.lr.ph1114:                                       ; preds = %._crit_edge1111
  %425 = xor i64 %424, -1
  %min.iters.check1638 = icmp ult i32 %6, 4
  br i1 %min.iters.check1638, label %scalar.ph1637.preheader, label %vector.ph1639

scalar.ph1637.preheader:                          ; preds = %middle.block1636, %.lr.ph1114
  %indvars.iv1290.ph = phi i64 [ 0, %.lr.ph1114 ], [ %n.vec1641, %middle.block1636 ]
  br label %scalar.ph1637

vector.ph1639:                                    ; preds = %.lr.ph1114
  %n.vec1641 = and i64 %84, 4294967292
  %broadcast.splatinsert1647 = insertelement <2 x i64> poison, i64 %424, i64 0
  %broadcast.splat1648 = shufflevector <2 x i64> %broadcast.splatinsert1647, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1651 = insertelement <2 x i64> poison, i64 %425, i64 0
  %broadcast.splat1652 = shufflevector <2 x i64> %broadcast.splatinsert1651, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1643

vector.body1643:                                  ; preds = %vector.body1643, %vector.ph1639
  %index1644 = phi i64 [ 0, %vector.ph1639 ], [ %index.next1653, %vector.body1643 ]
  %426 = getelementptr inbounds i64, ptr %132, i64 %index1644
  %427 = getelementptr inbounds i8, ptr %426, i64 16
  %wide.load1645 = load <2 x i64>, ptr %426, align 8, !tbaa !9
  %wide.load1646 = load <2 x i64>, ptr %427, align 8, !tbaa !9
  %428 = and <2 x i64> %wide.load1645, %broadcast.splat1648
  %429 = and <2 x i64> %wide.load1646, %broadcast.splat1648
  %430 = getelementptr inbounds i64, ptr %4, i64 %index1644
  %431 = getelementptr inbounds i8, ptr %430, i64 16
  %wide.load1649 = load <2 x i64>, ptr %430, align 8, !tbaa !9
  %wide.load1650 = load <2 x i64>, ptr %431, align 8, !tbaa !9
  %432 = and <2 x i64> %wide.load1649, %broadcast.splat1652
  %433 = and <2 x i64> %wide.load1650, %broadcast.splat1652
  %434 = or <2 x i64> %432, %428
  %435 = or <2 x i64> %433, %429
  store <2 x i64> %434, ptr %430, align 8, !tbaa !9
  store <2 x i64> %435, ptr %431, align 8, !tbaa !9
  %index.next1653 = add nuw i64 %index1644, 4
  %436 = icmp eq i64 %index.next1653, %n.vec1641
  br i1 %436, label %middle.block1636, label %vector.body1643, !llvm.loop !48

middle.block1636:                                 ; preds = %vector.body1643
  %cmp.n1654 = icmp eq i64 %n.vec1641, %84
  br i1 %cmp.n1654, label %.lr.ph1177, label %scalar.ph1637.preheader

scalar.ph1618:                                    ; preds = %scalar.ph1618.preheader, %scalar.ph1618
  %indvars.iv1285 = phi i64 [ %indvars.iv.next1286, %scalar.ph1618 ], [ %indvars.iv1285.ph, %scalar.ph1618.preheader ]
  %437 = getelementptr inbounds i64, ptr %129, i64 %indvars.iv1285
  %438 = load i64, ptr %437, align 8, !tbaa !9
  %439 = and i64 %438, %403
  %440 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1285
  %441 = load i64, ptr %440, align 8, !tbaa !9
  %442 = and i64 %441, %404
  %443 = or i64 %442, %439
  store i64 %443, ptr %440, align 8, !tbaa !9
  %indvars.iv.next1286 = add nuw nsw i64 %indvars.iv1285, 1
  %exitcond1289.not = icmp eq i64 %indvars.iv.next1286, %84
  br i1 %exitcond1289.not, label %._crit_edge1111, label %scalar.ph1618, !llvm.loop !49

scalar.ph1637:                                    ; preds = %scalar.ph1637.preheader, %scalar.ph1637
  %indvars.iv1290 = phi i64 [ %indvars.iv.next1291, %scalar.ph1637 ], [ %indvars.iv1290.ph, %scalar.ph1637.preheader ]
  %444 = getelementptr inbounds i64, ptr %132, i64 %indvars.iv1290
  %445 = load i64, ptr %444, align 8, !tbaa !9
  %446 = and i64 %445, %424
  %447 = getelementptr inbounds i64, ptr %4, i64 %indvars.iv1290
  %448 = load i64, ptr %447, align 8, !tbaa !9
  %449 = and i64 %448, %425
  %450 = or i64 %449, %446
  store i64 %450, ptr %447, align 8, !tbaa !9
  %indvars.iv.next1291 = add nuw nsw i64 %indvars.iv1290, 1
  %exitcond1294.not = icmp eq i64 %indvars.iv.next1291, %84
  br i1 %exitcond1294.not, label %.lr.ph1177, label %scalar.ph1637, !llvm.loop !50

451:                                              ; preds = %76
  call void @Hacl_Bignum_Montgomery_bn_from_mont_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef nonnull %86, ptr noundef %4) #7
  br label %.lr.ph1177

.lr.ph1177:                                       ; preds = %scalar.ph1637, %middle.block1636, %451, %._crit_edge1111, %._crit_edge1111.thread
  %452 = alloca i8, i64 %85, align 16
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %452, i8 0, i64 %85, i1 false)
  %453 = lshr i32 %2, 2
  %454 = and i32 %2, -4
  %455 = add i32 %454, -4
  %.not1204 = icmp eq i32 %6, 0
  %umax = call i32 @llvm.umax.i32(i32 %453, i32 1)
  %min.iters.check1923 = icmp ult i32 %6, 4
  %n.vec1926 = and i64 %84, 4294967292
  %cmp.n1939 = icmp eq i64 %n.vec1926, %84
  %min.iters.check1904 = icmp ult i32 %6, 4
  %n.vec1907 = and i64 %84, 4294967292
  %cmp.n1920 = icmp eq i64 %n.vec1907, %84
  %min.iters.check1885 = icmp ult i32 %6, 4
  %n.vec1888 = and i64 %84, 4294967292
  %cmp.n1901 = icmp eq i64 %n.vec1888, %84
  %min.iters.check1866 = icmp ult i32 %6, 4
  %n.vec1869 = and i64 %84, 4294967292
  %cmp.n1882 = icmp eq i64 %n.vec1869, %84
  %min.iters.check1847 = icmp ult i32 %6, 4
  %n.vec1850 = and i64 %84, 4294967292
  %cmp.n1863 = icmp eq i64 %n.vec1850, %84
  %min.iters.check1828 = icmp ult i32 %6, 4
  %n.vec1831 = and i64 %84, 4294967292
  %cmp.n1844 = icmp eq i64 %n.vec1831, %84
  %min.iters.check1809 = icmp ult i32 %6, 4
  %n.vec1812 = and i64 %84, 4294967292
  %cmp.n1825 = icmp eq i64 %n.vec1812, %84
  %min.iters.check1790 = icmp ult i32 %6, 4
  %n.vec1793 = and i64 %84, 4294967292
  %cmp.n1806 = icmp eq i64 %n.vec1793, %84
  %min.iters.check1771 = icmp ult i32 %6, 4
  %n.vec1774 = and i64 %84, 4294967292
  %cmp.n1787 = icmp eq i64 %n.vec1774, %84
  %min.iters.check1752 = icmp ult i32 %6, 4
  %n.vec1755 = and i64 %84, 4294967292
  %cmp.n1768 = icmp eq i64 %n.vec1755, %84
  %min.iters.check1733 = icmp ult i32 %6, 4
  %n.vec1736 = and i64 %84, 4294967292
  %cmp.n1749 = icmp eq i64 %n.vec1736, %84
  %min.iters.check1714 = icmp ult i32 %6, 4
  %n.vec1717 = and i64 %84, 4294967292
  %cmp.n1730 = icmp eq i64 %n.vec1717, %84
  %min.iters.check1695 = icmp ult i32 %6, 4
  %n.vec1698 = and i64 %84, 4294967292
  %cmp.n1711 = icmp eq i64 %n.vec1698, %84
  %min.iters.check1676 = icmp ult i32 %6, 4
  %n.vec1679 = and i64 %84, 4294967292
  %cmp.n1692 = icmp eq i64 %n.vec1679, %84
  %min.iters.check1657 = icmp ult i32 %6, 4
  %n.vec1660 = and i64 %84, 4294967292
  %cmp.n1673 = icmp eq i64 %n.vec1660, %84
  br label %456

456:                                              ; preds = %.lr.ph1177, %._crit_edge1174
  %.010441175 = phi i32 [ 0, %.lr.ph1177 ], [ %767, %._crit_edge1174 ]
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef %4, ptr noundef %4) #7
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef %4, ptr noundef %4) #7
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef %4, ptr noundef %4) #7
  call void @Hacl_Bignum_Montgomery_bn_mont_sqr_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef %4, ptr noundef %4) #7
  %457 = shl i32 %.010441175, 2
  %458 = sub i32 %455, %457
  %459 = call i64 @Hacl_Bignum_Lib_bn_get_bits_u64(i32 noundef %79, ptr noundef %3, i32 noundef %458, i32 noundef 4)
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %452, ptr nonnull align 16 %90, i64 %85, i1 false)
  %460 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 1)
  br i1 %.not1204, label %._crit_edge1118.thread, label %.lr.ph1117

._crit_edge1118.thread:                           ; preds = %456
  %461 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 2)
  br label %._crit_edge1122.thread

.lr.ph1117:                                       ; preds = %456
  %462 = xor i64 %460, -1
  br i1 %min.iters.check1923, label %scalar.ph1922.preheader, label %vector.ph1924

scalar.ph1922.preheader:                          ; preds = %middle.block1921, %.lr.ph1117
  %indvars.iv1295.ph = phi i64 [ 0, %.lr.ph1117 ], [ %n.vec1926, %middle.block1921 ]
  br label %scalar.ph1922

vector.ph1924:                                    ; preds = %.lr.ph1117
  %broadcast.splatinsert1932 = insertelement <2 x i64> poison, i64 %460, i64 0
  %broadcast.splat1933 = shufflevector <2 x i64> %broadcast.splatinsert1932, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1936 = insertelement <2 x i64> poison, i64 %462, i64 0
  %broadcast.splat1937 = shufflevector <2 x i64> %broadcast.splatinsert1936, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1928

vector.body1928:                                  ; preds = %vector.body1928, %vector.ph1924
  %index1929 = phi i64 [ 0, %vector.ph1924 ], [ %index.next1938, %vector.body1928 ]
  %463 = getelementptr inbounds i64, ptr %92, i64 %index1929
  %464 = getelementptr inbounds i8, ptr %463, i64 16
  %wide.load1930 = load <2 x i64>, ptr %463, align 8, !tbaa !9
  %wide.load1931 = load <2 x i64>, ptr %464, align 8, !tbaa !9
  %465 = and <2 x i64> %wide.load1930, %broadcast.splat1933
  %466 = and <2 x i64> %wide.load1931, %broadcast.splat1933
  %467 = getelementptr inbounds i64, ptr %452, i64 %index1929
  %468 = getelementptr inbounds i8, ptr %467, i64 16
  %wide.load1934 = load <2 x i64>, ptr %467, align 16, !tbaa !9
  %wide.load1935 = load <2 x i64>, ptr %468, align 16, !tbaa !9
  %469 = and <2 x i64> %wide.load1934, %broadcast.splat1937
  %470 = and <2 x i64> %wide.load1935, %broadcast.splat1937
  %471 = or <2 x i64> %469, %465
  %472 = or <2 x i64> %470, %466
  store <2 x i64> %471, ptr %467, align 16, !tbaa !9
  store <2 x i64> %472, ptr %468, align 16, !tbaa !9
  %index.next1938 = add nuw i64 %index1929, 4
  %473 = icmp eq i64 %index.next1938, %n.vec1926
  br i1 %473, label %middle.block1921, label %vector.body1928, !llvm.loop !51

middle.block1921:                                 ; preds = %vector.body1928
  br i1 %cmp.n1939, label %._crit_edge1118, label %scalar.ph1922.preheader

._crit_edge1118:                                  ; preds = %scalar.ph1922, %middle.block1921
  %474 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 2)
  br i1 %.not1204, label %._crit_edge1122.thread, label %.lr.ph1121

.lr.ph1121:                                       ; preds = %._crit_edge1118
  %475 = xor i64 %474, -1
  br i1 %min.iters.check1904, label %scalar.ph1903.preheader, label %vector.ph1905

scalar.ph1903.preheader:                          ; preds = %middle.block1902, %.lr.ph1121
  %indvars.iv1300.ph = phi i64 [ 0, %.lr.ph1121 ], [ %n.vec1907, %middle.block1902 ]
  br label %scalar.ph1903

vector.ph1905:                                    ; preds = %.lr.ph1121
  %broadcast.splatinsert1913 = insertelement <2 x i64> poison, i64 %474, i64 0
  %broadcast.splat1914 = shufflevector <2 x i64> %broadcast.splatinsert1913, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1917 = insertelement <2 x i64> poison, i64 %475, i64 0
  %broadcast.splat1918 = shufflevector <2 x i64> %broadcast.splatinsert1917, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1909

vector.body1909:                                  ; preds = %vector.body1909, %vector.ph1905
  %index1910 = phi i64 [ 0, %vector.ph1905 ], [ %index.next1919, %vector.body1909 ]
  %476 = getelementptr inbounds i64, ptr %93, i64 %index1910
  %477 = getelementptr inbounds i8, ptr %476, i64 16
  %wide.load1911 = load <2 x i64>, ptr %476, align 16, !tbaa !9
  %wide.load1912 = load <2 x i64>, ptr %477, align 16, !tbaa !9
  %478 = and <2 x i64> %wide.load1911, %broadcast.splat1914
  %479 = and <2 x i64> %wide.load1912, %broadcast.splat1914
  %480 = getelementptr inbounds i64, ptr %452, i64 %index1910
  %481 = getelementptr inbounds i8, ptr %480, i64 16
  %wide.load1915 = load <2 x i64>, ptr %480, align 16, !tbaa !9
  %wide.load1916 = load <2 x i64>, ptr %481, align 16, !tbaa !9
  %482 = and <2 x i64> %wide.load1915, %broadcast.splat1918
  %483 = and <2 x i64> %wide.load1916, %broadcast.splat1918
  %484 = or <2 x i64> %482, %478
  %485 = or <2 x i64> %483, %479
  store <2 x i64> %484, ptr %480, align 16, !tbaa !9
  store <2 x i64> %485, ptr %481, align 16, !tbaa !9
  %index.next1919 = add nuw i64 %index1910, 4
  %486 = icmp eq i64 %index.next1919, %n.vec1907
  br i1 %486, label %middle.block1902, label %vector.body1909, !llvm.loop !52

middle.block1902:                                 ; preds = %vector.body1909
  br i1 %cmp.n1920, label %._crit_edge1122, label %scalar.ph1903.preheader

scalar.ph1922:                                    ; preds = %scalar.ph1922.preheader, %scalar.ph1922
  %indvars.iv1295 = phi i64 [ %indvars.iv.next1296, %scalar.ph1922 ], [ %indvars.iv1295.ph, %scalar.ph1922.preheader ]
  %487 = getelementptr inbounds i64, ptr %92, i64 %indvars.iv1295
  %488 = load i64, ptr %487, align 8, !tbaa !9
  %489 = and i64 %488, %460
  %490 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1295
  %491 = load i64, ptr %490, align 8, !tbaa !9
  %492 = and i64 %491, %462
  %493 = or i64 %492, %489
  store i64 %493, ptr %490, align 8, !tbaa !9
  %indvars.iv.next1296 = add nuw nsw i64 %indvars.iv1295, 1
  %exitcond1299.not = icmp eq i64 %indvars.iv.next1296, %84
  br i1 %exitcond1299.not, label %._crit_edge1118, label %scalar.ph1922, !llvm.loop !53

._crit_edge1122.thread:                           ; preds = %._crit_edge1118.thread, %._crit_edge1118
  %494 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 3)
  br label %._crit_edge1126.thread

._crit_edge1122:                                  ; preds = %scalar.ph1903, %middle.block1902
  %495 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 3)
  br i1 %.not1204, label %._crit_edge1126.thread, label %.lr.ph1125

.lr.ph1125:                                       ; preds = %._crit_edge1122
  %496 = xor i64 %495, -1
  br i1 %min.iters.check1885, label %scalar.ph1884.preheader, label %vector.ph1886

scalar.ph1884.preheader:                          ; preds = %middle.block1883, %.lr.ph1125
  %indvars.iv1305.ph = phi i64 [ 0, %.lr.ph1125 ], [ %n.vec1888, %middle.block1883 ]
  br label %scalar.ph1884

vector.ph1886:                                    ; preds = %.lr.ph1125
  %broadcast.splatinsert1894 = insertelement <2 x i64> poison, i64 %495, i64 0
  %broadcast.splat1895 = shufflevector <2 x i64> %broadcast.splatinsert1894, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1898 = insertelement <2 x i64> poison, i64 %496, i64 0
  %broadcast.splat1899 = shufflevector <2 x i64> %broadcast.splatinsert1898, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1890

vector.body1890:                                  ; preds = %vector.body1890, %vector.ph1886
  %index1891 = phi i64 [ 0, %vector.ph1886 ], [ %index.next1900, %vector.body1890 ]
  %497 = getelementptr inbounds i64, ptr %96, i64 %index1891
  %498 = getelementptr inbounds i8, ptr %497, i64 16
  %wide.load1892 = load <2 x i64>, ptr %497, align 8, !tbaa !9
  %wide.load1893 = load <2 x i64>, ptr %498, align 8, !tbaa !9
  %499 = and <2 x i64> %wide.load1892, %broadcast.splat1895
  %500 = and <2 x i64> %wide.load1893, %broadcast.splat1895
  %501 = getelementptr inbounds i64, ptr %452, i64 %index1891
  %502 = getelementptr inbounds i8, ptr %501, i64 16
  %wide.load1896 = load <2 x i64>, ptr %501, align 16, !tbaa !9
  %wide.load1897 = load <2 x i64>, ptr %502, align 16, !tbaa !9
  %503 = and <2 x i64> %wide.load1896, %broadcast.splat1899
  %504 = and <2 x i64> %wide.load1897, %broadcast.splat1899
  %505 = or <2 x i64> %503, %499
  %506 = or <2 x i64> %504, %500
  store <2 x i64> %505, ptr %501, align 16, !tbaa !9
  store <2 x i64> %506, ptr %502, align 16, !tbaa !9
  %index.next1900 = add nuw i64 %index1891, 4
  %507 = icmp eq i64 %index.next1900, %n.vec1888
  br i1 %507, label %middle.block1883, label %vector.body1890, !llvm.loop !54

middle.block1883:                                 ; preds = %vector.body1890
  br i1 %cmp.n1901, label %._crit_edge1126, label %scalar.ph1884.preheader

scalar.ph1903:                                    ; preds = %scalar.ph1903.preheader, %scalar.ph1903
  %indvars.iv1300 = phi i64 [ %indvars.iv.next1301, %scalar.ph1903 ], [ %indvars.iv1300.ph, %scalar.ph1903.preheader ]
  %508 = getelementptr inbounds i64, ptr %93, i64 %indvars.iv1300
  %509 = load i64, ptr %508, align 8, !tbaa !9
  %510 = and i64 %509, %474
  %511 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1300
  %512 = load i64, ptr %511, align 8, !tbaa !9
  %513 = and i64 %512, %475
  %514 = or i64 %513, %510
  store i64 %514, ptr %511, align 8, !tbaa !9
  %indvars.iv.next1301 = add nuw nsw i64 %indvars.iv1300, 1
  %exitcond1304.not = icmp eq i64 %indvars.iv.next1301, %84
  br i1 %exitcond1304.not, label %._crit_edge1122, label %scalar.ph1903, !llvm.loop !55

._crit_edge1126.thread:                           ; preds = %._crit_edge1122.thread, %._crit_edge1122
  %515 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 4)
  br label %._crit_edge1130.thread

._crit_edge1126:                                  ; preds = %scalar.ph1884, %middle.block1883
  %516 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 4)
  br i1 %.not1204, label %._crit_edge1130.thread, label %.lr.ph1129

.lr.ph1129:                                       ; preds = %._crit_edge1126
  %517 = xor i64 %516, -1
  br i1 %min.iters.check1866, label %scalar.ph1865.preheader, label %vector.ph1867

scalar.ph1865.preheader:                          ; preds = %middle.block1864, %.lr.ph1129
  %indvars.iv1310.ph = phi i64 [ 0, %.lr.ph1129 ], [ %n.vec1869, %middle.block1864 ]
  br label %scalar.ph1865

vector.ph1867:                                    ; preds = %.lr.ph1129
  %broadcast.splatinsert1875 = insertelement <2 x i64> poison, i64 %516, i64 0
  %broadcast.splat1876 = shufflevector <2 x i64> %broadcast.splatinsert1875, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1879 = insertelement <2 x i64> poison, i64 %517, i64 0
  %broadcast.splat1880 = shufflevector <2 x i64> %broadcast.splatinsert1879, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1871

vector.body1871:                                  ; preds = %vector.body1871, %vector.ph1867
  %index1872 = phi i64 [ 0, %vector.ph1867 ], [ %index.next1881, %vector.body1871 ]
  %518 = getelementptr inbounds i64, ptr %99, i64 %index1872
  %519 = getelementptr inbounds i8, ptr %518, i64 16
  %wide.load1873 = load <2 x i64>, ptr %518, align 16, !tbaa !9
  %wide.load1874 = load <2 x i64>, ptr %519, align 16, !tbaa !9
  %520 = and <2 x i64> %wide.load1873, %broadcast.splat1876
  %521 = and <2 x i64> %wide.load1874, %broadcast.splat1876
  %522 = getelementptr inbounds i64, ptr %452, i64 %index1872
  %523 = getelementptr inbounds i8, ptr %522, i64 16
  %wide.load1877 = load <2 x i64>, ptr %522, align 16, !tbaa !9
  %wide.load1878 = load <2 x i64>, ptr %523, align 16, !tbaa !9
  %524 = and <2 x i64> %wide.load1877, %broadcast.splat1880
  %525 = and <2 x i64> %wide.load1878, %broadcast.splat1880
  %526 = or <2 x i64> %524, %520
  %527 = or <2 x i64> %525, %521
  store <2 x i64> %526, ptr %522, align 16, !tbaa !9
  store <2 x i64> %527, ptr %523, align 16, !tbaa !9
  %index.next1881 = add nuw i64 %index1872, 4
  %528 = icmp eq i64 %index.next1881, %n.vec1869
  br i1 %528, label %middle.block1864, label %vector.body1871, !llvm.loop !56

middle.block1864:                                 ; preds = %vector.body1871
  br i1 %cmp.n1882, label %._crit_edge1130, label %scalar.ph1865.preheader

scalar.ph1884:                                    ; preds = %scalar.ph1884.preheader, %scalar.ph1884
  %indvars.iv1305 = phi i64 [ %indvars.iv.next1306, %scalar.ph1884 ], [ %indvars.iv1305.ph, %scalar.ph1884.preheader ]
  %529 = getelementptr inbounds i64, ptr %96, i64 %indvars.iv1305
  %530 = load i64, ptr %529, align 8, !tbaa !9
  %531 = and i64 %530, %495
  %532 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1305
  %533 = load i64, ptr %532, align 8, !tbaa !9
  %534 = and i64 %533, %496
  %535 = or i64 %534, %531
  store i64 %535, ptr %532, align 8, !tbaa !9
  %indvars.iv.next1306 = add nuw nsw i64 %indvars.iv1305, 1
  %exitcond1309.not = icmp eq i64 %indvars.iv.next1306, %84
  br i1 %exitcond1309.not, label %._crit_edge1126, label %scalar.ph1884, !llvm.loop !57

._crit_edge1130.thread:                           ; preds = %._crit_edge1126.thread, %._crit_edge1126
  %536 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 5)
  br label %._crit_edge1134.thread

._crit_edge1130:                                  ; preds = %scalar.ph1865, %middle.block1864
  %537 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 5)
  br i1 %.not1204, label %._crit_edge1134.thread, label %.lr.ph1133

.lr.ph1133:                                       ; preds = %._crit_edge1130
  %538 = xor i64 %537, -1
  br i1 %min.iters.check1847, label %scalar.ph1846.preheader, label %vector.ph1848

scalar.ph1846.preheader:                          ; preds = %middle.block1845, %.lr.ph1133
  %indvars.iv1315.ph = phi i64 [ 0, %.lr.ph1133 ], [ %n.vec1850, %middle.block1845 ]
  br label %scalar.ph1846

vector.ph1848:                                    ; preds = %.lr.ph1133
  %broadcast.splatinsert1856 = insertelement <2 x i64> poison, i64 %537, i64 0
  %broadcast.splat1857 = shufflevector <2 x i64> %broadcast.splatinsert1856, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1860 = insertelement <2 x i64> poison, i64 %538, i64 0
  %broadcast.splat1861 = shufflevector <2 x i64> %broadcast.splatinsert1860, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1852

vector.body1852:                                  ; preds = %vector.body1852, %vector.ph1848
  %index1853 = phi i64 [ 0, %vector.ph1848 ], [ %index.next1862, %vector.body1852 ]
  %539 = getelementptr inbounds i64, ptr %102, i64 %index1853
  %540 = getelementptr inbounds i8, ptr %539, i64 16
  %wide.load1854 = load <2 x i64>, ptr %539, align 8, !tbaa !9
  %wide.load1855 = load <2 x i64>, ptr %540, align 8, !tbaa !9
  %541 = and <2 x i64> %wide.load1854, %broadcast.splat1857
  %542 = and <2 x i64> %wide.load1855, %broadcast.splat1857
  %543 = getelementptr inbounds i64, ptr %452, i64 %index1853
  %544 = getelementptr inbounds i8, ptr %543, i64 16
  %wide.load1858 = load <2 x i64>, ptr %543, align 16, !tbaa !9
  %wide.load1859 = load <2 x i64>, ptr %544, align 16, !tbaa !9
  %545 = and <2 x i64> %wide.load1858, %broadcast.splat1861
  %546 = and <2 x i64> %wide.load1859, %broadcast.splat1861
  %547 = or <2 x i64> %545, %541
  %548 = or <2 x i64> %546, %542
  store <2 x i64> %547, ptr %543, align 16, !tbaa !9
  store <2 x i64> %548, ptr %544, align 16, !tbaa !9
  %index.next1862 = add nuw i64 %index1853, 4
  %549 = icmp eq i64 %index.next1862, %n.vec1850
  br i1 %549, label %middle.block1845, label %vector.body1852, !llvm.loop !58

middle.block1845:                                 ; preds = %vector.body1852
  br i1 %cmp.n1863, label %._crit_edge1134, label %scalar.ph1846.preheader

scalar.ph1865:                                    ; preds = %scalar.ph1865.preheader, %scalar.ph1865
  %indvars.iv1310 = phi i64 [ %indvars.iv.next1311, %scalar.ph1865 ], [ %indvars.iv1310.ph, %scalar.ph1865.preheader ]
  %550 = getelementptr inbounds i64, ptr %99, i64 %indvars.iv1310
  %551 = load i64, ptr %550, align 8, !tbaa !9
  %552 = and i64 %551, %516
  %553 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1310
  %554 = load i64, ptr %553, align 8, !tbaa !9
  %555 = and i64 %554, %517
  %556 = or i64 %555, %552
  store i64 %556, ptr %553, align 8, !tbaa !9
  %indvars.iv.next1311 = add nuw nsw i64 %indvars.iv1310, 1
  %exitcond1314.not = icmp eq i64 %indvars.iv.next1311, %84
  br i1 %exitcond1314.not, label %._crit_edge1130, label %scalar.ph1865, !llvm.loop !59

._crit_edge1134.thread:                           ; preds = %._crit_edge1130.thread, %._crit_edge1130
  %557 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 6)
  br label %._crit_edge1138.thread

._crit_edge1134:                                  ; preds = %scalar.ph1846, %middle.block1845
  %558 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 6)
  br i1 %.not1204, label %._crit_edge1138.thread, label %.lr.ph1137

.lr.ph1137:                                       ; preds = %._crit_edge1134
  %559 = xor i64 %558, -1
  br i1 %min.iters.check1828, label %scalar.ph1827.preheader, label %vector.ph1829

scalar.ph1827.preheader:                          ; preds = %middle.block1826, %.lr.ph1137
  %indvars.iv1320.ph = phi i64 [ 0, %.lr.ph1137 ], [ %n.vec1831, %middle.block1826 ]
  br label %scalar.ph1827

vector.ph1829:                                    ; preds = %.lr.ph1137
  %broadcast.splatinsert1837 = insertelement <2 x i64> poison, i64 %558, i64 0
  %broadcast.splat1838 = shufflevector <2 x i64> %broadcast.splatinsert1837, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1841 = insertelement <2 x i64> poison, i64 %559, i64 0
  %broadcast.splat1842 = shufflevector <2 x i64> %broadcast.splatinsert1841, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1833

vector.body1833:                                  ; preds = %vector.body1833, %vector.ph1829
  %index1834 = phi i64 [ 0, %vector.ph1829 ], [ %index.next1843, %vector.body1833 ]
  %560 = getelementptr inbounds i64, ptr %105, i64 %index1834
  %561 = getelementptr inbounds i8, ptr %560, i64 16
  %wide.load1835 = load <2 x i64>, ptr %560, align 16, !tbaa !9
  %wide.load1836 = load <2 x i64>, ptr %561, align 16, !tbaa !9
  %562 = and <2 x i64> %wide.load1835, %broadcast.splat1838
  %563 = and <2 x i64> %wide.load1836, %broadcast.splat1838
  %564 = getelementptr inbounds i64, ptr %452, i64 %index1834
  %565 = getelementptr inbounds i8, ptr %564, i64 16
  %wide.load1839 = load <2 x i64>, ptr %564, align 16, !tbaa !9
  %wide.load1840 = load <2 x i64>, ptr %565, align 16, !tbaa !9
  %566 = and <2 x i64> %wide.load1839, %broadcast.splat1842
  %567 = and <2 x i64> %wide.load1840, %broadcast.splat1842
  %568 = or <2 x i64> %566, %562
  %569 = or <2 x i64> %567, %563
  store <2 x i64> %568, ptr %564, align 16, !tbaa !9
  store <2 x i64> %569, ptr %565, align 16, !tbaa !9
  %index.next1843 = add nuw i64 %index1834, 4
  %570 = icmp eq i64 %index.next1843, %n.vec1831
  br i1 %570, label %middle.block1826, label %vector.body1833, !llvm.loop !60

middle.block1826:                                 ; preds = %vector.body1833
  br i1 %cmp.n1844, label %._crit_edge1138, label %scalar.ph1827.preheader

scalar.ph1846:                                    ; preds = %scalar.ph1846.preheader, %scalar.ph1846
  %indvars.iv1315 = phi i64 [ %indvars.iv.next1316, %scalar.ph1846 ], [ %indvars.iv1315.ph, %scalar.ph1846.preheader ]
  %571 = getelementptr inbounds i64, ptr %102, i64 %indvars.iv1315
  %572 = load i64, ptr %571, align 8, !tbaa !9
  %573 = and i64 %572, %537
  %574 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1315
  %575 = load i64, ptr %574, align 8, !tbaa !9
  %576 = and i64 %575, %538
  %577 = or i64 %576, %573
  store i64 %577, ptr %574, align 8, !tbaa !9
  %indvars.iv.next1316 = add nuw nsw i64 %indvars.iv1315, 1
  %exitcond1319.not = icmp eq i64 %indvars.iv.next1316, %84
  br i1 %exitcond1319.not, label %._crit_edge1134, label %scalar.ph1846, !llvm.loop !61

._crit_edge1138.thread:                           ; preds = %._crit_edge1134.thread, %._crit_edge1134
  %578 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 7)
  br label %._crit_edge1142.thread

._crit_edge1138:                                  ; preds = %scalar.ph1827, %middle.block1826
  %579 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 7)
  br i1 %.not1204, label %._crit_edge1142.thread, label %.lr.ph1141

.lr.ph1141:                                       ; preds = %._crit_edge1138
  %580 = xor i64 %579, -1
  br i1 %min.iters.check1809, label %scalar.ph1808.preheader, label %vector.ph1810

scalar.ph1808.preheader:                          ; preds = %middle.block1807, %.lr.ph1141
  %indvars.iv1325.ph = phi i64 [ 0, %.lr.ph1141 ], [ %n.vec1812, %middle.block1807 ]
  br label %scalar.ph1808

vector.ph1810:                                    ; preds = %.lr.ph1141
  %broadcast.splatinsert1818 = insertelement <2 x i64> poison, i64 %579, i64 0
  %broadcast.splat1819 = shufflevector <2 x i64> %broadcast.splatinsert1818, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1822 = insertelement <2 x i64> poison, i64 %580, i64 0
  %broadcast.splat1823 = shufflevector <2 x i64> %broadcast.splatinsert1822, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1814

vector.body1814:                                  ; preds = %vector.body1814, %vector.ph1810
  %index1815 = phi i64 [ 0, %vector.ph1810 ], [ %index.next1824, %vector.body1814 ]
  %581 = getelementptr inbounds i64, ptr %108, i64 %index1815
  %582 = getelementptr inbounds i8, ptr %581, i64 16
  %wide.load1816 = load <2 x i64>, ptr %581, align 8, !tbaa !9
  %wide.load1817 = load <2 x i64>, ptr %582, align 8, !tbaa !9
  %583 = and <2 x i64> %wide.load1816, %broadcast.splat1819
  %584 = and <2 x i64> %wide.load1817, %broadcast.splat1819
  %585 = getelementptr inbounds i64, ptr %452, i64 %index1815
  %586 = getelementptr inbounds i8, ptr %585, i64 16
  %wide.load1820 = load <2 x i64>, ptr %585, align 16, !tbaa !9
  %wide.load1821 = load <2 x i64>, ptr %586, align 16, !tbaa !9
  %587 = and <2 x i64> %wide.load1820, %broadcast.splat1823
  %588 = and <2 x i64> %wide.load1821, %broadcast.splat1823
  %589 = or <2 x i64> %587, %583
  %590 = or <2 x i64> %588, %584
  store <2 x i64> %589, ptr %585, align 16, !tbaa !9
  store <2 x i64> %590, ptr %586, align 16, !tbaa !9
  %index.next1824 = add nuw i64 %index1815, 4
  %591 = icmp eq i64 %index.next1824, %n.vec1812
  br i1 %591, label %middle.block1807, label %vector.body1814, !llvm.loop !62

middle.block1807:                                 ; preds = %vector.body1814
  br i1 %cmp.n1825, label %._crit_edge1142, label %scalar.ph1808.preheader

scalar.ph1827:                                    ; preds = %scalar.ph1827.preheader, %scalar.ph1827
  %indvars.iv1320 = phi i64 [ %indvars.iv.next1321, %scalar.ph1827 ], [ %indvars.iv1320.ph, %scalar.ph1827.preheader ]
  %592 = getelementptr inbounds i64, ptr %105, i64 %indvars.iv1320
  %593 = load i64, ptr %592, align 8, !tbaa !9
  %594 = and i64 %593, %558
  %595 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1320
  %596 = load i64, ptr %595, align 8, !tbaa !9
  %597 = and i64 %596, %559
  %598 = or i64 %597, %594
  store i64 %598, ptr %595, align 8, !tbaa !9
  %indvars.iv.next1321 = add nuw nsw i64 %indvars.iv1320, 1
  %exitcond1324.not = icmp eq i64 %indvars.iv.next1321, %84
  br i1 %exitcond1324.not, label %._crit_edge1138, label %scalar.ph1827, !llvm.loop !63

._crit_edge1142.thread:                           ; preds = %._crit_edge1138.thread, %._crit_edge1138
  %599 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 8)
  br label %._crit_edge1146.thread

._crit_edge1142:                                  ; preds = %scalar.ph1808, %middle.block1807
  %600 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 8)
  br i1 %.not1204, label %._crit_edge1146.thread, label %.lr.ph1145

.lr.ph1145:                                       ; preds = %._crit_edge1142
  %601 = xor i64 %600, -1
  br i1 %min.iters.check1790, label %scalar.ph1789.preheader, label %vector.ph1791

scalar.ph1789.preheader:                          ; preds = %middle.block1788, %.lr.ph1145
  %indvars.iv1330.ph = phi i64 [ 0, %.lr.ph1145 ], [ %n.vec1793, %middle.block1788 ]
  br label %scalar.ph1789

vector.ph1791:                                    ; preds = %.lr.ph1145
  %broadcast.splatinsert1799 = insertelement <2 x i64> poison, i64 %600, i64 0
  %broadcast.splat1800 = shufflevector <2 x i64> %broadcast.splatinsert1799, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1803 = insertelement <2 x i64> poison, i64 %601, i64 0
  %broadcast.splat1804 = shufflevector <2 x i64> %broadcast.splatinsert1803, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1795

vector.body1795:                                  ; preds = %vector.body1795, %vector.ph1791
  %index1796 = phi i64 [ 0, %vector.ph1791 ], [ %index.next1805, %vector.body1795 ]
  %602 = getelementptr inbounds i64, ptr %111, i64 %index1796
  %603 = getelementptr inbounds i8, ptr %602, i64 16
  %wide.load1797 = load <2 x i64>, ptr %602, align 16, !tbaa !9
  %wide.load1798 = load <2 x i64>, ptr %603, align 16, !tbaa !9
  %604 = and <2 x i64> %wide.load1797, %broadcast.splat1800
  %605 = and <2 x i64> %wide.load1798, %broadcast.splat1800
  %606 = getelementptr inbounds i64, ptr %452, i64 %index1796
  %607 = getelementptr inbounds i8, ptr %606, i64 16
  %wide.load1801 = load <2 x i64>, ptr %606, align 16, !tbaa !9
  %wide.load1802 = load <2 x i64>, ptr %607, align 16, !tbaa !9
  %608 = and <2 x i64> %wide.load1801, %broadcast.splat1804
  %609 = and <2 x i64> %wide.load1802, %broadcast.splat1804
  %610 = or <2 x i64> %608, %604
  %611 = or <2 x i64> %609, %605
  store <2 x i64> %610, ptr %606, align 16, !tbaa !9
  store <2 x i64> %611, ptr %607, align 16, !tbaa !9
  %index.next1805 = add nuw i64 %index1796, 4
  %612 = icmp eq i64 %index.next1805, %n.vec1793
  br i1 %612, label %middle.block1788, label %vector.body1795, !llvm.loop !64

middle.block1788:                                 ; preds = %vector.body1795
  br i1 %cmp.n1806, label %._crit_edge1146, label %scalar.ph1789.preheader

scalar.ph1808:                                    ; preds = %scalar.ph1808.preheader, %scalar.ph1808
  %indvars.iv1325 = phi i64 [ %indvars.iv.next1326, %scalar.ph1808 ], [ %indvars.iv1325.ph, %scalar.ph1808.preheader ]
  %613 = getelementptr inbounds i64, ptr %108, i64 %indvars.iv1325
  %614 = load i64, ptr %613, align 8, !tbaa !9
  %615 = and i64 %614, %579
  %616 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1325
  %617 = load i64, ptr %616, align 8, !tbaa !9
  %618 = and i64 %617, %580
  %619 = or i64 %618, %615
  store i64 %619, ptr %616, align 8, !tbaa !9
  %indvars.iv.next1326 = add nuw nsw i64 %indvars.iv1325, 1
  %exitcond1329.not = icmp eq i64 %indvars.iv.next1326, %84
  br i1 %exitcond1329.not, label %._crit_edge1142, label %scalar.ph1808, !llvm.loop !65

._crit_edge1146.thread:                           ; preds = %._crit_edge1142.thread, %._crit_edge1142
  %620 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 9)
  br label %._crit_edge1150.thread

._crit_edge1146:                                  ; preds = %scalar.ph1789, %middle.block1788
  %621 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 9)
  br i1 %.not1204, label %._crit_edge1150.thread, label %.lr.ph1149

.lr.ph1149:                                       ; preds = %._crit_edge1146
  %622 = xor i64 %621, -1
  br i1 %min.iters.check1771, label %scalar.ph1770.preheader, label %vector.ph1772

scalar.ph1770.preheader:                          ; preds = %middle.block1769, %.lr.ph1149
  %indvars.iv1335.ph = phi i64 [ 0, %.lr.ph1149 ], [ %n.vec1774, %middle.block1769 ]
  br label %scalar.ph1770

vector.ph1772:                                    ; preds = %.lr.ph1149
  %broadcast.splatinsert1780 = insertelement <2 x i64> poison, i64 %621, i64 0
  %broadcast.splat1781 = shufflevector <2 x i64> %broadcast.splatinsert1780, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1784 = insertelement <2 x i64> poison, i64 %622, i64 0
  %broadcast.splat1785 = shufflevector <2 x i64> %broadcast.splatinsert1784, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1776

vector.body1776:                                  ; preds = %vector.body1776, %vector.ph1772
  %index1777 = phi i64 [ 0, %vector.ph1772 ], [ %index.next1786, %vector.body1776 ]
  %623 = getelementptr inbounds i64, ptr %114, i64 %index1777
  %624 = getelementptr inbounds i8, ptr %623, i64 16
  %wide.load1778 = load <2 x i64>, ptr %623, align 8, !tbaa !9
  %wide.load1779 = load <2 x i64>, ptr %624, align 8, !tbaa !9
  %625 = and <2 x i64> %wide.load1778, %broadcast.splat1781
  %626 = and <2 x i64> %wide.load1779, %broadcast.splat1781
  %627 = getelementptr inbounds i64, ptr %452, i64 %index1777
  %628 = getelementptr inbounds i8, ptr %627, i64 16
  %wide.load1782 = load <2 x i64>, ptr %627, align 16, !tbaa !9
  %wide.load1783 = load <2 x i64>, ptr %628, align 16, !tbaa !9
  %629 = and <2 x i64> %wide.load1782, %broadcast.splat1785
  %630 = and <2 x i64> %wide.load1783, %broadcast.splat1785
  %631 = or <2 x i64> %629, %625
  %632 = or <2 x i64> %630, %626
  store <2 x i64> %631, ptr %627, align 16, !tbaa !9
  store <2 x i64> %632, ptr %628, align 16, !tbaa !9
  %index.next1786 = add nuw i64 %index1777, 4
  %633 = icmp eq i64 %index.next1786, %n.vec1774
  br i1 %633, label %middle.block1769, label %vector.body1776, !llvm.loop !66

middle.block1769:                                 ; preds = %vector.body1776
  br i1 %cmp.n1787, label %._crit_edge1150, label %scalar.ph1770.preheader

scalar.ph1789:                                    ; preds = %scalar.ph1789.preheader, %scalar.ph1789
  %indvars.iv1330 = phi i64 [ %indvars.iv.next1331, %scalar.ph1789 ], [ %indvars.iv1330.ph, %scalar.ph1789.preheader ]
  %634 = getelementptr inbounds i64, ptr %111, i64 %indvars.iv1330
  %635 = load i64, ptr %634, align 8, !tbaa !9
  %636 = and i64 %635, %600
  %637 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1330
  %638 = load i64, ptr %637, align 8, !tbaa !9
  %639 = and i64 %638, %601
  %640 = or i64 %639, %636
  store i64 %640, ptr %637, align 8, !tbaa !9
  %indvars.iv.next1331 = add nuw nsw i64 %indvars.iv1330, 1
  %exitcond1334.not = icmp eq i64 %indvars.iv.next1331, %84
  br i1 %exitcond1334.not, label %._crit_edge1146, label %scalar.ph1789, !llvm.loop !67

._crit_edge1150.thread:                           ; preds = %._crit_edge1146.thread, %._crit_edge1146
  %641 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 10)
  br label %._crit_edge1154.thread

._crit_edge1150:                                  ; preds = %scalar.ph1770, %middle.block1769
  %642 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 10)
  br i1 %.not1204, label %._crit_edge1154.thread, label %.lr.ph1153

.lr.ph1153:                                       ; preds = %._crit_edge1150
  %643 = xor i64 %642, -1
  br i1 %min.iters.check1752, label %scalar.ph1751.preheader, label %vector.ph1753

scalar.ph1751.preheader:                          ; preds = %middle.block1750, %.lr.ph1153
  %indvars.iv1340.ph = phi i64 [ 0, %.lr.ph1153 ], [ %n.vec1755, %middle.block1750 ]
  br label %scalar.ph1751

vector.ph1753:                                    ; preds = %.lr.ph1153
  %broadcast.splatinsert1761 = insertelement <2 x i64> poison, i64 %642, i64 0
  %broadcast.splat1762 = shufflevector <2 x i64> %broadcast.splatinsert1761, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1765 = insertelement <2 x i64> poison, i64 %643, i64 0
  %broadcast.splat1766 = shufflevector <2 x i64> %broadcast.splatinsert1765, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1757

vector.body1757:                                  ; preds = %vector.body1757, %vector.ph1753
  %index1758 = phi i64 [ 0, %vector.ph1753 ], [ %index.next1767, %vector.body1757 ]
  %644 = getelementptr inbounds i64, ptr %117, i64 %index1758
  %645 = getelementptr inbounds i8, ptr %644, i64 16
  %wide.load1759 = load <2 x i64>, ptr %644, align 16, !tbaa !9
  %wide.load1760 = load <2 x i64>, ptr %645, align 16, !tbaa !9
  %646 = and <2 x i64> %wide.load1759, %broadcast.splat1762
  %647 = and <2 x i64> %wide.load1760, %broadcast.splat1762
  %648 = getelementptr inbounds i64, ptr %452, i64 %index1758
  %649 = getelementptr inbounds i8, ptr %648, i64 16
  %wide.load1763 = load <2 x i64>, ptr %648, align 16, !tbaa !9
  %wide.load1764 = load <2 x i64>, ptr %649, align 16, !tbaa !9
  %650 = and <2 x i64> %wide.load1763, %broadcast.splat1766
  %651 = and <2 x i64> %wide.load1764, %broadcast.splat1766
  %652 = or <2 x i64> %650, %646
  %653 = or <2 x i64> %651, %647
  store <2 x i64> %652, ptr %648, align 16, !tbaa !9
  store <2 x i64> %653, ptr %649, align 16, !tbaa !9
  %index.next1767 = add nuw i64 %index1758, 4
  %654 = icmp eq i64 %index.next1767, %n.vec1755
  br i1 %654, label %middle.block1750, label %vector.body1757, !llvm.loop !68

middle.block1750:                                 ; preds = %vector.body1757
  br i1 %cmp.n1768, label %._crit_edge1154, label %scalar.ph1751.preheader

scalar.ph1770:                                    ; preds = %scalar.ph1770.preheader, %scalar.ph1770
  %indvars.iv1335 = phi i64 [ %indvars.iv.next1336, %scalar.ph1770 ], [ %indvars.iv1335.ph, %scalar.ph1770.preheader ]
  %655 = getelementptr inbounds i64, ptr %114, i64 %indvars.iv1335
  %656 = load i64, ptr %655, align 8, !tbaa !9
  %657 = and i64 %656, %621
  %658 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1335
  %659 = load i64, ptr %658, align 8, !tbaa !9
  %660 = and i64 %659, %622
  %661 = or i64 %660, %657
  store i64 %661, ptr %658, align 8, !tbaa !9
  %indvars.iv.next1336 = add nuw nsw i64 %indvars.iv1335, 1
  %exitcond1339.not = icmp eq i64 %indvars.iv.next1336, %84
  br i1 %exitcond1339.not, label %._crit_edge1150, label %scalar.ph1770, !llvm.loop !69

._crit_edge1154.thread:                           ; preds = %._crit_edge1150.thread, %._crit_edge1150
  %662 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 11)
  br label %._crit_edge1158.thread

._crit_edge1154:                                  ; preds = %scalar.ph1751, %middle.block1750
  %663 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 11)
  br i1 %.not1204, label %._crit_edge1158.thread, label %.lr.ph1157

.lr.ph1157:                                       ; preds = %._crit_edge1154
  %664 = xor i64 %663, -1
  br i1 %min.iters.check1733, label %scalar.ph1732.preheader, label %vector.ph1734

scalar.ph1732.preheader:                          ; preds = %middle.block1731, %.lr.ph1157
  %indvars.iv1345.ph = phi i64 [ 0, %.lr.ph1157 ], [ %n.vec1736, %middle.block1731 ]
  br label %scalar.ph1732

vector.ph1734:                                    ; preds = %.lr.ph1157
  %broadcast.splatinsert1742 = insertelement <2 x i64> poison, i64 %663, i64 0
  %broadcast.splat1743 = shufflevector <2 x i64> %broadcast.splatinsert1742, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1746 = insertelement <2 x i64> poison, i64 %664, i64 0
  %broadcast.splat1747 = shufflevector <2 x i64> %broadcast.splatinsert1746, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1738

vector.body1738:                                  ; preds = %vector.body1738, %vector.ph1734
  %index1739 = phi i64 [ 0, %vector.ph1734 ], [ %index.next1748, %vector.body1738 ]
  %665 = getelementptr inbounds i64, ptr %120, i64 %index1739
  %666 = getelementptr inbounds i8, ptr %665, i64 16
  %wide.load1740 = load <2 x i64>, ptr %665, align 8, !tbaa !9
  %wide.load1741 = load <2 x i64>, ptr %666, align 8, !tbaa !9
  %667 = and <2 x i64> %wide.load1740, %broadcast.splat1743
  %668 = and <2 x i64> %wide.load1741, %broadcast.splat1743
  %669 = getelementptr inbounds i64, ptr %452, i64 %index1739
  %670 = getelementptr inbounds i8, ptr %669, i64 16
  %wide.load1744 = load <2 x i64>, ptr %669, align 16, !tbaa !9
  %wide.load1745 = load <2 x i64>, ptr %670, align 16, !tbaa !9
  %671 = and <2 x i64> %wide.load1744, %broadcast.splat1747
  %672 = and <2 x i64> %wide.load1745, %broadcast.splat1747
  %673 = or <2 x i64> %671, %667
  %674 = or <2 x i64> %672, %668
  store <2 x i64> %673, ptr %669, align 16, !tbaa !9
  store <2 x i64> %674, ptr %670, align 16, !tbaa !9
  %index.next1748 = add nuw i64 %index1739, 4
  %675 = icmp eq i64 %index.next1748, %n.vec1736
  br i1 %675, label %middle.block1731, label %vector.body1738, !llvm.loop !70

middle.block1731:                                 ; preds = %vector.body1738
  br i1 %cmp.n1749, label %._crit_edge1158, label %scalar.ph1732.preheader

scalar.ph1751:                                    ; preds = %scalar.ph1751.preheader, %scalar.ph1751
  %indvars.iv1340 = phi i64 [ %indvars.iv.next1341, %scalar.ph1751 ], [ %indvars.iv1340.ph, %scalar.ph1751.preheader ]
  %676 = getelementptr inbounds i64, ptr %117, i64 %indvars.iv1340
  %677 = load i64, ptr %676, align 8, !tbaa !9
  %678 = and i64 %677, %642
  %679 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1340
  %680 = load i64, ptr %679, align 8, !tbaa !9
  %681 = and i64 %680, %643
  %682 = or i64 %681, %678
  store i64 %682, ptr %679, align 8, !tbaa !9
  %indvars.iv.next1341 = add nuw nsw i64 %indvars.iv1340, 1
  %exitcond1344.not = icmp eq i64 %indvars.iv.next1341, %84
  br i1 %exitcond1344.not, label %._crit_edge1154, label %scalar.ph1751, !llvm.loop !71

._crit_edge1158.thread:                           ; preds = %._crit_edge1154.thread, %._crit_edge1154
  %683 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 12)
  br label %._crit_edge1162.thread

._crit_edge1158:                                  ; preds = %scalar.ph1732, %middle.block1731
  %684 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 12)
  br i1 %.not1204, label %._crit_edge1162.thread, label %.lr.ph1161

.lr.ph1161:                                       ; preds = %._crit_edge1158
  %685 = xor i64 %684, -1
  br i1 %min.iters.check1714, label %scalar.ph1713.preheader, label %vector.ph1715

scalar.ph1713.preheader:                          ; preds = %middle.block1712, %.lr.ph1161
  %indvars.iv1350.ph = phi i64 [ 0, %.lr.ph1161 ], [ %n.vec1717, %middle.block1712 ]
  br label %scalar.ph1713

vector.ph1715:                                    ; preds = %.lr.ph1161
  %broadcast.splatinsert1723 = insertelement <2 x i64> poison, i64 %684, i64 0
  %broadcast.splat1724 = shufflevector <2 x i64> %broadcast.splatinsert1723, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1727 = insertelement <2 x i64> poison, i64 %685, i64 0
  %broadcast.splat1728 = shufflevector <2 x i64> %broadcast.splatinsert1727, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1719

vector.body1719:                                  ; preds = %vector.body1719, %vector.ph1715
  %index1720 = phi i64 [ 0, %vector.ph1715 ], [ %index.next1729, %vector.body1719 ]
  %686 = getelementptr inbounds i64, ptr %123, i64 %index1720
  %687 = getelementptr inbounds i8, ptr %686, i64 16
  %wide.load1721 = load <2 x i64>, ptr %686, align 16, !tbaa !9
  %wide.load1722 = load <2 x i64>, ptr %687, align 16, !tbaa !9
  %688 = and <2 x i64> %wide.load1721, %broadcast.splat1724
  %689 = and <2 x i64> %wide.load1722, %broadcast.splat1724
  %690 = getelementptr inbounds i64, ptr %452, i64 %index1720
  %691 = getelementptr inbounds i8, ptr %690, i64 16
  %wide.load1725 = load <2 x i64>, ptr %690, align 16, !tbaa !9
  %wide.load1726 = load <2 x i64>, ptr %691, align 16, !tbaa !9
  %692 = and <2 x i64> %wide.load1725, %broadcast.splat1728
  %693 = and <2 x i64> %wide.load1726, %broadcast.splat1728
  %694 = or <2 x i64> %692, %688
  %695 = or <2 x i64> %693, %689
  store <2 x i64> %694, ptr %690, align 16, !tbaa !9
  store <2 x i64> %695, ptr %691, align 16, !tbaa !9
  %index.next1729 = add nuw i64 %index1720, 4
  %696 = icmp eq i64 %index.next1729, %n.vec1717
  br i1 %696, label %middle.block1712, label %vector.body1719, !llvm.loop !72

middle.block1712:                                 ; preds = %vector.body1719
  br i1 %cmp.n1730, label %._crit_edge1162, label %scalar.ph1713.preheader

scalar.ph1732:                                    ; preds = %scalar.ph1732.preheader, %scalar.ph1732
  %indvars.iv1345 = phi i64 [ %indvars.iv.next1346, %scalar.ph1732 ], [ %indvars.iv1345.ph, %scalar.ph1732.preheader ]
  %697 = getelementptr inbounds i64, ptr %120, i64 %indvars.iv1345
  %698 = load i64, ptr %697, align 8, !tbaa !9
  %699 = and i64 %698, %663
  %700 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1345
  %701 = load i64, ptr %700, align 8, !tbaa !9
  %702 = and i64 %701, %664
  %703 = or i64 %702, %699
  store i64 %703, ptr %700, align 8, !tbaa !9
  %indvars.iv.next1346 = add nuw nsw i64 %indvars.iv1345, 1
  %exitcond1349.not = icmp eq i64 %indvars.iv.next1346, %84
  br i1 %exitcond1349.not, label %._crit_edge1158, label %scalar.ph1732, !llvm.loop !73

._crit_edge1162.thread:                           ; preds = %._crit_edge1158.thread, %._crit_edge1158
  %704 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 13)
  br label %._crit_edge1166.thread

._crit_edge1162:                                  ; preds = %scalar.ph1713, %middle.block1712
  %705 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 13)
  br i1 %.not1204, label %._crit_edge1166.thread, label %.lr.ph1165

.lr.ph1165:                                       ; preds = %._crit_edge1162
  %706 = xor i64 %705, -1
  br i1 %min.iters.check1695, label %scalar.ph1694.preheader, label %vector.ph1696

scalar.ph1694.preheader:                          ; preds = %middle.block1693, %.lr.ph1165
  %indvars.iv1355.ph = phi i64 [ 0, %.lr.ph1165 ], [ %n.vec1698, %middle.block1693 ]
  br label %scalar.ph1694

vector.ph1696:                                    ; preds = %.lr.ph1165
  %broadcast.splatinsert1704 = insertelement <2 x i64> poison, i64 %705, i64 0
  %broadcast.splat1705 = shufflevector <2 x i64> %broadcast.splatinsert1704, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1708 = insertelement <2 x i64> poison, i64 %706, i64 0
  %broadcast.splat1709 = shufflevector <2 x i64> %broadcast.splatinsert1708, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1700

vector.body1700:                                  ; preds = %vector.body1700, %vector.ph1696
  %index1701 = phi i64 [ 0, %vector.ph1696 ], [ %index.next1710, %vector.body1700 ]
  %707 = getelementptr inbounds i64, ptr %126, i64 %index1701
  %708 = getelementptr inbounds i8, ptr %707, i64 16
  %wide.load1702 = load <2 x i64>, ptr %707, align 8, !tbaa !9
  %wide.load1703 = load <2 x i64>, ptr %708, align 8, !tbaa !9
  %709 = and <2 x i64> %wide.load1702, %broadcast.splat1705
  %710 = and <2 x i64> %wide.load1703, %broadcast.splat1705
  %711 = getelementptr inbounds i64, ptr %452, i64 %index1701
  %712 = getelementptr inbounds i8, ptr %711, i64 16
  %wide.load1706 = load <2 x i64>, ptr %711, align 16, !tbaa !9
  %wide.load1707 = load <2 x i64>, ptr %712, align 16, !tbaa !9
  %713 = and <2 x i64> %wide.load1706, %broadcast.splat1709
  %714 = and <2 x i64> %wide.load1707, %broadcast.splat1709
  %715 = or <2 x i64> %713, %709
  %716 = or <2 x i64> %714, %710
  store <2 x i64> %715, ptr %711, align 16, !tbaa !9
  store <2 x i64> %716, ptr %712, align 16, !tbaa !9
  %index.next1710 = add nuw i64 %index1701, 4
  %717 = icmp eq i64 %index.next1710, %n.vec1698
  br i1 %717, label %middle.block1693, label %vector.body1700, !llvm.loop !74

middle.block1693:                                 ; preds = %vector.body1700
  br i1 %cmp.n1711, label %._crit_edge1166, label %scalar.ph1694.preheader

scalar.ph1713:                                    ; preds = %scalar.ph1713.preheader, %scalar.ph1713
  %indvars.iv1350 = phi i64 [ %indvars.iv.next1351, %scalar.ph1713 ], [ %indvars.iv1350.ph, %scalar.ph1713.preheader ]
  %718 = getelementptr inbounds i64, ptr %123, i64 %indvars.iv1350
  %719 = load i64, ptr %718, align 8, !tbaa !9
  %720 = and i64 %719, %684
  %721 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1350
  %722 = load i64, ptr %721, align 8, !tbaa !9
  %723 = and i64 %722, %685
  %724 = or i64 %723, %720
  store i64 %724, ptr %721, align 8, !tbaa !9
  %indvars.iv.next1351 = add nuw nsw i64 %indvars.iv1350, 1
  %exitcond1354.not = icmp eq i64 %indvars.iv.next1351, %84
  br i1 %exitcond1354.not, label %._crit_edge1162, label %scalar.ph1713, !llvm.loop !75

._crit_edge1166.thread:                           ; preds = %._crit_edge1162.thread, %._crit_edge1162
  %725 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 14)
  br label %._crit_edge1170.thread

._crit_edge1166:                                  ; preds = %scalar.ph1694, %middle.block1693
  %726 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 14)
  br i1 %.not1204, label %._crit_edge1170.thread, label %.lr.ph1169

.lr.ph1169:                                       ; preds = %._crit_edge1166
  %727 = xor i64 %726, -1
  br i1 %min.iters.check1676, label %scalar.ph1675.preheader, label %vector.ph1677

scalar.ph1675.preheader:                          ; preds = %middle.block1674, %.lr.ph1169
  %indvars.iv1360.ph = phi i64 [ 0, %.lr.ph1169 ], [ %n.vec1679, %middle.block1674 ]
  br label %scalar.ph1675

vector.ph1677:                                    ; preds = %.lr.ph1169
  %broadcast.splatinsert1685 = insertelement <2 x i64> poison, i64 %726, i64 0
  %broadcast.splat1686 = shufflevector <2 x i64> %broadcast.splatinsert1685, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1689 = insertelement <2 x i64> poison, i64 %727, i64 0
  %broadcast.splat1690 = shufflevector <2 x i64> %broadcast.splatinsert1689, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1681

vector.body1681:                                  ; preds = %vector.body1681, %vector.ph1677
  %index1682 = phi i64 [ 0, %vector.ph1677 ], [ %index.next1691, %vector.body1681 ]
  %728 = getelementptr inbounds i64, ptr %129, i64 %index1682
  %729 = getelementptr inbounds i8, ptr %728, i64 16
  %wide.load1683 = load <2 x i64>, ptr %728, align 16, !tbaa !9
  %wide.load1684 = load <2 x i64>, ptr %729, align 16, !tbaa !9
  %730 = and <2 x i64> %wide.load1683, %broadcast.splat1686
  %731 = and <2 x i64> %wide.load1684, %broadcast.splat1686
  %732 = getelementptr inbounds i64, ptr %452, i64 %index1682
  %733 = getelementptr inbounds i8, ptr %732, i64 16
  %wide.load1687 = load <2 x i64>, ptr %732, align 16, !tbaa !9
  %wide.load1688 = load <2 x i64>, ptr %733, align 16, !tbaa !9
  %734 = and <2 x i64> %wide.load1687, %broadcast.splat1690
  %735 = and <2 x i64> %wide.load1688, %broadcast.splat1690
  %736 = or <2 x i64> %734, %730
  %737 = or <2 x i64> %735, %731
  store <2 x i64> %736, ptr %732, align 16, !tbaa !9
  store <2 x i64> %737, ptr %733, align 16, !tbaa !9
  %index.next1691 = add nuw i64 %index1682, 4
  %738 = icmp eq i64 %index.next1691, %n.vec1679
  br i1 %738, label %middle.block1674, label %vector.body1681, !llvm.loop !76

middle.block1674:                                 ; preds = %vector.body1681
  br i1 %cmp.n1692, label %._crit_edge1170, label %scalar.ph1675.preheader

scalar.ph1694:                                    ; preds = %scalar.ph1694.preheader, %scalar.ph1694
  %indvars.iv1355 = phi i64 [ %indvars.iv.next1356, %scalar.ph1694 ], [ %indvars.iv1355.ph, %scalar.ph1694.preheader ]
  %739 = getelementptr inbounds i64, ptr %126, i64 %indvars.iv1355
  %740 = load i64, ptr %739, align 8, !tbaa !9
  %741 = and i64 %740, %705
  %742 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1355
  %743 = load i64, ptr %742, align 8, !tbaa !9
  %744 = and i64 %743, %706
  %745 = or i64 %744, %741
  store i64 %745, ptr %742, align 8, !tbaa !9
  %indvars.iv.next1356 = add nuw nsw i64 %indvars.iv1355, 1
  %exitcond1359.not = icmp eq i64 %indvars.iv.next1356, %84
  br i1 %exitcond1359.not, label %._crit_edge1166, label %scalar.ph1694, !llvm.loop !77

._crit_edge1170.thread:                           ; preds = %._crit_edge1166.thread, %._crit_edge1166
  %746 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 15)
  br label %._crit_edge1174

._crit_edge1170:                                  ; preds = %scalar.ph1675, %middle.block1674
  %747 = call i64 @FStar_UInt64_eq_mask(i64 noundef %459, i64 noundef 15)
  br i1 %.not1204, label %._crit_edge1174, label %.lr.ph1173

.lr.ph1173:                                       ; preds = %._crit_edge1170
  %748 = xor i64 %747, -1
  br i1 %min.iters.check1657, label %scalar.ph1656.preheader, label %vector.ph1658

scalar.ph1656.preheader:                          ; preds = %middle.block1655, %.lr.ph1173
  %indvars.iv1365.ph = phi i64 [ 0, %.lr.ph1173 ], [ %n.vec1660, %middle.block1655 ]
  br label %scalar.ph1656

vector.ph1658:                                    ; preds = %.lr.ph1173
  %broadcast.splatinsert1666 = insertelement <2 x i64> poison, i64 %747, i64 0
  %broadcast.splat1667 = shufflevector <2 x i64> %broadcast.splatinsert1666, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert1670 = insertelement <2 x i64> poison, i64 %748, i64 0
  %broadcast.splat1671 = shufflevector <2 x i64> %broadcast.splatinsert1670, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body1662

vector.body1662:                                  ; preds = %vector.body1662, %vector.ph1658
  %index1663 = phi i64 [ 0, %vector.ph1658 ], [ %index.next1672, %vector.body1662 ]
  %749 = getelementptr inbounds i64, ptr %132, i64 %index1663
  %750 = getelementptr inbounds i8, ptr %749, i64 16
  %wide.load1664 = load <2 x i64>, ptr %749, align 8, !tbaa !9
  %wide.load1665 = load <2 x i64>, ptr %750, align 8, !tbaa !9
  %751 = and <2 x i64> %wide.load1664, %broadcast.splat1667
  %752 = and <2 x i64> %wide.load1665, %broadcast.splat1667
  %753 = getelementptr inbounds i64, ptr %452, i64 %index1663
  %754 = getelementptr inbounds i8, ptr %753, i64 16
  %wide.load1668 = load <2 x i64>, ptr %753, align 16, !tbaa !9
  %wide.load1669 = load <2 x i64>, ptr %754, align 16, !tbaa !9
  %755 = and <2 x i64> %wide.load1668, %broadcast.splat1671
  %756 = and <2 x i64> %wide.load1669, %broadcast.splat1671
  %757 = or <2 x i64> %755, %751
  %758 = or <2 x i64> %756, %752
  store <2 x i64> %757, ptr %753, align 16, !tbaa !9
  store <2 x i64> %758, ptr %754, align 16, !tbaa !9
  %index.next1672 = add nuw i64 %index1663, 4
  %759 = icmp eq i64 %index.next1672, %n.vec1660
  br i1 %759, label %middle.block1655, label %vector.body1662, !llvm.loop !78

middle.block1655:                                 ; preds = %vector.body1662
  br i1 %cmp.n1673, label %._crit_edge1174, label %scalar.ph1656.preheader

scalar.ph1675:                                    ; preds = %scalar.ph1675.preheader, %scalar.ph1675
  %indvars.iv1360 = phi i64 [ %indvars.iv.next1361, %scalar.ph1675 ], [ %indvars.iv1360.ph, %scalar.ph1675.preheader ]
  %760 = getelementptr inbounds i64, ptr %129, i64 %indvars.iv1360
  %761 = load i64, ptr %760, align 8, !tbaa !9
  %762 = and i64 %761, %726
  %763 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1360
  %764 = load i64, ptr %763, align 8, !tbaa !9
  %765 = and i64 %764, %727
  %766 = or i64 %765, %762
  store i64 %766, ptr %763, align 8, !tbaa !9
  %indvars.iv.next1361 = add nuw nsw i64 %indvars.iv1360, 1
  %exitcond1364.not = icmp eq i64 %indvars.iv.next1361, %84
  br i1 %exitcond1364.not, label %._crit_edge1170, label %scalar.ph1675, !llvm.loop !79

._crit_edge1174:                                  ; preds = %scalar.ph1656, %middle.block1655, %._crit_edge1170.thread, %._crit_edge1170
  call void @Hacl_Bignum_Montgomery_bn_mont_mul_u64(i32 noundef %6, ptr noundef nonnull %83, i64 noundef %.sroa.9.0.copyload, ptr noundef %4, ptr noundef nonnull %452, ptr noundef %4) #7
  %767 = add nuw nsw i32 %.010441175, 1
  %exitcond1370.not = icmp eq i32 %767, %umax
  br i1 %exitcond1370.not, label %.loopexit, label %456, !llvm.loop !80

scalar.ph1656:                                    ; preds = %scalar.ph1656.preheader, %scalar.ph1656
  %indvars.iv1365 = phi i64 [ %indvars.iv.next1366, %scalar.ph1656 ], [ %indvars.iv1365.ph, %scalar.ph1656.preheader ]
  %768 = getelementptr inbounds i64, ptr %132, i64 %indvars.iv1365
  %769 = load i64, ptr %768, align 8, !tbaa !9
  %770 = and i64 %769, %747
  %771 = getelementptr inbounds i64, ptr %452, i64 %indvars.iv1365
  %772 = load i64, ptr %771, align 8, !tbaa !9
  %773 = and i64 %772, %748
  %774 = or i64 %773, %770
  store i64 %774, ptr %771, align 8, !tbaa !9
  %indvars.iv.next1366 = add nuw nsw i64 %indvars.iv1365, 1
  %exitcond1369.not = icmp eq i64 %indvars.iv.next1366, %84
  br i1 %exitcond1369.not, label %._crit_edge1174, label %scalar.ph1656, !llvm.loop !81

.loopexit:                                        ; preds = %._crit_edge1174, %scalar.ph1958, %middle.block1957, %.preheader
  ret void
}

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

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

; Function Attrs: noinline nounwind uwtable
declare hidden i64 @FStar_UInt64_eq_mask(i64 noundef, i64 noundef) local_unnamed_addr #5

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.umax.i32(i32, i32) #6

attributes #0 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { 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 #5 = { noinline 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 #6 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #7 = { 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 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = distinct !{!13, !14, !15, !16}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!"llvm.loop.isvectorized", i32 1}
!16 = !{!"llvm.loop.unroll.runtime.disable"}
!17 = distinct !{!17, !14, !15, !16}
!18 = distinct !{!18, !14}
!19 = distinct !{!19, !14, !16, !15}
!20 = distinct !{!20, !14, !16, !15}
!21 = distinct !{!21, !14, !15, !16}
!22 = distinct !{!22, !14, !15, !16}
!23 = distinct !{!23, !14, !16, !15}
!24 = distinct !{!24, !14, !15, !16}
!25 = distinct !{!25, !14, !16, !15}
!26 = distinct !{!26, !14, !15, !16}
!27 = distinct !{!27, !14, !16, !15}
!28 = distinct !{!28, !14, !15, !16}
!29 = distinct !{!29, !14, !16, !15}
!30 = distinct !{!30, !14, !15, !16}
!31 = distinct !{!31, !14, !16, !15}
!32 = distinct !{!32, !14, !15, !16}
!33 = distinct !{!33, !14, !16, !15}
!34 = distinct !{!34, !14, !15, !16}
!35 = distinct !{!35, !14, !16, !15}
!36 = distinct !{!36, !14, !15, !16}
!37 = distinct !{!37, !14, !16, !15}
!38 = distinct !{!38, !14, !15, !16}
!39 = distinct !{!39, !14, !16, !15}
!40 = distinct !{!40, !14, !15, !16}
!41 = distinct !{!41, !14, !16, !15}
!42 = distinct !{!42, !14, !15, !16}
!43 = distinct !{!43, !14, !16, !15}
!44 = distinct !{!44, !14, !15, !16}
!45 = distinct !{!45, !14, !16, !15}
!46 = distinct !{!46, !14, !15, !16}
!47 = distinct !{!47, !14, !16, !15}
!48 = distinct !{!48, !14, !15, !16}
!49 = distinct !{!49, !14, !16, !15}
!50 = distinct !{!50, !14, !16, !15}
!51 = distinct !{!51, !14, !15, !16}
!52 = distinct !{!52, !14, !15, !16}
!53 = distinct !{!53, !14, !16, !15}
!54 = distinct !{!54, !14, !15, !16}
!55 = distinct !{!55, !14, !16, !15}
!56 = distinct !{!56, !14, !15, !16}
!57 = distinct !{!57, !14, !16, !15}
!58 = distinct !{!58, !14, !15, !16}
!59 = distinct !{!59, !14, !16, !15}
!60 = distinct !{!60, !14, !15, !16}
!61 = distinct !{!61, !14, !16, !15}
!62 = distinct !{!62, !14, !15, !16}
!63 = distinct !{!63, !14, !16, !15}
!64 = distinct !{!64, !14, !15, !16}
!65 = distinct !{!65, !14, !16, !15}
!66 = distinct !{!66, !14, !15, !16}
!67 = distinct !{!67, !14, !16, !15}
!68 = distinct !{!68, !14, !15, !16}
!69 = distinct !{!69, !14, !16, !15}
!70 = distinct !{!70, !14, !15, !16}
!71 = distinct !{!71, !14, !16, !15}
!72 = distinct !{!72, !14, !15, !16}
!73 = distinct !{!73, !14, !16, !15}
!74 = distinct !{!74, !14, !15, !16}
!75 = distinct !{!75, !14, !16, !15}
!76 = distinct !{!76, !14, !15, !16}
!77 = distinct !{!77, !14, !16, !15}
!78 = distinct !{!78, !14, !15, !16}
!79 = distinct !{!79, !14, !16, !15}
!80 = distinct !{!80, !14}
!81 = distinct !{!81, !14, !16, !15}


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