; LLVM IR from aws/s2n-tls :: tests/unit (s2n_psk_offered_test)

; 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.s2n_debug_info = type { ptr, ptr }
%struct.s2n_tls13_keys = type { i32, i32, i8, %struct.s2n_blob, %struct.s2n_blob, [48 x i8], [48 x i8], %struct.s2n_hmac_state }
%struct.s2n_blob = type { ptr, i32, i32, i8 }
%struct.s2n_hmac_state = type { i32, i16, i32, i16, i8, %struct.s2n_hash_state, %struct.s2n_hash_state, %struct.s2n_hash_state, %struct.s2n_hash_state, [128 x i8], [64 x i8] }
%struct.s2n_hash_state = type { ptr, i32, i8, i64, %union.anon.0 }
%union.anon.0 = type { %struct.s2n_hash_evp_digest }
%struct.s2n_hash_evp_digest = type { %struct.s2n_evp_digest, %struct.s2n_evp_digest }
%struct.s2n_evp_digest = type { ptr, ptr }
%struct.s2n_result = type { i32 }
%struct.s2n_psk = type { i32, %struct.s2n_blob, %struct.s2n_blob, i32, i32, i64, %struct.s2n_blob, %struct.s2n_early_data_config, i64 }
%struct.s2n_early_data_config = type { i32, i8, ptr, %struct.s2n_blob, %struct.s2n_blob }

@_s2n_debug_info = external thread_local global %struct.s2n_debug_info, align 8
@s2n_errno = external thread_local global i32, align 4
@.str.43 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [84 x i8], align 1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #0

; Function Attrs: nounwind willreturn memory(read)
declare ptr @strrchr(ptr noundef, i32 noundef) #1

declare i32 @s2n_calculate_stacktrace() #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: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, 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

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @s2n_result_is_ok(i32) #5

declare i32 @s2n_blob_init(ptr noundef, ptr noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @s2n_psk_calculate_binder(ptr noundef %0, ptr noundef %1, ptr noundef %2) #6 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca %struct.s2n_tls13_keys, align 8
  %9 = alloca i32, align 4
  %10 = alloca %struct.s2n_result, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i64, align 8
  %13 = alloca [48 x i8], align 16
  %14 = alloca %struct.s2n_blob, align 8
  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
  br label %15

15:                                               ; preds = %3
  %16 = load ptr, ptr %5, align 8, !tbaa !5
  %17 = icmp ne ptr %16, null
  br i1 %17, label %49, label %18

18:                                               ; preds = %15
  br label %19

19:                                               ; preds = %18
  br label %20

20:                                               ; preds = %19
  %21 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %22 = getelementptr inbounds %struct.s2n_debug_info, ptr %21, i32 0, i32 0
  store ptr @.str.43, ptr %22, align 8, !tbaa !9
  %23 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %24 = getelementptr inbounds %struct.s2n_debug_info, ptr %23, i32 0, i32 0
  %25 = load ptr, ptr %24, align 8, !tbaa !9
  %26 = getelementptr inbounds i8, ptr %25, i64 21
  %27 = call ptr @strrchr(ptr noundef %26, i32 noundef 47) #7
  %28 = icmp ne ptr %27, null
  br i1 %28, label %29, label %36

29:                                               ; preds = %20
  %30 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %31 = getelementptr inbounds %struct.s2n_debug_info, ptr %30, i32 0, i32 0
  %32 = load ptr, ptr %31, align 8, !tbaa !9
  %33 = getelementptr inbounds i8, ptr %32, i64 21
  %34 = call ptr @strrchr(ptr noundef %33, i32 noundef 47) #7
  %35 = getelementptr inbounds i8, ptr %34, i64 1
  br label %41

36:                                               ; preds = %20
  %37 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %38 = getelementptr inbounds %struct.s2n_debug_info, ptr %37, i32 0, i32 0
  %39 = load ptr, ptr %38, align 8, !tbaa !9
  %40 = getelementptr inbounds i8, ptr %39, i64 21
  br label %41

41:                                               ; preds = %36, %29
  %42 = phi ptr [ %35, %29 ], [ %40, %36 ]
  %43 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %44 = getelementptr inbounds %struct.s2n_debug_info, ptr %43, i32 0, i32 1
  store ptr %42, ptr %44, align 8, !tbaa !11
  %45 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %45, align 4, !tbaa !12
  %46 = call i32 @s2n_calculate_stacktrace()
  br label %47

47:                                               ; preds = %41
  store i32 -1, ptr %4, align 4
  br label %325

48:                                               ; No predecessors!
  br label %49

49:                                               ; preds = %48, %15
  br label %50

50:                                               ; preds = %49
  br label %51

51:                                               ; preds = %50
  %52 = load ptr, ptr %6, align 8, !tbaa !5
  %53 = icmp ne ptr %52, null
  br i1 %53, label %85, label %54

54:                                               ; preds = %51
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55
  %57 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %58 = getelementptr inbounds %struct.s2n_debug_info, ptr %57, i32 0, i32 0
  store ptr @.str.44, ptr %58, align 8, !tbaa !9
  %59 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %60 = getelementptr inbounds %struct.s2n_debug_info, ptr %59, i32 0, i32 0
  %61 = load ptr, ptr %60, align 8, !tbaa !9
  %62 = getelementptr inbounds i8, ptr %61, i64 21
  %63 = call ptr @strrchr(ptr noundef %62, i32 noundef 47) #7
  %64 = icmp ne ptr %63, null
  br i1 %64, label %65, label %72

65:                                               ; preds = %56
  %66 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %67 = getelementptr inbounds %struct.s2n_debug_info, ptr %66, i32 0, i32 0
  %68 = load ptr, ptr %67, align 8, !tbaa !9
  %69 = getelementptr inbounds i8, ptr %68, i64 21
  %70 = call ptr @strrchr(ptr noundef %69, i32 noundef 47) #7
  %71 = getelementptr inbounds i8, ptr %70, i64 1
  br label %77

72:                                               ; preds = %56
  %73 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %74 = getelementptr inbounds %struct.s2n_debug_info, ptr %73, i32 0, i32 0
  %75 = load ptr, ptr %74, align 8, !tbaa !9
  %76 = getelementptr inbounds i8, ptr %75, i64 21
  br label %77

77:                                               ; preds = %72, %65
  %78 = phi ptr [ %71, %65 ], [ %76, %72 ]
  %79 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %80 = getelementptr inbounds %struct.s2n_debug_info, ptr %79, i32 0, i32 1
  store ptr %78, ptr %80, align 8, !tbaa !11
  %81 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %81, align 4, !tbaa !12
  %82 = call i32 @s2n_calculate_stacktrace()
  br label %83

83:                                               ; preds = %77
  store i32 -1, ptr %4, align 4
  br label %325

84:                                               ; No predecessors!
  br label %85

85:                                               ; preds = %84, %51
  br label %86

86:                                               ; preds = %85
  br label %87

87:                                               ; preds = %86
  %88 = load ptr, ptr %7, align 8, !tbaa !5
  %89 = icmp ne ptr %88, null
  br i1 %89, label %121, label %90

90:                                               ; preds = %87
  br label %91

91:                                               ; preds = %90
  br label %92

92:                                               ; preds = %91
  %93 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %94 = getelementptr inbounds %struct.s2n_debug_info, ptr %93, i32 0, i32 0
  store ptr @.str.45, ptr %94, align 8, !tbaa !9
  %95 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %96 = getelementptr inbounds %struct.s2n_debug_info, ptr %95, i32 0, i32 0
  %97 = load ptr, ptr %96, align 8, !tbaa !9
  %98 = getelementptr inbounds i8, ptr %97, i64 21
  %99 = call ptr @strrchr(ptr noundef %98, i32 noundef 47) #7
  %100 = icmp ne ptr %99, null
  br i1 %100, label %101, label %108

101:                                              ; preds = %92
  %102 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %103 = getelementptr inbounds %struct.s2n_debug_info, ptr %102, i32 0, i32 0
  %104 = load ptr, ptr %103, align 8, !tbaa !9
  %105 = getelementptr inbounds i8, ptr %104, i64 21
  %106 = call ptr @strrchr(ptr noundef %105, i32 noundef 47) #7
  %107 = getelementptr inbounds i8, ptr %106, i64 1
  br label %113

108:                                              ; preds = %92
  %109 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %110 = getelementptr inbounds %struct.s2n_debug_info, ptr %109, i32 0, i32 0
  %111 = load ptr, ptr %110, align 8, !tbaa !9
  %112 = getelementptr inbounds i8, ptr %111, i64 21
  br label %113

113:                                              ; preds = %108, %101
  %114 = phi ptr [ %107, %101 ], [ %112, %108 ]
  %115 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %116 = getelementptr inbounds %struct.s2n_debug_info, ptr %115, i32 0, i32 1
  store ptr %114, ptr %116, align 8, !tbaa !11
  %117 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %117, align 4, !tbaa !12
  %118 = call i32 @s2n_calculate_stacktrace()
  br label %119

119:                                              ; preds = %113
  store i32 -1, ptr %4, align 4
  br label %325

120:                                              ; No predecessors!
  br label %121

121:                                              ; preds = %120, %87
  br label %122

122:                                              ; preds = %121
  call void @llvm.lifetime.start.p0(i64 592, ptr %8) #8
  br label %123

123:                                              ; preds = %122
  %124 = load ptr, ptr %5, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.s2n_psk, ptr %124, i32 0, i32 3
  %126 = load i32, ptr %125, align 8, !tbaa !14
  %127 = call i32 @s2n_tls13_keys_init(ptr noundef %8, i32 noundef %126)
  %128 = icmp sgt i32 %127, -1
  br i1 %128, label %130, label %129

129:                                              ; preds = %123
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %323

130:                                              ; preds = %123
  br label %131

131:                                              ; preds = %130
  br label %132

132:                                              ; preds = %131
  br label %133

133:                                              ; preds = %132
  %134 = load ptr, ptr %6, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.s2n_blob, ptr %134, i32 0, i32 1
  %136 = load i32, ptr %135, align 8, !tbaa !19
  %137 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 2
  %138 = load i8, ptr %137, align 8, !tbaa !20
  %139 = zext i8 %138 to i32
  %140 = icmp eq i32 %136, %139
  br i1 %140, label %174, label %141

141:                                              ; preds = %133
  br label %142

142:                                              ; preds = %141
  br label %143

143:                                              ; preds = %142
  %144 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %145 = getelementptr inbounds %struct.s2n_debug_info, ptr %144, i32 0, i32 0
  store ptr @.str.46, ptr %145, align 8, !tbaa !9
  %146 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %147 = getelementptr inbounds %struct.s2n_debug_info, ptr %146, i32 0, i32 0
  %148 = load ptr, ptr %147, align 8, !tbaa !9
  %149 = getelementptr inbounds i8, ptr %148, i64 21
  %150 = call ptr @strrchr(ptr noundef %149, i32 noundef 47) #7
  %151 = icmp ne ptr %150, null
  br i1 %151, label %152, label %159

152:                                              ; preds = %143
  %153 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %154 = getelementptr inbounds %struct.s2n_debug_info, ptr %153, i32 0, i32 0
  %155 = load ptr, ptr %154, align 8, !tbaa !9
  %156 = getelementptr inbounds i8, ptr %155, i64 21
  %157 = call ptr @strrchr(ptr noundef %156, i32 noundef 47) #7
  %158 = getelementptr inbounds i8, ptr %157, i64 1
  br label %164

159:                                              ; preds = %143
  %160 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %161 = getelementptr inbounds %struct.s2n_debug_info, ptr %160, i32 0, i32 0
  %162 = load ptr, ptr %161, align 8, !tbaa !9
  %163 = getelementptr inbounds i8, ptr %162, i64 21
  br label %164

164:                                              ; preds = %159, %152
  %165 = phi ptr [ %158, %152 ], [ %163, %159 ]
  %166 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %167 = getelementptr inbounds %struct.s2n_debug_info, ptr %166, i32 0, i32 1
  store ptr %165, ptr %167, align 8, !tbaa !11
  %168 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %168, align 4, !tbaa !12
  %169 = call i32 @s2n_calculate_stacktrace()
  br label %170

170:                                              ; preds = %164
  br label %171

171:                                              ; preds = %170
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %323

172:                                              ; No predecessors!
  br label %173

173:                                              ; preds = %172
  br label %174

174:                                              ; preds = %173, %133
  br label %175

175:                                              ; preds = %174
  br label %176

176:                                              ; preds = %175
  br label %177

177:                                              ; preds = %176
  %178 = load ptr, ptr %7, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.s2n_blob, ptr %178, i32 0, i32 1
  %180 = load i32, ptr %179, align 8, !tbaa !19
  %181 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 2
  %182 = load i8, ptr %181, align 8, !tbaa !20
  %183 = zext i8 %182 to i32
  %184 = icmp eq i32 %180, %183
  br i1 %184, label %218, label %185

185:                                              ; preds = %177
  br label %186

186:                                              ; preds = %185
  br label %187

187:                                              ; preds = %186
  %188 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %189 = getelementptr inbounds %struct.s2n_debug_info, ptr %188, i32 0, i32 0
  store ptr @.str.47, ptr %189, align 8, !tbaa !9
  %190 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %191 = getelementptr inbounds %struct.s2n_debug_info, ptr %190, i32 0, i32 0
  %192 = load ptr, ptr %191, align 8, !tbaa !9
  %193 = getelementptr inbounds i8, ptr %192, i64 21
  %194 = call ptr @strrchr(ptr noundef %193, i32 noundef 47) #7
  %195 = icmp ne ptr %194, null
  br i1 %195, label %196, label %203

196:                                              ; preds = %187
  %197 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %198 = getelementptr inbounds %struct.s2n_debug_info, ptr %197, i32 0, i32 0
  %199 = load ptr, ptr %198, align 8, !tbaa !9
  %200 = getelementptr inbounds i8, ptr %199, i64 21
  %201 = call ptr @strrchr(ptr noundef %200, i32 noundef 47) #7
  %202 = getelementptr inbounds i8, ptr %201, i64 1
  br label %208

203:                                              ; preds = %187
  %204 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %205 = getelementptr inbounds %struct.s2n_debug_info, ptr %204, i32 0, i32 0
  %206 = load ptr, ptr %205, align 8, !tbaa !9
  %207 = getelementptr inbounds i8, ptr %206, i64 21
  br label %208

208:                                              ; preds = %203, %196
  %209 = phi ptr [ %202, %196 ], [ %207, %203 ]
  %210 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %211 = getelementptr inbounds %struct.s2n_debug_info, ptr %210, i32 0, i32 1
  store ptr %209, ptr %211, align 8, !tbaa !11
  %212 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %212, align 4, !tbaa !12
  %213 = call i32 @s2n_calculate_stacktrace()
  br label %214

214:                                              ; preds = %208
  br label %215

215:                                              ; preds = %214
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %323

216:                                              ; No predecessors!
  br label %217

217:                                              ; preds = %216
  br label %218

218:                                              ; preds = %217, %177
  br label %219

219:                                              ; preds = %218
  br label %220

220:                                              ; preds = %219
  br label %221

221:                                              ; preds = %220
  %222 = load ptr, ptr %5, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 4
  %224 = call i32 @s2n_derive_binder_key(ptr noundef %222, ptr noundef %223)
  %225 = getelementptr inbounds %struct.s2n_result, ptr %10, i32 0, i32 0
  store i32 %224, ptr %225, align 4
  %226 = getelementptr inbounds %struct.s2n_result, ptr %10, i32 0, i32 0
  %227 = load i32, ptr %226, align 4
  %228 = call zeroext i1 @s2n_result_is_ok(i32 %227)
  br i1 %228, label %230, label %229

229:                                              ; preds = %221
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %323

230:                                              ; preds = %221
  br label %231

231:                                              ; preds = %230
  br label %232

232:                                              ; preds = %231
  br label %233

233:                                              ; preds = %232
  %234 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 3
  %235 = load ptr, ptr %5, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.s2n_psk, ptr %235, i32 0, i32 6
  %237 = getelementptr inbounds %struct.s2n_blob, ptr %236, i32 0, i32 0
  %238 = load ptr, ptr %237, align 8, !tbaa !25
  %239 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 2
  %240 = load i8, ptr %239, align 8, !tbaa !20
  %241 = zext i8 %240 to i32
  %242 = call i32 @s2n_blob_init(ptr noundef %234, ptr noundef %238, i32 noundef %241)
  %243 = icmp sgt i32 %242, -1
  br i1 %243, label %245, label %244

244:                                              ; preds = %233
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %323

245:                                              ; preds = %233
  br label %246

246:                                              ; preds = %245
  br label %247

247:                                              ; preds = %246
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #8
  %248 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 4
  store ptr %248, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #8
  %249 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 2
  %250 = load i8, ptr %249, align 8, !tbaa !20
  %251 = zext i8 %250 to i64
  store i64 %251, ptr %12, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 48, ptr %13) #8
  call void @llvm.memset.p0.i64(ptr align 16 %13, i8 0, i64 48, i1 false)
  br label %252

252:                                              ; preds = %247
  %253 = load i64, ptr %12, align 8, !tbaa !26
  %254 = icmp ule i64 %253, 48
  br i1 %254, label %288, label %255

255:                                              ; preds = %252
  br label %256

256:                                              ; preds = %255
  br label %257

257:                                              ; preds = %256
  %258 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %259 = getelementptr inbounds %struct.s2n_debug_info, ptr %258, i32 0, i32 0
  store ptr @.str.48, ptr %259, align 8, !tbaa !9
  %260 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %261 = getelementptr inbounds %struct.s2n_debug_info, ptr %260, i32 0, i32 0
  %262 = load ptr, ptr %261, align 8, !tbaa !9
  %263 = getelementptr inbounds i8, ptr %262, i64 21
  %264 = call ptr @strrchr(ptr noundef %263, i32 noundef 47) #7
  %265 = icmp ne ptr %264, null
  br i1 %265, label %266, label %273

266:                                              ; preds = %257
  %267 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %268 = getelementptr inbounds %struct.s2n_debug_info, ptr %267, i32 0, i32 0
  %269 = load ptr, ptr %268, align 8, !tbaa !9
  %270 = getelementptr inbounds i8, ptr %269, i64 21
  %271 = call ptr @strrchr(ptr noundef %270, i32 noundef 47) #7
  %272 = getelementptr inbounds i8, ptr %271, i64 1
  br label %278

273:                                              ; preds = %257
  %274 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %275 = getelementptr inbounds %struct.s2n_debug_info, ptr %274, i32 0, i32 0
  %276 = load ptr, ptr %275, align 8, !tbaa !9
  %277 = getelementptr inbounds i8, ptr %276, i64 21
  br label %278

278:                                              ; preds = %273, %266
  %279 = phi ptr [ %272, %266 ], [ %277, %273 ]
  %280 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %281 = getelementptr inbounds %struct.s2n_debug_info, ptr %280, i32 0, i32 1
  store ptr %279, ptr %281, align 8, !tbaa !11
  %282 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %282, align 4, !tbaa !12
  %283 = call i32 @s2n_calculate_stacktrace()
  br label %284

284:                                              ; preds = %278
  br label %285

285:                                              ; preds = %284
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %322

286:                                              ; No predecessors!
  br label %287

287:                                              ; preds = %286
  br label %288

288:                                              ; preds = %287, %252
  br label %289

289:                                              ; preds = %288
  br label %290

290:                                              ; preds = %289
  call void @llvm.lifetime.start.p0(i64 24, ptr %14) #8
  call void @llvm.memset.p0.i64(ptr align 8 %14, i8 0, i64 24, i1 false)
  br label %291

291:                                              ; preds = %290
  %292 = getelementptr inbounds [48 x i8], ptr %13, i64 0, i64 0
  %293 = load i64, ptr %12, align 8, !tbaa !26
  %294 = trunc i64 %293 to i32
  %295 = call i32 @s2n_blob_init(ptr noundef %14, ptr noundef %292, i32 noundef %294)
  %296 = icmp sgt i32 %295, -1
  br i1 %296, label %298, label %297

297:                                              ; preds = %291
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %321

298:                                              ; preds = %291
  br label %299

299:                                              ; preds = %298
  br label %300

300:                                              ; preds = %299
  br label %301

301:                                              ; preds = %300
  %302 = load ptr, ptr %11, align 8, !tbaa !5
  %303 = call i32 @s2n_tls13_derive_finished_key(ptr noundef %8, ptr noundef %302, ptr noundef %14)
  %304 = icmp sgt i32 %303, -1
  br i1 %304, label %306, label %305

305:                                              ; preds = %301
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %321

306:                                              ; preds = %301
  br label %307

307:                                              ; preds = %306
  br label %308

308:                                              ; preds = %307
  br label %309

309:                                              ; preds = %308
  %310 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 7
  %311 = getelementptr inbounds %struct.s2n_tls13_keys, ptr %8, i32 0, i32 0
  %312 = load i32, ptr %311, align 8, !tbaa !27
  %313 = load ptr, ptr %6, align 8, !tbaa !5
  %314 = load ptr, ptr %7, align 8, !tbaa !5
  %315 = call i32 @s2n_hkdf_extract(ptr noundef %310, i32 noundef %312, ptr noundef %14, ptr noundef %313, ptr noundef %314)
  %316 = icmp sgt i32 %315, -1
  br i1 %316, label %318, label %317

317:                                              ; preds = %309
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %321

318:                                              ; preds = %309
  br label %319

319:                                              ; preds = %318
  br label %320

320:                                              ; preds = %319
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %321

321:                                              ; preds = %320, %317, %305, %297
  call void @llvm.lifetime.end.p0(i64 24, ptr %14) #8
  br label %322

322:                                              ; preds = %321, %285
  call void @llvm.lifetime.end.p0(i64 48, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #8
  br label %323

323:                                              ; preds = %322, %244, %229, %215, %171, %129
  %324 = call i32 @s2n_tls13_keys_free(ptr noundef %8)
  call void @llvm.lifetime.end.p0(i64 592, ptr %8) #8
  br label %325

325:                                              ; preds = %323, %119, %83, %47
  %326 = load i32, ptr %4, align 4
  ret i32 %326
}

declare i32 @s2n_tls13_keys_free(ptr noundef) #2

declare i32 @s2n_tls13_keys_init(ptr noundef, i32 noundef) #2

declare i32 @s2n_derive_binder_key(ptr noundef, ptr noundef) #2

declare i32 @s2n_tls13_derive_finished_key(ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @s2n_hkdf_extract(ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) #2

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { 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 #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: write) }
attributes #5 = { 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 #6 = { 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 willreturn memory(read) }
attributes #8 = { 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, !6, i64 0}
!10 = !{!"s2n_debug_info", !6, i64 0, !6, i64 8}
!11 = !{!10, !6, i64 8}
!12 = !{!13, !13, i64 0}
!13 = !{!"int", !7, i64 0}
!14 = !{!15, !13, i64 56}
!15 = !{!"s2n_psk", !13, i64 0, !16, i64 8, !16, i64 32, !13, i64 56, !13, i64 60, !17, i64 64, !16, i64 72, !18, i64 96, !17, i64 160}
!16 = !{!"s2n_blob", !6, i64 0, !13, i64 8, !13, i64 12, !13, i64 16}
!17 = !{!"long", !7, i64 0}
!18 = !{!"s2n_early_data_config", !13, i64 0, !7, i64 4, !6, i64 8, !16, i64 16, !16, i64 40}
!19 = !{!16, !13, i64 8}
!20 = !{!21, !7, i64 8}
!21 = !{!"s2n_tls13_keys", !13, i64 0, !13, i64 4, !7, i64 8, !16, i64 16, !16, i64 40, !7, i64 64, !7, i64 112, !22, i64 160}
!22 = !{!"s2n_hmac_state", !13, i64 0, !23, i64 4, !13, i64 8, !23, i64 12, !7, i64 14, !24, i64 16, !24, i64 72, !24, i64 128, !24, i64 184, !7, i64 240, !7, i64 368}
!23 = !{!"short", !7, i64 0}
!24 = !{!"s2n_hash_state", !6, i64 0, !13, i64 8, !7, i64 12, !17, i64 16, !7, i64 24}
!25 = !{!15, !6, i64 72}
!26 = !{!17, !17, i64 0}
!27 = !{!21, !13, i64 0}


; 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.s2n_debug_info = type { ptr, ptr }
%struct.s2n_tls13_keys = type { i32, i32, i8, %struct.s2n_blob, %struct.s2n_blob, [48 x i8], [48 x i8], %struct.s2n_hmac_state }
%struct.s2n_blob = type { ptr, i32, i32, i8 }
%struct.s2n_hmac_state = type { i32, i16, i32, i16, i8, %struct.s2n_hash_state, %struct.s2n_hash_state, %struct.s2n_hash_state, %struct.s2n_hash_state, [128 x i8], [64 x i8] }
%struct.s2n_hash_state = type { ptr, i32, i8, i64, %union.anon.0 }
%union.anon.0 = type { %struct.s2n_hash_evp_digest }
%struct.s2n_hash_evp_digest = type { %struct.s2n_evp_digest, %struct.s2n_evp_digest }
%struct.s2n_evp_digest = type { ptr, ptr }

@_s2n_debug_info = external thread_local local_unnamed_addr global %struct.s2n_debug_info, align 8
@s2n_errno = external thread_local local_unnamed_addr global i32, align 4
@.str.43 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [84 x i8], align 1

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #0

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare ptr @strrchr(ptr noundef, i32 noundef) local_unnamed_addr #1

declare i32 @s2n_calculate_stacktrace() 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: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, 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

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @s2n_result_is_ok(i32) local_unnamed_addr #5

declare i32 @s2n_blob_init(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1, 1) i32 @s2n_psk_calculate_binder(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #6 {
  %4 = alloca %struct.s2n_tls13_keys, align 8
  %5 = alloca [48 x i8], align 16
  %6 = alloca %struct.s2n_blob, align 8
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %7, label %15

7:                                                ; preds = %3
  %8 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.43, ptr %8, align 8, !tbaa !5
  %9 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.43, i64 21), i32 noundef 47) #7
  %.not24 = icmp eq ptr %9, null
  %10 = getelementptr inbounds i8, ptr %9, i64 1
  %11 = select i1 %.not24, ptr getelementptr inbounds (i8, ptr @.str.43, i64 21), ptr %10
  %12 = getelementptr inbounds i8, ptr %8, i64 8
  store ptr %11, ptr %12, align 8, !tbaa !10
  %13 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %13, align 4, !tbaa !11
  %14 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %103

15:                                               ; preds = %3
  %.not25 = icmp eq ptr %1, null
  br i1 %.not25, label %16, label %24

16:                                               ; preds = %15
  %17 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.44, ptr %17, align 8, !tbaa !5
  %18 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.44, i64 21), i32 noundef 47) #7
  %.not26 = icmp eq ptr %18, null
  %19 = getelementptr inbounds i8, ptr %18, i64 1
  %20 = select i1 %.not26, ptr getelementptr inbounds (i8, ptr @.str.44, i64 21), ptr %19
  %21 = getelementptr inbounds i8, ptr %17, i64 8
  store ptr %20, ptr %21, align 8, !tbaa !10
  %22 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %22, align 4, !tbaa !11
  %23 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %103

24:                                               ; preds = %15
  %.not27 = icmp eq ptr %2, null
  br i1 %.not27, label %25, label %33

25:                                               ; preds = %24
  %26 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.45, ptr %26, align 8, !tbaa !5
  %27 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.45, i64 21), i32 noundef 47) #7
  %.not28 = icmp eq ptr %27, null
  %28 = getelementptr inbounds i8, ptr %27, i64 1
  %29 = select i1 %.not28, ptr getelementptr inbounds (i8, ptr @.str.45, i64 21), ptr %28
  %30 = getelementptr inbounds i8, ptr %26, i64 8
  store ptr %29, ptr %30, align 8, !tbaa !10
  %31 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %31, align 4, !tbaa !11
  %32 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %103

33:                                               ; preds = %24
  call void @llvm.lifetime.start.p0(i64 592, ptr nonnull %4) #8
  %34 = getelementptr inbounds i8, ptr %0, i64 56
  %35 = load i32, ptr %34, align 8, !tbaa !13
  %36 = call i32 @s2n_tls13_keys_init(ptr noundef nonnull %4, i32 noundef %35) #8
  %37 = icmp sgt i32 %36, -1
  br i1 %37, label %38, label %101

38:                                               ; preds = %33
  %39 = getelementptr inbounds i8, ptr %1, i64 8
  %40 = load i32, ptr %39, align 8, !tbaa !18
  %41 = getelementptr inbounds i8, ptr %4, i64 8
  %42 = load i8, ptr %41, align 8, !tbaa !19
  %43 = zext i8 %42 to i32
  %44 = icmp eq i32 %40, %43
  br i1 %44, label %53, label %45

45:                                               ; preds = %38
  %46 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.46, ptr %46, align 8, !tbaa !5
  %47 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.46, i64 21), i32 noundef 47) #7
  %.not29 = icmp eq ptr %47, null
  %48 = getelementptr inbounds i8, ptr %47, i64 1
  %49 = select i1 %.not29, ptr getelementptr inbounds (i8, ptr @.str.46, i64 21), ptr %48
  %50 = getelementptr inbounds i8, ptr %46, i64 8
  store ptr %49, ptr %50, align 8, !tbaa !10
  %51 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %51, align 4, !tbaa !11
  %52 = call i32 @s2n_calculate_stacktrace() #8
  br label %101

53:                                               ; preds = %38
  %54 = getelementptr inbounds i8, ptr %2, i64 8
  %55 = load i32, ptr %54, align 8, !tbaa !18
  %56 = icmp eq i32 %55, %40
  br i1 %56, label %65, label %57

57:                                               ; preds = %53
  %58 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.47, ptr %58, align 8, !tbaa !5
  %59 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.47, i64 21), i32 noundef 47) #7
  %.not30 = icmp eq ptr %59, null
  %60 = getelementptr inbounds i8, ptr %59, i64 1
  %61 = select i1 %.not30, ptr getelementptr inbounds (i8, ptr @.str.47, i64 21), ptr %60
  %62 = getelementptr inbounds i8, ptr %58, i64 8
  store ptr %61, ptr %62, align 8, !tbaa !10
  %63 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %63, align 4, !tbaa !11
  %64 = call i32 @s2n_calculate_stacktrace() #8
  br label %101

65:                                               ; preds = %53
  %66 = getelementptr inbounds i8, ptr %4, i64 40
  %67 = call i32 @s2n_derive_binder_key(ptr noundef nonnull %0, ptr noundef nonnull %66) #8
  %68 = call zeroext i1 @s2n_result_is_ok(i32 %67)
  br i1 %68, label %69, label %101

69:                                               ; preds = %65
  %70 = getelementptr inbounds i8, ptr %4, i64 16
  %71 = getelementptr inbounds i8, ptr %0, i64 72
  %72 = load ptr, ptr %71, align 8, !tbaa !24
  %73 = load i8, ptr %41, align 8, !tbaa !19
  %74 = zext i8 %73 to i32
  %75 = call i32 @s2n_blob_init(ptr noundef nonnull %70, ptr noundef %72, i32 noundef %74) #8
  %76 = icmp sgt i32 %75, -1
  br i1 %76, label %77, label %101

77:                                               ; preds = %69
  %78 = load i8, ptr %41, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %5) #8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(48) %5, i8 0, i64 48, i1 false)
  %79 = icmp ult i8 %78, 49
  br i1 %79, label %88, label %80

80:                                               ; preds = %77
  %81 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.48, ptr %81, align 8, !tbaa !5
  %82 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.48, i64 21), i32 noundef 47) #7
  %.not31 = icmp eq ptr %82, null
  %83 = getelementptr inbounds i8, ptr %82, i64 1
  %84 = select i1 %.not31, ptr getelementptr inbounds (i8, ptr @.str.48, i64 21), ptr %83
  %85 = getelementptr inbounds i8, ptr %81, i64 8
  store ptr %84, ptr %85, align 8, !tbaa !10
  %86 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %86, align 4, !tbaa !11
  %87 = call i32 @s2n_calculate_stacktrace() #8
  br label %100

88:                                               ; preds = %77
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %6) #8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %6, i8 0, i64 24, i1 false)
  %89 = zext nneg i8 %78 to i32
  %90 = call i32 @s2n_blob_init(ptr noundef nonnull %6, ptr noundef nonnull %5, i32 noundef %89) #8
  %91 = icmp sgt i32 %90, -1
  br i1 %91, label %92, label %99

92:                                               ; preds = %88
  %93 = call i32 @s2n_tls13_derive_finished_key(ptr noundef nonnull %4, ptr noundef nonnull %66, ptr noundef nonnull %6) #8
  %94 = icmp sgt i32 %93, -1
  br i1 %94, label %95, label %99

95:                                               ; preds = %92
  %96 = getelementptr inbounds i8, ptr %4, i64 160
  %97 = load i32, ptr %4, align 8, !tbaa !25
  %98 = call i32 @s2n_hkdf_extract(ptr noundef nonnull %96, i32 noundef %97, ptr noundef nonnull %6, ptr noundef nonnull %1, ptr noundef nonnull %2) #8
  %.lobit = ashr i32 %98, 31
  br label %99

99:                                               ; preds = %95, %92, %88
  %.0 = phi i32 [ -1, %88 ], [ -1, %92 ], [ %.lobit, %95 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %6) #8
  br label %100

100:                                              ; preds = %99, %80
  %.1 = phi i32 [ %.0, %99 ], [ -1, %80 ]
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %5) #8
  br label %101

101:                                              ; preds = %69, %65, %33, %100, %57, %45
  %.2 = phi i32 [ %.1, %100 ], [ -1, %57 ], [ -1, %45 ], [ -1, %33 ], [ -1, %65 ], [ -1, %69 ]
  %102 = call i32 @s2n_tls13_keys_free(ptr noundef nonnull %4) #8
  call void @llvm.lifetime.end.p0(i64 592, ptr nonnull %4) #8
  br label %103

103:                                              ; preds = %101, %25, %16, %7
  %.3 = phi i32 [ %.2, %101 ], [ -1, %25 ], [ -1, %16 ], [ -1, %7 ]
  ret i32 %.3
}

declare i32 @s2n_tls13_keys_free(ptr noundef) local_unnamed_addr #2

declare i32 @s2n_tls13_keys_init(ptr noundef, i32 noundef) local_unnamed_addr #2

declare i32 @s2n_derive_binder_key(ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @s2n_tls13_derive_finished_key(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @s2n_hkdf_extract(ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

attributes #0 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { 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 #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: write) }
attributes #5 = { 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 #6 = { 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 willreturn memory(read) }
attributes #8 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"s2n_debug_info", !7, i64 0, !7, i64 8}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!6, !7, i64 8}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !8, i64 0}
!13 = !{!14, !12, i64 56}
!14 = !{!"s2n_psk", !12, i64 0, !15, i64 8, !15, i64 32, !12, i64 56, !12, i64 60, !16, i64 64, !15, i64 72, !17, i64 96, !16, i64 160}
!15 = !{!"s2n_blob", !7, i64 0, !12, i64 8, !12, i64 12, !12, i64 16}
!16 = !{!"long", !8, i64 0}
!17 = !{!"s2n_early_data_config", !12, i64 0, !8, i64 4, !7, i64 8, !15, i64 16, !15, i64 40}
!18 = !{!15, !12, i64 8}
!19 = !{!20, !8, i64 8}
!20 = !{!"s2n_tls13_keys", !12, i64 0, !12, i64 4, !8, i64 8, !15, i64 16, !15, i64 40, !8, i64 64, !8, i64 112, !21, i64 160}
!21 = !{!"s2n_hmac_state", !12, i64 0, !22, i64 4, !12, i64 8, !22, i64 12, !8, i64 14, !23, i64 16, !23, i64 72, !23, i64 128, !23, i64 184, !8, i64 240, !8, i64 368}
!22 = !{!"short", !8, i64 0}
!23 = !{!"s2n_hash_state", !7, i64 0, !12, i64 8, !8, i64 12, !16, i64 16, !8, i64 24}
!24 = !{!14, !7, i64 72}
!25 = !{!20, !12, i64 0}


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