; LLVM IR from Water-Melon/Melon :: src (mln_rsa)

; 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.mln_string_t = type { ptr, i64, i32 }
%struct.mln_rsa_key_t = type { %struct.mln_bignum_t, %struct.mln_bignum_t, %struct.mln_bignum_t, %struct.mln_bignum_t, %struct.mln_bignum_t, %struct.mln_bignum_t, %struct.mln_bignum_t, i8 }
%struct.mln_bignum_t = type { i32, i32, [257 x i64] }

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #0

; Function Attrs: nounwind
declare void @free(ptr noundef) #1

declare void @mln_alloc_free(ptr noundef) #2

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #4

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

declare ptr @mln_string_dup(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local ptr @mln_RSAESPKCS1V15_private_encrypt(ptr noundef nonnull, ptr noundef nonnull) #5

; Function Attrs: nounwind uwtable
define dso_local ptr @mln_RSASSAPKCS1V15_sign(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef %3) #5 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca %struct.mln_string_t, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca i32, align 4
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca i64, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #8
  store ptr null, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 24, ptr %11) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #8
  store i64 4096, ptr %16, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #8
  %28 = load ptr, ptr %7, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.mln_rsa_key_t, ptr %28, i32 0, i32 0
  %30 = getelementptr inbounds %struct.mln_bignum_t, ptr %29, i32 0, i32 1
  %31 = load i32, ptr %30, align 4, !tbaa !13
  %32 = shl i32 %31, 2
  %33 = sub i32 %32, 11
  %34 = zext i32 %33 to i64
  store i64 %34, ptr %19, align 8, !tbaa !11
  %35 = load i64, ptr %19, align 8, !tbaa !11
  %36 = icmp ult i64 %35, 1
  br i1 %36, label %37, label %38

37:                                               ; preds = %4
  store ptr null, ptr %5, align 8
  store i32 1, ptr %20, align 4
  br label %365

38:                                               ; preds = %4
  %39 = load ptr, ptr %6, align 8, !tbaa !5
  %40 = load ptr, ptr %8, align 8, !tbaa !5
  %41 = load i32, ptr %9, align 4, !tbaa !9
  %42 = call ptr @mln_EMSAPKCS1V15_encode(ptr noundef %39, ptr noundef %40, i32 noundef %41)
  store ptr %42, ptr %12, align 8, !tbaa !5
  %43 = icmp eq ptr %42, null
  br i1 %43, label %44, label %45

44:                                               ; preds = %38
  store ptr null, ptr %5, align 8
  store i32 1, ptr %20, align 4
  br label %365

45:                                               ; preds = %38
  %46 = load i64, ptr %16, align 8, !tbaa !11
  %47 = call noalias ptr @malloc(i64 noundef %46) #9
  store ptr %47, ptr %13, align 8, !tbaa !5
  %48 = icmp eq ptr %47, null
  br i1 %48, label %49, label %113

49:                                               ; preds = %45
  br label %50

50:                                               ; preds = %360, %196, %160, %49
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #8
  %51 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %51, ptr %21, align 8, !tbaa !5
  %52 = load ptr, ptr %21, align 8, !tbaa !5
  %53 = icmp ne ptr %52, null
  br i1 %53, label %54, label %112

54:                                               ; preds = %50
  %55 = load ptr, ptr %21, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.mln_string_t, ptr %55, i32 0, i32 2
  %57 = load i32, ptr %56, align 8
  %58 = lshr i32 %57, 2
  %59 = zext i32 %58 to i64
  %60 = add i64 %59, -1
  %61 = trunc i64 %60 to i32
  %62 = load i32, ptr %56, align 8
  %63 = and i32 %61, 1073741823
  %64 = shl i32 %63, 2
  %65 = and i32 %62, 3
  %66 = or i32 %65, %64
  store i32 %66, ptr %56, align 8
  %67 = zext i32 %63 to i64
  %68 = icmp ule i64 %59, 1
  br i1 %68, label %69, label %111

69:                                               ; preds = %54
  %70 = load ptr, ptr %21, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.mln_string_t, ptr %70, i32 0, i32 2
  %72 = load i32, ptr %71, align 8
  %73 = and i32 %72, 1
  %74 = zext i32 %73 to i64
  %75 = icmp ne i64 %74, 0
  br i1 %75, label %98, label %76

76:                                               ; preds = %69
  %77 = load ptr, ptr %21, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.mln_string_t, ptr %77, i32 0, i32 0
  %79 = load ptr, ptr %78, align 8, !tbaa !16
  %80 = icmp ne ptr %79, null
  br i1 %80, label %81, label %98

81:                                               ; preds = %76
  %82 = load ptr, ptr %21, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.mln_string_t, ptr %82, i32 0, i32 2
  %84 = load i32, ptr %83, align 8
  %85 = lshr i32 %84, 1
  %86 = and i32 %85, 1
  %87 = zext i32 %86 to i64
  %88 = icmp ne i64 %87, 0
  br i1 %88, label %89, label %93

89:                                               ; preds = %81
  %90 = load ptr, ptr %21, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.mln_string_t, ptr %90, i32 0, i32 0
  %92 = load ptr, ptr %91, align 8, !tbaa !16
  call void @mln_alloc_free(ptr noundef %92)
  br label %97

93:                                               ; preds = %81
  %94 = load ptr, ptr %21, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.mln_string_t, ptr %94, i32 0, i32 0
  %96 = load ptr, ptr %95, align 8, !tbaa !16
  call void @free(ptr noundef %96) #8
  br label %97

97:                                               ; preds = %93, %89
  br label %98

98:                                               ; preds = %97, %76, %69
  %99 = load ptr, ptr %21, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.mln_string_t, ptr %99, i32 0, i32 2
  %101 = load i32, ptr %100, align 8
  %102 = lshr i32 %101, 1
  %103 = and i32 %102, 1
  %104 = zext i32 %103 to i64
  %105 = icmp ne i64 %104, 0
  br i1 %105, label %106, label %108

106:                                              ; preds = %98
  %107 = load ptr, ptr %21, align 8, !tbaa !5
  call void @mln_alloc_free(ptr noundef %107)
  br label %110

108:                                              ; preds = %98
  %109 = load ptr, ptr %21, align 8, !tbaa !5
  call void @free(ptr noundef %109) #8
  br label %110

110:                                              ; preds = %108, %106
  br label %111

111:                                              ; preds = %110, %54
  br label %112

112:                                              ; preds = %111, %50
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  store ptr null, ptr %5, align 8
  store i32 1, ptr %20, align 4
  br label %365

113:                                              ; preds = %45
  %114 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %114, ptr %14, align 8, !tbaa !5
  %115 = load ptr, ptr %12, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.mln_string_t, ptr %115, i32 0, i32 0
  %117 = load ptr, ptr %116, align 8, !tbaa !16
  store ptr %117, ptr %15, align 8, !tbaa !5
  %118 = load ptr, ptr %12, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.mln_string_t, ptr %118, i32 0, i32 1
  %120 = load i64, ptr %119, align 8, !tbaa !18
  store i64 %120, ptr %17, align 8, !tbaa !11
  br label %121

121:                                              ; preds = %273, %113
  %122 = load i64, ptr %17, align 8, !tbaa !11
  %123 = icmp ugt i64 %122, 0
  br i1 %123, label %124, label %274

124:                                              ; preds = %121
  %125 = load i64, ptr %17, align 8, !tbaa !11
  %126 = load i64, ptr %19, align 8, !tbaa !11
  %127 = icmp ugt i64 %125, %126
  br i1 %127, label %128, label %130

128:                                              ; preds = %124
  %129 = load i64, ptr %19, align 8, !tbaa !11
  br label %132

130:                                              ; preds = %124
  %131 = load i64, ptr %17, align 8, !tbaa !11
  br label %132

132:                                              ; preds = %130, %128
  %133 = phi i64 [ %129, %128 ], [ %131, %130 ]
  store i64 %133, ptr %18, align 8, !tbaa !11
  %134 = load i64, ptr %18, align 8, !tbaa !11
  %135 = load i64, ptr %17, align 8, !tbaa !11
  %136 = sub i64 %135, %134
  store i64 %136, ptr %17, align 8, !tbaa !11
  %137 = load ptr, ptr %15, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 0
  store ptr %137, ptr %138, align 8, !tbaa !16
  %139 = load i64, ptr %18, align 8, !tbaa !11
  %140 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 1
  store i64 %139, ptr %140, align 8, !tbaa !18
  %141 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 2
  %142 = load i32, ptr %141, align 8
  %143 = and i32 %142, -2
  %144 = or i32 %143, 1
  store i32 %144, ptr %141, align 8
  %145 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 2
  %146 = load i32, ptr %145, align 8
  %147 = and i32 %146, -3
  %148 = or i32 %147, 0
  store i32 %148, ptr %145, align 8
  %149 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 2
  %150 = load i32, ptr %149, align 8
  %151 = and i32 %150, 3
  %152 = or i32 %151, 4
  store i32 %152, ptr %149, align 8
  store ptr %11, ptr %22, align 8, !tbaa !5
  %153 = load ptr, ptr %22, align 8, !tbaa !5
  %154 = load i64, ptr %18, align 8, !tbaa !11
  %155 = load ptr, ptr %15, align 8, !tbaa !5
  %156 = getelementptr inbounds i8, ptr %155, i64 %154
  store ptr %156, ptr %15, align 8, !tbaa !5
  %157 = load ptr, ptr %7, align 8, !tbaa !5
  %158 = call ptr @mln_RSAESPKCS1V15_private_encrypt(ptr noundef %157, ptr noundef %11)
  store ptr %158, ptr %10, align 8, !tbaa !5
  %159 = icmp eq ptr %158, null
  br i1 %159, label %160, label %162

160:                                              ; preds = %132
  %161 = load ptr, ptr %13, align 8, !tbaa !5
  call void @free(ptr noundef %161) #8
  br label %50

162:                                              ; preds = %132
  %163 = load i64, ptr %16, align 8, !tbaa !11
  %164 = load ptr, ptr %14, align 8, !tbaa !5
  %165 = load ptr, ptr %13, align 8, !tbaa !5
  %166 = ptrtoint ptr %164 to i64
  %167 = ptrtoint ptr %165 to i64
  %168 = sub i64 %166, %167
  %169 = sub i64 %163, %168
  %170 = load ptr, ptr %10, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.mln_string_t, ptr %170, i32 0, i32 1
  %172 = load i64, ptr %171, align 8, !tbaa !18
  %173 = icmp ult i64 %169, %172
  br i1 %173, label %174, label %199

174:                                              ; preds = %162
  %175 = load i64, ptr %16, align 8, !tbaa !11
  %176 = lshr i64 %175, 1
  %177 = load i64, ptr %16, align 8, !tbaa !11
  %178 = add i64 %177, %176
  store i64 %178, ptr %16, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #8
  %179 = load ptr, ptr %14, align 8, !tbaa !5
  %180 = load ptr, ptr %13, align 8, !tbaa !5
  %181 = ptrtoint ptr %179 to i64
  %182 = ptrtoint ptr %180 to i64
  %183 = sub i64 %181, %182
  store i64 %183, ptr %23, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #8
  %184 = load ptr, ptr %13, align 8, !tbaa !5
  %185 = load i64, ptr %16, align 8, !tbaa !11
  %186 = call ptr @realloc(ptr noundef %184, i64 noundef %185) #10
  store ptr %186, ptr %24, align 8, !tbaa !5
  %187 = load ptr, ptr %24, align 8, !tbaa !5
  %188 = icmp eq ptr %187, null
  br i1 %188, label %189, label %191

189:                                              ; preds = %174
  %190 = load ptr, ptr %13, align 8, !tbaa !5
  call void @free(ptr noundef %190) #8
  store i32 2, ptr %20, align 4
  br label %196

191:                                              ; preds = %174
  %192 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %192, ptr %13, align 8, !tbaa !5
  %193 = load ptr, ptr %24, align 8, !tbaa !5
  %194 = load i64, ptr %23, align 8, !tbaa !11
  %195 = getelementptr inbounds i8, ptr %193, i64 %194
  store ptr %195, ptr %14, align 8, !tbaa !5
  store i32 0, ptr %20, align 4
  br label %196

196:                                              ; preds = %191, %189
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  %197 = load i32, ptr %20, align 4
  switch i32 %197, label %367 [
    i32 0, label %198
    i32 2, label %50
  ]

198:                                              ; preds = %196
  br label %199

199:                                              ; preds = %198, %162
  %200 = load ptr, ptr %14, align 8, !tbaa !5
  %201 = load ptr, ptr %10, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.mln_string_t, ptr %201, i32 0, i32 0
  %203 = load ptr, ptr %202, align 8, !tbaa !16
  %204 = load ptr, ptr %10, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.mln_string_t, ptr %204, i32 0, i32 1
  %206 = load i64, ptr %205, align 8, !tbaa !18
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %200, ptr align 1 %203, i64 %206, i1 false)
  %207 = load ptr, ptr %10, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.mln_string_t, ptr %207, i32 0, i32 1
  %209 = load i64, ptr %208, align 8, !tbaa !18
  %210 = load ptr, ptr %14, align 8, !tbaa !5
  %211 = getelementptr inbounds i8, ptr %210, i64 %209
  store ptr %211, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #8
  %212 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %212, ptr %25, align 8, !tbaa !5
  %213 = load ptr, ptr %25, align 8, !tbaa !5
  %214 = icmp ne ptr %213, null
  br i1 %214, label %215, label %273

215:                                              ; preds = %199
  %216 = load ptr, ptr %25, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.mln_string_t, ptr %216, i32 0, i32 2
  %218 = load i32, ptr %217, align 8
  %219 = lshr i32 %218, 2
  %220 = zext i32 %219 to i64
  %221 = add i64 %220, -1
  %222 = trunc i64 %221 to i32
  %223 = load i32, ptr %217, align 8
  %224 = and i32 %222, 1073741823
  %225 = shl i32 %224, 2
  %226 = and i32 %223, 3
  %227 = or i32 %226, %225
  store i32 %227, ptr %217, align 8
  %228 = zext i32 %224 to i64
  %229 = icmp ule i64 %220, 1
  br i1 %229, label %230, label %272

230:                                              ; preds = %215
  %231 = load ptr, ptr %25, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.mln_string_t, ptr %231, i32 0, i32 2
  %233 = load i32, ptr %232, align 8
  %234 = and i32 %233, 1
  %235 = zext i32 %234 to i64
  %236 = icmp ne i64 %235, 0
  br i1 %236, label %259, label %237

237:                                              ; preds = %230
  %238 = load ptr, ptr %25, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.mln_string_t, ptr %238, i32 0, i32 0
  %240 = load ptr, ptr %239, align 8, !tbaa !16
  %241 = icmp ne ptr %240, null
  br i1 %241, label %242, label %259

242:                                              ; preds = %237
  %243 = load ptr, ptr %25, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.mln_string_t, ptr %243, i32 0, i32 2
  %245 = load i32, ptr %244, align 8
  %246 = lshr i32 %245, 1
  %247 = and i32 %246, 1
  %248 = zext i32 %247 to i64
  %249 = icmp ne i64 %248, 0
  br i1 %249, label %250, label %254

250:                                              ; preds = %242
  %251 = load ptr, ptr %25, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.mln_string_t, ptr %251, i32 0, i32 0
  %253 = load ptr, ptr %252, align 8, !tbaa !16
  call void @mln_alloc_free(ptr noundef %253)
  br label %258

254:                                              ; preds = %242
  %255 = load ptr, ptr %25, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.mln_string_t, ptr %255, i32 0, i32 0
  %257 = load ptr, ptr %256, align 8, !tbaa !16
  call void @free(ptr noundef %257) #8
  br label %258

258:                                              ; preds = %254, %250
  br label %259

259:                                              ; preds = %258, %237, %230
  %260 = load ptr, ptr %25, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.mln_string_t, ptr %260, i32 0, i32 2
  %262 = load i32, ptr %261, align 8
  %263 = lshr i32 %262, 1
  %264 = and i32 %263, 1
  %265 = zext i32 %264 to i64
  %266 = icmp ne i64 %265, 0
  br i1 %266, label %267, label %269

267:                                              ; preds = %259
  %268 = load ptr, ptr %25, align 8, !tbaa !5
  call void @mln_alloc_free(ptr noundef %268)
  br label %271

269:                                              ; preds = %259
  %270 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %270) #8
  br label %271

271:                                              ; preds = %269, %267
  br label %272

272:                                              ; preds = %271, %215
  br label %273

273:                                              ; preds = %272, %199
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #8
  br label %121, !llvm.loop !19

274:                                              ; preds = %121
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #8
  %275 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %275, ptr %26, align 8, !tbaa !5
  %276 = load ptr, ptr %26, align 8, !tbaa !5
  %277 = icmp ne ptr %276, null
  br i1 %277, label %278, label %336

278:                                              ; preds = %274
  %279 = load ptr, ptr %26, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.mln_string_t, ptr %279, i32 0, i32 2
  %281 = load i32, ptr %280, align 8
  %282 = lshr i32 %281, 2
  %283 = zext i32 %282 to i64
  %284 = add i64 %283, -1
  %285 = trunc i64 %284 to i32
  %286 = load i32, ptr %280, align 8
  %287 = and i32 %285, 1073741823
  %288 = shl i32 %287, 2
  %289 = and i32 %286, 3
  %290 = or i32 %289, %288
  store i32 %290, ptr %280, align 8
  %291 = zext i32 %287 to i64
  %292 = icmp ule i64 %283, 1
  br i1 %292, label %293, label %335

293:                                              ; preds = %278
  %294 = load ptr, ptr %26, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.mln_string_t, ptr %294, i32 0, i32 2
  %296 = load i32, ptr %295, align 8
  %297 = and i32 %296, 1
  %298 = zext i32 %297 to i64
  %299 = icmp ne i64 %298, 0
  br i1 %299, label %322, label %300

300:                                              ; preds = %293
  %301 = load ptr, ptr %26, align 8, !tbaa !5
  %302 = getelementptr inbounds %struct.mln_string_t, ptr %301, i32 0, i32 0
  %303 = load ptr, ptr %302, align 8, !tbaa !16
  %304 = icmp ne ptr %303, null
  br i1 %304, label %305, label %322

305:                                              ; preds = %300
  %306 = load ptr, ptr %26, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.mln_string_t, ptr %306, i32 0, i32 2
  %308 = load i32, ptr %307, align 8
  %309 = lshr i32 %308, 1
  %310 = and i32 %309, 1
  %311 = zext i32 %310 to i64
  %312 = icmp ne i64 %311, 0
  br i1 %312, label %313, label %317

313:                                              ; preds = %305
  %314 = load ptr, ptr %26, align 8, !tbaa !5
  %315 = getelementptr inbounds %struct.mln_string_t, ptr %314, i32 0, i32 0
  %316 = load ptr, ptr %315, align 8, !tbaa !16
  call void @mln_alloc_free(ptr noundef %316)
  br label %321

317:                                              ; preds = %305
  %318 = load ptr, ptr %26, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.mln_string_t, ptr %318, i32 0, i32 0
  %320 = load ptr, ptr %319, align 8, !tbaa !16
  call void @free(ptr noundef %320) #8
  br label %321

321:                                              ; preds = %317, %313
  br label %322

322:                                              ; preds = %321, %300, %293
  %323 = load ptr, ptr %26, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.mln_string_t, ptr %323, i32 0, i32 2
  %325 = load i32, ptr %324, align 8
  %326 = lshr i32 %325, 1
  %327 = and i32 %326, 1
  %328 = zext i32 %327 to i64
  %329 = icmp ne i64 %328, 0
  br i1 %329, label %330, label %332

330:                                              ; preds = %322
  %331 = load ptr, ptr %26, align 8, !tbaa !5
  call void @mln_alloc_free(ptr noundef %331)
  br label %334

332:                                              ; preds = %322
  %333 = load ptr, ptr %26, align 8, !tbaa !5
  call void @free(ptr noundef %333) #8
  br label %334

334:                                              ; preds = %332, %330
  br label %335

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

336:                                              ; preds = %335, %274
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #8
  %337 = load ptr, ptr %13, align 8, !tbaa !5
  %338 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 0
  store ptr %337, ptr %338, align 8, !tbaa !16
  %339 = load ptr, ptr %14, align 8, !tbaa !5
  %340 = load ptr, ptr %13, align 8, !tbaa !5
  %341 = ptrtoint ptr %339 to i64
  %342 = ptrtoint ptr %340 to i64
  %343 = sub i64 %341, %342
  %344 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 1
  store i64 %343, ptr %344, align 8, !tbaa !18
  %345 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 2
  %346 = load i32, ptr %345, align 8
  %347 = and i32 %346, -2
  %348 = or i32 %347, 1
  store i32 %348, ptr %345, align 8
  %349 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 2
  %350 = load i32, ptr %349, align 8
  %351 = and i32 %350, -3
  %352 = or i32 %351, 0
  store i32 %352, ptr %349, align 8
  %353 = getelementptr inbounds %struct.mln_string_t, ptr %11, i32 0, i32 2
  %354 = load i32, ptr %353, align 8
  %355 = and i32 %354, 3
  %356 = or i32 %355, 4
  store i32 %356, ptr %353, align 8
  store ptr %11, ptr %27, align 8, !tbaa !5
  %357 = load ptr, ptr %27, align 8, !tbaa !5
  %358 = call ptr @mln_string_dup(ptr noundef %11)
  store ptr %358, ptr %10, align 8, !tbaa !5
  %359 = icmp eq ptr %358, null
  br i1 %359, label %360, label %362

360:                                              ; preds = %336
  %361 = load ptr, ptr %13, align 8, !tbaa !5
  call void @free(ptr noundef %361) #8
  br label %50

362:                                              ; preds = %336
  %363 = load ptr, ptr %13, align 8, !tbaa !5
  call void @free(ptr noundef %363) #8
  %364 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %364, ptr %5, align 8
  store i32 1, ptr %20, align 4
  br label %365

365:                                              ; preds = %362, %112, %44, %37
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #8
  %366 = load ptr, ptr %5, align 8
  ret ptr %366

367:                                              ; preds = %196
  unreachable
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @mln_EMSAPKCS1V15_encode(ptr noundef, ptr noundef, i32 noundef) #6

; Function Attrs: nounwind allocsize(1)
declare ptr @realloc(ptr noundef, i64 noundef) #7

attributes #0 = { nounwind allocsize(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 "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 = { "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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { 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 #6 = { inlinehint 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 #7 = { nounwind allocsize(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 #8 = { nounwind }
attributes #9 = { nounwind allocsize(0) }
attributes #10 = { nounwind allocsize(1) }

!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, !12, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!14, !10, i64 4}
!14 = !{!"", !15, i64 0, !15, i64 2064, !15, i64 4128, !15, i64 6192, !15, i64 8256, !15, i64 10320, !15, i64 12384, !10, i64 14448}
!15 = !{!"", !10, i64 0, !10, i64 4, !7, i64 8}
!16 = !{!17, !6, i64 0}
!17 = !{!"", !6, i64 0, !12, i64 8, !12, i64 16, !12, i64 16, !12, i64 16}
!18 = !{!17, !12, i64 8}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}


; 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"

%struct.mln_string_t = type { ptr, i64, i32 }

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #1

declare void @mln_alloc_free(ptr noundef) local_unnamed_addr #2

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

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #4

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

declare ptr @mln_string_dup(ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local ptr @mln_RSAESPKCS1V15_private_encrypt(ptr noundef nonnull, ptr noundef nonnull) local_unnamed_addr #5

; Function Attrs: nounwind uwtable
define dso_local ptr @mln_RSASSAPKCS1V15_sign(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef %3) local_unnamed_addr #5 {
  %5 = alloca %struct.mln_string_t, align 8
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %5) #9
  %6 = getelementptr inbounds i8, ptr %1, i64 4
  %7 = load i32, ptr %6, align 4, !tbaa !5
  %8 = shl i32 %7, 2
  %9 = add i32 %8, -11
  %10 = zext i32 %9 to i64
  %11 = tail call ptr @mln_EMSAPKCS1V15_encode(ptr noundef nonnull %0, ptr noundef nonnull %2, i32 noundef %3)
  %12 = icmp eq ptr %11, null
  br i1 %12, label %118, label %13

13:                                               ; preds = %4
  %14 = tail call noalias dereferenceable_or_null(4096) ptr @malloc(i64 noundef 4096) #10
  %15 = icmp eq ptr %14, null
  br i1 %15, label %16, label %37

.sink.split:                                      ; preds = %57, %43, %109
  %.084127.lcssa131.sink = phi ptr [ %.084.lcssa, %109 ], [ %.084127, %43 ], [ %.084127, %57 ]
  call void @free(ptr noundef %.084127.lcssa131.sink) #9
  br label %16

16:                                               ; preds = %.sink.split, %13
  %17 = getelementptr inbounds i8, ptr %11, i64 16
  %18 = load i32, ptr %17, align 8
  %19 = and i32 %18, -4
  %20 = add i32 %19, -4
  %21 = and i32 %18, 3
  %22 = or disjoint i32 %20, %21
  store i32 %22, ptr %17, align 8
  %23 = icmp ult i32 %18, 8
  br i1 %23, label %24, label %118

24:                                               ; preds = %16
  %25 = and i32 %18, 1
  %.not110 = icmp eq i32 %25, 0
  br i1 %.not110, label %26, label %32

26:                                               ; preds = %24
  %27 = load ptr, ptr %11, align 8, !tbaa !11
  %.not111 = icmp eq ptr %27, null
  br i1 %.not111, label %32, label %28

28:                                               ; preds = %26
  %29 = and i32 %18, 2
  %.not112 = icmp eq i32 %29, 0
  br i1 %.not112, label %31, label %30

30:                                               ; preds = %28
  call void @mln_alloc_free(ptr noundef nonnull %27) #9
  br label %32

31:                                               ; preds = %28
  call void @free(ptr noundef nonnull %27) #9
  br label %32

32:                                               ; preds = %30, %31, %26, %24
  %33 = load i32, ptr %17, align 8
  %34 = and i32 %33, 2
  %.not113 = icmp eq i32 %34, 0
  br i1 %.not113, label %36, label %35

35:                                               ; preds = %32
  call void @mln_alloc_free(ptr noundef nonnull %11) #9
  br label %118

36:                                               ; preds = %32
  call void @free(ptr noundef nonnull %11) #9
  br label %118

37:                                               ; preds = %13
  %38 = getelementptr inbounds i8, ptr %11, i64 8
  %39 = load i64, ptr %38, align 8, !tbaa !15
  %.not122 = icmp eq i64 %39, 0
  br i1 %.not122, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %37
  %40 = load ptr, ptr %11, align 8, !tbaa !11
  %41 = getelementptr inbounds i8, ptr %5, i64 8
  %42 = getelementptr inbounds i8, ptr %5, i64 16
  br label %43

43:                                               ; preds = %.lr.ph, %88
  %.084127 = phi ptr [ %14, %.lr.ph ], [ %.2, %88 ]
  %.085126 = phi ptr [ %14, %.lr.ph ], [ %67, %88 ]
  %.088125 = phi ptr [ %40, %.lr.ph ], [ %46, %88 ]
  %.089124 = phi i64 [ 4096, %.lr.ph ], [ %.190, %88 ]
  %.091123 = phi i64 [ %39, %.lr.ph ], [ %45, %88 ]
  %44 = call i64 @llvm.umin.i64(i64 %.091123, i64 %10)
  %45 = sub i64 %.091123, %44
  store ptr %.088125, ptr %5, align 8, !tbaa !11
  store i64 %44, ptr %41, align 8, !tbaa !15
  store i32 5, ptr %42, align 8
  %46 = getelementptr inbounds i8, ptr %.088125, i64 %44
  %47 = call ptr @mln_RSAESPKCS1V15_private_encrypt(ptr noundef %1, ptr noundef %5)
  %48 = icmp eq ptr %47, null
  br i1 %48, label %.sink.split, label %49

49:                                               ; preds = %43
  %50 = ptrtoint ptr %.085126 to i64
  %51 = ptrtoint ptr %.084127 to i64
  %52 = sub i64 %50, %51
  %53 = sub i64 %.089124, %52
  %54 = getelementptr inbounds i8, ptr %47, i64 8
  %55 = load i64, ptr %54, align 8, !tbaa !15
  %56 = icmp ult i64 %53, %55
  br i1 %56, label %57, label %63

57:                                               ; preds = %49
  %58 = lshr i64 %.089124, 1
  %59 = add i64 %58, %.089124
  %60 = call ptr @realloc(ptr noundef %.084127, i64 noundef %59) #11
  %61 = icmp eq ptr %60, null
  br i1 %61, label %.sink.split, label %.thread

.thread:                                          ; preds = %57
  %62 = getelementptr inbounds i8, ptr %60, i64 %52
  %.pre = load i64, ptr %54, align 8, !tbaa !15
  br label %63

63:                                               ; preds = %.thread, %49
  %64 = phi i64 [ %55, %49 ], [ %.pre, %.thread ]
  %.190 = phi i64 [ %.089124, %49 ], [ %59, %.thread ]
  %.287 = phi ptr [ %.085126, %49 ], [ %62, %.thread ]
  %.2 = phi ptr [ %.084127, %49 ], [ %60, %.thread ]
  %65 = load ptr, ptr %47, align 8, !tbaa !11
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %.287, ptr align 1 %65, i64 %64, i1 false)
  %66 = load i64, ptr %54, align 8, !tbaa !15
  %67 = getelementptr inbounds i8, ptr %.287, i64 %66
  %68 = getelementptr inbounds i8, ptr %47, i64 16
  %69 = load i32, ptr %68, align 8
  %70 = and i32 %69, -4
  %71 = add i32 %70, -4
  %72 = and i32 %69, 3
  %73 = or disjoint i32 %71, %72
  store i32 %73, ptr %68, align 8
  %74 = icmp ult i32 %69, 8
  br i1 %74, label %75, label %88

75:                                               ; preds = %63
  %76 = and i32 %69, 1
  %.not106 = icmp eq i32 %76, 0
  br i1 %.not106, label %77, label %83

77:                                               ; preds = %75
  %78 = load ptr, ptr %47, align 8, !tbaa !11
  %.not107 = icmp eq ptr %78, null
  br i1 %.not107, label %83, label %79

79:                                               ; preds = %77
  %80 = and i32 %69, 2
  %.not108 = icmp eq i32 %80, 0
  br i1 %.not108, label %82, label %81

81:                                               ; preds = %79
  call void @mln_alloc_free(ptr noundef nonnull %78) #9
  br label %83

82:                                               ; preds = %79
  call void @free(ptr noundef nonnull %78) #9
  br label %83

83:                                               ; preds = %81, %82, %77, %75
  %84 = load i32, ptr %68, align 8
  %85 = and i32 %84, 2
  %.not109 = icmp eq i32 %85, 0
  br i1 %.not109, label %87, label %86

86:                                               ; preds = %83
  call void @mln_alloc_free(ptr noundef nonnull %47) #9
  br label %88

87:                                               ; preds = %83
  call void @free(ptr noundef nonnull %47) #9
  br label %88

88:                                               ; preds = %63, %87, %86
  %.not = icmp eq i64 %45, 0
  br i1 %.not, label %._crit_edge, label %43, !llvm.loop !16

._crit_edge:                                      ; preds = %88, %37
  %.085.lcssa = phi ptr [ %14, %37 ], [ %67, %88 ]
  %.084.lcssa = phi ptr [ %14, %37 ], [ %.2, %88 ]
  %89 = getelementptr inbounds i8, ptr %11, i64 16
  %90 = load i32, ptr %89, align 8
  %91 = and i32 %90, -4
  %92 = add i32 %91, -4
  %93 = and i32 %90, 3
  %94 = or disjoint i32 %92, %93
  store i32 %94, ptr %89, align 8
  %95 = icmp ult i32 %90, 8
  br i1 %95, label %96, label %109

96:                                               ; preds = %._crit_edge
  %97 = and i32 %90, 1
  %.not102 = icmp eq i32 %97, 0
  br i1 %.not102, label %98, label %104

98:                                               ; preds = %96
  %99 = load ptr, ptr %11, align 8, !tbaa !11
  %.not103 = icmp eq ptr %99, null
  br i1 %.not103, label %104, label %100

100:                                              ; preds = %98
  %101 = and i32 %90, 2
  %.not104 = icmp eq i32 %101, 0
  br i1 %.not104, label %103, label %102

102:                                              ; preds = %100
  call void @mln_alloc_free(ptr noundef nonnull %99) #9
  br label %104

103:                                              ; preds = %100
  call void @free(ptr noundef nonnull %99) #9
  br label %104

104:                                              ; preds = %102, %103, %98, %96
  %105 = load i32, ptr %89, align 8
  %106 = and i32 %105, 2
  %.not105 = icmp eq i32 %106, 0
  br i1 %.not105, label %108, label %107

107:                                              ; preds = %104
  call void @mln_alloc_free(ptr noundef nonnull %11) #9
  br label %109

108:                                              ; preds = %104
  call void @free(ptr noundef nonnull %11) #9
  br label %109

109:                                              ; preds = %._crit_edge, %108, %107
  store ptr %.084.lcssa, ptr %5, align 8, !tbaa !11
  %110 = ptrtoint ptr %.085.lcssa to i64
  %111 = ptrtoint ptr %.084.lcssa to i64
  %112 = sub i64 %110, %111
  %113 = getelementptr inbounds i8, ptr %5, i64 8
  store i64 %112, ptr %113, align 8, !tbaa !15
  %114 = getelementptr inbounds i8, ptr %5, i64 16
  store i32 5, ptr %114, align 8
  %115 = call ptr @mln_string_dup(ptr noundef nonnull %5) #9
  %116 = icmp eq ptr %115, null
  br i1 %116, label %.sink.split, label %117

117:                                              ; preds = %109
  call void @free(ptr noundef %.084.lcssa) #9
  br label %118

118:                                              ; preds = %35, %36, %16, %4, %117
  %.0 = phi ptr [ %115, %117 ], [ null, %4 ], [ null, %16 ], [ null, %36 ], [ null, %35 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %5) #9
  ret ptr %.0
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @mln_EMSAPKCS1V15_encode(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #6

; Function Attrs: mustprogress nounwind willreturn allockind("realloc") allocsize(1) memory(argmem: readwrite, inaccessiblemem: readwrite)
declare noalias noundef ptr @realloc(ptr allocptr nocapture noundef, i64 noundef) local_unnamed_addr #7

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

attributes #0 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "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 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 = { "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 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { 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 #6 = { inlinehint 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 #7 = { mustprogress nounwind willreturn allockind("realloc") allocsize(1) memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #8 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #9 = { nounwind }
attributes #10 = { nounwind allocsize(0) }
attributes #11 = { nounwind allocsize(1) }

!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, !8, i64 4}
!6 = !{!"", !7, i64 0, !7, i64 2064, !7, i64 4128, !7, i64 6192, !7, i64 8256, !7, i64 10320, !7, i64 12384, !8, i64 14448}
!7 = !{!"", !8, i64 0, !8, i64 4, !9, i64 8}
!8 = !{!"int", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = !{!12, !13, i64 0}
!12 = !{!"", !13, i64 0, !14, i64 8, !14, i64 16, !14, i64 16, !14, i64 16}
!13 = !{!"any pointer", !9, i64 0}
!14 = !{!"long", !9, i64 0}
!15 = !{!12, !14, i64 8}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}


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