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

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

@.str = external hidden unnamed_addr constant [19 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 void @stacktrace_create(ptr noundef, i64 noundef, i32 noundef, ptr noundef) #1

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

declare void @wa_free_private(ptr noundef) #1

declare void @ec_point_free(ptr noundef) #1

declare i64 @int_bit_len(ptr noundef) #1

declare ptr @wa_to_ba(ptr noundef) #1

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

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

declare void @wa_free(ptr noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local i32 @public_key_to_ec_point(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

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

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

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

declare zeroext i1 @int_is_zero(ptr noundef) #1

declare ptr @wa_alloc(i64 noundef) #1

declare i32 @ba_swap(ptr noundef) #1

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

22:                                               ; preds = %7
  %23 = load ptr, ptr %8, align 8, !tbaa !5
  %24 = icmp ne ptr %23, null
  br i1 %24, label %27, label %25

25:                                               ; preds = %22
  store i32 2, ptr %15, align 4, !tbaa !11
  %26 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1150, i32 noundef %26, ptr noundef null)
  br label %363

27:                                               ; preds = %22
  br label %28

28:                                               ; preds = %27
  br label %29

29:                                               ; preds = %28
  br label %30

30:                                               ; preds = %29
  %31 = load ptr, ptr %10, align 8, !tbaa !5
  %32 = icmp ne ptr %31, null
  br i1 %32, label %35, label %33

33:                                               ; preds = %30
  store i32 2, ptr %15, align 4, !tbaa !11
  %34 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1151, i32 noundef %34, ptr noundef null)
  br label %363

35:                                               ; preds = %30
  br label %36

36:                                               ; preds = %35
  br label %37

37:                                               ; preds = %36
  br label %38

38:                                               ; preds = %37
  %39 = load ptr, ptr %11, align 8, !tbaa !5
  %40 = icmp ne ptr %39, null
  br i1 %40, label %43, label %41

41:                                               ; preds = %38
  store i32 2, ptr %15, align 4, !tbaa !11
  %42 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1152, i32 noundef %42, ptr noundef null)
  br label %363

43:                                               ; preds = %38
  br label %44

44:                                               ; preds = %43
  br label %45

45:                                               ; preds = %44
  br label %46

46:                                               ; preds = %45
  %47 = load ptr, ptr %12, align 8, !tbaa !5
  %48 = icmp ne ptr %47, null
  br i1 %48, label %51, label %49

49:                                               ; preds = %46
  store i32 2, ptr %15, align 4, !tbaa !11
  %50 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1153, i32 noundef %50, ptr noundef null)
  br label %363

51:                                               ; preds = %46
  br label %52

52:                                               ; preds = %51
  br label %53

53:                                               ; preds = %52
  br label %54

54:                                               ; preds = %53
  %55 = load ptr, ptr %13, align 8, !tbaa !5
  %56 = icmp ne ptr %55, null
  br i1 %56, label %59, label %57

57:                                               ; preds = %54
  store i32 2, ptr %15, align 4, !tbaa !11
  %58 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1154, i32 noundef %58, ptr noundef null)
  br label %363

59:                                               ; preds = %54
  br label %60

60:                                               ; preds = %59
  br label %61

61:                                               ; preds = %60
  br label %62

62:                                               ; preds = %61
  %63 = load ptr, ptr %14, align 8, !tbaa !5
  %64 = icmp ne ptr %63, null
  br i1 %64, label %67, label %65

65:                                               ; preds = %62
  store i32 2, ptr %15, align 4, !tbaa !11
  %66 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1155, i32 noundef %66, ptr noundef null)
  br label %363

67:                                               ; preds = %62
  br label %68

68:                                               ; preds = %67
  br label %69

69:                                               ; preds = %68
  br label %70

70:                                               ; preds = %69
  %71 = load ptr, ptr %8, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.EcCtx_st, ptr %71, i32 0, i32 0
  %73 = load ptr, ptr %72, align 8, !tbaa !13
  %74 = load ptr, ptr %11, align 8, !tbaa !5
  %75 = load ptr, ptr %12, align 8, !tbaa !5
  %76 = call i32 @public_key_to_ec_point(ptr noundef %73, ptr noundef %74, ptr noundef %75, ptr noundef %18)
  store i32 %76, ptr %15, align 4, !tbaa !11
  %77 = load i32, ptr %15, align 4, !tbaa !11
  %78 = icmp ne i32 %77, 0
  br i1 %78, label %79, label %81

79:                                               ; preds = %70
  %80 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1158, i32 noundef %80)
  br label %363

81:                                               ; preds = %70
  br label %82

82:                                               ; preds = %81
  br label %83

83:                                               ; preds = %82
  br label %84

84:                                               ; preds = %83
  %85 = load ptr, ptr %10, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.ByteArray_st, ptr %85, i32 0, i32 0
  %87 = load ptr, ptr %86, align 8, !tbaa !15
  %88 = load ptr, ptr %10, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.ByteArray_st, ptr %88, i32 0, i32 1
  %90 = load i64, ptr %89, align 8, !tbaa !18
  %91 = call ptr @wa_alloc_from_be(ptr noundef %87, i64 noundef %90)
  store ptr %91, ptr %16, align 8, !tbaa !5
  %92 = icmp eq ptr null, %91
  br i1 %92, label %93, label %95

93:                                               ; preds = %84
  store i32 2, ptr %15, align 4, !tbaa !11
  %94 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1161, i32 noundef %94)
  br label %363

95:                                               ; preds = %84
  br label %96

96:                                               ; preds = %95
  br label %97

97:                                               ; preds = %96
  %98 = load ptr, ptr %16, align 8, !tbaa !5
  %99 = load ptr, ptr %8, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.EcCtx_st, ptr %99, i32 0, i32 0
  %101 = load ptr, ptr %100, align 8, !tbaa !13
  %102 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %101, i32 0, i32 2
  %103 = load ptr, ptr %102, align 8, !tbaa !19
  %104 = call i32 @int_cmp(ptr noundef %98, ptr noundef %103)
  %105 = icmp sge i32 %104, 0
  br i1 %105, label %106, label %111

106:                                              ; preds = %97
  br label %107

107:                                              ; preds = %106
  store i32 6, ptr %15, align 4, !tbaa !11
  %108 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1163, i32 noundef %108, ptr noundef null)
  br label %363

109:                                              ; No predecessors!
  br label %110

110:                                              ; preds = %109
  br label %111

111:                                              ; preds = %110, %97
  %112 = load ptr, ptr %16, align 8, !tbaa !5
  %113 = load ptr, ptr %8, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.EcCtx_st, ptr %113, i32 0, i32 0
  %115 = load ptr, ptr %114, align 8, !tbaa !13
  %116 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %115, i32 0, i32 2
  %117 = load ptr, ptr %116, align 8, !tbaa !19
  %118 = getelementptr inbounds %struct.WordArray_st, ptr %117, i32 0, i32 1
  %119 = load i64, ptr %118, align 8, !tbaa !21
  call void @wa_change_len(ptr noundef %112, i64 noundef %119)
  %120 = load ptr, ptr %8, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.EcCtx_st, ptr %120, i32 0, i32 0
  %122 = load ptr, ptr %121, align 8, !tbaa !13
  %123 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %122, i32 0, i32 0
  %124 = load i32, ptr %123, align 8, !tbaa !23
  %125 = icmp eq i32 %124, 1
  br i1 %125, label %126, label %256

126:                                              ; preds = %111
  %127 = load ptr, ptr %8, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct.EcCtx_st, ptr %127, i32 0, i32 0
  %129 = load ptr, ptr %128, align 8, !tbaa !13
  %130 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %129, i32 0, i32 4
  %131 = load ptr, ptr %130, align 8, !tbaa !24
  %132 = getelementptr inbounds %struct.EC2m_st, ptr %131, i32 0, i32 0
  %133 = load ptr, ptr %132, align 8, !tbaa !25
  %134 = getelementptr inbounds %struct.Gf2mCtx_st, ptr %133, i32 0, i32 0
  %135 = load ptr, ptr %134, align 8, !tbaa !27
  %136 = getelementptr inbounds i32, ptr %135, i64 0
  %137 = load i32, ptr %136, align 4, !tbaa !11
  %138 = sext i32 %137 to i64
  %139 = add i64 %138, 7
  %140 = udiv i64 %139, 8
  store i64 %140, ptr %20, align 8, !tbaa !29
  br label %141

141:                                              ; preds = %126
  %142 = load ptr, ptr %8, align 8, !tbaa !5
  %143 = getelementptr inbounds %struct.EcCtx_st, ptr %142, i32 0, i32 0
  %144 = load ptr, ptr %143, align 8, !tbaa !13
  %145 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %144, i32 0, i32 4
  %146 = load ptr, ptr %145, align 8, !tbaa !24
  %147 = getelementptr inbounds %struct.EC2m_st, ptr %146, i32 0, i32 3
  %148 = load i64, ptr %147, align 8, !tbaa !30
  %149 = call ptr @ec_point_alloc(i64 noundef %148)
  store ptr %149, ptr %19, align 8, !tbaa !5
  %150 = icmp eq ptr null, %149
  br i1 %150, label %151, label %153

151:                                              ; preds = %141
  store i32 2, ptr %15, align 4, !tbaa !11
  %152 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1170, i32 noundef %152)
  br label %363

153:                                              ; preds = %141
  br label %154

154:                                              ; preds = %153
  br label %155

155:                                              ; preds = %154
  br label %156

156:                                              ; preds = %155
  %157 = load ptr, ptr %8, align 8, !tbaa !5
  %158 = getelementptr inbounds %struct.EcCtx_st, ptr %157, i32 0, i32 0
  %159 = load ptr, ptr %158, align 8, !tbaa !13
  %160 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %159, i32 0, i32 4
  %161 = load ptr, ptr %160, align 8, !tbaa !24
  %162 = getelementptr inbounds %struct.EC2m_st, ptr %161, i32 0, i32 3
  %163 = load i64, ptr %162, align 8, !tbaa !30
  %164 = call ptr @wa_alloc(i64 noundef %163)
  store ptr %164, ptr %17, align 8, !tbaa !5
  %165 = icmp eq ptr null, %164
  br i1 %165, label %166, label %168

166:                                              ; preds = %156
  store i32 2, ptr %15, align 4, !tbaa !11
  %167 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1174, i32 noundef %167)
  br label %363

168:                                              ; preds = %156
  br label %169

169:                                              ; preds = %168
  br label %170

170:                                              ; preds = %169
  %171 = load ptr, ptr %8, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.EcCtx_st, ptr %171, i32 0, i32 0
  %173 = load ptr, ptr %172, align 8, !tbaa !13
  %174 = load ptr, ptr %17, align 8, !tbaa !5
  call void @ec2m_get_cofactor(ptr noundef %173, ptr noundef %174)
  %175 = load ptr, ptr %8, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.EcCtx_st, ptr %175, i32 0, i32 0
  %177 = load ptr, ptr %176, align 8, !tbaa !13
  %178 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %177, i32 0, i32 4
  %179 = load ptr, ptr %178, align 8, !tbaa !24
  %180 = load ptr, ptr %18, align 8, !tbaa !5
  %181 = load ptr, ptr %17, align 8, !tbaa !5
  %182 = load ptr, ptr %19, align 8, !tbaa !5
  call void @ec2m_mul(ptr noundef %179, ptr noundef %180, ptr noundef %181, ptr noundef %182)
  %183 = load ptr, ptr %19, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.ECPoint_st, ptr %183, i32 0, i32 0
  %185 = load ptr, ptr %184, align 8, !tbaa !31
  %186 = call zeroext i1 @int_is_zero(ptr noundef %185)
  br i1 %186, label %187, label %197

187:                                              ; preds = %170
  %188 = load ptr, ptr %19, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.ECPoint_st, ptr %188, i32 0, i32 1
  %190 = load ptr, ptr %189, align 8, !tbaa !33
  %191 = call zeroext i1 @int_is_zero(ptr noundef %190)
  br i1 %191, label %192, label %197

192:                                              ; preds = %187
  br label %193

193:                                              ; preds = %192
  store i32 7, ptr %15, align 4, !tbaa !11
  %194 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1180, i32 noundef %194, ptr noundef null)
  br label %363

195:                                              ; No predecessors!
  br label %196

196:                                              ; preds = %195
  br label %197

197:                                              ; preds = %196, %187, %170
  %198 = load ptr, ptr %8, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.EcCtx_st, ptr %198, i32 0, i32 0
  %200 = load ptr, ptr %199, align 8, !tbaa !13
  %201 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %200, i32 0, i32 4
  %202 = load ptr, ptr %201, align 8, !tbaa !24
  %203 = load ptr, ptr %18, align 8, !tbaa !5
  %204 = load ptr, ptr %16, align 8, !tbaa !5
  %205 = load ptr, ptr %19, align 8, !tbaa !5
  call void @ec2m_mul(ptr noundef %202, ptr noundef %203, ptr noundef %204, ptr noundef %205)
  %206 = load i8, ptr %9, align 1, !tbaa !9, !range !34, !noundef !35
  %207 = trunc i8 %206 to i1
  br i1 %207, label %208, label %217

208:                                              ; preds = %197
  %209 = load ptr, ptr %8, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.EcCtx_st, ptr %209, i32 0, i32 0
  %211 = load ptr, ptr %210, align 8, !tbaa !13
  %212 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %211, i32 0, i32 4
  %213 = load ptr, ptr %212, align 8, !tbaa !24
  %214 = load ptr, ptr %19, align 8, !tbaa !5
  %215 = load ptr, ptr %17, align 8, !tbaa !5
  %216 = load ptr, ptr %19, align 8, !tbaa !5
  call void @ec2m_mul(ptr noundef %213, ptr noundef %214, ptr noundef %215, ptr noundef %216)
  br label %217

217:                                              ; preds = %208, %197
  %218 = load ptr, ptr %8, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.EcCtx_st, ptr %218, i32 0, i32 0
  %220 = load ptr, ptr %219, align 8, !tbaa !13
  %221 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %220, i32 0, i32 5
  %222 = load i8, ptr %221, align 8, !tbaa !36, !range !34, !noundef !35
  %223 = trunc i8 %222 to i1
  br i1 %223, label %224, label %255

224:                                              ; preds = %217
  br label %225

225:                                              ; preds = %224
  %226 = load ptr, ptr %8, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.EcCtx_st, ptr %226, i32 0, i32 0
  %228 = load ptr, ptr %227, align 8, !tbaa !13
  %229 = load ptr, ptr %19, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.ECPoint_st, ptr %229, i32 0, i32 0
  %231 = load ptr, ptr %230, align 8, !tbaa !31
  %232 = call i32 @pb_to_onb(ptr noundef %228, ptr noundef %231)
  store i32 %232, ptr %15, align 4, !tbaa !11
  %233 = load i32, ptr %15, align 4, !tbaa !11
  %234 = icmp ne i32 %233, 0
  br i1 %234, label %235, label %237

235:                                              ; preds = %225
  %236 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1191, i32 noundef %236)
  br label %363

237:                                              ; preds = %225
  br label %238

238:                                              ; preds = %237
  br label %239

239:                                              ; preds = %238
  br label %240

240:                                              ; preds = %239
  %241 = load ptr, ptr %8, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.EcCtx_st, ptr %241, i32 0, i32 0
  %243 = load ptr, ptr %242, align 8, !tbaa !13
  %244 = load ptr, ptr %19, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.ECPoint_st, ptr %244, i32 0, i32 1
  %246 = load ptr, ptr %245, align 8, !tbaa !33
  %247 = call i32 @pb_to_onb(ptr noundef %243, ptr noundef %246)
  store i32 %247, ptr %15, align 4, !tbaa !11
  %248 = load i32, ptr %15, align 4, !tbaa !11
  %249 = icmp ne i32 %248, 0
  br i1 %249, label %250, label %252

250:                                              ; preds = %240
  %251 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1192, i32 noundef %251)
  br label %363

252:                                              ; preds = %240
  br label %253

253:                                              ; preds = %252
  br label %254

254:                                              ; preds = %253
  br label %255

255:                                              ; preds = %254, %217
  br label %292

256:                                              ; preds = %111
  %257 = load ptr, ptr %8, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.EcCtx_st, ptr %257, i32 0, i32 0
  %259 = load ptr, ptr %258, align 8, !tbaa !13
  %260 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %259, i32 0, i32 3
  %261 = load ptr, ptr %260, align 8, !tbaa !37
  %262 = getelementptr inbounds %struct.EcGfpCtx_st, ptr %261, i32 0, i32 0
  %263 = load ptr, ptr %262, align 8, !tbaa !38
  %264 = getelementptr inbounds %struct.GfpCtx_st, ptr %263, i32 0, i32 0
  %265 = load ptr, ptr %264, align 8, !tbaa !40
  %266 = call i64 @int_bit_len(ptr noundef %265)
  %267 = add i64 %266, 7
  %268 = udiv i64 %267, 8
  store i64 %268, ptr %20, align 8, !tbaa !29
  br label %269

269:                                              ; preds = %256
  %270 = load ptr, ptr %8, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.EcCtx_st, ptr %270, i32 0, i32 0
  %272 = load ptr, ptr %271, align 8, !tbaa !13
  %273 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %272, i32 0, i32 3
  %274 = load ptr, ptr %273, align 8, !tbaa !37
  %275 = getelementptr inbounds %struct.EcGfpCtx_st, ptr %274, i32 0, i32 4
  %276 = load i64, ptr %275, align 8, !tbaa !42
  %277 = call ptr @ec_point_alloc(i64 noundef %276)
  store ptr %277, ptr %19, align 8, !tbaa !5
  %278 = icmp eq ptr null, %277
  br i1 %278, label %279, label %281

279:                                              ; preds = %269
  store i32 2, ptr %15, align 4, !tbaa !11
  %280 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1197, i32 noundef %280)
  br label %363

281:                                              ; preds = %269
  br label %282

282:                                              ; preds = %281
  br label %283

283:                                              ; preds = %282
  %284 = load ptr, ptr %8, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.EcCtx_st, ptr %284, i32 0, i32 0
  %286 = load ptr, ptr %285, align 8, !tbaa !13
  %287 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %286, i32 0, i32 3
  %288 = load ptr, ptr %287, align 8, !tbaa !37
  %289 = load ptr, ptr %18, align 8, !tbaa !5
  %290 = load ptr, ptr %16, align 8, !tbaa !5
  %291 = load ptr, ptr %19, align 8, !tbaa !5
  call void @ecp_mul(ptr noundef %288, ptr noundef %289, ptr noundef %290, ptr noundef %291)
  br label %292

292:                                              ; preds = %283, %255
  br label %293

293:                                              ; preds = %292
  %294 = load ptr, ptr %19, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.ECPoint_st, ptr %294, i32 0, i32 0
  %296 = load ptr, ptr %295, align 8, !tbaa !31
  %297 = call ptr @wa_to_ba(ptr noundef %296)
  %298 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %297, ptr %298, align 8, !tbaa !5
  %299 = icmp eq ptr null, %297
  br i1 %299, label %300, label %302

300:                                              ; preds = %293
  store i32 2, ptr %15, align 4, !tbaa !11
  %301 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1203, i32 noundef %301)
  br label %363

302:                                              ; preds = %293
  br label %303

303:                                              ; preds = %302
  br label %304

304:                                              ; preds = %303
  br label %305

305:                                              ; preds = %304
  %306 = load ptr, ptr %19, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.ECPoint_st, ptr %306, i32 0, i32 1
  %308 = load ptr, ptr %307, align 8, !tbaa !33
  %309 = call ptr @wa_to_ba(ptr noundef %308)
  %310 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %309, ptr %310, align 8, !tbaa !5
  %311 = icmp eq ptr null, %309
  br i1 %311, label %312, label %314

312:                                              ; preds = %305
  store i32 2, ptr %15, align 4, !tbaa !11
  %313 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1204, i32 noundef %313)
  br label %363

314:                                              ; preds = %305
  br label %315

315:                                              ; preds = %314
  br label %316

316:                                              ; preds = %315
  br label %317

317:                                              ; preds = %316
  %318 = load ptr, ptr %13, align 8, !tbaa !5
  %319 = load ptr, ptr %318, align 8, !tbaa !5
  %320 = load i64, ptr %20, align 8, !tbaa !29
  %321 = call i32 @ba_change_len(ptr noundef %319, i64 noundef %320)
  store i32 %321, ptr %15, align 4, !tbaa !11
  %322 = load i32, ptr %15, align 4, !tbaa !11
  %323 = icmp ne i32 %322, 0
  br i1 %323, label %324, label %326

324:                                              ; preds = %317
  %325 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1205, i32 noundef %325)
  br label %363

326:                                              ; preds = %317
  br label %327

327:                                              ; preds = %326
  br label %328

328:                                              ; preds = %327
  br label %329

329:                                              ; preds = %328
  %330 = load ptr, ptr %14, align 8, !tbaa !5
  %331 = load ptr, ptr %330, align 8, !tbaa !5
  %332 = load i64, ptr %20, align 8, !tbaa !29
  %333 = call i32 @ba_change_len(ptr noundef %331, i64 noundef %332)
  store i32 %333, ptr %15, align 4, !tbaa !11
  %334 = load i32, ptr %15, align 4, !tbaa !11
  %335 = icmp ne i32 %334, 0
  br i1 %335, label %336, label %338

336:                                              ; preds = %329
  %337 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1206, i32 noundef %337)
  br label %363

338:                                              ; preds = %329
  br label %339

339:                                              ; preds = %338
  br label %340

340:                                              ; preds = %339
  br label %341

341:                                              ; preds = %340
  %342 = load ptr, ptr %13, align 8, !tbaa !5
  %343 = load ptr, ptr %342, align 8, !tbaa !5
  %344 = call i32 @ba_swap(ptr noundef %343)
  store i32 %344, ptr %15, align 4, !tbaa !11
  %345 = load i32, ptr %15, align 4, !tbaa !11
  %346 = icmp ne i32 %345, 0
  br i1 %346, label %347, label %349

347:                                              ; preds = %341
  %348 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1207, i32 noundef %348)
  br label %363

349:                                              ; preds = %341
  br label %350

350:                                              ; preds = %349
  br label %351

351:                                              ; preds = %350
  br label %352

352:                                              ; preds = %351
  %353 = load ptr, ptr %14, align 8, !tbaa !5
  %354 = load ptr, ptr %353, align 8, !tbaa !5
  %355 = call i32 @ba_swap(ptr noundef %354)
  store i32 %355, ptr %15, align 4, !tbaa !11
  %356 = load i32, ptr %15, align 4, !tbaa !11
  %357 = icmp ne i32 %356, 0
  br i1 %357, label %358, label %360

358:                                              ; preds = %352
  %359 = load i32, ptr %15, align 4, !tbaa !11
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1208, i32 noundef %359)
  br label %363

360:                                              ; preds = %352
  br label %361

361:                                              ; preds = %360
  br label %362

362:                                              ; preds = %361
  store i32 0, ptr %15, align 4, !tbaa !11
  br label %363

363:                                              ; preds = %362, %358, %347, %336, %324, %312, %300, %279, %250, %235, %193, %166, %151, %107, %93, %79, %65, %57, %49, %41, %33, %25
  %364 = load ptr, ptr %16, align 8, !tbaa !5
  call void @wa_free_private(ptr noundef %364)
  %365 = load ptr, ptr %17, align 8, !tbaa !5
  call void @wa_free(ptr noundef %365)
  %366 = load ptr, ptr %19, align 8, !tbaa !5
  call void @ec_point_free(ptr noundef %366)
  %367 = load ptr, ptr %18, align 8, !tbaa !5
  call void @ec_point_free(ptr noundef %367)
  %368 = load i32, ptr %15, align 4, !tbaa !11
  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 4, ptr %15) #3
  ret i32 %368
}

declare ptr @ec_point_alloc(i64 noundef) #1

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

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

declare void @ecp_mul(ptr noundef, ptr noundef, ptr noundef, 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 = !{!"_Bool", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !6, i64 0}
!14 = !{!"EcCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !10, i64 32, !10, i64 33}
!15 = !{!16, !6, i64 0}
!16 = !{!"ByteArray_st", !6, i64 0, !17, i64 8}
!17 = !{!"long", !7, i64 0}
!18 = !{!16, !17, i64 8}
!19 = !{!20, !6, i64 16}
!20 = !{!"EcParamsCtx_st", !12, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !10, i64 40, !17, i64 48, !6, i64 56, !6, i64 64, !12, i64 72, !6, i64 80}
!21 = !{!22, !17, i64 8}
!22 = !{!"WordArray_st", !6, i64 0, !17, i64 8}
!23 = !{!20, !12, i64 0}
!24 = !{!20, !6, i64 32}
!25 = !{!26, !6, i64 0}
!26 = !{!"EC2m_st", !6, i64 0, !17, i64 8, !6, i64 16, !17, i64 24}
!27 = !{!28, !6, i64 0}
!28 = !{!"Gf2mCtx_st", !6, i64 0, !6, i64 8, !17, i64 16}
!29 = !{!17, !17, i64 0}
!30 = !{!26, !17, i64 24}
!31 = !{!32, !6, i64 0}
!32 = !{!"ECPoint_st", !6, i64 0, !6, i64 8, !6, i64 16}
!33 = !{!32, !6, i64 8}
!34 = !{i8 0, i8 2}
!35 = !{}
!36 = !{!20, !10, i64 40}
!37 = !{!20, !6, i64 24}
!38 = !{!39, !6, i64 0}
!39 = !{!"EcGfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !10, i64 24, !17, i64 32}
!40 = !{!41, !6, i64 0}
!41 = !{!"GfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!42 = !{!39, !17, i64 32}


; 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 [19 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

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

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

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

declare void @wa_free_private(ptr noundef) local_unnamed_addr #1

declare void @ec_point_free(ptr noundef) local_unnamed_addr #1

declare i64 @int_bit_len(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 @pb_to_onb(ptr noundef, ptr noundef) local_unnamed_addr #1

declare void @wa_free(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local i32 @public_key_to_ec_point(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

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

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

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

declare zeroext i1 @int_is_zero(ptr noundef) local_unnamed_addr #1

declare ptr @wa_alloc(i64 noundef) local_unnamed_addr #1

declare i32 @ba_swap(ptr noundef) local_unnamed_addr #1

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

9:                                                ; preds = %7
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1150, i32 noundef 2, ptr noundef null) #3
  br label %151

10:                                               ; preds = %7
  %.not111 = icmp eq ptr %2, null
  br i1 %.not111, label %11, label %12

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

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

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

14:                                               ; preds = %12
  %.not113 = icmp eq ptr %4, null
  br i1 %.not113, label %15, label %16

15:                                               ; preds = %14
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1153, i32 noundef 2, ptr noundef null) #3
  br label %151

16:                                               ; preds = %14
  %.not114 = icmp eq ptr %5, null
  br i1 %.not114, label %17, label %18

17:                                               ; preds = %16
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1154, i32 noundef 2, ptr noundef null) #3
  br label %151

18:                                               ; preds = %16
  %.not115 = icmp eq ptr %6, null
  br i1 %.not115, label %19, label %20

19:                                               ; preds = %18
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1155, i32 noundef 2, ptr noundef null) #3
  br label %151

20:                                               ; preds = %18
  %21 = load ptr, ptr %0, align 8, !tbaa !9
  %22 = call i32 @public_key_to_ec_point(ptr noundef %21, ptr noundef nonnull %3, ptr noundef nonnull %4, ptr noundef nonnull %8)
  %.not116 = icmp eq i32 %22, 0
  br i1 %.not116, label %24, label %23

23:                                               ; preds = %20
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1158, i32 noundef %22) #3
  br label %151

24:                                               ; preds = %20
  %25 = load ptr, ptr %2, align 8, !tbaa !12
  %26 = getelementptr inbounds i8, ptr %2, i64 8
  %27 = load i64, ptr %26, align 8, !tbaa !15
  %28 = call ptr @wa_alloc_from_be(ptr noundef %25, i64 noundef %27) #3
  %29 = icmp eq ptr %28, null
  br i1 %29, label %30, label %31

30:                                               ; preds = %24
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1161, i32 noundef 2) #3
  br label %151

31:                                               ; preds = %24
  %32 = load ptr, ptr %0, align 8, !tbaa !9
  %33 = getelementptr inbounds i8, ptr %32, i64 16
  %34 = load ptr, ptr %33, align 8, !tbaa !16
  %35 = call i32 @int_cmp(ptr noundef nonnull %28, ptr noundef %34) #3
  %36 = icmp sgt i32 %35, -1
  br i1 %36, label %37, label %38

37:                                               ; preds = %31
  call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1163, i32 noundef 6, ptr noundef null) #3
  br label %151

38:                                               ; preds = %31
  %39 = load ptr, ptr %0, align 8, !tbaa !9
  %40 = getelementptr inbounds i8, ptr %39, i64 16
  %41 = load ptr, ptr %40, align 8, !tbaa !16
  %42 = getelementptr inbounds i8, ptr %41, i64 8
  %43 = load i64, ptr %42, align 8, !tbaa !19
  call void @wa_change_len(ptr noundef nonnull %28, i64 noundef %43) #3
  %44 = load ptr, ptr %0, align 8, !tbaa !9
  %45 = load i32, ptr %44, align 8, !tbaa !21
  %46 = icmp eq i32 %45, 1
  br i1 %46, label %47, label %105

47:                                               ; preds = %38
  %48 = getelementptr inbounds i8, ptr %44, i64 32
  %49 = load ptr, ptr %48, align 8, !tbaa !22
  %50 = load ptr, ptr %49, align 8, !tbaa !23
  %51 = load ptr, ptr %50, align 8, !tbaa !25
  %52 = load i32, ptr %51, align 4, !tbaa !27
  %53 = sext i32 %52 to i64
  %54 = getelementptr inbounds i8, ptr %49, i64 24
  %55 = load i64, ptr %54, align 8, !tbaa !28
  %56 = call ptr @ec_point_alloc(i64 noundef %55) #3
  %57 = icmp eq ptr %56, null
  br i1 %57, label %58, label %59

58:                                               ; preds = %47
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1170, i32 noundef 2) #3
  br label %151

59:                                               ; preds = %47
  %60 = load ptr, ptr %0, align 8, !tbaa !9
  %61 = getelementptr inbounds i8, ptr %60, i64 32
  %62 = load ptr, ptr %61, align 8, !tbaa !22
  %63 = getelementptr inbounds i8, ptr %62, i64 24
  %64 = load i64, ptr %63, align 8, !tbaa !28
  %65 = call ptr @wa_alloc(i64 noundef %64) #3
  %66 = icmp eq ptr %65, null
  br i1 %66, label %67, label %68

67:                                               ; preds = %59
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1174, i32 noundef 2) #3
  br label %151

68:                                               ; preds = %59
  %69 = load ptr, ptr %0, align 8, !tbaa !9
  call void @ec2m_get_cofactor(ptr noundef %69, ptr noundef nonnull %65)
  %70 = load ptr, ptr %0, align 8, !tbaa !9
  %71 = getelementptr inbounds i8, ptr %70, i64 32
  %72 = load ptr, ptr %71, align 8, !tbaa !22
  %73 = load ptr, ptr %8, align 8, !tbaa !5
  call void @ec2m_mul(ptr noundef %72, ptr noundef %73, ptr noundef nonnull %65, ptr noundef nonnull %56) #3
  %74 = load ptr, ptr %56, align 8, !tbaa !29
  %75 = call zeroext i1 @int_is_zero(ptr noundef %74) #3
  br i1 %75, label %76, label %81

76:                                               ; preds = %68
  %77 = getelementptr inbounds i8, ptr %56, i64 8
  %78 = load ptr, ptr %77, align 8, !tbaa !31
  %79 = call zeroext i1 @int_is_zero(ptr noundef %78) #3
  br i1 %79, label %80, label %81

80:                                               ; preds = %76
  call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1180, i32 noundef 7, ptr noundef null) #3
  br label %151

81:                                               ; preds = %76, %68
  %82 = load ptr, ptr %0, align 8, !tbaa !9
  %83 = getelementptr inbounds i8, ptr %82, i64 32
  %84 = load ptr, ptr %83, align 8, !tbaa !22
  %85 = load ptr, ptr %8, align 8, !tbaa !5
  call void @ec2m_mul(ptr noundef %84, ptr noundef %85, ptr noundef nonnull %28, ptr noundef nonnull %56) #3
  br i1 %1, label %86, label %90

86:                                               ; preds = %81
  %87 = load ptr, ptr %0, align 8, !tbaa !9
  %88 = getelementptr inbounds i8, ptr %87, i64 32
  %89 = load ptr, ptr %88, align 8, !tbaa !22
  call void @ec2m_mul(ptr noundef %89, ptr noundef nonnull %56, ptr noundef nonnull %65, ptr noundef nonnull %56) #3
  br label %90

90:                                               ; preds = %86, %81
  %91 = load ptr, ptr %0, align 8, !tbaa !9
  %92 = getelementptr inbounds i8, ptr %91, i64 40
  %93 = load i8, ptr %92, align 8, !tbaa !32, !range !33, !noundef !34
  %94 = trunc nuw i8 %93 to i1
  br i1 %94, label %95, label %124

95:                                               ; preds = %90
  %96 = load ptr, ptr %56, align 8, !tbaa !29
  %97 = call i32 @pb_to_onb(ptr noundef nonnull %91, ptr noundef %96) #3
  %.not117 = icmp eq i32 %97, 0
  br i1 %.not117, label %99, label %98

98:                                               ; preds = %95
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1191, i32 noundef %97) #3
  br label %151

99:                                               ; preds = %95
  %100 = load ptr, ptr %0, align 8, !tbaa !9
  %101 = getelementptr inbounds i8, ptr %56, i64 8
  %102 = load ptr, ptr %101, align 8, !tbaa !31
  %103 = call i32 @pb_to_onb(ptr noundef %100, ptr noundef %102) #3
  %.not118 = icmp eq i32 %103, 0
  br i1 %.not118, label %124, label %104

104:                                              ; preds = %99
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1192, i32 noundef %103) #3
  br label %151

105:                                              ; preds = %38
  %106 = getelementptr inbounds i8, ptr %44, i64 24
  %107 = load ptr, ptr %106, align 8, !tbaa !35
  %108 = load ptr, ptr %107, align 8, !tbaa !36
  %109 = load ptr, ptr %108, align 8, !tbaa !38
  %110 = call i64 @int_bit_len(ptr noundef %109) #3
  %111 = load ptr, ptr %0, align 8, !tbaa !9
  %112 = getelementptr inbounds i8, ptr %111, i64 24
  %113 = load ptr, ptr %112, align 8, !tbaa !35
  %114 = getelementptr inbounds i8, ptr %113, i64 32
  %115 = load i64, ptr %114, align 8, !tbaa !40
  %116 = call ptr @ec_point_alloc(i64 noundef %115) #3
  %117 = icmp eq ptr %116, null
  br i1 %117, label %118, label %119

118:                                              ; preds = %105
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1197, i32 noundef 2) #3
  br label %151

119:                                              ; preds = %105
  %120 = load ptr, ptr %0, align 8, !tbaa !9
  %121 = getelementptr inbounds i8, ptr %120, i64 24
  %122 = load ptr, ptr %121, align 8, !tbaa !35
  %123 = load ptr, ptr %8, align 8, !tbaa !5
  call void @ecp_mul(ptr noundef %122, ptr noundef %123, ptr noundef nonnull %28, ptr noundef nonnull %116) #3
  br label %124

124:                                              ; preds = %119, %99, %90
  %.086 = phi ptr [ %65, %99 ], [ %65, %90 ], [ null, %119 ]
  %.085 = phi ptr [ %56, %99 ], [ %56, %90 ], [ %116, %119 ]
  %.0.in.in = phi i64 [ %53, %99 ], [ %53, %90 ], [ %110, %119 ]
  %.0.in = add i64 %.0.in.in, 7
  %.0 = lshr i64 %.0.in, 3
  %125 = load ptr, ptr %.085, align 8, !tbaa !29
  %126 = call ptr @wa_to_ba(ptr noundef %125) #3
  store ptr %126, ptr %5, align 8, !tbaa !5
  %127 = icmp eq ptr %126, null
  br i1 %127, label %128, label %129

128:                                              ; preds = %124
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1203, i32 noundef 2) #3
  br label %151

129:                                              ; preds = %124
  %130 = getelementptr inbounds i8, ptr %.085, i64 8
  %131 = load ptr, ptr %130, align 8, !tbaa !31
  %132 = call ptr @wa_to_ba(ptr noundef %131) #3
  store ptr %132, ptr %6, align 8, !tbaa !5
  %133 = icmp eq ptr %132, null
  br i1 %133, label %134, label %135

134:                                              ; preds = %129
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1204, i32 noundef 2) #3
  br label %151

135:                                              ; preds = %129
  %136 = load ptr, ptr %5, align 8, !tbaa !5
  %137 = call i32 @ba_change_len(ptr noundef %136, i64 noundef %.0) #3
  %.not119 = icmp eq i32 %137, 0
  br i1 %.not119, label %139, label %138

138:                                              ; preds = %135
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1205, i32 noundef %137) #3
  br label %151

139:                                              ; preds = %135
  %140 = load ptr, ptr %6, align 8, !tbaa !5
  %141 = call i32 @ba_change_len(ptr noundef %140, i64 noundef %.0) #3
  %.not120 = icmp eq i32 %141, 0
  br i1 %.not120, label %143, label %142

142:                                              ; preds = %139
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1206, i32 noundef %141) #3
  br label %151

143:                                              ; preds = %139
  %144 = load ptr, ptr %5, align 8, !tbaa !5
  %145 = call i32 @ba_swap(ptr noundef %144) #3
  %.not121 = icmp eq i32 %145, 0
  br i1 %.not121, label %147, label %146

146:                                              ; preds = %143
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1207, i32 noundef %145) #3
  br label %151

147:                                              ; preds = %143
  %148 = load ptr, ptr %6, align 8, !tbaa !5
  %149 = call i32 @ba_swap(ptr noundef %148) #3
  %.not122 = icmp eq i32 %149, 0
  br i1 %.not122, label %151, label %150

150:                                              ; preds = %147
  call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1208, i32 noundef %149) #3
  br label %151

151:                                              ; preds = %147, %150, %146, %142, %138, %134, %128, %118, %104, %98, %80, %67, %58, %37, %30, %23, %19, %17, %15, %13, %11, %9
  %.089 = phi i32 [ %22, %23 ], [ 2, %30 ], [ 6, %37 ], [ 2, %58 ], [ 2, %67 ], [ 7, %80 ], [ %97, %98 ], [ %103, %104 ], [ 2, %128 ], [ 2, %134 ], [ %137, %138 ], [ %141, %142 ], [ %145, %146 ], [ %149, %150 ], [ 2, %118 ], [ 2, %19 ], [ 2, %17 ], [ 2, %15 ], [ 2, %13 ], [ 2, %11 ], [ 2, %9 ], [ 0, %147 ]
  %.088 = phi ptr [ null, %23 ], [ null, %30 ], [ %28, %37 ], [ %28, %58 ], [ %28, %67 ], [ %28, %80 ], [ %28, %98 ], [ %28, %104 ], [ %28, %128 ], [ %28, %134 ], [ %28, %138 ], [ %28, %142 ], [ %28, %146 ], [ %28, %150 ], [ %28, %118 ], [ null, %19 ], [ null, %17 ], [ null, %15 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ %28, %147 ]
  %.187 = phi ptr [ null, %23 ], [ null, %30 ], [ null, %37 ], [ null, %58 ], [ null, %67 ], [ %65, %80 ], [ %65, %98 ], [ %65, %104 ], [ %.086, %128 ], [ %.086, %134 ], [ %.086, %138 ], [ %.086, %142 ], [ %.086, %146 ], [ %.086, %150 ], [ null, %118 ], [ null, %19 ], [ null, %17 ], [ null, %15 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ %.086, %147 ]
  %.1 = phi ptr [ null, %23 ], [ null, %30 ], [ null, %37 ], [ null, %58 ], [ %56, %67 ], [ %56, %80 ], [ %56, %98 ], [ %56, %104 ], [ %.085, %128 ], [ %.085, %134 ], [ %.085, %138 ], [ %.085, %142 ], [ %.085, %146 ], [ %.085, %150 ], [ null, %118 ], [ null, %19 ], [ null, %17 ], [ null, %15 ], [ null, %13 ], [ null, %11 ], [ null, %9 ], [ %.085, %147 ]
  call void @wa_free_private(ptr noundef %.088) #3
  call void @wa_free(ptr noundef %.187) #3
  call void @ec_point_free(ptr noundef %.1) #3
  %152 = load ptr, ptr %8, align 8, !tbaa !5
  call void @ec_point_free(ptr noundef %152) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #3
  ret i32 %.089
}

declare ptr @ec_point_alloc(i64 noundef) local_unnamed_addr #1

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

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

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

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 = { 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, !6, i64 0}
!10 = !{!"EcCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !11, i64 32, !11, i64 33}
!11 = !{!"_Bool", !7, i64 0}
!12 = !{!13, !6, i64 0}
!13 = !{!"ByteArray_st", !6, i64 0, !14, i64 8}
!14 = !{!"long", !7, i64 0}
!15 = !{!13, !14, i64 8}
!16 = !{!17, !6, i64 16}
!17 = !{!"EcParamsCtx_st", !18, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !11, i64 40, !14, i64 48, !6, i64 56, !6, i64 64, !18, i64 72, !6, i64 80}
!18 = !{!"int", !7, i64 0}
!19 = !{!20, !14, i64 8}
!20 = !{!"WordArray_st", !6, i64 0, !14, i64 8}
!21 = !{!17, !18, i64 0}
!22 = !{!17, !6, i64 32}
!23 = !{!24, !6, i64 0}
!24 = !{!"EC2m_st", !6, i64 0, !14, i64 8, !6, i64 16, !14, i64 24}
!25 = !{!26, !6, i64 0}
!26 = !{!"Gf2mCtx_st", !6, i64 0, !6, i64 8, !14, i64 16}
!27 = !{!18, !18, i64 0}
!28 = !{!24, !14, i64 24}
!29 = !{!30, !6, i64 0}
!30 = !{!"ECPoint_st", !6, i64 0, !6, i64 8, !6, i64 16}
!31 = !{!30, !6, i64 8}
!32 = !{!17, !11, i64 40}
!33 = !{i8 0, i8 2}
!34 = !{}
!35 = !{!17, !6, i64 24}
!36 = !{!37, !6, i64 0}
!37 = !{!"EcGfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !11, i64 24, !14, i64 32}
!38 = !{!39, !6, i64 0}
!39 = !{!"GfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!40 = !{!37, !14, i64 32}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass