; LLVM IR from imkcat/CatCrypto :: Sources/ModuleMaps/Argon2 (encoding)

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

@.str = external hidden unnamed_addr constant [2 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [4 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 ptr @argon2_type2string(i32 noundef, i32 noundef) #1

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

; Function Attrs: nounwind willreturn memory(read)
declare i64 @strlen(ptr noundef) #2

declare i32 @validate_inputs(ptr noundef) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @encode_string(ptr noundef %0, i64 noundef %1, ptr noundef %2, i32 noundef %3) #3 {
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca i64, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  %16 = alloca [30 x i8], align 16
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca [30 x i8], align 16
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca [30 x i8], align 16
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca [30 x i8], align 16
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store i64 %1, ptr %7, align 8, !tbaa !9
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  %31 = load i32, ptr %9, align 4, !tbaa !11
  %32 = call ptr @argon2_type2string(i32 noundef %31, i32 noundef 0)
  store ptr %32, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #6
  %33 = load ptr, ptr %8, align 8, !tbaa !5
  %34 = call i32 @validate_inputs(ptr noundef %33)
  store i32 %34, ptr %11, align 4, !tbaa !11
  %35 = load ptr, ptr %10, align 8, !tbaa !5
  %36 = icmp ne ptr %35, null
  br i1 %36, label %38, label %37

37:                                               ; preds = %4
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %399

38:                                               ; preds = %4
  %39 = load i32, ptr %11, align 4, !tbaa !11
  %40 = icmp ne i32 %39, 0
  br i1 %40, label %41, label %43

41:                                               ; preds = %38
  %42 = load i32, ptr %11, align 4, !tbaa !11
  store i32 %42, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %399

43:                                               ; preds = %38
  br label %44

44:                                               ; preds = %43
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  store i64 1, ptr %13, align 8, !tbaa !9
  %45 = load i64, ptr %13, align 8, !tbaa !9
  %46 = load i64, ptr %7, align 8, !tbaa !9
  %47 = icmp uge i64 %45, %46
  br i1 %47, label %48, label %49

48:                                               ; preds = %44
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %59

49:                                               ; preds = %44
  %50 = load ptr, ptr %6, align 8, !tbaa !5
  %51 = load i64, ptr %13, align 8, !tbaa !9
  %52 = add i64 %51, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %50, ptr align 1 @.str, i64 %52, i1 false)
  %53 = load i64, ptr %13, align 8, !tbaa !9
  %54 = load ptr, ptr %6, align 8, !tbaa !5
  %55 = getelementptr inbounds i8, ptr %54, i64 %53
  store ptr %55, ptr %6, align 8, !tbaa !5
  %56 = load i64, ptr %13, align 8, !tbaa !9
  %57 = load i64, ptr %7, align 8, !tbaa !9
  %58 = sub i64 %57, %56
  store i64 %58, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %59

59:                                               ; preds = %49, %48
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  %60 = load i32, ptr %12, align 4
  switch i32 %60, label %399 [
    i32 0, label %61
  ]

61:                                               ; preds = %59
  br label %62

62:                                               ; preds = %61
  br label %63

63:                                               ; preds = %62
  br label %64

64:                                               ; preds = %63
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  %65 = load ptr, ptr %10, align 8, !tbaa !5
  %66 = call i64 @strlen(ptr noundef %65) #7
  store i64 %66, ptr %14, align 8, !tbaa !9
  %67 = load i64, ptr %14, align 8, !tbaa !9
  %68 = load i64, ptr %7, align 8, !tbaa !9
  %69 = icmp uge i64 %67, %68
  br i1 %69, label %70, label %71

70:                                               ; preds = %64
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %82

71:                                               ; preds = %64
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = load ptr, ptr %10, align 8, !tbaa !5
  %74 = load i64, ptr %14, align 8, !tbaa !9
  %75 = add i64 %74, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %72, ptr align 1 %73, i64 %75, i1 false)
  %76 = load i64, ptr %14, align 8, !tbaa !9
  %77 = load ptr, ptr %6, align 8, !tbaa !5
  %78 = getelementptr inbounds i8, ptr %77, i64 %76
  store ptr %78, ptr %6, align 8, !tbaa !5
  %79 = load i64, ptr %14, align 8, !tbaa !9
  %80 = load i64, ptr %7, align 8, !tbaa !9
  %81 = sub i64 %80, %79
  store i64 %81, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %82

82:                                               ; preds = %71, %70
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  %83 = load i32, ptr %12, align 4
  switch i32 %83, label %399 [
    i32 0, label %84
  ]

84:                                               ; preds = %82
  br label %85

85:                                               ; preds = %84
  br label %86

86:                                               ; preds = %85
  br label %87

87:                                               ; preds = %86
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  store i64 3, ptr %15, align 8, !tbaa !9
  %88 = load i64, ptr %15, align 8, !tbaa !9
  %89 = load i64, ptr %7, align 8, !tbaa !9
  %90 = icmp uge i64 %88, %89
  br i1 %90, label %91, label %92

91:                                               ; preds = %87
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %102

92:                                               ; preds = %87
  %93 = load ptr, ptr %6, align 8, !tbaa !5
  %94 = load i64, ptr %15, align 8, !tbaa !9
  %95 = add i64 %94, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %93, ptr align 1 @.str.1, i64 %95, i1 false)
  %96 = load i64, ptr %15, align 8, !tbaa !9
  %97 = load ptr, ptr %6, align 8, !tbaa !5
  %98 = getelementptr inbounds i8, ptr %97, i64 %96
  store ptr %98, ptr %6, align 8, !tbaa !5
  %99 = load i64, ptr %15, align 8, !tbaa !9
  %100 = load i64, ptr %7, align 8, !tbaa !9
  %101 = sub i64 %100, %99
  store i64 %101, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %102

102:                                              ; preds = %92, %91
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  %103 = load i32, ptr %12, align 4
  switch i32 %103, label %399 [
    i32 0, label %104
  ]

104:                                              ; preds = %102
  br label %105

105:                                              ; preds = %104
  br label %106

106:                                              ; preds = %105
  br label %107

107:                                              ; preds = %106
  call void @llvm.lifetime.start.p0(i64 30, ptr %16) #6
  %108 = getelementptr inbounds [30 x i8], ptr %16, i64 0, i64 0
  %109 = load ptr, ptr %8, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.Argon2_Context, ptr %109, i32 0, i32 14
  %111 = load i32, ptr %110, align 4, !tbaa !13
  %112 = zext i32 %111 to i64
  %113 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %108, ptr noundef @.str.5, i64 noundef %112) #6
  br label %114

114:                                              ; preds = %107
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  %115 = getelementptr inbounds [30 x i8], ptr %16, i64 0, i64 0
  %116 = call i64 @strlen(ptr noundef %115) #7
  store i64 %116, ptr %17, align 8, !tbaa !9
  %117 = load i64, ptr %17, align 8, !tbaa !9
  %118 = load i64, ptr %7, align 8, !tbaa !9
  %119 = icmp uge i64 %117, %118
  br i1 %119, label %120, label %121

120:                                              ; preds = %114
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %132

121:                                              ; preds = %114
  %122 = load ptr, ptr %6, align 8, !tbaa !5
  %123 = getelementptr inbounds [30 x i8], ptr %16, i64 0, i64 0
  %124 = load i64, ptr %17, align 8, !tbaa !9
  %125 = add i64 %124, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %122, ptr align 16 %123, i64 %125, i1 false)
  %126 = load i64, ptr %17, align 8, !tbaa !9
  %127 = load ptr, ptr %6, align 8, !tbaa !5
  %128 = getelementptr inbounds i8, ptr %127, i64 %126
  store ptr %128, ptr %6, align 8, !tbaa !5
  %129 = load i64, ptr %17, align 8, !tbaa !9
  %130 = load i64, ptr %7, align 8, !tbaa !9
  %131 = sub i64 %130, %129
  store i64 %131, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %132

132:                                              ; preds = %121, %120
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  %133 = load i32, ptr %12, align 4
  switch i32 %133, label %137 [
    i32 0, label %134
  ]

134:                                              ; preds = %132
  br label %135

135:                                              ; preds = %134
  br label %136

136:                                              ; preds = %135
  store i32 0, ptr %12, align 4
  br label %137

137:                                              ; preds = %136, %132
  call void @llvm.lifetime.end.p0(i64 30, ptr %16) #6
  %138 = load i32, ptr %12, align 4
  switch i32 %138, label %399 [
    i32 0, label %139
  ]

139:                                              ; preds = %137
  br label %140

140:                                              ; preds = %139
  br label %141

141:                                              ; preds = %140
  br label %142

142:                                              ; preds = %141
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  store i64 3, ptr %18, align 8, !tbaa !9
  %143 = load i64, ptr %18, align 8, !tbaa !9
  %144 = load i64, ptr %7, align 8, !tbaa !9
  %145 = icmp uge i64 %143, %144
  br i1 %145, label %146, label %147

146:                                              ; preds = %142
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %157

147:                                              ; preds = %142
  %148 = load ptr, ptr %6, align 8, !tbaa !5
  %149 = load i64, ptr %18, align 8, !tbaa !9
  %150 = add i64 %149, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %148, ptr align 1 @.str.2, i64 %150, i1 false)
  %151 = load i64, ptr %18, align 8, !tbaa !9
  %152 = load ptr, ptr %6, align 8, !tbaa !5
  %153 = getelementptr inbounds i8, ptr %152, i64 %151
  store ptr %153, ptr %6, align 8, !tbaa !5
  %154 = load i64, ptr %18, align 8, !tbaa !9
  %155 = load i64, ptr %7, align 8, !tbaa !9
  %156 = sub i64 %155, %154
  store i64 %156, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %157

157:                                              ; preds = %147, %146
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  %158 = load i32, ptr %12, align 4
  switch i32 %158, label %399 [
    i32 0, label %159
  ]

159:                                              ; preds = %157
  br label %160

160:                                              ; preds = %159
  br label %161

161:                                              ; preds = %160
  br label %162

162:                                              ; preds = %161
  call void @llvm.lifetime.start.p0(i64 30, ptr %19) #6
  %163 = getelementptr inbounds [30 x i8], ptr %19, i64 0, i64 0
  %164 = load ptr, ptr %8, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.Argon2_Context, ptr %164, i32 0, i32 11
  %166 = load i32, ptr %165, align 8, !tbaa !15
  %167 = zext i32 %166 to i64
  %168 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %163, ptr noundef @.str.5, i64 noundef %167) #6
  br label %169

169:                                              ; preds = %162
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #6
  %170 = getelementptr inbounds [30 x i8], ptr %19, i64 0, i64 0
  %171 = call i64 @strlen(ptr noundef %170) #7
  store i64 %171, ptr %20, align 8, !tbaa !9
  %172 = load i64, ptr %20, align 8, !tbaa !9
  %173 = load i64, ptr %7, align 8, !tbaa !9
  %174 = icmp uge i64 %172, %173
  br i1 %174, label %175, label %176

175:                                              ; preds = %169
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %187

176:                                              ; preds = %169
  %177 = load ptr, ptr %6, align 8, !tbaa !5
  %178 = getelementptr inbounds [30 x i8], ptr %19, i64 0, i64 0
  %179 = load i64, ptr %20, align 8, !tbaa !9
  %180 = add i64 %179, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %177, ptr align 16 %178, i64 %180, i1 false)
  %181 = load i64, ptr %20, align 8, !tbaa !9
  %182 = load ptr, ptr %6, align 8, !tbaa !5
  %183 = getelementptr inbounds i8, ptr %182, i64 %181
  store ptr %183, ptr %6, align 8, !tbaa !5
  %184 = load i64, ptr %20, align 8, !tbaa !9
  %185 = load i64, ptr %7, align 8, !tbaa !9
  %186 = sub i64 %185, %184
  store i64 %186, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %187

187:                                              ; preds = %176, %175
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #6
  %188 = load i32, ptr %12, align 4
  switch i32 %188, label %192 [
    i32 0, label %189
  ]

189:                                              ; preds = %187
  br label %190

190:                                              ; preds = %189
  br label %191

191:                                              ; preds = %190
  store i32 0, ptr %12, align 4
  br label %192

192:                                              ; preds = %191, %187
  call void @llvm.lifetime.end.p0(i64 30, ptr %19) #6
  %193 = load i32, ptr %12, align 4
  switch i32 %193, label %399 [
    i32 0, label %194
  ]

194:                                              ; preds = %192
  br label %195

195:                                              ; preds = %194
  br label %196

196:                                              ; preds = %195
  br label %197

197:                                              ; preds = %196
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  store i64 3, ptr %21, align 8, !tbaa !9
  %198 = load i64, ptr %21, align 8, !tbaa !9
  %199 = load i64, ptr %7, align 8, !tbaa !9
  %200 = icmp uge i64 %198, %199
  br i1 %200, label %201, label %202

201:                                              ; preds = %197
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %212

202:                                              ; preds = %197
  %203 = load ptr, ptr %6, align 8, !tbaa !5
  %204 = load i64, ptr %21, align 8, !tbaa !9
  %205 = add i64 %204, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %203, ptr align 1 @.str.3, i64 %205, i1 false)
  %206 = load i64, ptr %21, align 8, !tbaa !9
  %207 = load ptr, ptr %6, align 8, !tbaa !5
  %208 = getelementptr inbounds i8, ptr %207, i64 %206
  store ptr %208, ptr %6, align 8, !tbaa !5
  %209 = load i64, ptr %21, align 8, !tbaa !9
  %210 = load i64, ptr %7, align 8, !tbaa !9
  %211 = sub i64 %210, %209
  store i64 %211, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %212

212:                                              ; preds = %202, %201
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  %213 = load i32, ptr %12, align 4
  switch i32 %213, label %399 [
    i32 0, label %214
  ]

214:                                              ; preds = %212
  br label %215

215:                                              ; preds = %214
  br label %216

216:                                              ; preds = %215
  br label %217

217:                                              ; preds = %216
  call void @llvm.lifetime.start.p0(i64 30, ptr %22) #6
  %218 = getelementptr inbounds [30 x i8], ptr %22, i64 0, i64 0
  %219 = load ptr, ptr %8, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.Argon2_Context, ptr %219, i32 0, i32 10
  %221 = load i32, ptr %220, align 4, !tbaa !16
  %222 = zext i32 %221 to i64
  %223 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %218, ptr noundef @.str.5, i64 noundef %222) #6
  br label %224

224:                                              ; preds = %217
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  %225 = getelementptr inbounds [30 x i8], ptr %22, i64 0, i64 0
  %226 = call i64 @strlen(ptr noundef %225) #7
  store i64 %226, ptr %23, align 8, !tbaa !9
  %227 = load i64, ptr %23, align 8, !tbaa !9
  %228 = load i64, ptr %7, align 8, !tbaa !9
  %229 = icmp uge i64 %227, %228
  br i1 %229, label %230, label %231

230:                                              ; preds = %224
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %242

231:                                              ; preds = %224
  %232 = load ptr, ptr %6, align 8, !tbaa !5
  %233 = getelementptr inbounds [30 x i8], ptr %22, i64 0, i64 0
  %234 = load i64, ptr %23, align 8, !tbaa !9
  %235 = add i64 %234, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %232, ptr align 16 %233, i64 %235, i1 false)
  %236 = load i64, ptr %23, align 8, !tbaa !9
  %237 = load ptr, ptr %6, align 8, !tbaa !5
  %238 = getelementptr inbounds i8, ptr %237, i64 %236
  store ptr %238, ptr %6, align 8, !tbaa !5
  %239 = load i64, ptr %23, align 8, !tbaa !9
  %240 = load i64, ptr %7, align 8, !tbaa !9
  %241 = sub i64 %240, %239
  store i64 %241, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %242

242:                                              ; preds = %231, %230
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  %243 = load i32, ptr %12, align 4
  switch i32 %243, label %247 [
    i32 0, label %244
  ]

244:                                              ; preds = %242
  br label %245

245:                                              ; preds = %244
  br label %246

246:                                              ; preds = %245
  store i32 0, ptr %12, align 4
  br label %247

247:                                              ; preds = %246, %242
  call void @llvm.lifetime.end.p0(i64 30, ptr %22) #6
  %248 = load i32, ptr %12, align 4
  switch i32 %248, label %399 [
    i32 0, label %249
  ]

249:                                              ; preds = %247
  br label %250

250:                                              ; preds = %249
  br label %251

251:                                              ; preds = %250
  br label %252

252:                                              ; preds = %251
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  store i64 3, ptr %24, align 8, !tbaa !9
  %253 = load i64, ptr %24, align 8, !tbaa !9
  %254 = load i64, ptr %7, align 8, !tbaa !9
  %255 = icmp uge i64 %253, %254
  br i1 %255, label %256, label %257

256:                                              ; preds = %252
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %267

257:                                              ; preds = %252
  %258 = load ptr, ptr %6, align 8, !tbaa !5
  %259 = load i64, ptr %24, align 8, !tbaa !9
  %260 = add i64 %259, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %258, ptr align 1 @.str.4, i64 %260, i1 false)
  %261 = load i64, ptr %24, align 8, !tbaa !9
  %262 = load ptr, ptr %6, align 8, !tbaa !5
  %263 = getelementptr inbounds i8, ptr %262, i64 %261
  store ptr %263, ptr %6, align 8, !tbaa !5
  %264 = load i64, ptr %24, align 8, !tbaa !9
  %265 = load i64, ptr %7, align 8, !tbaa !9
  %266 = sub i64 %265, %264
  store i64 %266, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %267

267:                                              ; preds = %257, %256
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  %268 = load i32, ptr %12, align 4
  switch i32 %268, label %399 [
    i32 0, label %269
  ]

269:                                              ; preds = %267
  br label %270

270:                                              ; preds = %269
  br label %271

271:                                              ; preds = %270
  br label %272

272:                                              ; preds = %271
  call void @llvm.lifetime.start.p0(i64 30, ptr %25) #6
  %273 = getelementptr inbounds [30 x i8], ptr %25, i64 0, i64 0
  %274 = load ptr, ptr %8, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.Argon2_Context, ptr %274, i32 0, i32 12
  %276 = load i32, ptr %275, align 4, !tbaa !17
  %277 = zext i32 %276 to i64
  %278 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %273, ptr noundef @.str.5, i64 noundef %277) #6
  br label %279

279:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #6
  %280 = getelementptr inbounds [30 x i8], ptr %25, i64 0, i64 0
  %281 = call i64 @strlen(ptr noundef %280) #7
  store i64 %281, ptr %26, align 8, !tbaa !9
  %282 = load i64, ptr %26, align 8, !tbaa !9
  %283 = load i64, ptr %7, align 8, !tbaa !9
  %284 = icmp uge i64 %282, %283
  br i1 %284, label %285, label %286

285:                                              ; preds = %279
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %297

286:                                              ; preds = %279
  %287 = load ptr, ptr %6, align 8, !tbaa !5
  %288 = getelementptr inbounds [30 x i8], ptr %25, i64 0, i64 0
  %289 = load i64, ptr %26, align 8, !tbaa !9
  %290 = add i64 %289, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %287, ptr align 16 %288, i64 %290, i1 false)
  %291 = load i64, ptr %26, align 8, !tbaa !9
  %292 = load ptr, ptr %6, align 8, !tbaa !5
  %293 = getelementptr inbounds i8, ptr %292, i64 %291
  store ptr %293, ptr %6, align 8, !tbaa !5
  %294 = load i64, ptr %26, align 8, !tbaa !9
  %295 = load i64, ptr %7, align 8, !tbaa !9
  %296 = sub i64 %295, %294
  store i64 %296, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %297

297:                                              ; preds = %286, %285
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #6
  %298 = load i32, ptr %12, align 4
  switch i32 %298, label %302 [
    i32 0, label %299
  ]

299:                                              ; preds = %297
  br label %300

300:                                              ; preds = %299
  br label %301

301:                                              ; preds = %300
  store i32 0, ptr %12, align 4
  br label %302

302:                                              ; preds = %301, %297
  call void @llvm.lifetime.end.p0(i64 30, ptr %25) #6
  %303 = load i32, ptr %12, align 4
  switch i32 %303, label %399 [
    i32 0, label %304
  ]

304:                                              ; preds = %302
  br label %305

305:                                              ; preds = %304
  br label %306

306:                                              ; preds = %305
  br label %307

307:                                              ; preds = %306
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #6
  store i64 1, ptr %27, align 8, !tbaa !9
  %308 = load i64, ptr %27, align 8, !tbaa !9
  %309 = load i64, ptr %7, align 8, !tbaa !9
  %310 = icmp uge i64 %308, %309
  br i1 %310, label %311, label %312

311:                                              ; preds = %307
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %322

312:                                              ; preds = %307
  %313 = load ptr, ptr %6, align 8, !tbaa !5
  %314 = load i64, ptr %27, align 8, !tbaa !9
  %315 = add i64 %314, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %313, ptr align 1 @.str, i64 %315, i1 false)
  %316 = load i64, ptr %27, align 8, !tbaa !9
  %317 = load ptr, ptr %6, align 8, !tbaa !5
  %318 = getelementptr inbounds i8, ptr %317, i64 %316
  store ptr %318, ptr %6, align 8, !tbaa !5
  %319 = load i64, ptr %27, align 8, !tbaa !9
  %320 = load i64, ptr %7, align 8, !tbaa !9
  %321 = sub i64 %320, %319
  store i64 %321, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %322

322:                                              ; preds = %312, %311
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #6
  %323 = load i32, ptr %12, align 4
  switch i32 %323, label %399 [
    i32 0, label %324
  ]

324:                                              ; preds = %322
  br label %325

325:                                              ; preds = %324
  br label %326

326:                                              ; preds = %325
  br label %327

327:                                              ; preds = %326
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  %328 = load ptr, ptr %6, align 8, !tbaa !5
  %329 = load i64, ptr %7, align 8, !tbaa !9
  %330 = load ptr, ptr %8, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.Argon2_Context, ptr %330, i32 0, i32 4
  %332 = load ptr, ptr %331, align 8, !tbaa !18
  %333 = load ptr, ptr %8, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.Argon2_Context, ptr %333, i32 0, i32 5
  %335 = load i32, ptr %334, align 8, !tbaa !19
  %336 = zext i32 %335 to i64
  %337 = call i64 @to_base64(ptr noundef %328, i64 noundef %329, ptr noundef %332, i64 noundef %336)
  store i64 %337, ptr %28, align 8, !tbaa !9
  %338 = load i64, ptr %28, align 8, !tbaa !9
  %339 = icmp eq i64 %338, -1
  br i1 %339, label %340, label %341

340:                                              ; preds = %327
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %348

341:                                              ; preds = %327
  %342 = load i64, ptr %28, align 8, !tbaa !9
  %343 = load ptr, ptr %6, align 8, !tbaa !5
  %344 = getelementptr inbounds i8, ptr %343, i64 %342
  store ptr %344, ptr %6, align 8, !tbaa !5
  %345 = load i64, ptr %28, align 8, !tbaa !9
  %346 = load i64, ptr %7, align 8, !tbaa !9
  %347 = sub i64 %346, %345
  store i64 %347, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %348

348:                                              ; preds = %341, %340
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  %349 = load i32, ptr %12, align 4
  switch i32 %349, label %399 [
    i32 0, label %350
  ]

350:                                              ; preds = %348
  br label %351

351:                                              ; preds = %350
  br label %352

352:                                              ; preds = %351
  br label %353

353:                                              ; preds = %352
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #6
  store i64 1, ptr %29, align 8, !tbaa !9
  %354 = load i64, ptr %29, align 8, !tbaa !9
  %355 = load i64, ptr %7, align 8, !tbaa !9
  %356 = icmp uge i64 %354, %355
  br i1 %356, label %357, label %358

357:                                              ; preds = %353
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %368

358:                                              ; preds = %353
  %359 = load ptr, ptr %6, align 8, !tbaa !5
  %360 = load i64, ptr %29, align 8, !tbaa !9
  %361 = add i64 %360, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %359, ptr align 1 @.str, i64 %361, i1 false)
  %362 = load i64, ptr %29, align 8, !tbaa !9
  %363 = load ptr, ptr %6, align 8, !tbaa !5
  %364 = getelementptr inbounds i8, ptr %363, i64 %362
  store ptr %364, ptr %6, align 8, !tbaa !5
  %365 = load i64, ptr %29, align 8, !tbaa !9
  %366 = load i64, ptr %7, align 8, !tbaa !9
  %367 = sub i64 %366, %365
  store i64 %367, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %368

368:                                              ; preds = %358, %357
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #6
  %369 = load i32, ptr %12, align 4
  switch i32 %369, label %399 [
    i32 0, label %370
  ]

370:                                              ; preds = %368
  br label %371

371:                                              ; preds = %370
  br label %372

372:                                              ; preds = %371
  br label %373

373:                                              ; preds = %372
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #6
  %374 = load ptr, ptr %6, align 8, !tbaa !5
  %375 = load i64, ptr %7, align 8, !tbaa !9
  %376 = load ptr, ptr %8, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.Argon2_Context, ptr %376, i32 0, i32 0
  %378 = load ptr, ptr %377, align 8, !tbaa !20
  %379 = load ptr, ptr %8, align 8, !tbaa !5
  %380 = getelementptr inbounds %struct.Argon2_Context, ptr %379, i32 0, i32 1
  %381 = load i32, ptr %380, align 8, !tbaa !21
  %382 = zext i32 %381 to i64
  %383 = call i64 @to_base64(ptr noundef %374, i64 noundef %375, ptr noundef %378, i64 noundef %382)
  store i64 %383, ptr %30, align 8, !tbaa !9
  %384 = load i64, ptr %30, align 8, !tbaa !9
  %385 = icmp eq i64 %384, -1
  br i1 %385, label %386, label %387

386:                                              ; preds = %373
  store i32 -31, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %394

387:                                              ; preds = %373
  %388 = load i64, ptr %30, align 8, !tbaa !9
  %389 = load ptr, ptr %6, align 8, !tbaa !5
  %390 = getelementptr inbounds i8, ptr %389, i64 %388
  store ptr %390, ptr %6, align 8, !tbaa !5
  %391 = load i64, ptr %30, align 8, !tbaa !9
  %392 = load i64, ptr %7, align 8, !tbaa !9
  %393 = sub i64 %392, %391
  store i64 %393, ptr %7, align 8, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %394

394:                                              ; preds = %387, %386
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #6
  %395 = load i32, ptr %12, align 4
  switch i32 %395, label %399 [
    i32 0, label %396
  ]

396:                                              ; preds = %394
  br label %397

397:                                              ; preds = %396
  br label %398

398:                                              ; preds = %397
  store i32 0, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %399

399:                                              ; preds = %398, %394, %368, %348, %322, %302, %267, %247, %212, %192, %157, %137, %102, %82, %59, %41, %37
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  %400 = load i32, ptr %5, align 4
  ret i32 %400
}

; 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: nounwind
declare i32 @sprintf(ptr noundef, ptr noundef, ...) #5

; Function Attrs: nounwind uwtable
declare hidden i64 @to_base64(ptr noundef, i64 noundef, ptr noundef, i64 noundef) #3

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 willreturn memory(read) "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 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 #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { 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 #6 = { nounwind }
attributes #7 = { nounwind willreturn memory(read) }

!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 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !12, i64 92}
!14 = !{!"Argon2_Context", !6, i64 0, !12, i64 8, !6, i64 16, !12, i64 24, !6, i64 32, !12, i64 40, !6, i64 48, !12, i64 56, !6, i64 64, !12, i64 72, !12, i64 76, !12, i64 80, !12, i64 84, !12, i64 88, !12, i64 92, !6, i64 96, !6, i64 104, !12, i64 112}
!15 = !{!14, !12, i64 80}
!16 = !{!14, !12, i64 76}
!17 = !{!14, !12, i64 84}
!18 = !{!14, !6, i64 32}
!19 = !{!14, !12, i64 40}
!20 = !{!14, !6, i64 0}
!21 = !{!14, !12, i64 8}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.str = external hidden unnamed_addr constant [2 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [4 x i8], align 1

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

declare ptr @argon2_type2string(i32 noundef, i32 noundef) local_unnamed_addr #1

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i64 @strlen(ptr nocapture noundef) local_unnamed_addr #2

declare i32 @validate_inputs(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local i32 @encode_string(ptr noundef %0, i64 noundef %1, ptr noundef %2, i32 noundef %3) local_unnamed_addr #3 {
  %5 = alloca [30 x i8], align 16
  %6 = alloca [30 x i8], align 16
  %7 = alloca [30 x i8], align 16
  %8 = alloca [30 x i8], align 16
  %9 = tail call ptr @argon2_type2string(i32 noundef %3, i32 noundef 0) #6
  %10 = tail call i32 @validate_inputs(ptr noundef %2) #6
  %.not = icmp eq ptr %9, null
  br i1 %.not, label %104, label %11

11:                                               ; preds = %4
  %.not211 = icmp eq i32 %10, 0
  br i1 %.not211, label %12, label %104

12:                                               ; preds = %11
  %13 = icmp ugt i64 %1, 1
  br i1 %13, label %14, label %104

14:                                               ; preds = %12
  %15 = load i16, ptr @.str, align 1
  store i16 %15, ptr %0, align 1
  %16 = add i64 %1, -1
  %17 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) %9) #7
  %.not212 = icmp ult i64 %17, %16
  br i1 %.not212, label %18, label %104

18:                                               ; preds = %14
  %19 = getelementptr inbounds i8, ptr %0, i64 1
  %20 = add nuw i64 %17, 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %19, ptr noundef nonnull align 1 dereferenceable(1) %9, i64 %20, i1 false)
  %21 = sub i64 %16, %17
  %22 = icmp ugt i64 %21, 3
  br i1 %22, label %23, label %104

23:                                               ; preds = %18
  %24 = getelementptr inbounds i8, ptr %19, i64 %17
  %25 = load i32, ptr @.str.1, align 1
  store i32 %25, ptr %24, align 1
  %26 = add i64 %21, -3
  call void @llvm.lifetime.start.p0(i64 30, ptr nonnull %5) #6
  %27 = getelementptr inbounds i8, ptr %2, i64 92
  %28 = load i32, ptr %27, align 4, !tbaa !5
  %29 = zext i32 %28 to i64
  %30 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %5, ptr noundef nonnull dereferenceable(1) @.str.5, i64 noundef %29) #6
  %31 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %5) #7
  %.not213 = icmp ult i64 %31, %26
  br i1 %.not213, label %33, label %32

32:                                               ; preds = %23
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %5) #6
  br label %104

33:                                               ; preds = %23
  %34 = getelementptr inbounds i8, ptr %24, i64 3
  %35 = add nuw i64 %31, 1
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %34, ptr noundef nonnull align 16 dereferenceable(1) %5, i64 %35, i1 false)
  %36 = sub i64 %26, %31
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %5) #6
  %37 = icmp ugt i64 %36, 3
  br i1 %37, label %38, label %104

38:                                               ; preds = %33
  %39 = getelementptr inbounds i8, ptr %34, i64 %31
  %40 = load i32, ptr @.str.2, align 1
  store i32 %40, ptr %39, align 1
  %41 = add i64 %36, -3
  call void @llvm.lifetime.start.p0(i64 30, ptr nonnull %6) #6
  %42 = getelementptr inbounds i8, ptr %2, i64 80
  %43 = load i32, ptr %42, align 8, !tbaa !11
  %44 = zext i32 %43 to i64
  %45 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %6, ptr noundef nonnull dereferenceable(1) @.str.5, i64 noundef %44) #6
  %46 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %6) #7
  %.not214 = icmp ult i64 %46, %41
  br i1 %.not214, label %48, label %47

47:                                               ; preds = %38
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %6) #6
  br label %104

48:                                               ; preds = %38
  %49 = getelementptr inbounds i8, ptr %39, i64 3
  %50 = add nuw i64 %46, 1
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %49, ptr noundef nonnull align 16 dereferenceable(1) %6, i64 %50, i1 false)
  %51 = sub i64 %41, %46
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %6) #6
  %52 = icmp ugt i64 %51, 3
  br i1 %52, label %53, label %104

53:                                               ; preds = %48
  %54 = getelementptr inbounds i8, ptr %49, i64 %46
  %55 = load i32, ptr @.str.3, align 1
  store i32 %55, ptr %54, align 1
  %56 = add i64 %51, -3
  call void @llvm.lifetime.start.p0(i64 30, ptr nonnull %7) #6
  %57 = getelementptr inbounds i8, ptr %2, i64 76
  %58 = load i32, ptr %57, align 4, !tbaa !12
  %59 = zext i32 %58 to i64
  %60 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %7, ptr noundef nonnull dereferenceable(1) @.str.5, i64 noundef %59) #6
  %61 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %7) #7
  %.not215 = icmp ult i64 %61, %56
  br i1 %.not215, label %63, label %62

62:                                               ; preds = %53
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %7) #6
  br label %104

63:                                               ; preds = %53
  %64 = getelementptr inbounds i8, ptr %54, i64 3
  %65 = add nuw i64 %61, 1
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %64, ptr noundef nonnull align 16 dereferenceable(1) %7, i64 %65, i1 false)
  %66 = sub i64 %56, %61
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %7) #6
  %67 = icmp ugt i64 %66, 3
  br i1 %67, label %68, label %104

68:                                               ; preds = %63
  %69 = getelementptr inbounds i8, ptr %64, i64 %61
  %70 = load i32, ptr @.str.4, align 1
  store i32 %70, ptr %69, align 1
  %71 = add i64 %66, -3
  call void @llvm.lifetime.start.p0(i64 30, ptr nonnull %8) #6
  %72 = getelementptr inbounds i8, ptr %2, i64 84
  %73 = load i32, ptr %72, align 4, !tbaa !13
  %74 = zext i32 %73 to i64
  %75 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %8, ptr noundef nonnull dereferenceable(1) @.str.5, i64 noundef %74) #6
  %76 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %8) #7
  %.not216 = icmp ult i64 %76, %71
  br i1 %.not216, label %78, label %77

77:                                               ; preds = %68
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %8) #6
  br label %104

78:                                               ; preds = %68
  %79 = getelementptr inbounds i8, ptr %69, i64 3
  %80 = add nuw i64 %76, 1
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %79, ptr noundef nonnull align 16 dereferenceable(1) %8, i64 %80, i1 false)
  %81 = sub i64 %71, %76
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %8) #6
  %82 = icmp ugt i64 %81, 1
  br i1 %82, label %83, label %104

83:                                               ; preds = %78
  %84 = getelementptr inbounds i8, ptr %79, i64 %76
  store i16 %15, ptr %84, align 1
  %85 = getelementptr inbounds i8, ptr %84, i64 1
  %86 = add i64 %81, -1
  %87 = getelementptr inbounds i8, ptr %2, i64 32
  %88 = load ptr, ptr %87, align 8, !tbaa !14
  %89 = getelementptr inbounds i8, ptr %2, i64 40
  %90 = load i32, ptr %89, align 8, !tbaa !15
  %91 = zext i32 %90 to i64
  %92 = tail call i64 @to_base64(ptr noundef nonnull %85, i64 noundef %86, ptr noundef %88, i64 noundef %91)
  %.not217 = icmp ne i64 %92, -1
  %93 = sub i64 %86, %92
  %94 = icmp ugt i64 %93, 1
  %or.cond = and i1 %.not217, %94
  br i1 %or.cond, label %95, label %104

95:                                               ; preds = %83
  %96 = getelementptr inbounds i8, ptr %85, i64 %92
  store i16 %15, ptr %96, align 1
  %97 = getelementptr inbounds i8, ptr %96, i64 1
  %98 = add i64 %93, -1
  %99 = load ptr, ptr %2, align 8, !tbaa !16
  %100 = getelementptr inbounds i8, ptr %2, i64 8
  %101 = load i32, ptr %100, align 8, !tbaa !17
  %102 = zext i32 %101 to i64
  %103 = tail call i64 @to_base64(ptr noundef nonnull %97, i64 noundef %98, ptr noundef %99, i64 noundef %102)
  %.not218 = icmp eq i64 %103, -1
  %spec.select = select i1 %.not218, i32 -31, i32 0
  br label %104

104:                                              ; preds = %78, %77, %63, %62, %48, %47, %33, %32, %18, %14, %12, %95, %11, %4, %83
  %.14 = phi i32 [ -31, %83 ], [ -31, %77 ], [ -31, %62 ], [ -31, %47 ], [ -31, %32 ], [ -31, %4 ], [ %10, %11 ], [ %spec.select, %95 ], [ -31, %12 ], [ -31, %14 ], [ -31, %18 ], [ -31, %33 ], [ -31, %48 ], [ -31, %63 ], [ -31, %78 ]
  ret i32 %.14
}

; 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: nofree nounwind
declare noundef i32 @sprintf(ptr noalias nocapture noundef writeonly, ptr nocapture noundef readonly, ...) local_unnamed_addr #5

; Function Attrs: nounwind uwtable
declare hidden i64 @to_base64(ptr noundef, i64 noundef, ptr noundef, i64 noundef) local_unnamed_addr #3

attributes #0 = { mustprogress 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 = { mustprogress nofree nounwind willreturn memory(argmem: read) "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 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 #4 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { nofree 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 #6 = { nounwind }
attributes #7 = { nounwind willreturn memory(read) }

!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 92}
!6 = !{!"Argon2_Context", !7, i64 0, !10, i64 8, !7, i64 16, !10, i64 24, !7, i64 32, !10, i64 40, !7, i64 48, !10, i64 56, !7, i64 64, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !7, i64 96, !7, i64 104, !10, i64 112}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!6, !10, i64 80}
!12 = !{!6, !10, i64 76}
!13 = !{!6, !10, i64 84}
!14 = !{!6, !7, i64 32}
!15 = !{!6, !10, i64 40}
!16 = !{!6, !7, i64 0}
!17 = !{!6, !10, i64 8}


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