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

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.EcCtx_st = type { ptr, ptr, ptr, ptr, i8, i8 }
%struct.EcParamsCtx_st = type { i32, ptr, ptr, ptr, ptr, i8, i64, ptr, ptr, i32, ptr }
%struct.ByteArray_st = type { ptr, i64 }
%struct.WordArray_st = type { ptr, i64 }
%struct.EcGfpCtx_st = type { ptr, ptr, ptr, i8, i64 }
%struct.EC2m_st = type { ptr, i64, ptr, i64 }
%struct.ECPoint_st = type { ptr, ptr, ptr }

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

declare void @ec_point_free(ptr noundef) #1

declare ptr @wa_alloc(i64 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @sm2dsa_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 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
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #3
  store i32 0, ptr %17, align 4, !tbaa !9
  br label %18

18:                                               ; preds = %4
  %19 = load ptr, ptr %5, align 8, !tbaa !5
  %20 = icmp ne ptr %19, null
  br i1 %20, label %23, label %21

21:                                               ; preds = %18
  store i32 2, ptr %17, align 4, !tbaa !9
  %22 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 251, i32 noundef %22, ptr noundef null)
  br label %385

23:                                               ; preds = %18
  br label %24

24:                                               ; preds = %23
  br label %25

25:                                               ; preds = %24
  br label %26

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

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

31:                                               ; preds = %26
  br label %32

32:                                               ; preds = %31
  br label %33

33:                                               ; preds = %32
  br label %34

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

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

39:                                               ; preds = %34
  br label %40

40:                                               ; preds = %39
  br label %41

41:                                               ; preds = %40
  br label %42

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

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

47:                                               ; preds = %42
  br label %48

48:                                               ; preds = %47
  br label %49

49:                                               ; preds = %48
  %50 = load ptr, ptr %5, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.EcCtx_st, ptr %50, i32 0, i32 5
  %52 = load i8, ptr %51, align 1, !tbaa !11, !range !14, !noundef !15
  %53 = trunc i8 %52 to i1
  %54 = zext i1 %53 to i32
  %55 = icmp eq i32 %54, 0
  br i1 %55, label %56, label %61

56:                                               ; preds = %49
  br label %57

57:                                               ; preds = %56
  store i32 14, ptr %17, align 4, !tbaa !9
  %58 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 257, i32 noundef %58, ptr noundef null)
  br label %385

59:                                               ; No predecessors!
  br label %60

60:                                               ; preds = %59
  br label %61

61:                                               ; preds = %60, %49
  %62 = load ptr, ptr %5, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.EcCtx_st, ptr %62, i32 0, i32 0
  %64 = load ptr, ptr %63, align 8, !tbaa !16
  %65 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %64, i32 0, i32 2
  %66 = load ptr, ptr %65, align 8, !tbaa !17
  store ptr %66, ptr %16, align 8, !tbaa !5
  %67 = load ptr, ptr %5, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.EcCtx_st, ptr %67, i32 0, i32 5
  %69 = load i8, ptr %68, align 1, !tbaa !11, !range !14, !noundef !15
  %70 = trunc i8 %69 to i1
  %71 = zext i1 %70 to i32
  %72 = icmp eq i32 %71, 0
  br i1 %72, label %73, label %78

73:                                               ; preds = %61
  br label %74

74:                                               ; preds = %73
  store i32 14, ptr %17, align 4, !tbaa !9
  %75 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 263, i32 noundef %75, ptr noundef null)
  br label %385

76:                                               ; No predecessors!
  br label %77

77:                                               ; preds = %76
  br label %78

78:                                               ; preds = %77, %61
  %79 = load ptr, ptr %5, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.EcCtx_st, ptr %79, i32 0, i32 0
  %81 = load ptr, ptr %80, align 8, !tbaa !16
  %82 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %81, i32 0, i32 2
  %83 = load ptr, ptr %82, align 8, !tbaa !17
  store ptr %83, ptr %16, align 8, !tbaa !5
  br label %84

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

93:                                               ; preds = %84
  store i32 2, ptr %17, align 4, !tbaa !9
  %94 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 268, i32 noundef %94)
  br label %385

95:                                               ; preds = %84
  br label %96

96:                                               ; preds = %95
  br label %97

97:                                               ; preds = %96
  br label %98

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

107:                                              ; preds = %98
  store i32 2, ptr %17, align 4, !tbaa !9
  %108 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 269, i32 noundef %108)
  br label %385

109:                                              ; preds = %98
  br label %110

110:                                              ; preds = %109
  br label %111

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

128:                                              ; preds = %111
  %129 = load ptr, ptr %12, align 8, !tbaa !5
  %130 = load ptr, ptr %5, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.EcCtx_st, ptr %130, i32 0, i32 0
  %132 = load ptr, ptr %131, align 8, !tbaa !16
  %133 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %132, i32 0, i32 2
  %134 = load ptr, ptr %133, align 8, !tbaa !17
  %135 = call i32 @int_cmp(ptr noundef %129, ptr noundef %134)
  %136 = icmp sge i32 %135, 0
  br i1 %136, label %143, label %137

137:                                              ; preds = %128
  %138 = load ptr, ptr %11, align 8, !tbaa !5
  %139 = call zeroext i1 @int_is_zero(ptr noundef %138)
  br i1 %139, label %143, label %140

140:                                              ; preds = %137
  %141 = load ptr, ptr %12, align 8, !tbaa !5
  %142 = call zeroext i1 @int_is_zero(ptr noundef %141)
  br i1 %142, label %143, label %148

143:                                              ; preds = %140, %137, %128, %111
  br label %144

144:                                              ; preds = %143
  store i32 3, ptr %17, align 4, !tbaa !9
  %145 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 277, i32 noundef %145, ptr noundef null)
  br label %385

146:                                              ; No predecessors!
  br label %147

147:                                              ; preds = %146
  br label %148

148:                                              ; preds = %147, %140
  br label %149

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

158:                                              ; preds = %149
  store i32 2, ptr %17, align 4, !tbaa !9
  %159 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 280, i32 noundef %159)
  br label %385

160:                                              ; preds = %149
  br label %161

161:                                              ; preds = %160
  br label %162

162:                                              ; preds = %161
  %163 = load ptr, ptr %10, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.WordArray_st, ptr %163, i32 0, i32 1
  %165 = load i64, ptr %164, align 8, !tbaa !23
  %166 = load ptr, ptr %16, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.WordArray_st, ptr %166, i32 0, i32 1
  %168 = load i64, ptr %167, align 8, !tbaa !23
  %169 = icmp uge i64 %165, %168
  br i1 %169, label %170, label %189

170:                                              ; preds = %162
  br label %171

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

177:                                              ; preds = %171
  store i32 2, ptr %17, align 4, !tbaa !9
  %178 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 282, i32 noundef %178)
  br label %385

179:                                              ; preds = %171
  br label %180

180:                                              ; preds = %179
  br label %181

181:                                              ; preds = %180
  %182 = load ptr, ptr %10, align 8, !tbaa !5
  %183 = load ptr, ptr %16, align 8, !tbaa !5
  %184 = load ptr, ptr %14, align 8, !tbaa !5
  call void @int_div(ptr noundef %182, ptr noundef %183, ptr noundef null, ptr noundef %184)
  %185 = load ptr, ptr %14, align 8, !tbaa !5
  %186 = load ptr, ptr %10, align 8, !tbaa !5
  %187 = call i32 @wa_copy(ptr noundef %185, ptr noundef %186)
  %188 = load ptr, ptr %14, align 8, !tbaa !5
  call void @wa_free(ptr noundef %188)
  store ptr null, ptr %14, align 8, !tbaa !5
  br label %189

189:                                              ; preds = %181, %162
  %190 = load ptr, ptr %10, align 8, !tbaa !5
  %191 = load ptr, ptr %16, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.WordArray_st, ptr %191, i32 0, i32 1
  %193 = load i64, ptr %192, align 8, !tbaa !23
  call void @wa_change_len(ptr noundef %190, i64 noundef %193)
  br label %194

194:                                              ; preds = %189
  %195 = load ptr, ptr %16, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.WordArray_st, ptr %195, i32 0, i32 1
  %197 = load i64, ptr %196, align 8, !tbaa !23
  %198 = call ptr @wa_alloc(i64 noundef %197)
  store ptr %198, ptr %13, align 8, !tbaa !5
  %199 = icmp eq ptr null, %198
  br i1 %199, label %200, label %202

200:                                              ; preds = %194
  store i32 2, ptr %17, align 4, !tbaa !9
  %201 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 290, i32 noundef %201)
  br label %385

202:                                              ; preds = %194
  br label %203

203:                                              ; preds = %202
  br label %204

204:                                              ; preds = %203
  %205 = load ptr, ptr %11, align 8, !tbaa !5
  %206 = load ptr, ptr %12, align 8, !tbaa !5
  %207 = load ptr, ptr %13, align 8, !tbaa !5
  %208 = call i64 @int_add(ptr noundef %205, ptr noundef %206, ptr noundef %207)
  %209 = icmp ugt i64 %208, 0
  br i1 %209, label %215, label %210

210:                                              ; preds = %204
  %211 = load ptr, ptr %13, align 8, !tbaa !5
  %212 = load ptr, ptr %16, align 8, !tbaa !5
  %213 = call i32 @int_cmp(ptr noundef %211, ptr noundef %212)
  %214 = icmp sge i32 %213, 0
  br i1 %214, label %215, label %220

215:                                              ; preds = %210, %204
  %216 = load ptr, ptr %13, align 8, !tbaa !5
  %217 = load ptr, ptr %16, align 8, !tbaa !5
  %218 = load ptr, ptr %13, align 8, !tbaa !5
  %219 = call i32 @int_sub(ptr noundef %216, ptr noundef %217, ptr noundef %218)
  br label %220

220:                                              ; preds = %215, %210
  %221 = load ptr, ptr %5, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.EcCtx_st, ptr %221, i32 0, i32 0
  %223 = load ptr, ptr %222, align 8, !tbaa !16
  %224 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %223, i32 0, i32 0
  %225 = load i32, ptr %224, align 8, !tbaa !25
  %226 = icmp eq i32 %225, 0
  br i1 %226, label %227, label %268

227:                                              ; preds = %220
  br label %228

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

238:                                              ; preds = %228
  store i32 2, ptr %17, align 4, !tbaa !9
  %239 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 297, i32 noundef %239)
  br label %385

240:                                              ; preds = %228
  br label %241

241:                                              ; preds = %240
  br label %242

242:                                              ; preds = %241
  br label %243

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

263:                                              ; preds = %243
  %264 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 298, i32 noundef %264)
  br label %385

265:                                              ; preds = %243
  br label %266

266:                                              ; preds = %265
  br label %267

267:                                              ; preds = %266
  br label %309

268:                                              ; preds = %220
  br label %269

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

279:                                              ; preds = %269
  store i32 2, ptr %17, align 4, !tbaa !9
  %280 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 301, i32 noundef %280)
  br label %385

281:                                              ; preds = %269
  br label %282

282:                                              ; preds = %281
  br label %283

283:                                              ; preds = %282
  br label %284

284:                                              ; preds = %283
  %285 = load ptr, ptr %5, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.EcCtx_st, ptr %285, i32 0, i32 0
  %287 = load ptr, ptr %286, align 8, !tbaa !16
  %288 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %287, i32 0, i32 4
  %289 = load ptr, ptr %288, align 8, !tbaa !31
  %290 = load ptr, ptr %5, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.EcCtx_st, ptr %290, i32 0, i32 0
  %292 = load ptr, ptr %291, align 8, !tbaa !16
  %293 = getelementptr inbounds %struct.EcParamsCtx_st, ptr %292, i32 0, i32 10
  %294 = load ptr, ptr %293, align 8, !tbaa !29
  %295 = load ptr, ptr %12, align 8, !tbaa !5
  %296 = load ptr, ptr %5, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.EcCtx_st, ptr %296, i32 0, i32 3
  %298 = load ptr, ptr %297, align 8, !tbaa !30
  %299 = load ptr, ptr %13, align 8, !tbaa !5
  %300 = load ptr, ptr %15, align 8, !tbaa !5
  %301 = call i32 @ec2m_dual_mul_opt(ptr noundef %289, ptr noundef %294, ptr noundef %295, ptr noundef %298, ptr noundef %299, ptr noundef %300)
  store i32 %301, ptr %17, align 4, !tbaa !9
  %302 = load i32, ptr %17, align 4, !tbaa !9
  %303 = icmp ne i32 %302, 0
  br i1 %303, label %304, label %306

304:                                              ; preds = %284
  %305 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 302, i32 noundef %305)
  br label %385

306:                                              ; preds = %284
  br label %307

307:                                              ; preds = %306
  br label %308

308:                                              ; preds = %307
  br label %309

309:                                              ; preds = %308, %267
  br label %310

310:                                              ; preds = %309
  %311 = load ptr, ptr %16, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.WordArray_st, ptr %311, i32 0, i32 1
  %313 = load i64, ptr %312, align 8, !tbaa !23
  %314 = mul i64 %313, 2
  %315 = call ptr @wa_alloc(i64 noundef %314)
  store ptr %315, ptr %14, align 8, !tbaa !5
  %316 = icmp eq ptr null, %315
  br i1 %316, label %317, label %319

317:                                              ; preds = %310
  store i32 2, ptr %17, align 4, !tbaa !9
  %318 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 305, i32 noundef %318)
  br label %385

319:                                              ; preds = %310
  br label %320

320:                                              ; preds = %319
  br label %321

321:                                              ; preds = %320
  br label %322

322:                                              ; preds = %321
  %323 = load ptr, ptr %16, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.WordArray_st, ptr %323, i32 0, i32 1
  %325 = load i64, ptr %324, align 8, !tbaa !23
  %326 = call ptr @wa_alloc(i64 noundef %325)
  store ptr %326, ptr %9, align 8, !tbaa !5
  %327 = icmp eq ptr null, %326
  br i1 %327, label %328, label %330

328:                                              ; preds = %322
  store i32 2, ptr %17, align 4, !tbaa !9
  %329 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 306, i32 noundef %329)
  br label %385

330:                                              ; preds = %322
  br label %331

331:                                              ; preds = %330
  br label %332

332:                                              ; preds = %331
  br label %333

333:                                              ; preds = %332
  %334 = load ptr, ptr %15, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.ECPoint_st, ptr %334, i32 0, i32 0
  %336 = load ptr, ptr %335, align 8, !tbaa !34
  %337 = load ptr, ptr %14, align 8, !tbaa !5
  %338 = call i32 @wa_copy(ptr noundef %336, ptr noundef %337)
  store i32 %338, ptr %17, align 4, !tbaa !9
  %339 = load i32, ptr %17, align 4, !tbaa !9
  %340 = icmp ne i32 %339, 0
  br i1 %340, label %341, label %343

341:                                              ; preds = %333
  %342 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 309, i32 noundef %342)
  br label %385

343:                                              ; preds = %333
  br label %344

344:                                              ; preds = %343
  br label %345

345:                                              ; preds = %344
  %346 = load ptr, ptr %14, align 8, !tbaa !5
  %347 = load ptr, ptr %16, align 8, !tbaa !5
  %348 = load ptr, ptr %9, align 8, !tbaa !5
  call void @int_div(ptr noundef %346, ptr noundef %347, ptr noundef null, ptr noundef %348)
  %349 = load ptr, ptr %9, align 8, !tbaa !5
  %350 = load ptr, ptr %10, align 8, !tbaa !5
  %351 = load ptr, ptr %9, align 8, !tbaa !5
  %352 = call i64 @int_add(ptr noundef %349, ptr noundef %350, ptr noundef %351)
  %353 = icmp ugt i64 %352, 0
  br i1 %353, label %359, label %354

354:                                              ; preds = %345
  %355 = load ptr, ptr %9, align 8, !tbaa !5
  %356 = load ptr, ptr %16, align 8, !tbaa !5
  %357 = call i32 @int_cmp(ptr noundef %355, ptr noundef %356)
  %358 = icmp sge i32 %357, 0
  br i1 %358, label %359, label %374

359:                                              ; preds = %354, %345
  br label %360

360:                                              ; preds = %359
  %361 = load ptr, ptr %9, align 8, !tbaa !5
  %362 = load ptr, ptr %14, align 8, !tbaa !5
  %363 = call i32 @wa_copy(ptr noundef %361, ptr noundef %362)
  store i32 %363, ptr %17, align 4, !tbaa !9
  %364 = load i32, ptr %17, align 4, !tbaa !9
  %365 = icmp ne i32 %364, 0
  br i1 %365, label %366, label %368

366:                                              ; preds = %360
  %367 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_add(ptr noundef @.str, i64 noundef 313, i32 noundef %367)
  br label %385

368:                                              ; preds = %360
  br label %369

369:                                              ; preds = %368
  br label %370

370:                                              ; preds = %369
  %371 = load ptr, ptr %14, align 8, !tbaa !5
  %372 = load ptr, ptr %16, align 8, !tbaa !5
  %373 = load ptr, ptr %9, align 8, !tbaa !5
  call void @int_div(ptr noundef %371, ptr noundef %372, ptr noundef null, ptr noundef %373)
  br label %374

374:                                              ; preds = %370, %354
  %375 = load ptr, ptr %9, align 8, !tbaa !5
  %376 = load ptr, ptr %11, align 8, !tbaa !5
  %377 = call i32 @wa_cmp(ptr noundef %375, ptr noundef %376)
  %378 = icmp ne i32 %377, 0
  br i1 %378, label %379, label %384

379:                                              ; preds = %374
  br label %380

380:                                              ; preds = %379
  store i32 3, ptr %17, align 4, !tbaa !9
  %381 = load i32, ptr %17, align 4, !tbaa !9
  call void @stacktrace_create(ptr noundef @.str, i64 noundef 319, i32 noundef %381, ptr noundef null)
  br label %385

382:                                              ; No predecessors!
  br label %383

383:                                              ; preds = %382
  br label %384

384:                                              ; preds = %383, %374
  br label %385

385:                                              ; preds = %384, %380, %366, %341, %328, %317, %304, %279, %263, %238, %200, %177, %158, %144, %107, %93, %74, %57, %45, %37, %29, %21
  %386 = load ptr, ptr %10, align 8, !tbaa !5
  call void @wa_free(ptr noundef %386)
  %387 = load ptr, ptr %11, align 8, !tbaa !5
  call void @wa_free(ptr noundef %387)
  %388 = load ptr, ptr %12, align 8, !tbaa !5
  call void @wa_free(ptr noundef %388)
  %389 = load ptr, ptr %13, align 8, !tbaa !5
  call void @wa_free(ptr noundef %389)
  %390 = load ptr, ptr %14, align 8, !tbaa !5
  call void @wa_free(ptr noundef %390)
  %391 = load ptr, ptr %9, align 8, !tbaa !5
  call void @wa_free(ptr noundef %391)
  %392 = load ptr, ptr %15, align 8, !tbaa !5
  call void @ec_point_free(ptr noundef %392)
  %393 = load i32, ptr %17, align 4, !tbaa !9
  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 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 %393
}

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 i64 @int_add(ptr noundef, ptr noundef, ptr noundef) #1

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

declare i32 @wa_cmp(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, !13, i64 33}
!12 = !{!"EcCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !13, i64 32, !13, i64 33}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{i8 0, i8 2}
!15 = !{}
!16 = !{!12, !6, i64 0}
!17 = !{!18, !6, i64 16}
!18 = !{!"EcParamsCtx_st", !10, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !13, i64 40, !19, i64 48, !6, i64 56, !6, i64 64, !10, i64 72, !6, i64 80}
!19 = !{!"long", !7, i64 0}
!20 = !{!21, !6, i64 0}
!21 = !{!"ByteArray_st", !6, i64 0, !19, i64 8}
!22 = !{!21, !19, i64 8}
!23 = !{!24, !19, i64 8}
!24 = !{!"WordArray_st", !6, i64 0, !19, i64 8}
!25 = !{!18, !10, i64 0}
!26 = !{!18, !6, i64 24}
!27 = !{!28, !19, i64 32}
!28 = !{!"EcGfpCtx_st", !6, i64 0, !6, i64 8, !6, i64 16, !13, i64 24, !19, i64 32}
!29 = !{!18, !6, i64 80}
!30 = !{!12, !6, i64 24}
!31 = !{!18, !6, i64 32}
!32 = !{!33, !19, i64 24}
!33 = !{!"EC2m_st", !6, i64 0, !19, i64 8, !6, i64 16, !19, i64 24}
!34 = !{!35, !6, i64 0}
!35 = !{!"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 i32 @ec2m_dual_mul_opt(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

declare void @ec_point_free(ptr noundef) local_unnamed_addr #0

declare ptr @wa_alloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local i32 @sm2dsa_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 251, i32 noundef 2, ptr noundef null) #2
  br label %151

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

54:                                               ; preds = %51
  %55 = load ptr, ptr %1, align 8, !tbaa !18
  %56 = getelementptr inbounds i8, ptr %1, i64 8
  %57 = load i64, ptr %56, align 8, !tbaa !20
  %58 = tail call ptr @wa_alloc_from_be(ptr noundef %55, i64 noundef %57) #2
  %59 = icmp eq ptr %58, null
  br i1 %59, label %60, label %61

60:                                               ; preds = %54
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 280, i32 noundef 2) #2
  br label %151

61:                                               ; preds = %54
  %62 = getelementptr inbounds i8, ptr %58, i64 8
  %63 = load i64, ptr %62, align 8, !tbaa !21
  %64 = load i64, ptr %35, align 8, !tbaa !21
  %.not151 = icmp ult i64 %63, %64
  br i1 %.not151, label %71, label %65

65:                                               ; preds = %61
  %66 = tail call ptr @wa_alloc(i64 noundef %64) #2
  %67 = icmp eq ptr %66, null
  br i1 %67, label %68, label %69

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

69:                                               ; preds = %65
  tail call void @int_div(ptr noundef nonnull %58, ptr noundef nonnull %20, ptr noundef null, ptr noundef nonnull %66) #2
  %70 = tail call i32 @wa_copy(ptr noundef nonnull %66, ptr noundef nonnull %58) #2
  tail call void @wa_free(ptr noundef nonnull %66) #2
  %.pre = load i64, ptr %35, align 8, !tbaa !21
  br label %71

71:                                               ; preds = %69, %61
  %72 = phi i64 [ %.pre, %69 ], [ %64, %61 ]
  tail call void @wa_change_len(ptr noundef nonnull %58, i64 noundef %72) #2
  %73 = load i64, ptr %35, align 8, !tbaa !21
  %74 = tail call ptr @wa_alloc(i64 noundef %73) #2
  %75 = icmp eq ptr %74, null
  br i1 %75, label %76, label %77

76:                                               ; preds = %71
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 290, i32 noundef 2) #2
  br label %151

77:                                               ; preds = %71
  %78 = tail call i64 @int_add(ptr noundef nonnull %24, ptr noundef nonnull %31, ptr noundef nonnull %74) #2
  %.not152 = icmp eq i64 %78, 0
  br i1 %.not152, label %79, label %82

79:                                               ; preds = %77
  %80 = tail call i32 @int_cmp(ptr noundef nonnull %74, ptr noundef nonnull %20) #2
  %81 = icmp sgt i32 %80, -1
  br i1 %81, label %82, label %84

82:                                               ; preds = %79, %77
  %83 = tail call i32 @int_sub(ptr noundef nonnull %74, ptr noundef nonnull %20, ptr noundef nonnull %74) #2
  br label %84

84:                                               ; preds = %82, %79
  %85 = load ptr, ptr %0, align 8, !tbaa !13
  %86 = load i32, ptr %85, align 8, !tbaa !23
  %87 = icmp eq i32 %86, 0
  br i1 %87, label %88, label %106

88:                                               ; preds = %84
  %89 = getelementptr inbounds i8, ptr %85, i64 24
  %90 = load ptr, ptr %89, align 8, !tbaa !24
  %91 = getelementptr inbounds i8, ptr %90, i64 32
  %92 = load i64, ptr %91, align 8, !tbaa !25
  %93 = tail call ptr @ec_point_alloc(i64 noundef %92) #2
  %94 = icmp eq ptr %93, null
  br i1 %94, label %95, label %96

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

96:                                               ; preds = %88
  %97 = load ptr, ptr %0, align 8, !tbaa !13
  %98 = getelementptr inbounds i8, ptr %97, i64 24
  %99 = load ptr, ptr %98, align 8, !tbaa !24
  %100 = getelementptr inbounds i8, ptr %97, i64 80
  %101 = load ptr, ptr %100, align 8, !tbaa !27
  %102 = getelementptr inbounds i8, ptr %0, i64 24
  %103 = load ptr, ptr %102, align 8, !tbaa !28
  %104 = tail call i32 @ecp_dual_mul_opt(ptr noundef %99, ptr noundef %101, ptr noundef nonnull %31, ptr noundef %103, ptr noundef nonnull %74, ptr noundef nonnull %93) #2
  %.not154 = icmp eq i32 %104, 0
  br i1 %.not154, label %124, label %105

105:                                              ; preds = %96
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 298, i32 noundef %104) #2
  br label %151

106:                                              ; preds = %84
  %107 = getelementptr inbounds i8, ptr %85, i64 32
  %108 = load ptr, ptr %107, align 8, !tbaa !29
  %109 = getelementptr inbounds i8, ptr %108, i64 24
  %110 = load i64, ptr %109, align 8, !tbaa !30
  %111 = tail call ptr @ec_point_alloc(i64 noundef %110) #2
  %112 = icmp eq ptr %111, null
  br i1 %112, label %113, label %114

113:                                              ; preds = %106
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 301, i32 noundef 2) #2
  br label %151

114:                                              ; preds = %106
  %115 = load ptr, ptr %0, align 8, !tbaa !13
  %116 = getelementptr inbounds i8, ptr %115, i64 32
  %117 = load ptr, ptr %116, align 8, !tbaa !29
  %118 = getelementptr inbounds i8, ptr %115, i64 80
  %119 = load ptr, ptr %118, align 8, !tbaa !27
  %120 = getelementptr inbounds i8, ptr %0, i64 24
  %121 = load ptr, ptr %120, align 8, !tbaa !28
  %122 = tail call i32 @ec2m_dual_mul_opt(ptr noundef %117, ptr noundef %119, ptr noundef nonnull %31, ptr noundef %121, ptr noundef nonnull %74, ptr noundef nonnull %111) #2
  %.not153 = icmp eq i32 %122, 0
  br i1 %.not153, label %124, label %123

123:                                              ; preds = %114
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 302, i32 noundef %122) #2
  br label %151

124:                                              ; preds = %96, %114
  %.0110 = phi ptr [ %93, %96 ], [ %111, %114 ]
  %125 = load i64, ptr %35, align 8, !tbaa !21
  %126 = shl i64 %125, 1
  %127 = tail call ptr @wa_alloc(i64 noundef %126) #2
  %128 = icmp eq ptr %127, null
  br i1 %128, label %129, label %130

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

130:                                              ; preds = %124
  %131 = load i64, ptr %35, align 8, !tbaa !21
  %132 = tail call ptr @wa_alloc(i64 noundef %131) #2
  %133 = icmp eq ptr %132, null
  br i1 %133, label %134, label %135

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

135:                                              ; preds = %130
  %136 = load ptr, ptr %.0110, align 8, !tbaa !32
  %137 = tail call i32 @wa_copy(ptr noundef %136, ptr noundef nonnull %127) #2
  %.not155 = icmp eq i32 %137, 0
  br i1 %.not155, label %139, label %138

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

139:                                              ; preds = %135
  tail call void @int_div(ptr noundef nonnull %127, ptr noundef nonnull %20, ptr noundef null, ptr noundef nonnull %132) #2
  %140 = tail call i64 @int_add(ptr noundef nonnull %132, ptr noundef nonnull %58, ptr noundef nonnull %132) #2
  %.not156 = icmp eq i64 %140, 0
  br i1 %.not156, label %141, label %144

141:                                              ; preds = %139
  %142 = tail call i32 @int_cmp(ptr noundef nonnull %132, ptr noundef nonnull %20) #2
  %143 = icmp sgt i32 %142, -1
  br i1 %143, label %144, label %148

144:                                              ; preds = %139, %141
  %145 = tail call i32 @wa_copy(ptr noundef nonnull %132, ptr noundef nonnull %127) #2
  %.not157 = icmp eq i32 %145, 0
  br i1 %.not157, label %147, label %146

146:                                              ; preds = %144
  tail call void @stacktrace_add(ptr noundef nonnull @.str, i64 noundef 313, i32 noundef %145) #2
  br label %151

147:                                              ; preds = %144
  tail call void @int_div(ptr noundef nonnull %127, ptr noundef nonnull %20, ptr noundef null, ptr noundef nonnull %132) #2
  br label %148

148:                                              ; preds = %147, %141
  %149 = tail call i32 @wa_cmp(ptr noundef nonnull %132, ptr noundef nonnull %24) #2
  %.not158 = icmp eq i32 %149, 0
  br i1 %.not158, label %151, label %150

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

151:                                              ; preds = %148, %150, %146, %138, %134, %129, %123, %113, %105, %95, %76, %68, %60, %53, %33, %26, %16, %11, %9, %7, %5
  %.0118 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %60 ], [ null, %68 ], [ null, %76 ], [ null, %95 ], [ null, %105 ], [ null, %129 ], [ null, %134 ], [ %132, %138 ], [ %132, %146 ], [ %132, %150 ], [ %132, %148 ], [ null, %113 ], [ null, %123 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0117 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %60 ], [ %58, %68 ], [ %58, %76 ], [ %58, %95 ], [ %58, %105 ], [ %58, %129 ], [ %58, %134 ], [ %58, %138 ], [ %58, %146 ], [ %58, %150 ], [ %58, %148 ], [ %58, %113 ], [ %58, %123 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0116 = phi ptr [ null, %16 ], [ null, %26 ], [ %24, %33 ], [ %24, %53 ], [ %24, %60 ], [ %24, %68 ], [ %24, %76 ], [ %24, %95 ], [ %24, %105 ], [ %24, %129 ], [ %24, %134 ], [ %24, %138 ], [ %24, %146 ], [ %24, %150 ], [ %24, %148 ], [ %24, %113 ], [ %24, %123 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0115 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ %31, %53 ], [ %31, %60 ], [ %31, %68 ], [ %31, %76 ], [ %31, %95 ], [ %31, %105 ], [ %31, %129 ], [ %31, %134 ], [ %31, %138 ], [ %31, %146 ], [ %31, %150 ], [ %31, %148 ], [ %31, %113 ], [ %31, %123 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.0114 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %60 ], [ null, %68 ], [ null, %76 ], [ %74, %95 ], [ %74, %105 ], [ %74, %129 ], [ %74, %134 ], [ %74, %138 ], [ %74, %146 ], [ %74, %150 ], [ %74, %148 ], [ %74, %113 ], [ %74, %123 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.1113 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %60 ], [ null, %68 ], [ null, %76 ], [ null, %95 ], [ null, %105 ], [ null, %129 ], [ %127, %134 ], [ %127, %138 ], [ %127, %146 ], [ %127, %150 ], [ %127, %148 ], [ null, %113 ], [ null, %123 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.1111 = phi ptr [ null, %16 ], [ null, %26 ], [ null, %33 ], [ null, %53 ], [ null, %60 ], [ null, %68 ], [ null, %76 ], [ null, %95 ], [ %93, %105 ], [ %.0110, %129 ], [ %.0110, %134 ], [ %.0110, %138 ], [ %.0110, %146 ], [ %.0110, %150 ], [ %.0110, %148 ], [ null, %113 ], [ %111, %123 ], [ null, %11 ], [ null, %9 ], [ null, %7 ], [ null, %5 ]
  %.1 = phi i32 [ 14, %16 ], [ 2, %26 ], [ 2, %33 ], [ 3, %53 ], [ 2, %60 ], [ 2, %68 ], [ 2, %76 ], [ 2, %95 ], [ %104, %105 ], [ 2, %129 ], [ 2, %134 ], [ %137, %138 ], [ %145, %146 ], [ 3, %150 ], [ 0, %148 ], [ 2, %113 ], [ %122, %123 ], [ 2, %11 ], [ 2, %9 ], [ 2, %7 ], [ 2, %5 ]
  tail call void @wa_free(ptr noundef %.0117) #2
  tail call void @wa_free(ptr noundef %.0116) #2
  tail call void @wa_free(ptr noundef %.0115) #2
  tail call void @wa_free(ptr noundef %.0114) #2
  tail call void @wa_free(ptr noundef %.1113) #2
  tail call void @wa_free(ptr noundef %.0118) #2
  tail call void @ec_point_free(ptr noundef %.1111) #2
  ret i32 %.1
}

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 i64 @int_add(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 i32 @wa_cmp(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, !10, i64 33}
!6 = !{!"EcCtx_st", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !10, i64 32, !10, i64 33}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"_Bool", !8, i64 0}
!11 = !{i8 0, i8 2}
!12 = !{}
!13 = !{!6, !7, i64 0}
!14 = !{!15, !7, i64 16}
!15 = !{!"EcParamsCtx_st", !16, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !10, i64 40, !17, i64 48, !7, i64 56, !7, i64 64, !16, i64 72, !7, i64 80}
!16 = !{!"int", !8, i64 0}
!17 = !{!"long", !8, i64 0}
!18 = !{!19, !7, i64 0}
!19 = !{!"ByteArray_st", !7, i64 0, !17, i64 8}
!20 = !{!19, !17, i64 8}
!21 = !{!22, !17, i64 8}
!22 = !{!"WordArray_st", !7, i64 0, !17, i64 8}
!23 = !{!15, !16, i64 0}
!24 = !{!15, !7, i64 24}
!25 = !{!26, !17, i64 32}
!26 = !{!"EcGfpCtx_st", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !17, i64 32}
!27 = !{!15, !7, i64 80}
!28 = !{!6, !7, i64 24}
!29 = !{!15, !7, i64 32}
!30 = !{!31, !17, i64 24}
!31 = !{!"EC2m_st", !7, i64 0, !17, i64 8, !7, i64 16, !17, i64 24}
!32 = !{!33, !7, i64 0}
!33 = !{!"ECPoint_st", !7, i64 0, !7, i64 8, !7, i64 16}


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