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

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.s2n_debug_info = type { ptr, ptr }
%struct.s2n_result = type { i32 }
%struct.s2n_stuffer = type { %struct.s2n_blob, i32, i32, i32, i8 }
%struct.s2n_blob = type { ptr, i32, i32, i8 }
%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 }

@_s2n_debug_info = external thread_local global %struct.s2n_debug_info, align 8
@s2n_errno = external thread_local global i32, align 4
@.str.25 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [93 x i8], align 1

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

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

declare i32 @s2n_calculate_stacktrace() #2

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @s2n_client_hello_parse_raw(ptr noundef %0, ptr noundef %1, ptr noundef %2) #4 {
  %4 = alloca %struct.s2n_result, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca %struct.s2n_stuffer, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i8, align 1
  %12 = alloca ptr, align 8
  %13 = alloca i16, align 2
  %14 = alloca ptr, align 8
  %15 = alloca i8, align 1
  %16 = alloca ptr, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  br label %17

17:                                               ; preds = %3
  %18 = load ptr, ptr %5, align 8, !tbaa !5
  %19 = icmp ne ptr %18, null
  br i1 %19, label %52, label %20

20:                                               ; preds = %17
  br label %21

21:                                               ; preds = %20
  br label %22

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

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

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

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

49:                                               ; preds = %43
  %50 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %50, align 4, !tbaa !14
  br label %439

51:                                               ; No predecessors!
  br label %52

52:                                               ; preds = %51, %17
  br label %53

53:                                               ; preds = %52
  call void @llvm.lifetime.start.p0(i64 40, ptr %8) #7
  call void @llvm.memset.p0.i64(ptr align 8 %8, i8 0, i64 40, i1 false)
  br label %54

54:                                               ; preds = %53
  %55 = load ptr, ptr %5, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.s2n_client_hello, ptr %55, i32 0, i32 0
  %57 = call i32 @s2n_stuffer_init_written(ptr noundef %8, ptr noundef %56)
  %58 = icmp sgt i32 %57, -1
  br i1 %58, label %61, label %59

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

61:                                               ; preds = %54
  br label %62

62:                                               ; preds = %61
  br label %63

63:                                               ; preds = %62
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #7
  store ptr %8, ptr %10, align 8, !tbaa !5
  br label %64

64:                                               ; preds = %63
  %65 = load ptr, ptr %10, align 8, !tbaa !5
  %66 = load ptr, ptr %6, align 8, !tbaa !5
  %67 = call i32 @s2n_stuffer_read_bytes(ptr noundef %65, ptr noundef %66, i32 noundef 2)
  %68 = icmp sgt i32 %67, -1
  br i1 %68, label %71, label %69

69:                                               ; preds = %64
  %70 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %70, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %437

71:                                               ; preds = %64
  br label %72

72:                                               ; preds = %71
  br label %73

73:                                               ; preds = %72
  %74 = load ptr, ptr %6, align 8, !tbaa !5
  %75 = getelementptr inbounds i8, ptr %74, i64 0
  %76 = load i8, ptr %75, align 1, !tbaa !16
  %77 = zext i8 %76 to i32
  %78 = mul nsw i32 %77, 10
  %79 = load ptr, ptr %6, align 8, !tbaa !5
  %80 = getelementptr inbounds i8, ptr %79, i64 1
  %81 = load i8, ptr %80, align 1, !tbaa !16
  %82 = zext i8 %81 to i32
  %83 = add nsw i32 %78, %82
  %84 = trunc i32 %83 to i8
  %85 = load ptr, ptr %5, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.s2n_client_hello, ptr %85, i32 0, i32 5
  store i8 %84, ptr %86, align 8, !tbaa !17
  br label %87

87:                                               ; preds = %73
  %88 = load ptr, ptr %10, align 8, !tbaa !5
  %89 = load ptr, ptr %7, align 8, !tbaa !5
  %90 = call i32 @s2n_stuffer_erase_and_read_bytes(ptr noundef %88, ptr noundef %89, i32 noundef 32)
  %91 = icmp sgt i32 %90, -1
  br i1 %91, label %94, label %92

92:                                               ; preds = %87
  %93 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %93, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %437

94:                                               ; preds = %87
  br label %95

95:                                               ; preds = %94
  br label %96

96:                                               ; preds = %95
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #7
  store i8 0, ptr %11, align 1, !tbaa !16
  br label %97

97:                                               ; preds = %96
  %98 = load ptr, ptr %10, align 8, !tbaa !5
  %99 = call i32 @s2n_stuffer_read_uint8(ptr noundef %98, ptr noundef %11)
  %100 = icmp sgt i32 %99, -1
  br i1 %100, label %103, label %101

101:                                              ; preds = %97
  %102 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %102, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %436

103:                                              ; preds = %97
  br label %104

104:                                              ; preds = %103
  br label %105

105:                                              ; preds = %104
  br label %106

106:                                              ; preds = %105
  %107 = load i8, ptr %11, align 1, !tbaa !16
  %108 = zext i8 %107 to i32
  %109 = icmp sle i32 %108, 32
  br i1 %109, label %144, label %110

110:                                              ; preds = %106
  br label %111

111:                                              ; preds = %110
  br label %112

112:                                              ; preds = %111
  %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
  store ptr @.str.26, ptr %114, align 8, !tbaa !9
  %115 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %116 = getelementptr inbounds %struct.s2n_debug_info, ptr %115, i32 0, i32 0
  %117 = load ptr, ptr %116, align 8, !tbaa !9
  %118 = getelementptr inbounds i8, ptr %117, i64 21
  %119 = call ptr @strrchr(ptr noundef %118, i32 noundef 47) #6
  %120 = icmp ne ptr %119, null
  br i1 %120, label %121, label %128

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

128:                                              ; preds = %112
  %129 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %130 = getelementptr inbounds %struct.s2n_debug_info, ptr %129, i32 0, i32 0
  %131 = load ptr, ptr %130, align 8, !tbaa !9
  %132 = getelementptr inbounds i8, ptr %131, i64 21
  br label %133

133:                                              ; preds = %128, %121
  %134 = phi ptr [ %127, %121 ], [ %132, %128 ]
  %135 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %136 = getelementptr inbounds %struct.s2n_debug_info, ptr %135, i32 0, i32 1
  store ptr %134, ptr %136, align 8, !tbaa !11
  %137 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %137, align 4, !tbaa !12
  %138 = call i32 @s2n_calculate_stacktrace()
  br label %139

139:                                              ; preds = %133
  br label %140

140:                                              ; preds = %139
  %141 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %141, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %436

142:                                              ; No predecessors!
  br label %143

143:                                              ; preds = %142
  br label %144

144:                                              ; preds = %143, %106
  br label %145

145:                                              ; preds = %144
  br label %146

146:                                              ; preds = %145
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  %147 = load ptr, ptr %10, align 8, !tbaa !5
  %148 = load i8, ptr %11, align 1, !tbaa !16
  %149 = zext i8 %148 to i32
  %150 = call ptr @s2n_stuffer_raw_read(ptr noundef %147, i32 noundef %149)
  store ptr %150, ptr %12, align 8, !tbaa !5
  br label %151

151:                                              ; preds = %146
  %152 = load ptr, ptr %12, align 8, !tbaa !5
  %153 = icmp ne ptr %152, null
  br i1 %153, label %188, label %154

154:                                              ; preds = %151
  br label %155

155:                                              ; preds = %154
  br label %156

156:                                              ; preds = %155
  %157 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %158 = getelementptr inbounds %struct.s2n_debug_info, ptr %157, i32 0, i32 0
  store ptr @.str.27, ptr %158, align 8, !tbaa !9
  %159 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %160 = getelementptr inbounds %struct.s2n_debug_info, ptr %159, i32 0, i32 0
  %161 = load ptr, ptr %160, align 8, !tbaa !9
  %162 = getelementptr inbounds i8, ptr %161, i64 21
  %163 = call ptr @strrchr(ptr noundef %162, i32 noundef 47) #6
  %164 = icmp ne ptr %163, null
  br i1 %164, label %165, label %172

165:                                              ; preds = %156
  %166 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %167 = getelementptr inbounds %struct.s2n_debug_info, ptr %166, i32 0, i32 0
  %168 = load ptr, ptr %167, align 8, !tbaa !9
  %169 = getelementptr inbounds i8, ptr %168, i64 21
  %170 = call ptr @strrchr(ptr noundef %169, i32 noundef 47) #6
  %171 = getelementptr inbounds i8, ptr %170, i64 1
  br label %177

172:                                              ; preds = %156
  %173 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %174 = getelementptr inbounds %struct.s2n_debug_info, ptr %173, i32 0, i32 0
  %175 = load ptr, ptr %174, align 8, !tbaa !9
  %176 = getelementptr inbounds i8, ptr %175, i64 21
  br label %177

177:                                              ; preds = %172, %165
  %178 = phi ptr [ %171, %165 ], [ %176, %172 ]
  %179 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %180 = getelementptr inbounds %struct.s2n_debug_info, ptr %179, i32 0, i32 1
  store ptr %178, ptr %180, align 8, !tbaa !11
  %181 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %181, align 4, !tbaa !12
  %182 = call i32 @s2n_calculate_stacktrace()
  br label %183

183:                                              ; preds = %177
  br label %184

184:                                              ; preds = %183
  %185 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %185, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %435

186:                                              ; No predecessors!
  br label %187

187:                                              ; preds = %186
  br label %188

188:                                              ; preds = %187, %151
  br label %189

189:                                              ; preds = %188
  br label %190

190:                                              ; preds = %189
  br label %191

191:                                              ; preds = %190
  %192 = load ptr, ptr %5, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.s2n_client_hello, ptr %192, i32 0, i32 3
  %194 = load ptr, ptr %12, align 8, !tbaa !5
  %195 = load i8, ptr %11, align 1, !tbaa !16
  %196 = zext i8 %195 to i32
  %197 = call i32 @s2n_blob_init(ptr noundef %193, ptr noundef %194, i32 noundef %196)
  %198 = icmp sgt i32 %197, -1
  br i1 %198, label %201, label %199

199:                                              ; preds = %191
  %200 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %200, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %435

201:                                              ; preds = %191
  br label %202

202:                                              ; preds = %201
  br label %203

203:                                              ; preds = %202
  call void @llvm.lifetime.start.p0(i64 2, ptr %13) #7
  store i16 0, ptr %13, align 2, !tbaa !22
  br label %204

204:                                              ; preds = %203
  %205 = load ptr, ptr %10, align 8, !tbaa !5
  %206 = call i32 @s2n_stuffer_read_uint16(ptr noundef %205, ptr noundef %13)
  %207 = icmp sgt i32 %206, -1
  br i1 %207, label %210, label %208

208:                                              ; preds = %204
  %209 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %209, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %434

210:                                              ; preds = %204
  br label %211

211:                                              ; preds = %210
  br label %212

212:                                              ; preds = %211
  br label %213

213:                                              ; preds = %212
  %214 = load i16, ptr %13, align 2, !tbaa !22
  %215 = zext i16 %214 to i32
  %216 = icmp sgt i32 %215, 0
  br i1 %216, label %251, label %217

217:                                              ; preds = %213
  br label %218

218:                                              ; preds = %217
  br label %219

219:                                              ; preds = %218
  %220 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %221 = getelementptr inbounds %struct.s2n_debug_info, ptr %220, i32 0, i32 0
  store ptr @.str.28, ptr %221, align 8, !tbaa !9
  %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
  %224 = load ptr, ptr %223, align 8, !tbaa !9
  %225 = getelementptr inbounds i8, ptr %224, i64 21
  %226 = call ptr @strrchr(ptr noundef %225, i32 noundef 47) #6
  %227 = icmp ne ptr %226, null
  br i1 %227, label %228, label %235

228:                                              ; preds = %219
  %229 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %230 = getelementptr inbounds %struct.s2n_debug_info, ptr %229, i32 0, i32 0
  %231 = load ptr, ptr %230, align 8, !tbaa !9
  %232 = getelementptr inbounds i8, ptr %231, i64 21
  %233 = call ptr @strrchr(ptr noundef %232, i32 noundef 47) #6
  %234 = getelementptr inbounds i8, ptr %233, i64 1
  br label %240

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

240:                                              ; preds = %235, %228
  %241 = phi ptr [ %234, %228 ], [ %239, %235 ]
  %242 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %243 = getelementptr inbounds %struct.s2n_debug_info, ptr %242, i32 0, i32 1
  store ptr %241, ptr %243, align 8, !tbaa !11
  %244 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %244, align 4, !tbaa !12
  %245 = call i32 @s2n_calculate_stacktrace()
  br label %246

246:                                              ; preds = %240
  br label %247

247:                                              ; preds = %246
  %248 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %248, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %434

249:                                              ; No predecessors!
  br label %250

250:                                              ; preds = %249
  br label %251

251:                                              ; preds = %250, %213
  br label %252

252:                                              ; preds = %251
  br label %253

253:                                              ; preds = %252
  br label %254

254:                                              ; preds = %253
  %255 = load i16, ptr %13, align 2, !tbaa !22
  %256 = zext i16 %255 to i32
  %257 = srem i32 %256, 2
  %258 = icmp eq i32 %257, 0
  br i1 %258, label %293, label %259

259:                                              ; preds = %254
  br label %260

260:                                              ; preds = %259
  br label %261

261:                                              ; preds = %260
  %262 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %263 = getelementptr inbounds %struct.s2n_debug_info, ptr %262, i32 0, i32 0
  store ptr @.str.29, ptr %263, align 8, !tbaa !9
  %264 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %265 = getelementptr inbounds %struct.s2n_debug_info, ptr %264, i32 0, i32 0
  %266 = load ptr, ptr %265, align 8, !tbaa !9
  %267 = getelementptr inbounds i8, ptr %266, i64 21
  %268 = call ptr @strrchr(ptr noundef %267, i32 noundef 47) #6
  %269 = icmp ne ptr %268, null
  br i1 %269, label %270, label %277

270:                                              ; preds = %261
  %271 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %272 = getelementptr inbounds %struct.s2n_debug_info, ptr %271, i32 0, i32 0
  %273 = load ptr, ptr %272, align 8, !tbaa !9
  %274 = getelementptr inbounds i8, ptr %273, i64 21
  %275 = call ptr @strrchr(ptr noundef %274, i32 noundef 47) #6
  %276 = getelementptr inbounds i8, ptr %275, i64 1
  br label %282

277:                                              ; preds = %261
  %278 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %279 = getelementptr inbounds %struct.s2n_debug_info, ptr %278, i32 0, i32 0
  %280 = load ptr, ptr %279, align 8, !tbaa !9
  %281 = getelementptr inbounds i8, ptr %280, i64 21
  br label %282

282:                                              ; preds = %277, %270
  %283 = phi ptr [ %276, %270 ], [ %281, %277 ]
  %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 1
  store ptr %283, ptr %285, align 8, !tbaa !11
  %286 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %286, align 4, !tbaa !12
  %287 = call i32 @s2n_calculate_stacktrace()
  br label %288

288:                                              ; preds = %282
  br label %289

289:                                              ; preds = %288
  %290 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %290, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %434

291:                                              ; No predecessors!
  br label %292

292:                                              ; preds = %291
  br label %293

293:                                              ; preds = %292, %254
  br label %294

294:                                              ; preds = %293
  br label %295

295:                                              ; preds = %294
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  %296 = load ptr, ptr %10, align 8, !tbaa !5
  %297 = load i16, ptr %13, align 2, !tbaa !22
  %298 = zext i16 %297 to i32
  %299 = call ptr @s2n_stuffer_raw_read(ptr noundef %296, i32 noundef %298)
  store ptr %299, ptr %14, align 8, !tbaa !5
  br label %300

300:                                              ; preds = %295
  %301 = load ptr, ptr %14, align 8, !tbaa !5
  %302 = icmp ne ptr %301, null
  br i1 %302, label %337, label %303

303:                                              ; preds = %300
  br label %304

304:                                              ; preds = %303
  br label %305

305:                                              ; preds = %304
  %306 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %307 = getelementptr inbounds %struct.s2n_debug_info, ptr %306, i32 0, i32 0
  store ptr @.str.30, ptr %307, align 8, !tbaa !9
  %308 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %309 = getelementptr inbounds %struct.s2n_debug_info, ptr %308, i32 0, i32 0
  %310 = load ptr, ptr %309, align 8, !tbaa !9
  %311 = getelementptr inbounds i8, ptr %310, i64 21
  %312 = call ptr @strrchr(ptr noundef %311, i32 noundef 47) #6
  %313 = icmp ne ptr %312, null
  br i1 %313, label %314, label %321

314:                                              ; preds = %305
  %315 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %316 = getelementptr inbounds %struct.s2n_debug_info, ptr %315, i32 0, i32 0
  %317 = load ptr, ptr %316, align 8, !tbaa !9
  %318 = getelementptr inbounds i8, ptr %317, i64 21
  %319 = call ptr @strrchr(ptr noundef %318, i32 noundef 47) #6
  %320 = getelementptr inbounds i8, ptr %319, i64 1
  br label %326

321:                                              ; preds = %305
  %322 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %323 = getelementptr inbounds %struct.s2n_debug_info, ptr %322, i32 0, i32 0
  %324 = load ptr, ptr %323, align 8, !tbaa !9
  %325 = getelementptr inbounds i8, ptr %324, i64 21
  br label %326

326:                                              ; preds = %321, %314
  %327 = phi ptr [ %320, %314 ], [ %325, %321 ]
  %328 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %329 = getelementptr inbounds %struct.s2n_debug_info, ptr %328, i32 0, i32 1
  store ptr %327, ptr %329, align 8, !tbaa !11
  %330 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %330, align 4, !tbaa !12
  %331 = call i32 @s2n_calculate_stacktrace()
  br label %332

332:                                              ; preds = %326
  br label %333

333:                                              ; preds = %332
  %334 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %334, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %433

335:                                              ; No predecessors!
  br label %336

336:                                              ; preds = %335
  br label %337

337:                                              ; preds = %336, %300
  br label %338

338:                                              ; preds = %337
  br label %339

339:                                              ; preds = %338
  br label %340

340:                                              ; preds = %339
  %341 = load ptr, ptr %5, align 8, !tbaa !5
  %342 = getelementptr inbounds %struct.s2n_client_hello, ptr %341, i32 0, i32 2
  %343 = load ptr, ptr %14, align 8, !tbaa !5
  %344 = load i16, ptr %13, align 2, !tbaa !22
  %345 = zext i16 %344 to i32
  %346 = call i32 @s2n_blob_init(ptr noundef %342, ptr noundef %343, i32 noundef %345)
  %347 = icmp sgt i32 %346, -1
  br i1 %347, label %350, label %348

348:                                              ; preds = %340
  %349 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %349, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %433

350:                                              ; preds = %340
  br label %351

351:                                              ; preds = %350
  br label %352

352:                                              ; preds = %351
  call void @llvm.lifetime.start.p0(i64 1, ptr %15) #7
  store i8 0, ptr %15, align 1, !tbaa !16
  br label %353

353:                                              ; preds = %352
  %354 = load ptr, ptr %10, align 8, !tbaa !5
  %355 = call i32 @s2n_stuffer_read_uint8(ptr noundef %354, ptr noundef %15)
  %356 = icmp sgt i32 %355, -1
  br i1 %356, label %359, label %357

357:                                              ; preds = %353
  %358 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %358, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %432

359:                                              ; preds = %353
  br label %360

360:                                              ; preds = %359
  br label %361

361:                                              ; preds = %360
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #7
  %362 = load ptr, ptr %10, align 8, !tbaa !5
  %363 = load i8, ptr %15, align 1, !tbaa !16
  %364 = zext i8 %363 to i32
  %365 = call ptr @s2n_stuffer_raw_read(ptr noundef %362, i32 noundef %364)
  store ptr %365, ptr %16, align 8, !tbaa !5
  br label %366

366:                                              ; preds = %361
  %367 = load ptr, ptr %16, align 8, !tbaa !5
  %368 = icmp ne ptr %367, null
  br i1 %368, label %403, label %369

369:                                              ; preds = %366
  br label %370

370:                                              ; preds = %369
  br label %371

371:                                              ; preds = %370
  %372 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %373 = getelementptr inbounds %struct.s2n_debug_info, ptr %372, i32 0, i32 0
  store ptr @.str.31, ptr %373, align 8, !tbaa !9
  %374 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %375 = getelementptr inbounds %struct.s2n_debug_info, ptr %374, i32 0, i32 0
  %376 = load ptr, ptr %375, align 8, !tbaa !9
  %377 = getelementptr inbounds i8, ptr %376, i64 21
  %378 = call ptr @strrchr(ptr noundef %377, i32 noundef 47) #6
  %379 = icmp ne ptr %378, null
  br i1 %379, label %380, label %387

380:                                              ; preds = %371
  %381 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %382 = getelementptr inbounds %struct.s2n_debug_info, ptr %381, i32 0, i32 0
  %383 = load ptr, ptr %382, align 8, !tbaa !9
  %384 = getelementptr inbounds i8, ptr %383, i64 21
  %385 = call ptr @strrchr(ptr noundef %384, i32 noundef 47) #6
  %386 = getelementptr inbounds i8, ptr %385, i64 1
  br label %392

387:                                              ; preds = %371
  %388 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %389 = getelementptr inbounds %struct.s2n_debug_info, ptr %388, i32 0, i32 0
  %390 = load ptr, ptr %389, align 8, !tbaa !9
  %391 = getelementptr inbounds i8, ptr %390, i64 21
  br label %392

392:                                              ; preds = %387, %380
  %393 = phi ptr [ %386, %380 ], [ %391, %387 ]
  %394 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %395 = getelementptr inbounds %struct.s2n_debug_info, ptr %394, i32 0, i32 1
  store ptr %393, ptr %395, align 8, !tbaa !11
  %396 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %396, align 4, !tbaa !12
  %397 = call i32 @s2n_calculate_stacktrace()
  br label %398

398:                                              ; preds = %392
  br label %399

399:                                              ; preds = %398
  %400 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %400, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %431

401:                                              ; No predecessors!
  br label %402

402:                                              ; preds = %401
  br label %403

403:                                              ; preds = %402, %366
  br label %404

404:                                              ; preds = %403
  br label %405

405:                                              ; preds = %404
  br label %406

406:                                              ; preds = %405
  %407 = load ptr, ptr %5, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.s2n_client_hello, ptr %407, i32 0, i32 4
  %409 = load ptr, ptr %16, align 8, !tbaa !5
  %410 = load i8, ptr %15, align 1, !tbaa !16
  %411 = zext i8 %410 to i32
  %412 = call i32 @s2n_blob_init(ptr noundef %408, ptr noundef %409, i32 noundef %411)
  %413 = icmp sgt i32 %412, -1
  br i1 %413, label %416, label %414

414:                                              ; preds = %406
  %415 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %415, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %431

416:                                              ; preds = %406
  br label %417

417:                                              ; preds = %416
  br label %418

418:                                              ; preds = %417
  br label %419

419:                                              ; preds = %418
  %420 = load ptr, ptr %10, align 8, !tbaa !5
  %421 = load ptr, ptr %5, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.s2n_client_hello, ptr %421, i32 0, i32 1
  %423 = call i32 @s2n_extension_list_parse(ptr noundef %420, ptr noundef %422)
  %424 = icmp sgt i32 %423, -1
  br i1 %424, label %427, label %425

425:                                              ; preds = %419
  %426 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %426, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %431

427:                                              ; preds = %419
  br label %428

428:                                              ; preds = %427
  br label %429

429:                                              ; preds = %428
  %430 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 0, ptr %430, align 4, !tbaa !14
  store i32 1, ptr %9, align 4
  br label %431

431:                                              ; preds = %429, %425, %414, %399
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #7
  br label %432

432:                                              ; preds = %431, %357
  call void @llvm.lifetime.end.p0(i64 1, ptr %15) #7
  br label %433

433:                                              ; preds = %432, %348, %333
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  br label %434

434:                                              ; preds = %433, %289, %247, %208
  call void @llvm.lifetime.end.p0(i64 2, ptr %13) #7
  br label %435

435:                                              ; preds = %434, %199, %184
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  br label %436

436:                                              ; preds = %435, %140, %101
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #7
  br label %437

437:                                              ; preds = %436, %92, %69
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #7
  br label %438

438:                                              ; preds = %437, %59
  call void @llvm.lifetime.end.p0(i64 40, ptr %8) #7
  br label %439

439:                                              ; preds = %438, %49
  %440 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  %441 = load i32, ptr %440, align 4
  ret i32 %441
}

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

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

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

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

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

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

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 0}
!10 = !{!"s2n_debug_info", !6, i64 0, !6, i64 8}
!11 = !{!10, !6, i64 8}
!12 = !{!13, !13, i64 0}
!13 = !{!"int", !7, i64 0}
!14 = !{!15, !13, i64 0}
!15 = !{!"", !13, i64 0}
!16 = !{!7, !7, i64 0}
!17 = !{!18, !7, i64 800}
!18 = !{!"s2n_client_hello", !19, i64 0, !20, i64 24, !19, i64 728, !19, i64 752, !19, i64 776, !7, i64 800, !7, i64 801, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802, !13, i64 802}
!19 = !{!"s2n_blob", !6, i64 0, !13, i64 8, !13, i64 12, !13, i64 16}
!20 = !{!"", !7, i64 0, !19, i64 672, !21, i64 696}
!21 = !{!"short", !7, i64 0}
!22 = !{!21, !21, i64 0}


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

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

@_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.25 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [93 x i8], align 1

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

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

declare i32 @s2n_calculate_stacktrace() local_unnamed_addr #2

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

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1, 1) i32 @s2n_client_hello_parse_raw(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #4 {
  %4 = alloca %struct.s2n_stuffer, align 8
  %5 = alloca i8, align 1
  %6 = alloca i16, align 2
  %7 = alloca i8, align 1
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %8, label %16

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

16:                                               ; preds = %3
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %4) #7
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(40) %4, i8 0, i64 40, i1 false)
  %17 = call i32 @s2n_stuffer_init_written(ptr noundef nonnull %4, ptr noundef nonnull %0) #7
  %18 = icmp sgt i32 %17, -1
  br i1 %18, label %19, label %130

19:                                               ; preds = %16
  %20 = call i32 @s2n_stuffer_read_bytes(ptr noundef nonnull %4, ptr noundef %1, i32 noundef 2) #7
  %21 = icmp sgt i32 %20, -1
  br i1 %21, label %22, label %130

22:                                               ; preds = %19
  %23 = load i8, ptr %1, align 1, !tbaa !13
  %24 = mul i8 %23, 10
  %25 = getelementptr inbounds i8, ptr %1, i64 1
  %26 = load i8, ptr %25, align 1, !tbaa !13
  %27 = add i8 %24, %26
  %28 = getelementptr inbounds i8, ptr %0, i64 800
  store i8 %27, ptr %28, align 8, !tbaa !14
  %29 = call i32 @s2n_stuffer_erase_and_read_bytes(ptr noundef nonnull %4, ptr noundef %2, i32 noundef 32) #7
  %30 = icmp sgt i32 %29, -1
  br i1 %30, label %31, label %130

31:                                               ; preds = %22
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %5) #7
  store i8 0, ptr %5, align 1, !tbaa !13
  %32 = call i32 @s2n_stuffer_read_uint8(ptr noundef nonnull %4, ptr noundef nonnull %5) #7
  %33 = icmp sgt i32 %32, -1
  br i1 %33, label %34, label %129

34:                                               ; preds = %31
  %35 = load i8, ptr %5, align 1, !tbaa !13
  %36 = icmp ult i8 %35, 33
  br i1 %36, label %45, label %37

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

45:                                               ; preds = %34
  %46 = zext nneg i8 %35 to i32
  %47 = call ptr @s2n_stuffer_raw_read(ptr noundef nonnull %4, i32 noundef %46) #7
  %.not40 = icmp eq ptr %47, null
  br i1 %.not40, label %48, label %56

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

56:                                               ; preds = %45
  %57 = getelementptr inbounds i8, ptr %0, i64 752
  %58 = load i8, ptr %5, align 1, !tbaa !13
  %59 = zext i8 %58 to i32
  %60 = call i32 @s2n_blob_init(ptr noundef nonnull %57, ptr noundef nonnull %47, i32 noundef %59) #7
  %61 = icmp sgt i32 %60, -1
  br i1 %61, label %62, label %129

62:                                               ; preds = %56
  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %6) #7
  store i16 0, ptr %6, align 2, !tbaa !19
  %63 = call i32 @s2n_stuffer_read_uint16(ptr noundef nonnull %4, ptr noundef nonnull %6) #7
  %64 = icmp sgt i32 %63, -1
  br i1 %64, label %65, label %128

65:                                               ; preds = %62
  %66 = load i16, ptr %6, align 2, !tbaa !19
  %67 = zext i16 %66 to i32
  %.not42 = icmp eq i16 %66, 0
  br i1 %.not42, label %68, label %76

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

76:                                               ; preds = %65
  %77 = and i32 %67, 1
  %78 = icmp eq i32 %77, 0
  br i1 %78, label %87, label %79

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

87:                                               ; preds = %76
  %88 = call ptr @s2n_stuffer_raw_read(ptr noundef nonnull %4, i32 noundef %67) #7
  %.not45 = icmp eq ptr %88, null
  br i1 %.not45, label %89, label %97

89:                                               ; preds = %87
  %90 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.30, ptr %90, align 8, !tbaa !5
  %91 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.30, i64 21), i32 noundef 47) #6
  %.not46 = icmp eq ptr %91, null
  %92 = getelementptr inbounds i8, ptr %91, i64 1
  %93 = select i1 %.not46, ptr getelementptr inbounds (i8, ptr @.str.30, i64 21), ptr %92
  %94 = getelementptr inbounds i8, ptr %90, i64 8
  store ptr %93, ptr %94, align 8, !tbaa !10
  %95 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %95, align 4, !tbaa !11
  %96 = call i32 @s2n_calculate_stacktrace() #7
  br label %128

97:                                               ; preds = %87
  %98 = getelementptr inbounds i8, ptr %0, i64 728
  %99 = load i16, ptr %6, align 2, !tbaa !19
  %100 = zext i16 %99 to i32
  %101 = call i32 @s2n_blob_init(ptr noundef nonnull %98, ptr noundef nonnull %88, i32 noundef %100) #7
  %102 = icmp sgt i32 %101, -1
  br i1 %102, label %103, label %128

103:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %7) #7
  store i8 0, ptr %7, align 1, !tbaa !13
  %104 = call i32 @s2n_stuffer_read_uint8(ptr noundef nonnull %4, ptr noundef nonnull %7) #7
  %105 = icmp sgt i32 %104, -1
  br i1 %105, label %106, label %127

106:                                              ; preds = %103
  %107 = load i8, ptr %7, align 1, !tbaa !13
  %108 = zext i8 %107 to i32
  %109 = call ptr @s2n_stuffer_raw_read(ptr noundef nonnull %4, i32 noundef %108) #7
  %.not47 = icmp eq ptr %109, null
  br i1 %.not47, label %110, label %118

110:                                              ; preds = %106
  %111 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.31, ptr %111, align 8, !tbaa !5
  %112 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.31, i64 21), i32 noundef 47) #6
  %.not48 = icmp eq ptr %112, null
  %113 = getelementptr inbounds i8, ptr %112, i64 1
  %114 = select i1 %.not48, ptr getelementptr inbounds (i8, ptr @.str.31, i64 21), ptr %113
  %115 = getelementptr inbounds i8, ptr %111, i64 8
  store ptr %114, ptr %115, align 8, !tbaa !10
  %116 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 335544322, ptr %116, align 4, !tbaa !11
  %117 = call i32 @s2n_calculate_stacktrace() #7
  br label %127

118:                                              ; preds = %106
  %119 = getelementptr inbounds i8, ptr %0, i64 776
  %120 = load i8, ptr %7, align 1, !tbaa !13
  %121 = zext i8 %120 to i32
  %122 = call i32 @s2n_blob_init(ptr noundef nonnull %119, ptr noundef nonnull %109, i32 noundef %121) #7
  %123 = icmp sgt i32 %122, -1
  br i1 %123, label %124, label %127

124:                                              ; preds = %118
  %125 = getelementptr inbounds i8, ptr %0, i64 24
  %126 = call i32 @s2n_extension_list_parse(ptr noundef nonnull %4, ptr noundef nonnull %125) #7
  %.lobit = ashr i32 %126, 31
  br label %127

127:                                              ; preds = %110, %118, %124, %103
  %.sroa.0.1 = phi i32 [ -1, %103 ], [ -1, %110 ], [ -1, %118 ], [ %.lobit, %124 ]
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %7) #7
  br label %128

128:                                              ; preds = %89, %127, %97, %62, %79, %68
  %.sroa.0.3 = phi i32 [ -1, %79 ], [ -1, %68 ], [ -1, %62 ], [ %.sroa.0.1, %127 ], [ -1, %89 ], [ -1, %97 ]
  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %6) #7
  br label %129

129:                                              ; preds = %48, %128, %56, %31, %37
  %.sroa.0.5 = phi i32 [ -1, %37 ], [ -1, %31 ], [ %.sroa.0.3, %128 ], [ -1, %48 ], [ -1, %56 ]
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %5) #7
  br label %130

130:                                              ; preds = %129, %19, %22, %16
  %.sroa.0.7 = phi i32 [ -1, %16 ], [ %.sroa.0.5, %129 ], [ -1, %19 ], [ -1, %22 ]
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %4) #7
  br label %131

131:                                              ; preds = %130, %8
  %.sroa.0.8 = phi i32 [ %.sroa.0.7, %130 ], [ -1, %8 ]
  ret i32 %.sroa.0.8
}

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

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

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

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

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

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

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"s2n_debug_info", !7, i64 0, !7, i64 8}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!6, !7, i64 8}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !8, i64 0}
!13 = !{!8, !8, i64 0}
!14 = !{!15, !8, i64 800}
!15 = !{!"s2n_client_hello", !16, i64 0, !17, i64 24, !16, i64 728, !16, i64 752, !16, i64 776, !8, i64 800, !8, i64 801, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802, !12, i64 802}
!16 = !{!"s2n_blob", !7, i64 0, !12, i64 8, !12, i64 12, !12, i64 16}
!17 = !{!"", !8, i64 0, !16, i64 672, !18, i64 696}
!18 = !{!"short", !8, i64 0}
!19 = !{!18, !18, i64 0}


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