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

; 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_blob = type { ptr, i32, i32, i8 }
%struct.s2n_cipher_suite = type { i8, ptr, ptr, [2 x i8], ptr, i32, ptr, [2 x ptr], i8, ptr, ptr, i32, i8 }
%struct.s2n_record_algorithm = type { ptr, i32, i32, i64 }
%struct.s2n_cipher = type { i32, %union.anon, i8, ptr, ptr, ptr, ptr, ptr, ptr }
%union.anon = type { %struct.s2n_composite_cipher }
%struct.s2n_composite_cipher = type { i8, i8, i8, ptr, ptr, ptr, ptr }
%struct.s2n_cbc_cipher = type { i8, i8, ptr, ptr }
%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.0, i32 }
%union.anon.0 = 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_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.1 }
%union.anon.1 = 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 }

@.str = external hidden unnamed_addr constant [95 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 [95 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [96 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @s2n_record_parse_cbc(ptr noundef %0, ptr noundef %1, i8 noundef zeroext %2, i16 noundef zeroext %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7) #0 {
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i8, align 1
  %13 = alloca i16, align 2
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca %struct.s2n_blob, align 8
  %19 = alloca [16 x i8], align 16
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca %struct.s2n_blob, align 8
  %23 = alloca i16, align 2
  %24 = alloca i8, align 1
  %25 = alloca i32, align 4
  %26 = alloca ptr, align 8
  %27 = alloca i32, align 4
  %28 = alloca ptr, align 8
  %29 = alloca i32, align 4
  %30 = alloca %struct.s2n_blob, align 8
  store ptr %0, ptr %10, align 8, !tbaa !5
  store ptr %1, ptr %11, align 8, !tbaa !5
  store i8 %2, ptr %12, align 1, !tbaa !9
  store i16 %3, ptr %13, align 2, !tbaa !10
  store ptr %4, ptr %14, align 8, !tbaa !5
  store ptr %5, ptr %15, align 8, !tbaa !5
  store ptr %6, ptr %16, align 8, !tbaa !5
  store ptr %7, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 24, ptr %18) #6
  %31 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 0
  %32 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %32, ptr %31, align 8, !tbaa !12
  %33 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 1
  %34 = load ptr, ptr %10, align 8, !tbaa !5
  %35 = getelementptr inbounds %struct.s2n_cipher_suite, ptr %34, i32 0, i32 6
  %36 = load ptr, ptr %35, align 8, !tbaa !15
  %37 = getelementptr inbounds %struct.s2n_record_algorithm, ptr %36, i32 0, i32 0
  %38 = load ptr, ptr %37, align 8, !tbaa !17
  %39 = getelementptr inbounds %struct.s2n_cipher, ptr %38, i32 0, i32 1
  %40 = getelementptr inbounds %struct.s2n_cbc_cipher, ptr %39, i32 0, i32 1
  %41 = load i8, ptr %40, align 1, !tbaa !9
  %42 = zext i8 %41 to i32
  store i32 %42, ptr %33, align 8, !tbaa !20
  %43 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 2
  store i32 0, ptr %43, align 4, !tbaa !21
  %44 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 3
  %45 = load i8, ptr %44, align 8
  %46 = and i8 %45, -2
  %47 = or i8 %46, 0
  store i8 %47, ptr %44, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #6
  %48 = load ptr, ptr %11, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.s2n_connection, ptr %48, i32 0, i32 38
  %50 = call ptr @s2n_stuffer_raw_read(ptr noundef %49, i32 noundef 5)
  store ptr %50, ptr %20, align 8, !tbaa !5
  br label %51

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

54:                                               ; preds = %51
  br label %55

55:                                               ; preds = %54
  br label %56

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

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

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

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

83:                                               ; preds = %77
  br label %84

84:                                               ; preds = %83
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %816

85:                                               ; No predecessors!
  br label %86

86:                                               ; preds = %85
  br label %87

87:                                               ; preds = %86, %51
  br label %88

88:                                               ; preds = %87
  br label %89

89:                                               ; preds = %88
  br label %90

90:                                               ; preds = %89
  %91 = load ptr, ptr %10, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.s2n_cipher_suite, ptr %91, i32 0, i32 6
  %93 = load ptr, ptr %92, align 8, !tbaa !15
  %94 = getelementptr inbounds %struct.s2n_record_algorithm, ptr %93, i32 0, i32 0
  %95 = load ptr, ptr %94, align 8, !tbaa !17
  %96 = getelementptr inbounds %struct.s2n_cipher, ptr %95, i32 0, i32 1
  %97 = getelementptr inbounds %struct.s2n_cbc_cipher, ptr %96, i32 0, i32 1
  %98 = load i8, ptr %97, align 1, !tbaa !9
  %99 = zext i8 %98 to i32
  %100 = icmp sle i32 %99, 16
  br i1 %100, label %134, label %101

101:                                              ; preds = %90
  br label %102

102:                                              ; preds = %101
  br label %103

103:                                              ; preds = %102
  %104 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %105 = getelementptr inbounds %struct.s2n_debug_info, ptr %104, i32 0, i32 0
  store ptr @.str.1, ptr %105, align 8, !tbaa !22
  %106 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %107 = getelementptr inbounds %struct.s2n_debug_info, ptr %106, i32 0, i32 0
  %108 = load ptr, ptr %107, align 8, !tbaa !22
  %109 = getelementptr inbounds i8, ptr %108, i64 21
  %110 = call ptr @strrchr(ptr noundef %109, i32 noundef 47) #7
  %111 = icmp ne ptr %110, null
  br i1 %111, label %112, label %119

112:                                              ; preds = %103
  %113 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %114 = getelementptr inbounds %struct.s2n_debug_info, ptr %113, i32 0, i32 0
  %115 = load ptr, ptr %114, align 8, !tbaa !22
  %116 = getelementptr inbounds i8, ptr %115, i64 21
  %117 = call ptr @strrchr(ptr noundef %116, i32 noundef 47) #7
  %118 = getelementptr inbounds i8, ptr %117, i64 1
  br label %124

119:                                              ; preds = %103
  %120 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %121 = getelementptr inbounds %struct.s2n_debug_info, ptr %120, i32 0, i32 0
  %122 = load ptr, ptr %121, align 8, !tbaa !22
  %123 = getelementptr inbounds i8, ptr %122, i64 21
  br label %124

124:                                              ; preds = %119, %112
  %125 = phi ptr [ %118, %112 ], [ %123, %119 ]
  %126 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %127 = getelementptr inbounds %struct.s2n_debug_info, ptr %126, i32 0, i32 1
  store ptr %125, ptr %127, align 8, !tbaa !24
  %128 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %128, align 4, !tbaa !25
  %129 = call i32 @s2n_calculate_stacktrace()
  br label %130

130:                                              ; preds = %124
  br label %131

131:                                              ; preds = %130
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %816

132:                                              ; No predecessors!
  br label %133

133:                                              ; preds = %132
  br label %134

134:                                              ; preds = %133, %90
  br label %135

135:                                              ; preds = %134
  br label %136

136:                                              ; preds = %135
  %137 = load ptr, ptr %11, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.s2n_connection, ptr %137, i32 0, i32 23
  %139 = load i8, ptr %138, align 4, !tbaa !26
  %140 = zext i8 %139 to i32
  %141 = icmp sgt i32 %140, 31
  br i1 %141, label %142, label %200

142:                                              ; preds = %136
  br label %143

143:                                              ; preds = %142
  %144 = load ptr, ptr %11, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.s2n_connection, ptr %144, i32 0, i32 40
  %146 = call i32 @s2n_stuffer_read(ptr noundef %145, ptr noundef %18)
  %147 = icmp sgt i32 %146, -1
  br i1 %147, label %149, label %148

148:                                              ; preds = %143
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %816

149:                                              ; preds = %143
  br label %150

150:                                              ; preds = %149
  br label %151

151:                                              ; preds = %150
  br label %152

152:                                              ; preds = %151
  %153 = load i16, ptr %13, align 2, !tbaa !10
  %154 = zext i16 %153 to i32
  %155 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 1
  %156 = load i32, ptr %155, align 8, !tbaa !20
  %157 = icmp uge i32 %154, %156
  br i1 %157, label %191, label %158

158:                                              ; preds = %152
  br label %159

159:                                              ; preds = %158
  br label %160

160:                                              ; preds = %159
  %161 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %162 = getelementptr inbounds %struct.s2n_debug_info, ptr %161, i32 0, i32 0
  store ptr @.str.2, ptr %162, align 8, !tbaa !22
  %163 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %164 = getelementptr inbounds %struct.s2n_debug_info, ptr %163, i32 0, i32 0
  %165 = load ptr, ptr %164, align 8, !tbaa !22
  %166 = getelementptr inbounds i8, ptr %165, i64 21
  %167 = call ptr @strrchr(ptr noundef %166, i32 noundef 47) #7
  %168 = icmp ne ptr %167, null
  br i1 %168, label %169, label %176

169:                                              ; preds = %160
  %170 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %171 = getelementptr inbounds %struct.s2n_debug_info, ptr %170, i32 0, i32 0
  %172 = load ptr, ptr %171, align 8, !tbaa !22
  %173 = getelementptr inbounds i8, ptr %172, i64 21
  %174 = call ptr @strrchr(ptr noundef %173, i32 noundef 47) #7
  %175 = getelementptr inbounds i8, ptr %174, i64 1
  br label %181

176:                                              ; preds = %160
  %177 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %178 = getelementptr inbounds %struct.s2n_debug_info, ptr %177, i32 0, i32 0
  %179 = load ptr, ptr %178, align 8, !tbaa !22
  %180 = getelementptr inbounds i8, ptr %179, i64 21
  br label %181

181:                                              ; preds = %176, %169
  %182 = phi ptr [ %175, %169 ], [ %180, %176 ]
  %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 1
  store ptr %182, ptr %184, align 8, !tbaa !24
  %185 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %185, align 4, !tbaa !25
  %186 = call i32 @s2n_calculate_stacktrace()
  br label %187

187:                                              ; preds = %181
  br label %188

188:                                              ; preds = %187
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %816

189:                                              ; No predecessors!
  br label %190

190:                                              ; preds = %189
  br label %191

191:                                              ; preds = %190, %152
  br label %192

192:                                              ; preds = %191
  br label %193

193:                                              ; preds = %192
  %194 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 1
  %195 = load i32, ptr %194, align 8, !tbaa !20
  %196 = load i16, ptr %13, align 2, !tbaa !10
  %197 = zext i16 %196 to i32
  %198 = sub i32 %197, %195
  %199 = trunc i32 %198 to i16
  store i16 %199, ptr %13, align 2, !tbaa !10
  br label %200

200:                                              ; preds = %193, %136
  call void @llvm.lifetime.start.p0(i64 24, ptr %22) #6
  %201 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 0
  %202 = load ptr, ptr %11, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.s2n_connection, ptr %202, i32 0, i32 40
  %204 = load i16, ptr %13, align 2, !tbaa !10
  %205 = zext i16 %204 to i32
  %206 = call ptr @s2n_stuffer_raw_read(ptr noundef %203, i32 noundef %205)
  store ptr %206, ptr %201, align 8, !tbaa !12
  %207 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 1
  %208 = load i16, ptr %13, align 2, !tbaa !10
  %209 = zext i16 %208 to i32
  store i32 %209, ptr %207, align 8, !tbaa !20
  %210 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 2
  store i32 0, ptr %210, align 4, !tbaa !21
  %211 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 3
  %212 = load i8, ptr %211, align 8
  %213 = and i8 %212, -2
  %214 = or i8 %213, 0
  store i8 %214, ptr %211, align 8
  br label %215

215:                                              ; preds = %200
  %216 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 0
  %217 = load ptr, ptr %216, align 8, !tbaa !12
  %218 = icmp ne ptr %217, null
  br i1 %218, label %252, label %219

219:                                              ; preds = %215
  br label %220

220:                                              ; preds = %219
  br label %221

221:                                              ; preds = %220
  %222 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %223 = getelementptr inbounds %struct.s2n_debug_info, ptr %222, i32 0, i32 0
  store ptr @.str.3, ptr %223, align 8, !tbaa !22
  %224 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %225 = getelementptr inbounds %struct.s2n_debug_info, ptr %224, i32 0, i32 0
  %226 = load ptr, ptr %225, align 8, !tbaa !22
  %227 = getelementptr inbounds i8, ptr %226, i64 21
  %228 = call ptr @strrchr(ptr noundef %227, i32 noundef 47) #7
  %229 = icmp ne ptr %228, null
  br i1 %229, label %230, label %237

230:                                              ; preds = %221
  %231 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %232 = getelementptr inbounds %struct.s2n_debug_info, ptr %231, i32 0, i32 0
  %233 = load ptr, ptr %232, align 8, !tbaa !22
  %234 = getelementptr inbounds i8, ptr %233, i64 21
  %235 = call ptr @strrchr(ptr noundef %234, i32 noundef 47) #7
  %236 = getelementptr inbounds i8, ptr %235, i64 1
  br label %242

237:                                              ; preds = %221
  %238 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %239 = getelementptr inbounds %struct.s2n_debug_info, ptr %238, i32 0, i32 0
  %240 = load ptr, ptr %239, align 8, !tbaa !22
  %241 = getelementptr inbounds i8, ptr %240, i64 21
  br label %242

242:                                              ; preds = %237, %230
  %243 = phi ptr [ %236, %230 ], [ %241, %237 ]
  %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 1
  store ptr %243, ptr %245, align 8, !tbaa !24
  %246 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %246, align 4, !tbaa !25
  %247 = call i32 @s2n_calculate_stacktrace()
  br label %248

248:                                              ; preds = %242
  br label %249

249:                                              ; preds = %248
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %815

250:                                              ; No predecessors!
  br label %251

251:                                              ; preds = %250
  br label %252

252:                                              ; preds = %251, %215
  br label %253

253:                                              ; preds = %252
  br label %254

254:                                              ; preds = %253
  call void @llvm.lifetime.start.p0(i64 2, ptr %23) #6
  %255 = load i16, ptr %13, align 2, !tbaa !10
  store i16 %255, ptr %23, align 2, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 1, ptr %24) #6
  store i8 0, ptr %24, align 1, !tbaa !9
  br label %256

256:                                              ; preds = %254
  %257 = load ptr, ptr %15, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.s2n_hmac_state, ptr %257, i32 0, i32 0
  %259 = load i32, ptr %258, align 8, !tbaa !51
  %260 = call i32 @s2n_hmac_digest_size(i32 noundef %259, ptr noundef %24)
  %261 = icmp sgt i32 %260, -1
  br i1 %261, label %263, label %262

262:                                              ; preds = %256
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %814

263:                                              ; preds = %256
  br label %264

264:                                              ; preds = %263
  br label %265

265:                                              ; preds = %264
  br label %266

266:                                              ; preds = %265
  %267 = load i16, ptr %23, align 2, !tbaa !10
  %268 = zext i16 %267 to i32
  %269 = load i8, ptr %24, align 1, !tbaa !9
  %270 = zext i8 %269 to i32
  %271 = icmp sge i32 %268, %270
  br i1 %271, label %305, label %272

272:                                              ; preds = %266
  br label %273

273:                                              ; preds = %272
  br label %274

274:                                              ; preds = %273
  %275 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %276 = getelementptr inbounds %struct.s2n_debug_info, ptr %275, i32 0, i32 0
  store ptr @.str.4, ptr %276, align 8, !tbaa !22
  %277 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %278 = getelementptr inbounds %struct.s2n_debug_info, ptr %277, i32 0, i32 0
  %279 = load ptr, ptr %278, align 8, !tbaa !22
  %280 = getelementptr inbounds i8, ptr %279, i64 21
  %281 = call ptr @strrchr(ptr noundef %280, i32 noundef 47) #7
  %282 = icmp ne ptr %281, null
  br i1 %282, label %283, label %290

283:                                              ; preds = %274
  %284 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %285 = getelementptr inbounds %struct.s2n_debug_info, ptr %284, i32 0, i32 0
  %286 = load ptr, ptr %285, align 8, !tbaa !22
  %287 = getelementptr inbounds i8, ptr %286, i64 21
  %288 = call ptr @strrchr(ptr noundef %287, i32 noundef 47) #7
  %289 = getelementptr inbounds i8, ptr %288, i64 1
  br label %295

290:                                              ; preds = %274
  %291 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %292 = getelementptr inbounds %struct.s2n_debug_info, ptr %291, i32 0, i32 0
  %293 = load ptr, ptr %292, align 8, !tbaa !22
  %294 = getelementptr inbounds i8, ptr %293, i64 21
  br label %295

295:                                              ; preds = %290, %283
  %296 = phi ptr [ %289, %283 ], [ %294, %290 ]
  %297 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %298 = getelementptr inbounds %struct.s2n_debug_info, ptr %297, i32 0, i32 1
  store ptr %296, ptr %298, align 8, !tbaa !24
  %299 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %299, align 4, !tbaa !25
  %300 = call i32 @s2n_calculate_stacktrace()
  br label %301

301:                                              ; preds = %295
  br label %302

302:                                              ; preds = %301
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %814

303:                                              ; No predecessors!
  br label %304

304:                                              ; preds = %303
  br label %305

305:                                              ; preds = %304, %266
  br label %306

306:                                              ; preds = %305
  br label %307

307:                                              ; preds = %306
  %308 = load i8, ptr %24, align 1, !tbaa !9
  %309 = zext i8 %308 to i32
  %310 = load i16, ptr %23, align 2, !tbaa !10
  %311 = zext i16 %310 to i32
  %312 = sub nsw i32 %311, %309
  %313 = trunc i32 %312 to i16
  store i16 %313, ptr %23, align 2, !tbaa !10
  br label %314

314:                                              ; preds = %307
  %315 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 1
  %316 = load i32, ptr %315, align 8, !tbaa !20
  %317 = icmp ne i32 %316, 0
  br i1 %317, label %351, label %318

318:                                              ; preds = %314
  br label %319

319:                                              ; preds = %318
  br label %320

320:                                              ; preds = %319
  %321 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %322 = getelementptr inbounds %struct.s2n_debug_info, ptr %321, i32 0, i32 0
  store ptr @.str.5, ptr %322, align 8, !tbaa !22
  %323 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %324 = getelementptr inbounds %struct.s2n_debug_info, ptr %323, i32 0, i32 0
  %325 = load ptr, ptr %324, align 8, !tbaa !22
  %326 = getelementptr inbounds i8, ptr %325, i64 21
  %327 = call ptr @strrchr(ptr noundef %326, i32 noundef 47) #7
  %328 = icmp ne ptr %327, null
  br i1 %328, label %329, label %336

329:                                              ; preds = %320
  %330 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %331 = getelementptr inbounds %struct.s2n_debug_info, ptr %330, i32 0, i32 0
  %332 = load ptr, ptr %331, align 8, !tbaa !22
  %333 = getelementptr inbounds i8, ptr %332, i64 21
  %334 = call ptr @strrchr(ptr noundef %333, i32 noundef 47) #7
  %335 = getelementptr inbounds i8, ptr %334, i64 1
  br label %341

336:                                              ; preds = %320
  %337 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %338 = getelementptr inbounds %struct.s2n_debug_info, ptr %337, i32 0, i32 0
  %339 = load ptr, ptr %338, align 8, !tbaa !22
  %340 = getelementptr inbounds i8, ptr %339, i64 21
  br label %341

341:                                              ; preds = %336, %329
  %342 = phi ptr [ %335, %329 ], [ %340, %336 ]
  %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 1
  store ptr %342, ptr %344, align 8, !tbaa !24
  %345 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %345, align 4, !tbaa !25
  %346 = call i32 @s2n_calculate_stacktrace()
  br label %347

347:                                              ; preds = %341
  br label %348

348:                                              ; preds = %347
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %814

349:                                              ; No predecessors!
  br label %350

350:                                              ; preds = %349
  br label %351

351:                                              ; preds = %350, %314
  br label %352

352:                                              ; preds = %351
  br label %353

353:                                              ; preds = %352
  br label %354

354:                                              ; preds = %353
  %355 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 1
  %356 = load i32, ptr %355, align 8, !tbaa !20
  %357 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 1
  %358 = load i32, ptr %357, align 8, !tbaa !20
  %359 = urem i32 %356, %358
  %360 = icmp eq i32 %359, 0
  br i1 %360, label %394, label %361

361:                                              ; preds = %354
  br label %362

362:                                              ; preds = %361
  br label %363

363:                                              ; preds = %362
  %364 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %365 = getelementptr inbounds %struct.s2n_debug_info, ptr %364, i32 0, i32 0
  store ptr @.str.6, ptr %365, align 8, !tbaa !22
  %366 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %367 = getelementptr inbounds %struct.s2n_debug_info, ptr %366, i32 0, i32 0
  %368 = load ptr, ptr %367, align 8, !tbaa !22
  %369 = getelementptr inbounds i8, ptr %368, i64 21
  %370 = call ptr @strrchr(ptr noundef %369, i32 noundef 47) #7
  %371 = icmp ne ptr %370, null
  br i1 %371, label %372, label %379

372:                                              ; preds = %363
  %373 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %374 = getelementptr inbounds %struct.s2n_debug_info, ptr %373, i32 0, i32 0
  %375 = load ptr, ptr %374, align 8, !tbaa !22
  %376 = getelementptr inbounds i8, ptr %375, i64 21
  %377 = call ptr @strrchr(ptr noundef %376, i32 noundef 47) #7
  %378 = getelementptr inbounds i8, ptr %377, i64 1
  br label %384

379:                                              ; preds = %363
  %380 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %381 = getelementptr inbounds %struct.s2n_debug_info, ptr %380, i32 0, i32 0
  %382 = load ptr, ptr %381, align 8, !tbaa !22
  %383 = getelementptr inbounds i8, ptr %382, i64 21
  br label %384

384:                                              ; preds = %379, %372
  %385 = phi ptr [ %378, %372 ], [ %383, %379 ]
  %386 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %387 = getelementptr inbounds %struct.s2n_debug_info, ptr %386, i32 0, i32 1
  store ptr %385, ptr %387, align 8, !tbaa !24
  %388 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %388, align 4, !tbaa !25
  %389 = call i32 @s2n_calculate_stacktrace()
  br label %390

390:                                              ; preds = %384
  br label %391

391:                                              ; preds = %390
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %814

392:                                              ; No predecessors!
  br label %393

393:                                              ; preds = %392
  br label %394

394:                                              ; preds = %393, %354
  br label %395

395:                                              ; preds = %394
  br label %396

396:                                              ; preds = %395
  %397 = load ptr, ptr %11, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.s2n_connection, ptr %397, i32 0, i32 23
  %399 = load i8, ptr %398, align 4, !tbaa !26
  %400 = zext i8 %399 to i32
  %401 = icmp slt i32 %400, 32
  br i1 %401, label %402, label %478

402:                                              ; preds = %396
  br label %403

403:                                              ; preds = %402
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  %404 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 1
  %405 = load i32, ptr %404, align 8, !tbaa !20
  store i32 %405, ptr %25, align 4, !tbaa !25
  %406 = load i32, ptr %25, align 4, !tbaa !25
  %407 = icmp ne i32 %406, 0
  %408 = xor i1 %407, true
  %409 = xor i1 %408, true
  %410 = zext i1 %409 to i32
  %411 = sext i32 %410 to i64
  %412 = call i64 @llvm.expect.i64(i64 %411, i64 1)
  %413 = icmp ne i64 %412, 0
  br i1 %413, label %414, label %472

414:                                              ; preds = %403
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #6
  %415 = getelementptr inbounds [16 x i8], ptr %19, i64 0, i64 0
  %416 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 0
  %417 = load ptr, ptr %416, align 8, !tbaa !12
  %418 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 1
  %419 = load i32, ptr %418, align 8, !tbaa !20
  %420 = zext i32 %419 to i64
  %421 = getelementptr inbounds i8, ptr %417, i64 %420
  %422 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 1
  %423 = load i32, ptr %422, align 8, !tbaa !20
  %424 = zext i32 %423 to i64
  %425 = sub i64 0, %424
  %426 = getelementptr inbounds i8, ptr %421, i64 %425
  %427 = load i32, ptr %25, align 4, !tbaa !25
  %428 = zext i32 %427 to i64
  %429 = call ptr @s2n_ensure_memmove_trace(ptr noundef %415, ptr noundef %426, i64 noundef %428)
  store ptr %429, ptr %26, align 8, !tbaa !5
  br label %430

430:                                              ; preds = %414
  %431 = load ptr, ptr %26, align 8, !tbaa !5
  %432 = icmp ne ptr %431, null
  br i1 %432, label %466, label %433

433:                                              ; preds = %430
  br label %434

434:                                              ; preds = %433
  br label %435

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

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

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

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

462:                                              ; preds = %456
  br label %463

463:                                              ; preds = %462
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %469

464:                                              ; No predecessors!
  br label %465

465:                                              ; preds = %464
  br label %466

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

467:                                              ; preds = %466
  br label %468

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

469:                                              ; preds = %468, %463
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #6
  %470 = load i32, ptr %21, align 4
  switch i32 %470, label %473 [
    i32 0, label %471
  ]

471:                                              ; preds = %469
  br label %472

472:                                              ; preds = %471, %403
  store i32 0, ptr %21, align 4
  br label %473

473:                                              ; preds = %472, %469
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  %474 = load i32, ptr %21, align 4
  switch i32 %474, label %814 [
    i32 0, label %475
  ]

475:                                              ; preds = %473
  br label %476

476:                                              ; preds = %475
  br label %477

477:                                              ; preds = %476
  br label %478

478:                                              ; preds = %477, %396
  br label %479

479:                                              ; preds = %478
  %480 = load ptr, ptr %10, align 8, !tbaa !5
  %481 = getelementptr inbounds %struct.s2n_cipher_suite, ptr %480, i32 0, i32 6
  %482 = load ptr, ptr %481, align 8, !tbaa !15
  %483 = getelementptr inbounds %struct.s2n_record_algorithm, ptr %482, i32 0, i32 0
  %484 = load ptr, ptr %483, align 8, !tbaa !17
  %485 = getelementptr inbounds %struct.s2n_cipher, ptr %484, i32 0, i32 1
  %486 = getelementptr inbounds %struct.s2n_cbc_cipher, ptr %485, i32 0, i32 2
  %487 = load ptr, ptr %486, align 8, !tbaa !9
  %488 = load ptr, ptr %17, align 8, !tbaa !5
  %489 = call i32 %487(ptr noundef %488, ptr noundef %18, ptr noundef %22, ptr noundef %22)
  %490 = icmp sgt i32 %489, -1
  br i1 %490, label %492, label %491

491:                                              ; preds = %479
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %814

492:                                              ; preds = %479
  br label %493

493:                                              ; preds = %492
  br label %494

494:                                              ; preds = %493
  %495 = load ptr, ptr %11, align 8, !tbaa !5
  %496 = getelementptr inbounds %struct.s2n_connection, ptr %495, i32 0, i32 23
  %497 = load i8, ptr %496, align 4, !tbaa !26
  %498 = zext i8 %497 to i32
  %499 = icmp slt i32 %498, 32
  br i1 %499, label %500, label %566

500:                                              ; preds = %494
  br label %501

501:                                              ; preds = %500
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #6
  %502 = getelementptr inbounds %struct.s2n_blob, ptr %18, i32 0, i32 1
  %503 = load i32, ptr %502, align 8, !tbaa !20
  store i32 %503, ptr %27, align 4, !tbaa !25
  %504 = load i32, ptr %27, align 4, !tbaa !25
  %505 = icmp ne i32 %504, 0
  %506 = xor i1 %505, true
  %507 = xor i1 %506, true
  %508 = zext i1 %507 to i32
  %509 = sext i32 %508 to i64
  %510 = call i64 @llvm.expect.i64(i64 %509, i64 1)
  %511 = icmp ne i64 %510, 0
  br i1 %511, label %512, label %560

512:                                              ; preds = %501
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  %513 = load ptr, ptr %14, align 8, !tbaa !5
  %514 = getelementptr inbounds [16 x i8], ptr %19, i64 0, i64 0
  %515 = load i32, ptr %27, align 4, !tbaa !25
  %516 = zext i32 %515 to i64
  %517 = call ptr @s2n_ensure_memmove_trace(ptr noundef %513, ptr noundef %514, i64 noundef %516)
  store ptr %517, ptr %28, align 8, !tbaa !5
  br label %518

518:                                              ; preds = %512
  %519 = load ptr, ptr %28, align 8, !tbaa !5
  %520 = icmp ne ptr %519, null
  br i1 %520, label %554, label %521

521:                                              ; preds = %518
  br label %522

522:                                              ; preds = %521
  br label %523

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

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

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

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

550:                                              ; preds = %544
  br label %551

551:                                              ; preds = %550
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %557

552:                                              ; No predecessors!
  br label %553

553:                                              ; preds = %552
  br label %554

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

555:                                              ; preds = %554
  br label %556

556:                                              ; preds = %555
  store i32 0, ptr %21, align 4
  br label %557

557:                                              ; preds = %556, %551
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  %558 = load i32, ptr %21, align 4
  switch i32 %558, label %561 [
    i32 0, label %559
  ]

559:                                              ; preds = %557
  br label %560

560:                                              ; preds = %559, %501
  store i32 0, ptr %21, align 4
  br label %561

561:                                              ; preds = %560, %557
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #6
  %562 = load i32, ptr %21, align 4
  switch i32 %562, label %814 [
    i32 0, label %563
  ]

563:                                              ; preds = %561
  br label %564

564:                                              ; preds = %563
  br label %565

565:                                              ; preds = %564
  br label %566

566:                                              ; preds = %565, %494
  br label %567

567:                                              ; preds = %566
  %568 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 1
  %569 = load i32, ptr %568, align 8, !tbaa !20
  %570 = icmp ugt i32 %569, 0
  br i1 %570, label %604, label %571

571:                                              ; preds = %567
  br label %572

572:                                              ; preds = %571
  br label %573

573:                                              ; preds = %572
  %574 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %575 = getelementptr inbounds %struct.s2n_debug_info, ptr %574, i32 0, i32 0
  store ptr @.str.9, ptr %575, align 8, !tbaa !22
  %576 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %577 = getelementptr inbounds %struct.s2n_debug_info, ptr %576, i32 0, i32 0
  %578 = load ptr, ptr %577, align 8, !tbaa !22
  %579 = getelementptr inbounds i8, ptr %578, i64 21
  %580 = call ptr @strrchr(ptr noundef %579, i32 noundef 47) #7
  %581 = icmp ne ptr %580, null
  br i1 %581, label %582, label %589

582:                                              ; preds = %573
  %583 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %584 = getelementptr inbounds %struct.s2n_debug_info, ptr %583, i32 0, i32 0
  %585 = load ptr, ptr %584, align 8, !tbaa !22
  %586 = getelementptr inbounds i8, ptr %585, i64 21
  %587 = call ptr @strrchr(ptr noundef %586, i32 noundef 47) #7
  %588 = getelementptr inbounds i8, ptr %587, i64 1
  br label %594

589:                                              ; preds = %573
  %590 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %591 = getelementptr inbounds %struct.s2n_debug_info, ptr %590, i32 0, i32 0
  %592 = load ptr, ptr %591, align 8, !tbaa !22
  %593 = getelementptr inbounds i8, ptr %592, i64 21
  br label %594

594:                                              ; preds = %589, %582
  %595 = phi ptr [ %588, %582 ], [ %593, %589 ]
  %596 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %597 = getelementptr inbounds %struct.s2n_debug_info, ptr %596, i32 0, i32 1
  store ptr %595, ptr %597, align 8, !tbaa !24
  %598 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %598, align 4, !tbaa !25
  %599 = call i32 @s2n_calculate_stacktrace()
  br label %600

600:                                              ; preds = %594
  br label %601

601:                                              ; preds = %600
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %814

602:                                              ; No predecessors!
  br label %603

603:                                              ; preds = %602
  br label %604

604:                                              ; preds = %603, %567
  br label %605

605:                                              ; preds = %604
  br label %606

606:                                              ; preds = %605
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #6
  store i32 0, ptr %29, align 4, !tbaa !25
  br label %607

607:                                              ; preds = %606
  %608 = load i16, ptr %23, align 2, !tbaa !10
  %609 = zext i16 %608 to i32
  %610 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 0
  %611 = load ptr, ptr %610, align 8, !tbaa !12
  %612 = getelementptr inbounds %struct.s2n_blob, ptr %22, i32 0, i32 1
  %613 = load i32, ptr %612, align 8, !tbaa !20
  %614 = sub i32 %613, 1
  %615 = zext i32 %614 to i64
  %616 = getelementptr inbounds i8, ptr %611, i64 %615
  %617 = load i8, ptr %616, align 1, !tbaa !9
  %618 = zext i8 %617 to i32
  %619 = add nsw i32 %618, 1
  %620 = call i32 @s2n_sub_overflow(i32 noundef %609, i32 noundef %619, ptr noundef %29)
  %621 = icmp sgt i32 %620, -1
  br i1 %621, label %623, label %622

622:                                              ; preds = %607
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %813

623:                                              ; preds = %607
  br label %624

624:                                              ; preds = %623
  br label %625

625:                                              ; preds = %624
  %626 = load i32, ptr %29, align 4, !tbaa !25
  %627 = trunc i32 %626 to i16
  store i16 %627, ptr %23, align 2, !tbaa !10
  %628 = load i16, ptr %23, align 2, !tbaa !10
  %629 = zext i16 %628 to i32
  %630 = ashr i32 %629, 8
  %631 = trunc i32 %630 to i8
  %632 = load ptr, ptr %20, align 8, !tbaa !5
  %633 = getelementptr inbounds i8, ptr %632, i64 3
  store i8 %631, ptr %633, align 1, !tbaa !9
  %634 = load i16, ptr %23, align 2, !tbaa !10
  %635 = zext i16 %634 to i32
  %636 = and i32 %635, 255
  %637 = trunc i32 %636 to i8
  %638 = load ptr, ptr %20, align 8, !tbaa !5
  %639 = getelementptr inbounds i8, ptr %638, i64 4
  store i8 %637, ptr %639, align 1, !tbaa !9
  br label %640

640:                                              ; preds = %625
  %641 = load ptr, ptr %15, align 8, !tbaa !5
  %642 = call i32 @s2n_hmac_reset(ptr noundef %641)
  %643 = icmp sgt i32 %642, -1
  br i1 %643, label %645, label %644

644:                                              ; preds = %640
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %813

645:                                              ; preds = %640
  br label %646

646:                                              ; preds = %645
  br label %647

647:                                              ; preds = %646
  br label %648

648:                                              ; preds = %647
  %649 = load ptr, ptr %15, align 8, !tbaa !5
  %650 = load ptr, ptr %16, align 8, !tbaa !5
  %651 = call i32 @s2n_hmac_update(ptr noundef %649, ptr noundef %650, i32 noundef 8)
  %652 = icmp sgt i32 %651, -1
  br i1 %652, label %654, label %653

653:                                              ; preds = %648
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %813

654:                                              ; preds = %648
  br label %655

655:                                              ; preds = %654
  br label %656

656:                                              ; preds = %655
  %657 = load ptr, ptr %11, align 8, !tbaa !5
  %658 = getelementptr inbounds %struct.s2n_connection, ptr %657, i32 0, i32 23
  %659 = load i8, ptr %658, align 4, !tbaa !26
  %660 = zext i8 %659 to i32
  %661 = icmp eq i32 %660, 30
  br i1 %661, label %662, label %682

662:                                              ; preds = %656
  br label %663

663:                                              ; preds = %662
  %664 = load ptr, ptr %15, align 8, !tbaa !5
  %665 = load ptr, ptr %20, align 8, !tbaa !5
  %666 = call i32 @s2n_hmac_update(ptr noundef %664, ptr noundef %665, i32 noundef 1)
  %667 = icmp sgt i32 %666, -1
  br i1 %667, label %669, label %668

668:                                              ; preds = %663
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %813

669:                                              ; preds = %663
  br label %670

670:                                              ; preds = %669
  br label %671

671:                                              ; preds = %670
  br label %672

672:                                              ; preds = %671
  %673 = load ptr, ptr %15, align 8, !tbaa !5
  %674 = load ptr, ptr %20, align 8, !tbaa !5
  %675 = getelementptr inbounds i8, ptr %674, i64 3
  %676 = call i32 @s2n_hmac_update(ptr noundef %673, ptr noundef %675, i32 noundef 2)
  %677 = icmp sgt i32 %676, -1
  br i1 %677, label %679, label %678

678:                                              ; preds = %672
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %813

679:                                              ; preds = %672
  br label %680

680:                                              ; preds = %679
  br label %681

681:                                              ; preds = %680
  br label %692

682:                                              ; preds = %656
  br label %683

683:                                              ; preds = %682
  %684 = load ptr, ptr %15, align 8, !tbaa !5
  %685 = load ptr, ptr %20, align 8, !tbaa !5
  %686 = call i32 @s2n_hmac_update(ptr noundef %684, ptr noundef %685, i32 noundef 5)
  %687 = icmp sgt i32 %686, -1
  br i1 %687, label %689, label %688

688:                                              ; preds = %683
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %813

689:                                              ; preds = %683
  br label %690

690:                                              ; preds = %689
  br label %691

691:                                              ; preds = %690
  br label %692

692:                                              ; preds = %691, %681
  call void @llvm.lifetime.start.p0(i64 24, ptr %30) #6
  %693 = getelementptr inbounds %struct.s2n_blob, ptr %30, i32 0, i32 0
  %694 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %694, ptr %693, align 8, !tbaa !12
  %695 = getelementptr inbounds %struct.s2n_blob, ptr %30, i32 0, i32 1
  store i32 8, ptr %695, align 8, !tbaa !20
  %696 = getelementptr inbounds %struct.s2n_blob, ptr %30, i32 0, i32 2
  store i32 0, ptr %696, align 4, !tbaa !21
  %697 = getelementptr inbounds %struct.s2n_blob, ptr %30, i32 0, i32 3
  %698 = load i8, ptr %697, align 8
  %699 = and i8 %698, -2
  %700 = or i8 %699, 0
  store i8 %700, ptr %697, align 8
  br label %701

701:                                              ; preds = %692
  %702 = call i32 @s2n_increment_sequence_number(ptr noundef %30)
  %703 = icmp sgt i32 %702, -1
  br i1 %703, label %705, label %704

704:                                              ; preds = %701
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %812

705:                                              ; preds = %701
  br label %706

706:                                              ; preds = %705
  br label %707

707:                                              ; preds = %706
  %708 = load ptr, ptr %11, align 8, !tbaa !5
  %709 = load ptr, ptr %15, align 8, !tbaa !5
  %710 = call i32 @s2n_verify_cbc(ptr noundef %708, ptr noundef %709, ptr noundef %22)
  %711 = icmp slt i32 %710, 0
  br i1 %711, label %712, label %745

712:                                              ; preds = %707
  br label %713

713:                                              ; preds = %712
  br label %714

714:                                              ; preds = %713
  %715 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %716 = getelementptr inbounds %struct.s2n_debug_info, ptr %715, i32 0, i32 0
  store ptr @.str.10, ptr %716, align 8, !tbaa !22
  %717 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %718 = getelementptr inbounds %struct.s2n_debug_info, ptr %717, i32 0, i32 0
  %719 = load ptr, ptr %718, align 8, !tbaa !22
  %720 = getelementptr inbounds i8, ptr %719, i64 21
  %721 = call ptr @strrchr(ptr noundef %720, i32 noundef 47) #7
  %722 = icmp ne ptr %721, null
  br i1 %722, label %723, label %730

723:                                              ; preds = %714
  %724 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %725 = getelementptr inbounds %struct.s2n_debug_info, ptr %724, i32 0, i32 0
  %726 = load ptr, ptr %725, align 8, !tbaa !22
  %727 = getelementptr inbounds i8, ptr %726, i64 21
  %728 = call ptr @strrchr(ptr noundef %727, i32 noundef 47) #7
  %729 = getelementptr inbounds i8, ptr %728, i64 1
  br label %735

730:                                              ; preds = %714
  %731 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %732 = getelementptr inbounds %struct.s2n_debug_info, ptr %731, i32 0, i32 0
  %733 = load ptr, ptr %732, align 8, !tbaa !22
  %734 = getelementptr inbounds i8, ptr %733, i64 21
  br label %735

735:                                              ; preds = %730, %723
  %736 = phi ptr [ %729, %723 ], [ %734, %730 ]
  %737 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %738 = getelementptr inbounds %struct.s2n_debug_info, ptr %737, i32 0, i32 1
  store ptr %736, ptr %738, align 8, !tbaa !24
  %739 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %739, align 4, !tbaa !25
  %740 = call i32 @s2n_calculate_stacktrace()
  br label %741

741:                                              ; preds = %735
  br label %742

742:                                              ; preds = %741
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %812

743:                                              ; No predecessors!
  br label %744

744:                                              ; preds = %743
  br label %745

745:                                              ; preds = %744, %707
  br label %746

746:                                              ; preds = %745
  %747 = load ptr, ptr %11, align 8, !tbaa !5
  %748 = getelementptr inbounds %struct.s2n_connection, ptr %747, i32 0, i32 40
  %749 = call i32 @s2n_stuffer_reread(ptr noundef %748)
  %750 = icmp sgt i32 %749, -1
  br i1 %750, label %752, label %751

751:                                              ; preds = %746
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %812

752:                                              ; preds = %746
  br label %753

753:                                              ; preds = %752
  br label %754

754:                                              ; preds = %753
  br label %755

755:                                              ; preds = %754
  %756 = load ptr, ptr %11, align 8, !tbaa !5
  %757 = getelementptr inbounds %struct.s2n_connection, ptr %756, i32 0, i32 38
  %758 = call i32 @s2n_stuffer_reread(ptr noundef %757)
  %759 = icmp sgt i32 %758, -1
  br i1 %759, label %761, label %760

760:                                              ; preds = %755
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %812

761:                                              ; preds = %755
  br label %762

762:                                              ; preds = %761
  br label %763

763:                                              ; preds = %762
  %764 = load ptr, ptr %11, align 8, !tbaa !5
  %765 = getelementptr inbounds %struct.s2n_connection, ptr %764, i32 0, i32 23
  %766 = load i8, ptr %765, align 4, !tbaa !26
  %767 = zext i8 %766 to i32
  %768 = icmp sgt i32 %767, 31
  br i1 %768, label %769, label %788

769:                                              ; preds = %763
  br label %770

770:                                              ; preds = %769
  %771 = load ptr, ptr %11, align 8, !tbaa !5
  %772 = getelementptr inbounds %struct.s2n_connection, ptr %771, i32 0, i32 40
  %773 = load ptr, ptr %10, align 8, !tbaa !5
  %774 = getelementptr inbounds %struct.s2n_cipher_suite, ptr %773, i32 0, i32 6
  %775 = load ptr, ptr %774, align 8, !tbaa !15
  %776 = getelementptr inbounds %struct.s2n_record_algorithm, ptr %775, i32 0, i32 0
  %777 = load ptr, ptr %776, align 8, !tbaa !17
  %778 = getelementptr inbounds %struct.s2n_cipher, ptr %777, i32 0, i32 1
  %779 = getelementptr inbounds %struct.s2n_cbc_cipher, ptr %778, i32 0, i32 1
  %780 = load i8, ptr %779, align 1, !tbaa !9
  %781 = zext i8 %780 to i32
  %782 = call i32 @s2n_stuffer_skip_read(ptr noundef %772, i32 noundef %781)
  %783 = icmp sgt i32 %782, -1
  br i1 %783, label %785, label %784

784:                                              ; preds = %770
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %812

785:                                              ; preds = %770
  br label %786

786:                                              ; preds = %785
  br label %787

787:                                              ; preds = %786
  br label %788

788:                                              ; preds = %787, %763
  br label %789

789:                                              ; preds = %788
  %790 = load ptr, ptr %11, align 8, !tbaa !5
  %791 = getelementptr inbounds %struct.s2n_connection, ptr %790, i32 0, i32 40
  %792 = load ptr, ptr %11, align 8, !tbaa !5
  %793 = getelementptr inbounds %struct.s2n_connection, ptr %792, i32 0, i32 40
  %794 = getelementptr inbounds %struct.s2n_stuffer, ptr %793, i32 0, i32 2
  %795 = load i32, ptr %794, align 4, !tbaa !54
  %796 = load ptr, ptr %11, align 8, !tbaa !5
  %797 = getelementptr inbounds %struct.s2n_connection, ptr %796, i32 0, i32 40
  %798 = getelementptr inbounds %struct.s2n_stuffer, ptr %797, i32 0, i32 1
  %799 = load i32, ptr %798, align 8, !tbaa !55
  %800 = sub i32 %795, %799
  %801 = load i16, ptr %23, align 2, !tbaa !10
  %802 = zext i16 %801 to i32
  %803 = sub i32 %800, %802
  %804 = call i32 @s2n_stuffer_wipe_n(ptr noundef %791, i32 noundef %803)
  %805 = icmp sgt i32 %804, -1
  br i1 %805, label %807, label %806

806:                                              ; preds = %789
  store i32 -1, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %812

807:                                              ; preds = %789
  br label %808

808:                                              ; preds = %807
  br label %809

809:                                              ; preds = %808
  %810 = load ptr, ptr %11, align 8, !tbaa !5
  %811 = getelementptr inbounds %struct.s2n_connection, ptr %810, i32 0, i32 42
  store i32 1, ptr %811, align 8, !tbaa !56
  store i32 0, ptr %9, align 4
  store i32 1, ptr %21, align 4
  br label %812

812:                                              ; preds = %809, %806, %784, %760, %751, %742, %704
  call void @llvm.lifetime.end.p0(i64 24, ptr %30) #6
  br label %813

813:                                              ; preds = %812, %688, %678, %668, %653, %644, %622
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #6
  br label %814

814:                                              ; preds = %813, %601, %561, %491, %473, %391, %348, %302, %262
  call void @llvm.lifetime.end.p0(i64 1, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 2, ptr %23) #6
  br label %815

815:                                              ; preds = %814, %249
  call void @llvm.lifetime.end.p0(i64 24, ptr %22) #6
  br label %816

816:                                              ; preds = %815, %188, %148, %131, %84
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr %18) #6
  %817 = load i32, ptr %9, align 4
  ret i32 %817
}

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

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

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

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

declare i32 @s2n_calculate_stacktrace() #2

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

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

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

declare ptr @s2n_ensure_memmove_trace(ptr noundef, ptr noundef, i64 noundef) #2

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

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

declare i32 @s2n_hmac_reset(ptr noundef) #2

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

declare i32 @s2n_increment_sequence_number(ptr noundef) #2

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

declare i32 @s2n_stuffer_reread(ptr noundef) #2

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

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

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 willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { 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 #5 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #6 = { nounwind }
attributes #7 = { nounwind willreturn memory(read) }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"short", !7, i64 0}
!12 = !{!13, !6, i64 0}
!13 = !{!"s2n_blob", !6, i64 0, !14, i64 8, !14, i64 12, !14, i64 16}
!14 = !{!"int", !7, i64 0}
!15 = !{!16, !6, i64 48}
!16 = !{!"s2n_cipher_suite", !14, i64 0, !6, i64 8, !6, i64 16, !7, i64 24, !6, i64 32, !14, i64 40, !6, i64 48, !7, i64 56, !7, i64 72, !6, i64 80, !6, i64 88, !14, i64 96, !7, i64 100}
!17 = !{!18, !6, i64 0}
!18 = !{!"s2n_record_algorithm", !6, i64 0, !14, i64 8, !14, i64 12, !19, i64 16}
!19 = !{!"long", !7, i64 0}
!20 = !{!13, !14, i64 8}
!21 = !{!13, !14, i64 12}
!22 = !{!23, !6, i64 0}
!23 = !{!"s2n_debug_info", !6, i64 0, !6, i64 8}
!24 = !{!23, !6, i64 8}
!25 = !{!14, !14, i64 0}
!26 = !{!27, !7, i64 220}
!27 = !{!"s2n_connection", !14, i64 0, !14, i64 0, !14, i64 0, !14, i64 0, !14, i64 0, !14, i64 0, !14, i64 0, !14, i64 0, !14, i64 1, !14, i64 1, !14, i64 1, !14, i64 1, !14, i64 1, !14, i64 1, !14, i64 1, !14, i64 1, !14, i64 2, !14, i64 2, !14, i64 2, !14, i64 2, !14, i64 2, !14, i64 2, !14, 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, !14, i64 148, !14, i64 152, !28, 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, !29, i64 240, !6, i64 632, !6, i64 640, !30, i64 648, !36, i64 1144, !39, i64 1688, !6, i64 1752, !7, i64 1760, !14, i64 1764, !7, i64 1768, !41, i64 1776, !41, i64 1816, !41, i64 1856, !41, i64 1896, !14, i64 1936, !19, i64 1944, !7, i64 1952, !41, i64 1960, !7, i64 2000, !7, i64 2001, !7, i64 2002, !35, i64 2003, !42, i64 2004, !42, i64 2008, !43, i64 2016, !11, i64 2208, !14, i64 2212, !11, i64 2216, !19, i64 2224, !7, i64 2232, !19, i64 2240, !19, i64 2248, !19, i64 2256, !42, i64 2264, !42, i64 2268, !7, i64 2272, !7, i64 2528, !14, i64 2784, !13, i64 2792, !14, i64 2816, !13, i64 2824, !13, i64 2848, !13, i64 2872, !45, i64 2896, !47, i64 3704, !6, i64 3760, !6, i64 3768, !7, i64 3776, !14, i64 3780, !13, i64 3784, !14, i64 3808, !49, i64 3816, !7, i64 3848, !41, i64 3992, !13, i64 4032, !13, i64 4056, !35, i64 4080, !35, i64 4081, !35, i64 4082, !11, i64 4084, !11, i64 4086, !14, i64 4088, !14, i64 4092, !13, i64 4096, !14, i64 4120, !50, i64 4128, !42, i64 4176, !7, i64 4180, !7, i64 4181}
!28 = !{!"s2n_timer", !19, i64 0}
!29 = !{!"s2n_secrets", !7, i64 0, !14, i64 388}
!30 = !{!"s2n_kex_parameters", !31, i64 0, !32, i64 8, !7, i64 24, !32, i64 56, !33, i64 72, !33, i64 184, !7, i64 296, !34, i64 360, !13, i64 448, !13, i64 472}
!31 = !{!"s2n_dh_params", !6, i64 0}
!32 = !{!"s2n_ecc_evp_params", !6, i64 0, !6, i64 8}
!33 = !{!"s2n_kem_group_params", !6, i64 0, !34, i64 8, !32, i64 96}
!34 = !{!"s2n_kem_params", !6, i64 0, !13, i64 8, !13, i64 32, !13, i64 56, !35, i64 80}
!35 = !{!"_Bool", !7, i64 0}
!36 = !{!"s2n_handshake_parameters", !37, i64 0, !37, i64 48, !13, i64 96, !14, i64 120, !38, 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}
!37 = !{!"s2n_pkey", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40}
!38 = !{!"s2n_sig_scheme_list", !7, i64 0, !7, i64 256}
!39 = !{!"s2n_psk_parameters", !14, i64 0, !40, i64 8, !11, i64 40, !11, i64 42, !6, i64 48, !14, i64 56}
!40 = !{!"s2n_array", !13, i64 0, !14, i64 24, !14, i64 28}
!41 = !{!"s2n_stuffer", !13, i64 0, !14, i64 24, !14, i64 28, !14, i64 32, !14, i64 36, !14, i64 36, !14, i64 36}
!42 = !{!"", !14, i64 0}
!43 = !{!"s2n_handshake", !41, i64 0, !6, i64 40, !7, i64 48, !7, i64 56, !7, i64 104, !7, i64 152, !14, i64 156, !14, i64 160, !14, i64 164, !14, i64 168, !44, i64 176, !14, i64 184, !14, i64 184, !14, i64 184, !14, i64 184, !14, i64 188}
!44 = !{!"s2n_offered_early_data", !6, i64 0}
!45 = !{!"s2n_client_hello", !13, i64 0, !46, i64 24, !13, i64 728, !13, i64 752, !13, i64 776, !7, i64 800, !7, i64 801, !14, i64 802, !14, i64 802, !14, i64 802, !14, i64 802, !14, i64 802, !14, i64 802, !14, i64 802}
!46 = !{!"", !7, i64 0, !13, i64 672, !11, i64 696}
!47 = !{!"s2n_x509_validator", !6, i64 0, !6, i64 8, !7, i64 16, !7, i64 17, !11, i64 18, !6, i64 24, !14, i64 32, !6, i64 40, !48, i64 48, !35, i64 52}
!48 = !{!"s2n_cert_validation_info", !14, i64 0, !14, i64 0}
!49 = !{!"s2n_ticket_fields", !13, i64 0, !14, i64 24}
!50 = !{!"s2n_post_handshake", !41, i64 0, !7, i64 40}
!51 = !{!52, !14, i64 0}
!52 = !{!"s2n_hmac_state", !14, i64 0, !11, i64 4, !14, i64 8, !11, i64 12, !7, i64 14, !53, i64 16, !53, i64 72, !53, i64 128, !53, i64 184, !7, i64 240, !7, i64 368}
!53 = !{!"s2n_hash_state", !6, i64 0, !14, i64 8, !7, i64 12, !19, i64 16, !7, i64 24}
!54 = !{!27, !14, i64 1884}
!55 = !{!27, !14, i64 1880}
!56 = !{!27, !14, i64 1936}


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

%struct.s2n_debug_info = type { ptr, ptr }
%struct.s2n_blob = type { ptr, i32, i32, i8 }

@.str = external hidden unnamed_addr constant [95 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 [95 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [96 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1, 1) i32 @s2n_record_parse_cbc(ptr nocapture noundef readonly %0, ptr noundef %1, i8 noundef zeroext %2, i16 noundef zeroext %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7) local_unnamed_addr #0 {
  %9 = alloca %struct.s2n_blob, align 8
  %10 = alloca [16 x i8], align 16
  %11 = alloca %struct.s2n_blob, align 8
  %12 = alloca i8, align 1
  %13 = alloca i32, align 4
  %14 = alloca %struct.s2n_blob, align 8
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %9) #5
  store ptr %4, ptr %9, align 8, !tbaa !5
  %15 = getelementptr inbounds i8, ptr %9, i64 8
  %16 = getelementptr inbounds i8, ptr %0, i64 48
  %17 = load ptr, ptr %16, align 8, !tbaa !11
  %18 = load ptr, ptr %17, align 8, !tbaa !13
  %19 = getelementptr inbounds i8, ptr %18, i64 9
  %20 = load i8, ptr %19, align 1, !tbaa !16
  %21 = zext i8 %20 to i32
  store i32 %21, ptr %15, align 8, !tbaa !17
  %22 = getelementptr inbounds i8, ptr %9, i64 12
  store i32 0, ptr %22, align 4, !tbaa !18
  %23 = getelementptr inbounds i8, ptr %9, i64 16
  store i8 0, ptr %23, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #5
  %24 = getelementptr inbounds i8, ptr %1, i64 1776
  %25 = tail call ptr @s2n_stuffer_raw_read(ptr noundef nonnull %24, i32 noundef 5) #5
  %.not = icmp eq ptr %25, null
  br i1 %.not, label %26, label %34

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

34:                                               ; preds = %8
  %35 = load ptr, ptr %16, align 8, !tbaa !11
  %36 = load ptr, ptr %35, align 8, !tbaa !13
  %37 = getelementptr inbounds i8, ptr %36, i64 9
  %38 = load i8, ptr %37, align 1, !tbaa !16
  %39 = icmp ult i8 %38, 17
  br i1 %39, label %48, label %40

40:                                               ; preds = %34
  %41 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.1, ptr %41, align 8, !tbaa !19
  %42 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.1, i64 21), i32 noundef 47) #6
  %.not85 = icmp eq ptr %42, null
  %43 = getelementptr inbounds i8, ptr %42, i64 1
  %44 = select i1 %.not85, ptr getelementptr inbounds (i8, ptr @.str.1, i64 21), ptr %43
  %45 = getelementptr inbounds i8, ptr %41, i64 8
  store ptr %44, ptr %45, align 8, !tbaa !21
  %46 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %46, align 4, !tbaa !22
  %47 = tail call i32 @s2n_calculate_stacktrace() #5
  br label %255

48:                                               ; preds = %34
  %49 = getelementptr inbounds i8, ptr %1, i64 220
  %50 = load i8, ptr %49, align 4, !tbaa !23
  %51 = icmp ugt i8 %50, 31
  br i1 %51, label %52, label %70

52:                                               ; preds = %48
  %53 = getelementptr inbounds i8, ptr %1, i64 1856
  %54 = call i32 @s2n_stuffer_read(ptr noundef nonnull %53, ptr noundef nonnull %9) #5
  %55 = icmp sgt i32 %54, -1
  br i1 %55, label %56, label %255

56:                                               ; preds = %52
  %57 = zext i16 %3 to i32
  %58 = load i32, ptr %15, align 8, !tbaa !17
  %.not86 = icmp ugt i32 %58, %57
  br i1 %.not86, label %59, label %67

59:                                               ; preds = %56
  %60 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.2, ptr %60, align 8, !tbaa !19
  %61 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.2, i64 21), i32 noundef 47) #6
  %.not87 = icmp eq ptr %61, null
  %62 = getelementptr inbounds i8, ptr %61, i64 1
  %63 = select i1 %.not87, ptr getelementptr inbounds (i8, ptr @.str.2, i64 21), ptr %62
  %64 = getelementptr inbounds i8, ptr %60, i64 8
  store ptr %63, ptr %64, align 8, !tbaa !21
  %65 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %65, align 4, !tbaa !22
  %66 = call i32 @s2n_calculate_stacktrace() #5
  br label %255

67:                                               ; preds = %56
  %68 = trunc i32 %58 to i16
  %69 = sub i16 %3, %68
  br label %70

70:                                               ; preds = %67, %48
  %.062 = phi i16 [ %69, %67 ], [ %3, %48 ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %11) #5
  %71 = getelementptr inbounds i8, ptr %1, i64 1856
  %72 = zext i16 %.062 to i32
  %73 = call ptr @s2n_stuffer_raw_read(ptr noundef nonnull %71, i32 noundef %72) #5
  store ptr %73, ptr %11, align 8, !tbaa !5
  %74 = getelementptr inbounds i8, ptr %11, i64 8
  store i32 %72, ptr %74, align 8, !tbaa !17
  %75 = getelementptr inbounds i8, ptr %11, i64 12
  store i32 0, ptr %75, align 4, !tbaa !18
  %76 = getelementptr inbounds i8, ptr %11, i64 16
  store i8 0, ptr %76, align 8
  %.not88 = icmp eq ptr %73, null
  br i1 %.not88, label %77, label %85

77:                                               ; preds = %70
  %78 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.3, ptr %78, align 8, !tbaa !19
  %79 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.3, i64 21), i32 noundef 47) #6
  %.not89 = icmp eq ptr %79, null
  %80 = getelementptr inbounds i8, ptr %79, i64 1
  %81 = select i1 %.not89, ptr getelementptr inbounds (i8, ptr @.str.3, i64 21), ptr %80
  %82 = getelementptr inbounds i8, ptr %78, i64 8
  store ptr %81, ptr %82, align 8, !tbaa !21
  %83 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %83, align 4, !tbaa !22
  %84 = call i32 @s2n_calculate_stacktrace() #5
  br label %254

85:                                               ; preds = %70
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %12) #5
  store i8 0, ptr %12, align 1, !tbaa !16
  %86 = load i32, ptr %5, align 8, !tbaa !49
  %87 = call i32 @s2n_hmac_digest_size(i32 noundef %86, ptr noundef nonnull %12) #5
  %88 = icmp sgt i32 %87, -1
  br i1 %88, label %89, label %253

89:                                               ; preds = %85
  %90 = load i8, ptr %12, align 1, !tbaa !16
  %91 = zext i8 %90 to i16
  %.not90 = icmp ult i16 %.062, %91
  br i1 %.not90, label %92, label %100

92:                                               ; preds = %89
  %93 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.4, ptr %93, align 8, !tbaa !19
  %94 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.4, i64 21), i32 noundef 47) #6
  %.not91 = icmp eq ptr %94, null
  %95 = getelementptr inbounds i8, ptr %94, i64 1
  %96 = select i1 %.not91, ptr getelementptr inbounds (i8, ptr @.str.4, i64 21), ptr %95
  %97 = getelementptr inbounds i8, ptr %93, i64 8
  store ptr %96, ptr %97, align 8, !tbaa !21
  %98 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %98, align 4, !tbaa !22
  %99 = call i32 @s2n_calculate_stacktrace() #5
  br label %253

100:                                              ; preds = %89
  %101 = sub i16 %.062, %91
  %.not92 = icmp eq i16 %.062, 0
  br i1 %.not92, label %102, label %110

102:                                              ; preds = %100
  %103 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.5, ptr %103, align 8, !tbaa !19
  %104 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.5, i64 21), i32 noundef 47) #6
  %.not93 = icmp eq ptr %104, null
  %105 = getelementptr inbounds i8, ptr %104, i64 1
  %106 = select i1 %.not93, ptr getelementptr inbounds (i8, ptr @.str.5, i64 21), ptr %105
  %107 = getelementptr inbounds i8, ptr %103, i64 8
  store ptr %106, ptr %107, align 8, !tbaa !21
  %108 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %108, align 4, !tbaa !22
  %109 = call i32 @s2n_calculate_stacktrace() #5
  br label %253

110:                                              ; preds = %100
  %111 = load i32, ptr %15, align 8, !tbaa !17
  %112 = urem i32 %72, %111
  %113 = icmp eq i32 %112, 0
  br i1 %113, label %122, label %114

114:                                              ; preds = %110
  %115 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.6, ptr %115, align 8, !tbaa !19
  %116 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.6, i64 21), i32 noundef 47) #6
  %.not94 = icmp eq ptr %116, null
  %117 = getelementptr inbounds i8, ptr %116, i64 1
  %118 = select i1 %.not94, ptr getelementptr inbounds (i8, ptr @.str.6, i64 21), ptr %117
  %119 = getelementptr inbounds i8, ptr %115, i64 8
  store ptr %118, ptr %119, align 8, !tbaa !21
  %120 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %120, align 4, !tbaa !22
  %121 = call i32 @s2n_calculate_stacktrace() #5
  br label %253

122:                                              ; preds = %110
  %123 = load i8, ptr %49, align 4, !tbaa !23
  %124 = icmp ult i8 %123, 32
  br i1 %124, label %125, label %.critedge107

125:                                              ; preds = %122
  %126 = zext i16 %.062 to i64
  %127 = getelementptr inbounds i8, ptr %73, i64 %126
  %128 = zext i32 %111 to i64
  %129 = sub nsw i64 0, %128
  %130 = getelementptr inbounds i8, ptr %127, i64 %129
  %131 = call ptr @s2n_ensure_memmove_trace(ptr noundef nonnull %10, ptr noundef nonnull %130, i64 noundef %128) #5
  %.not95.not.not = icmp eq ptr %131, null
  br i1 %.not95.not.not, label %.critedge, label %.critedge107

.critedge:                                        ; preds = %125
  %132 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.7, ptr %132, align 8, !tbaa !19
  %133 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.7, i64 21), i32 noundef 47) #6
  %.not96 = icmp eq ptr %133, null
  %134 = getelementptr inbounds i8, ptr %133, i64 1
  %135 = select i1 %.not96, ptr getelementptr inbounds (i8, ptr @.str.7, i64 21), ptr %134
  %136 = getelementptr inbounds i8, ptr %132, i64 8
  store ptr %135, ptr %136, align 8, !tbaa !21
  %137 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %137, align 4, !tbaa !22
  %138 = call i32 @s2n_calculate_stacktrace() #5
  br label %253

.critedge107:                                     ; preds = %125, %122
  %139 = load ptr, ptr %16, align 8, !tbaa !11
  %140 = load ptr, ptr %139, align 8, !tbaa !13
  %141 = getelementptr inbounds i8, ptr %140, i64 16
  %142 = load ptr, ptr %141, align 8, !tbaa !16
  %143 = call i32 %142(ptr noundef %7, ptr noundef nonnull %9, ptr noundef nonnull %11, ptr noundef nonnull %11) #5
  %144 = icmp sgt i32 %143, -1
  br i1 %144, label %145, label %253

145:                                              ; preds = %.critedge107
  %146 = load i8, ptr %49, align 4, !tbaa !23
  %147 = icmp ult i8 %146, 32
  br i1 %147, label %148, label %.critedge106

148:                                              ; preds = %145
  %149 = load i32, ptr %15, align 8, !tbaa !17
  %.not97 = icmp eq i32 %149, 0
  br i1 %.not97, label %.critedge106, label %150, !prof !52

150:                                              ; preds = %148
  %151 = zext i32 %149 to i64
  %152 = call ptr @s2n_ensure_memmove_trace(ptr noundef %4, ptr noundef nonnull %10, i64 noundef %151) #5
  %.not98.not = icmp eq ptr %152, null
  br i1 %.not98.not, label %153, label %.critedge106

153:                                              ; preds = %150
  %154 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.8, ptr %154, align 8, !tbaa !19
  %155 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.8, i64 21), i32 noundef 47) #6
  %.not99 = icmp eq ptr %155, null
  %156 = getelementptr inbounds i8, ptr %155, i64 1
  %157 = select i1 %.not99, ptr getelementptr inbounds (i8, ptr @.str.8, i64 21), ptr %156
  %158 = getelementptr inbounds i8, ptr %154, i64 8
  store ptr %157, ptr %158, align 8, !tbaa !21
  %159 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %159, align 4, !tbaa !22
  %160 = call i32 @s2n_calculate_stacktrace() #5
  br label %253

.critedge106:                                     ; preds = %148, %150, %145
  %161 = load i32, ptr %74, align 8, !tbaa !17
  %.not100 = icmp eq i32 %161, 0
  br i1 %.not100, label %162, label %170

162:                                              ; preds = %.critedge106
  %163 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.9, ptr %163, align 8, !tbaa !19
  %164 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.9, i64 21), i32 noundef 47) #6
  %.not101 = icmp eq ptr %164, null
  %165 = getelementptr inbounds i8, ptr %164, i64 1
  %166 = select i1 %.not101, ptr getelementptr inbounds (i8, ptr @.str.9, i64 21), ptr %165
  %167 = getelementptr inbounds i8, ptr %163, i64 8
  store ptr %166, ptr %167, align 8, !tbaa !21
  %168 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %168, align 4, !tbaa !22
  %169 = call i32 @s2n_calculate_stacktrace() #5
  br label %253

170:                                              ; preds = %.critedge106
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #5
  store i32 0, ptr %13, align 4, !tbaa !22
  %171 = zext i16 %101 to i32
  %172 = load ptr, ptr %11, align 8, !tbaa !5
  %173 = add i32 %161, -1
  %174 = zext i32 %173 to i64
  %175 = getelementptr inbounds i8, ptr %172, i64 %174
  %176 = load i8, ptr %175, align 1, !tbaa !16
  %177 = zext i8 %176 to i32
  %178 = add nuw nsw i32 %177, 1
  %179 = call i32 @s2n_sub_overflow(i32 noundef %171, i32 noundef %178, ptr noundef nonnull %13) #5
  %180 = icmp sgt i32 %179, -1
  br i1 %180, label %181, label %252

181:                                              ; preds = %170
  %182 = load i32, ptr %13, align 4, !tbaa !22
  %183 = and i32 %182, 65535
  %184 = lshr i32 %182, 8
  %185 = trunc i32 %184 to i8
  %186 = getelementptr inbounds i8, ptr %25, i64 3
  store i8 %185, ptr %186, align 1, !tbaa !16
  %187 = trunc i32 %182 to i8
  %188 = getelementptr inbounds i8, ptr %25, i64 4
  store i8 %187, ptr %188, align 1, !tbaa !16
  %189 = call i32 @s2n_hmac_reset(ptr noundef nonnull %5) #5
  %190 = icmp sgt i32 %189, -1
  br i1 %190, label %191, label %252

191:                                              ; preds = %181
  %192 = call i32 @s2n_hmac_update(ptr noundef nonnull %5, ptr noundef %6, i32 noundef 8) #5
  %193 = icmp sgt i32 %192, -1
  br i1 %193, label %194, label %252

194:                                              ; preds = %191
  %195 = load i8, ptr %49, align 4, !tbaa !23
  %196 = icmp eq i8 %195, 30
  br i1 %196, label %197, label %203

197:                                              ; preds = %194
  %198 = call i32 @s2n_hmac_update(ptr noundef nonnull %5, ptr noundef nonnull %25, i32 noundef 1) #5
  %199 = icmp sgt i32 %198, -1
  br i1 %199, label %200, label %252

200:                                              ; preds = %197
  %201 = call i32 @s2n_hmac_update(ptr noundef nonnull %5, ptr noundef nonnull %186, i32 noundef 2) #5
  %202 = icmp sgt i32 %201, -1
  br i1 %202, label %206, label %252

203:                                              ; preds = %194
  %204 = call i32 @s2n_hmac_update(ptr noundef nonnull %5, ptr noundef nonnull %25, i32 noundef 5) #5
  %205 = icmp sgt i32 %204, -1
  br i1 %205, label %206, label %252

206:                                              ; preds = %203, %200
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %14) #5
  store ptr %6, ptr %14, align 8, !tbaa !5
  %207 = getelementptr inbounds i8, ptr %14, i64 8
  store i32 8, ptr %207, align 8, !tbaa !17
  %208 = getelementptr inbounds i8, ptr %14, i64 12
  store i32 0, ptr %208, align 4, !tbaa !18
  %209 = getelementptr inbounds i8, ptr %14, i64 16
  store i8 0, ptr %209, align 8
  %210 = call i32 @s2n_increment_sequence_number(ptr noundef nonnull %14) #5
  %211 = icmp sgt i32 %210, -1
  br i1 %211, label %212, label %251

212:                                              ; preds = %206
  %213 = call i32 @s2n_verify_cbc(ptr noundef nonnull %1, ptr noundef nonnull %5, ptr noundef nonnull %11) #5
  %214 = icmp slt i32 %213, 0
  br i1 %214, label %215, label %223

215:                                              ; preds = %212
  %216 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.10, ptr %216, align 8, !tbaa !19
  %217 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.10, i64 21), i32 noundef 47) #6
  %.not102 = icmp eq ptr %217, null
  %218 = getelementptr inbounds i8, ptr %217, i64 1
  %219 = select i1 %.not102, ptr getelementptr inbounds (i8, ptr @.str.10, i64 21), ptr %218
  %220 = getelementptr inbounds i8, ptr %216, i64 8
  store ptr %219, ptr %220, align 8, !tbaa !21
  %221 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %221, align 4, !tbaa !22
  %222 = call i32 @s2n_calculate_stacktrace() #5
  br label %251

223:                                              ; preds = %212
  %224 = call i32 @s2n_stuffer_reread(ptr noundef nonnull %71) #5
  %225 = icmp sgt i32 %224, -1
  br i1 %225, label %226, label %251

226:                                              ; preds = %223
  %227 = call i32 @s2n_stuffer_reread(ptr noundef nonnull %24) #5
  %228 = icmp sgt i32 %227, -1
  br i1 %228, label %229, label %251

229:                                              ; preds = %226
  %230 = load i8, ptr %49, align 4, !tbaa !23
  %231 = icmp ugt i8 %230, 31
  br i1 %231, label %232, label %240

232:                                              ; preds = %229
  %233 = load ptr, ptr %16, align 8, !tbaa !11
  %234 = load ptr, ptr %233, align 8, !tbaa !13
  %235 = getelementptr inbounds i8, ptr %234, i64 9
  %236 = load i8, ptr %235, align 1, !tbaa !16
  %237 = zext i8 %236 to i32
  %238 = call i32 @s2n_stuffer_skip_read(ptr noundef nonnull %71, i32 noundef %237) #5
  %239 = icmp sgt i32 %238, -1
  br i1 %239, label %240, label %251

240:                                              ; preds = %229, %232
  %241 = getelementptr inbounds i8, ptr %1, i64 1884
  %242 = load i32, ptr %241, align 4, !tbaa !53
  %243 = getelementptr inbounds i8, ptr %1, i64 1880
  %244 = load i32, ptr %243, align 8, !tbaa !54
  %245 = add i32 %183, %244
  %246 = sub i32 %242, %245
  %247 = call i32 @s2n_stuffer_wipe_n(ptr noundef nonnull %71, i32 noundef %246) #5
  %248 = icmp sgt i32 %247, -1
  br i1 %248, label %249, label %251

249:                                              ; preds = %240
  %250 = getelementptr inbounds i8, ptr %1, i64 1936
  store i32 1, ptr %250, align 8, !tbaa !55
  br label %251

251:                                              ; preds = %240, %232, %226, %223, %206, %249, %215
  %.7 = phi i32 [ -1, %215 ], [ 0, %249 ], [ -1, %206 ], [ -1, %223 ], [ -1, %226 ], [ -1, %232 ], [ -1, %240 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %14) #5
  br label %252

252:                                              ; preds = %203, %200, %197, %191, %181, %170, %251
  %.8 = phi i32 [ %.7, %251 ], [ -1, %170 ], [ -1, %181 ], [ -1, %191 ], [ -1, %197 ], [ -1, %200 ], [ -1, %203 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #5
  br label %253

253:                                              ; preds = %153, %.critedge, %.critedge107, %85, %252, %162, %114, %102, %92
  %.9 = phi i32 [ %.8, %252 ], [ -1, %162 ], [ -1, %.critedge ], [ -1, %114 ], [ -1, %102 ], [ -1, %92 ], [ -1, %85 ], [ -1, %.critedge107 ], [ -1, %153 ]
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %12) #5
  br label %254

254:                                              ; preds = %253, %77
  %.10 = phi i32 [ %.9, %253 ], [ -1, %77 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %11) #5
  br label %255

255:                                              ; preds = %52, %254, %59, %40, %26
  %.11 = phi i32 [ %.10, %254 ], [ -1, %59 ], [ -1, %40 ], [ -1, %26 ], [ -1, %52 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %9) #5
  ret i32 %.11
}

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

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

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

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

declare i32 @s2n_calculate_stacktrace() local_unnamed_addr #2

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

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

declare ptr @s2n_ensure_memmove_trace(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #2

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

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

declare i32 @s2n_hmac_reset(ptr noundef) local_unnamed_addr #2

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

declare i32 @s2n_increment_sequence_number(ptr noundef) local_unnamed_addr #2

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

declare i32 @s2n_stuffer_reread(ptr noundef) local_unnamed_addr #2

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

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

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 willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { 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 #5 = { nounwind }
attributes #6 = { nounwind willreturn memory(read) }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"s2n_blob", !7, i64 0, !10, i64 8, !10, i64 12, !10, i64 16}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!12, !7, i64 48}
!12 = !{!"s2n_cipher_suite", !10, i64 0, !7, i64 8, !7, i64 16, !8, i64 24, !7, i64 32, !10, i64 40, !7, i64 48, !8, i64 56, !8, i64 72, !7, i64 80, !7, i64 88, !10, i64 96, !8, i64 100}
!13 = !{!14, !7, i64 0}
!14 = !{!"s2n_record_algorithm", !7, i64 0, !10, i64 8, !10, i64 12, !15, i64 16}
!15 = !{!"long", !8, i64 0}
!16 = !{!8, !8, i64 0}
!17 = !{!6, !10, i64 8}
!18 = !{!6, !10, i64 12}
!19 = !{!20, !7, i64 0}
!20 = !{!"s2n_debug_info", !7, i64 0, !7, i64 8}
!21 = !{!20, !7, i64 8}
!22 = !{!10, !10, i64 0}
!23 = !{!24, !8, i64 220}
!24 = !{!"s2n_connection", !10, i64 0, !10, i64 0, !10, i64 0, !10, i64 0, !10, i64 0, !10, i64 0, !10, i64 0, !10, i64 0, !10, i64 1, !10, i64 1, !10, i64 1, !10, i64 1, !10, i64 1, !10, i64 1, !10, i64 1, !10, i64 1, !10, i64 2, !10, i64 2, !10, i64 2, !10, i64 2, !10, i64 2, !10, i64 2, !10, 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, !10, i64 148, !10, i64 152, !25, i64 160, !15, i64 168, !15, 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, !26, i64 240, !7, i64 632, !7, i64 640, !27, i64 648, !33, i64 1144, !36, i64 1688, !7, i64 1752, !8, i64 1760, !10, i64 1764, !8, i64 1768, !39, i64 1776, !39, i64 1816, !39, i64 1856, !39, i64 1896, !10, i64 1936, !15, i64 1944, !8, i64 1952, !39, i64 1960, !8, i64 2000, !8, i64 2001, !8, i64 2002, !32, i64 2003, !40, i64 2004, !40, i64 2008, !41, i64 2016, !38, i64 2208, !10, i64 2212, !38, i64 2216, !15, i64 2224, !8, i64 2232, !15, i64 2240, !15, i64 2248, !15, i64 2256, !40, i64 2264, !40, i64 2268, !8, i64 2272, !8, i64 2528, !10, i64 2784, !6, i64 2792, !10, i64 2816, !6, i64 2824, !6, i64 2848, !6, i64 2872, !43, i64 2896, !45, i64 3704, !7, i64 3760, !7, i64 3768, !8, i64 3776, !10, i64 3780, !6, i64 3784, !10, i64 3808, !47, i64 3816, !8, i64 3848, !39, i64 3992, !6, i64 4032, !6, i64 4056, !32, i64 4080, !32, i64 4081, !32, i64 4082, !38, i64 4084, !38, i64 4086, !10, i64 4088, !10, i64 4092, !6, i64 4096, !10, i64 4120, !48, i64 4128, !40, i64 4176, !8, i64 4180, !8, i64 4181}
!25 = !{!"s2n_timer", !15, i64 0}
!26 = !{!"s2n_secrets", !8, i64 0, !10, i64 388}
!27 = !{!"s2n_kex_parameters", !28, i64 0, !29, i64 8, !8, i64 24, !29, i64 56, !30, i64 72, !30, i64 184, !8, i64 296, !31, i64 360, !6, i64 448, !6, i64 472}
!28 = !{!"s2n_dh_params", !7, i64 0}
!29 = !{!"s2n_ecc_evp_params", !7, i64 0, !7, i64 8}
!30 = !{!"s2n_kem_group_params", !7, i64 0, !31, i64 8, !29, i64 96}
!31 = !{!"s2n_kem_params", !7, i64 0, !6, i64 8, !6, i64 32, !6, i64 56, !32, i64 80}
!32 = !{!"_Bool", !8, i64 0}
!33 = !{!"s2n_handshake_parameters", !34, i64 0, !34, i64 48, !6, i64 96, !10, i64 120, !35, 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}
!34 = !{!"s2n_pkey", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40}
!35 = !{!"s2n_sig_scheme_list", !8, i64 0, !8, i64 256}
!36 = !{!"s2n_psk_parameters", !10, i64 0, !37, i64 8, !38, i64 40, !38, i64 42, !7, i64 48, !10, i64 56}
!37 = !{!"s2n_array", !6, i64 0, !10, i64 24, !10, i64 28}
!38 = !{!"short", !8, i64 0}
!39 = !{!"s2n_stuffer", !6, i64 0, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 36, !10, i64 36}
!40 = !{!"", !10, i64 0}
!41 = !{!"s2n_handshake", !39, i64 0, !7, i64 40, !8, i64 48, !8, i64 56, !8, i64 104, !8, i64 152, !10, i64 156, !10, i64 160, !10, i64 164, !10, i64 168, !42, i64 176, !10, i64 184, !10, i64 184, !10, i64 184, !10, i64 184, !10, i64 188}
!42 = !{!"s2n_offered_early_data", !7, i64 0}
!43 = !{!"s2n_client_hello", !6, i64 0, !44, i64 24, !6, i64 728, !6, i64 752, !6, i64 776, !8, i64 800, !8, i64 801, !10, i64 802, !10, i64 802, !10, i64 802, !10, i64 802, !10, i64 802, !10, i64 802, !10, i64 802}
!44 = !{!"", !8, i64 0, !6, i64 672, !38, i64 696}
!45 = !{!"s2n_x509_validator", !7, i64 0, !7, i64 8, !8, i64 16, !8, i64 17, !38, i64 18, !7, i64 24, !10, i64 32, !7, i64 40, !46, i64 48, !32, i64 52}
!46 = !{!"s2n_cert_validation_info", !10, i64 0, !10, i64 0}
!47 = !{!"s2n_ticket_fields", !6, i64 0, !10, i64 24}
!48 = !{!"s2n_post_handshake", !39, i64 0, !8, i64 40}
!49 = !{!50, !10, i64 0}
!50 = !{!"s2n_hmac_state", !10, i64 0, !38, i64 4, !10, i64 8, !38, i64 12, !8, i64 14, !51, i64 16, !51, i64 72, !51, i64 128, !51, i64 184, !8, i64 240, !8, i64 368}
!51 = !{!"s2n_hash_state", !7, i64 0, !10, i64 8, !8, i64 12, !15, i64 16, !8, i64 24}
!52 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!53 = !{!24, !10, i64 1884}
!54 = !{!24, !10, i64 1880}
!55 = !{!24, !10, i64 1936}


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