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

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

@.str = external hidden unnamed_addr constant [15 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 zeroext i1 @int_is_zero(ptr noundef) #1

declare i32 @int_cmp(ptr noundef, ptr 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 void @ec_point_free(ptr noundef) #1

declare ptr @wa_alloc(i64 noundef) #1

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

25:                                               ; preds = %4
  %26 = load ptr, ptr %5, align 8, !tbaa !5
  %27 = icmp ne ptr %26, null
  br i1 %27, label %30, label %28

28:                                               ; preds = %25
  store i32 2, ptr %20, align 4, !tbaa !9
  %29 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 247, i32 noundef %29, ptr noundef null)
  br label %376

30:                                               ; preds = %25
  br label %31

31:                                               ; preds = %30
  br label %32

32:                                               ; preds = %31
  br label %33

33:                                               ; preds = %32
  %34 = load ptr, ptr %6, align 8, !tbaa !5
  %35 = icmp ne ptr %34, null
  br i1 %35, label %38, label %36

36:                                               ; preds = %33
  store i32 2, ptr %20, align 4, !tbaa !9
  %37 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 248, i32 noundef %37, ptr noundef null)
  br label %376

38:                                               ; preds = %33
  br label %39

39:                                               ; preds = %38
  br label %40

40:                                               ; preds = %39
  br label %41

41:                                               ; preds = %40
  %42 = load ptr, ptr %7, align 8, !tbaa !5
  %43 = icmp ne ptr %42, null
  br i1 %43, label %46, label %44

44:                                               ; preds = %41
  store i32 2, ptr %20, align 4, !tbaa !9
  %45 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 249, i32 noundef %45, ptr noundef null)
  br label %376

46:                                               ; preds = %41
  br label %47

47:                                               ; preds = %46
  br label %48

48:                                               ; preds = %47
  br label %49

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

52:                                               ; preds = %49
  store i32 2, ptr %20, align 4, !tbaa !9
  %53 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 250, i32 noundef %53, ptr noundef null)
  br label %376

54:                                               ; preds = %49
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55
  %57 = load ptr, ptr %5, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.EcCtx_st, ptr %57, i32 0, i32 5
  %59 = load i8, ptr %58, align 1, !tbaa !11, !range !14, !noundef !15
  %60 = trunc i8 %59 to i1
  %61 = zext i1 %60 to i32
  %62 = icmp eq i32 %61, 0
  br i1 %62, label %63, label %68

63:                                               ; preds = %56
  br label %64

64:                                               ; preds = %63
  store i32 14, ptr %20, align 4, !tbaa !9
  %65 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 253, i32 noundef %65, ptr noundef null)
  br label %376

66:                                               ; No predecessors!
  br label %67

67:                                               ; preds = %66
  br label %68

68:                                               ; preds = %67, %56
  %69 = load ptr, ptr %5, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.EcCtx_st, ptr %69, i32 0, i32 0
  %71 = load ptr, ptr %70, align 8, !tbaa !16
  %72 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %71, i32 0, i32 2
  %73 = load ptr, ptr %72, align 8, !tbaa !17
  store ptr %73, ptr %19, align 8, !tbaa !5
  br label %74

74:                                               ; preds = %68
  %75 = load ptr, ptr %7, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.ByteArray_st, ptr %75, i32 0, i32 0
  %77 = load ptr, ptr %76, align 8, !tbaa !20
  %78 = load ptr, ptr %7, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.ByteArray_st, ptr %78, i32 0, i32 1
  %80 = load i64, ptr %79, align 8, !tbaa !22
  %81 = call ptr @wa_alloc_from_be(ptr noundef %77, i64 noundef %80)
  store ptr %81, ptr %12, align 8, !tbaa !5
  %82 = icmp eq ptr null, %81
  br i1 %82, label %83, label %85

83:                                               ; preds = %74
  store i32 2, ptr %20, align 4, !tbaa !9
  %84 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 258, i32 noundef %84)
  br label %376

85:                                               ; preds = %74
  br label %86

86:                                               ; preds = %85
  br label %87

87:                                               ; preds = %86
  br label %88

88:                                               ; preds = %87
  %89 = load ptr, ptr %8, align 8, !tbaa !5
  %90 = getelementptr inbounds %struct.ByteArray_st, ptr %89, i32 0, i32 0
  %91 = load ptr, ptr %90, align 8, !tbaa !20
  %92 = load ptr, ptr %8, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.ByteArray_st, ptr %92, i32 0, i32 1
  %94 = load i64, ptr %93, align 8, !tbaa !22
  %95 = call ptr @wa_alloc_from_be(ptr noundef %91, i64 noundef %94)
  store ptr %95, ptr %13, align 8, !tbaa !5
  %96 = icmp eq ptr null, %95
  br i1 %96, label %97, label %99

97:                                               ; preds = %88
  store i32 2, ptr %20, align 4, !tbaa !9
  %98 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 259, i32 noundef %98)
  br label %376

99:                                               ; preds = %88
  br label %100

100:                                              ; preds = %99
  br label %101

101:                                              ; preds = %100
  %102 = load ptr, ptr %12, align 8, !tbaa !5
  %103 = load ptr, ptr %19, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.WordArray_st, ptr %103, i32 0, i32 1
  %105 = load i64, ptr %104, align 8, !tbaa !23
  call void @wa_change_len(ptr noundef %102, i64 noundef %105)
  %106 = load ptr, ptr %13, align 8, !tbaa !5
  %107 = load ptr, ptr %19, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.WordArray_st, ptr %107, i32 0, i32 1
  %109 = load i64, ptr %108, align 8, !tbaa !23
  call void @wa_change_len(ptr noundef %106, i64 noundef %109)
  %110 = load ptr, ptr %12, align 8, !tbaa !5
  %111 = load ptr, ptr %5, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.EcCtx_st, ptr %111, i32 0, i32 0
  %113 = load ptr, ptr %112, align 8, !tbaa !16
  %114 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %113, i32 0, i32 2
  %115 = load ptr, ptr %114, align 8, !tbaa !17
  %116 = call i32 @int_cmp(ptr noundef %110, ptr noundef %115)
  %117 = icmp sge i32 %116, 0
  br i1 %117, label %133, label %118

118:                                              ; preds = %101
  %119 = load ptr, ptr %13, align 8, !tbaa !5
  %120 = load ptr, ptr %5, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.EcCtx_st, ptr %120, i32 0, i32 0
  %122 = load ptr, ptr %121, align 8, !tbaa !16
  %123 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %122, i32 0, i32 2
  %124 = load ptr, ptr %123, align 8, !tbaa !17
  %125 = call i32 @int_cmp(ptr noundef %119, ptr noundef %124)
  %126 = icmp sge i32 %125, 0
  br i1 %126, label %133, label %127

127:                                              ; preds = %118
  %128 = load ptr, ptr %12, align 8, !tbaa !5
  %129 = call zeroext i1 @int_is_zero(ptr noundef %128)
  br i1 %129, label %133, label %130

130:                                              ; preds = %127
  %131 = load ptr, ptr %13, align 8, !tbaa !5
  %132 = call zeroext i1 @int_is_zero(ptr noundef %131)
  br i1 %132, label %133, label %138

133:                                              ; preds = %130, %127, %118, %101
  br label %134

134:                                              ; preds = %133
  store i32 3, ptr %20, align 4, !tbaa !9
  %135 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 267, i32 noundef %135, ptr noundef null)
  br label %376

136:                                              ; No predecessors!
  br label %137

137:                                              ; preds = %136
  br label %138

138:                                              ; preds = %137, %130
  %139 = load ptr, ptr %19, align 8, !tbaa !5
  %140 = call i64 @int_bit_len(ptr noundef %139)
  store i64 %140, ptr %21, align 8, !tbaa !25
  %141 = load i64, ptr %21, align 8, !tbaa !25
  %142 = add i64 %141, 7
  %143 = udiv i64 %142, 8
  store i64 %143, ptr %22, align 8, !tbaa !25
  %144 = load ptr, ptr %6, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.ByteArray_st, ptr %144, i32 0, i32 1
  %146 = load i64, ptr %145, align 8, !tbaa !22
  store i64 %146, ptr %23, align 8, !tbaa !25
  %147 = load i64, ptr %23, align 8, !tbaa !25
  %148 = load i64, ptr %22, align 8, !tbaa !25
  %149 = icmp ugt i64 %147, %148
  br i1 %149, label %150, label %152

150:                                              ; preds = %138
  %151 = load i64, ptr %22, align 8, !tbaa !25
  store i64 %151, ptr %23, align 8, !tbaa !25
  br label %152

152:                                              ; preds = %150, %138
  br label %153

153:                                              ; preds = %152
  %154 = load ptr, ptr %6, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.ByteArray_st, ptr %154, i32 0, i32 0
  %156 = load ptr, ptr %155, align 8, !tbaa !20
  %157 = load i64, ptr %23, align 8, !tbaa !25
  %158 = call ptr @wa_alloc_from_be(ptr noundef %156, i64 noundef %157)
  store ptr %158, ptr %9, align 8, !tbaa !5
  %159 = icmp eq ptr null, %158
  br i1 %159, label %160, label %162

160:                                              ; preds = %153
  store i32 2, ptr %20, align 4, !tbaa !9
  %161 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 277, i32 noundef %161)
  br label %376

162:                                              ; preds = %153
  br label %163

163:                                              ; preds = %162
  br label %164

164:                                              ; preds = %163
  %165 = load ptr, ptr %9, align 8, !tbaa !5
  %166 = load ptr, ptr %19, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.WordArray_st, ptr %166, i32 0, i32 1
  %168 = load i64, ptr %167, align 8, !tbaa !23
  call void @wa_change_len(ptr noundef %165, i64 noundef %168)
  %169 = load i64, ptr %23, align 8, !tbaa !25
  %170 = mul i64 %169, 8
  %171 = load i64, ptr %21, align 8, !tbaa !25
  %172 = icmp ugt i64 %170, %171
  br i1 %172, label %173, label %181

173:                                              ; preds = %164
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #3
  %174 = load i64, ptr %23, align 8, !tbaa !25
  %175 = mul i64 %174, 8
  %176 = load i64, ptr %21, align 8, !tbaa !25
  %177 = sub i64 %175, %176
  store i64 %177, ptr %24, align 8, !tbaa !25
  %178 = load ptr, ptr %9, align 8, !tbaa !5
  %179 = load i64, ptr %24, align 8, !tbaa !25
  %180 = load ptr, ptr %9, align 8, !tbaa !5
  call void @int_rshift(i64 noundef 0, ptr noundef %178, i64 noundef %179, ptr noundef %180)
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #3
  br label %181

181:                                              ; preds = %173, %164
  %182 = load ptr, ptr %19, align 8, !tbaa !5
  %183 = load ptr, ptr %9, align 8, !tbaa !5
  %184 = call i32 @int_cmp(ptr noundef %182, ptr noundef %183)
  %185 = icmp ne i32 %184, 1
  br i1 %185, label %186, label %191

186:                                              ; preds = %181
  %187 = load ptr, ptr %9, align 8, !tbaa !5
  %188 = load ptr, ptr %19, align 8, !tbaa !5
  %189 = load ptr, ptr %9, align 8, !tbaa !5
  %190 = call i32 @int_sub(ptr noundef %187, ptr noundef %188, ptr noundef %189)
  br label %191

191:                                              ; preds = %186, %181
  br label %192

192:                                              ; preds = %191
  %193 = load ptr, ptr %13, align 8, !tbaa !5
  %194 = load ptr, ptr %19, align 8, !tbaa !5
  %195 = call ptr @gfp_mod_inv_core(ptr noundef %193, ptr noundef %194)
  store ptr %195, ptr %14, align 8, !tbaa !5
  %196 = icmp eq ptr null, %195
  br i1 %196, label %197, label %199

197:                                              ; preds = %192
  store i32 2, ptr %20, align 4, !tbaa !9
  %198 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 290, i32 noundef %198)
  br label %376

199:                                              ; preds = %192
  br label %200

200:                                              ; preds = %199
  br label %201

201:                                              ; preds = %200
  br label %202

202:                                              ; preds = %201
  %203 = load ptr, ptr %19, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.WordArray_st, ptr %203, i32 0, i32 1
  %205 = load i64, ptr %204, align 8, !tbaa !23
  %206 = call ptr @wa_alloc(i64 noundef %205)
  store ptr %206, ptr %10, align 8, !tbaa !5
  %207 = icmp eq ptr null, %206
  br i1 %207, label %208, label %210

208:                                              ; preds = %202
  store i32 2, ptr %20, align 4, !tbaa !9
  %209 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 293, i32 noundef %209)
  br label %376

210:                                              ; preds = %202
  br label %211

211:                                              ; preds = %210
  br label %212

212:                                              ; preds = %211
  br label %213

213:                                              ; preds = %212
  %214 = load ptr, ptr %19, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.WordArray_st, ptr %214, i32 0, i32 1
  %216 = load i64, ptr %215, align 8, !tbaa !23
  %217 = call ptr @wa_alloc(i64 noundef %216)
  store ptr %217, ptr %11, align 8, !tbaa !5
  %218 = icmp eq ptr null, %217
  br i1 %218, label %219, label %221

219:                                              ; preds = %213
  store i32 2, ptr %20, align 4, !tbaa !9
  %220 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 294, i32 noundef %220)
  br label %376

221:                                              ; preds = %213
  br label %222

222:                                              ; preds = %221
  br label %223

223:                                              ; preds = %222
  br label %224

224:                                              ; preds = %223
  %225 = load ptr, ptr %19, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.WordArray_st, ptr %225, i32 0, i32 1
  %227 = load i64, ptr %226, align 8, !tbaa !23
  %228 = mul i64 %227, 2
  %229 = call ptr @wa_alloc(i64 noundef %228)
  store ptr %229, ptr %17, align 8, !tbaa !5
  %230 = icmp eq ptr null, %229
  br i1 %230, label %231, label %233

231:                                              ; preds = %224
  store i32 2, ptr %20, align 4, !tbaa !9
  %232 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 295, i32 noundef %232)
  br label %376

233:                                              ; preds = %224
  br label %234

234:                                              ; preds = %233
  br label %235

235:                                              ; preds = %234
  %236 = load ptr, ptr %14, align 8, !tbaa !5
  %237 = load ptr, ptr %9, align 8, !tbaa !5
  %238 = load ptr, ptr %17, align 8, !tbaa !5
  call void @int_mul(ptr noundef %236, ptr noundef %237, ptr noundef %238)
  %239 = load ptr, ptr %17, align 8, !tbaa !5
  %240 = load ptr, ptr %19, align 8, !tbaa !5
  %241 = load ptr, ptr %10, align 8, !tbaa !5
  call void @int_div(ptr noundef %239, ptr noundef %240, ptr noundef null, ptr noundef %241)
  %242 = load ptr, ptr %14, align 8, !tbaa !5
  %243 = load ptr, ptr %12, align 8, !tbaa !5
  %244 = load ptr, ptr %17, align 8, !tbaa !5
  call void @int_mul(ptr noundef %242, ptr noundef %243, ptr noundef %244)
  %245 = load ptr, ptr %17, align 8, !tbaa !5
  %246 = load ptr, ptr %19, align 8, !tbaa !5
  %247 = load ptr, ptr %11, align 8, !tbaa !5
  call void @int_div(ptr noundef %245, ptr noundef %246, ptr noundef null, ptr noundef %247)
  %248 = load ptr, ptr %5, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.EcCtx_st, ptr %248, i32 0, i32 0
  %250 = load ptr, ptr %249, align 8, !tbaa !16
  %251 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %250, i32 0, i32 0
  %252 = load i32, ptr %251, align 8, !tbaa !26
  %253 = icmp eq i32 %252, 0
  br i1 %253, label %254, label %295

254:                                              ; preds = %235
  br label %255

255:                                              ; preds = %254
  %256 = load ptr, ptr %5, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.EcCtx_st, ptr %256, i32 0, i32 0
  %258 = load ptr, ptr %257, align 8, !tbaa !16
  %259 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %258, i32 0, i32 3
  %260 = load ptr, ptr %259, align 8, !tbaa !27
  %261 = getelementptr inbounds %struct.EcGfpCtx_st, ptr %260, i32 0, i32 4
  %262 = load i64, ptr %261, align 8, !tbaa !28
  %263 = call ptr @ec_point_alloc(i64 noundef %262)
  store ptr %263, ptr %18, align 8, !tbaa !5
  %264 = icmp eq ptr null, %263
  br i1 %264, label %265, label %267

265:                                              ; preds = %255
  store i32 2, ptr %20, align 4, !tbaa !9
  %266 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 304, i32 noundef %266)
  br label %376

267:                                              ; preds = %255
  br label %268

268:                                              ; preds = %267
  br label %269

269:                                              ; preds = %268
  br label %270

270:                                              ; preds = %269
  %271 = load ptr, ptr %5, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.EcCtx_st, ptr %271, i32 0, i32 0
  %273 = load ptr, ptr %272, align 8, !tbaa !16
  %274 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %273, i32 0, i32 3
  %275 = load ptr, ptr %274, align 8, !tbaa !27
  %276 = load ptr, ptr %5, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.EcCtx_st, ptr %276, i32 0, i32 0
  %278 = load ptr, ptr %277, align 8, !tbaa !16
  %279 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %278, i32 0, i32 10
  %280 = load ptr, ptr %279, align 8, !tbaa !30
  %281 = load ptr, ptr %10, align 8, !tbaa !5
  %282 = load ptr, ptr %5, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.EcCtx_st, ptr %282, i32 0, i32 3
  %284 = load ptr, ptr %283, align 8, !tbaa !31
  %285 = load ptr, ptr %11, align 8, !tbaa !5
  %286 = load ptr, ptr %18, align 8, !tbaa !5
  %287 = call i32 @ecp_dual_mul_opt(ptr noundef %275, ptr noundef %280, ptr noundef %281, ptr noundef %284, ptr noundef %285, ptr noundef %286)
  store i32 %287, ptr %20, align 4, !tbaa !9
  %288 = load i32, ptr %20, align 4, !tbaa !9
  %289 = icmp ne i32 %288, 0
  br i1 %289, label %290, label %292

290:                                              ; preds = %270
  %291 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 305, i32 noundef %291)
  br label %376

292:                                              ; preds = %270
  br label %293

293:                                              ; preds = %292
  br label %294

294:                                              ; preds = %293
  br label %336

295:                                              ; preds = %235
  br label %296

296:                                              ; preds = %295
  %297 = load ptr, ptr %5, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.EcCtx_st, ptr %297, i32 0, i32 0
  %299 = load ptr, ptr %298, align 8, !tbaa !16
  %300 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %299, i32 0, i32 4
  %301 = load ptr, ptr %300, align 8, !tbaa !32
  %302 = getelementptr inbounds %struct.EC2m_st, ptr %301, i32 0, i32 3
  %303 = load i64, ptr %302, align 8, !tbaa !33
  %304 = call ptr @ec_point_alloc(i64 noundef %303)
  store ptr %304, ptr %18, align 8, !tbaa !5
  %305 = icmp eq ptr null, %304
  br i1 %305, label %306, label %308

306:                                              ; preds = %296
  store i32 2, ptr %20, align 4, !tbaa !9
  %307 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 308, i32 noundef %307)
  br label %376

308:                                              ; preds = %296
  br label %309

309:                                              ; preds = %308
  br label %310

310:                                              ; preds = %309
  br label %311

311:                                              ; preds = %310
  %312 = load ptr, ptr %5, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.EcCtx_st, ptr %312, i32 0, i32 0
  %314 = load ptr, ptr %313, align 8, !tbaa !16
  %315 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %314, i32 0, i32 4
  %316 = load ptr, ptr %315, align 8, !tbaa !32
  %317 = load ptr, ptr %5, align 8, !tbaa !5
  %318 = getelementptr inbounds %struct.EcCtx_st, ptr %317, i32 0, i32 0
  %319 = load ptr, ptr %318, align 8, !tbaa !16
  %320 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %319, i32 0, i32 10
  %321 = load ptr, ptr %320, align 8, !tbaa !30
  %322 = load ptr, ptr %10, align 8, !tbaa !5
  %323 = load ptr, ptr %5, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.EcCtx_st, ptr %323, i32 0, i32 3
  %325 = load ptr, ptr %324, align 8, !tbaa !31
  %326 = load ptr, ptr %11, align 8, !tbaa !5
  %327 = load ptr, ptr %18, align 8, !tbaa !5
  %328 = call i32 @ec2m_dual_mul_opt(ptr noundef %316, ptr noundef %321, ptr noundef %322, ptr noundef %325, ptr noundef %326, ptr noundef %327)
  store i32 %328, ptr %20, align 4, !tbaa !9
  %329 = load i32, ptr %20, align 4, !tbaa !9
  %330 = icmp ne i32 %329, 0
  br i1 %330, label %331, label %333

331:                                              ; preds = %311
  %332 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 309, i32 noundef %332)
  br label %376

333:                                              ; preds = %311
  br label %334

334:                                              ; preds = %333
  br label %335

335:                                              ; preds = %334
  br label %336

336:                                              ; preds = %335, %294
  br label %337

337:                                              ; preds = %336
  %338 = load ptr, ptr %18, align 8, !tbaa !5
  %339 = getelementptr inbounds %struct.ECPoint_st, ptr %338, i32 0, i32 0
  %340 = load ptr, ptr %339, align 8, !tbaa !35
  %341 = call ptr @wa_copy_with_alloc(ptr noundef %340)
  store ptr %341, ptr %16, align 8, !tbaa !5
  %342 = icmp eq ptr null, %341
  br i1 %342, label %343, label %345

343:                                              ; preds = %337
  store i32 2, ptr %20, align 4, !tbaa !9
  %344 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 312, i32 noundef %344)
  br label %376

345:                                              ; preds = %337
  br label %346

346:                                              ; preds = %345
  br label %347

347:                                              ; preds = %346
  %348 = load ptr, ptr %16, align 8, !tbaa !5
  %349 = load ptr, ptr %19, align 8, !tbaa !5
  %350 = getelementptr inbounds %struct.WordArray_st, ptr %349, i32 0, i32 1
  %351 = load i64, ptr %350, align 8, !tbaa !23
  %352 = mul i64 %351, 2
  call void @wa_change_len(ptr noundef %348, i64 noundef %352)
  br label %353

353:                                              ; preds = %347
  %354 = load ptr, ptr %19, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.WordArray_st, ptr %354, i32 0, i32 1
  %356 = load i64, ptr %355, align 8, !tbaa !23
  %357 = call ptr @wa_alloc(i64 noundef %356)
  store ptr %357, ptr %15, align 8, !tbaa !5
  %358 = icmp eq ptr null, %357
  br i1 %358, label %359, label %361

359:                                              ; preds = %353
  store i32 2, ptr %20, align 4, !tbaa !9
  %360 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 315, i32 noundef %360)
  br label %376

361:                                              ; preds = %353
  br label %362

362:                                              ; preds = %361
  br label %363

363:                                              ; preds = %362
  %364 = load ptr, ptr %16, align 8, !tbaa !5
  %365 = load ptr, ptr %19, align 8, !tbaa !5
  %366 = load ptr, ptr %15, align 8, !tbaa !5
  call void @int_div(ptr noundef %364, ptr noundef %365, ptr noundef null, ptr noundef %366)
  %367 = load ptr, ptr %15, align 8, !tbaa !5
  %368 = load ptr, ptr %12, align 8, !tbaa !5
  %369 = call zeroext i1 @int_equals(ptr noundef %367, ptr noundef %368)
  br i1 %369, label %375, label %370

370:                                              ; preds = %363
  br label %371

371:                                              ; preds = %370
  store i32 3, ptr %20, align 4, !tbaa !9
  %372 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 319, i32 noundef %372, ptr noundef null)
  br label %376

373:                                              ; No predecessors!
  br label %374

374:                                              ; preds = %373
  br label %375

375:                                              ; preds = %374, %363
  br label %376

376:                                              ; preds = %375, %371, %359, %343, %331, %306, %290, %265, %231, %219, %208, %197, %160, %134, %97, %83, %64, %52, %44, %36, %28
  %377 = load ptr, ptr %17, align 8, !tbaa !5
  call void @wa_free(ptr noundef %377)
  %378 = load ptr, ptr %9, align 8, !tbaa !5
  call void @wa_free(ptr noundef %378)
  %379 = load ptr, ptr %10, align 8, !tbaa !5
  call void @wa_free(ptr noundef %379)
  %380 = load ptr, ptr %11, align 8, !tbaa !5
  call void @wa_free(ptr noundef %380)
  %381 = load ptr, ptr %12, align 8, !tbaa !5
  call void @wa_free(ptr noundef %381)
  %382 = load ptr, ptr %13, align 8, !tbaa !5
  call void @wa_free(ptr noundef %382)
  %383 = load ptr, ptr %14, align 8, !tbaa !5
  call void @wa_free(ptr noundef %383)
  %384 = load ptr, ptr %15, align 8, !tbaa !5
  call void @wa_free(ptr noundef %384)
  %385 = load ptr, ptr %16, align 8, !tbaa !5
  call void @wa_free(ptr noundef %385)
  %386 = load ptr, ptr %18, align 8, !tbaa !5
  call void @ec_point_free(ptr noundef %386)
  %387 = load i32, ptr %20, align 4, !tbaa !9
  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 8, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 4, 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
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #3
  ret i32 %387
}

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

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

declare ptr @gfp_mod_inv_core(ptr noundef, ptr noundef) #1

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

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

declare ptr @wa_copy_with_alloc(ptr noundef) #1

declare zeroext i1 @int_equals(ptr noundef, ptr noundef) #1

declare void @wa_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 33}
!12 = !{!"EcCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !13, i64 32, !13, i64 33}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{i8 0, i8 2}
!15 = !{}
!16 = !{!12, !6, i64 0}
!17 = !{!18, !6, i64 16}
!18 = !{!"EcParamsCtx_st", !10, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !13, i64 40, !19, i64 48, !6, i64 56, !6, i64 64, !10, i64 72, !6, i64 80}
!19 = !{!"long", !7, i64 0}
!20 = !{!21, !6, i64 0}
!21 = !{!"ByteArray_st", !6, i64 0, !19, i64 8}
!22 = !{!21, !19, i64 8}
!23 = !{!24, !19, i64 8}
!24 = !{!"WordArray_st", !6, i64 0, !19, i64 8}
!25 = !{!19, !19, i64 0}
!26 = !{!18, !10, i64 0}
!27 = !{!18, !6, i64 24}
!28 = !{!29, !19, i64 32}
!29 = !{!"EcGfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !13, i64 24, !19, i64 32}
!30 = !{!18, !6, i64 80}
!31 = !{!12, !6, i64 24}
!32 = !{!18, !6, i64 32}
!33 = !{!34, !19, i64 24}
!34 = !{!"EC2m_st", !6, i64 0, !19, i64 8, !6, i64 16, !19, i64 24}
!35 = !{!36, !6, i64 0}
!36 = !{!"ECPoint_st", !6, i64 0, !6, i64 8, !6, 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 [15 x i8], align 1

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

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

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

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

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

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

declare ptr @ec_point_alloc(i64 noundef) local_unnamed_addr #0

declare i64 @int_bit_len(ptr noundef) local_unnamed_addr #0

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

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

declare void @ec_point_free(ptr noundef) local_unnamed_addr #0

declare ptr @wa_alloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local i32 @ecdsa_verify(ptr noundef readonly %0, ptr noundef readonly %1, ptr noundef readonly %2, ptr noundef readonly %3) local_unnamed_addr #1 {
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %5, label %6

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

6:                                                ; preds = %4
  %.not161 = icmp eq ptr %1, null
  br i1 %.not161, label %7, label %8

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

8:                                                ; preds = %6
  %.not162 = icmp eq ptr %2, null
  br i1 %.not162, label %9, label %10

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

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

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

12:                                               ; preds = %10
  %13 = getelementptr inbounds i8, ptr %0, i64 33
  %14 = load i8, ptr %13, align 1, !tbaa !5, !range !11, !noundef !12
  %15 = icmp eq i8 %14, 0
  br i1 %15, label %16, label %17

16:                                               ; preds = %12
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 253, i32 noundef 14, ptr noundef null) #3
  br label %149

17:                                               ; preds = %12
  %18 = load ptr, ptr %0, align 8, !tbaa !13
  %19 = getelementptr inbounds i8, ptr %18, i64 16
  %20 = load ptr, ptr %19, align 8, !tbaa !14
  %21 = load ptr, ptr %2, align 8, !tbaa !18
  %22 = getelementptr inbounds i8, ptr %2, i64 8
  %23 = load i64, ptr %22, align 8, !tbaa !20
  %24 = tail call ptr @wa_alloc_from_be(ptr noundef %21, i64 noundef %23) #3
  %25 = icmp eq ptr %24, null
  br i1 %25, label %26, label %27

26:                                               ; preds = %17
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 258, i32 noundef 2) #3
  br label %149

27:                                               ; preds = %17
  %28 = load ptr, ptr %3, align 8, !tbaa !18
  %29 = getelementptr inbounds i8, ptr %3, i64 8
  %30 = load i64, ptr %29, align 8, !tbaa !20
  %31 = tail call ptr @wa_alloc_from_be(ptr noundef %28, i64 noundef %30) #3
  %32 = icmp eq ptr %31, null
  br i1 %32, label %33, label %34

33:                                               ; preds = %27
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 259, i32 noundef 2) #3
  br label %149

34:                                               ; preds = %27
  %35 = getelementptr inbounds i8, ptr %20, i64 8
  %36 = load i64, ptr %35, align 8, !tbaa !21
  tail call void @wa_change_len(ptr noundef nonnull %24, i64 noundef %36) #3
  %37 = load i64, ptr %35, align 8, !tbaa !21
  tail call void @wa_change_len(ptr noundef nonnull %31, i64 noundef %37) #3
  %38 = load ptr, ptr %0, align 8, !tbaa !13
  %39 = getelementptr inbounds i8, ptr %38, i64 16
  %40 = load ptr, ptr %39, align 8, !tbaa !14
  %41 = tail call i32 @int_cmp(ptr noundef nonnull %24, ptr noundef %40) #3
  %42 = icmp sgt i32 %41, -1
  br i1 %42, label %53, label %43

43:                                               ; preds = %34
  %44 = load ptr, ptr %0, align 8, !tbaa !13
  %45 = getelementptr inbounds i8, ptr %44, i64 16
  %46 = load ptr, ptr %45, align 8, !tbaa !14
  %47 = tail call i32 @int_cmp(ptr noundef nonnull %31, ptr noundef %46) #3
  %48 = icmp sgt i32 %47, -1
  br i1 %48, label %53, label %49

49:                                               ; preds = %43
  %50 = tail call zeroext i1 @int_is_zero(ptr noundef nonnull %24) #3
  br i1 %50, label %53, label %51

51:                                               ; preds = %49
  %52 = tail call zeroext i1 @int_is_zero(ptr noundef nonnull %31) #3
  br i1 %52, label %53, label %54

53:                                               ; preds = %34, %43, %49, %51
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 267, i32 noundef 3, ptr noundef null) #3
  br label %149

54:                                               ; preds = %51
  %55 = tail call i64 @int_bit_len(ptr noundef nonnull %20) #3
  %56 = add i64 %55, 7
  %57 = lshr i64 %56, 3
  %58 = getelementptr inbounds i8, ptr %1, i64 8
  %59 = load i64, ptr %58, align 8, !tbaa !20
  %spec.select = tail call i64 @llvm.umin.i64(i64 %59, i64 %57)
  %60 = load ptr, ptr %1, align 8, !tbaa !18
  %61 = tail call ptr @wa_alloc_from_be(ptr noundef %60, i64 noundef %spec.select) #3
  %62 = icmp eq ptr %61, null
  br i1 %62, label %63, label %64

63:                                               ; preds = %54
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 277, i32 noundef 2) #3
  br label %149

64:                                               ; preds = %54
  %65 = load i64, ptr %35, align 8, !tbaa !21
  tail call void @wa_change_len(ptr noundef nonnull %61, i64 noundef %65) #3
  %66 = shl nuw i64 %spec.select, 3
  %67 = icmp ugt i64 %66, %55
  br i1 %67, label %68, label %70

68:                                               ; preds = %64
  %69 = sub i64 %66, %55
  tail call void @int_rshift(i64 noundef 0, ptr noundef nonnull %61, i64 noundef %69, ptr noundef nonnull %61) #3
  br label %70

70:                                               ; preds = %68, %64
  %71 = tail call i32 @int_cmp(ptr noundef nonnull %20, ptr noundef nonnull %61) #3
  %.not164 = icmp eq i32 %71, 1
  br i1 %.not164, label %74, label %72

72:                                               ; preds = %70
  %73 = tail call i32 @int_sub(ptr noundef nonnull %61, ptr noundef nonnull %20, ptr noundef nonnull %61) #3
  br label %74

74:                                               ; preds = %70, %72
  %75 = tail call ptr @gfp_mod_inv_core(ptr noundef nonnull %31, ptr noundef nonnull %20) #3
  %76 = icmp eq ptr %75, null
  br i1 %76, label %77, label %78

77:                                               ; preds = %74
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 290, i32 noundef 2) #3
  br label %149

78:                                               ; preds = %74
  %79 = load i64, ptr %35, align 8, !tbaa !21
  %80 = tail call ptr @wa_alloc(i64 noundef %79) #3
  %81 = icmp eq ptr %80, null
  br i1 %81, label %82, label %83

82:                                               ; preds = %78
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 293, i32 noundef 2) #3
  br label %149

83:                                               ; preds = %78
  %84 = load i64, ptr %35, align 8, !tbaa !21
  %85 = tail call ptr @wa_alloc(i64 noundef %84) #3
  %86 = icmp eq ptr %85, null
  br i1 %86, label %87, label %88

87:                                               ; preds = %83
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 294, i32 noundef 2) #3
  br label %149

88:                                               ; preds = %83
  %89 = load i64, ptr %35, align 8, !tbaa !21
  %90 = shl i64 %89, 1
  %91 = tail call ptr @wa_alloc(i64 noundef %90) #3
  %92 = icmp eq ptr %91, null
  br i1 %92, label %93, label %94

93:                                               ; preds = %88
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 295, i32 noundef 2) #3
  br label %149

94:                                               ; preds = %88
  tail call void @int_mul(ptr noundef nonnull %75, ptr noundef nonnull %61, ptr noundef nonnull %91) #3
  tail call void @int_div(ptr noundef nonnull %91, ptr noundef nonnull %20, ptr noundef null, ptr noundef nonnull %80) #3
  tail call void @int_mul(ptr noundef nonnull %75, ptr noundef nonnull %24, ptr noundef nonnull %91) #3
  tail call void @int_div(ptr noundef nonnull %91, ptr noundef nonnull %20, ptr noundef null, ptr noundef nonnull %85) #3
  %95 = load ptr, ptr %0, align 8, !tbaa !13
  %96 = load i32, ptr %95, align 8, !tbaa !23
  %97 = icmp eq i32 %96, 0
  br i1 %97, label %98, label %116

98:                                               ; preds = %94
  %99 = getelementptr inbounds i8, ptr %95, i64 24
  %100 = load ptr, ptr %99, align 8, !tbaa !24
  %101 = getelementptr inbounds i8, ptr %100, i64 32
  %102 = load i64, ptr %101, align 8, !tbaa !25
  %103 = tail call ptr @ec_point_alloc(i64 noundef %102) #3
  %104 = icmp eq ptr %103, null
  br i1 %104, label %105, label %106

105:                                              ; preds = %98
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 304, i32 noundef 2) #3
  br label %149

106:                                              ; preds = %98
  %107 = load ptr, ptr %0, align 8, !tbaa !13
  %108 = getelementptr inbounds i8, ptr %107, i64 24
  %109 = load ptr, ptr %108, align 8, !tbaa !24
  %110 = getelementptr inbounds i8, ptr %107, i64 80
  %111 = load ptr, ptr %110, align 8, !tbaa !27
  %112 = getelementptr inbounds i8, ptr %0, i64 24
  %113 = load ptr, ptr %112, align 8, !tbaa !28
  %114 = tail call i32 @ecp_dual_mul_opt(ptr noundef %109, ptr noundef %111, ptr noundef nonnull %80, ptr noundef %113, ptr noundef nonnull %85, ptr noundef nonnull %103) #3
  %.not166 = icmp eq i32 %114, 0
  br i1 %.not166, label %134, label %115

115:                                              ; preds = %106
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 305, i32 noundef %114) #3
  br label %149

116:                                              ; preds = %94
  %117 = getelementptr inbounds i8, ptr %95, i64 32
  %118 = load ptr, ptr %117, align 8, !tbaa !29
  %119 = getelementptr inbounds i8, ptr %118, i64 24
  %120 = load i64, ptr %119, align 8, !tbaa !30
  %121 = tail call ptr @ec_point_alloc(i64 noundef %120) #3
  %122 = icmp eq ptr %121, null
  br i1 %122, label %123, label %124

123:                                              ; preds = %116
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 308, i32 noundef 2) #3
  br label %149

124:                                              ; preds = %116
  %125 = load ptr, ptr %0, align 8, !tbaa !13
  %126 = getelementptr inbounds i8, ptr %125, i64 32
  %127 = load ptr, ptr %126, align 8, !tbaa !29
  %128 = getelementptr inbounds i8, ptr %125, i64 80
  %129 = load ptr, ptr %128, align 8, !tbaa !27
  %130 = getelementptr inbounds i8, ptr %0, i64 24
  %131 = load ptr, ptr %130, align 8, !tbaa !28
  %132 = tail call i32 @ec2m_dual_mul_opt(ptr noundef %127, ptr noundef %129, ptr noundef nonnull %80, ptr noundef %131, ptr noundef nonnull %85, ptr noundef nonnull %121) #3
  %.not165 = icmp eq i32 %132, 0
  br i1 %.not165, label %134, label %133

133:                                              ; preds = %124
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 309, i32 noundef %132) #3
  br label %149

134:                                              ; preds = %106, %124
  %.0120 = phi ptr [ %103, %106 ], [ %121, %124 ]
  %135 = load ptr, ptr %.0120, align 8, !tbaa !32
  %136 = tail call ptr @wa_copy_with_alloc(ptr noundef %135) #3
  %137 = icmp eq ptr %136, null
  br i1 %137, label %138, label %139

138:                                              ; preds = %134
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 312, i32 noundef 2) #3
  br label %149

139:                                              ; preds = %134
  %140 = load i64, ptr %35, align 8, !tbaa !21
  %141 = shl i64 %140, 1
  tail call void @wa_change_len(ptr noundef nonnull %136, i64 noundef %141) #3
  %142 = load i64, ptr %35, align 8, !tbaa !21
  %143 = tail call ptr @wa_alloc(i64 noundef %142) #3
  %144 = icmp eq ptr %143, null
  br i1 %144, label %145, label %146

145:                                              ; preds = %139
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 315, i32 noundef 2) #3
  br label %149

146:                                              ; preds = %139
  tail call void @int_div(ptr noundef nonnull %136, ptr noundef nonnull %20, ptr noundef null, ptr noundef nonnull %143) #3
  %147 = tail call zeroext i1 @int_equals(ptr noundef nonnull %143, ptr noundef nonnull %24) #3
  br i1 %147, label %149, label %148

148:                                              ; preds = %146
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 319, i32 noundef 3, ptr noundef null) #3
  br label %149

149:                                              ; preds = %146, %148, %145, %138, %133, %123, %115, %105, %93, %87, %82, %77, %63, %53, %33, %26, %16, %11, %9, %7, %5
  %.0126 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ %31, %53 ], [ %31, %63 ], [ %31, %77 ], [ %31, %82 ], [ %31, %87 ], [ %31, %93 ], [ %31, %105 ], [ %31, %115 ], [ %31, %138 ], [ %31, %145 ], [ %31, %146 ], [ %31, %148 ], [ %31, %123 ], [ %31, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0125 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ null, %77 ], [ %75, %82 ], [ %75, %87 ], [ %75, %93 ], [ %75, %105 ], [ %75, %115 ], [ %75, %138 ], [ %75, %145 ], [ %75, %146 ], [ %75, %148 ], [ %75, %123 ], [ %75, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0124 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ null, %77 ], [ null, %82 ], [ null, %87 ], [ null, %93 ], [ null, %105 ], [ null, %115 ], [ null, %138 ], [ null, %145 ], [ %143, %146 ], [ %143, %148 ], [ null, %123 ], [ null, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0123 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ null, %77 ], [ null, %82 ], [ null, %87 ], [ null, %93 ], [ null, %105 ], [ null, %115 ], [ null, %138 ], [ %136, %145 ], [ %136, %146 ], [ %136, %148 ], [ null, %123 ], [ null, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0122 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ null, %77 ], [ null, %82 ], [ null, %87 ], [ null, %93 ], [ %91, %105 ], [ %91, %115 ], [ %91, %138 ], [ %91, %145 ], [ %91, %146 ], [ %91, %148 ], [ %91, %123 ], [ %91, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.1121 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ null, %77 ], [ null, %82 ], [ null, %87 ], [ null, %93 ], [ null, %105 ], [ %103, %115 ], [ %.0120, %138 ], [ %.0120, %145 ], [ %.0120, %146 ], [ %.0120, %148 ], [ null, %123 ], [ %121, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0119 = phi ptr [ null, %16 ], [ null, %26 ], [ %24, %33 ], [ %24, %53 ], [ %24, %63 ], [ %24, %77 ], [ %24, %82 ], [ %24, %87 ], [ %24, %93 ], [ %24, %105 ], [ %24, %115 ], [ %24, %138 ], [ %24, %145 ], [ %24, %146 ], [ %24, %148 ], [ %24, %123 ], [ %24, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.1 = phi i32 [ 14, %16 ], [ 2, %26 ], [ 2, %33 ], [ 3, %53 ], [ 2, %63 ], [ 2, %77 ], [ 2, %82 ], [ 2, %87 ], [ 2, %93 ], [ 2, %105 ], [ %114, %115 ], [ 2, %138 ], [ 2, %145 ], [ 0, %146 ], [ 3, %148 ], [ 2, %123 ], [ %132, %133 ], [ 2, %11 ], [ 2, %9 ], [ 2, %7 ], [ 2, %5 ]
  %.0117 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ null, %77 ], [ null, %82 ], [ null, %87 ], [ %85, %93 ], [ %85, %105 ], [ %85, %115 ], [ %85, %138 ], [ %85, %145 ], [ %85, %146 ], [ %85, %148 ], [ %85, %123 ], [ %85, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0116 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ null, %77 ], [ null, %82 ], [ %80, %87 ], [ %80, %93 ], [ %80, %105 ], [ %80, %115 ], [ %80, %138 ], [ %80, %145 ], [ %80, %146 ], [ %80, %148 ], [ %80, %123 ], [ %80, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %63 ], [ %61, %77 ], [ %61, %82 ], [ %61, %87 ], [ %61, %93 ], [ %61, %105 ], [ %61, %115 ], [ %61, %138 ], [ %61, %145 ], [ %61, %146 ], [ %61, %148 ], [ %61, %123 ], [ %61, %133 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  tail call void @wa_free(ptr noundef %.0122) #3
  tail call void @wa_free(ptr noundef %.0) #3
  tail call void @wa_free(ptr noundef %.0116) #3
  tail call void @wa_free(ptr noundef %.0117) #3
  tail call void @wa_free(ptr noundef %.0119) #3
  tail call void @wa_free(ptr noundef %.0126) #3
  tail call void @wa_free(ptr noundef %.0125) #3
  tail call void @wa_free(ptr noundef %.0124) #3
  tail call void @wa_free(ptr noundef %.0123) #3
  tail call void @ec_point_free(ptr noundef %.1121) #3
  ret i32 %.1
}

declare void @int_rshift(i64 noundef, ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #0

declare i32 @int_sub(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

declare ptr @gfp_mod_inv_core(ptr noundef, ptr noundef) local_unnamed_addr #0

declare void @int_mul(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

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

declare ptr @wa_copy_with_alloc(ptr noundef) local_unnamed_addr #0

declare zeroext i1 @int_equals(ptr noundef, ptr noundef) local_unnamed_addr #0

declare void @wa_free(ptr noundef) local_unnamed_addr #0

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

attributes #0 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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, !10, i64 33}
!6 = !{!"EcCtx_st", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !10, i64 32, !10, i64 33}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"_Bool", !8, i64 0}
!11 = !{i8 0, i8 2}
!12 = !{}
!13 = !{!6, !7, i64 0}
!14 = !{!15, !7, i64 16}
!15 = !{!"EcParamsCtx_st", !16, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !10, i64 40, !17, i64 48, !7, i64 56, !7, i64 64, !16, i64 72, !7, i64 80}
!16 = !{!"int", !8, i64 0}
!17 = !{!"long", !8, i64 0}
!18 = !{!19, !7, i64 0}
!19 = !{!"ByteArray_st", !7, i64 0, !17, i64 8}
!20 = !{!19, !17, i64 8}
!21 = !{!22, !17, i64 8}
!22 = !{!"WordArray_st", !7, i64 0, !17, i64 8}
!23 = !{!15, !16, i64 0}
!24 = !{!15, !7, i64 24}
!25 = !{!26, !17, i64 32}
!26 = !{!"EcGfpCtx_st", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !17, i64 32}
!27 = !{!15, !7, i64 80}
!28 = !{!6, !7, i64 24}
!29 = !{!15, !7, i64 32}
!30 = !{!31, !17, i64 24}
!31 = !{!"EC2m_st", !7, i64 0, !17, i64 8, !7, i64 16, !17, i64 24}
!32 = !{!33, !7, i64 0}
!33 = !{!"ECPoint_st", !7, i64 0, !7, i64 8, !7, i64 16}


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