; LLVM IR from aws/s2n-tls :: crypto (s2n_prf_libcrypto)

; 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_result = type { i32 }
%struct.s2n_blob = type { ptr, i32, i32, i8 }
%struct.ossl_param_st = type { ptr, i32, ptr, i64, i64 }
%struct.s2n_connection = type { i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, [22 x i8], [22 x i8], [22 x i8], i32, i32, %struct.s2n_timer, i64, i64, [32 x i8], i8, i8, i8, i8, i8, i8, i8, ptr, ptr, %struct.s2n_secrets, ptr, ptr, %struct.s2n_kex_parameters, %struct.s2n_handshake_parameters, %struct.s2n_psk_parameters, ptr, i8, i32, [5 x i8], %struct.s2n_stuffer, %struct.s2n_stuffer, %struct.s2n_stuffer, %struct.s2n_stuffer, i32, i64, [2 x i8], %struct.s2n_stuffer, i8, i8, i8, i8, %struct.s2n_atomic_flag, %struct.s2n_atomic_flag, %struct.s2n_handshake, i16, i32, i16, i64, i8, i64, i64, i64, %struct.s2n_atomic_flag, %struct.s2n_atomic_flag, [256 x i8], [256 x i8], i32, %struct.s2n_blob, i32, %struct.s2n_blob, %struct.s2n_blob, %struct.s2n_blob, %struct.s2n_client_hello, %struct.s2n_x509_validator, ptr, ptr, i8, i32, %struct.s2n_blob, i32, %struct.s2n_ticket_fields, [138 x i8], %struct.s2n_stuffer, %struct.s2n_blob, %struct.s2n_blob, i8, i8, i8, i16, i16, i32, i32, %struct.s2n_blob, i32, %struct.s2n_post_handshake, %struct.s2n_atomic_flag, i8, i8 }
%struct.s2n_timer = type { i64 }
%struct.s2n_secrets = type { %union.anon, i32 }
%union.anon = type { %struct.s2n_tls13_secrets }
%struct.s2n_tls13_secrets = type { [48 x i8], [48 x i8], [48 x i8], [48 x i8], [48 x i8], [48 x i8], [48 x i8], [48 x i8], i32 }
%struct.s2n_kex_parameters = type { %struct.s2n_dh_params, %struct.s2n_ecc_evp_params, [4 x ptr], %struct.s2n_ecc_evp_params, %struct.s2n_kem_group_params, %struct.s2n_kem_group_params, [8 x ptr], %struct.s2n_kem_params, %struct.s2n_blob, %struct.s2n_blob }
%struct.s2n_dh_params = type { ptr }
%struct.s2n_ecc_evp_params = type { ptr, ptr }
%struct.s2n_kem_group_params = type { ptr, %struct.s2n_kem_params, %struct.s2n_ecc_evp_params }
%struct.s2n_kem_params = type { ptr, %struct.s2n_blob, %struct.s2n_blob, %struct.s2n_blob, i8 }
%struct.s2n_handshake_parameters = type { %struct.s2n_pkey, %struct.s2n_pkey, %struct.s2n_blob, i32, %struct.s2n_sig_scheme_list, ptr, ptr, ptr, [4 x ptr], [4 x ptr], i8, i8, [32 x i8], [32 x i8] }
%struct.s2n_pkey = type { ptr, ptr, ptr, ptr, ptr, ptr }
%struct.s2n_sig_scheme_list = type { [128 x i16], i8 }
%struct.s2n_psk_parameters = type { i32, %struct.s2n_array, i16, i16, ptr, i32 }
%struct.s2n_array = type { %struct.s2n_blob, i32, i32 }
%struct.s2n_handshake = type { %struct.s2n_stuffer, ptr, [8 x i8], [48 x i8], [48 x i8], i8, i32, i32, i32, i32, %struct.s2n_offered_early_data, i8, i32 }
%struct.s2n_offered_early_data = type { ptr }
%struct.s2n_client_hello = type { %struct.s2n_blob, %struct.s2n_parsed_extensions_list, %struct.s2n_blob, %struct.s2n_blob, %struct.s2n_blob, i8, i8, i8 }
%struct.s2n_parsed_extensions_list = type { [21 x %struct.s2n_parsed_extension], %struct.s2n_blob, i16 }
%struct.s2n_parsed_extension = type { %struct.s2n_blob, i16, i16, i8 }
%struct.s2n_x509_validator = type { ptr, ptr, i8, i8, i16, ptr, i32, ptr, %struct.s2n_cert_validation_info, i8 }
%struct.s2n_cert_validation_info = type { i8, [3 x i8] }
%struct.s2n_ticket_fields = type { %struct.s2n_blob, i32 }
%struct.s2n_stuffer = type { %struct.s2n_blob, i32, i32, i32, i8 }
%struct.s2n_post_handshake = type { %struct.s2n_stuffer, [4 x i8] }
%struct.s2n_atomic_flag = type { i32 }
%struct.s2n_crypto_parameters = type { ptr, %struct.s2n_session_key, %struct.s2n_session_key, %struct.s2n_hmac_state, %struct.s2n_hmac_state, [16 x i8], [16 x i8], [8 x i8], [8 x i8] }
%struct.s2n_session_key = type { ptr }
%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_cipher_suite = type { i8, ptr, ptr, [2 x i8], ptr, i32, ptr, [2 x ptr], i8, ptr, ptr, i32, i8 }

@.str = external hidden unnamed_addr constant [96 x i8], align 1
@_s2n_debug_info = external thread_local global %struct.s2n_debug_info, align 8
@s2n_errno = external thread_local global i32, align 4
@.str.1 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [97 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @s2n_prf_libcrypto(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6) #0 {
  %8 = alloca %struct.s2n_result, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca %struct.s2n_blob, align 8
  %17 = alloca i64, align 8
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca ptr, align 8
  %23 = alloca %struct.s2n_result, align 4
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca [8 x %struct.ossl_param_st], align 16
  store ptr %0, ptr %9, align 8, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !5
  store ptr %2, ptr %11, align 8, !tbaa !5
  store ptr %3, ptr %12, align 8, !tbaa !5
  store ptr %4, ptr %13, align 8, !tbaa !5
  store ptr %5, ptr %14, align 8, !tbaa !5
  store ptr %6, ptr %15, align 8, !tbaa !5
  br label %27

27:                                               ; preds = %7
  %28 = load ptr, ptr %9, align 8, !tbaa !5
  %29 = icmp ne ptr %28, null
  br i1 %29, label %62, label %30

30:                                               ; preds = %27
  br label %31

31:                                               ; preds = %30
  br label %32

32:                                               ; preds = %31
  %33 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %34 = getelementptr inbounds %struct.s2n_debug_info, ptr %33, i32 0, i32 0
  store ptr @.str, ptr %34, align 8, !tbaa !9
  %35 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %36 = getelementptr inbounds %struct.s2n_debug_info, ptr %35, i32 0, i32 0
  %37 = load ptr, ptr %36, align 8, !tbaa !9
  %38 = getelementptr inbounds i8, ptr %37, i64 21
  %39 = call ptr @strrchr(ptr noundef %38, i32 noundef 47) #7
  %40 = icmp ne ptr %39, null
  br i1 %40, label %41, label %48

41:                                               ; preds = %32
  %42 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %43 = getelementptr inbounds %struct.s2n_debug_info, ptr %42, i32 0, i32 0
  %44 = load ptr, ptr %43, align 8, !tbaa !9
  %45 = getelementptr inbounds i8, ptr %44, i64 21
  %46 = call ptr @strrchr(ptr noundef %45, i32 noundef 47) #7
  %47 = getelementptr inbounds i8, ptr %46, i64 1
  br label %53

48:                                               ; preds = %32
  %49 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %50 = getelementptr inbounds %struct.s2n_debug_info, ptr %49, i32 0, i32 0
  %51 = load ptr, ptr %50, align 8, !tbaa !9
  %52 = getelementptr inbounds i8, ptr %51, i64 21
  br label %53

53:                                               ; preds = %48, %41
  %54 = phi ptr [ %47, %41 ], [ %52, %48 ]
  %55 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %56 = getelementptr inbounds %struct.s2n_debug_info, ptr %55, i32 0, i32 1
  store ptr %54, ptr %56, align 8, !tbaa !11
  %57 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %57, align 4, !tbaa !12
  %58 = call i32 @s2n_calculate_stacktrace()
  br label %59

59:                                               ; preds = %53
  %60 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %60, align 4, !tbaa !14
  br label %708

61:                                               ; No predecessors!
  br label %62

62:                                               ; preds = %61, %27
  br label %63

63:                                               ; preds = %62
  br label %64

64:                                               ; preds = %63
  %65 = load ptr, ptr %10, align 8, !tbaa !5
  %66 = icmp ne ptr %65, null
  br i1 %66, label %99, label %67

67:                                               ; preds = %64
  br label %68

68:                                               ; preds = %67
  br label %69

69:                                               ; preds = %68
  %70 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %71 = getelementptr inbounds %struct.s2n_debug_info, ptr %70, i32 0, i32 0
  store ptr @.str.1, ptr %71, align 8, !tbaa !9
  %72 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %73 = getelementptr inbounds %struct.s2n_debug_info, ptr %72, i32 0, i32 0
  %74 = load ptr, ptr %73, align 8, !tbaa !9
  %75 = getelementptr inbounds i8, ptr %74, i64 21
  %76 = call ptr @strrchr(ptr noundef %75, i32 noundef 47) #7
  %77 = icmp ne ptr %76, null
  br i1 %77, label %78, label %85

78:                                               ; preds = %69
  %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 0
  %81 = load ptr, ptr %80, align 8, !tbaa !9
  %82 = getelementptr inbounds i8, ptr %81, i64 21
  %83 = call ptr @strrchr(ptr noundef %82, i32 noundef 47) #7
  %84 = getelementptr inbounds i8, ptr %83, i64 1
  br label %90

85:                                               ; preds = %69
  %86 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %87 = getelementptr inbounds %struct.s2n_debug_info, ptr %86, i32 0, i32 0
  %88 = load ptr, ptr %87, align 8, !tbaa !9
  %89 = getelementptr inbounds i8, ptr %88, i64 21
  br label %90

90:                                               ; preds = %85, %78
  %91 = phi ptr [ %84, %78 ], [ %89, %85 ]
  %92 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %93 = getelementptr inbounds %struct.s2n_debug_info, ptr %92, i32 0, i32 1
  store ptr %91, ptr %93, align 8, !tbaa !11
  %94 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %94, align 4, !tbaa !12
  %95 = call i32 @s2n_calculate_stacktrace()
  br label %96

96:                                               ; preds = %90
  %97 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %97, align 4, !tbaa !14
  br label %708

98:                                               ; No predecessors!
  br label %99

99:                                               ; preds = %98, %64
  br label %100

100:                                              ; preds = %99
  br label %101

101:                                              ; preds = %100
  %102 = load ptr, ptr %11, align 8, !tbaa !5
  %103 = icmp ne ptr %102, null
  br i1 %103, label %136, label %104

104:                                              ; preds = %101
  br label %105

105:                                              ; preds = %104
  br label %106

106:                                              ; preds = %105
  %107 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %108 = getelementptr inbounds %struct.s2n_debug_info, ptr %107, i32 0, i32 0
  store ptr @.str.2, ptr %108, align 8, !tbaa !9
  %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
  %113 = call ptr @strrchr(ptr noundef %112, i32 noundef 47) #7
  %114 = icmp ne ptr %113, null
  br i1 %114, label %115, label %122

115:                                              ; preds = %106
  %116 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %117 = getelementptr inbounds %struct.s2n_debug_info, ptr %116, i32 0, i32 0
  %118 = load ptr, ptr %117, align 8, !tbaa !9
  %119 = getelementptr inbounds i8, ptr %118, i64 21
  %120 = call ptr @strrchr(ptr noundef %119, i32 noundef 47) #7
  %121 = getelementptr inbounds i8, ptr %120, i64 1
  br label %127

122:                                              ; preds = %106
  %123 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %124 = getelementptr inbounds %struct.s2n_debug_info, ptr %123, i32 0, i32 0
  %125 = load ptr, ptr %124, align 8, !tbaa !9
  %126 = getelementptr inbounds i8, ptr %125, i64 21
  br label %127

127:                                              ; preds = %122, %115
  %128 = phi ptr [ %121, %115 ], [ %126, %122 ]
  %129 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %130 = getelementptr inbounds %struct.s2n_debug_info, ptr %129, i32 0, i32 1
  store ptr %128, ptr %130, align 8, !tbaa !11
  %131 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %131, align 4, !tbaa !12
  %132 = call i32 @s2n_calculate_stacktrace()
  br label %133

133:                                              ; preds = %127
  %134 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %134, align 4, !tbaa !14
  br label %708

135:                                              ; No predecessors!
  br label %136

136:                                              ; preds = %135, %101
  br label %137

137:                                              ; preds = %136
  br label %138

138:                                              ; preds = %137
  %139 = load ptr, ptr %12, align 8, !tbaa !5
  %140 = icmp ne ptr %139, null
  br i1 %140, label %173, label %141

141:                                              ; preds = %138
  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.3, 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 402653193, ptr %168, align 4, !tbaa !12
  %169 = call i32 @s2n_calculate_stacktrace()
  br label %170

170:                                              ; preds = %164
  %171 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %171, align 4, !tbaa !14
  br label %708

172:                                              ; No predecessors!
  br label %173

173:                                              ; preds = %172, %138
  br label %174

174:                                              ; preds = %173
  br label %175

175:                                              ; preds = %174
  %176 = load ptr, ptr %15, align 8, !tbaa !5
  %177 = icmp ne ptr %176, null
  br i1 %177, label %210, label %178

178:                                              ; preds = %175
  br label %179

179:                                              ; preds = %178
  br label %180

180:                                              ; preds = %179
  %181 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %182 = getelementptr inbounds %struct.s2n_debug_info, ptr %181, i32 0, i32 0
  store ptr @.str.4, ptr %182, align 8, !tbaa !9
  %183 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %184 = getelementptr inbounds %struct.s2n_debug_info, ptr %183, i32 0, i32 0
  %185 = load ptr, ptr %184, align 8, !tbaa !9
  %186 = getelementptr inbounds i8, ptr %185, i64 21
  %187 = call ptr @strrchr(ptr noundef %186, i32 noundef 47) #7
  %188 = icmp ne ptr %187, null
  br i1 %188, label %189, label %196

189:                                              ; preds = %180
  %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 = getelementptr inbounds i8, ptr %194, i64 1
  br label %201

196:                                              ; preds = %180
  %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
  br label %201

201:                                              ; preds = %196, %189
  %202 = phi ptr [ %195, %189 ], [ %200, %196 ]
  %203 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %204 = getelementptr inbounds %struct.s2n_debug_info, ptr %203, i32 0, i32 1
  store ptr %202, ptr %204, align 8, !tbaa !11
  %205 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %205, align 4, !tbaa !12
  %206 = call i32 @s2n_calculate_stacktrace()
  br label %207

207:                                              ; preds = %201
  %208 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %208, align 4, !tbaa !14
  br label %708

209:                                              ; No predecessors!
  br label %210

210:                                              ; preds = %209, %175
  br label %211

211:                                              ; preds = %210
  call void @llvm.lifetime.start.p0(i64 24, ptr %16) #8
  call void @llvm.memset.p0.i64(ptr align 8 %16, i8 0, i64 24, i1 false)
  %212 = load ptr, ptr %13, align 8, !tbaa !5
  %213 = icmp ne ptr %212, null
  br i1 %213, label %215, label %214

214:                                              ; preds = %211
  store ptr %16, ptr %13, align 8, !tbaa !5
  br label %215

215:                                              ; preds = %214, %211
  %216 = load ptr, ptr %14, align 8, !tbaa !5
  %217 = icmp ne ptr %216, null
  br i1 %217, label %219, label %218

218:                                              ; preds = %215
  store ptr %16, ptr %14, align 8, !tbaa !5
  br label %219

219:                                              ; preds = %218, %215
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #8
  %220 = load ptr, ptr %11, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.s2n_blob, ptr %220, i32 0, i32 1
  %222 = load i32, ptr %221, align 8, !tbaa !16
  %223 = load ptr, ptr %12, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.s2n_blob, ptr %223, i32 0, i32 1
  %225 = load i32, ptr %224, align 8, !tbaa !16
  %226 = add i32 %222, %225
  %227 = load ptr, ptr %13, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.s2n_blob, ptr %227, i32 0, i32 1
  %229 = load i32, ptr %228, align 8, !tbaa !16
  %230 = add i32 %226, %229
  %231 = load ptr, ptr %14, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.s2n_blob, ptr %231, i32 0, i32 1
  %233 = load i32, ptr %232, align 8, !tbaa !16
  %234 = add i32 %230, %233
  %235 = zext i32 %234 to i64
  store i64 %235, ptr %17, align 8, !tbaa !18
  br label %236

236:                                              ; preds = %219
  %237 = load i64, ptr %17, align 8, !tbaa !18
  %238 = icmp ule i64 %237, 1024
  br i1 %238, label %273, label %239

239:                                              ; preds = %236
  br label %240

240:                                              ; preds = %239
  br label %241

241:                                              ; preds = %240
  %242 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %243 = getelementptr inbounds %struct.s2n_debug_info, ptr %242, i32 0, i32 0
  store ptr @.str.5, ptr %243, align 8, !tbaa !9
  %244 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %245 = getelementptr inbounds %struct.s2n_debug_info, ptr %244, i32 0, i32 0
  %246 = load ptr, ptr %245, align 8, !tbaa !9
  %247 = getelementptr inbounds i8, ptr %246, i64 21
  %248 = call ptr @strrchr(ptr noundef %247, i32 noundef 47) #7
  %249 = icmp ne ptr %248, null
  br i1 %249, label %250, label %257

250:                                              ; preds = %241
  %251 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %252 = getelementptr inbounds %struct.s2n_debug_info, ptr %251, i32 0, i32 0
  %253 = load ptr, ptr %252, align 8, !tbaa !9
  %254 = getelementptr inbounds i8, ptr %253, i64 21
  %255 = call ptr @strrchr(ptr noundef %254, i32 noundef 47) #7
  %256 = getelementptr inbounds i8, ptr %255, i64 1
  br label %262

257:                                              ; preds = %241
  %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
  %260 = load ptr, ptr %259, align 8, !tbaa !9
  %261 = getelementptr inbounds i8, ptr %260, i64 21
  br label %262

262:                                              ; preds = %257, %250
  %263 = phi ptr [ %256, %250 ], [ %261, %257 ]
  %264 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %265 = getelementptr inbounds %struct.s2n_debug_info, ptr %264, i32 0, i32 1
  store ptr %263, ptr %265, align 8, !tbaa !11
  %266 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653207, ptr %266, align 4, !tbaa !12
  %267 = call i32 @s2n_calculate_stacktrace()
  br label %268

268:                                              ; preds = %262
  br label %269

269:                                              ; preds = %268
  %270 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %270, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %707

271:                                              ; No predecessors!
  br label %272

272:                                              ; preds = %271
  br label %273

273:                                              ; preds = %272, %236
  br label %274

274:                                              ; preds = %273
  br label %275

275:                                              ; preds = %274
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #8
  store ptr @.str.6, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #8
  store ptr @.str.7, ptr %20, align 8, !tbaa !5
  %276 = load ptr, ptr %9, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.s2n_connection, ptr %276, i32 0, i32 23
  %278 = load i8, ptr %277, align 4, !tbaa !20
  %279 = zext i8 %278 to i32
  %280 = icmp eq i32 %279, 33
  br i1 %280, label %281, label %472

281:                                              ; preds = %275
  store ptr @.str.8, ptr %20, align 8, !tbaa !5
  br label %282

282:                                              ; preds = %281
  %283 = load ptr, ptr %9, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.s2n_connection, ptr %283, i32 0, i32 27
  %285 = load ptr, ptr %284, align 8, !tbaa !45
  %286 = icmp ne ptr %285, null
  br i1 %286, label %321, label %287

287:                                              ; preds = %282
  br label %288

288:                                              ; preds = %287
  br label %289

289:                                              ; preds = %288
  %290 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %291 = getelementptr inbounds %struct.s2n_debug_info, ptr %290, i32 0, i32 0
  store ptr @.str.9, ptr %291, align 8, !tbaa !9
  %292 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %293 = getelementptr inbounds %struct.s2n_debug_info, ptr %292, i32 0, i32 0
  %294 = load ptr, ptr %293, align 8, !tbaa !9
  %295 = getelementptr inbounds i8, ptr %294, i64 21
  %296 = call ptr @strrchr(ptr noundef %295, i32 noundef 47) #7
  %297 = icmp ne ptr %296, null
  br i1 %297, label %298, label %305

298:                                              ; preds = %289
  %299 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %300 = getelementptr inbounds %struct.s2n_debug_info, ptr %299, i32 0, i32 0
  %301 = load ptr, ptr %300, align 8, !tbaa !9
  %302 = getelementptr inbounds i8, ptr %301, i64 21
  %303 = call ptr @strrchr(ptr noundef %302, i32 noundef 47) #7
  %304 = getelementptr inbounds i8, ptr %303, i64 1
  br label %310

305:                                              ; preds = %289
  %306 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %307 = getelementptr inbounds %struct.s2n_debug_info, ptr %306, i32 0, i32 0
  %308 = load ptr, ptr %307, align 8, !tbaa !9
  %309 = getelementptr inbounds i8, ptr %308, i64 21
  br label %310

310:                                              ; preds = %305, %298
  %311 = phi ptr [ %304, %298 ], [ %309, %305 ]
  %312 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %313 = getelementptr inbounds %struct.s2n_debug_info, ptr %312, i32 0, i32 1
  store ptr %311, ptr %313, align 8, !tbaa !11
  %314 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %314, align 4, !tbaa !12
  %315 = call i32 @s2n_calculate_stacktrace()
  br label %316

316:                                              ; preds = %310
  br label %317

317:                                              ; preds = %316
  %318 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %318, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %706

319:                                              ; No predecessors!
  br label %320

320:                                              ; preds = %319
  br label %321

321:                                              ; preds = %320, %282
  br label %322

322:                                              ; preds = %321
  br label %323

323:                                              ; preds = %322
  br label %324

324:                                              ; preds = %323
  %325 = load ptr, ptr %9, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.s2n_connection, ptr %325, i32 0, i32 27
  %327 = load ptr, ptr %326, align 8, !tbaa !45
  %328 = getelementptr inbounds %struct.s2n_crypto_parameters, ptr %327, i32 0, i32 0
  %329 = load ptr, ptr %328, align 8, !tbaa !46
  %330 = icmp ne ptr %329, null
  br i1 %330, label %365, label %331

331:                                              ; preds = %324
  br label %332

332:                                              ; preds = %331
  br label %333

333:                                              ; preds = %332
  %334 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %335 = getelementptr inbounds %struct.s2n_debug_info, ptr %334, i32 0, i32 0
  store ptr @.str.10, ptr %335, align 8, !tbaa !9
  %336 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %337 = getelementptr inbounds %struct.s2n_debug_info, ptr %336, i32 0, i32 0
  %338 = load ptr, ptr %337, align 8, !tbaa !9
  %339 = getelementptr inbounds i8, ptr %338, i64 21
  %340 = call ptr @strrchr(ptr noundef %339, i32 noundef 47) #7
  %341 = icmp ne ptr %340, null
  br i1 %341, label %342, label %349

342:                                              ; preds = %333
  %343 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %344 = getelementptr inbounds %struct.s2n_debug_info, ptr %343, i32 0, i32 0
  %345 = load ptr, ptr %344, align 8, !tbaa !9
  %346 = getelementptr inbounds i8, ptr %345, i64 21
  %347 = call ptr @strrchr(ptr noundef %346, i32 noundef 47) #7
  %348 = getelementptr inbounds i8, ptr %347, i64 1
  br label %354

349:                                              ; preds = %333
  %350 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %351 = getelementptr inbounds %struct.s2n_debug_info, ptr %350, i32 0, i32 0
  %352 = load ptr, ptr %351, align 8, !tbaa !9
  %353 = getelementptr inbounds i8, ptr %352, i64 21
  br label %354

354:                                              ; preds = %349, %342
  %355 = phi ptr [ %348, %342 ], [ %353, %349 ]
  %356 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %357 = getelementptr inbounds %struct.s2n_debug_info, ptr %356, i32 0, i32 1
  store ptr %355, ptr %357, align 8, !tbaa !11
  %358 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %358, align 4, !tbaa !12
  %359 = call i32 @s2n_calculate_stacktrace()
  br label %360

360:                                              ; preds = %354
  br label %361

361:                                              ; preds = %360
  %362 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %362, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %706

363:                                              ; No predecessors!
  br label %364

364:                                              ; preds = %363
  br label %365

365:                                              ; preds = %364, %324
  br label %366

366:                                              ; preds = %365
  br label %367

367:                                              ; preds = %366
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #8
  %368 = load ptr, ptr %9, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.s2n_connection, ptr %368, i32 0, i32 27
  %370 = load ptr, ptr %369, align 8, !tbaa !45
  %371 = getelementptr inbounds %struct.s2n_crypto_parameters, ptr %370, i32 0, i32 0
  %372 = load ptr, ptr %371, align 8, !tbaa !46
  %373 = getelementptr inbounds %struct.s2n_cipher_suite, ptr %372, i32 0, i32 11
  %374 = load i32, ptr %373, align 8, !tbaa !51
  store i32 %374, ptr %21, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  store ptr null, ptr %22, align 8, !tbaa !5
  br label %375

375:                                              ; preds = %367
  %376 = load i32, ptr %21, align 4, !tbaa !12
  %377 = call i32 @s2n_hmac_md_from_alg(i32 noundef %376, ptr noundef %22)
  %378 = getelementptr inbounds %struct.s2n_result, ptr %23, i32 0, i32 0
  store i32 %377, ptr %378, align 4
  %379 = getelementptr inbounds %struct.s2n_result, ptr %23, i32 0, i32 0
  %380 = load i32, ptr %379, align 4
  %381 = call zeroext i1 @s2n_result_is_ok(i32 %380)
  br i1 %381, label %384, label %382

382:                                              ; preds = %375
  %383 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %383, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %469

384:                                              ; preds = %375
  br label %385

385:                                              ; preds = %384
  br label %386

386:                                              ; preds = %385
  br label %387

387:                                              ; preds = %386
  %388 = load ptr, ptr %22, align 8, !tbaa !5
  %389 = icmp ne ptr %388, null
  br i1 %389, label %424, label %390

390:                                              ; preds = %387
  br label %391

391:                                              ; preds = %390
  br label %392

392:                                              ; preds = %391
  %393 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %394 = getelementptr inbounds %struct.s2n_debug_info, ptr %393, i32 0, i32 0
  store ptr @.str.11, ptr %394, align 8, !tbaa !9
  %395 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %396 = getelementptr inbounds %struct.s2n_debug_info, ptr %395, i32 0, i32 0
  %397 = load ptr, ptr %396, align 8, !tbaa !9
  %398 = getelementptr inbounds i8, ptr %397, i64 21
  %399 = call ptr @strrchr(ptr noundef %398, i32 noundef 47) #7
  %400 = icmp ne ptr %399, null
  br i1 %400, label %401, label %408

401:                                              ; preds = %392
  %402 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %403 = getelementptr inbounds %struct.s2n_debug_info, ptr %402, i32 0, i32 0
  %404 = load ptr, ptr %403, align 8, !tbaa !9
  %405 = getelementptr inbounds i8, ptr %404, i64 21
  %406 = call ptr @strrchr(ptr noundef %405, i32 noundef 47) #7
  %407 = getelementptr inbounds i8, ptr %406, i64 1
  br label %413

408:                                              ; preds = %392
  %409 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %410 = getelementptr inbounds %struct.s2n_debug_info, ptr %409, i32 0, i32 0
  %411 = load ptr, ptr %410, align 8, !tbaa !9
  %412 = getelementptr inbounds i8, ptr %411, i64 21
  br label %413

413:                                              ; preds = %408, %401
  %414 = phi ptr [ %407, %401 ], [ %412, %408 ]
  %415 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %416 = getelementptr inbounds %struct.s2n_debug_info, ptr %415, i32 0, i32 1
  store ptr %414, ptr %416, align 8, !tbaa !11
  %417 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %417, align 4, !tbaa !12
  %418 = call i32 @s2n_calculate_stacktrace()
  br label %419

419:                                              ; preds = %413
  br label %420

420:                                              ; preds = %419
  %421 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %421, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %469

422:                                              ; No predecessors!
  br label %423

423:                                              ; preds = %422
  br label %424

424:                                              ; preds = %423, %387
  br label %425

425:                                              ; preds = %424
  br label %426

426:                                              ; preds = %425
  %427 = load ptr, ptr %22, align 8, !tbaa !5
  %428 = call ptr @EVP_MD_get0_name(ptr noundef %427)
  store ptr %428, ptr %19, align 8, !tbaa !5
  br label %429

429:                                              ; preds = %426
  %430 = load ptr, ptr %19, align 8, !tbaa !5
  %431 = icmp ne ptr %430, null
  br i1 %431, label %466, label %432

432:                                              ; preds = %429
  br label %433

433:                                              ; preds = %432
  br label %434

434:                                              ; preds = %433
  %435 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %436 = getelementptr inbounds %struct.s2n_debug_info, ptr %435, i32 0, i32 0
  store ptr @.str.12, ptr %436, align 8, !tbaa !9
  %437 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %438 = getelementptr inbounds %struct.s2n_debug_info, ptr %437, i32 0, i32 0
  %439 = load ptr, ptr %438, align 8, !tbaa !9
  %440 = getelementptr inbounds i8, ptr %439, i64 21
  %441 = call ptr @strrchr(ptr noundef %440, i32 noundef 47) #7
  %442 = icmp ne ptr %441, null
  br i1 %442, label %443, label %450

443:                                              ; preds = %434
  %444 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %445 = getelementptr inbounds %struct.s2n_debug_info, ptr %444, i32 0, i32 0
  %446 = load ptr, ptr %445, align 8, !tbaa !9
  %447 = getelementptr inbounds i8, ptr %446, i64 21
  %448 = call ptr @strrchr(ptr noundef %447, i32 noundef 47) #7
  %449 = getelementptr inbounds i8, ptr %448, i64 1
  br label %455

450:                                              ; preds = %434
  %451 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %452 = getelementptr inbounds %struct.s2n_debug_info, ptr %451, i32 0, i32 0
  %453 = load ptr, ptr %452, align 8, !tbaa !9
  %454 = getelementptr inbounds i8, ptr %453, i64 21
  br label %455

455:                                              ; preds = %450, %443
  %456 = phi ptr [ %449, %443 ], [ %454, %450 ]
  %457 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %458 = getelementptr inbounds %struct.s2n_debug_info, ptr %457, i32 0, i32 1
  store ptr %456, ptr %458, align 8, !tbaa !11
  %459 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %459, align 4, !tbaa !12
  %460 = call i32 @s2n_calculate_stacktrace()
  br label %461

461:                                              ; preds = %455
  br label %462

462:                                              ; preds = %461
  %463 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %463, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %469

464:                                              ; No predecessors!
  br label %465

465:                                              ; preds = %464
  br label %466

466:                                              ; preds = %465, %429
  br label %467

467:                                              ; preds = %466
  br label %468

468:                                              ; preds = %467
  store i32 0, ptr %18, align 4
  br label %469

469:                                              ; preds = %468, %462, %420, %382
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #8
  %470 = load i32, ptr %18, align 4
  switch i32 %470, label %706 [
    i32 0, label %471
  ]

471:                                              ; preds = %469
  br label %472

472:                                              ; preds = %471, %275
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #8
  %473 = load ptr, ptr %20, align 8, !tbaa !5
  %474 = call ptr @EVP_KDF_fetch(ptr noundef null, ptr noundef @.str.13, ptr noundef %473)
  store ptr %474, ptr %24, align 8, !tbaa !5
  br label %475

475:                                              ; preds = %472
  %476 = load ptr, ptr %24, align 8, !tbaa !5
  %477 = icmp ne ptr %476, null
  br i1 %477, label %512, label %478

478:                                              ; preds = %475
  br label %479

479:                                              ; preds = %478
  br label %480

480:                                              ; preds = %479
  %481 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %482 = getelementptr inbounds %struct.s2n_debug_info, ptr %481, i32 0, i32 0
  store ptr @.str.14, ptr %482, align 8, !tbaa !9
  %483 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %484 = getelementptr inbounds %struct.s2n_debug_info, ptr %483, i32 0, i32 0
  %485 = load ptr, ptr %484, align 8, !tbaa !9
  %486 = getelementptr inbounds i8, ptr %485, i64 21
  %487 = call ptr @strrchr(ptr noundef %486, i32 noundef 47) #7
  %488 = icmp ne ptr %487, null
  br i1 %488, label %489, label %496

489:                                              ; preds = %480
  %490 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %491 = getelementptr inbounds %struct.s2n_debug_info, ptr %490, i32 0, i32 0
  %492 = load ptr, ptr %491, align 8, !tbaa !9
  %493 = getelementptr inbounds i8, ptr %492, i64 21
  %494 = call ptr @strrchr(ptr noundef %493, i32 noundef 47) #7
  %495 = getelementptr inbounds i8, ptr %494, i64 1
  br label %501

496:                                              ; preds = %480
  %497 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %498 = getelementptr inbounds %struct.s2n_debug_info, ptr %497, i32 0, i32 0
  %499 = load ptr, ptr %498, align 8, !tbaa !9
  %500 = getelementptr inbounds i8, ptr %499, i64 21
  br label %501

501:                                              ; preds = %496, %489
  %502 = phi ptr [ %495, %489 ], [ %500, %496 ]
  %503 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %504 = getelementptr inbounds %struct.s2n_debug_info, ptr %503, i32 0, i32 1
  store ptr %502, ptr %504, align 8, !tbaa !11
  %505 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653206, ptr %505, align 4, !tbaa !12
  %506 = call i32 @s2n_calculate_stacktrace()
  br label %507

507:                                              ; preds = %501
  br label %508

508:                                              ; preds = %507
  %509 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %509, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %705

510:                                              ; No predecessors!
  br label %511

511:                                              ; preds = %510
  br label %512

512:                                              ; preds = %511, %475
  br label %513

513:                                              ; preds = %512
  br label %514

514:                                              ; preds = %513
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #8
  %515 = load ptr, ptr %24, align 8, !tbaa !5
  %516 = call ptr @EVP_KDF_CTX_new(ptr noundef %515)
  store ptr %516, ptr %25, align 8, !tbaa !5
  br label %517

517:                                              ; preds = %514
  %518 = load ptr, ptr %25, align 8, !tbaa !5
  %519 = icmp ne ptr %518, null
  br i1 %519, label %554, label %520

520:                                              ; preds = %517
  br label %521

521:                                              ; preds = %520
  br label %522

522:                                              ; preds = %521
  %523 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %524 = getelementptr inbounds %struct.s2n_debug_info, ptr %523, i32 0, i32 0
  store ptr @.str.15, ptr %524, align 8, !tbaa !9
  %525 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %526 = getelementptr inbounds %struct.s2n_debug_info, ptr %525, i32 0, i32 0
  %527 = load ptr, ptr %526, align 8, !tbaa !9
  %528 = getelementptr inbounds i8, ptr %527, i64 21
  %529 = call ptr @strrchr(ptr noundef %528, i32 noundef 47) #7
  %530 = icmp ne ptr %529, null
  br i1 %530, label %531, label %538

531:                                              ; preds = %522
  %532 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %533 = getelementptr inbounds %struct.s2n_debug_info, ptr %532, i32 0, i32 0
  %534 = load ptr, ptr %533, align 8, !tbaa !9
  %535 = getelementptr inbounds i8, ptr %534, i64 21
  %536 = call ptr @strrchr(ptr noundef %535, i32 noundef 47) #7
  %537 = getelementptr inbounds i8, ptr %536, i64 1
  br label %543

538:                                              ; preds = %522
  %539 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %540 = getelementptr inbounds %struct.s2n_debug_info, ptr %539, i32 0, i32 0
  %541 = load ptr, ptr %540, align 8, !tbaa !9
  %542 = getelementptr inbounds i8, ptr %541, i64 21
  br label %543

543:                                              ; preds = %538, %531
  %544 = phi ptr [ %537, %531 ], [ %542, %538 ]
  %545 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %546 = getelementptr inbounds %struct.s2n_debug_info, ptr %545, i32 0, i32 1
  store ptr %544, ptr %546, align 8, !tbaa !11
  %547 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %547, align 4, !tbaa !12
  %548 = call i32 @s2n_calculate_stacktrace()
  br label %549

549:                                              ; preds = %543
  br label %550

550:                                              ; preds = %549
  %551 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %551, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %704

552:                                              ; No predecessors!
  br label %553

553:                                              ; preds = %552
  br label %554

554:                                              ; preds = %553, %517
  br label %555

555:                                              ; preds = %554
  br label %556

556:                                              ; preds = %555
  call void @llvm.lifetime.start.p0(i64 320, ptr %26) #8
  %557 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i32 0, i32 0
  store ptr @.str.16, ptr %557, align 8, !tbaa !53
  %558 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i32 0, i32 1
  store i32 4, ptr %558, align 8, !tbaa !55
  %559 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i32 0, i32 2
  %560 = load ptr, ptr %20, align 8, !tbaa !5
  %561 = ptrtoint ptr %560 to i64
  %562 = inttoptr i64 %561 to ptr
  store ptr %562, ptr %559, align 8, !tbaa !56
  %563 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i32 0, i32 3
  %564 = load ptr, ptr %20, align 8, !tbaa !5
  %565 = ptrtoint ptr %564 to i64
  %566 = inttoptr i64 %565 to ptr
  %567 = call i64 @strlen(ptr noundef %566) #7
  store i64 %567, ptr %563, align 8, !tbaa !57
  %568 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i32 0, i32 4
  store i64 -1, ptr %568, align 8, !tbaa !58
  %569 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i64 1
  %570 = getelementptr inbounds %struct.ossl_param_st, ptr %569, i32 0, i32 0
  store ptr @.str.17, ptr %570, align 8, !tbaa !53
  %571 = getelementptr inbounds %struct.ossl_param_st, ptr %569, i32 0, i32 1
  store i32 4, ptr %571, align 8, !tbaa !55
  %572 = getelementptr inbounds %struct.ossl_param_st, ptr %569, i32 0, i32 2
  %573 = load ptr, ptr %19, align 8, !tbaa !5
  %574 = ptrtoint ptr %573 to i64
  %575 = inttoptr i64 %574 to ptr
  store ptr %575, ptr %572, align 8, !tbaa !56
  %576 = getelementptr inbounds %struct.ossl_param_st, ptr %569, i32 0, i32 3
  %577 = load ptr, ptr %19, align 8, !tbaa !5
  %578 = ptrtoint ptr %577 to i64
  %579 = inttoptr i64 %578 to ptr
  %580 = call i64 @strlen(ptr noundef %579) #7
  store i64 %580, ptr %576, align 8, !tbaa !57
  %581 = getelementptr inbounds %struct.ossl_param_st, ptr %569, i32 0, i32 4
  store i64 -1, ptr %581, align 8, !tbaa !58
  %582 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i64 2
  %583 = getelementptr inbounds %struct.ossl_param_st, ptr %582, i32 0, i32 0
  store ptr @.str.18, ptr %583, align 8, !tbaa !53
  %584 = getelementptr inbounds %struct.ossl_param_st, ptr %582, i32 0, i32 1
  store i32 5, ptr %584, align 8, !tbaa !55
  %585 = getelementptr inbounds %struct.ossl_param_st, ptr %582, i32 0, i32 2
  %586 = load ptr, ptr %10, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.s2n_blob, ptr %586, i32 0, i32 0
  %588 = load ptr, ptr %587, align 8, !tbaa !59
  store ptr %588, ptr %585, align 8, !tbaa !56
  %589 = getelementptr inbounds %struct.ossl_param_st, ptr %582, i32 0, i32 3
  %590 = load ptr, ptr %10, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct.s2n_blob, ptr %590, i32 0, i32 1
  %592 = load i32, ptr %591, align 8, !tbaa !16
  %593 = zext i32 %592 to i64
  store i64 %593, ptr %589, align 8, !tbaa !57
  %594 = getelementptr inbounds %struct.ossl_param_st, ptr %582, i32 0, i32 4
  store i64 -1, ptr %594, align 8, !tbaa !58
  %595 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i64 3
  %596 = getelementptr inbounds %struct.ossl_param_st, ptr %595, i32 0, i32 0
  store ptr @.str.19, ptr %596, align 8, !tbaa !53
  %597 = getelementptr inbounds %struct.ossl_param_st, ptr %595, i32 0, i32 1
  store i32 5, ptr %597, align 8, !tbaa !55
  %598 = getelementptr inbounds %struct.ossl_param_st, ptr %595, i32 0, i32 2
  %599 = load ptr, ptr %11, align 8, !tbaa !5
  %600 = getelementptr inbounds %struct.s2n_blob, ptr %599, i32 0, i32 0
  %601 = load ptr, ptr %600, align 8, !tbaa !59
  store ptr %601, ptr %598, align 8, !tbaa !56
  %602 = getelementptr inbounds %struct.ossl_param_st, ptr %595, i32 0, i32 3
  %603 = load ptr, ptr %11, align 8, !tbaa !5
  %604 = getelementptr inbounds %struct.s2n_blob, ptr %603, i32 0, i32 1
  %605 = load i32, ptr %604, align 8, !tbaa !16
  %606 = zext i32 %605 to i64
  store i64 %606, ptr %602, align 8, !tbaa !57
  %607 = getelementptr inbounds %struct.ossl_param_st, ptr %595, i32 0, i32 4
  store i64 -1, ptr %607, align 8, !tbaa !58
  %608 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i64 4
  %609 = getelementptr inbounds %struct.ossl_param_st, ptr %608, i32 0, i32 0
  store ptr @.str.19, ptr %609, align 8, !tbaa !53
  %610 = getelementptr inbounds %struct.ossl_param_st, ptr %608, i32 0, i32 1
  store i32 5, ptr %610, align 8, !tbaa !55
  %611 = getelementptr inbounds %struct.ossl_param_st, ptr %608, i32 0, i32 2
  %612 = load ptr, ptr %12, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct.s2n_blob, ptr %612, i32 0, i32 0
  %614 = load ptr, ptr %613, align 8, !tbaa !59
  store ptr %614, ptr %611, align 8, !tbaa !56
  %615 = getelementptr inbounds %struct.ossl_param_st, ptr %608, i32 0, i32 3
  %616 = load ptr, ptr %12, align 8, !tbaa !5
  %617 = getelementptr inbounds %struct.s2n_blob, ptr %616, i32 0, i32 1
  %618 = load i32, ptr %617, align 8, !tbaa !16
  %619 = zext i32 %618 to i64
  store i64 %619, ptr %615, align 8, !tbaa !57
  %620 = getelementptr inbounds %struct.ossl_param_st, ptr %608, i32 0, i32 4
  store i64 -1, ptr %620, align 8, !tbaa !58
  %621 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i64 5
  %622 = getelementptr inbounds %struct.ossl_param_st, ptr %621, i32 0, i32 0
  store ptr @.str.19, ptr %622, align 8, !tbaa !53
  %623 = getelementptr inbounds %struct.ossl_param_st, ptr %621, i32 0, i32 1
  store i32 5, ptr %623, align 8, !tbaa !55
  %624 = getelementptr inbounds %struct.ossl_param_st, ptr %621, i32 0, i32 2
  %625 = load ptr, ptr %13, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.s2n_blob, ptr %625, i32 0, i32 0
  %627 = load ptr, ptr %626, align 8, !tbaa !59
  store ptr %627, ptr %624, align 8, !tbaa !56
  %628 = getelementptr inbounds %struct.ossl_param_st, ptr %621, i32 0, i32 3
  %629 = load ptr, ptr %13, align 8, !tbaa !5
  %630 = getelementptr inbounds %struct.s2n_blob, ptr %629, i32 0, i32 1
  %631 = load i32, ptr %630, align 8, !tbaa !16
  %632 = zext i32 %631 to i64
  store i64 %632, ptr %628, align 8, !tbaa !57
  %633 = getelementptr inbounds %struct.ossl_param_st, ptr %621, i32 0, i32 4
  store i64 -1, ptr %633, align 8, !tbaa !58
  %634 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i64 6
  %635 = getelementptr inbounds %struct.ossl_param_st, ptr %634, i32 0, i32 0
  store ptr @.str.19, ptr %635, align 8, !tbaa !53
  %636 = getelementptr inbounds %struct.ossl_param_st, ptr %634, i32 0, i32 1
  store i32 5, ptr %636, align 8, !tbaa !55
  %637 = getelementptr inbounds %struct.ossl_param_st, ptr %634, i32 0, i32 2
  %638 = load ptr, ptr %14, align 8, !tbaa !5
  %639 = getelementptr inbounds %struct.s2n_blob, ptr %638, i32 0, i32 0
  %640 = load ptr, ptr %639, align 8, !tbaa !59
  store ptr %640, ptr %637, align 8, !tbaa !56
  %641 = getelementptr inbounds %struct.ossl_param_st, ptr %634, i32 0, i32 3
  %642 = load ptr, ptr %14, align 8, !tbaa !5
  %643 = getelementptr inbounds %struct.s2n_blob, ptr %642, i32 0, i32 1
  %644 = load i32, ptr %643, align 8, !tbaa !16
  %645 = zext i32 %644 to i64
  store i64 %645, ptr %641, align 8, !tbaa !57
  %646 = getelementptr inbounds %struct.ossl_param_st, ptr %634, i32 0, i32 4
  store i64 -1, ptr %646, align 8, !tbaa !58
  %647 = getelementptr inbounds %struct.ossl_param_st, ptr %26, i64 7
  call void @llvm.memset.p0.i64(ptr align 8 %647, i8 0, i64 40, i1 false)
  %648 = getelementptr inbounds %struct.ossl_param_st, ptr %647, i32 0, i32 0
  %649 = getelementptr inbounds %struct.ossl_param_st, ptr %647, i32 0, i32 1
  %650 = getelementptr inbounds %struct.ossl_param_st, ptr %647, i32 0, i32 2
  %651 = getelementptr inbounds %struct.ossl_param_st, ptr %647, i32 0, i32 3
  %652 = getelementptr inbounds %struct.ossl_param_st, ptr %647, i32 0, i32 4
  br label %653

653:                                              ; preds = %556
  %654 = load ptr, ptr %25, align 8, !tbaa !5
  %655 = load ptr, ptr %15, align 8, !tbaa !5
  %656 = getelementptr inbounds %struct.s2n_blob, ptr %655, i32 0, i32 0
  %657 = load ptr, ptr %656, align 8, !tbaa !59
  %658 = load ptr, ptr %15, align 8, !tbaa !5
  %659 = getelementptr inbounds %struct.s2n_blob, ptr %658, i32 0, i32 1
  %660 = load i32, ptr %659, align 8, !tbaa !16
  %661 = zext i32 %660 to i64
  %662 = getelementptr inbounds [8 x %struct.ossl_param_st], ptr %26, i64 0, i64 0
  %663 = call i32 @EVP_KDF_derive(ptr noundef %654, ptr noundef %657, i64 noundef %661, ptr noundef %662)
  %664 = icmp eq i32 %663, 1
  br i1 %664, label %699, label %665

665:                                              ; preds = %653
  br label %666

666:                                              ; preds = %665
  br label %667

667:                                              ; preds = %666
  %668 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %669 = getelementptr inbounds %struct.s2n_debug_info, ptr %668, i32 0, i32 0
  store ptr @.str.20, ptr %669, align 8, !tbaa !9
  %670 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %671 = getelementptr inbounds %struct.s2n_debug_info, ptr %670, i32 0, i32 0
  %672 = load ptr, ptr %671, align 8, !tbaa !9
  %673 = getelementptr inbounds i8, ptr %672, i64 21
  %674 = call ptr @strrchr(ptr noundef %673, i32 noundef 47) #7
  %675 = icmp ne ptr %674, null
  br i1 %675, label %676, label %683

676:                                              ; preds = %667
  %677 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %678 = getelementptr inbounds %struct.s2n_debug_info, ptr %677, i32 0, i32 0
  %679 = load ptr, ptr %678, align 8, !tbaa !9
  %680 = getelementptr inbounds i8, ptr %679, i64 21
  %681 = call ptr @strrchr(ptr noundef %680, i32 noundef 47) #7
  %682 = getelementptr inbounds i8, ptr %681, i64 1
  br label %688

683:                                              ; preds = %667
  %684 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %685 = getelementptr inbounds %struct.s2n_debug_info, ptr %684, i32 0, i32 0
  %686 = load ptr, ptr %685, align 8, !tbaa !9
  %687 = getelementptr inbounds i8, ptr %686, i64 21
  br label %688

688:                                              ; preds = %683, %676
  %689 = phi ptr [ %682, %676 ], [ %687, %683 ]
  %690 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %691 = getelementptr inbounds %struct.s2n_debug_info, ptr %690, i32 0, i32 1
  store ptr %689, ptr %691, align 8, !tbaa !11
  %692 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653208, ptr %692, align 4, !tbaa !12
  %693 = call i32 @s2n_calculate_stacktrace()
  br label %694

694:                                              ; preds = %688
  br label %695

695:                                              ; preds = %694
  %696 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 -1, ptr %696, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %703

697:                                              ; No predecessors!
  br label %698

698:                                              ; preds = %697
  br label %699

699:                                              ; preds = %698, %653
  br label %700

700:                                              ; preds = %699
  br label %701

701:                                              ; preds = %700
  %702 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  store i32 0, ptr %702, align 4, !tbaa !14
  store i32 1, ptr %18, align 4
  br label %703

703:                                              ; preds = %701, %695
  call void @llvm.lifetime.end.p0(i64 320, ptr %26) #8
  br label %704

704:                                              ; preds = %703, %550
  call void @EVP_KDF_CTX_free_pointer(ptr noundef %25)
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #8
  br label %705

705:                                              ; preds = %704, %508
  call void @EVP_KDF_free_pointer(ptr noundef %24)
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #8
  br label %706

706:                                              ; preds = %705, %469, %361, %317
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  br label %707

707:                                              ; preds = %706, %269
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %16) #8
  br label %708

708:                                              ; preds = %707, %207, %170, %133, %96, %59
  %709 = getelementptr inbounds %struct.s2n_result, ptr %8, i32 0, i32 0
  %710 = load i32, ptr %709, align 4
  ret i32 %710
}

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

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

declare i32 @s2n_calculate_stacktrace() #3

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #5

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

declare i32 @s2n_hmac_md_from_alg(i32 noundef, ptr noundef) #3

declare ptr @EVP_MD_get0_name(ptr noundef) #3

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

declare ptr @EVP_KDF_fetch(ptr noundef, ptr noundef, ptr noundef) #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @EVP_KDF_free_pointer(ptr noundef) #6

declare ptr @EVP_KDF_CTX_new(ptr noundef) #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @EVP_KDF_CTX_free_pointer(ptr noundef) #6

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

declare i32 @EVP_KDF_derive(ptr noundef, ptr noundef, i64 noundef, ptr noundef) #3

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { "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 nosync nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { nounwind 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 0}
!15 = !{!"", !13, i64 0}
!16 = !{!17, !13, i64 8}
!17 = !{!"s2n_blob", !6, i64 0, !13, i64 8, !13, i64 12, !13, i64 16}
!18 = !{!19, !19, i64 0}
!19 = !{!"long", !7, i64 0}
!20 = !{!21, !7, i64 220}
!21 = !{!"s2n_connection", !13, i64 0, !13, i64 0, !13, i64 0, !13, i64 0, !13, i64 0, !13, i64 0, !13, i64 0, !13, i64 0, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 2, !13, i64 2, !13, i64 2, !13, i64 2, !13, i64 2, !13, i64 2, !13, i64 2, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !7, i64 80, !7, i64 102, !7, i64 124, !13, i64 148, !13, i64 152, !22, i64 160, !19, i64 168, !19, i64 176, !7, i64 184, !7, i64 216, !7, i64 217, !7, i64 218, !7, i64 219, !7, i64 220, !7, i64 221, !7, i64 222, !6, i64 224, !6, i64 232, !23, i64 240, !6, i64 632, !6, i64 640, !24, i64 648, !30, i64 1144, !33, i64 1688, !6, i64 1752, !7, i64 1760, !13, i64 1764, !7, i64 1768, !36, i64 1776, !36, i64 1816, !36, i64 1856, !36, i64 1896, !13, i64 1936, !19, i64 1944, !7, i64 1952, !36, i64 1960, !7, i64 2000, !7, i64 2001, !7, i64 2002, !29, i64 2003, !15, i64 2004, !15, i64 2008, !37, i64 2016, !35, i64 2208, !13, i64 2212, !35, i64 2216, !19, i64 2224, !7, i64 2232, !19, i64 2240, !19, i64 2248, !19, i64 2256, !15, i64 2264, !15, i64 2268, !7, i64 2272, !7, i64 2528, !13, i64 2784, !17, i64 2792, !13, i64 2816, !17, i64 2824, !17, i64 2848, !17, i64 2872, !39, i64 2896, !41, i64 3704, !6, i64 3760, !6, i64 3768, !7, i64 3776, !13, i64 3780, !17, i64 3784, !13, i64 3808, !43, i64 3816, !7, i64 3848, !36, i64 3992, !17, i64 4032, !17, i64 4056, !29, i64 4080, !29, i64 4081, !29, i64 4082, !35, i64 4084, !35, i64 4086, !13, i64 4088, !13, i64 4092, !17, i64 4096, !13, i64 4120, !44, i64 4128, !15, i64 4176, !7, i64 4180, !7, i64 4181}
!22 = !{!"s2n_timer", !19, i64 0}
!23 = !{!"s2n_secrets", !7, i64 0, !13, i64 388}
!24 = !{!"s2n_kex_parameters", !25, i64 0, !26, i64 8, !7, i64 24, !26, i64 56, !27, i64 72, !27, i64 184, !7, i64 296, !28, i64 360, !17, i64 448, !17, i64 472}
!25 = !{!"s2n_dh_params", !6, i64 0}
!26 = !{!"s2n_ecc_evp_params", !6, i64 0, !6, i64 8}
!27 = !{!"s2n_kem_group_params", !6, i64 0, !28, i64 8, !26, i64 96}
!28 = !{!"s2n_kem_params", !6, i64 0, !17, i64 8, !17, i64 32, !17, i64 56, !29, i64 80}
!29 = !{!"_Bool", !7, i64 0}
!30 = !{!"s2n_handshake_parameters", !31, i64 0, !31, i64 48, !17, i64 96, !13, i64 120, !32, i64 124, !6, i64 384, !6, i64 392, !6, i64 400, !7, i64 408, !7, i64 440, !7, i64 472, !7, i64 473, !7, i64 474, !7, i64 506}
!31 = !{!"s2n_pkey", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40}
!32 = !{!"s2n_sig_scheme_list", !7, i64 0, !7, i64 256}
!33 = !{!"s2n_psk_parameters", !13, i64 0, !34, i64 8, !35, i64 40, !35, i64 42, !6, i64 48, !13, i64 56}
!34 = !{!"s2n_array", !17, i64 0, !13, i64 24, !13, i64 28}
!35 = !{!"short", !7, i64 0}
!36 = !{!"s2n_stuffer", !17, i64 0, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 36, !13, i64 36}
!37 = !{!"s2n_handshake", !36, i64 0, !6, i64 40, !7, i64 48, !7, i64 56, !7, i64 104, !7, i64 152, !13, i64 156, !13, i64 160, !13, i64 164, !13, i64 168, !38, i64 176, !13, i64 184, !13, i64 184, !13, i64 184, !13, i64 184, !13, i64 188}
!38 = !{!"s2n_offered_early_data", !6, i64 0}
!39 = !{!"s2n_client_hello", !17, i64 0, !40, i64 24, !17, i64 728, !17, i64 752, !17, i64 776, !7, i64 800, !7, i64 801, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802}
!40 = !{!"", !7, i64 0, !17, i64 672, !35, i64 696}
!41 = !{!"s2n_x509_validator", !6, i64 0, !6, i64 8, !7, i64 16, !7, i64 17, !35, i64 18, !6, i64 24, !13, i64 32, !6, i64 40, !42, i64 48, !29, i64 52}
!42 = !{!"s2n_cert_validation_info", !13, i64 0, !13, i64 0}
!43 = !{!"s2n_ticket_fields", !17, i64 0, !13, i64 24}
!44 = !{!"s2n_post_handshake", !36, i64 0, !7, i64 40}
!45 = !{!21, !6, i64 232}
!46 = !{!47, !6, i64 0}
!47 = !{!"s2n_crypto_parameters", !6, i64 0, !48, i64 8, !48, i64 16, !49, i64 24, !49, i64 456, !7, i64 888, !7, i64 904, !7, i64 920, !7, i64 928}
!48 = !{!"s2n_session_key", !6, i64 0}
!49 = !{!"s2n_hmac_state", !13, i64 0, !35, i64 4, !13, i64 8, !35, i64 12, !7, i64 14, !50, i64 16, !50, i64 72, !50, i64 128, !50, i64 184, !7, i64 240, !7, i64 368}
!50 = !{!"s2n_hash_state", !6, i64 0, !13, i64 8, !7, i64 12, !19, i64 16, !7, i64 24}
!51 = !{!52, !13, i64 96}
!52 = !{!"s2n_cipher_suite", !13, i64 0, !6, i64 8, !6, i64 16, !7, i64 24, !6, i64 32, !13, i64 40, !6, i64 48, !7, i64 56, !7, i64 72, !6, i64 80, !6, i64 88, !13, i64 96, !7, i64 100}
!53 = !{!54, !6, i64 0}
!54 = !{!"ossl_param_st", !6, i64 0, !13, i64 8, !6, i64 16, !19, i64 24, !19, i64 32}
!55 = !{!54, !13, i64 8}
!56 = !{!54, !6, i64 16}
!57 = !{!54, !19, i64 24}
!58 = !{!54, !19, i64 32}
!59 = !{!17, !6, 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.ossl_param_st = type { ptr, i32, ptr, i64, i64 }

@.str = external hidden unnamed_addr constant [96 x i8], align 1
@_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.1 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [97 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1, 1) i32 @s2n_prf_libcrypto(ptr noundef readonly %0, ptr noundef readonly %1, ptr noundef readonly %2, ptr noundef readonly %3, ptr noundef readonly %4, ptr noundef readonly %5, ptr noundef readonly %6) local_unnamed_addr #0 {
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca [8 x %struct.ossl_param_st], align 16
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %12, label %20

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

20:                                               ; preds = %7
  %.not63 = icmp eq ptr %1, null
  br i1 %.not63, label %21, label %29

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

29:                                               ; preds = %20
  %.not65 = icmp eq ptr %2, null
  br i1 %.not65, label %30, label %38

30:                                               ; preds = %29
  %31 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.2, ptr %31, align 8, !tbaa !5
  %32 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.2, i64 21), i32 noundef 47) #7
  %.not66 = icmp eq ptr %32, null
  %33 = getelementptr inbounds i8, ptr %32, i64 1
  %34 = select i1 %.not66, ptr getelementptr inbounds (i8, ptr @.str.2, i64 21), ptr %33
  %35 = getelementptr inbounds i8, ptr %31, i64 8
  store ptr %34, ptr %35, align 8, !tbaa !10
  %36 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %36, align 4, !tbaa !11
  %37 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %210

38:                                               ; preds = %29
  %.not67 = icmp eq ptr %3, null
  br i1 %.not67, label %39, label %47

39:                                               ; preds = %38
  %40 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.3, ptr %40, align 8, !tbaa !5
  %41 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.3, i64 21), i32 noundef 47) #7
  %.not68 = icmp eq ptr %41, null
  %42 = getelementptr inbounds i8, ptr %41, i64 1
  %43 = select i1 %.not68, ptr getelementptr inbounds (i8, ptr @.str.3, i64 21), ptr %42
  %44 = getelementptr inbounds i8, ptr %40, i64 8
  store ptr %43, ptr %44, align 8, !tbaa !10
  %45 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %45, align 4, !tbaa !11
  %46 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %210

47:                                               ; preds = %38
  %.not69 = icmp eq ptr %6, null
  br i1 %.not69, label %48, label %56

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

56:                                               ; preds = %47
  %.not71 = icmp eq ptr %4, null
  %.not72 = icmp eq ptr %5, null
  %57 = getelementptr inbounds i8, ptr %2, i64 8
  %58 = load i32, ptr %57, align 8, !tbaa !13
  %59 = getelementptr inbounds i8, ptr %3, i64 8
  %60 = load i32, ptr %59, align 8, !tbaa !13
  %61 = add i32 %60, %58
  %.sroa.gep87 = getelementptr inbounds i8, ptr %4, i64 8
  br i1 %.not71, label %.cont98, label %.else100

.else100:                                         ; preds = %56
  %.else.val101 = load i32, ptr %.sroa.gep87, align 8, !tbaa !13
  br label %.cont98

.cont98:                                          ; preds = %56, %.else100
  %62 = phi i32 [ 0, %56 ], [ %.else.val101, %.else100 ]
  %63 = add i32 %61, %62
  %.sroa.gep89 = getelementptr inbounds i8, ptr %5, i64 8
  br i1 %.not72, label %.cont90, label %.else92

.else92:                                          ; preds = %.cont98
  %.else.val93 = load i32, ptr %.sroa.gep89, align 8, !tbaa !13
  br label %.cont90

.cont90:                                          ; preds = %.cont98, %.else92
  %64 = phi i32 [ 0, %.cont98 ], [ %.else.val93, %.else92 ]
  %65 = add i32 %63, %64
  %66 = icmp ult i32 %65, 1025
  br i1 %66, label %75, label %67

67:                                               ; preds = %.cont90
  %68 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.5, ptr %68, align 8, !tbaa !5
  %69 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.5, i64 21), i32 noundef 47) #7
  %.not73 = icmp eq ptr %69, null
  %70 = getelementptr inbounds i8, ptr %69, i64 1
  %71 = select i1 %.not73, ptr getelementptr inbounds (i8, ptr @.str.5, i64 21), ptr %70
  %72 = getelementptr inbounds i8, ptr %68, i64 8
  store ptr %71, ptr %72, align 8, !tbaa !10
  %73 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653207, ptr %73, align 4, !tbaa !11
  %74 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %210

75:                                               ; preds = %.cont90
  %76 = getelementptr inbounds i8, ptr %0, i64 220
  %77 = load i8, ptr %76, align 4, !tbaa !15
  %78 = icmp eq i8 %77, 33
  br i1 %78, label %79, label %117

79:                                               ; preds = %75
  %80 = getelementptr inbounds i8, ptr %0, i64 232
  %81 = load ptr, ptr %80, align 8, !tbaa !42
  %.not74 = icmp eq ptr %81, null
  br i1 %.not74, label %82, label %90

82:                                               ; preds = %79
  %83 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.9, ptr %83, align 8, !tbaa !5
  %84 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.9, i64 21), i32 noundef 47) #7
  %.not75 = icmp eq ptr %84, null
  %85 = getelementptr inbounds i8, ptr %84, i64 1
  %86 = select i1 %.not75, ptr getelementptr inbounds (i8, ptr @.str.9, i64 21), ptr %85
  %87 = getelementptr inbounds i8, ptr %83, i64 8
  store ptr %86, ptr %87, align 8, !tbaa !10
  %88 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %88, align 4, !tbaa !11
  %89 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %210

90:                                               ; preds = %79
  %91 = load ptr, ptr %81, align 8, !tbaa !43
  %.not76 = icmp eq ptr %91, null
  br i1 %.not76, label %92, label %100

92:                                               ; preds = %90
  %93 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.10, ptr %93, align 8, !tbaa !5
  %94 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.10, i64 21), i32 noundef 47) #7
  %.not77 = icmp eq ptr %94, null
  %95 = getelementptr inbounds i8, ptr %94, i64 1
  %96 = select i1 %.not77, ptr getelementptr inbounds (i8, ptr @.str.10, i64 21), ptr %95
  %97 = getelementptr inbounds i8, ptr %93, i64 8
  store ptr %96, ptr %97, align 8, !tbaa !10
  %98 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %98, align 4, !tbaa !11
  %99 = tail call i32 @s2n_calculate_stacktrace() #8
  br label %210

100:                                              ; preds = %90
  %101 = getelementptr inbounds i8, ptr %91, i64 96
  %102 = load i32, ptr %101, align 8, !tbaa !48
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #8
  store ptr null, ptr %8, align 8, !tbaa !50
  %103 = call i32 @s2n_hmac_md_from_alg(i32 noundef %102, ptr noundef nonnull %8) #8
  %104 = call zeroext i1 @s2n_result_is_ok(i32 %103)
  br i1 %104, label %105, label %.thread

105:                                              ; preds = %100
  %106 = load ptr, ptr %8, align 8, !tbaa !50
  %.not78 = icmp eq ptr %106, null
  br i1 %.not78, label %.thread.sink.split, label %107

107:                                              ; preds = %105
  %108 = call ptr @EVP_MD_get0_name(ptr noundef nonnull %106) #8
  %.not80 = icmp eq ptr %108, null
  br i1 %.not80, label %.thread.sink.split, label %116

.thread.sink.split:                               ; preds = %107, %105
  %.str.12.sink = phi ptr [ @.str.11, %105 ], [ @.str.12, %107 ]
  %.sink117 = phi ptr [ getelementptr inbounds (i8, ptr @.str.11, i64 21), %105 ], [ getelementptr inbounds (i8, ptr @.str.12, i64 21), %107 ]
  %109 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr %.str.12.sink, ptr %109, align 8, !tbaa !5
  %110 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) %.sink117, i32 noundef 47) #7
  %.not81 = icmp eq ptr %110, null
  %111 = getelementptr inbounds i8, ptr %110, i64 1
  %112 = select i1 %.not81, ptr %.sink117, ptr %111
  %113 = getelementptr inbounds i8, ptr %109, i64 8
  store ptr %112, ptr %113, align 8, !tbaa !10
  %114 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %114, align 4, !tbaa !11
  %115 = call i32 @s2n_calculate_stacktrace() #8
  br label %.thread

.thread:                                          ; preds = %.thread.sink.split, %100
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #8
  br label %210

116:                                              ; preds = %107
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #8
  br label %117

117:                                              ; preds = %116, %75
  %.1 = phi ptr [ %108, %116 ], [ @.str.6, %75 ]
  %.0 = phi ptr [ @.str.8, %116 ], [ @.str.7, %75 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #8
  %118 = call ptr @EVP_KDF_fetch(ptr noundef null, ptr noundef nonnull @.str.13, ptr noundef nonnull %.0) #8
  store ptr %118, ptr %9, align 8, !tbaa !50
  %.not82 = icmp eq ptr %118, null
  br i1 %.not82, label %119, label %127

119:                                              ; preds = %117
  %120 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.14, ptr %120, align 8, !tbaa !5
  %121 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.14, i64 21), i32 noundef 47) #7
  %.not83 = icmp eq ptr %121, null
  %122 = getelementptr inbounds i8, ptr %121, i64 1
  %123 = select i1 %.not83, ptr getelementptr inbounds (i8, ptr @.str.14, i64 21), ptr %122
  %124 = getelementptr inbounds i8, ptr %120, i64 8
  store ptr %123, ptr %124, align 8, !tbaa !10
  %125 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653206, ptr %125, align 4, !tbaa !11
  %126 = call i32 @s2n_calculate_stacktrace() #8
  br label %209

127:                                              ; preds = %117
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #8
  %128 = call ptr @EVP_KDF_CTX_new(ptr noundef nonnull %118) #8
  store ptr %128, ptr %10, align 8, !tbaa !50
  %.not84 = icmp eq ptr %128, null
  br i1 %.not84, label %129, label %137

129:                                              ; preds = %127
  %130 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.15, ptr %130, align 8, !tbaa !5
  %131 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.15, i64 21), i32 noundef 47) #7
  %.not85 = icmp eq ptr %131, null
  %132 = getelementptr inbounds i8, ptr %131, i64 1
  %133 = select i1 %.not85, ptr getelementptr inbounds (i8, ptr @.str.15, i64 21), ptr %132
  %134 = getelementptr inbounds i8, ptr %130, i64 8
  store ptr %133, ptr %134, align 8, !tbaa !10
  %135 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %135, align 4, !tbaa !11
  %136 = call i32 @s2n_calculate_stacktrace() #8
  br label %208

137:                                              ; preds = %127
  call void @llvm.lifetime.start.p0(i64 320, ptr nonnull %11) #8
  store ptr @.str.16, ptr %11, align 16, !tbaa !51
  %138 = getelementptr inbounds i8, ptr %11, i64 8
  store i32 4, ptr %138, align 8, !tbaa !53
  %139 = getelementptr inbounds i8, ptr %11, i64 16
  store ptr %.0, ptr %139, align 16, !tbaa !54
  %140 = getelementptr inbounds i8, ptr %11, i64 24
  %141 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %.0) #7
  store i64 %141, ptr %140, align 8, !tbaa !55
  %142 = getelementptr inbounds i8, ptr %11, i64 32
  store i64 -1, ptr %142, align 16, !tbaa !56
  %143 = getelementptr inbounds i8, ptr %11, i64 40
  store ptr @.str.17, ptr %143, align 8, !tbaa !51
  %144 = getelementptr inbounds i8, ptr %11, i64 48
  store i32 4, ptr %144, align 16, !tbaa !53
  %145 = getelementptr inbounds i8, ptr %11, i64 56
  store ptr %.1, ptr %145, align 8, !tbaa !54
  %146 = getelementptr inbounds i8, ptr %11, i64 64
  %147 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %.1) #7
  store i64 %147, ptr %146, align 16, !tbaa !55
  %148 = getelementptr inbounds i8, ptr %11, i64 72
  store i64 -1, ptr %148, align 8, !tbaa !56
  %149 = getelementptr inbounds i8, ptr %11, i64 80
  store ptr @.str.18, ptr %149, align 16, !tbaa !51
  %150 = getelementptr inbounds i8, ptr %11, i64 88
  store i32 5, ptr %150, align 8, !tbaa !53
  %151 = getelementptr inbounds i8, ptr %11, i64 96
  %152 = load ptr, ptr %1, align 8, !tbaa !57
  store ptr %152, ptr %151, align 16, !tbaa !54
  %153 = getelementptr inbounds i8, ptr %11, i64 104
  %154 = getelementptr inbounds i8, ptr %1, i64 8
  %155 = load i32, ptr %154, align 8, !tbaa !13
  %156 = zext i32 %155 to i64
  store i64 %156, ptr %153, align 8, !tbaa !55
  %157 = getelementptr inbounds i8, ptr %11, i64 112
  store i64 -1, ptr %157, align 16, !tbaa !56
  %158 = getelementptr inbounds i8, ptr %11, i64 120
  store ptr @.str.19, ptr %158, align 8, !tbaa !51
  %159 = getelementptr inbounds i8, ptr %11, i64 128
  store i32 5, ptr %159, align 16, !tbaa !53
  %160 = getelementptr inbounds i8, ptr %11, i64 136
  %161 = load ptr, ptr %2, align 8, !tbaa !57
  store ptr %161, ptr %160, align 8, !tbaa !54
  %162 = getelementptr inbounds i8, ptr %11, i64 144
  %163 = load i32, ptr %57, align 8, !tbaa !13
  %164 = zext i32 %163 to i64
  store i64 %164, ptr %162, align 16, !tbaa !55
  %165 = getelementptr inbounds i8, ptr %11, i64 152
  store i64 -1, ptr %165, align 8, !tbaa !56
  %166 = getelementptr inbounds i8, ptr %11, i64 160
  store ptr @.str.19, ptr %166, align 16, !tbaa !51
  %167 = getelementptr inbounds i8, ptr %11, i64 168
  store i32 5, ptr %167, align 8, !tbaa !53
  %168 = getelementptr inbounds i8, ptr %11, i64 176
  %169 = load ptr, ptr %3, align 8, !tbaa !57
  store ptr %169, ptr %168, align 16, !tbaa !54
  %170 = getelementptr inbounds i8, ptr %11, i64 184
  %171 = load i32, ptr %59, align 8, !tbaa !13
  %172 = zext i32 %171 to i64
  store i64 %172, ptr %170, align 8, !tbaa !55
  %173 = getelementptr inbounds i8, ptr %11, i64 192
  store i64 -1, ptr %173, align 16, !tbaa !56
  %174 = getelementptr inbounds i8, ptr %11, i64 200
  store ptr @.str.19, ptr %174, align 8, !tbaa !51
  %175 = getelementptr inbounds i8, ptr %11, i64 208
  store i32 5, ptr %175, align 16, !tbaa !53
  %176 = getelementptr inbounds i8, ptr %11, i64 216
  br i1 %.not71, label %.cont106.thread, label %.else96

.cont106.thread:                                  ; preds = %137
  %177 = getelementptr inbounds i8, ptr %11, i64 224
  br label %.cont94

.else96:                                          ; preds = %137
  %.else.val109 = load ptr, ptr %4, align 8, !tbaa !57
  %178 = getelementptr inbounds i8, ptr %11, i64 224
  %.else.val97 = load i32, ptr %.sroa.gep87, align 8, !tbaa !13
  %179 = zext i32 %.else.val97 to i64
  br label %.cont94

.cont94:                                          ; preds = %.cont106.thread, %.else96
  %.else.val109.sink = phi ptr [ null, %.cont106.thread ], [ %.else.val109, %.else96 ]
  %180 = phi ptr [ %177, %.cont106.thread ], [ %178, %.else96 ]
  %181 = phi i64 [ 0, %.cont106.thread ], [ %179, %.else96 ]
  store ptr %.else.val109.sink, ptr %176, align 8
  store i64 %181, ptr %180, align 8, !tbaa !55
  %182 = getelementptr inbounds i8, ptr %11, i64 232
  store i64 -1, ptr %182, align 8, !tbaa !56
  %183 = getelementptr inbounds i8, ptr %11, i64 240
  store ptr @.str.19, ptr %183, align 16, !tbaa !51
  %184 = getelementptr inbounds i8, ptr %11, i64 248
  store i32 5, ptr %184, align 8, !tbaa !53
  %185 = getelementptr inbounds i8, ptr %11, i64 256
  br i1 %.not72, label %.cont94.cont.thread, label %.else

.cont94.cont.thread:                              ; preds = %.cont94
  %186 = getelementptr inbounds i8, ptr %11, i64 264
  br label %.cont

.else:                                            ; preds = %.cont94
  %.else.val105 = load ptr, ptr %5, align 8, !tbaa !57
  %187 = getelementptr inbounds i8, ptr %11, i64 264
  %.else.val = load i32, ptr %.sroa.gep89, align 8, !tbaa !13
  %188 = zext i32 %.else.val to i64
  br label %.cont

.cont:                                            ; preds = %.cont94.cont.thread, %.else
  %.else.val105.sink = phi ptr [ null, %.cont94.cont.thread ], [ %.else.val105, %.else ]
  %189 = phi ptr [ %186, %.cont94.cont.thread ], [ %187, %.else ]
  %190 = phi i64 [ 0, %.cont94.cont.thread ], [ %188, %.else ]
  store ptr %.else.val105.sink, ptr %185, align 16
  store i64 %190, ptr %189, align 8, !tbaa !55
  %191 = getelementptr inbounds i8, ptr %11, i64 272
  store i64 -1, ptr %191, align 16, !tbaa !56
  %192 = getelementptr inbounds i8, ptr %11, i64 280
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(40) %192, i8 0, i64 40, i1 false)
  %193 = load ptr, ptr %6, align 8, !tbaa !57
  %194 = getelementptr inbounds i8, ptr %6, i64 8
  %195 = load i32, ptr %194, align 8, !tbaa !13
  %196 = zext i32 %195 to i64
  %197 = call i32 @EVP_KDF_derive(ptr noundef nonnull %128, ptr noundef %193, i64 noundef %196, ptr noundef nonnull %11) #8
  %198 = icmp eq i32 %197, 1
  br i1 %198, label %207, label %199

199:                                              ; preds = %.cont
  %200 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.20, ptr %200, align 8, !tbaa !5
  %201 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.20, i64 21), i32 noundef 47) #7
  %.not86 = icmp eq ptr %201, null
  %202 = getelementptr inbounds i8, ptr %201, i64 1
  %203 = select i1 %.not86, ptr getelementptr inbounds (i8, ptr @.str.20, i64 21), ptr %202
  %204 = getelementptr inbounds i8, ptr %200, i64 8
  store ptr %203, ptr %204, align 8, !tbaa !10
  %205 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653208, ptr %205, align 4, !tbaa !11
  %206 = call i32 @s2n_calculate_stacktrace() #8
  br label %207

207:                                              ; preds = %.cont, %199
  %.sroa.036.1 = phi i32 [ -1, %199 ], [ 0, %.cont ]
  call void @llvm.lifetime.end.p0(i64 320, ptr nonnull %11) #8
  br label %208

208:                                              ; preds = %207, %129
  %.sroa.036.2 = phi i32 [ %.sroa.036.1, %207 ], [ -1, %129 ]
  call void @EVP_KDF_CTX_free_pointer(ptr noundef nonnull %10)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #8
  br label %209

209:                                              ; preds = %208, %119
  %.sroa.036.3 = phi i32 [ %.sroa.036.2, %208 ], [ -1, %119 ]
  call void @EVP_KDF_free_pointer(ptr noundef nonnull %9)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #8
  br label %210

210:                                              ; preds = %67, %209, %92, %82, %.thread, %48, %39, %30, %21, %12
  %.sroa.036.6 = phi i32 [ -1, %48 ], [ -1, %39 ], [ -1, %30 ], [ -1, %21 ], [ -1, %12 ], [ -1, %67 ], [ %.sroa.036.3, %209 ], [ -1, %92 ], [ -1, %82 ], [ -1, %.thread ]
  ret i32 %.sroa.036.6
}

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

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

declare i32 @s2n_calculate_stacktrace() local_unnamed_addr #3

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

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #5

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

declare i32 @s2n_hmac_md_from_alg(i32 noundef, ptr noundef) local_unnamed_addr #3

declare ptr @EVP_MD_get0_name(ptr noundef) local_unnamed_addr #3

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

declare ptr @EVP_KDF_fetch(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @EVP_KDF_free_pointer(ptr noundef) local_unnamed_addr #6

declare ptr @EVP_KDF_CTX_new(ptr noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @EVP_KDF_CTX_free_pointer(ptr noundef) local_unnamed_addr #6

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

declare i32 @EVP_KDF_derive(ptr noundef, ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #3

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { "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 nosync nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { nounwind 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 8}
!14 = !{!"s2n_blob", !7, i64 0, !12, i64 8, !12, i64 12, !12, i64 16}
!15 = !{!16, !8, i64 220}
!16 = !{!"s2n_connection", !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 1, !12, i64 1, !12, i64 1, !12, i64 1, !12, i64 1, !12, i64 1, !12, i64 1, !12, i64 1, !12, i64 2, !12, i64 2, !12, i64 2, !12, i64 2, !12, i64 2, !12, i64 2, !12, i64 2, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !8, i64 80, !8, i64 102, !8, i64 124, !12, i64 148, !12, i64 152, !17, i64 160, !18, i64 168, !18, i64 176, !8, i64 184, !8, i64 216, !8, i64 217, !8, i64 218, !8, i64 219, !8, i64 220, !8, i64 221, !8, i64 222, !7, i64 224, !7, i64 232, !19, i64 240, !7, i64 632, !7, i64 640, !20, i64 648, !26, i64 1144, !29, i64 1688, !7, i64 1752, !8, i64 1760, !12, i64 1764, !8, i64 1768, !32, i64 1776, !32, i64 1816, !32, i64 1856, !32, i64 1896, !12, i64 1936, !18, i64 1944, !8, i64 1952, !32, i64 1960, !8, i64 2000, !8, i64 2001, !8, i64 2002, !25, i64 2003, !33, i64 2004, !33, i64 2008, !34, i64 2016, !31, i64 2208, !12, i64 2212, !31, i64 2216, !18, i64 2224, !8, i64 2232, !18, i64 2240, !18, i64 2248, !18, i64 2256, !33, i64 2264, !33, i64 2268, !8, i64 2272, !8, i64 2528, !12, i64 2784, !14, i64 2792, !12, i64 2816, !14, i64 2824, !14, i64 2848, !14, i64 2872, !36, i64 2896, !38, i64 3704, !7, i64 3760, !7, i64 3768, !8, i64 3776, !12, i64 3780, !14, i64 3784, !12, i64 3808, !40, i64 3816, !8, i64 3848, !32, i64 3992, !14, i64 4032, !14, i64 4056, !25, i64 4080, !25, i64 4081, !25, i64 4082, !31, i64 4084, !31, i64 4086, !12, i64 4088, !12, i64 4092, !14, i64 4096, !12, i64 4120, !41, i64 4128, !33, i64 4176, !8, i64 4180, !8, i64 4181}
!17 = !{!"s2n_timer", !18, i64 0}
!18 = !{!"long", !8, i64 0}
!19 = !{!"s2n_secrets", !8, i64 0, !12, i64 388}
!20 = !{!"s2n_kex_parameters", !21, i64 0, !22, i64 8, !8, i64 24, !22, i64 56, !23, i64 72, !23, i64 184, !8, i64 296, !24, i64 360, !14, i64 448, !14, i64 472}
!21 = !{!"s2n_dh_params", !7, i64 0}
!22 = !{!"s2n_ecc_evp_params", !7, i64 0, !7, i64 8}
!23 = !{!"s2n_kem_group_params", !7, i64 0, !24, i64 8, !22, i64 96}
!24 = !{!"s2n_kem_params", !7, i64 0, !14, i64 8, !14, i64 32, !14, i64 56, !25, i64 80}
!25 = !{!"_Bool", !8, i64 0}
!26 = !{!"s2n_handshake_parameters", !27, i64 0, !27, i64 48, !14, i64 96, !12, i64 120, !28, i64 124, !7, i64 384, !7, i64 392, !7, i64 400, !8, i64 408, !8, i64 440, !8, i64 472, !8, i64 473, !8, i64 474, !8, i64 506}
!27 = !{!"s2n_pkey", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40}
!28 = !{!"s2n_sig_scheme_list", !8, i64 0, !8, i64 256}
!29 = !{!"s2n_psk_parameters", !12, i64 0, !30, i64 8, !31, i64 40, !31, i64 42, !7, i64 48, !12, i64 56}
!30 = !{!"s2n_array", !14, i64 0, !12, i64 24, !12, i64 28}
!31 = !{!"short", !8, i64 0}
!32 = !{!"s2n_stuffer", !14, i64 0, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 36, !12, i64 36}
!33 = !{!"", !12, i64 0}
!34 = !{!"s2n_handshake", !32, i64 0, !7, i64 40, !8, i64 48, !8, i64 56, !8, i64 104, !8, i64 152, !12, i64 156, !12, i64 160, !12, i64 164, !12, i64 168, !35, i64 176, !12, i64 184, !12, i64 184, !12, i64 184, !12, i64 184, !12, i64 188}
!35 = !{!"s2n_offered_early_data", !7, i64 0}
!36 = !{!"s2n_client_hello", !14, i64 0, !37, i64 24, !14, i64 728, !14, i64 752, !14, i64 776, !8, i64 800, !8, i64 801, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802}
!37 = !{!"", !8, i64 0, !14, i64 672, !31, i64 696}
!38 = !{!"s2n_x509_validator", !7, i64 0, !7, i64 8, !8, i64 16, !8, i64 17, !31, i64 18, !7, i64 24, !12, i64 32, !7, i64 40, !39, i64 48, !25, i64 52}
!39 = !{!"s2n_cert_validation_info", !12, i64 0, !12, i64 0}
!40 = !{!"s2n_ticket_fields", !14, i64 0, !12, i64 24}
!41 = !{!"s2n_post_handshake", !32, i64 0, !8, i64 40}
!42 = !{!16, !7, i64 232}
!43 = !{!44, !7, i64 0}
!44 = !{!"s2n_crypto_parameters", !7, i64 0, !45, i64 8, !45, i64 16, !46, i64 24, !46, i64 456, !8, i64 888, !8, i64 904, !8, i64 920, !8, i64 928}
!45 = !{!"s2n_session_key", !7, i64 0}
!46 = !{!"s2n_hmac_state", !12, i64 0, !31, i64 4, !12, i64 8, !31, i64 12, !8, i64 14, !47, i64 16, !47, i64 72, !47, i64 128, !47, i64 184, !8, i64 240, !8, i64 368}
!47 = !{!"s2n_hash_state", !7, i64 0, !12, i64 8, !8, i64 12, !18, i64 16, !8, i64 24}
!48 = !{!49, !12, i64 96}
!49 = !{!"s2n_cipher_suite", !12, i64 0, !7, i64 8, !7, i64 16, !8, i64 24, !7, i64 32, !12, i64 40, !7, i64 48, !8, i64 56, !8, i64 72, !7, i64 80, !7, i64 88, !12, i64 96, !8, i64 100}
!50 = !{!7, !7, i64 0}
!51 = !{!52, !7, i64 0}
!52 = !{!"ossl_param_st", !7, i64 0, !12, i64 8, !7, i64 16, !18, i64 24, !18, i64 32}
!53 = !{!52, !12, i64 8}
!54 = !{!52, !7, i64 16}
!55 = !{!52, !18, i64 24}
!56 = !{!52, !18, i64 32}
!57 = !{!14, !7, i64 0}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,MergedLoadStoreMotionPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass