; LLVM IR from specinfo-ua/UAPKI :: library/uapkic/src (eckcdsa)

; 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.ByteArray_st = type { ptr, i64 }
%struct.EcCtx_st = type { ptr, ptr, ptr, ptr, i8, i8 }
%struct.EcParamsCtx_st = type { i32, ptr, ptr, ptr, ptr, i8, i64, ptr, ptr, i32, ptr }
%struct.WordArray_st = type { ptr, i64 }
%struct.EcGfpCtx_st = type { ptr, ptr, ptr, i8, i64 }
%struct.ECPoint_st = type { ptr, ptr, ptr }
%struct.GfpCtx_st = type { ptr, ptr, ptr, ptr }
%struct.EC2m_st = type { ptr, i64, ptr, i64 }
%struct.Gf2mCtx_st = type { ptr, ptr, i64 }

@.str = external hidden unnamed_addr constant [17 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

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

declare ptr @wa_alloc_from_be(ptr noundef, i64 noundef) #1

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

declare void @wa_change_len(ptr noundef, i64 noundef) #1

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

declare ptr @ec_point_alloc(i64 noundef) #1

declare i64 @int_bit_len(ptr noundef) #1

declare i32 @ecp_dual_mul_opt(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

declare i32 @ec2m_dual_mul_opt(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

declare ptr @wa_to_ba(ptr noundef) #1

declare i32 @ba_change_len(ptr noundef, i64 noundef) #1

declare i32 @ba_swap(ptr noundef) #1

declare void @ec_point_free(ptr noundef) #1

declare i64 @hash_get_size(i32 noundef) #1

declare ptr @wa_alloc(i64 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @eckcdsa_verify(ptr noundef %0, ptr noundef %1, i32 noundef %2, ptr noundef %3, ptr noundef %4) #2 {
  %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 ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i64, 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 8, ptr %11) #3
  store ptr null, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  store ptr null, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  store ptr null, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  store ptr null, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  store ptr null, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #3
  store ptr null, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #3
  store ptr null, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #3
  store ptr null, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #3
  store ptr null, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #3
  store i32 0, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #3
  br label %26

26:                                               ; preds = %5
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = icmp ne ptr %27, null
  br i1 %28, label %31, label %29

29:                                               ; preds = %26
  store i32 2, ptr %21, align 4, !tbaa !9
  %30 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 261, i32 noundef %30, ptr noundef null)
  br label %441

31:                                               ; preds = %26
  br label %32

32:                                               ; preds = %31
  br label %33

33:                                               ; preds = %32
  br label %34

34:                                               ; preds = %33
  %35 = load ptr, ptr %7, align 8, !tbaa !5
  %36 = icmp ne ptr %35, null
  br i1 %36, label %39, label %37

37:                                               ; preds = %34
  store i32 2, ptr %21, align 4, !tbaa !9
  %38 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 262, i32 noundef %38, ptr noundef null)
  br label %441

39:                                               ; preds = %34
  br label %40

40:                                               ; preds = %39
  br label %41

41:                                               ; preds = %40
  br label %42

42:                                               ; preds = %41
  %43 = load ptr, ptr %9, align 8, !tbaa !5
  %44 = icmp ne ptr %43, null
  br i1 %44, label %47, label %45

45:                                               ; preds = %42
  store i32 2, ptr %21, align 4, !tbaa !9
  %46 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 263, i32 noundef %46, ptr noundef null)
  br label %441

47:                                               ; preds = %42
  br label %48

48:                                               ; preds = %47
  br label %49

49:                                               ; preds = %48
  br label %50

50:                                               ; preds = %49
  %51 = load ptr, ptr %10, align 8, !tbaa !5
  %52 = icmp ne ptr %51, null
  br i1 %52, label %55, label %53

53:                                               ; preds = %50
  store i32 2, ptr %21, align 4, !tbaa !9
  %54 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 264, i32 noundef %54, ptr noundef null)
  br label %441

55:                                               ; preds = %50
  br label %56

56:                                               ; preds = %55
  br label %57

57:                                               ; preds = %56
  br label %58

58:                                               ; preds = %57
  %59 = load ptr, ptr %7, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.ByteArray_st, ptr %59, i32 0, i32 1
  %61 = load i64, ptr %60, align 8, !tbaa !11
  %62 = load i32, ptr %8, align 4, !tbaa !9
  %63 = call i64 @hash_get_size(i32 noundef %62)
  %64 = icmp eq i64 %61, %63
  br i1 %64, label %67, label %65

65:                                               ; preds = %58
  store i32 2, ptr %21, align 4, !tbaa !9
  %66 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 265, i32 noundef %66, ptr noundef null)
  br label %441

67:                                               ; preds = %58
  br label %68

68:                                               ; preds = %67
  br label %69

69:                                               ; preds = %68
  %70 = load ptr, ptr %6, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.EcCtx_st, ptr %70, i32 0, i32 5
  %72 = load i8, ptr %71, align 1, !tbaa !14, !range !17, !noundef !18
  %73 = trunc i8 %72 to i1
  %74 = zext i1 %73 to i32
  %75 = icmp eq i32 %74, 0
  br i1 %75, label %76, label %81

76:                                               ; preds = %69
  br label %77

77:                                               ; preds = %76
  store i32 14, ptr %21, align 4, !tbaa !9
  %78 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 268, i32 noundef %78, ptr noundef null)
  br label %441

79:                                               ; No predecessors!
  br label %80

80:                                               ; preds = %79
  br label %81

81:                                               ; preds = %80, %69
  %82 = load ptr, ptr %6, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.EcCtx_st, ptr %82, i32 0, i32 0
  %84 = load ptr, ptr %83, align 8, !tbaa !19
  %85 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %84, i32 0, i32 2
  %86 = load ptr, ptr %85, align 8, !tbaa !20
  store ptr %86, ptr %20, align 8, !tbaa !5
  %87 = load ptr, ptr %20, align 8, !tbaa !5
  %88 = call i64 @int_bit_len(ptr noundef %87)
  %89 = add i64 %88, 7
  %90 = udiv i64 %89, 8
  store i64 %90, ptr %23, align 8, !tbaa !22
  %91 = load i64, ptr %23, align 8, !tbaa !22
  store i64 %91, ptr %24, align 8, !tbaa !22
  %92 = load i64, ptr %24, align 8, !tbaa !22
  %93 = load ptr, ptr %7, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.ByteArray_st, ptr %93, i32 0, i32 1
  %95 = load i64, ptr %94, align 8, !tbaa !11
  %96 = icmp ugt i64 %92, %95
  br i1 %96, label %97, label %101

97:                                               ; preds = %81
  %98 = load ptr, ptr %7, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.ByteArray_st, ptr %98, i32 0, i32 1
  %100 = load i64, ptr %99, align 8, !tbaa !11
  store i64 %100, ptr %24, align 8, !tbaa !22
  br label %101

101:                                              ; preds = %97, %81
  br label %102

102:                                              ; preds = %101
  %103 = load ptr, ptr %9, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.ByteArray_st, ptr %103, i32 0, i32 1
  %105 = load i64, ptr %104, align 8, !tbaa !11
  %106 = load i64, ptr %24, align 8, !tbaa !22
  %107 = icmp eq i64 %105, %106
  br i1 %107, label %110, label %108

108:                                              ; preds = %102
  store i32 2, ptr %21, align 4, !tbaa !9
  %109 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 278, i32 noundef %109, ptr noundef null)
  br label %441

110:                                              ; preds = %102
  br label %111

111:                                              ; preds = %110
  br label %112

112:                                              ; preds = %111
  br label %113

113:                                              ; preds = %112
  %114 = load ptr, ptr %10, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.ByteArray_st, ptr %114, i32 0, i32 1
  %116 = load i64, ptr %115, align 8, !tbaa !11
  %117 = load i64, ptr %23, align 8, !tbaa !22
  %118 = icmp eq i64 %116, %117
  br i1 %118, label %121, label %119

119:                                              ; preds = %113
  store i32 2, ptr %21, align 4, !tbaa !9
  %120 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 279, i32 noundef %120, ptr noundef null)
  br label %441

121:                                              ; preds = %113
  br label %122

122:                                              ; preds = %121
  br label %123

123:                                              ; preds = %122
  %124 = load ptr, ptr %7, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.ByteArray_st, ptr %124, i32 0, i32 1
  %126 = load i64, ptr %125, align 8, !tbaa !11
  %127 = load i64, ptr %24, align 8, !tbaa !22
  %128 = icmp ugt i64 %126, %127
  br i1 %128, label %129, label %135

129:                                              ; preds = %123
  %130 = load ptr, ptr %7, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.ByteArray_st, ptr %130, i32 0, i32 1
  %132 = load i64, ptr %131, align 8, !tbaa !11
  %133 = load i64, ptr %24, align 8, !tbaa !22
  %134 = sub i64 %132, %133
  br label %136

135:                                              ; preds = %123
  br label %136

136:                                              ; preds = %135, %129
  %137 = phi i64 [ %134, %129 ], [ 0, %135 ]
  store i64 %137, ptr %25, align 8, !tbaa !22
  br label %138

138:                                              ; preds = %136
  %139 = load ptr, ptr %7, align 8, !tbaa !5
  %140 = load i64, ptr %25, align 8, !tbaa !22
  %141 = load i64, ptr %24, align 8, !tbaa !22
  %142 = call ptr @ba_copy_with_alloc(ptr noundef %139, i64 noundef %140, i64 noundef %141)
  store ptr %142, ptr %12, align 8, !tbaa !5
  %143 = icmp eq ptr null, %142
  br i1 %143, label %144, label %146

144:                                              ; preds = %138
  store i32 2, ptr %21, align 4, !tbaa !9
  %145 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 287, i32 noundef %145)
  br label %441

146:                                              ; preds = %138
  br label %147

147:                                              ; preds = %146
  br label %148

148:                                              ; preds = %147
  store i64 0, ptr %22, align 8, !tbaa !22
  br label %149

149:                                              ; preds = %170, %148
  %150 = load i64, ptr %22, align 8, !tbaa !22
  %151 = load i64, ptr %24, align 8, !tbaa !22
  %152 = icmp ult i64 %150, %151
  br i1 %152, label %153, label %173

153:                                              ; preds = %149
  %154 = load ptr, ptr %9, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.ByteArray_st, ptr %154, i32 0, i32 0
  %156 = load ptr, ptr %155, align 8, !tbaa !23
  %157 = load i64, ptr %22, align 8, !tbaa !22
  %158 = getelementptr inbounds i8, ptr %156, i64 %157
  %159 = load i8, ptr %158, align 1, !tbaa !24
  %160 = zext i8 %159 to i32
  %161 = load ptr, ptr %12, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.ByteArray_st, ptr %161, i32 0, i32 0
  %163 = load ptr, ptr %162, align 8, !tbaa !23
  %164 = load i64, ptr %22, align 8, !tbaa !22
  %165 = getelementptr inbounds i8, ptr %163, i64 %164
  %166 = load i8, ptr %165, align 1, !tbaa !24
  %167 = zext i8 %166 to i32
  %168 = xor i32 %167, %160
  %169 = trunc i32 %168 to i8
  store i8 %169, ptr %165, align 1, !tbaa !24
  br label %170

170:                                              ; preds = %153
  %171 = load i64, ptr %22, align 8, !tbaa !22
  %172 = add i64 %171, 1
  store i64 %172, ptr %22, align 8, !tbaa !22
  br label %149, !llvm.loop !25

173:                                              ; preds = %149
  br label %174

174:                                              ; preds = %173
  %175 = load ptr, ptr %12, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.ByteArray_st, ptr %175, i32 0, i32 0
  %177 = load ptr, ptr %176, align 8, !tbaa !23
  %178 = load i64, ptr %24, align 8, !tbaa !22
  %179 = call ptr @wa_alloc_from_be(ptr noundef %177, i64 noundef %178)
  store ptr %179, ptr %18, align 8, !tbaa !5
  %180 = icmp eq ptr null, %179
  br i1 %180, label %181, label %183

181:                                              ; preds = %174
  store i32 2, ptr %21, align 4, !tbaa !9
  %182 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 294, i32 noundef %182)
  br label %441

183:                                              ; preds = %174
  br label %184

184:                                              ; preds = %183
  br label %185

185:                                              ; preds = %184
  %186 = load ptr, ptr %18, align 8, !tbaa !5
  %187 = load ptr, ptr %20, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.WordArray_st, ptr %187, i32 0, i32 1
  %189 = load i64, ptr %188, align 8, !tbaa !27
  %190 = mul i64 %189, 2
  call void @wa_change_len(ptr noundef %186, i64 noundef %190)
  br label %191

191:                                              ; preds = %185
  %192 = load ptr, ptr %20, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.WordArray_st, ptr %192, i32 0, i32 1
  %194 = load i64, ptr %193, align 8, !tbaa !27
  %195 = call ptr @wa_alloc(i64 noundef %194)
  store ptr %195, ptr %16, align 8, !tbaa !5
  %196 = icmp eq ptr null, %195
  br i1 %196, label %197, label %199

197:                                              ; preds = %191
  store i32 2, ptr %21, align 4, !tbaa !9
  %198 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 296, i32 noundef %198)
  br label %441

199:                                              ; preds = %191
  br label %200

200:                                              ; preds = %199
  br label %201

201:                                              ; preds = %200
  %202 = load ptr, ptr %18, align 8, !tbaa !5
  %203 = load ptr, ptr %20, align 8, !tbaa !5
  %204 = load ptr, ptr %16, align 8, !tbaa !5
  call void @int_div(ptr noundef %202, ptr noundef %203, ptr noundef null, ptr noundef %204)
  br label %205

205:                                              ; preds = %201
  %206 = load ptr, ptr %10, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.ByteArray_st, ptr %206, i32 0, i32 0
  %208 = load ptr, ptr %207, align 8, !tbaa !23
  %209 = load ptr, ptr %10, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.ByteArray_st, ptr %209, i32 0, i32 1
  %211 = load i64, ptr %210, align 8, !tbaa !11
  %212 = call ptr @wa_alloc_from_be(ptr noundef %208, i64 noundef %211)
  store ptr %212, ptr %17, align 8, !tbaa !5
  %213 = icmp eq ptr null, %212
  br i1 %213, label %214, label %216

214:                                              ; preds = %205
  store i32 2, ptr %21, align 4, !tbaa !9
  %215 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 299, i32 noundef %215)
  br label %441

216:                                              ; preds = %205
  br label %217

217:                                              ; preds = %216
  br label %218

218:                                              ; preds = %217
  %219 = load ptr, ptr %17, align 8, !tbaa !5
  %220 = load ptr, ptr %20, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.WordArray_st, ptr %220, i32 0, i32 1
  %222 = load i64, ptr %221, align 8, !tbaa !27
  call void @wa_change_len(ptr noundef %219, i64 noundef %222)
  %223 = load ptr, ptr %6, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.EcCtx_st, ptr %223, i32 0, i32 0
  %225 = load ptr, ptr %224, align 8, !tbaa !19
  %226 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %225, i32 0, i32 0
  %227 = load i32, ptr %226, align 8, !tbaa !29
  %228 = icmp eq i32 %227, 0
  br i1 %228, label %229, label %303

229:                                              ; preds = %218
  br label %230

230:                                              ; preds = %229
  %231 = load ptr, ptr %6, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.EcCtx_st, ptr %231, i32 0, i32 0
  %233 = load ptr, ptr %232, align 8, !tbaa !19
  %234 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %233, i32 0, i32 3
  %235 = load ptr, ptr %234, align 8, !tbaa !30
  %236 = getelementptr inbounds %struct.EcGfpCtx_st, ptr %235, i32 0, i32 4
  %237 = load i64, ptr %236, align 8, !tbaa !31
  %238 = call ptr @ec_point_alloc(i64 noundef %237)
  store ptr %238, ptr %19, align 8, !tbaa !5
  %239 = icmp eq ptr null, %238
  br i1 %239, label %240, label %242

240:                                              ; preds = %230
  store i32 2, ptr %21, align 4, !tbaa !9
  %241 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 304, i32 noundef %241)
  br label %441

242:                                              ; preds = %230
  br label %243

243:                                              ; preds = %242
  br label %244

244:                                              ; preds = %243
  br label %245

245:                                              ; preds = %244
  %246 = load ptr, ptr %6, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.EcCtx_st, ptr %246, i32 0, i32 0
  %248 = load ptr, ptr %247, align 8, !tbaa !19
  %249 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %248, i32 0, i32 3
  %250 = load ptr, ptr %249, align 8, !tbaa !30
  %251 = load ptr, ptr %6, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.EcCtx_st, ptr %251, i32 0, i32 0
  %253 = load ptr, ptr %252, align 8, !tbaa !19
  %254 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %253, i32 0, i32 10
  %255 = load ptr, ptr %254, align 8, !tbaa !33
  %256 = load ptr, ptr %16, align 8, !tbaa !5
  %257 = load ptr, ptr %6, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.EcCtx_st, ptr %257, i32 0, i32 3
  %259 = load ptr, ptr %258, align 8, !tbaa !34
  %260 = load ptr, ptr %17, align 8, !tbaa !5
  %261 = load ptr, ptr %19, align 8, !tbaa !5
  %262 = call i32 @ecp_dual_mul_opt(ptr noundef %250, ptr noundef %255, ptr noundef %256, ptr noundef %259, ptr noundef %260, ptr noundef %261)
  store i32 %262, ptr %21, align 4, !tbaa !9
  %263 = load i32, ptr %21, align 4, !tbaa !9
  %264 = icmp ne i32 %263, 0
  br i1 %264, label %265, label %267

265:                                              ; preds = %245
  %266 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 305, i32 noundef %266)
  br label %441

267:                                              ; preds = %245
  br label %268

268:                                              ; preds = %267
  br label %269

269:                                              ; preds = %268
  br label %270

270:                                              ; preds = %269
  %271 = load ptr, ptr %19, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.ECPoint_st, ptr %271, i32 0, i32 0
  %273 = load ptr, ptr %272, align 8, !tbaa !35
  %274 = call ptr @wa_to_ba(ptr noundef %273)
  store ptr %274, ptr %14, align 8, !tbaa !5
  %275 = icmp eq ptr null, %274
  br i1 %275, label %276, label %278

276:                                              ; preds = %270
  store i32 2, ptr %21, align 4, !tbaa !9
  %277 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 306, i32 noundef %277)
  br label %441

278:                                              ; preds = %270
  br label %279

279:                                              ; preds = %278
  br label %280

280:                                              ; preds = %279
  br label %281

281:                                              ; preds = %280
  %282 = load ptr, ptr %14, align 8, !tbaa !5
  %283 = load ptr, ptr %6, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.EcCtx_st, ptr %283, i32 0, i32 0
  %285 = load ptr, ptr %284, align 8, !tbaa !19
  %286 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %285, i32 0, i32 3
  %287 = load ptr, ptr %286, align 8, !tbaa !30
  %288 = getelementptr inbounds %struct.EcGfpCtx_st, ptr %287, i32 0, i32 0
  %289 = load ptr, ptr %288, align 8, !tbaa !37
  %290 = getelementptr inbounds %struct.GfpCtx_st, ptr %289, i32 0, i32 0
  %291 = load ptr, ptr %290, align 8, !tbaa !38
  %292 = call i64 @int_bit_len(ptr noundef %291)
  %293 = add i64 %292, 7
  %294 = udiv i64 %293, 8
  %295 = call i32 @ba_change_len(ptr noundef %282, i64 noundef %294)
  store i32 %295, ptr %21, align 4, !tbaa !9
  %296 = load i32, ptr %21, align 4, !tbaa !9
  %297 = icmp ne i32 %296, 0
  br i1 %297, label %298, label %300

298:                                              ; preds = %281
  %299 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 307, i32 noundef %299)
  br label %441

300:                                              ; preds = %281
  br label %301

301:                                              ; preds = %300
  br label %302

302:                                              ; preds = %301
  br label %379

303:                                              ; preds = %218
  br label %304

304:                                              ; preds = %303
  %305 = load ptr, ptr %6, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.EcCtx_st, ptr %305, i32 0, i32 0
  %307 = load ptr, ptr %306, align 8, !tbaa !19
  %308 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %307, i32 0, i32 4
  %309 = load ptr, ptr %308, align 8, !tbaa !40
  %310 = getelementptr inbounds %struct.EC2m_st, ptr %309, i32 0, i32 3
  %311 = load i64, ptr %310, align 8, !tbaa !41
  %312 = call ptr @ec_point_alloc(i64 noundef %311)
  store ptr %312, ptr %19, align 8, !tbaa !5
  %313 = icmp eq ptr null, %312
  br i1 %313, label %314, label %316

314:                                              ; preds = %304
  store i32 2, ptr %21, align 4, !tbaa !9
  %315 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 310, i32 noundef %315)
  br label %441

316:                                              ; preds = %304
  br label %317

317:                                              ; preds = %316
  br label %318

318:                                              ; preds = %317
  br label %319

319:                                              ; preds = %318
  %320 = load ptr, ptr %6, align 8, !tbaa !5
  %321 = getelementptr inbounds %struct.EcCtx_st, ptr %320, i32 0, i32 0
  %322 = load ptr, ptr %321, align 8, !tbaa !19
  %323 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %322, i32 0, i32 4
  %324 = load ptr, ptr %323, align 8, !tbaa !40
  %325 = load ptr, ptr %6, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.EcCtx_st, ptr %325, i32 0, i32 0
  %327 = load ptr, ptr %326, align 8, !tbaa !19
  %328 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %327, i32 0, i32 10
  %329 = load ptr, ptr %328, align 8, !tbaa !33
  %330 = load ptr, ptr %16, align 8, !tbaa !5
  %331 = load ptr, ptr %6, align 8, !tbaa !5
  %332 = getelementptr inbounds %struct.EcCtx_st, ptr %331, i32 0, i32 3
  %333 = load ptr, ptr %332, align 8, !tbaa !34
  %334 = load ptr, ptr %17, align 8, !tbaa !5
  %335 = load ptr, ptr %19, align 8, !tbaa !5
  %336 = call i32 @ec2m_dual_mul_opt(ptr noundef %324, ptr noundef %329, ptr noundef %330, ptr noundef %333, ptr noundef %334, ptr noundef %335)
  store i32 %336, ptr %21, align 4, !tbaa !9
  %337 = load i32, ptr %21, align 4, !tbaa !9
  %338 = icmp ne i32 %337, 0
  br i1 %338, label %339, label %341

339:                                              ; preds = %319
  %340 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 311, i32 noundef %340)
  br label %441

341:                                              ; preds = %319
  br label %342

342:                                              ; preds = %341
  br label %343

343:                                              ; preds = %342
  br label %344

344:                                              ; preds = %343
  %345 = load ptr, ptr %19, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.ECPoint_st, ptr %345, i32 0, i32 0
  %347 = load ptr, ptr %346, align 8, !tbaa !35
  %348 = call ptr @wa_to_ba(ptr noundef %347)
  store ptr %348, ptr %14, align 8, !tbaa !5
  %349 = icmp eq ptr null, %348
  br i1 %349, label %350, label %352

350:                                              ; preds = %344
  store i32 2, ptr %21, align 4, !tbaa !9
  %351 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 312, i32 noundef %351)
  br label %441

352:                                              ; preds = %344
  br label %353

353:                                              ; preds = %352
  br label %354

354:                                              ; preds = %353
  br label %355

355:                                              ; preds = %354
  %356 = load ptr, ptr %14, align 8, !tbaa !5
  %357 = load ptr, ptr %6, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.EcCtx_st, ptr %357, i32 0, i32 0
  %359 = load ptr, ptr %358, align 8, !tbaa !19
  %360 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %359, i32 0, i32 4
  %361 = load ptr, ptr %360, align 8, !tbaa !40
  %362 = getelementptr inbounds %struct.EC2m_st, ptr %361, i32 0, i32 0
  %363 = load ptr, ptr %362, align 8, !tbaa !43
  %364 = getelementptr inbounds %struct.Gf2mCtx_st, ptr %363, i32 0, i32 0
  %365 = load ptr, ptr %364, align 8, !tbaa !44
  %366 = getelementptr inbounds i32, ptr %365, i64 0
  %367 = load i32, ptr %366, align 4, !tbaa !9
  %368 = sext i32 %367 to i64
  %369 = add i64 %368, 7
  %370 = udiv i64 %369, 8
  %371 = call i32 @ba_change_len(ptr noundef %356, i64 noundef %370)
  store i32 %371, ptr %21, align 4, !tbaa !9
  %372 = load i32, ptr %21, align 4, !tbaa !9
  %373 = icmp ne i32 %372, 0
  br i1 %373, label %374, label %376

374:                                              ; preds = %355
  %375 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 313, i32 noundef %375)
  br label %441

376:                                              ; preds = %355
  br label %377

377:                                              ; preds = %376
  br label %378

378:                                              ; preds = %377
  br label %379

379:                                              ; preds = %378, %302
  br label %380

380:                                              ; preds = %379
  %381 = load ptr, ptr %14, align 8, !tbaa !5
  %382 = call i32 @ba_swap(ptr noundef %381)
  store i32 %382, ptr %21, align 4, !tbaa !9
  %383 = load i32, ptr %21, align 4, !tbaa !9
  %384 = icmp ne i32 %383, 0
  br i1 %384, label %385, label %387

385:                                              ; preds = %380
  %386 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 317, i32 noundef %386)
  br label %441

387:                                              ; preds = %380
  br label %388

388:                                              ; preds = %387
  br label %389

389:                                              ; preds = %388
  br label %390

390:                                              ; preds = %389
  %391 = load i32, ptr %8, align 4, !tbaa !9
  %392 = call ptr @hash_alloc(i32 noundef %391)
  store ptr %392, ptr %11, align 8, !tbaa !5
  %393 = icmp eq ptr null, %392
  br i1 %393, label %394, label %396

394:                                              ; preds = %390
  store i32 2, ptr %21, align 4, !tbaa !9
  %395 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 318, i32 noundef %395)
  br label %441

396:                                              ; preds = %390
  br label %397

397:                                              ; preds = %396
  br label %398

398:                                              ; preds = %397
  br label %399

399:                                              ; preds = %398
  %400 = load ptr, ptr %11, align 8, !tbaa !5
  %401 = load ptr, ptr %14, align 8, !tbaa !5
  %402 = call i32 @hash_update(ptr noundef %400, ptr noundef %401)
  store i32 %402, ptr %21, align 4, !tbaa !9
  %403 = load i32, ptr %21, align 4, !tbaa !9
  %404 = icmp ne i32 %403, 0
  br i1 %404, label %405, label %407

405:                                              ; preds = %399
  %406 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 319, i32 noundef %406)
  br label %441

407:                                              ; preds = %399
  br label %408

408:                                              ; preds = %407
  br label %409

409:                                              ; preds = %408
  br label %410

410:                                              ; preds = %409
  %411 = load ptr, ptr %11, align 8, !tbaa !5
  %412 = call i32 @hash_final(ptr noundef %411, ptr noundef %13)
  store i32 %412, ptr %21, align 4, !tbaa !9
  %413 = load i32, ptr %21, align 4, !tbaa !9
  %414 = icmp ne i32 %413, 0
  br i1 %414, label %415, label %417

415:                                              ; preds = %410
  %416 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 320, i32 noundef %416)
  br label %441

417:                                              ; preds = %410
  br label %418

418:                                              ; preds = %417
  br label %419

419:                                              ; preds = %418
  br label %420

420:                                              ; preds = %419
  %421 = load ptr, ptr %13, align 8, !tbaa !5
  %422 = load i64, ptr %25, align 8, !tbaa !22
  %423 = load i64, ptr %24, align 8, !tbaa !22
  %424 = call ptr @ba_copy_with_alloc(ptr noundef %421, i64 noundef %422, i64 noundef %423)
  store ptr %424, ptr %15, align 8, !tbaa !5
  %425 = icmp eq ptr null, %424
  br i1 %425, label %426, label %428

426:                                              ; preds = %420
  store i32 2, ptr %21, align 4, !tbaa !9
  %427 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 327, i32 noundef %427)
  br label %441

428:                                              ; preds = %420
  br label %429

429:                                              ; preds = %428
  br label %430

430:                                              ; preds = %429
  %431 = load ptr, ptr %15, align 8, !tbaa !5
  %432 = load ptr, ptr %9, align 8, !tbaa !5
  %433 = call i32 @ba_cmp(ptr noundef %431, ptr noundef %432)
  %434 = icmp ne i32 %433, 0
  br i1 %434, label %435, label %440

435:                                              ; preds = %430
  br label %436

436:                                              ; preds = %435
  store i32 3, ptr %21, align 4, !tbaa !9
  %437 = load i32, ptr %21, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 331, i32 noundef %437, ptr noundef null)
  br label %441

438:                                              ; No predecessors!
  br label %439

439:                                              ; preds = %438
  br label %440

440:                                              ; preds = %439, %430
  br label %441

441:                                              ; preds = %440, %436, %426, %415, %405, %394, %385, %374, %350, %339, %314, %298, %276, %265, %240, %214, %197, %181, %144, %119, %108, %77, %65, %53, %45, %37, %29
  %442 = load ptr, ptr %11, align 8, !tbaa !5
  call void @hash_free(ptr noundef %442)
  %443 = load ptr, ptr %16, align 8, !tbaa !5
  call void @wa_free(ptr noundef %443)
  %444 = load ptr, ptr %17, align 8, !tbaa !5
  call void @wa_free(ptr noundef %444)
  %445 = load ptr, ptr %18, align 8, !tbaa !5
  call void @wa_free(ptr noundef %445)
  %446 = load ptr, ptr %12, align 8, !tbaa !5
  call void @ba_free(ptr noundef %446)
  %447 = load ptr, ptr %13, align 8, !tbaa !5
  call void @ba_free(ptr noundef %447)
  %448 = load ptr, ptr %14, align 8, !tbaa !5
  call void @ba_free(ptr noundef %448)
  %449 = load ptr, ptr %15, align 8, !tbaa !5
  call void @ba_free(ptr noundef %449)
  %450 = load ptr, ptr %19, align 8, !tbaa !5
  call void @ec_point_free(ptr noundef %450)
  %451 = load i32, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #3
  ret i32 %451
}

declare ptr @ba_copy_with_alloc(ptr noundef, i64 noundef, i64 noundef) #1

declare void @int_div(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

declare ptr @hash_alloc(i32 noundef) #1

declare i32 @hash_update(ptr noundef, ptr noundef) #1

declare i32 @hash_final(ptr noundef, ptr noundef) #1

declare i32 @ba_cmp(ptr noundef, ptr noundef) #1

declare void @hash_free(ptr noundef) #1

declare void @wa_free(ptr noundef) #1

declare void @ba_free(ptr noundef) #1

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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !13, i64 8}
!12 = !{!"ByteArray_st", !6, i64 0, !13, i64 8}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !16, i64 33}
!15 = !{!"EcCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !16, i64 32, !16, i64 33}
!16 = !{!"_Bool", !7, i64 0}
!17 = !{i8 0, i8 2}
!18 = !{}
!19 = !{!15, !6, i64 0}
!20 = !{!21, !6, i64 16}
!21 = !{!"EcParamsCtx_st", !10, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !16, i64 40, !13, i64 48, !6, i64 56, !6, i64 64, !10, i64 72, !6, i64 80}
!22 = !{!13, !13, i64 0}
!23 = !{!12, !6, i64 0}
!24 = !{!7, !7, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!28, !13, i64 8}
!28 = !{!"WordArray_st", !6, i64 0, !13, i64 8}
!29 = !{!21, !10, i64 0}
!30 = !{!21, !6, i64 24}
!31 = !{!32, !13, i64 32}
!32 = !{!"EcGfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !16, i64 24, !13, i64 32}
!33 = !{!21, !6, i64 80}
!34 = !{!15, !6, i64 24}
!35 = !{!36, !6, i64 0}
!36 = !{!"ECPoint_st", !6, i64 0, !6, i64 8, !6, i64 16}
!37 = !{!32, !6, i64 0}
!38 = !{!39, !6, i64 0}
!39 = !{!"GfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!40 = !{!21, !6, i64 32}
!41 = !{!42, !13, i64 24}
!42 = !{!"EC2m_st", !6, i64 0, !13, i64 8, !6, i64 16, !13, i64 24}
!43 = !{!42, !6, i64 0}
!44 = !{!45, !6, i64 0}
!45 = !{!"Gf2mCtx_st", !6, i64 0, !6, i64 8, !13, i64 16}


; 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"

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

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

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

declare ptr @wa_alloc_from_be(ptr noundef, i64 noundef) local_unnamed_addr #1

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

declare void @wa_change_len(ptr noundef, i64 noundef) local_unnamed_addr #1

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

declare ptr @ec_point_alloc(i64 noundef) local_unnamed_addr #1

declare i64 @int_bit_len(ptr noundef) local_unnamed_addr #1

declare i32 @ecp_dual_mul_opt(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare i32 @ec2m_dual_mul_opt(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare ptr @wa_to_ba(ptr noundef) local_unnamed_addr #1

declare i32 @ba_change_len(ptr noundef, i64 noundef) local_unnamed_addr #1

declare i32 @ba_swap(ptr noundef) local_unnamed_addr #1

declare void @ec_point_free(ptr noundef) local_unnamed_addr #1

declare i64 @hash_get_size(i32 noundef) local_unnamed_addr #1

declare ptr @wa_alloc(i64 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local i32 @eckcdsa_verify(ptr noundef readonly %0, ptr noundef %1, i32 noundef %2, ptr noundef %3, ptr noundef readonly %4) local_unnamed_addr #2 {
  %6 = alloca ptr, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #4
  store ptr null, ptr %6, align 8, !tbaa !5
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %7, label %8

7:                                                ; preds = %5
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 261, i32 noundef 2, ptr noundef null) #4
  br label %185

8:                                                ; preds = %5
  %.not160 = icmp eq ptr %1, null
  br i1 %.not160, label %9, label %10

9:                                                ; preds = %8
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 262, i32 noundef 2, ptr noundef null) #4
  br label %185

10:                                               ; preds = %8
  %.not161 = icmp eq ptr %3, null
  br i1 %.not161, label %11, label %12

11:                                               ; preds = %10
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 263, i32 noundef 2, ptr noundef null) #4
  br label %185

12:                                               ; preds = %10
  %.not162 = icmp eq ptr %4, null
  br i1 %.not162, label %13, label %14

13:                                               ; preds = %12
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 264, i32 noundef 2, ptr noundef null) #4
  br label %185

14:                                               ; preds = %12
  %15 = getelementptr inbounds i8, ptr %1, i64 8
  %16 = load i64, ptr %15, align 8, !tbaa !9
  %17 = tail call i64 @hash_get_size(i32 noundef %2) #4
  %18 = icmp eq i64 %16, %17
  br i1 %18, label %20, label %19

19:                                               ; preds = %14
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 265, i32 noundef 2, ptr noundef null) #4
  br label %185

20:                                               ; preds = %14
  %21 = getelementptr inbounds i8, ptr %0, i64 33
  %22 = load i8, ptr %21, align 1, !tbaa !12, !range !15, !noundef !16
  %23 = icmp eq i8 %22, 0
  br i1 %23, label %24, label %25

24:                                               ; preds = %20
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 268, i32 noundef 14, ptr noundef null) #4
  br label %185

25:                                               ; preds = %20
  %26 = load ptr, ptr %0, align 8, !tbaa !17
  %27 = getelementptr inbounds i8, ptr %26, i64 16
  %28 = load ptr, ptr %27, align 8, !tbaa !18
  %29 = tail call i64 @int_bit_len(ptr noundef %28) #4
  %30 = add i64 %29, 7
  %31 = lshr i64 %30, 3
  %32 = load i64, ptr %15, align 8, !tbaa !9
  %spec.select = tail call i64 @llvm.umin.i64(i64 %31, i64 %32)
  %33 = getelementptr inbounds i8, ptr %3, i64 8
  %34 = load i64, ptr %33, align 8, !tbaa !9
  %35 = icmp eq i64 %34, %spec.select
  br i1 %35, label %37, label %36

36:                                               ; preds = %25
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 278, i32 noundef 2, ptr noundef null) #4
  br label %185

37:                                               ; preds = %25
  %38 = getelementptr inbounds i8, ptr %4, i64 8
  %39 = load i64, ptr %38, align 8, !tbaa !9
  %40 = icmp eq i64 %39, %31
  br i1 %40, label %42, label %41

41:                                               ; preds = %37
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 279, i32 noundef 2, ptr noundef null) #4
  br label %185

42:                                               ; preds = %37
  %43 = icmp ult i64 %31, %32
  %44 = sub i64 %32, %spec.select
  %spec.select171 = select i1 %43, i64 %44, i64 0
  %45 = tail call ptr @ba_copy_with_alloc(ptr noundef nonnull %1, i64 noundef %spec.select171, i64 noundef %spec.select) #4
  %46 = icmp eq ptr %45, null
  br i1 %46, label %48, label %.preheader

.preheader:                                       ; preds = %42
  %.not173 = icmp eq i64 %spec.select, 0
  br i1 %.not173, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %.preheader
  %xtraiter = and i64 %spec.select, 1
  %47 = icmp eq i64 %spec.select, 1
  br i1 %47, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.preheader.new

.lr.ph.preheader.new:                             ; preds = %.lr.ph.preheader
  %unroll_iter = and i64 %spec.select, 2305843009213693950
  br label %.lr.ph

48:                                               ; preds = %42
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 287, i32 noundef 2) #4
  br label %185

.lr.ph:                                           ; preds = %.lr.ph, %.lr.ph.preheader.new
  %.0116172 = phi i64 [ 0, %.lr.ph.preheader.new ], [ %64, %.lr.ph ]
  %niter = phi i64 [ 0, %.lr.ph.preheader.new ], [ %niter.next.1, %.lr.ph ]
  %49 = load ptr, ptr %3, align 8, !tbaa !21
  %50 = getelementptr inbounds i8, ptr %49, i64 %.0116172
  %51 = load i8, ptr %50, align 1, !tbaa !22
  %52 = load ptr, ptr %45, align 8, !tbaa !21
  %53 = getelementptr inbounds i8, ptr %52, i64 %.0116172
  %54 = load i8, ptr %53, align 1, !tbaa !22
  %55 = xor i8 %54, %51
  store i8 %55, ptr %53, align 1, !tbaa !22
  %56 = or disjoint i64 %.0116172, 1
  %57 = load ptr, ptr %3, align 8, !tbaa !21
  %58 = getelementptr inbounds i8, ptr %57, i64 %56
  %59 = load i8, ptr %58, align 1, !tbaa !22
  %60 = load ptr, ptr %45, align 8, !tbaa !21
  %61 = getelementptr inbounds i8, ptr %60, i64 %56
  %62 = load i8, ptr %61, align 1, !tbaa !22
  %63 = xor i8 %62, %59
  store i8 %63, ptr %61, align 1, !tbaa !22
  %64 = add nuw nsw i64 %.0116172, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph, !llvm.loop !23

._crit_edge.loopexit.unr-lcssa:                   ; preds = %.lr.ph, %.lr.ph.preheader
  %.0116172.unr = phi i64 [ 0, %.lr.ph.preheader ], [ %64, %.lr.ph ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %.lr.ph.epil

.lr.ph.epil:                                      ; preds = %._crit_edge.loopexit.unr-lcssa
  %65 = load ptr, ptr %3, align 8, !tbaa !21
  %66 = getelementptr inbounds i8, ptr %65, i64 %.0116172.unr
  %67 = load i8, ptr %66, align 1, !tbaa !22
  %68 = load ptr, ptr %45, align 8, !tbaa !21
  %69 = getelementptr inbounds i8, ptr %68, i64 %.0116172.unr
  %70 = load i8, ptr %69, align 1, !tbaa !22
  %71 = xor i8 %70, %67
  store i8 %71, ptr %69, align 1, !tbaa !22
  br label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph.epil, %._crit_edge.loopexit.unr-lcssa, %.preheader
  %72 = load ptr, ptr %45, align 8, !tbaa !21
  %73 = tail call ptr @wa_alloc_from_be(ptr noundef %72, i64 noundef %spec.select) #4
  %74 = icmp eq ptr %73, null
  br i1 %74, label %75, label %76

75:                                               ; preds = %._crit_edge
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 294, i32 noundef 2) #4
  br label %185

76:                                               ; preds = %._crit_edge
  %77 = getelementptr inbounds i8, ptr %28, i64 8
  %78 = load i64, ptr %77, align 8, !tbaa !25
  %79 = shl i64 %78, 1
  tail call void @wa_change_len(ptr noundef nonnull %73, i64 noundef %79) #4
  %80 = load i64, ptr %77, align 8, !tbaa !25
  %81 = tail call ptr @wa_alloc(i64 noundef %80) #4
  %82 = icmp eq ptr %81, null
  br i1 %82, label %83, label %84

83:                                               ; preds = %76
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 296, i32 noundef 2) #4
  br label %185

84:                                               ; preds = %76
  tail call void @int_div(ptr noundef nonnull %73, ptr noundef nonnull %28, ptr noundef null, ptr noundef nonnull %81) #4
  %85 = load ptr, ptr %4, align 8, !tbaa !21
  %86 = load i64, ptr %38, align 8, !tbaa !9
  %87 = tail call ptr @wa_alloc_from_be(ptr noundef %85, i64 noundef %86) #4
  %88 = icmp eq ptr %87, null
  br i1 %88, label %89, label %90

89:                                               ; preds = %84
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 299, i32 noundef 2) #4
  br label %185

90:                                               ; preds = %84
  %91 = load i64, ptr %77, align 8, !tbaa !25
  tail call void @wa_change_len(ptr noundef nonnull %87, i64 noundef %91) #4
  %92 = load ptr, ptr %0, align 8, !tbaa !17
  %93 = load i32, ptr %92, align 8, !tbaa !27
  %94 = icmp eq i32 %93, 0
  br i1 %94, label %95, label %129

95:                                               ; preds = %90
  %96 = getelementptr inbounds i8, ptr %92, i64 24
  %97 = load ptr, ptr %96, align 8, !tbaa !28
  %98 = getelementptr inbounds i8, ptr %97, i64 32
  %99 = load i64, ptr %98, align 8, !tbaa !29
  %100 = tail call ptr @ec_point_alloc(i64 noundef %99) #4
  %101 = icmp eq ptr %100, null
  br i1 %101, label %102, label %103

102:                                              ; preds = %95
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 304, i32 noundef 2) #4
  br label %185

103:                                              ; preds = %95
  %104 = load ptr, ptr %0, align 8, !tbaa !17
  %105 = getelementptr inbounds i8, ptr %104, i64 24
  %106 = load ptr, ptr %105, align 8, !tbaa !28
  %107 = getelementptr inbounds i8, ptr %104, i64 80
  %108 = load ptr, ptr %107, align 8, !tbaa !31
  %109 = getelementptr inbounds i8, ptr %0, i64 24
  %110 = load ptr, ptr %109, align 8, !tbaa !32
  %111 = tail call i32 @ecp_dual_mul_opt(ptr noundef %106, ptr noundef %108, ptr noundef nonnull %81, ptr noundef %110, ptr noundef nonnull %87, ptr noundef nonnull %100) #4
  %.not165 = icmp eq i32 %111, 0
  br i1 %.not165, label %113, label %112

112:                                              ; preds = %103
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 305, i32 noundef %111) #4
  br label %185

113:                                              ; preds = %103
  %114 = load ptr, ptr %100, align 8, !tbaa !33
  %115 = tail call ptr @wa_to_ba(ptr noundef %114) #4
  %116 = icmp eq ptr %115, null
  br i1 %116, label %117, label %118

117:                                              ; preds = %113
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 306, i32 noundef 2) #4
  br label %185

118:                                              ; preds = %113
  %119 = load ptr, ptr %0, align 8, !tbaa !17
  %120 = getelementptr inbounds i8, ptr %119, i64 24
  %121 = load ptr, ptr %120, align 8, !tbaa !28
  %122 = load ptr, ptr %121, align 8, !tbaa !35
  %123 = load ptr, ptr %122, align 8, !tbaa !36
  %124 = tail call i64 @int_bit_len(ptr noundef %123) #4
  %125 = add i64 %124, 7
  %126 = lshr i64 %125, 3
  %127 = tail call i32 @ba_change_len(ptr noundef nonnull %115, i64 noundef %126) #4
  %.not166 = icmp eq i32 %127, 0
  br i1 %.not166, label %164, label %128

128:                                              ; preds = %118
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 307, i32 noundef %127) #4
  br label %185

129:                                              ; preds = %90
  %130 = getelementptr inbounds i8, ptr %92, i64 32
  %131 = load ptr, ptr %130, align 8, !tbaa !38
  %132 = getelementptr inbounds i8, ptr %131, i64 24
  %133 = load i64, ptr %132, align 8, !tbaa !39
  %134 = tail call ptr @ec_point_alloc(i64 noundef %133) #4
  %135 = icmp eq ptr %134, null
  br i1 %135, label %136, label %137

136:                                              ; preds = %129
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 310, i32 noundef 2) #4
  br label %185

137:                                              ; preds = %129
  %138 = load ptr, ptr %0, align 8, !tbaa !17
  %139 = getelementptr inbounds i8, ptr %138, i64 32
  %140 = load ptr, ptr %139, align 8, !tbaa !38
  %141 = getelementptr inbounds i8, ptr %138, i64 80
  %142 = load ptr, ptr %141, align 8, !tbaa !31
  %143 = getelementptr inbounds i8, ptr %0, i64 24
  %144 = load ptr, ptr %143, align 8, !tbaa !32
  %145 = tail call i32 @ec2m_dual_mul_opt(ptr noundef %140, ptr noundef %142, ptr noundef nonnull %81, ptr noundef %144, ptr noundef nonnull %87, ptr noundef nonnull %134) #4
  %.not163 = icmp eq i32 %145, 0
  br i1 %.not163, label %147, label %146

146:                                              ; preds = %137
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 311, i32 noundef %145) #4
  br label %185

147:                                              ; preds = %137
  %148 = load ptr, ptr %134, align 8, !tbaa !33
  %149 = tail call ptr @wa_to_ba(ptr noundef %148) #4
  %150 = icmp eq ptr %149, null
  br i1 %150, label %151, label %152

151:                                              ; preds = %147
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 312, i32 noundef 2) #4
  br label %185

152:                                              ; preds = %147
  %153 = load ptr, ptr %0, align 8, !tbaa !17
  %154 = getelementptr inbounds i8, ptr %153, i64 32
  %155 = load ptr, ptr %154, align 8, !tbaa !38
  %156 = load ptr, ptr %155, align 8, !tbaa !41
  %157 = load ptr, ptr %156, align 8, !tbaa !42
  %158 = load i32, ptr %157, align 4, !tbaa !44
  %159 = sext i32 %158 to i64
  %160 = add nsw i64 %159, 7
  %161 = lshr i64 %160, 3
  %162 = tail call i32 @ba_change_len(ptr noundef nonnull %149, i64 noundef %161) #4
  %.not164 = icmp eq i32 %162, 0
  br i1 %.not164, label %164, label %163

163:                                              ; preds = %152
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 313, i32 noundef %162) #4
  br label %185

164:                                              ; preds = %118, %152
  %.0119 = phi ptr [ %100, %118 ], [ %134, %152 ]
  %.0118 = phi ptr [ %115, %118 ], [ %149, %152 ]
  %165 = tail call i32 @ba_swap(ptr noundef nonnull %.0118) #4
  %.not167 = icmp eq i32 %165, 0
  br i1 %.not167, label %167, label %166

166:                                              ; preds = %164
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 317, i32 noundef %165) #4
  br label %185

167:                                              ; preds = %164
  %168 = tail call ptr @hash_alloc(i32 noundef %2) #4
  %169 = icmp eq ptr %168, null
  br i1 %169, label %170, label %171

170:                                              ; preds = %167
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 318, i32 noundef 2) #4
  br label %185

171:                                              ; preds = %167
  %172 = tail call i32 @hash_update(ptr noundef nonnull %168, ptr noundef nonnull %.0118) #4
  %.not168 = icmp eq i32 %172, 0
  br i1 %.not168, label %174, label %173

173:                                              ; preds = %171
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 319, i32 noundef %172) #4
  br label %185

174:                                              ; preds = %171
  %175 = call i32 @hash_final(ptr noundef nonnull %168, ptr noundef nonnull %6) #4
  %.not169 = icmp eq i32 %175, 0
  br i1 %.not169, label %177, label %176

176:                                              ; preds = %174
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 320, i32 noundef %175) #4
  br label %185

177:                                              ; preds = %174
  %178 = load ptr, ptr %6, align 8, !tbaa !5
  %179 = call ptr @ba_copy_with_alloc(ptr noundef %178, i64 noundef %spec.select171, i64 noundef %spec.select) #4
  %180 = icmp eq ptr %179, null
  br i1 %180, label %181, label %182

181:                                              ; preds = %177
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 327, i32 noundef 2) #4
  br label %185

182:                                              ; preds = %177
  %183 = call i32 @ba_cmp(ptr noundef nonnull %179, ptr noundef nonnull %3) #4
  %.not170 = icmp eq i32 %183, 0
  br i1 %.not170, label %185, label %184

184:                                              ; preds = %182
  call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 331, i32 noundef 3, ptr noundef null) #4
  br label %185

185:                                              ; preds = %182, %184, %181, %176, %173, %170, %166, %163, %151, %146, %136, %128, %117, %112, %102, %89, %83, %75, %48, %41, %36, %24, %19, %13, %11, %9, %7
  %.0124 = phi ptr [ null, %24 ], [ null, %48 ], [ null, %75 ], [ null, %83 ], [ null, %89 ], [ null, %102 ], [ null, %112 ], [ null, %117 ], [ null, %128 ], [ null, %166 ], [ null, %170 ], [ null, %173 ], [ null, %176 ], [ null, %181 ], [ %179, %184 ], [ %179, %182 ], [ null, %136 ], [ null, %146 ], [ null, %151 ], [ null, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  %.0123 = phi ptr [ null, %24 ], [ null, %48 ], [ null, %75 ], [ null, %83 ], [ %81, %89 ], [ %81, %102 ], [ %81, %112 ], [ %81, %117 ], [ %81, %128 ], [ %81, %166 ], [ %81, %170 ], [ %81, %173 ], [ %81, %176 ], [ %81, %181 ], [ %81, %184 ], [ %81, %182 ], [ %81, %136 ], [ %81, %146 ], [ %81, %151 ], [ %81, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  %.0122 = phi ptr [ null, %24 ], [ null, %48 ], [ null, %75 ], [ null, %83 ], [ null, %89 ], [ %87, %102 ], [ %87, %112 ], [ %87, %117 ], [ %87, %128 ], [ %87, %166 ], [ %87, %170 ], [ %87, %173 ], [ %87, %176 ], [ %87, %181 ], [ %87, %184 ], [ %87, %182 ], [ %87, %136 ], [ %87, %146 ], [ %87, %151 ], [ %87, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  %.0121 = phi ptr [ null, %24 ], [ null, %48 ], [ null, %75 ], [ %73, %83 ], [ %73, %89 ], [ %73, %102 ], [ %73, %112 ], [ %73, %117 ], [ %73, %128 ], [ %73, %166 ], [ %73, %170 ], [ %73, %173 ], [ %73, %176 ], [ %73, %181 ], [ %73, %184 ], [ %73, %182 ], [ %73, %136 ], [ %73, %146 ], [ %73, %151 ], [ %73, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  %.1120 = phi ptr [ null, %24 ], [ null, %48 ], [ null, %75 ], [ null, %83 ], [ null, %89 ], [ null, %102 ], [ %100, %112 ], [ %100, %117 ], [ %100, %128 ], [ %.0119, %166 ], [ %.0119, %170 ], [ %.0119, %173 ], [ %.0119, %176 ], [ %.0119, %181 ], [ %.0119, %184 ], [ %.0119, %182 ], [ null, %136 ], [ %134, %146 ], [ %134, %151 ], [ %134, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  %.1 = phi ptr [ null, %24 ], [ null, %48 ], [ null, %75 ], [ null, %83 ], [ null, %89 ], [ null, %102 ], [ null, %112 ], [ null, %117 ], [ %115, %128 ], [ %.0118, %166 ], [ %.0118, %170 ], [ %.0118, %173 ], [ %.0118, %176 ], [ %.0118, %181 ], [ %.0118, %184 ], [ %.0118, %182 ], [ null, %136 ], [ null, %146 ], [ null, %151 ], [ %149, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  %.0117 = phi i32 [ 14, %24 ], [ 2, %48 ], [ 2, %75 ], [ 2, %83 ], [ 2, %89 ], [ 2, %102 ], [ %111, %112 ], [ 2, %117 ], [ %127, %128 ], [ %165, %166 ], [ 2, %170 ], [ %172, %173 ], [ %175, %176 ], [ 2, %181 ], [ 3, %184 ], [ 0, %182 ], [ 2, %136 ], [ %145, %146 ], [ 2, %151 ], [ %162, %163 ], [ 2, %41 ], [ 2, %36 ], [ 2, %19 ], [ 2, %13 ], [ 2, %11 ], [ 2, %9 ], [ 2, %7 ]
  %.0115 = phi ptr [ null, %24 ], [ null, %48 ], [ %45, %75 ], [ %45, %83 ], [ %45, %89 ], [ %45, %102 ], [ %45, %112 ], [ %45, %117 ], [ %45, %128 ], [ %45, %166 ], [ %45, %170 ], [ %45, %173 ], [ %45, %176 ], [ %45, %181 ], [ %45, %184 ], [ %45, %182 ], [ %45, %136 ], [ %45, %146 ], [ %45, %151 ], [ %45, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  %.0 = phi ptr [ null, %24 ], [ null, %48 ], [ null, %75 ], [ null, %83 ], [ null, %89 ], [ null, %102 ], [ null, %112 ], [ null, %117 ], [ null, %128 ], [ null, %166 ], [ null, %170 ], [ %168, %173 ], [ %168, %176 ], [ %168, %181 ], [ %168, %184 ], [ %168, %182 ], [ null, %136 ], [ null, %146 ], [ null, %151 ], [ null, %163 ], [ null, %41 ], [ null, %36 ], [ null, %19 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ null, %7 ]
  call void @hash_free(ptr noundef %.0) #4
  call void @wa_free(ptr noundef %.0123) #4
  call void @wa_free(ptr noundef %.0122) #4
  call void @wa_free(ptr noundef %.0121) #4
  call void @ba_free(ptr noundef %.0115) #4
  %186 = load ptr, ptr %6, align 8, !tbaa !5
  call void @ba_free(ptr noundef %186) #4
  call void @ba_free(ptr noundef %.1) #4
  call void @ba_free(ptr noundef %.0124) #4
  call void @ec_point_free(ptr noundef %.1120) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #4
  ret i32 %.0117
}

declare ptr @ba_copy_with_alloc(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #1

declare void @int_div(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare ptr @hash_alloc(i32 noundef) local_unnamed_addr #1

declare i32 @hash_update(ptr noundef, ptr noundef) local_unnamed_addr #1

declare i32 @hash_final(ptr noundef, ptr noundef) local_unnamed_addr #1

declare i32 @ba_cmp(ptr noundef, ptr noundef) local_unnamed_addr #1

declare void @hash_free(ptr noundef) local_unnamed_addr #1

declare void @wa_free(ptr noundef) local_unnamed_addr #1

declare void @ba_free(ptr noundef) local_unnamed_addr #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.umin.i64(i64, i64) #3

attributes #0 = { mustprogress 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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 8}
!10 = !{!"ByteArray_st", !6, i64 0, !11, i64 8}
!11 = !{!"long", !7, i64 0}
!12 = !{!13, !14, i64 33}
!13 = !{!"EcCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !14, i64 32, !14, i64 33}
!14 = !{!"_Bool", !7, i64 0}
!15 = !{i8 0, i8 2}
!16 = !{}
!17 = !{!13, !6, i64 0}
!18 = !{!19, !6, i64 16}
!19 = !{!"EcParamsCtx_st", !20, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !14, i64 40, !11, i64 48, !6, i64 56, !6, i64 64, !20, i64 72, !6, i64 80}
!20 = !{!"int", !7, i64 0}
!21 = !{!10, !6, i64 0}
!22 = !{!7, !7, i64 0}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!26, !11, i64 8}
!26 = !{!"WordArray_st", !6, i64 0, !11, i64 8}
!27 = !{!19, !20, i64 0}
!28 = !{!19, !6, i64 24}
!29 = !{!30, !11, i64 32}
!30 = !{!"EcGfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !14, i64 24, !11, i64 32}
!31 = !{!19, !6, i64 80}
!32 = !{!13, !6, i64 24}
!33 = !{!34, !6, i64 0}
!34 = !{!"ECPoint_st", !6, i64 0, !6, i64 8, !6, i64 16}
!35 = !{!30, !6, i64 0}
!36 = !{!37, !6, i64 0}
!37 = !{!"GfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!38 = !{!19, !6, i64 32}
!39 = !{!40, !11, i64 24}
!40 = !{!"EC2m_st", !6, i64 0, !11, i64 8, !6, i64 16, !11, i64 24}
!41 = !{!40, !6, i64 0}
!42 = !{!43, !6, i64 0}
!43 = !{!"Gf2mCtx_st", !6, i64 0, !6, i64 8, !11, i64 16}
!44 = !{!20, !20, i64 0}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass