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

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

%struct.s2n_debug_info = type { ptr, ptr }
%struct.s2n_result = type { i32 }
%struct.s2n_blob = type { ptr, i32, i32, i8 }
%struct.s2n_drbg = type { i64, ptr, [16 x i8], i64 }

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

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

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

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

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

18:                                               ; preds = %15
  br label %19

19:                                               ; preds = %18
  br label %20

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

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

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

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

47:                                               ; preds = %41
  %48 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %48, align 4, !tbaa !14
  br label %545

49:                                               ; No predecessors!
  br label %50

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

51:                                               ; preds = %50
  br label %52

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

55:                                               ; preds = %52
  br label %56

56:                                               ; preds = %55
  br label %57

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

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

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

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

84:                                               ; preds = %78
  %85 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %85, align 4, !tbaa !14
  br label %545

86:                                               ; No predecessors!
  br label %87

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

88:                                               ; preds = %87
  %89 = call ptr @EVP_CIPHER_CTX_new()
  %90 = load ptr, ptr %5, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.s2n_drbg, ptr %90, i32 0, i32 1
  store ptr %89, ptr %91, align 8, !tbaa !16
  br label %92

92:                                               ; preds = %88
  %93 = load ptr, ptr %5, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.s2n_drbg, ptr %93, i32 0, i32 1
  %95 = load ptr, ptr %94, align 8, !tbaa !16
  %96 = icmp ne ptr %95, null
  br i1 %96, label %99, label %97

97:                                               ; preds = %92
  %98 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %98, align 4, !tbaa !14
  br label %545

99:                                               ; preds = %92
  br label %100

100:                                              ; preds = %99
  br label %101

101:                                              ; preds = %100
  %102 = load ptr, ptr %5, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.s2n_drbg, ptr %102, i32 0, i32 1
  %104 = load ptr, ptr %103, align 8, !tbaa !16
  %105 = call i32 @EVP_CIPHER_CTX_reset(ptr noundef %104)
  %106 = icmp eq i32 %105, 1
  br i1 %106, label %139, label %107

107:                                              ; preds = %101
  br label %108

108:                                              ; preds = %107
  br label %109

109:                                              ; preds = %108
  %110 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %111 = getelementptr inbounds %struct.s2n_debug_info, ptr %110, i32 0, i32 0
  store ptr @.str.2, ptr %111, align 8, !tbaa !11
  %112 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %113 = getelementptr inbounds %struct.s2n_debug_info, ptr %112, i32 0, i32 0
  %114 = load ptr, ptr %113, align 8, !tbaa !11
  %115 = getelementptr inbounds i8, ptr %114, i64 21
  %116 = call ptr @strrchr(ptr noundef %115, i32 noundef 47) #8
  %117 = icmp ne ptr %116, null
  br i1 %117, label %118, label %125

118:                                              ; preds = %109
  %119 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %120 = getelementptr inbounds %struct.s2n_debug_info, ptr %119, i32 0, i32 0
  %121 = load ptr, ptr %120, align 8, !tbaa !11
  %122 = getelementptr inbounds i8, ptr %121, i64 21
  %123 = call ptr @strrchr(ptr noundef %122, i32 noundef 47) #8
  %124 = getelementptr inbounds i8, ptr %123, i64 1
  br label %130

125:                                              ; preds = %109
  %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 0
  %128 = load ptr, ptr %127, align 8, !tbaa !11
  %129 = getelementptr inbounds i8, ptr %128, i64 21
  br label %130

130:                                              ; preds = %125, %118
  %131 = phi ptr [ %124, %118 ], [ %129, %125 ]
  %132 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %133 = getelementptr inbounds %struct.s2n_debug_info, ptr %132, i32 0, i32 1
  store ptr %131, ptr %133, align 8, !tbaa !13
  %134 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %134, align 4, !tbaa !9
  %135 = call i32 @s2n_calculate_stacktrace()
  br label %136

136:                                              ; preds = %130
  %137 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %137, align 4, !tbaa !14
  br label %545

138:                                              ; No predecessors!
  br label %139

139:                                              ; preds = %138, %101
  br label %140

140:                                              ; preds = %139
  %141 = load i32, ptr %7, align 4, !tbaa !9
  switch i32 %141, label %226 [
    i32 0, label %142
    i32 1, label %184
  ]

142:                                              ; preds = %140
  br label %143

143:                                              ; preds = %142
  %144 = load ptr, ptr %5, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.s2n_drbg, ptr %144, i32 0, i32 1
  %146 = load ptr, ptr %145, align 8, !tbaa !16
  %147 = call ptr @EVP_aes_128_ecb()
  %148 = call i32 @EVP_EncryptInit_ex(ptr noundef %146, ptr noundef %147, ptr noundef null, ptr noundef null, ptr noundef null)
  %149 = icmp eq i32 %148, 1
  br i1 %149, label %182, label %150

150:                                              ; preds = %143
  br label %151

151:                                              ; preds = %150
  br label %152

152:                                              ; preds = %151
  %153 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %154 = getelementptr inbounds %struct.s2n_debug_info, ptr %153, i32 0, i32 0
  store ptr @.str.3, ptr %154, align 8, !tbaa !11
  %155 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %156 = getelementptr inbounds %struct.s2n_debug_info, ptr %155, i32 0, i32 0
  %157 = load ptr, ptr %156, align 8, !tbaa !11
  %158 = getelementptr inbounds i8, ptr %157, i64 21
  %159 = call ptr @strrchr(ptr noundef %158, i32 noundef 47) #8
  %160 = icmp ne ptr %159, null
  br i1 %160, label %161, label %168

161:                                              ; preds = %152
  %162 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %163 = getelementptr inbounds %struct.s2n_debug_info, ptr %162, i32 0, i32 0
  %164 = load ptr, ptr %163, align 8, !tbaa !11
  %165 = getelementptr inbounds i8, ptr %164, i64 21
  %166 = call ptr @strrchr(ptr noundef %165, i32 noundef 47) #8
  %167 = getelementptr inbounds i8, ptr %166, i64 1
  br label %173

168:                                              ; preds = %152
  %169 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %170 = getelementptr inbounds %struct.s2n_debug_info, ptr %169, i32 0, i32 0
  %171 = load ptr, ptr %170, align 8, !tbaa !11
  %172 = getelementptr inbounds i8, ptr %171, i64 21
  br label %173

173:                                              ; preds = %168, %161
  %174 = phi ptr [ %167, %161 ], [ %172, %168 ]
  %175 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %176 = getelementptr inbounds %struct.s2n_debug_info, ptr %175, i32 0, i32 1
  store ptr %174, ptr %176, align 8, !tbaa !13
  %177 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %177, align 4, !tbaa !9
  %178 = call i32 @s2n_calculate_stacktrace()
  br label %179

179:                                              ; preds = %173
  %180 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %180, align 4, !tbaa !14
  br label %545

181:                                              ; No predecessors!
  br label %182

182:                                              ; preds = %181, %143
  br label %183

183:                                              ; preds = %182
  br label %258

184:                                              ; preds = %140
  br label %185

185:                                              ; preds = %184
  %186 = load ptr, ptr %5, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.s2n_drbg, ptr %186, i32 0, i32 1
  %188 = load ptr, ptr %187, align 8, !tbaa !16
  %189 = call ptr @EVP_aes_256_ecb()
  %190 = call i32 @EVP_EncryptInit_ex(ptr noundef %188, ptr noundef %189, ptr noundef null, ptr noundef null, ptr noundef null)
  %191 = icmp eq i32 %190, 1
  br i1 %191, label %224, label %192

192:                                              ; preds = %185
  br label %193

193:                                              ; preds = %192
  br label %194

194:                                              ; preds = %193
  %195 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %196 = getelementptr inbounds %struct.s2n_debug_info, ptr %195, i32 0, i32 0
  store ptr @.str.4, ptr %196, align 8, !tbaa !11
  %197 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %198 = getelementptr inbounds %struct.s2n_debug_info, ptr %197, i32 0, i32 0
  %199 = load ptr, ptr %198, align 8, !tbaa !11
  %200 = getelementptr inbounds i8, ptr %199, i64 21
  %201 = call ptr @strrchr(ptr noundef %200, i32 noundef 47) #8
  %202 = icmp ne ptr %201, null
  br i1 %202, label %203, label %210

203:                                              ; preds = %194
  %204 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %205 = getelementptr inbounds %struct.s2n_debug_info, ptr %204, i32 0, i32 0
  %206 = load ptr, ptr %205, align 8, !tbaa !11
  %207 = getelementptr inbounds i8, ptr %206, i64 21
  %208 = call ptr @strrchr(ptr noundef %207, i32 noundef 47) #8
  %209 = getelementptr inbounds i8, ptr %208, i64 1
  br label %215

210:                                              ; preds = %194
  %211 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %212 = getelementptr inbounds %struct.s2n_debug_info, ptr %211, i32 0, i32 0
  %213 = load ptr, ptr %212, align 8, !tbaa !11
  %214 = getelementptr inbounds i8, ptr %213, i64 21
  br label %215

215:                                              ; preds = %210, %203
  %216 = phi ptr [ %209, %203 ], [ %214, %210 ]
  %217 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %218 = getelementptr inbounds %struct.s2n_debug_info, ptr %217, i32 0, i32 1
  store ptr %216, ptr %218, align 8, !tbaa !13
  %219 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %219, align 4, !tbaa !9
  %220 = call i32 @s2n_calculate_stacktrace()
  br label %221

221:                                              ; preds = %215
  %222 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %222, align 4, !tbaa !14
  br label %545

223:                                              ; No predecessors!
  br label %224

224:                                              ; preds = %223, %185
  br label %225

225:                                              ; preds = %224
  br label %258

226:                                              ; preds = %140
  br label %227

227:                                              ; preds = %226
  br label %228

228:                                              ; preds = %227
  %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
  store ptr @.str.5, ptr %230, align 8, !tbaa !11
  %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 !11
  %234 = getelementptr inbounds i8, ptr %233, i64 21
  %235 = call ptr @strrchr(ptr noundef %234, i32 noundef 47) #8
  %236 = icmp ne ptr %235, null
  br i1 %236, label %237, label %244

237:                                              ; preds = %228
  %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 !11
  %241 = getelementptr inbounds i8, ptr %240, i64 21
  %242 = call ptr @strrchr(ptr noundef %241, i32 noundef 47) #8
  %243 = getelementptr inbounds i8, ptr %242, i64 1
  br label %249

244:                                              ; preds = %228
  %245 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %246 = getelementptr inbounds %struct.s2n_debug_info, ptr %245, i32 0, i32 0
  %247 = load ptr, ptr %246, align 8, !tbaa !11
  %248 = getelementptr inbounds i8, ptr %247, i64 21
  br label %249

249:                                              ; preds = %244, %237
  %250 = phi ptr [ %243, %237 ], [ %248, %244 ]
  %251 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %252 = getelementptr inbounds %struct.s2n_debug_info, ptr %251, i32 0, i32 1
  store ptr %250, ptr %252, align 8, !tbaa !13
  %253 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %253, align 4, !tbaa !9
  %254 = call i32 @s2n_calculate_stacktrace()
  br label %255

255:                                              ; preds = %249
  %256 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %256, align 4, !tbaa !14
  br label %545

257:                                              ; No predecessors!
  br label %258

258:                                              ; preds = %257, %225, %183
  br label %259

259:                                              ; preds = %258
  %260 = load ptr, ptr %5, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.s2n_drbg, ptr %260, i32 0, i32 1
  %262 = load ptr, ptr %261, align 8, !tbaa !16
  %263 = call i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef %262)
  %264 = icmp sle i32 %263, 32
  br i1 %264, label %297, label %265

265:                                              ; preds = %259
  br label %266

266:                                              ; preds = %265
  br label %267

267:                                              ; preds = %266
  %268 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %269 = getelementptr inbounds %struct.s2n_debug_info, ptr %268, i32 0, i32 0
  store ptr @.str.6, ptr %269, align 8, !tbaa !11
  %270 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %271 = getelementptr inbounds %struct.s2n_debug_info, ptr %270, i32 0, i32 0
  %272 = load ptr, ptr %271, align 8, !tbaa !11
  %273 = getelementptr inbounds i8, ptr %272, i64 21
  %274 = call ptr @strrchr(ptr noundef %273, i32 noundef 47) #8
  %275 = icmp ne ptr %274, null
  br i1 %275, label %276, label %283

276:                                              ; preds = %267
  %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 !11
  %280 = getelementptr inbounds i8, ptr %279, i64 21
  %281 = call ptr @strrchr(ptr noundef %280, i32 noundef 47) #8
  %282 = getelementptr inbounds i8, ptr %281, i64 1
  br label %288

283:                                              ; preds = %267
  %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 !11
  %287 = getelementptr inbounds i8, ptr %286, i64 21
  br label %288

288:                                              ; preds = %283, %276
  %289 = phi ptr [ %282, %276 ], [ %287, %283 ]
  %290 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %291 = getelementptr inbounds %struct.s2n_debug_info, ptr %290, i32 0, i32 1
  store ptr %289, ptr %291, align 8, !tbaa !13
  %292 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %292, align 4, !tbaa !9
  %293 = call i32 @s2n_calculate_stacktrace()
  br label %294

294:                                              ; preds = %288
  %295 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %295, align 4, !tbaa !14
  br label %545

296:                                              ; No predecessors!
  br label %297

297:                                              ; preds = %296, %259
  br label %298

298:                                              ; preds = %297
  br label %299

299:                                              ; preds = %298
  %300 = load ptr, ptr %5, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.s2n_drbg, ptr %300, i32 0, i32 1
  %302 = load ptr, ptr %301, align 8, !tbaa !16
  %303 = call i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef %302)
  %304 = add nsw i32 16, %303
  %305 = icmp sle i32 %304, 48
  br i1 %305, label %338, label %306

306:                                              ; preds = %299
  br label %307

307:                                              ; preds = %306
  br label %308

308:                                              ; preds = %307
  %309 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %310 = getelementptr inbounds %struct.s2n_debug_info, ptr %309, i32 0, i32 0
  store ptr @.str.7, ptr %310, align 8, !tbaa !11
  %311 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %312 = getelementptr inbounds %struct.s2n_debug_info, ptr %311, i32 0, i32 0
  %313 = load ptr, ptr %312, align 8, !tbaa !11
  %314 = getelementptr inbounds i8, ptr %313, i64 21
  %315 = call ptr @strrchr(ptr noundef %314, i32 noundef 47) #8
  %316 = icmp ne ptr %315, null
  br i1 %316, label %317, label %324

317:                                              ; preds = %308
  %318 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %319 = getelementptr inbounds %struct.s2n_debug_info, ptr %318, i32 0, i32 0
  %320 = load ptr, ptr %319, align 8, !tbaa !11
  %321 = getelementptr inbounds i8, ptr %320, i64 21
  %322 = call ptr @strrchr(ptr noundef %321, i32 noundef 47) #8
  %323 = getelementptr inbounds i8, ptr %322, i64 1
  br label %329

324:                                              ; preds = %308
  %325 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %326 = getelementptr inbounds %struct.s2n_debug_info, ptr %325, i32 0, i32 0
  %327 = load ptr, ptr %326, align 8, !tbaa !11
  %328 = getelementptr inbounds i8, ptr %327, i64 21
  br label %329

329:                                              ; preds = %324, %317
  %330 = phi ptr [ %323, %317 ], [ %328, %324 ]
  %331 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %332 = getelementptr inbounds %struct.s2n_debug_info, ptr %331, i32 0, i32 1
  store ptr %330, ptr %332, align 8, !tbaa !13
  %333 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %333, align 4, !tbaa !9
  %334 = call i32 @s2n_calculate_stacktrace()
  br label %335

335:                                              ; preds = %329
  %336 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %336, align 4, !tbaa !14
  br label %545

337:                                              ; No predecessors!
  br label %338

338:                                              ; preds = %337, %299
  br label %339

339:                                              ; preds = %338
  %340 = load ptr, ptr %5, align 8, !tbaa !5
  %341 = getelementptr inbounds %struct.s2n_drbg, ptr %340, i32 0, i32 2
  %342 = getelementptr inbounds [16 x i8], ptr %341, i64 0, i64 0
  call void @llvm.memset.p0.i64(ptr align 8 %342, i8 0, i64 16, i1 false)
  br label %343

343:                                              ; preds = %339
  %344 = load ptr, ptr %5, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.s2n_drbg, ptr %344, i32 0, i32 1
  %346 = load ptr, ptr %345, align 8, !tbaa !16
  %347 = call i32 @EVP_EncryptInit_ex(ptr noundef %346, ptr noundef null, ptr noundef null, ptr noundef @s2n_drbg_instantiate.zero_key, ptr noundef null)
  %348 = icmp eq i32 %347, 1
  br i1 %348, label %381, label %349

349:                                              ; preds = %343
  br label %350

350:                                              ; preds = %349
  br label %351

351:                                              ; preds = %350
  %352 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %353 = getelementptr inbounds %struct.s2n_debug_info, ptr %352, i32 0, i32 0
  store ptr @.str.8, ptr %353, align 8, !tbaa !11
  %354 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %355 = getelementptr inbounds %struct.s2n_debug_info, ptr %354, i32 0, i32 0
  %356 = load ptr, ptr %355, align 8, !tbaa !11
  %357 = getelementptr inbounds i8, ptr %356, i64 21
  %358 = call ptr @strrchr(ptr noundef %357, i32 noundef 47) #8
  %359 = icmp ne ptr %358, null
  br i1 %359, label %360, label %367

360:                                              ; preds = %351
  %361 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %362 = getelementptr inbounds %struct.s2n_debug_info, ptr %361, i32 0, i32 0
  %363 = load ptr, ptr %362, align 8, !tbaa !11
  %364 = getelementptr inbounds i8, ptr %363, i64 21
  %365 = call ptr @strrchr(ptr noundef %364, i32 noundef 47) #8
  %366 = getelementptr inbounds i8, ptr %365, i64 1
  br label %372

367:                                              ; preds = %351
  %368 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %369 = getelementptr inbounds %struct.s2n_debug_info, ptr %368, i32 0, i32 0
  %370 = load ptr, ptr %369, align 8, !tbaa !11
  %371 = getelementptr inbounds i8, ptr %370, i64 21
  br label %372

372:                                              ; preds = %367, %360
  %373 = phi ptr [ %366, %360 ], [ %371, %367 ]
  %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 1
  store ptr %373, ptr %375, align 8, !tbaa !13
  %376 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %376, align 4, !tbaa !9
  %377 = call i32 @s2n_calculate_stacktrace()
  br label %378

378:                                              ; preds = %372
  %379 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %379, align 4, !tbaa !14
  br label %545

380:                                              ; No predecessors!
  br label %381

381:                                              ; preds = %380, %343
  br label %382

382:                                              ; preds = %381
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #9
  %383 = load ptr, ptr %5, align 8, !tbaa !5
  %384 = getelementptr inbounds %struct.s2n_drbg, ptr %383, i32 0, i32 1
  %385 = load ptr, ptr %384, align 8, !tbaa !16
  %386 = call i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef %385)
  %387 = add nsw i32 16, %386
  %388 = sext i32 %387 to i64
  store i64 %388, ptr %8, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 48, ptr %9) #9
  call void @llvm.memset.p0.i64(ptr align 16 %9, i8 0, i64 48, i1 false)
  br label %389

389:                                              ; preds = %382
  %390 = load i64, ptr %8, align 8, !tbaa !19
  %391 = icmp ule i64 %390, 48
  br i1 %391, label %426, label %392

392:                                              ; preds = %389
  br label %393

393:                                              ; preds = %392
  br label %394

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

403:                                              ; preds = %394
  %404 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %405 = getelementptr inbounds %struct.s2n_debug_info, ptr %404, i32 0, i32 0
  %406 = load ptr, ptr %405, align 8, !tbaa !11
  %407 = getelementptr inbounds i8, ptr %406, i64 21
  %408 = call ptr @strrchr(ptr noundef %407, i32 noundef 47) #8
  %409 = getelementptr inbounds i8, ptr %408, i64 1
  br label %415

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

415:                                              ; preds = %410, %403
  %416 = phi ptr [ %409, %403 ], [ %414, %410 ]
  %417 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %418 = getelementptr inbounds %struct.s2n_debug_info, ptr %417, i32 0, i32 1
  store ptr %416, ptr %418, align 8, !tbaa !13
  %419 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %419, align 4, !tbaa !9
  %420 = call i32 @s2n_calculate_stacktrace()
  br label %421

421:                                              ; preds = %415
  br label %422

422:                                              ; preds = %421
  %423 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %423, align 4, !tbaa !14
  store i32 1, ptr %10, align 4
  br label %544

424:                                              ; No predecessors!
  br label %425

425:                                              ; preds = %424
  br label %426

426:                                              ; preds = %425, %389
  br label %427

427:                                              ; preds = %426
  br label %428

428:                                              ; preds = %427
  call void @llvm.lifetime.start.p0(i64 24, ptr %11) #9
  call void @llvm.memset.p0.i64(ptr align 8 %11, i8 0, i64 24, i1 false)
  br label %429

429:                                              ; preds = %428
  %430 = getelementptr inbounds [48 x i8], ptr %9, i64 0, i64 0
  %431 = load i64, ptr %8, align 8, !tbaa !19
  %432 = trunc i64 %431 to i32
  %433 = call i32 @s2n_blob_init(ptr noundef %11, ptr noundef %430, i32 noundef %432)
  %434 = icmp sgt i32 %433, -1
  br i1 %434, label %437, label %435

435:                                              ; preds = %429
  %436 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %436, align 4, !tbaa !14
  store i32 1, ptr %10, align 4
  br label %543

437:                                              ; preds = %429
  br label %438

438:                                              ; preds = %437
  br label %439

439:                                              ; preds = %438
  br label %440

440:                                              ; preds = %439
  %441 = call i32 @s2n_blob_zero(ptr noundef %11)
  %442 = icmp sgt i32 %441, -1
  br i1 %442, label %445, label %443

443:                                              ; preds = %440
  %444 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %444, align 4, !tbaa !14
  store i32 1, ptr %10, align 4
  br label %543

445:                                              ; preds = %440
  br label %446

446:                                              ; preds = %445
  br label %447

447:                                              ; preds = %446
  br label %448

448:                                              ; preds = %447
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #9
  %449 = getelementptr inbounds %struct.s2n_blob, ptr %11, i32 0, i32 1
  %450 = load i32, ptr %449, align 8, !tbaa !20
  %451 = load ptr, ptr %6, align 8, !tbaa !5
  %452 = getelementptr inbounds %struct.s2n_blob, ptr %451, i32 0, i32 1
  %453 = load i32, ptr %452, align 8, !tbaa !20
  %454 = icmp ult i32 %450, %453
  br i1 %454, label %455, label %458

455:                                              ; preds = %448
  %456 = getelementptr inbounds %struct.s2n_blob, ptr %11, i32 0, i32 1
  %457 = load i32, ptr %456, align 8, !tbaa !20
  br label %462

458:                                              ; preds = %448
  %459 = load ptr, ptr %6, align 8, !tbaa !5
  %460 = getelementptr inbounds %struct.s2n_blob, ptr %459, i32 0, i32 1
  %461 = load i32, ptr %460, align 8, !tbaa !20
  br label %462

462:                                              ; preds = %458, %455
  %463 = phi i32 [ %457, %455 ], [ %461, %458 ]
  store i32 %463, ptr %12, align 4, !tbaa !9
  %464 = load i32, ptr %12, align 4, !tbaa !9
  %465 = icmp ne i32 %464, 0
  %466 = xor i1 %465, true
  %467 = xor i1 %466, true
  %468 = zext i1 %467 to i32
  %469 = sext i32 %468 to i64
  %470 = call i64 @llvm.expect.i64(i64 %469, i64 1)
  %471 = icmp ne i64 %470, 0
  br i1 %471, label %472, label %524

472:                                              ; preds = %462
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %473 = getelementptr inbounds %struct.s2n_blob, ptr %11, i32 0, i32 0
  %474 = load ptr, ptr %473, align 8, !tbaa !22
  %475 = load ptr, ptr %6, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.s2n_blob, ptr %475, i32 0, i32 0
  %477 = load ptr, ptr %476, align 8, !tbaa !22
  %478 = load i32, ptr %12, align 4, !tbaa !9
  %479 = zext i32 %478 to i64
  %480 = call ptr @s2n_ensure_memmove_trace(ptr noundef %474, ptr noundef %477, i64 noundef %479)
  store ptr %480, ptr %13, align 8, !tbaa !5
  br label %481

481:                                              ; preds = %472
  %482 = load ptr, ptr %13, align 8, !tbaa !5
  %483 = icmp ne ptr %482, null
  br i1 %483, label %518, label %484

484:                                              ; preds = %481
  br label %485

485:                                              ; preds = %484
  br label %486

486:                                              ; preds = %485
  %487 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %488 = getelementptr inbounds %struct.s2n_debug_info, ptr %487, i32 0, i32 0
  store ptr @.str.10, ptr %488, align 8, !tbaa !11
  %489 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %490 = getelementptr inbounds %struct.s2n_debug_info, ptr %489, i32 0, i32 0
  %491 = load ptr, ptr %490, align 8, !tbaa !11
  %492 = getelementptr inbounds i8, ptr %491, i64 21
  %493 = call ptr @strrchr(ptr noundef %492, i32 noundef 47) #8
  %494 = icmp ne ptr %493, null
  br i1 %494, label %495, label %502

495:                                              ; preds = %486
  %496 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %497 = getelementptr inbounds %struct.s2n_debug_info, ptr %496, i32 0, i32 0
  %498 = load ptr, ptr %497, align 8, !tbaa !11
  %499 = getelementptr inbounds i8, ptr %498, i64 21
  %500 = call ptr @strrchr(ptr noundef %499, i32 noundef 47) #8
  %501 = getelementptr inbounds i8, ptr %500, i64 1
  br label %507

502:                                              ; preds = %486
  %503 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %504 = getelementptr inbounds %struct.s2n_debug_info, ptr %503, i32 0, i32 0
  %505 = load ptr, ptr %504, align 8, !tbaa !11
  %506 = getelementptr inbounds i8, ptr %505, i64 21
  br label %507

507:                                              ; preds = %502, %495
  %508 = phi ptr [ %501, %495 ], [ %506, %502 ]
  %509 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  %510 = getelementptr inbounds %struct.s2n_debug_info, ptr %509, i32 0, i32 1
  store ptr %508, ptr %510, align 8, !tbaa !13
  %511 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %511, align 4, !tbaa !9
  %512 = call i32 @s2n_calculate_stacktrace()
  br label %513

513:                                              ; preds = %507
  br label %514

514:                                              ; preds = %513
  %515 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %515, align 4, !tbaa !14
  store i32 1, ptr %10, align 4
  br label %521

516:                                              ; No predecessors!
  br label %517

517:                                              ; preds = %516
  br label %518

518:                                              ; preds = %517, %481
  br label %519

519:                                              ; preds = %518
  br label %520

520:                                              ; preds = %519
  store i32 0, ptr %10, align 4
  br label %521

521:                                              ; preds = %520, %514
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  %522 = load i32, ptr %10, align 4
  switch i32 %522, label %525 [
    i32 0, label %523
  ]

523:                                              ; preds = %521
  br label %524

524:                                              ; preds = %523, %462
  store i32 0, ptr %10, align 4
  br label %525

525:                                              ; preds = %524, %521
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #9
  %526 = load i32, ptr %10, align 4
  switch i32 %526, label %543 [
    i32 0, label %527
  ]

527:                                              ; preds = %525
  br label %528

528:                                              ; preds = %527
  br label %529

529:                                              ; preds = %528
  br label %530

530:                                              ; preds = %529
  %531 = load ptr, ptr %5, align 8, !tbaa !5
  %532 = call i32 @s2n_drbg_seed(ptr noundef %531, ptr noundef %11)
  %533 = getelementptr inbounds %struct.s2n_result, ptr %14, i32 0, i32 0
  store i32 %532, ptr %533, align 4
  %534 = getelementptr inbounds %struct.s2n_result, ptr %14, i32 0, i32 0
  %535 = load i32, ptr %534, align 4
  %536 = call zeroext i1 @s2n_result_is_ok(i32 %535)
  br i1 %536, label %539, label %537

537:                                              ; preds = %530
  %538 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 -1, ptr %538, align 4, !tbaa !14
  store i32 1, ptr %10, align 4
  br label %543

539:                                              ; preds = %530
  br label %540

540:                                              ; preds = %539
  br label %541

541:                                              ; preds = %540
  %542 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  store i32 0, ptr %542, align 4, !tbaa !14
  store i32 1, ptr %10, align 4
  br label %543

543:                                              ; preds = %541, %537, %525, %443, %435
  call void @llvm.lifetime.end.p0(i64 24, ptr %11) #9
  br label %544

544:                                              ; preds = %543, %422
  call void @llvm.lifetime.end.p0(i64 48, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #9
  br label %545

545:                                              ; preds = %544, %378, %335, %294, %255, %221, %179, %136, %97, %84, %47
  %546 = getelementptr inbounds %struct.s2n_result, ptr %4, i32 0, i32 0
  %547 = load i32, ptr %546, align 4
  ret i32 %547
}

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

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

declare i32 @s2n_calculate_stacktrace() #4

declare ptr @EVP_CIPHER_CTX_new() #4

declare i32 @EVP_CIPHER_CTX_reset(ptr noundef) #4

declare i32 @EVP_EncryptInit_ex(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

declare ptr @EVP_aes_128_ecb() #4

declare ptr @EVP_aes_256_ecb() #4

declare i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef) #4

; 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_blob_init(ptr noundef, ptr noundef, i32 noundef) #4

declare i32 @s2n_blob_zero(ptr noundef) #4

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

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

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

; Function Attrs: nounwind uwtable
declare hidden i32 @s2n_drbg_seed(ptr noundef, ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { 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 #4 = { "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 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #7 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { nounwind willreturn memory(read) }
attributes #9 = { 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, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 0}
!12 = !{!"s2n_debug_info", !6, i64 0, !6, i64 8}
!13 = !{!12, !6, i64 8}
!14 = !{!15, !10, i64 0}
!15 = !{!"", !10, i64 0}
!16 = !{!17, !6, i64 8}
!17 = !{!"s2n_drbg", !18, i64 0, !6, i64 8, !7, i64 16, !18, i64 32}
!18 = !{!"long", !7, i64 0}
!19 = !{!18, !18, i64 0}
!20 = !{!21, !10, i64 8}
!21 = !{!"s2n_blob", !6, i64 0, !10, i64 8, !10, i64 12, !10, i64 16}
!22 = !{!21, !6, i64 0}


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

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

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

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

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

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

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

14:                                               ; preds = %3
  %.not43 = icmp eq ptr %1, null
  br i1 %.not43, label %15, label %23

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

23:                                               ; preds = %14
  %24 = tail call ptr @EVP_CIPHER_CTX_new() #9
  %25 = getelementptr inbounds i8, ptr %0, i64 8
  store ptr %24, ptr %25, align 8, !tbaa !13
  %.not45 = icmp eq ptr %24, null
  br i1 %.not45, label %150, label %26

26:                                               ; preds = %23
  %27 = tail call i32 @EVP_CIPHER_CTX_reset(ptr noundef nonnull %24) #9
  %28 = icmp eq i32 %27, 1
  br i1 %28, label %37, label %29

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

37:                                               ; preds = %26
  switch i32 %2, label %64 [
    i32 0, label %38
    i32 1, label %51
  ]

38:                                               ; preds = %37
  %39 = load ptr, ptr %25, align 8, !tbaa !13
  %40 = tail call ptr @EVP_aes_128_ecb() #9
  %41 = tail call i32 @EVP_EncryptInit_ex(ptr noundef %39, ptr noundef %40, ptr noundef null, ptr noundef null, ptr noundef null) #9
  %42 = icmp eq i32 %41, 1
  br i1 %42, label %72, label %43

43:                                               ; preds = %38
  %44 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.3, ptr %44, align 8, !tbaa !5
  %45 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.3, i64 21), i32 noundef 47) #8
  %.not48 = icmp eq ptr %45, null
  %46 = getelementptr inbounds i8, ptr %45, i64 1
  %47 = select i1 %.not48, ptr getelementptr inbounds (i8, ptr @.str.3, i64 21), ptr %46
  %48 = getelementptr inbounds i8, ptr %44, i64 8
  store ptr %47, ptr %48, align 8, !tbaa !10
  %49 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %49, align 4, !tbaa !11
  %50 = tail call i32 @s2n_calculate_stacktrace() #9
  br label %150

51:                                               ; preds = %37
  %52 = load ptr, ptr %25, align 8, !tbaa !13
  %53 = tail call ptr @EVP_aes_256_ecb() #9
  %54 = tail call i32 @EVP_EncryptInit_ex(ptr noundef %52, ptr noundef %53, ptr noundef null, ptr noundef null, ptr noundef null) #9
  %55 = icmp eq i32 %54, 1
  br i1 %55, label %72, label %56

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

64:                                               ; preds = %37
  %65 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.5, ptr %65, align 8, !tbaa !5
  %66 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.5, i64 21), i32 noundef 47) #8
  %.not56 = icmp eq ptr %66, null
  %67 = getelementptr inbounds i8, ptr %66, i64 1
  %68 = select i1 %.not56, ptr getelementptr inbounds (i8, ptr @.str.5, i64 21), ptr %67
  %69 = getelementptr inbounds i8, ptr %65, i64 8
  store ptr %68, ptr %69, align 8, !tbaa !10
  %70 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %70, align 4, !tbaa !11
  %71 = tail call i32 @s2n_calculate_stacktrace() #9
  br label %150

72:                                               ; preds = %38, %51
  %73 = load ptr, ptr %25, align 8, !tbaa !13
  %74 = tail call i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef %73) #9
  %75 = icmp slt i32 %74, 33
  br i1 %75, label %84, label %76

76:                                               ; preds = %72
  %77 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.6, ptr %77, align 8, !tbaa !5
  %78 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.6, i64 21), i32 noundef 47) #8
  %.not49 = icmp eq ptr %78, null
  %79 = getelementptr inbounds i8, ptr %78, i64 1
  %80 = select i1 %.not49, ptr getelementptr inbounds (i8, ptr @.str.6, i64 21), ptr %79
  %81 = getelementptr inbounds i8, ptr %77, i64 8
  store ptr %80, ptr %81, align 8, !tbaa !10
  %82 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653194, ptr %82, align 4, !tbaa !11
  %83 = tail call i32 @s2n_calculate_stacktrace() #9
  br label %150

84:                                               ; preds = %72
  %85 = load ptr, ptr %25, align 8, !tbaa !13
  %86 = tail call i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef %85) #9
  %87 = icmp slt i32 %86, 33
  br i1 %87, label %96, label %88

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

96:                                               ; preds = %84
  %97 = getelementptr inbounds i8, ptr %0, i64 16
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %97, i8 0, i64 16, i1 false)
  %98 = load ptr, ptr %25, align 8, !tbaa !13
  %99 = tail call i32 @EVP_EncryptInit_ex(ptr noundef %98, ptr noundef null, ptr noundef null, ptr noundef nonnull @s2n_drbg_instantiate.zero_key, ptr noundef null) #9
  %100 = icmp eq i32 %99, 1
  br i1 %100, label %109, label %101

101:                                              ; preds = %96
  %102 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.8, ptr %102, align 8, !tbaa !5
  %103 = tail call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.8, i64 21), i32 noundef 47) #8
  %.not51 = icmp eq ptr %103, null
  %104 = getelementptr inbounds i8, ptr %103, i64 1
  %105 = select i1 %.not51, ptr getelementptr inbounds (i8, ptr @.str.8, i64 21), ptr %104
  %106 = getelementptr inbounds i8, ptr %102, i64 8
  store ptr %105, ptr %106, align 8, !tbaa !10
  %107 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653221, ptr %107, align 4, !tbaa !11
  %108 = tail call i32 @s2n_calculate_stacktrace() #9
  br label %150

109:                                              ; preds = %96
  %110 = load ptr, ptr %25, align 8, !tbaa !13
  %111 = tail call i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef %110) #9
  %112 = add nsw i32 %111, 16
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %4) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(48) %4, i8 0, i64 48, i1 false)
  %113 = icmp ult i32 %112, 49
  br i1 %113, label %122, label %114

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

122:                                              ; preds = %109
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %5) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %5, i8 0, i64 24, i1 false)
  %123 = call i32 @s2n_blob_init(ptr noundef nonnull %5, ptr noundef nonnull %4, i32 noundef %112) #9
  %124 = icmp sgt i32 %123, -1
  br i1 %124, label %125, label %148

125:                                              ; preds = %122
  %126 = call i32 @s2n_blob_zero(ptr noundef nonnull %5) #9
  %127 = icmp sgt i32 %126, -1
  br i1 %127, label %128, label %148

128:                                              ; preds = %125
  %129 = getelementptr inbounds i8, ptr %5, i64 8
  %130 = load i32, ptr %129, align 8, !tbaa !16
  %131 = getelementptr inbounds i8, ptr %1, i64 8
  %132 = load i32, ptr %131, align 8, !tbaa !16
  %. = call i32 @llvm.umin.i32(i32 %130, i32 %132)
  %.not53 = icmp eq i32 %., 0
  br i1 %.not53, label %.critedge58, label %133, !prof !18

133:                                              ; preds = %128
  %134 = load ptr, ptr %5, align 8, !tbaa !19
  %135 = load ptr, ptr %1, align 8, !tbaa !19
  %136 = zext i32 %. to i64
  %137 = call ptr @s2n_ensure_memmove_trace(ptr noundef %134, ptr noundef %135, i64 noundef %136) #9
  %.not54.not = icmp eq ptr %137, null
  br i1 %.not54.not, label %138, label %.critedge58

138:                                              ; preds = %133
  %139 = call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @_s2n_debug_info)
  store ptr @.str.10, ptr %139, align 8, !tbaa !5
  %140 = call ptr @strrchr(ptr noundef nonnull dereferenceable(1) getelementptr inbounds (i8, ptr @.str.10, i64 21), i32 noundef 47) #8
  %.not55 = icmp eq ptr %140, null
  %141 = getelementptr inbounds i8, ptr %140, i64 1
  %142 = select i1 %.not55, ptr getelementptr inbounds (i8, ptr @.str.10, i64 21), ptr %141
  %143 = getelementptr inbounds i8, ptr %139, i64 8
  store ptr %142, ptr %143, align 8, !tbaa !10
  %144 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @s2n_errno)
  store i32 402653193, ptr %144, align 4, !tbaa !11
  %145 = call i32 @s2n_calculate_stacktrace() #9
  br label %148

.critedge58:                                      ; preds = %133, %128
  %146 = call i32 @s2n_drbg_seed(ptr noundef nonnull %0, ptr noundef nonnull %5)
  %147 = call zeroext i1 @s2n_result_is_ok(i32 %146)
  %not. = xor i1 %147, true
  %spec.select = sext i1 %not. to i32
  br label %148

148:                                              ; preds = %.critedge58, %138, %125, %122
  %.sroa.024.3 = phi i32 [ -1, %122 ], [ -1, %125 ], [ -1, %138 ], [ %spec.select, %.critedge58 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %5) #9
  br label %149

149:                                              ; preds = %148, %114
  %.sroa.024.4 = phi i32 [ %.sroa.024.3, %148 ], [ -1, %114 ]
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %4) #9
  br label %150

150:                                              ; preds = %23, %149, %101, %88, %76, %64, %56, %43, %29, %15, %6
  %.sroa.024.5 = phi i32 [ -1, %64 ], [ %.sroa.024.4, %149 ], [ -1, %101 ], [ -1, %88 ], [ -1, %76 ], [ -1, %56 ], [ -1, %43 ], [ -1, %29 ], [ -1, %15 ], [ -1, %6 ], [ -1, %23 ]
  ret i32 %.sroa.024.5
}

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

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

declare i32 @s2n_calculate_stacktrace() local_unnamed_addr #4

declare ptr @EVP_CIPHER_CTX_new() local_unnamed_addr #4

declare i32 @EVP_CIPHER_CTX_reset(ptr noundef) local_unnamed_addr #4

declare i32 @EVP_EncryptInit_ex(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

declare ptr @EVP_aes_128_ecb() local_unnamed_addr #4

declare ptr @EVP_aes_256_ecb() local_unnamed_addr #4

declare i32 @EVP_CIPHER_CTX_get_key_length(ptr noundef) local_unnamed_addr #4

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

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

declare i32 @s2n_blob_zero(ptr noundef) local_unnamed_addr #4

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

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

; Function Attrs: nounwind uwtable
declare hidden i32 @s2n_drbg_seed(ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.umin.i32(i32, i32) #7

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"s2n_debug_info", !7, i64 0, !7, i64 8}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!6, !7, i64 8}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !8, i64 0}
!13 = !{!14, !7, i64 8}
!14 = !{!"s2n_drbg", !15, i64 0, !7, i64 8, !8, i64 16, !15, i64 32}
!15 = !{!"long", !8, i64 0}
!16 = !{!17, !12, i64 8}
!17 = !{!"s2n_blob", !7, i64 0, !12, i64 8, !12, i64 12, !12, i64 16}
!18 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!19 = !{!17, !7, i64 0}


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