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

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

@.str = external hidden unnamed_addr constant [16 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 i32 @ecp_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 @ecrdsa_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
  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
  br label %21

21:                                               ; preds = %4
  %22 = load ptr, ptr %5, align 8, !tbaa !5
  %23 = icmp ne ptr %22, null
  br i1 %23, label %26, label %24

24:                                               ; preds = %21
  store i32 2, ptr %20, align 4, !tbaa !9
  %25 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 230, i32 noundef %25, ptr noundef null)
  br label %336

26:                                               ; preds = %21
  br label %27

27:                                               ; preds = %26
  br label %28

28:                                               ; preds = %27
  br label %29

29:                                               ; preds = %28
  %30 = load ptr, ptr %5, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.EcCtx_st, ptr %30, i32 0, i32 0
  %32 = load ptr, ptr %31, align 8, !tbaa !11
  %33 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %32, i32 0, i32 0
  %34 = load i32, ptr %33, align 8, !tbaa !14
  %35 = icmp eq i32 %34, 0
  br i1 %35, label %38, label %36

36:                                               ; preds = %29
  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 231, i32 noundef %37, ptr noundef null)
  br label %336

38:                                               ; preds = %29
  br label %39

39:                                               ; preds = %38
  br label %40

40:                                               ; preds = %39
  br label %41

41:                                               ; preds = %40
  %42 = load ptr, ptr %6, 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 232, i32 noundef %45, ptr noundef null)
  br label %336

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 %7, 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 233, i32 noundef %53, ptr noundef null)
  br label %336

54:                                               ; preds = %49
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55
  br label %57

57:                                               ; preds = %56
  %58 = load ptr, ptr %8, align 8, !tbaa !5
  %59 = icmp ne ptr %58, null
  br i1 %59, label %62, label %60

60:                                               ; preds = %57
  store i32 2, ptr %20, align 4, !tbaa !9
  %61 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 234, i32 noundef %61, ptr noundef null)
  br label %336

62:                                               ; preds = %57
  br label %63

63:                                               ; preds = %62
  br label %64

64:                                               ; preds = %63
  %65 = load ptr, ptr %5, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.EcCtx_st, ptr %65, i32 0, i32 5
  %67 = load i8, ptr %66, align 1, !tbaa !17, !range !18, !noundef !19
  %68 = trunc i8 %67 to i1
  %69 = zext i1 %68 to i32
  %70 = icmp eq i32 %69, 0
  br i1 %70, label %71, label %76

71:                                               ; preds = %64
  br label %72

72:                                               ; preds = %71
  store i32 14, ptr %20, align 4, !tbaa !9
  %73 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 237, i32 noundef %73, ptr noundef null)
  br label %336

74:                                               ; No predecessors!
  br label %75

75:                                               ; preds = %74
  br label %76

76:                                               ; preds = %75, %64
  %77 = load ptr, ptr %5, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.EcCtx_st, ptr %77, i32 0, i32 0
  %79 = load ptr, ptr %78, align 8, !tbaa !11
  %80 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %79, i32 0, i32 2
  %81 = load ptr, ptr %80, align 8, !tbaa !20
  store ptr %81, ptr %19, align 8, !tbaa !5
  br label %82

82:                                               ; preds = %76
  %83 = load ptr, ptr %7, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.ByteArray_st, ptr %83, i32 0, i32 0
  %85 = load ptr, ptr %84, align 8, !tbaa !21
  %86 = load ptr, ptr %7, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.ByteArray_st, ptr %86, i32 0, i32 1
  %88 = load i64, ptr %87, align 8, !tbaa !23
  %89 = call ptr @wa_alloc_from_be(ptr noundef %85, i64 noundef %88)
  store ptr %89, ptr %12, align 8, !tbaa !5
  %90 = icmp eq ptr null, %89
  br i1 %90, label %91, label %93

91:                                               ; preds = %82
  store i32 2, ptr %20, align 4, !tbaa !9
  %92 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 242, i32 noundef %92)
  br label %336

93:                                               ; preds = %82
  br label %94

94:                                               ; preds = %93
  br label %95

95:                                               ; preds = %94
  br label %96

96:                                               ; preds = %95
  %97 = load ptr, ptr %8, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.ByteArray_st, ptr %97, i32 0, i32 0
  %99 = load ptr, ptr %98, align 8, !tbaa !21
  %100 = load ptr, ptr %8, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.ByteArray_st, ptr %100, i32 0, i32 1
  %102 = load i64, ptr %101, align 8, !tbaa !23
  %103 = call ptr @wa_alloc_from_be(ptr noundef %99, i64 noundef %102)
  store ptr %103, ptr %13, align 8, !tbaa !5
  %104 = icmp eq ptr null, %103
  br i1 %104, label %105, label %107

105:                                              ; preds = %96
  store i32 2, ptr %20, align 4, !tbaa !9
  %106 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 243, i32 noundef %106)
  br label %336

107:                                              ; preds = %96
  br label %108

108:                                              ; preds = %107
  br label %109

109:                                              ; preds = %108
  %110 = load ptr, ptr %12, align 8, !tbaa !5
  %111 = load ptr, ptr %19, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.WordArray_st, ptr %111, i32 0, i32 1
  %113 = load i64, ptr %112, align 8, !tbaa !24
  call void @wa_change_len(ptr noundef %110, i64 noundef %113)
  %114 = load ptr, ptr %13, align 8, !tbaa !5
  %115 = load ptr, ptr %19, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.WordArray_st, ptr %115, i32 0, i32 1
  %117 = load i64, ptr %116, align 8, !tbaa !24
  call void @wa_change_len(ptr noundef %114, i64 noundef %117)
  %118 = load ptr, ptr %12, align 8, !tbaa !5
  %119 = load ptr, ptr %5, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.EcCtx_st, ptr %119, i32 0, i32 0
  %121 = load ptr, ptr %120, align 8, !tbaa !11
  %122 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %121, i32 0, i32 2
  %123 = load ptr, ptr %122, align 8, !tbaa !20
  %124 = call i32 @int_cmp(ptr noundef %118, ptr noundef %123)
  %125 = icmp sge i32 %124, 0
  br i1 %125, label %141, label %126

126:                                              ; preds = %109
  %127 = load ptr, ptr %13, align 8, !tbaa !5
  %128 = load ptr, ptr %5, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.EcCtx_st, ptr %128, i32 0, i32 0
  %130 = load ptr, ptr %129, align 8, !tbaa !11
  %131 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %130, i32 0, i32 2
  %132 = load ptr, ptr %131, align 8, !tbaa !20
  %133 = call i32 @int_cmp(ptr noundef %127, ptr noundef %132)
  %134 = icmp sge i32 %133, 0
  br i1 %134, label %141, label %135

135:                                              ; preds = %126
  %136 = load ptr, ptr %12, align 8, !tbaa !5
  %137 = call zeroext i1 @int_is_zero(ptr noundef %136)
  br i1 %137, label %141, label %138

138:                                              ; preds = %135
  %139 = load ptr, ptr %13, align 8, !tbaa !5
  %140 = call zeroext i1 @int_is_zero(ptr noundef %139)
  br i1 %140, label %141, label %146

141:                                              ; preds = %138, %135, %126, %109
  br label %142

142:                                              ; preds = %141
  store i32 3, ptr %20, align 4, !tbaa !9
  %143 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 251, i32 noundef %143, ptr noundef null)
  br label %336

144:                                              ; No predecessors!
  br label %145

145:                                              ; preds = %144
  br label %146

146:                                              ; preds = %145, %138
  br label %147

147:                                              ; preds = %146
  %148 = load ptr, ptr %6, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.ByteArray_st, ptr %148, i32 0, i32 0
  %150 = load ptr, ptr %149, align 8, !tbaa !21
  %151 = load ptr, ptr %6, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.ByteArray_st, ptr %151, i32 0, i32 1
  %153 = load i64, ptr %152, align 8, !tbaa !23
  %154 = call ptr @wa_alloc_from_be(ptr noundef %150, i64 noundef %153)
  store ptr %154, ptr %9, align 8, !tbaa !5
  %155 = icmp eq ptr null, %154
  br i1 %155, label %156, label %158

156:                                              ; preds = %147
  store i32 2, ptr %20, align 4, !tbaa !9
  %157 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 254, i32 noundef %157)
  br label %336

158:                                              ; preds = %147
  br label %159

159:                                              ; preds = %158
  br label %160

160:                                              ; preds = %159
  %161 = load ptr, ptr %9, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.WordArray_st, ptr %161, i32 0, i32 1
  %163 = load i64, ptr %162, align 8, !tbaa !24
  %164 = load ptr, ptr %19, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.WordArray_st, ptr %164, i32 0, i32 1
  %166 = load i64, ptr %165, align 8, !tbaa !24
  %167 = icmp uge i64 %163, %166
  br i1 %167, label %168, label %187

168:                                              ; preds = %160
  br label %169

169:                                              ; preds = %168
  %170 = load ptr, ptr %19, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.WordArray_st, ptr %170, i32 0, i32 1
  %172 = load i64, ptr %171, align 8, !tbaa !24
  %173 = call ptr @wa_alloc(i64 noundef %172)
  store ptr %173, ptr %17, align 8, !tbaa !5
  %174 = icmp eq ptr null, %173
  br i1 %174, label %175, label %177

175:                                              ; preds = %169
  store i32 2, ptr %20, align 4, !tbaa !9
  %176 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 256, i32 noundef %176)
  br label %336

177:                                              ; preds = %169
  br label %178

178:                                              ; preds = %177
  br label %179

179:                                              ; preds = %178
  %180 = load ptr, ptr %9, align 8, !tbaa !5
  %181 = load ptr, ptr %19, align 8, !tbaa !5
  %182 = load ptr, ptr %17, align 8, !tbaa !5
  call void @int_div(ptr noundef %180, ptr noundef %181, ptr noundef null, ptr noundef %182)
  %183 = load ptr, ptr %17, align 8, !tbaa !5
  %184 = load ptr, ptr %9, align 8, !tbaa !5
  %185 = call i32 @wa_copy(ptr noundef %183, ptr noundef %184)
  %186 = load ptr, ptr %17, align 8, !tbaa !5
  call void @wa_free(ptr noundef %186)
  store ptr null, ptr %17, align 8, !tbaa !5
  br label %187

187:                                              ; preds = %179, %160
  %188 = load ptr, ptr %9, align 8, !tbaa !5
  %189 = call zeroext i1 @int_is_zero(ptr noundef %188)
  br i1 %189, label %190, label %192

190:                                              ; preds = %187
  %191 = load ptr, ptr %9, align 8, !tbaa !5
  call void @wa_one(ptr noundef %191)
  br label %192

192:                                              ; preds = %190, %187
  %193 = load ptr, ptr %9, align 8, !tbaa !5
  %194 = load ptr, ptr %19, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.WordArray_st, ptr %194, i32 0, i32 1
  %196 = load i64, ptr %195, align 8, !tbaa !24
  call void @wa_change_len(ptr noundef %193, i64 noundef %196)
  br label %197

197:                                              ; preds = %192
  %198 = load ptr, ptr %9, align 8, !tbaa !5
  %199 = load ptr, ptr %19, align 8, !tbaa !5
  %200 = call ptr @gfp_mod_inv_core(ptr noundef %198, ptr noundef %199)
  store ptr %200, ptr %14, align 8, !tbaa !5
  %201 = icmp eq ptr null, %200
  br i1 %201, label %202, label %204

202:                                              ; preds = %197
  store i32 2, ptr %20, align 4, !tbaa !9
  %203 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 268, i32 noundef %203)
  br label %336

204:                                              ; preds = %197
  br label %205

205:                                              ; preds = %204
  br label %206

206:                                              ; preds = %205
  br label %207

207:                                              ; preds = %206
  %208 = load ptr, ptr %19, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.WordArray_st, ptr %208, i32 0, i32 1
  %210 = load i64, ptr %209, align 8, !tbaa !24
  %211 = call ptr @wa_alloc(i64 noundef %210)
  store ptr %211, ptr %10, align 8, !tbaa !5
  %212 = icmp eq ptr null, %211
  br i1 %212, label %213, label %215

213:                                              ; preds = %207
  store i32 2, ptr %20, align 4, !tbaa !9
  %214 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 271, i32 noundef %214)
  br label %336

215:                                              ; preds = %207
  br label %216

216:                                              ; preds = %215
  br label %217

217:                                              ; preds = %216
  br label %218

218:                                              ; preds = %217
  %219 = load ptr, ptr %19, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.WordArray_st, ptr %219, i32 0, i32 1
  %221 = load i64, ptr %220, align 8, !tbaa !24
  %222 = call ptr @wa_alloc(i64 noundef %221)
  store ptr %222, ptr %11, align 8, !tbaa !5
  %223 = icmp eq ptr null, %222
  br i1 %223, label %224, label %226

224:                                              ; preds = %218
  store i32 2, ptr %20, align 4, !tbaa !9
  %225 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 272, i32 noundef %225)
  br label %336

226:                                              ; preds = %218
  br label %227

227:                                              ; preds = %226
  br label %228

228:                                              ; preds = %227
  br label %229

229:                                              ; preds = %228
  %230 = load ptr, ptr %19, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.WordArray_st, ptr %230, i32 0, i32 1
  %232 = load i64, ptr %231, align 8, !tbaa !24
  %233 = mul i64 %232, 2
  %234 = call ptr @wa_alloc(i64 noundef %233)
  store ptr %234, ptr %17, align 8, !tbaa !5
  %235 = icmp eq ptr null, %234
  br i1 %235, label %236, label %238

236:                                              ; preds = %229
  store i32 2, ptr %20, align 4, !tbaa !9
  %237 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 273, i32 noundef %237)
  br label %336

238:                                              ; preds = %229
  br label %239

239:                                              ; preds = %238
  br label %240

240:                                              ; preds = %239
  %241 = load ptr, ptr %14, align 8, !tbaa !5
  %242 = load ptr, ptr %13, align 8, !tbaa !5
  %243 = load ptr, ptr %17, align 8, !tbaa !5
  call void @int_mul(ptr noundef %241, ptr noundef %242, ptr noundef %243)
  %244 = load ptr, ptr %17, align 8, !tbaa !5
  %245 = load ptr, ptr %19, align 8, !tbaa !5
  %246 = load ptr, ptr %10, align 8, !tbaa !5
  call void @int_div(ptr noundef %244, ptr noundef %245, ptr noundef null, ptr noundef %246)
  %247 = load ptr, ptr %14, align 8, !tbaa !5
  %248 = load ptr, ptr %12, align 8, !tbaa !5
  %249 = load ptr, ptr %17, align 8, !tbaa !5
  call void @int_mul(ptr noundef %247, ptr noundef %248, ptr noundef %249)
  %250 = load ptr, ptr %17, align 8, !tbaa !5
  %251 = load ptr, ptr %19, align 8, !tbaa !5
  %252 = load ptr, ptr %11, align 8, !tbaa !5
  call void @int_div(ptr noundef %250, ptr noundef %251, ptr noundef null, ptr noundef %252)
  %253 = load ptr, ptr %19, align 8, !tbaa !5
  %254 = load ptr, ptr %11, align 8, !tbaa !5
  %255 = load ptr, ptr %11, align 8, !tbaa !5
  %256 = call i32 @int_sub(ptr noundef %253, ptr noundef %254, ptr noundef %255)
  br label %257

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

267:                                              ; preds = %257
  store i32 2, ptr %20, align 4, !tbaa !9
  %268 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 282, i32 noundef %268)
  br label %336

269:                                              ; preds = %257
  br label %270

270:                                              ; preds = %269
  br label %271

271:                                              ; preds = %270
  br label %272

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

292:                                              ; preds = %272
  %293 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 283, i32 noundef %293)
  br label %336

294:                                              ; preds = %272
  br label %295

295:                                              ; preds = %294
  br label %296

296:                                              ; preds = %295
  br label %297

297:                                              ; preds = %296
  %298 = load ptr, ptr %18, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.ECPoint_st, ptr %298, i32 0, i32 0
  %300 = load ptr, ptr %299, align 8, !tbaa !31
  %301 = call ptr @wa_copy_with_alloc(ptr noundef %300)
  store ptr %301, ptr %16, align 8, !tbaa !5
  %302 = icmp eq ptr null, %301
  br i1 %302, label %303, label %305

303:                                              ; preds = %297
  store i32 2, ptr %20, align 4, !tbaa !9
  %304 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 285, i32 noundef %304)
  br label %336

305:                                              ; preds = %297
  br label %306

306:                                              ; preds = %305
  br label %307

307:                                              ; preds = %306
  %308 = load ptr, ptr %16, align 8, !tbaa !5
  %309 = load ptr, ptr %19, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.WordArray_st, ptr %309, i32 0, i32 1
  %311 = load i64, ptr %310, align 8, !tbaa !24
  %312 = mul i64 %311, 2
  call void @wa_change_len(ptr noundef %308, i64 noundef %312)
  br label %313

313:                                              ; preds = %307
  %314 = load ptr, ptr %19, align 8, !tbaa !5
  %315 = getelementptr inbounds %struct.WordArray_st, ptr %314, i32 0, i32 1
  %316 = load i64, ptr %315, align 8, !tbaa !24
  %317 = call ptr @wa_alloc(i64 noundef %316)
  store ptr %317, ptr %15, align 8, !tbaa !5
  %318 = icmp eq ptr null, %317
  br i1 %318, label %319, label %321

319:                                              ; preds = %313
  store i32 2, ptr %20, align 4, !tbaa !9
  %320 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 288, i32 noundef %320)
  br label %336

321:                                              ; preds = %313
  br label %322

322:                                              ; preds = %321
  br label %323

323:                                              ; preds = %322
  %324 = load ptr, ptr %16, align 8, !tbaa !5
  %325 = load ptr, ptr %19, align 8, !tbaa !5
  %326 = load ptr, ptr %15, align 8, !tbaa !5
  call void @int_div(ptr noundef %324, ptr noundef %325, ptr noundef null, ptr noundef %326)
  %327 = load ptr, ptr %15, align 8, !tbaa !5
  %328 = load ptr, ptr %12, align 8, !tbaa !5
  %329 = call zeroext i1 @int_equals(ptr noundef %327, ptr noundef %328)
  br i1 %329, label %335, label %330

330:                                              ; preds = %323
  br label %331

331:                                              ; preds = %330
  store i32 3, ptr %20, align 4, !tbaa !9
  %332 = load i32, ptr %20, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 292, i32 noundef %332, ptr noundef null)
  br label %336

333:                                              ; No predecessors!
  br label %334

334:                                              ; preds = %333
  br label %335

335:                                              ; preds = %334, %323
  br label %336

336:                                              ; preds = %335, %331, %319, %303, %292, %267, %236, %224, %213, %202, %175, %156, %142, %105, %91, %72, %60, %52, %44, %36, %24
  %337 = load ptr, ptr %9, align 8, !tbaa !5
  call void @wa_free(ptr noundef %337)
  %338 = load ptr, ptr %17, align 8, !tbaa !5
  call void @wa_free(ptr noundef %338)
  %339 = load ptr, ptr %10, align 8, !tbaa !5
  call void @wa_free(ptr noundef %339)
  %340 = load ptr, ptr %11, align 8, !tbaa !5
  call void @wa_free(ptr noundef %340)
  %341 = load ptr, ptr %12, align 8, !tbaa !5
  call void @wa_free(ptr noundef %341)
  %342 = load ptr, ptr %13, align 8, !tbaa !5
  call void @wa_free(ptr noundef %342)
  %343 = load ptr, ptr %14, align 8, !tbaa !5
  call void @wa_free(ptr noundef %343)
  %344 = load ptr, ptr %15, align 8, !tbaa !5
  call void @wa_free(ptr noundef %344)
  %345 = load ptr, ptr %16, align 8, !tbaa !5
  call void @wa_free(ptr noundef %345)
  %346 = load ptr, ptr %18, align 8, !tbaa !5
  call void @ec_point_free(ptr noundef %346)
  %347 = load i32, ptr %20, align 4, !tbaa !9
  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 %347
}

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

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

declare void @wa_free(ptr noundef) #1

declare void @wa_one(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 i32 @int_sub(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

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, !6, i64 0}
!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 = !{!15, !10, i64 0}
!15 = !{!"EcParamsCtx_st", !10, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !13, i64 40, !16, i64 48, !6, i64 56, !6, i64 64, !10, i64 72, !6, i64 80}
!16 = !{!"long", !7, i64 0}
!17 = !{!12, !13, i64 33}
!18 = !{i8 0, i8 2}
!19 = !{}
!20 = !{!15, !6, i64 16}
!21 = !{!22, !6, i64 0}
!22 = !{!"ByteArray_st", !6, i64 0, !16, i64 8}
!23 = !{!22, !16, i64 8}
!24 = !{!25, !16, i64 8}
!25 = !{!"WordArray_st", !6, i64 0, !16, i64 8}
!26 = !{!15, !6, i64 24}
!27 = !{!28, !16, i64 32}
!28 = !{!"EcGfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !13, i64 24, !16, i64 32}
!29 = !{!15, !6, i64 80}
!30 = !{!12, !6, i64 24}
!31 = !{!32, !6, i64 0}
!32 = !{!"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 [16 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 i32 @ecp_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 @ecrdsa_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 230, i32 noundef 2, ptr noundef null) #2
  br label %134

6:                                                ; preds = %4
  %7 = load ptr, ptr %0, align 8, !tbaa !5
  %8 = load i32, ptr %7, align 8, !tbaa !11
  %9 = icmp eq i32 %8, 0
  br i1 %9, label %11, label %10

10:                                               ; preds = %6
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 231, i32 noundef 2, ptr noundef null) #2
  br label %134

11:                                               ; preds = %6
  %.not142 = icmp eq ptr %1, null
  br i1 %.not142, label %12, label %13

12:                                               ; preds = %11
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 232, i32 noundef 2, ptr noundef null) #2
  br label %134

13:                                               ; preds = %11
  %.not143 = icmp eq ptr %2, null
  br i1 %.not143, label %14, label %15

14:                                               ; preds = %13
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 233, i32 noundef 2, ptr noundef null) #2
  br label %134

15:                                               ; preds = %13
  %.not144 = icmp eq ptr %3, null
  br i1 %.not144, label %16, label %17

16:                                               ; preds = %15
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 234, i32 noundef 2, ptr noundef null) #2
  br label %134

17:                                               ; preds = %15
  %18 = getelementptr inbounds i8, ptr %0, i64 33
  %19 = load i8, ptr %18, align 1, !tbaa !15, !range !16, !noundef !17
  %20 = icmp eq i8 %19, 0
  br i1 %20, label %21, label %22

21:                                               ; preds = %17
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 237, i32 noundef 14, ptr noundef null) #2
  br label %134

22:                                               ; preds = %17
  %23 = getelementptr inbounds i8, ptr %7, i64 16
  %24 = load ptr, ptr %23, align 8, !tbaa !18
  %25 = load ptr, ptr %2, align 8, !tbaa !19
  %26 = getelementptr inbounds i8, ptr %2, i64 8
  %27 = load i64, ptr %26, align 8, !tbaa !21
  %28 = tail call ptr @wa_alloc_from_be(ptr noundef %25, i64 noundef %27) #2
  %29 = icmp eq ptr %28, null
  br i1 %29, label %30, label %31

30:                                               ; preds = %22
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 242, i32 noundef 2) #2
  br label %134

31:                                               ; preds = %22
  %32 = load ptr, ptr %3, align 8, !tbaa !19
  %33 = getelementptr inbounds i8, ptr %3, i64 8
  %34 = load i64, ptr %33, align 8, !tbaa !21
  %35 = tail call ptr @wa_alloc_from_be(ptr noundef %32, i64 noundef %34) #2
  %36 = icmp eq ptr %35, null
  br i1 %36, label %37, label %38

37:                                               ; preds = %31
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 243, i32 noundef 2) #2
  br label %134

38:                                               ; preds = %31
  %39 = getelementptr inbounds i8, ptr %24, i64 8
  %40 = load i64, ptr %39, align 8, !tbaa !22
  tail call void @wa_change_len(ptr noundef nonnull %28, i64 noundef %40) #2
  %41 = load i64, ptr %39, align 8, !tbaa !22
  tail call void @wa_change_len(ptr noundef nonnull %35, i64 noundef %41) #2
  %42 = load ptr, ptr %0, align 8, !tbaa !5
  %43 = getelementptr inbounds i8, ptr %42, i64 16
  %44 = load ptr, ptr %43, align 8, !tbaa !18
  %45 = tail call i32 @int_cmp(ptr noundef nonnull %28, ptr noundef %44) #2
  %46 = icmp sgt i32 %45, -1
  br i1 %46, label %57, label %47

47:                                               ; preds = %38
  %48 = load ptr, ptr %0, align 8, !tbaa !5
  %49 = getelementptr inbounds i8, ptr %48, i64 16
  %50 = load ptr, ptr %49, align 8, !tbaa !18
  %51 = tail call i32 @int_cmp(ptr noundef nonnull %35, ptr noundef %50) #2
  %52 = icmp sgt i32 %51, -1
  br i1 %52, label %57, label %53

53:                                               ; preds = %47
  %54 = tail call zeroext i1 @int_is_zero(ptr noundef nonnull %28) #2
  br i1 %54, label %57, label %55

55:                                               ; preds = %53
  %56 = tail call zeroext i1 @int_is_zero(ptr noundef nonnull %35) #2
  br i1 %56, label %57, label %58

57:                                               ; preds = %38, %47, %53, %55
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 251, i32 noundef 3, ptr noundef null) #2
  br label %134

58:                                               ; preds = %55
  %59 = load ptr, ptr %1, align 8, !tbaa !19
  %60 = getelementptr inbounds i8, ptr %1, i64 8
  %61 = load i64, ptr %60, align 8, !tbaa !21
  %62 = tail call ptr @wa_alloc_from_be(ptr noundef %59, i64 noundef %61) #2
  %63 = icmp eq ptr %62, null
  br i1 %63, label %64, label %65

64:                                               ; preds = %58
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 254, i32 noundef 2) #2
  br label %134

65:                                               ; preds = %58
  %66 = getelementptr inbounds i8, ptr %62, i64 8
  %67 = load i64, ptr %66, align 8, !tbaa !22
  %68 = load i64, ptr %39, align 8, !tbaa !22
  %.not145 = icmp ult i64 %67, %68
  br i1 %.not145, label %75, label %69

69:                                               ; preds = %65
  %70 = tail call ptr @wa_alloc(i64 noundef %68) #2
  %71 = icmp eq ptr %70, null
  br i1 %71, label %72, label %73

72:                                               ; preds = %69
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 256, i32 noundef 2) #2
  br label %134

73:                                               ; preds = %69
  tail call void @int_div(ptr noundef nonnull %62, ptr noundef nonnull %24, ptr noundef null, ptr noundef nonnull %70) #2
  %74 = tail call i32 @wa_copy(ptr noundef nonnull %70, ptr noundef nonnull %62) #2
  tail call void @wa_free(ptr noundef nonnull %70) #2
  br label %75

75:                                               ; preds = %73, %65
  %76 = tail call zeroext i1 @int_is_zero(ptr noundef nonnull %62) #2
  br i1 %76, label %77, label %78

77:                                               ; preds = %75
  tail call void @wa_one(ptr noundef nonnull %62) #2
  br label %78

78:                                               ; preds = %77, %75
  %79 = load i64, ptr %39, align 8, !tbaa !22
  tail call void @wa_change_len(ptr noundef nonnull %62, i64 noundef %79) #2
  %80 = tail call ptr @gfp_mod_inv_core(ptr noundef nonnull %62, ptr noundef nonnull %24) #2
  %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 268, i32 noundef 2) #2
  br label %134

83:                                               ; preds = %78
  %84 = load i64, ptr %39, align 8, !tbaa !22
  %85 = tail call ptr @wa_alloc(i64 noundef %84) #2
  %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 271, i32 noundef 2) #2
  br label %134

88:                                               ; preds = %83
  %89 = load i64, ptr %39, align 8, !tbaa !22
  %90 = tail call ptr @wa_alloc(i64 noundef %89) #2
  %91 = icmp eq ptr %90, null
  br i1 %91, label %92, label %93

92:                                               ; preds = %88
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 272, i32 noundef 2) #2
  br label %134

93:                                               ; preds = %88
  %94 = load i64, ptr %39, align 8, !tbaa !22
  %95 = shl i64 %94, 1
  %96 = tail call ptr @wa_alloc(i64 noundef %95) #2
  %97 = icmp eq ptr %96, null
  br i1 %97, label %98, label %99

98:                                               ; preds = %93
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 273, i32 noundef 2) #2
  br label %134

99:                                               ; preds = %93
  tail call void @int_mul(ptr noundef nonnull %80, ptr noundef nonnull %35, ptr noundef nonnull %96) #2
  tail call void @int_div(ptr noundef nonnull %96, ptr noundef nonnull %24, ptr noundef null, ptr noundef nonnull %85) #2
  tail call void @int_mul(ptr noundef nonnull %80, ptr noundef nonnull %28, ptr noundef nonnull %96) #2
  tail call void @int_div(ptr noundef nonnull %96, ptr noundef nonnull %24, ptr noundef null, ptr noundef nonnull %90) #2
  %100 = tail call i32 @int_sub(ptr noundef nonnull %24, ptr noundef nonnull %90, ptr noundef nonnull %90) #2
  %101 = load ptr, ptr %0, align 8, !tbaa !5
  %102 = getelementptr inbounds i8, ptr %101, i64 24
  %103 = load ptr, ptr %102, align 8, !tbaa !24
  %104 = getelementptr inbounds i8, ptr %103, i64 32
  %105 = load i64, ptr %104, align 8, !tbaa !25
  %106 = tail call ptr @ec_point_alloc(i64 noundef %105) #2
  %107 = icmp eq ptr %106, null
  br i1 %107, label %108, label %109

108:                                              ; preds = %99
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 282, i32 noundef 2) #2
  br label %134

109:                                              ; preds = %99
  %110 = load ptr, ptr %0, align 8, !tbaa !5
  %111 = getelementptr inbounds i8, ptr %110, i64 24
  %112 = load ptr, ptr %111, align 8, !tbaa !24
  %113 = getelementptr inbounds i8, ptr %110, i64 80
  %114 = load ptr, ptr %113, align 8, !tbaa !27
  %115 = getelementptr inbounds i8, ptr %0, i64 24
  %116 = load ptr, ptr %115, align 8, !tbaa !28
  %117 = tail call i32 @ecp_dual_mul_opt(ptr noundef %112, ptr noundef %114, ptr noundef nonnull %85, ptr noundef %116, ptr noundef nonnull %90, ptr noundef nonnull %106) #2
  %.not146 = icmp eq i32 %117, 0
  br i1 %.not146, label %119, label %118

118:                                              ; preds = %109
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 283, i32 noundef %117) #2
  br label %134

119:                                              ; preds = %109
  %120 = load ptr, ptr %106, align 8, !tbaa !29
  %121 = tail call ptr @wa_copy_with_alloc(ptr noundef %120) #2
  %122 = icmp eq ptr %121, null
  br i1 %122, label %123, label %124

123:                                              ; preds = %119
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 285, i32 noundef 2) #2
  br label %134

124:                                              ; preds = %119
  %125 = load i64, ptr %39, align 8, !tbaa !22
  %126 = shl i64 %125, 1
  tail call void @wa_change_len(ptr noundef nonnull %121, i64 noundef %126) #2
  %127 = load i64, ptr %39, align 8, !tbaa !22
  %128 = tail call ptr @wa_alloc(i64 noundef %127) #2
  %129 = icmp eq ptr %128, null
  br i1 %129, label %130, label %131

130:                                              ; preds = %124
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 288, i32 noundef 2) #2
  br label %134

131:                                              ; preds = %124
  tail call void @int_div(ptr noundef nonnull %121, ptr noundef nonnull %24, ptr noundef null, ptr noundef nonnull %128) #2
  %132 = tail call zeroext i1 @int_equals(ptr noundef nonnull %128, ptr noundef nonnull %28) #2
  br i1 %132, label %134, label %133

133:                                              ; preds = %131
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 292, i32 noundef 3, ptr noundef null) #2
  br label %134

134:                                              ; preds = %131, %133, %130, %123, %118, %108, %98, %92, %87, %82, %72, %64, %57, %37, %30, %21, %16, %14, %12, %10, %5
  %.0112 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ null, %72 ], [ null, %82 ], [ null, %87 ], [ %85, %92 ], [ %85, %98 ], [ %85, %108 ], [ %85, %118 ], [ %85, %123 ], [ %85, %130 ], [ %85, %131 ], [ %85, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0111 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ null, %72 ], [ null, %82 ], [ null, %87 ], [ null, %92 ], [ %90, %98 ], [ %90, %108 ], [ %90, %118 ], [ %90, %123 ], [ %90, %130 ], [ %90, %131 ], [ %90, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0110 = phi ptr [ null, %21 ], [ null, %30 ], [ %28, %37 ], [ %28, %57 ], [ %28, %64 ], [ %28, %72 ], [ %28, %82 ], [ %28, %87 ], [ %28, %92 ], [ %28, %98 ], [ %28, %108 ], [ %28, %118 ], [ %28, %123 ], [ %28, %130 ], [ %28, %131 ], [ %28, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0109 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ %35, %57 ], [ %35, %64 ], [ %35, %72 ], [ %35, %82 ], [ %35, %87 ], [ %35, %92 ], [ %35, %98 ], [ %35, %108 ], [ %35, %118 ], [ %35, %123 ], [ %35, %130 ], [ %35, %131 ], [ %35, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0108 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ null, %72 ], [ null, %82 ], [ %80, %87 ], [ %80, %92 ], [ %80, %98 ], [ %80, %108 ], [ %80, %118 ], [ %80, %123 ], [ %80, %130 ], [ %80, %131 ], [ %80, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0107 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ null, %72 ], [ null, %82 ], [ null, %87 ], [ null, %92 ], [ null, %98 ], [ null, %108 ], [ null, %118 ], [ null, %123 ], [ null, %130 ], [ %128, %131 ], [ %128, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0106 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ null, %72 ], [ null, %82 ], [ null, %87 ], [ null, %92 ], [ null, %98 ], [ null, %108 ], [ null, %118 ], [ null, %123 ], [ %121, %130 ], [ %121, %131 ], [ %121, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.1 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ null, %72 ], [ null, %82 ], [ null, %87 ], [ null, %92 ], [ null, %98 ], [ %96, %108 ], [ %96, %118 ], [ %96, %123 ], [ %96, %130 ], [ %96, %131 ], [ %96, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0104 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ null, %72 ], [ null, %82 ], [ null, %87 ], [ null, %92 ], [ null, %98 ], [ null, %108 ], [ %106, %118 ], [ %106, %123 ], [ %106, %130 ], [ %106, %131 ], [ %106, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0103 = phi ptr [ null, %21 ], [ null, %30 ], [ null, %37 ], [ null, %57 ], [ null, %64 ], [ %62, %72 ], [ %62, %82 ], [ %62, %87 ], [ %62, %92 ], [ %62, %98 ], [ %62, %108 ], [ %62, %118 ], [ %62, %123 ], [ %62, %130 ], [ %62, %131 ], [ %62, %133 ], [ null, %16 ], [ null, %14 ], [ null, %12 ], [ null, %10 ], [ null, %5 ]
  %.0 = phi i32 [ 14, %21 ], [ 2, %30 ], [ 2, %37 ], [ 3, %57 ], [ 2, %64 ], [ 2, %72 ], [ 2, %82 ], [ 2, %87 ], [ 2, %92 ], [ 2, %98 ], [ 2, %108 ], [ %117, %118 ], [ 2, %123 ], [ 2, %130 ], [ 0, %131 ], [ 3, %133 ], [ 2, %16 ], [ 2, %14 ], [ 2, %12 ], [ 2, %10 ], [ 2, %5 ]
  tail call void @wa_free(ptr noundef %.0103) #2
  tail call void @wa_free(ptr noundef %.1) #2
  tail call void @wa_free(ptr noundef %.0112) #2
  tail call void @wa_free(ptr noundef %.0111) #2
  tail call void @wa_free(ptr noundef %.0110) #2
  tail call void @wa_free(ptr noundef %.0109) #2
  tail call void @wa_free(ptr noundef %.0108) #2
  tail call void @wa_free(ptr noundef %.0107) #2
  tail call void @wa_free(ptr noundef %.0106) #2
  tail call void @ec_point_free(ptr noundef %.0104) #2
  ret i32 %.0
}

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

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

declare void @wa_free(ptr noundef) local_unnamed_addr #0

declare void @wa_one(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 i32 @int_sub(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

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 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"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 = !{!12, !13, i64 0}
!12 = !{!"EcParamsCtx_st", !13, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !10, i64 40, !14, i64 48, !7, i64 56, !7, i64 64, !13, i64 72, !7, i64 80}
!13 = !{!"int", !8, i64 0}
!14 = !{!"long", !8, i64 0}
!15 = !{!6, !10, i64 33}
!16 = !{i8 0, i8 2}
!17 = !{}
!18 = !{!12, !7, i64 16}
!19 = !{!20, !7, i64 0}
!20 = !{!"ByteArray_st", !7, i64 0, !14, i64 8}
!21 = !{!20, !14, i64 8}
!22 = !{!23, !14, i64 8}
!23 = !{!"WordArray_st", !7, i64 0, !14, i64 8}
!24 = !{!12, !7, i64 24}
!25 = !{!26, !14, i64 32}
!26 = !{!"EcGfpCtx_st", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !14, i64 32}
!27 = !{!12, !7, i64 80}
!28 = !{!6, !7, i64 24}
!29 = !{!30, !7, i64 0}
!30 = !{!"ECPoint_st", !7, i64 0, !7, i64 8, !7, i64 16}


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