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

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

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

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

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

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

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

declare ptr @wa_alloc(i64 noundef) #1

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

declare void @wa_free(ptr noundef) #1

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

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

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

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

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

27:                                               ; preds = %24
  store i32 2, ptr %17, align 4, !tbaa !9
  %28 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1175, i32 noundef %28, ptr noundef null)
  br label %359

29:                                               ; preds = %24
  br label %30

30:                                               ; preds = %29
  br label %31

31:                                               ; preds = %30
  br label %32

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

35:                                               ; preds = %32
  store i32 2, ptr %17, align 4, !tbaa !9
  %36 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1176, i32 noundef %36, ptr noundef null)
  br label %359

37:                                               ; preds = %32
  br label %38

38:                                               ; preds = %37
  br label %39

39:                                               ; preds = %38
  br label %40

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

43:                                               ; preds = %40
  store i32 2, ptr %17, align 4, !tbaa !9
  %44 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1177, i32 noundef %44, ptr noundef null)
  br label %359

45:                                               ; preds = %40
  br label %46

46:                                               ; preds = %45
  br label %47

47:                                               ; preds = %46
  br label %48

48:                                               ; preds = %47
  %49 = load ptr, ptr %8, align 8, !tbaa !5
  %50 = call ptr @wa_alloc_from_ba(ptr noundef %49)
  store ptr %50, ptr %13, align 8, !tbaa !5
  %51 = icmp eq ptr null, %50
  br i1 %51, label %52, label %54

52:                                               ; preds = %48
  store i32 2, ptr %17, align 4, !tbaa !9
  %53 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1179, i32 noundef %53)
  br label %359

54:                                               ; preds = %48
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55
  br label %57

57:                                               ; preds = %56
  %58 = load ptr, ptr %7, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %58, i32 0, i32 4
  %60 = load ptr, ptr %59, align 8, !tbaa !11
  %61 = getelementptr inbounds %struct.EC2m_st, ptr %60, i32 0, i32 3
  %62 = load i64, ptr %61, align 8, !tbaa !15
  %63 = call ptr @wa_alloc(i64 noundef %62)
  store ptr %63, ptr %14, align 8, !tbaa !5
  %64 = icmp eq ptr null, %63
  br i1 %64, label %65, label %67

65:                                               ; preds = %57
  store i32 2, ptr %17, align 4, !tbaa !9
  %66 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1180, i32 noundef %66)
  br label %359

67:                                               ; preds = %57
  br label %68

68:                                               ; preds = %67
  br label %69

69:                                               ; preds = %68
  %70 = load ptr, ptr %13, align 8, !tbaa !5
  %71 = call i64 @int_bit_len(ptr noundef %70)
  %72 = load ptr, ptr %7, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %72, i32 0, i32 6
  %74 = load i64, ptr %73, align 8, !tbaa !17
  %75 = icmp ugt i64 %71, %74
  br i1 %75, label %76, label %81

76:                                               ; preds = %69
  br label %77

77:                                               ; preds = %76
  store i32 7, ptr %17, align 4, !tbaa !9
  %78 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1184, i32 noundef %78, ptr noundef null)
  br label %359

79:                                               ; No predecessors!
  br label %80

80:                                               ; preds = %79
  br label %81

81:                                               ; preds = %80, %69
  %82 = load ptr, ptr %13, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.WordArray_st, ptr %82, i32 0, i32 1
  %84 = load i64, ptr %83, align 8, !tbaa !18
  %85 = load ptr, ptr %7, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %85, i32 0, i32 4
  %87 = load ptr, ptr %86, align 8, !tbaa !11
  %88 = getelementptr inbounds %struct.EC2m_st, ptr %87, i32 0, i32 3
  %89 = load i64, ptr %88, align 8, !tbaa !15
  %90 = icmp ne i64 %84, %89
  br i1 %90, label %91, label %98

91:                                               ; preds = %81
  %92 = load ptr, ptr %13, align 8, !tbaa !5
  %93 = load ptr, ptr %7, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %93, i32 0, i32 4
  %95 = load ptr, ptr %94, align 8, !tbaa !11
  %96 = getelementptr inbounds %struct.EC2m_st, ptr %95, i32 0, i32 3
  %97 = load i64, ptr %96, align 8, !tbaa !15
  call void @wa_change_len(ptr noundef %92, i64 noundef %97)
  br label %98

98:                                               ; preds = %91, %81
  %99 = load ptr, ptr %7, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %99, i32 0, i32 6
  %101 = load i64, ptr %100, align 8, !tbaa !17
  %102 = add i64 %101, 7
  %103 = udiv i64 %102, 8
  store i64 %103, ptr %16, align 8, !tbaa !20
  %104 = load ptr, ptr %13, align 8, !tbaa !5
  %105 = call zeroext i1 @int_is_zero(ptr noundef %104)
  br i1 %105, label %106, label %127

106:                                              ; preds = %98
  br label %107

107:                                              ; preds = %106
  %108 = load ptr, ptr %13, align 8, !tbaa !5
  %109 = call ptr @wa_to_ba(ptr noundef %108)
  store ptr %109, ptr %18, align 8, !tbaa !5
  %110 = icmp eq ptr null, %109
  br i1 %110, label %111, label %113

111:                                              ; preds = %107
  store i32 2, ptr %17, align 4, !tbaa !9
  %112 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1198, i32 noundef %112)
  br label %359

113:                                              ; preds = %107
  br label %114

114:                                              ; preds = %113
  br label %115

115:                                              ; preds = %114
  %116 = load ptr, ptr %7, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %116, i32 0, i32 4
  %118 = load ptr, ptr %117, align 8, !tbaa !11
  %119 = getelementptr inbounds %struct.EC2m_st, ptr %118, i32 0, i32 0
  %120 = load ptr, ptr %119, align 8, !tbaa !21
  %121 = load ptr, ptr %7, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %121, i32 0, i32 4
  %123 = load ptr, ptr %122, align 8, !tbaa !11
  %124 = getelementptr inbounds %struct.EC2m_st, ptr %123, i32 0, i32 2
  %125 = load ptr, ptr %124, align 8, !tbaa !22
  %126 = load ptr, ptr %14, align 8, !tbaa !5
  call void @gf2m_mod_sqrt(ptr noundef %120, ptr noundef %125, ptr noundef %126)
  br label %310

127:                                              ; preds = %98
  %128 = load ptr, ptr %10, align 8, !tbaa !5
  %129 = icmp ne ptr %128, null
  br i1 %129, label %130, label %239

130:                                              ; preds = %127
  %131 = load ptr, ptr %13, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.WordArray_st, ptr %131, i32 0, i32 0
  %133 = load ptr, ptr %132, align 8, !tbaa !23
  %134 = getelementptr inbounds i64, ptr %133, i64 0
  %135 = load i64, ptr %134, align 8, !tbaa !20
  %136 = and i64 %135, 1
  %137 = trunc i64 %136 to i32
  store i32 %137, ptr %12, align 4, !tbaa !9
  %138 = load ptr, ptr %7, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %138, i32 0, i32 5
  %140 = load i8, ptr %139, align 8, !tbaa !24, !range !25, !noundef !26
  %141 = trunc i8 %140 to i1
  br i1 %141, label %142, label %202

142:                                              ; preds = %130
  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 4, ptr %21) #3
  %143 = load ptr, ptr %7, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %143, i32 0, i32 6
  %145 = load i64, ptr %144, align 8, !tbaa !17
  %146 = sub i64 %145, 1
  %147 = trunc i64 %146 to i32
  store i32 %147, ptr %21, align 4, !tbaa !9
  br label %148

148:                                              ; preds = %158, %142
  %149 = load i32, ptr %21, align 4, !tbaa !9
  %150 = icmp sge i32 %149, 0
  br i1 %150, label %151, label %161

151:                                              ; preds = %148
  %152 = load ptr, ptr %13, align 8, !tbaa !5
  %153 = load i32, ptr %21, align 4, !tbaa !9
  %154 = sext i32 %153 to i64
  %155 = call i32 @int_get_bit(ptr noundef %152, i64 noundef %154)
  %156 = load i32, ptr %20, align 4, !tbaa !9
  %157 = xor i32 %156, %155
  store i32 %157, ptr %20, align 4, !tbaa !9
  br label %158

158:                                              ; preds = %151
  %159 = load i32, ptr %21, align 4, !tbaa !9
  %160 = add nsw i32 %159, -1
  store i32 %160, ptr %21, align 4, !tbaa !9
  br label %148, !llvm.loop !27

161:                                              ; preds = %148
  %162 = load i32, ptr %20, align 4, !tbaa !9
  %163 = and i32 %162, 1
  %164 = load ptr, ptr %7, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %164, i32 0, i32 4
  %166 = load ptr, ptr %165, align 8, !tbaa !11
  %167 = getelementptr inbounds %struct.EC2m_st, ptr %166, i32 0, i32 1
  %168 = load i64, ptr %167, align 8, !tbaa !29
  %169 = trunc i64 %168 to i32
  %170 = icmp ne i32 %163, %169
  br i1 %170, label %171, label %178

171:                                              ; preds = %161
  %172 = load ptr, ptr %13, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.WordArray_st, ptr %172, i32 0, i32 0
  %174 = load ptr, ptr %173, align 8, !tbaa !23
  %175 = getelementptr inbounds i64, ptr %174, i64 0
  %176 = load i64, ptr %175, align 8, !tbaa !20
  %177 = xor i64 %176, 1
  store i64 %177, ptr %175, align 8, !tbaa !20
  br label %178

178:                                              ; preds = %171, %161
  br label %179

179:                                              ; preds = %178
  %180 = load ptr, ptr %13, align 8, !tbaa !5
  %181 = call ptr @wa_to_ba(ptr noundef %180)
  store ptr %181, ptr %18, align 8, !tbaa !5
  %182 = icmp eq ptr null, %181
  br i1 %182, label %183, label %185

183:                                              ; preds = %179
  store i32 2, ptr %17, align 4, !tbaa !9
  %184 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1225, i32 noundef %184)
  store i32 4, ptr %22, align 4
  br label %199

185:                                              ; preds = %179
  br label %186

186:                                              ; preds = %185
  br label %187

187:                                              ; preds = %186
  br label %188

188:                                              ; preds = %187
  %189 = load ptr, ptr %7, align 8, !tbaa !5
  %190 = load ptr, ptr %13, align 8, !tbaa !5
  %191 = call i32 @onb_to_pb(ptr noundef %189, ptr noundef %190)
  store i32 %191, ptr %17, align 4, !tbaa !9
  %192 = load i32, ptr %17, align 4, !tbaa !9
  %193 = icmp ne i32 %192, 0
  br i1 %193, label %194, label %196

194:                                              ; preds = %188
  %195 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1227, i32 noundef %195)
  store i32 4, ptr %22, align 4
  br label %199

196:                                              ; preds = %188
  br label %197

197:                                              ; preds = %196
  br label %198

198:                                              ; preds = %197
  store i32 0, ptr %22, align 4
  br label %199

199:                                              ; preds = %198, %194, %183
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #3
  %200 = load i32, ptr %22, align 4
  switch i32 %200, label %365 [
    i32 0, label %201
    i32 4, label %359
  ]

201:                                              ; preds = %199
  br label %238

202:                                              ; preds = %130
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #3
  %203 = load ptr, ptr %7, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %203, i32 0, i32 4
  %205 = load ptr, ptr %204, align 8, !tbaa !11
  %206 = getelementptr inbounds %struct.EC2m_st, ptr %205, i32 0, i32 0
  %207 = load ptr, ptr %206, align 8, !tbaa !21
  %208 = load ptr, ptr %13, align 8, !tbaa !5
  %209 = call i32 @gf2m_mod_trace(ptr noundef %207, ptr noundef %208)
  store i32 %209, ptr %23, align 4, !tbaa !9
  %210 = load i32, ptr %23, align 4, !tbaa !9
  %211 = load ptr, ptr %7, align 8, !tbaa !5
  %212 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %211, i32 0, i32 4
  %213 = load ptr, ptr %212, align 8, !tbaa !11
  %214 = getelementptr inbounds %struct.EC2m_st, ptr %213, i32 0, i32 1
  %215 = load i64, ptr %214, align 8, !tbaa !29
  %216 = trunc i64 %215 to i32
  %217 = icmp ne i32 %210, %216
  br i1 %217, label %218, label %225

218:                                              ; preds = %202
  %219 = load ptr, ptr %13, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.WordArray_st, ptr %219, i32 0, i32 0
  %221 = load ptr, ptr %220, align 8, !tbaa !23
  %222 = getelementptr inbounds i64, ptr %221, i64 0
  %223 = load i64, ptr %222, align 8, !tbaa !20
  %224 = xor i64 %223, 1
  store i64 %224, ptr %222, align 8, !tbaa !20
  br label %225

225:                                              ; preds = %218, %202
  br label %226

226:                                              ; preds = %225
  %227 = load ptr, ptr %13, align 8, !tbaa !5
  %228 = call ptr @wa_to_ba(ptr noundef %227)
  store ptr %228, ptr %18, align 8, !tbaa !5
  %229 = icmp eq ptr null, %228
  br i1 %229, label %230, label %232

230:                                              ; preds = %226
  store i32 2, ptr %17, align 4, !tbaa !9
  %231 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1235, i32 noundef %231)
  store i32 4, ptr %22, align 4
  br label %235

232:                                              ; preds = %226
  br label %233

233:                                              ; preds = %232
  br label %234

234:                                              ; preds = %233
  store i32 0, ptr %22, align 4
  br label %235

235:                                              ; preds = %234, %230
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #3
  %236 = load i32, ptr %22, align 4
  switch i32 %236, label %365 [
    i32 0, label %237
    i32 4, label %359
  ]

237:                                              ; preds = %235
  br label %238

238:                                              ; preds = %237, %201
  br label %241

239:                                              ; preds = %127
  %240 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %240, ptr %12, align 4, !tbaa !9
  br label %241

241:                                              ; preds = %239, %238
  %242 = load ptr, ptr %7, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %242, i32 0, i32 4
  %244 = load ptr, ptr %243, align 8, !tbaa !11
  %245 = getelementptr inbounds %struct.EC2m_st, ptr %244, i32 0, i32 0
  %246 = load ptr, ptr %245, align 8, !tbaa !21
  store ptr %246, ptr %15, align 8, !tbaa !5
  %247 = load ptr, ptr %15, align 8, !tbaa !5
  %248 = load ptr, ptr %13, align 8, !tbaa !5
  %249 = load ptr, ptr %14, align 8, !tbaa !5
  call void @gf2m_mod_sqr(ptr noundef %247, ptr noundef %248, ptr noundef %249)
  %250 = load ptr, ptr %15, align 8, !tbaa !5
  %251 = load ptr, ptr %14, align 8, !tbaa !5
  %252 = load ptr, ptr %14, align 8, !tbaa !5
  call void @gf2m_mod_inv(ptr noundef %250, ptr noundef %251, ptr noundef %252)
  %253 = load ptr, ptr %15, align 8, !tbaa !5
  %254 = load ptr, ptr %14, align 8, !tbaa !5
  %255 = load ptr, ptr %7, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %255, i32 0, i32 4
  %257 = load ptr, ptr %256, align 8, !tbaa !11
  %258 = getelementptr inbounds %struct.EC2m_st, ptr %257, i32 0, i32 2
  %259 = load ptr, ptr %258, align 8, !tbaa !22
  %260 = load ptr, ptr %14, align 8, !tbaa !5
  call void @gf2m_mod_mul(ptr noundef %253, ptr noundef %254, ptr noundef %259, ptr noundef %260)
  %261 = load ptr, ptr %14, align 8, !tbaa !5
  %262 = load ptr, ptr %13, align 8, !tbaa !5
  %263 = load ptr, ptr %14, align 8, !tbaa !5
  call void @gf2m_mod_add(ptr noundef %261, ptr noundef %262, ptr noundef %263)
  %264 = load ptr, ptr %7, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %264, i32 0, i32 4
  %266 = load ptr, ptr %265, align 8, !tbaa !11
  %267 = getelementptr inbounds %struct.EC2m_st, ptr %266, i32 0, i32 1
  %268 = load i64, ptr %267, align 8, !tbaa !29
  %269 = icmp eq i64 %268, 1
  br i1 %269, label %270, label %277

270:                                              ; preds = %241
  %271 = load ptr, ptr %14, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.WordArray_st, ptr %271, i32 0, i32 0
  %273 = load ptr, ptr %272, align 8, !tbaa !23
  %274 = getelementptr inbounds i64, ptr %273, i64 0
  %275 = load i64, ptr %274, align 8, !tbaa !20
  %276 = xor i64 %275, 1
  store i64 %276, ptr %274, align 8, !tbaa !20
  br label %277

277:                                              ; preds = %270, %241
  %278 = load ptr, ptr %15, align 8, !tbaa !5
  %279 = load ptr, ptr %14, align 8, !tbaa !5
  %280 = load ptr, ptr %14, align 8, !tbaa !5
  %281 = call zeroext i1 @gf2m_mod_solve_quad(ptr noundef %278, ptr noundef %279, ptr noundef %280)
  br i1 %281, label %287, label %282

282:                                              ; preds = %277
  br label %283

283:                                              ; preds = %282
  store i32 7, ptr %17, align 4, !tbaa !9
  %284 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 1255, i32 noundef %284, ptr noundef null)
  br label %359

285:                                              ; No predecessors!
  br label %286

286:                                              ; preds = %285
  br label %287

287:                                              ; preds = %286, %277
  %288 = load ptr, ptr %15, align 8, !tbaa !5
  %289 = load ptr, ptr %14, align 8, !tbaa !5
  %290 = call i32 @gf2m_mod_trace(ptr noundef %288, ptr noundef %289)
  %291 = load i32, ptr %12, align 4, !tbaa !9
  %292 = icmp eq i32 %290, %291
  br i1 %292, label %293, label %298

293:                                              ; preds = %287
  %294 = load ptr, ptr %15, align 8, !tbaa !5
  %295 = load ptr, ptr %13, align 8, !tbaa !5
  %296 = load ptr, ptr %14, align 8, !tbaa !5
  %297 = load ptr, ptr %14, align 8, !tbaa !5
  call void @gf2m_mod_mul(ptr noundef %294, ptr noundef %295, ptr noundef %296, ptr noundef %297)
  br label %309

298:                                              ; preds = %287
  %299 = load ptr, ptr %14, align 8, !tbaa !5
  %300 = getelementptr inbounds %struct.WordArray_st, ptr %299, i32 0, i32 0
  %301 = load ptr, ptr %300, align 8, !tbaa !23
  %302 = getelementptr inbounds i64, ptr %301, i64 0
  %303 = load i64, ptr %302, align 8, !tbaa !20
  %304 = xor i64 %303, 1
  store i64 %304, ptr %302, align 8, !tbaa !20
  %305 = load ptr, ptr %15, align 8, !tbaa !5
  %306 = load ptr, ptr %13, align 8, !tbaa !5
  %307 = load ptr, ptr %14, align 8, !tbaa !5
  %308 = load ptr, ptr %14, align 8, !tbaa !5
  call void @gf2m_mod_mul(ptr noundef %305, ptr noundef %306, ptr noundef %307, ptr noundef %308)
  br label %309

309:                                              ; preds = %298, %293
  br label %310

310:                                              ; preds = %309, %115
  %311 = load ptr, ptr %7, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %311, i32 0, i32 5
  %313 = load i8, ptr %312, align 8, !tbaa !24, !range !25, !noundef !26
  %314 = trunc i8 %313 to i1
  br i1 %314, label %315, label %319

315:                                              ; preds = %310
  %316 = load ptr, ptr %7, align 8, !tbaa !5
  %317 = load ptr, ptr %14, align 8, !tbaa !5
  %318 = call i32 @pb_to_onb(ptr noundef %316, ptr noundef %317)
  br label %319

319:                                              ; preds = %315, %310
  br label %320

320:                                              ; preds = %319
  %321 = load ptr, ptr %14, align 8, !tbaa !5
  %322 = call ptr @wa_to_ba(ptr noundef %321)
  store ptr %322, ptr %19, align 8, !tbaa !5
  %323 = icmp eq ptr null, %322
  br i1 %323, label %324, label %326

324:                                              ; preds = %320
  store i32 2, ptr %17, align 4, !tbaa !9
  %325 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1271, i32 noundef %325)
  br label %359

326:                                              ; preds = %320
  br label %327

327:                                              ; preds = %326
  br label %328

328:                                              ; preds = %327
  br label %329

329:                                              ; preds = %328
  %330 = load ptr, ptr %19, align 8, !tbaa !5
  %331 = load i64, ptr %16, align 8, !tbaa !20
  %332 = call i32 @ba_change_len(ptr noundef %330, i64 noundef %331)
  store i32 %332, ptr %17, align 4, !tbaa !9
  %333 = load i32, ptr %17, align 4, !tbaa !9
  %334 = icmp ne i32 %333, 0
  br i1 %334, label %335, label %337

335:                                              ; preds = %329
  %336 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1272, i32 noundef %336)
  br label %359

337:                                              ; preds = %329
  br label %338

338:                                              ; preds = %337
  br label %339

339:                                              ; preds = %338
  %340 = load ptr, ptr %10, align 8, !tbaa !5
  %341 = icmp ne ptr %340, null
  br i1 %341, label %342, label %356

342:                                              ; preds = %339
  br label %343

343:                                              ; preds = %342
  %344 = load ptr, ptr %18, align 8, !tbaa !5
  %345 = load i64, ptr %16, align 8, !tbaa !20
  %346 = call i32 @ba_change_len(ptr noundef %344, i64 noundef %345)
  store i32 %346, ptr %17, align 4, !tbaa !9
  %347 = load i32, ptr %17, align 4, !tbaa !9
  %348 = icmp ne i32 %347, 0
  br i1 %348, label %349, label %351

349:                                              ; preds = %343
  %350 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 1275, i32 noundef %350)
  br label %359

351:                                              ; preds = %343
  br label %352

352:                                              ; preds = %351
  br label %353

353:                                              ; preds = %352
  %354 = load ptr, ptr %18, align 8, !tbaa !5
  %355 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %354, ptr %355, align 8, !tbaa !5
  store ptr null, ptr %18, align 8, !tbaa !5
  br label %356

356:                                              ; preds = %353, %339
  %357 = load ptr, ptr %19, align 8, !tbaa !5
  %358 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %357, ptr %358, align 8, !tbaa !5
  store ptr null, ptr %19, align 8, !tbaa !5
  br label %359

359:                                              ; preds = %356, %349, %335, %324, %283, %235, %199, %111, %77, %65, %52, %43, %35, %27
  %360 = load ptr, ptr %13, align 8, !tbaa !5
  call void @wa_free(ptr noundef %360)
  %361 = load ptr, ptr %14, align 8, !tbaa !5
  call void @wa_free(ptr noundef %361)
  %362 = load ptr, ptr %18, align 8, !tbaa !5
  call void @ba_free(ptr noundef %362)
  %363 = load ptr, ptr %19, align 8, !tbaa !5
  call void @ba_free(ptr noundef %363)
  %364 = load i32, ptr %17, align 4, !tbaa !9
  store i32 %364, ptr %6, align 4
  store i32 1, ptr %22, align 4
  br label %365

365:                                              ; preds = %359, %235, %199
  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 4, 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 4, ptr %12) #3
  %366 = load i32, ptr %6, align 4
  ret i32 %366
}

declare ptr @wa_alloc_from_ba(ptr noundef) #1

declare i64 @int_bit_len(ptr noundef) #1

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

declare zeroext i1 @int_is_zero(ptr noundef) #1

declare ptr @wa_to_ba(ptr noundef) #1

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

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

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

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

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

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

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

declare void @ba_free(ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

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

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


; 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 [21 x i8], align 1

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

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

declare ptr @wa_alloc(i64 noundef) local_unnamed_addr #0

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

declare void @wa_free(ptr noundef) local_unnamed_addr #0

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

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

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

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

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

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

8:                                                ; preds = %7
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1176, i32 noundef 2, ptr noundef null) #2
  br label %.thread

9:                                                ; preds = %7
  %.not140 = icmp eq ptr %4, null
  br i1 %.not140, label %10, label %11

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

11:                                               ; preds = %9
  %12 = tail call ptr @wa_alloc_from_ba(ptr noundef nonnull %1) #2
  %13 = icmp eq ptr %12, null
  br i1 %13, label %14, label %15

14:                                               ; preds = %11
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1179, i32 noundef 2) #2
  br label %.thread

15:                                               ; preds = %11
  %16 = getelementptr inbounds i8, ptr %0, i64 32
  %17 = load ptr, ptr %16, align 8, !tbaa !5
  %18 = getelementptr inbounds i8, ptr %17, i64 24
  %19 = load i64, ptr %18, align 8, !tbaa !13
  %20 = tail call ptr @wa_alloc(i64 noundef %19) #2
  %21 = icmp eq ptr %20, null
  br i1 %21, label %22, label %23

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

23:                                               ; preds = %15
  %24 = tail call i64 @int_bit_len(ptr noundef nonnull %12) #2
  %25 = getelementptr inbounds i8, ptr %0, i64 48
  %26 = load i64, ptr %25, align 8, !tbaa !15
  %27 = icmp ugt i64 %24, %26
  br i1 %27, label %28, label %29

28:                                               ; preds = %23
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1184, i32 noundef 7, ptr noundef null) #2
  br label %.thread

29:                                               ; preds = %23
  %30 = getelementptr inbounds i8, ptr %12, i64 8
  %31 = load i64, ptr %30, align 8, !tbaa !16
  %32 = load ptr, ptr %16, align 8, !tbaa !5
  %33 = getelementptr inbounds i8, ptr %32, i64 24
  %34 = load i64, ptr %33, align 8, !tbaa !13
  %.not141 = icmp eq i64 %31, %34
  br i1 %.not141, label %36, label %35

35:                                               ; preds = %29
  tail call void @wa_change_len(ptr noundef nonnull %12, i64 noundef %34) #2
  %.pre = load i64, ptr %25, align 8, !tbaa !15
  br label %36

36:                                               ; preds = %35, %29
  %37 = phi i64 [ %.pre, %35 ], [ %26, %29 ]
  %38 = add i64 %37, 7
  %39 = lshr i64 %38, 3
  %40 = tail call zeroext i1 @int_is_zero(ptr noundef nonnull %12) #2
  br i1 %40, label %41, label %50

41:                                               ; preds = %36
  %42 = tail call ptr @wa_to_ba(ptr noundef nonnull %12) #2
  %43 = icmp eq ptr %42, null
  br i1 %43, label %44, label %45

44:                                               ; preds = %41
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1198, i32 noundef 2) #2
  br label %.thread

45:                                               ; preds = %41
  %46 = load ptr, ptr %16, align 8, !tbaa !5
  %47 = load ptr, ptr %46, align 8, !tbaa !18
  %48 = getelementptr inbounds i8, ptr %46, i64 16
  %49 = load ptr, ptr %48, align 8, !tbaa !19
  tail call void @gf2m_mod_sqrt(ptr noundef %47, ptr noundef %49, ptr noundef nonnull %20) #2
  br label %122

50:                                               ; preds = %36
  %.not142 = icmp eq ptr %3, null
  br i1 %.not142, label %.thread156, label %51

51:                                               ; preds = %50
  %52 = load ptr, ptr %12, align 8, !tbaa !20
  %53 = load i64, ptr %52, align 8, !tbaa !21
  %54 = trunc i64 %53 to i32
  %55 = and i32 %54, 1
  %56 = getelementptr inbounds i8, ptr %0, i64 40
  %57 = load i8, ptr %56, align 8, !tbaa !22, !range !23, !noundef !24
  %58 = trunc nuw i8 %57 to i1
  br i1 %58, label %59, label %82

59:                                               ; preds = %51
  %60 = load i64, ptr %25, align 8, !tbaa !15
  %61 = trunc i64 %60 to i32
  %.0108160 = add i32 %61, -1
  %62 = icmp sgt i32 %.0108160, -1
  br i1 %62, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %59
  %63 = zext nneg i32 %.0108160 to i64
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ %63, %.lr.ph.preheader ], [ %indvars.iv.next, %.lr.ph ]
  %.0109161 = phi i32 [ 0, %.lr.ph.preheader ], [ %65, %.lr.ph ]
  %64 = tail call i32 @int_get_bit(ptr noundef nonnull %12, i64 noundef %indvars.iv) #2
  %65 = xor i32 %64, %.0109161
  %indvars.iv.next = add nsw i64 %indvars.iv, -1
  %.not164 = icmp eq i64 %indvars.iv, 0
  br i1 %.not164, label %._crit_edge.loopexit, label %.lr.ph, !llvm.loop !25

._crit_edge.loopexit:                             ; preds = %.lr.ph
  %66 = and i32 %65, 1
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %59
  %.0109.lcssa = phi i32 [ 0, %59 ], [ %66, %._crit_edge.loopexit ]
  %67 = load ptr, ptr %16, align 8, !tbaa !5
  %68 = getelementptr inbounds i8, ptr %67, i64 8
  %69 = load i64, ptr %68, align 8, !tbaa !27
  %70 = trunc i64 %69 to i32
  %.not144 = icmp eq i32 %.0109.lcssa, %70
  br i1 %.not144, label %75, label %71

71:                                               ; preds = %._crit_edge
  %72 = load ptr, ptr %12, align 8, !tbaa !20
  %73 = load i64, ptr %72, align 8, !tbaa !21
  %74 = xor i64 %73, 1
  store i64 %74, ptr %72, align 8, !tbaa !21
  br label %75

75:                                               ; preds = %._crit_edge, %71
  %76 = tail call ptr @wa_to_ba(ptr noundef nonnull %12) #2
  %77 = icmp eq ptr %76, null
  br i1 %77, label %78, label %79

78:                                               ; preds = %75
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1225, i32 noundef 2) #2
  br label %.thread

79:                                               ; preds = %75
  %80 = tail call i32 @onb_to_pb(ptr noundef nonnull %0, ptr noundef nonnull %12)
  %.not145 = icmp eq i32 %80, 0
  br i1 %.not145, label %.thread156, label %81

81:                                               ; preds = %79
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1227, i32 noundef %80) #2
  br label %.thread

82:                                               ; preds = %51
  %83 = load ptr, ptr %16, align 8, !tbaa !5
  %84 = load ptr, ptr %83, align 8, !tbaa !18
  %85 = tail call i32 @gf2m_mod_trace(ptr noundef %84, ptr noundef nonnull %12) #2
  %86 = load ptr, ptr %16, align 8, !tbaa !5
  %87 = getelementptr inbounds i8, ptr %86, i64 8
  %88 = load i64, ptr %87, align 8, !tbaa !27
  %89 = trunc i64 %88 to i32
  %.not143 = icmp eq i32 %85, %89
  br i1 %.not143, label %94, label %90

90:                                               ; preds = %82
  %91 = load ptr, ptr %12, align 8, !tbaa !20
  %92 = load i64, ptr %91, align 8, !tbaa !21
  %93 = xor i64 %92, 1
  store i64 %93, ptr %91, align 8, !tbaa !21
  br label %94

94:                                               ; preds = %82, %90
  %95 = tail call ptr @wa_to_ba(ptr noundef nonnull %12) #2
  %96 = icmp eq ptr %95, null
  br i1 %96, label %97, label %.thread156

97:                                               ; preds = %94
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1235, i32 noundef 2) #2
  br label %.thread

.thread156:                                       ; preds = %94, %79, %50
  %.0117 = phi i32 [ %2, %50 ], [ %55, %79 ], [ %55, %94 ]
  %.0111 = phi ptr [ null, %50 ], [ %76, %79 ], [ %95, %94 ]
  %98 = load ptr, ptr %16, align 8, !tbaa !5
  %99 = load ptr, ptr %98, align 8, !tbaa !18
  tail call void @gf2m_mod_sqr(ptr noundef %99, ptr noundef %12, ptr noundef %20) #2
  tail call void @gf2m_mod_inv(ptr noundef %99, ptr noundef %20, ptr noundef %20) #2
  %100 = load ptr, ptr %16, align 8, !tbaa !5
  %101 = getelementptr inbounds i8, ptr %100, i64 16
  %102 = load ptr, ptr %101, align 8, !tbaa !19
  tail call void @gf2m_mod_mul(ptr noundef %99, ptr noundef %20, ptr noundef %102, ptr noundef %20) #2
  tail call void @gf2m_mod_add(ptr noundef %20, ptr noundef %12, ptr noundef %20) #2
  %103 = load ptr, ptr %16, align 8, !tbaa !5
  %104 = getelementptr inbounds i8, ptr %103, i64 8
  %105 = load i64, ptr %104, align 8, !tbaa !27
  %106 = icmp eq i64 %105, 1
  br i1 %106, label %107, label %111

107:                                              ; preds = %.thread156
  %108 = load ptr, ptr %20, align 8, !tbaa !20
  %109 = load i64, ptr %108, align 8, !tbaa !21
  %110 = xor i64 %109, 1
  store i64 %110, ptr %108, align 8, !tbaa !21
  br label %111

111:                                              ; preds = %107, %.thread156
  %112 = tail call zeroext i1 @gf2m_mod_solve_quad(ptr noundef %99, ptr noundef %20, ptr noundef %20) #2
  br i1 %112, label %114, label %113

113:                                              ; preds = %111
  tail call void @stacktrace_create(ptr noundef nonnull @.str, i64 noundef 1255, i32 noundef 7, ptr noundef null) #2
  br label %.thread

114:                                              ; preds = %111
  %115 = tail call i32 @gf2m_mod_trace(ptr noundef %99, ptr noundef %20) #2
  %116 = icmp eq i32 %115, %.0117
  br i1 %116, label %117, label %118

117:                                              ; preds = %114
  tail call void @gf2m_mod_mul(ptr noundef %99, ptr noundef %12, ptr noundef %20, ptr noundef %20) #2
  br label %122

118:                                              ; preds = %114
  %119 = load ptr, ptr %20, align 8, !tbaa !20
  %120 = load i64, ptr %119, align 8, !tbaa !21
  %121 = xor i64 %120, 1
  store i64 %121, ptr %119, align 8, !tbaa !21
  tail call void @gf2m_mod_mul(ptr noundef %99, ptr noundef %12, ptr noundef %20, ptr noundef %20) #2
  br label %122

122:                                              ; preds = %117, %118, %45
  %.1112 = phi ptr [ %42, %45 ], [ %.0111, %117 ], [ %.0111, %118 ]
  %123 = getelementptr inbounds i8, ptr %0, i64 40
  %124 = load i8, ptr %123, align 8, !tbaa !22, !range !23, !noundef !24
  %125 = trunc nuw i8 %124 to i1
  br i1 %125, label %126, label %128

126:                                              ; preds = %122
  %127 = tail call i32 @pb_to_onb(ptr noundef nonnull %0, ptr noundef %20)
  br label %128

128:                                              ; preds = %122, %126
  %129 = tail call ptr @wa_to_ba(ptr noundef %20) #2
  %130 = icmp eq ptr %129, null
  br i1 %130, label %131, label %132

131:                                              ; preds = %128
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1271, i32 noundef 2) #2
  br label %.thread

132:                                              ; preds = %128
  %133 = tail call i32 @ba_change_len(ptr noundef nonnull %129, i64 noundef %39) #2
  %.not146 = icmp eq i32 %133, 0
  br i1 %.not146, label %135, label %134

134:                                              ; preds = %132
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1272, i32 noundef %133) #2
  br label %.thread

135:                                              ; preds = %132
  %.not147 = icmp eq ptr %3, null
  br i1 %.not147, label %140, label %136

136:                                              ; preds = %135
  %137 = tail call i32 @ba_change_len(ptr noundef %.1112, i64 noundef %39) #2
  %.not148 = icmp eq i32 %137, 0
  br i1 %.not148, label %139, label %138

138:                                              ; preds = %136
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 1275, i32 noundef %137) #2
  br label %.thread

139:                                              ; preds = %136
  store ptr %.1112, ptr %3, align 8, !tbaa !28
  br label %140

140:                                              ; preds = %139, %135
  %.2 = phi ptr [ null, %139 ], [ %.1112, %135 ]
  store ptr %129, ptr %4, align 8, !tbaa !28
  br label %.thread

.thread:                                          ; preds = %81, %78, %97, %140, %138, %134, %131, %113, %44, %28, %22, %14, %10, %8, %6
  %.0119 = phi ptr [ null, %14 ], [ null, %22 ], [ %20, %28 ], [ %20, %44 ], [ %20, %131 ], [ %20, %134 ], [ %20, %138 ], [ %20, %140 ], [ %20, %113 ], [ %20, %97 ], [ null, %10 ], [ null, %8 ], [ null, %6 ], [ %20, %78 ], [ %20, %81 ]
  %.0118 = phi ptr [ null, %14 ], [ %12, %22 ], [ %12, %28 ], [ %12, %44 ], [ %12, %131 ], [ %12, %134 ], [ %12, %138 ], [ %12, %140 ], [ %12, %113 ], [ %12, %97 ], [ null, %10 ], [ null, %8 ], [ null, %6 ], [ %12, %78 ], [ %12, %81 ]
  %.3116 = phi i32 [ 2, %14 ], [ 2, %22 ], [ 7, %28 ], [ 2, %44 ], [ 2, %131 ], [ %133, %134 ], [ %137, %138 ], [ 0, %140 ], [ 7, %113 ], [ 2, %97 ], [ 2, %10 ], [ 2, %8 ], [ 2, %6 ], [ 2, %78 ], [ %80, %81 ]
  %.3 = phi ptr [ null, %14 ], [ null, %22 ], [ null, %28 ], [ null, %44 ], [ %.1112, %131 ], [ %.1112, %134 ], [ %.1112, %138 ], [ %.2, %140 ], [ %.0111, %113 ], [ null, %97 ], [ null, %10 ], [ null, %8 ], [ null, %6 ], [ null, %78 ], [ %76, %81 ]
  %.0110 = phi ptr [ null, %14 ], [ null, %22 ], [ null, %28 ], [ null, %44 ], [ null, %131 ], [ %129, %134 ], [ %129, %138 ], [ null, %140 ], [ null, %113 ], [ null, %97 ], [ null, %10 ], [ null, %8 ], [ null, %6 ], [ null, %78 ], [ null, %81 ]
  tail call void @wa_free(ptr noundef %.0118) #2
  tail call void @wa_free(ptr noundef %.0119) #2
  tail call void @ba_free(ptr noundef %.3) #2
  tail call void @ba_free(ptr noundef %.0110) #2
  ret i32 %.3116
}

declare ptr @wa_alloc_from_ba(ptr noundef) local_unnamed_addr #0

declare i64 @int_bit_len(ptr noundef) local_unnamed_addr #0

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

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

declare ptr @wa_to_ba(ptr noundef) local_unnamed_addr #0

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

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

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

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

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

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

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

declare void @ba_free(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, !10, i64 32}
!6 = !{!"EcParamsCtx_st", !7, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !11, i64 40, !12, i64 48, !10, i64 56, !10, i64 64, !7, i64 72, !10, i64 80}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"_Bool", !8, i64 0}
!12 = !{!"long", !8, i64 0}
!13 = !{!14, !12, i64 24}
!14 = !{!"EC2m_st", !10, i64 0, !12, i64 8, !10, i64 16, !12, i64 24}
!15 = !{!6, !12, i64 48}
!16 = !{!17, !12, i64 8}
!17 = !{!"WordArray_st", !10, i64 0, !12, i64 8}
!18 = !{!14, !10, i64 0}
!19 = !{!14, !10, i64 16}
!20 = !{!17, !10, i64 0}
!21 = !{!12, !12, i64 0}
!22 = !{!6, !11, i64 40}
!23 = !{i8 0, i8 2}
!24 = !{}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!14, !12, i64 8}
!28 = !{!10, !10, i64 0}


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