; LLVM IR from erthink/libmdbx :: src (lck-posix)

; 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.libmdbx_globals = type { %union.bin128, i32, i32, i8, i8, i8, i8, i32, %union.logger_union, %union.pthread_mutex_t, i64, ptr }
%union.bin128 = type { %struct.anon }
%struct.anon = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.MDBX_env = type { %union.mdbx_atomic_uint32_t, i32, i32, %struct.osal_mmap, i32, i32, %struct.osal_mmap, ptr, i16, i16, i16, i16, i16, i16, %union.mdbx_atomic_uint32_t, i8, i8, i16, i32, i32, i32, i32, %struct.anon.1, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.2, %struct.anon.6, i8, ptr, ptr, ptr, %struct.anon.7, %union.pthread_mutex_t, i32, i32, ptr, %struct.osal_ioring, %union.pthread_mutex_t, [71 x %union.mdbx_atomic_uint64_t] }
%struct.osal_mmap = type { %union.anon, i32, i64, i64, i64 }
%union.anon = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon.1 = type { ptr, ptr, ptr, ptr }
%struct.anon.2 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.3, %union.anon.4 }
%struct.anon.3 = type { i16, i16, i16, i16 }
%union.anon.4 = type { i32 }
%struct.anon.6 = type { i64, i64, i64, i64, i64 }
%struct.anon.7 = type { i64 }
%struct.osal_ioring = type { i32, i32, i32, ptr, ptr, ptr }
%union.mdbx_atomic_uint64_t = type { i64 }

@op_setlk = external hidden global i32, align 4
@op_setlkw = external hidden global i32, align 4
@globals = external global %struct.libmdbx_globals, align 8
@.str.3 = external hidden unnamed_addr constant [25 x i8], align 1
@__func__.lck_seize = external hidden unnamed_addr constant [10 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [25 x i8], align 1

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

; Function Attrs: cold nounwind optsize uwtable
declare hidden void @choice_fcntl() #1

; Function Attrs: nounwind uwtable
declare hidden i32 @lck_op(i32 noundef, i32 noundef, i32 noundef, i64 noundef, i64 noundef) #2

; Function Attrs: noreturn
declare void @mdbx_assert_fail(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @osal_getpid() #4

; Function Attrs: cold nounwind optsize uwtable
define dso_local i32 @lck_seize(ptr noundef %0) #1 {
  %2 = alloca i32, align 4
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  br label %7

7:                                                ; preds = %1
  %8 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %9 = zext i8 %8 to i32
  %10 = and i32 %9, 1
  %11 = icmp ne i32 %10, 0
  %12 = xor i1 %11, true
  %13 = xor i1 %12, true
  %14 = zext i1 %13 to i32
  %15 = sext i32 %14 to i64
  %16 = call i64 @llvm.expect.i64(i64 %15, i64 1)
  %17 = icmp ne i64 %16, 0
  br i1 %17, label %18, label %35

18:                                               ; preds = %7
  br label %19

19:                                               ; preds = %18
  %20 = load ptr, ptr %3, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.MDBX_env, ptr %20, i32 0, i32 3
  %22 = getelementptr inbounds %struct.osal_mmap, ptr %21, i32 0, i32 1
  %23 = load i32, ptr %22, align 8, !tbaa !14
  %24 = icmp ne i32 %23, -1
  %25 = xor i1 %24, true
  %26 = xor i1 %25, true
  %27 = xor i1 %26, true
  %28 = zext i1 %27 to i32
  %29 = sext i32 %28 to i64
  %30 = call i64 @llvm.expect.i64(i64 %29, i64 0)
  %31 = icmp ne i64 %30, 0
  br i1 %31, label %32, label %33

32:                                               ; preds = %19
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.3, ptr noundef @__func__.lck_seize, i32 noundef 262) #8
  unreachable

33:                                               ; preds = %19
  br label %34

34:                                               ; preds = %33
  br label %35

35:                                               ; preds = %34, %7
  br label %36

36:                                               ; preds = %35
  %37 = call i32 @osal_getpid()
  %38 = load ptr, ptr %3, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.MDBX_env, ptr %38, i32 0, i32 20
  %40 = load i32, ptr %39, align 4, !tbaa !24
  %41 = icmp ne i32 %37, %40
  %42 = xor i1 %41, true
  %43 = xor i1 %42, true
  %44 = zext i1 %43 to i32
  %45 = sext i32 %44 to i64
  %46 = call i64 @llvm.expect.i64(i64 %45, i64 0)
  %47 = icmp ne i64 %46, 0
  br i1 %47, label %48, label %49

48:                                               ; preds = %36
  store i32 -30795, ptr %2, align 4
  br label %648

49:                                               ; preds = %36
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #9
  store i32 0, ptr %4, align 4, !tbaa !25
  %50 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 6), align 1, !tbaa !26, !range !27, !noundef !28
  %51 = trunc i8 %50 to i1
  %52 = xor i1 %51, true
  %53 = xor i1 %52, true
  %54 = zext i1 %53 to i32
  %55 = sext i32 %54 to i64
  %56 = call i64 @llvm.expect.i64(i64 %55, i64 0)
  %57 = icmp ne i64 %56, 0
  br i1 %57, label %58, label %75

58:                                               ; preds = %49
  store i32 37, ptr %4, align 4, !tbaa !25
  br label %59

59:                                               ; preds = %58
  %60 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %61 = zext i8 %60 to i32
  %62 = icmp sle i32 1, %61
  %63 = xor i1 %62, true
  %64 = xor i1 %63, true
  %65 = zext i1 %64 to i32
  %66 = sext i32 %65 to i64
  %67 = call i64 @llvm.expect.i64(i64 %66, i64 0)
  %68 = icmp ne i64 %67, 0
  br i1 %68, label %69, label %71

69:                                               ; preds = %59
  %70 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 273, ptr noundef @.str.4, ptr noundef @.str.5, i32 noundef %70)
  br label %71

71:                                               ; preds = %69, %59
  br label %72

72:                                               ; preds = %71
  br label %73

73:                                               ; preds = %72
  %74 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %74, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

75:                                               ; preds = %49
  %76 = load i32, ptr @op_setlk, align 4, !tbaa !25
  %77 = icmp eq i32 %76, 0
  %78 = xor i1 %77, true
  %79 = xor i1 %78, true
  %80 = zext i1 %79 to i32
  %81 = sext i32 %80 to i64
  %82 = call i64 @llvm.expect.i64(i64 %81, i64 0)
  %83 = icmp ne i64 %82, 0
  br i1 %83, label %84, label %85

84:                                               ; preds = %75
  call void @choice_fcntl() #10
  br label %85

85:                                               ; preds = %84, %75
  %86 = load ptr, ptr %3, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.MDBX_env, ptr %86, i32 0, i32 6
  %88 = getelementptr inbounds %struct.osal_mmap, ptr %87, i32 0, i32 1
  %89 = load i32, ptr %88, align 8, !tbaa !30
  %90 = icmp eq i32 %89, -1
  br i1 %90, label %91, label %160

91:                                               ; preds = %85
  %92 = load ptr, ptr %3, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.MDBX_env, ptr %92, i32 0, i32 3
  %94 = getelementptr inbounds %struct.osal_mmap, ptr %93, i32 0, i32 1
  %95 = load i32, ptr %94, align 8, !tbaa !14
  %96 = load i32, ptr @op_setlk, align 4, !tbaa !25
  %97 = load ptr, ptr %3, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.MDBX_env, ptr %97, i32 0, i32 1
  %99 = load i32, ptr %98, align 4, !tbaa !31
  %100 = and i32 %99, 131072
  %101 = icmp ne i32 %100, 0
  %102 = zext i1 %101 to i64
  %103 = select i1 %101, i32 0, i32 1
  %104 = call i32 @lck_op(i32 noundef %95, i32 noundef %96, i32 noundef %103, i64 noundef 0, i64 noundef 9223372036853727232)
  store i32 %104, ptr %4, align 4, !tbaa !25
  %105 = load i32, ptr %4, align 4, !tbaa !25
  %106 = icmp ne i32 %105, 0
  br i1 %106, label %107, label %159

107:                                              ; preds = %91
  br label %108

108:                                              ; preds = %107
  %109 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %110 = zext i8 %109 to i32
  %111 = icmp sle i32 1, %110
  %112 = xor i1 %111, true
  %113 = xor i1 %112, true
  %114 = zext i1 %113 to i32
  %115 = sext i32 %114 to i64
  %116 = call i64 @llvm.expect.i64(i64 %115, i64 0)
  %117 = icmp ne i64 %116, 0
  br i1 %117, label %118, label %120

118:                                              ; preds = %108
  %119 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 287, ptr noundef @.str.4, ptr noundef @.str.6, i32 noundef %119)
  br label %120

120:                                              ; preds = %118, %108
  br label %121

121:                                              ; preds = %120
  br label %122

122:                                              ; preds = %121
  br label %123

123:                                              ; preds = %122
  %124 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %125 = zext i8 %124 to i32
  %126 = and i32 %125, 1
  %127 = icmp ne i32 %126, 0
  %128 = xor i1 %127, true
  %129 = xor i1 %128, true
  %130 = zext i1 %129 to i32
  %131 = sext i32 %130 to i64
  %132 = call i64 @llvm.expect.i64(i64 %131, i64 1)
  %133 = icmp ne i64 %132, 0
  br i1 %133, label %134, label %155

134:                                              ; preds = %123
  br label %135

135:                                              ; preds = %134
  %136 = load i32, ptr %4, align 4, !tbaa !25
  %137 = icmp ne i32 %136, -1
  br i1 %137, label %138, label %141

138:                                              ; preds = %135
  %139 = load i32, ptr %4, align 4, !tbaa !25
  %140 = icmp ne i32 %139, 0
  br label %141

141:                                              ; preds = %138, %135
  %142 = phi i1 [ false, %135 ], [ %140, %138 ]
  %143 = xor i1 %142, true
  %144 = xor i1 %143, true
  %145 = xor i1 %144, true
  %146 = zext i1 %145 to i32
  %147 = sext i32 %146 to i64
  %148 = call i64 @llvm.expect.i64(i64 %147, i64 0)
  %149 = icmp ne i64 %148, 0
  br i1 %149, label %150, label %152

150:                                              ; preds = %141
  %151 = load ptr, ptr %3, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %151, ptr noundef @.str.7, ptr noundef @__func__.lck_seize, i32 noundef 288) #8
  unreachable

152:                                              ; preds = %141
  br label %153

153:                                              ; preds = %152
  br label %154

154:                                              ; preds = %153
  br label %155

155:                                              ; preds = %154, %123
  br label %156

156:                                              ; preds = %155
  br label %157

157:                                              ; preds = %156
  %158 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %158, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

159:                                              ; preds = %91
  store i32 -1, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

160:                                              ; preds = %85
  %161 = call i32 @sched_yield() #9
  br label %162

162:                                              ; preds = %476, %160
  %163 = load i32, ptr %4, align 4, !tbaa !25
  %164 = icmp eq i32 %163, -1
  br i1 %164, label %165, label %227

165:                                              ; preds = %162
  %166 = load ptr, ptr %3, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.MDBX_env, ptr %166, i32 0, i32 6
  %168 = getelementptr inbounds %struct.osal_mmap, ptr %167, i32 0, i32 1
  %169 = load i32, ptr %168, align 8, !tbaa !30
  %170 = load i32, ptr @op_setlk, align 4, !tbaa !25
  %171 = call i32 @lck_op(i32 noundef %169, i32 noundef %170, i32 noundef 2, i64 noundef 0, i64 noundef 1)
  store i32 %171, ptr %4, align 4, !tbaa !25
  %172 = load i32, ptr %4, align 4, !tbaa !25
  %173 = icmp ne i32 %172, 0
  br i1 %173, label %174, label %226

174:                                              ; preds = %165
  br label %175

175:                                              ; preds = %174
  %176 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %177 = zext i8 %176 to i32
  %178 = icmp sle i32 1, %177
  %179 = xor i1 %178, true
  %180 = xor i1 %179, true
  %181 = zext i1 %180 to i32
  %182 = sext i32 %181 to i64
  %183 = call i64 @llvm.expect.i64(i64 %182, i64 0)
  %184 = icmp ne i64 %183, 0
  br i1 %184, label %185, label %187

185:                                              ; preds = %175
  %186 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 301, ptr noundef @.str.4, ptr noundef @.str.8, i32 noundef %186)
  br label %187

187:                                              ; preds = %185, %175
  br label %188

188:                                              ; preds = %187
  br label %189

189:                                              ; preds = %188
  br label %190

190:                                              ; preds = %189
  %191 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %192 = zext i8 %191 to i32
  %193 = and i32 %192, 1
  %194 = icmp ne i32 %193, 0
  %195 = xor i1 %194, true
  %196 = xor i1 %195, true
  %197 = zext i1 %196 to i32
  %198 = sext i32 %197 to i64
  %199 = call i64 @llvm.expect.i64(i64 %198, i64 1)
  %200 = icmp ne i64 %199, 0
  br i1 %200, label %201, label %222

201:                                              ; preds = %190
  br label %202

202:                                              ; preds = %201
  %203 = load i32, ptr %4, align 4, !tbaa !25
  %204 = icmp ne i32 %203, -1
  br i1 %204, label %205, label %208

205:                                              ; preds = %202
  %206 = load i32, ptr %4, align 4, !tbaa !25
  %207 = icmp ne i32 %206, 0
  br label %208

208:                                              ; preds = %205, %202
  %209 = phi i1 [ false, %202 ], [ %207, %205 ]
  %210 = xor i1 %209, true
  %211 = xor i1 %210, true
  %212 = xor i1 %211, true
  %213 = zext i1 %212 to i32
  %214 = sext i32 %213 to i64
  %215 = call i64 @llvm.expect.i64(i64 %214, i64 0)
  %216 = icmp ne i64 %215, 0
  br i1 %216, label %217, label %219

217:                                              ; preds = %208
  %218 = load ptr, ptr %3, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %218, ptr noundef @.str.7, ptr noundef @__func__.lck_seize, i32 noundef 302) #8
  unreachable

219:                                              ; preds = %208
  br label %220

220:                                              ; preds = %219
  br label %221

221:                                              ; preds = %220
  br label %222

222:                                              ; preds = %221, %190
  br label %223

223:                                              ; preds = %222
  br label %224

224:                                              ; preds = %223
  %225 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %225, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

226:                                              ; preds = %165
  br label %227

227:                                              ; preds = %226, %162
  %228 = load ptr, ptr %3, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.MDBX_env, ptr %228, i32 0, i32 6
  %230 = getelementptr inbounds %struct.osal_mmap, ptr %229, i32 0, i32 1
  %231 = load i32, ptr %230, align 8, !tbaa !30
  %232 = load i32, ptr @op_setlk, align 4, !tbaa !25
  %233 = call i32 @lck_op(i32 noundef %231, i32 noundef %232, i32 noundef 1, i64 noundef 0, i64 noundef 1)
  store i32 %233, ptr %4, align 4, !tbaa !25
  %234 = load i32, ptr %4, align 4, !tbaa !25
  %235 = icmp eq i32 %234, 0
  br i1 %235, label %236, label %342

236:                                              ; preds = %227
  %237 = load ptr, ptr %3, align 8, !tbaa !5
  %238 = call i32 @check_fstat(ptr noundef %237)
  store i32 %238, ptr %4, align 4, !tbaa !25
  %239 = load i32, ptr %4, align 4, !tbaa !25
  %240 = icmp ne i32 %239, -1
  br i1 %240, label %241, label %246

241:                                              ; preds = %236
  %242 = load i32, ptr %4, align 4, !tbaa !25
  %243 = icmp ne i32 %242, 0
  br i1 %243, label %244, label %246

244:                                              ; preds = %241
  %245 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %245, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

246:                                              ; preds = %241, %236
  br label %247

247:                                              ; preds = %506, %246
  %248 = load ptr, ptr %3, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.MDBX_env, ptr %248, i32 0, i32 3
  %250 = getelementptr inbounds %struct.osal_mmap, ptr %249, i32 0, i32 1
  %251 = load i32, ptr %250, align 8, !tbaa !14
  %252 = load i32, ptr @op_setlk, align 4, !tbaa !25
  %253 = load ptr, ptr %3, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.MDBX_env, ptr %253, i32 0, i32 1
  %255 = load i32, ptr %254, align 4, !tbaa !31
  %256 = and i32 %255, 131072
  %257 = icmp ne i32 %256, 0
  %258 = zext i1 %257 to i64
  %259 = select i1 %257, i32 0, i32 1
  %260 = call i32 @lck_op(i32 noundef %251, i32 noundef %252, i32 noundef %259, i64 noundef 0, i64 noundef 9223372036853727232)
  store i32 %260, ptr %4, align 4, !tbaa !25
  %261 = load i32, ptr %4, align 4, !tbaa !25
  %262 = icmp eq i32 %261, 0
  br i1 %262, label %263, label %264

263:                                              ; preds = %247
  store i32 -1, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

264:                                              ; preds = %247
  %265 = load ptr, ptr %3, align 8, !tbaa !5
  %266 = call i32 @check_fstat(ptr noundef %265)
  store i32 %266, ptr %6, align 4, !tbaa !25
  %267 = load i32, ptr %6, align 4, !tbaa !25
  %268 = icmp ne i32 %267, -1
  br i1 %268, label %269, label %274

269:                                              ; preds = %264
  %270 = load i32, ptr %6, align 4, !tbaa !25
  %271 = icmp ne i32 %270, 0
  br i1 %271, label %272, label %274

272:                                              ; preds = %269
  %273 = load i32, ptr %6, align 4, !tbaa !25
  store i32 %273, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

274:                                              ; preds = %269, %264
  %275 = load i32, ptr %4, align 4, !tbaa !25
  %276 = icmp eq i32 %275, 11
  br i1 %276, label %341, label %277

277:                                              ; preds = %274
  %278 = load i32, ptr %4, align 4, !tbaa !25
  %279 = icmp eq i32 %278, 13
  br i1 %279, label %341, label %280

280:                                              ; preds = %277
  %281 = load i32, ptr %4, align 4, !tbaa !25
  %282 = icmp eq i32 %281, 16
  br i1 %282, label %341, label %283

283:                                              ; preds = %280
  %284 = load i32, ptr %4, align 4, !tbaa !25
  %285 = icmp eq i32 %284, 11
  br i1 %285, label %341, label %286

286:                                              ; preds = %283
  %287 = load i32, ptr %4, align 4, !tbaa !25
  %288 = icmp eq i32 %287, 35
  br i1 %288, label %341, label %289

289:                                              ; preds = %286
  br label %290

290:                                              ; preds = %289
  %291 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %292 = zext i8 %291 to i32
  %293 = icmp sle i32 1, %292
  %294 = xor i1 %293, true
  %295 = xor i1 %294, true
  %296 = zext i1 %295 to i32
  %297 = sext i32 %296 to i64
  %298 = call i64 @llvm.expect.i64(i64 %297, i64 0)
  %299 = icmp ne i64 %298, 0
  br i1 %299, label %300, label %302

300:                                              ; preds = %290
  %301 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 325, ptr noundef @.str.4, ptr noundef @.str.9, i32 noundef %301)
  br label %302

302:                                              ; preds = %300, %290
  br label %303

303:                                              ; preds = %302
  br label %304

304:                                              ; preds = %303
  br label %305

305:                                              ; preds = %304
  %306 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %307 = zext i8 %306 to i32
  %308 = and i32 %307, 1
  %309 = icmp ne i32 %308, 0
  %310 = xor i1 %309, true
  %311 = xor i1 %310, true
  %312 = zext i1 %311 to i32
  %313 = sext i32 %312 to i64
  %314 = call i64 @llvm.expect.i64(i64 %313, i64 1)
  %315 = icmp ne i64 %314, 0
  br i1 %315, label %316, label %337

316:                                              ; preds = %305
  br label %317

317:                                              ; preds = %316
  %318 = load i32, ptr %4, align 4, !tbaa !25
  %319 = icmp ne i32 %318, -1
  br i1 %319, label %320, label %323

320:                                              ; preds = %317
  %321 = load i32, ptr %4, align 4, !tbaa !25
  %322 = icmp ne i32 %321, 0
  br label %323

323:                                              ; preds = %320, %317
  %324 = phi i1 [ false, %317 ], [ %322, %320 ]
  %325 = xor i1 %324, true
  %326 = xor i1 %325, true
  %327 = xor i1 %326, true
  %328 = zext i1 %327 to i32
  %329 = sext i32 %328 to i64
  %330 = call i64 @llvm.expect.i64(i64 %329, i64 0)
  %331 = icmp ne i64 %330, 0
  br i1 %331, label %332, label %334

332:                                              ; preds = %323
  %333 = load ptr, ptr %3, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %333, ptr noundef @.str.7, ptr noundef @__func__.lck_seize, i32 noundef 326) #8
  unreachable

334:                                              ; preds = %323
  br label %335

335:                                              ; preds = %334
  br label %336

336:                                              ; preds = %335
  br label %337

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

338:                                              ; preds = %337
  br label %339

339:                                              ; preds = %338
  %340 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %340, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

341:                                              ; preds = %286, %283, %280, %277, %274
  br label %410

342:                                              ; preds = %227
  %343 = load i32, ptr %4, align 4, !tbaa !25
  %344 = icmp eq i32 %343, 11
  br i1 %344, label %409, label %345

345:                                              ; preds = %342
  %346 = load i32, ptr %4, align 4, !tbaa !25
  %347 = icmp eq i32 %346, 13
  br i1 %347, label %409, label %348

348:                                              ; preds = %345
  %349 = load i32, ptr %4, align 4, !tbaa !25
  %350 = icmp eq i32 %349, 16
  br i1 %350, label %409, label %351

351:                                              ; preds = %348
  %352 = load i32, ptr %4, align 4, !tbaa !25
  %353 = icmp eq i32 %352, 11
  br i1 %353, label %409, label %354

354:                                              ; preds = %351
  %355 = load i32, ptr %4, align 4, !tbaa !25
  %356 = icmp eq i32 %355, 35
  br i1 %356, label %409, label %357

357:                                              ; preds = %354
  br label %358

358:                                              ; preds = %357
  %359 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %360 = zext i8 %359 to i32
  %361 = icmp sle i32 1, %360
  %362 = xor i1 %361, true
  %363 = xor i1 %362, true
  %364 = zext i1 %363 to i32
  %365 = sext i32 %364 to i64
  %366 = call i64 @llvm.expect.i64(i64 %365, i64 0)
  %367 = icmp ne i64 %366, 0
  br i1 %367, label %368, label %370

368:                                              ; preds = %358
  %369 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 332, ptr noundef @.str.4, ptr noundef @.str.10, i32 noundef %369)
  br label %370

370:                                              ; preds = %368, %358
  br label %371

371:                                              ; preds = %370
  br label %372

372:                                              ; preds = %371
  br label %373

373:                                              ; preds = %372
  %374 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %375 = zext i8 %374 to i32
  %376 = and i32 %375, 1
  %377 = icmp ne i32 %376, 0
  %378 = xor i1 %377, true
  %379 = xor i1 %378, true
  %380 = zext i1 %379 to i32
  %381 = sext i32 %380 to i64
  %382 = call i64 @llvm.expect.i64(i64 %381, i64 1)
  %383 = icmp ne i64 %382, 0
  br i1 %383, label %384, label %405

384:                                              ; preds = %373
  br label %385

385:                                              ; preds = %384
  %386 = load i32, ptr %4, align 4, !tbaa !25
  %387 = icmp ne i32 %386, -1
  br i1 %387, label %388, label %391

388:                                              ; preds = %385
  %389 = load i32, ptr %4, align 4, !tbaa !25
  %390 = icmp ne i32 %389, 0
  br label %391

391:                                              ; preds = %388, %385
  %392 = phi i1 [ false, %385 ], [ %390, %388 ]
  %393 = xor i1 %392, true
  %394 = xor i1 %393, true
  %395 = xor i1 %394, true
  %396 = zext i1 %395 to i32
  %397 = sext i32 %396 to i64
  %398 = call i64 @llvm.expect.i64(i64 %397, i64 0)
  %399 = icmp ne i64 %398, 0
  br i1 %399, label %400, label %402

400:                                              ; preds = %391
  %401 = load ptr, ptr %3, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %401, ptr noundef @.str.7, ptr noundef @__func__.lck_seize, i32 noundef 333) #8
  unreachable

402:                                              ; preds = %391
  br label %403

403:                                              ; preds = %402
  br label %404

404:                                              ; preds = %403
  br label %405

405:                                              ; preds = %404, %373
  br label %406

406:                                              ; preds = %405
  br label %407

407:                                              ; preds = %406
  %408 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %408, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

409:                                              ; preds = %354, %351, %348, %345, %342
  br label %410

410:                                              ; preds = %409, %341
  %411 = load ptr, ptr %3, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.MDBX_env, ptr %411, i32 0, i32 6
  %413 = getelementptr inbounds %struct.osal_mmap, ptr %412, i32 0, i32 1
  %414 = load i32, ptr %413, align 8, !tbaa !30
  %415 = load i32, ptr @op_setlkw, align 4, !tbaa !25
  %416 = call i32 @lck_op(i32 noundef %414, i32 noundef %415, i32 noundef 0, i64 noundef 0, i64 noundef 1)
  store i32 %416, ptr %4, align 4, !tbaa !25
  %417 = load i32, ptr %4, align 4, !tbaa !25
  %418 = icmp ne i32 %417, 0
  br i1 %418, label %419, label %471

419:                                              ; preds = %410
  br label %420

420:                                              ; preds = %419
  %421 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %422 = zext i8 %421 to i32
  %423 = icmp sle i32 1, %422
  %424 = xor i1 %423, true
  %425 = xor i1 %424, true
  %426 = zext i1 %425 to i32
  %427 = sext i32 %426 to i64
  %428 = call i64 @llvm.expect.i64(i64 %427, i64 0)
  %429 = icmp ne i64 %428, 0
  br i1 %429, label %430, label %432

430:                                              ; preds = %420
  %431 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 349, ptr noundef @.str.4, ptr noundef @.str.11, i32 noundef %431)
  br label %432

432:                                              ; preds = %430, %420
  br label %433

433:                                              ; preds = %432
  br label %434

434:                                              ; preds = %433
  br label %435

435:                                              ; preds = %434
  %436 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %437 = zext i8 %436 to i32
  %438 = and i32 %437, 1
  %439 = icmp ne i32 %438, 0
  %440 = xor i1 %439, true
  %441 = xor i1 %440, true
  %442 = zext i1 %441 to i32
  %443 = sext i32 %442 to i64
  %444 = call i64 @llvm.expect.i64(i64 %443, i64 1)
  %445 = icmp ne i64 %444, 0
  br i1 %445, label %446, label %467

446:                                              ; preds = %435
  br label %447

447:                                              ; preds = %446
  %448 = load i32, ptr %4, align 4, !tbaa !25
  %449 = icmp ne i32 %448, -1
  br i1 %449, label %450, label %453

450:                                              ; preds = %447
  %451 = load i32, ptr %4, align 4, !tbaa !25
  %452 = icmp ne i32 %451, 0
  br label %453

453:                                              ; preds = %450, %447
  %454 = phi i1 [ false, %447 ], [ %452, %450 ]
  %455 = xor i1 %454, true
  %456 = xor i1 %455, true
  %457 = xor i1 %456, true
  %458 = zext i1 %457 to i32
  %459 = sext i32 %458 to i64
  %460 = call i64 @llvm.expect.i64(i64 %459, i64 0)
  %461 = icmp ne i64 %460, 0
  br i1 %461, label %462, label %464

462:                                              ; preds = %453
  %463 = load ptr, ptr %3, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %463, ptr noundef @.str.7, ptr noundef @__func__.lck_seize, i32 noundef 350) #8
  unreachable

464:                                              ; preds = %453
  br label %465

465:                                              ; preds = %464
  br label %466

466:                                              ; preds = %465
  br label %467

467:                                              ; preds = %466, %435
  br label %468

468:                                              ; preds = %467
  br label %469

469:                                              ; preds = %468
  %470 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %470, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

471:                                              ; preds = %410
  %472 = load ptr, ptr %3, align 8, !tbaa !5
  %473 = call i32 @check_fstat(ptr noundef %472)
  store i32 %473, ptr %4, align 4, !tbaa !25
  %474 = load i32, ptr %4, align 4, !tbaa !25
  %475 = icmp eq i32 %474, -1
  br i1 %475, label %476, label %477

476:                                              ; preds = %471
  br label %162

477:                                              ; preds = %471
  %478 = load i32, ptr %4, align 4, !tbaa !25
  %479 = icmp ne i32 %478, 0
  br i1 %479, label %480, label %497

480:                                              ; preds = %477
  br label %481

481:                                              ; preds = %480
  %482 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %483 = zext i8 %482 to i32
  %484 = icmp sle i32 1, %483
  %485 = xor i1 %484, true
  %486 = xor i1 %485, true
  %487 = zext i1 %486 to i32
  %488 = sext i32 %487 to i64
  %489 = call i64 @llvm.expect.i64(i64 %488, i64 0)
  %490 = icmp ne i64 %489, 0
  br i1 %490, label %491, label %493

491:                                              ; preds = %481
  %492 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 358, ptr noundef @.str.4, ptr noundef @.str.12, i32 noundef %492)
  br label %493

493:                                              ; preds = %491, %481
  br label %494

494:                                              ; preds = %493
  br label %495

495:                                              ; preds = %494
  %496 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %496, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

497:                                              ; preds = %477
  %498 = load ptr, ptr %3, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.MDBX_env, ptr %498, i32 0, i32 6
  %500 = getelementptr inbounds %struct.osal_mmap, ptr %499, i32 0, i32 1
  %501 = load i32, ptr %500, align 8, !tbaa !30
  %502 = load i32, ptr @op_setlk, align 4, !tbaa !25
  %503 = call i32 @lck_op(i32 noundef %501, i32 noundef %502, i32 noundef 1, i64 noundef 0, i64 noundef 1)
  store i32 %503, ptr %4, align 4, !tbaa !25
  %504 = load i32, ptr %4, align 4, !tbaa !25
  %505 = icmp eq i32 %504, 0
  br i1 %505, label %506, label %507

506:                                              ; preds = %497
  br label %247

507:                                              ; preds = %497
  %508 = load i32, ptr %4, align 4, !tbaa !25
  %509 = icmp eq i32 %508, 11
  br i1 %509, label %574, label %510

510:                                              ; preds = %507
  %511 = load i32, ptr %4, align 4, !tbaa !25
  %512 = icmp eq i32 %511, 13
  br i1 %512, label %574, label %513

513:                                              ; preds = %510
  %514 = load i32, ptr %4, align 4, !tbaa !25
  %515 = icmp eq i32 %514, 16
  br i1 %515, label %574, label %516

516:                                              ; preds = %513
  %517 = load i32, ptr %4, align 4, !tbaa !25
  %518 = icmp eq i32 %517, 11
  br i1 %518, label %574, label %519

519:                                              ; preds = %516
  %520 = load i32, ptr %4, align 4, !tbaa !25
  %521 = icmp eq i32 %520, 35
  br i1 %521, label %574, label %522

522:                                              ; preds = %519
  br label %523

523:                                              ; preds = %522
  %524 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %525 = zext i8 %524 to i32
  %526 = icmp sle i32 1, %525
  %527 = xor i1 %526, true
  %528 = xor i1 %527, true
  %529 = zext i1 %528 to i32
  %530 = sext i32 %529 to i64
  %531 = call i64 @llvm.expect.i64(i64 %530, i64 0)
  %532 = icmp ne i64 %531, 0
  br i1 %532, label %533, label %535

533:                                              ; preds = %523
  %534 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 368, ptr noundef @.str.4, ptr noundef @.str.10, i32 noundef %534)
  br label %535

535:                                              ; preds = %533, %523
  br label %536

536:                                              ; preds = %535
  br label %537

537:                                              ; preds = %536
  br label %538

538:                                              ; preds = %537
  %539 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %540 = zext i8 %539 to i32
  %541 = and i32 %540, 1
  %542 = icmp ne i32 %541, 0
  %543 = xor i1 %542, true
  %544 = xor i1 %543, true
  %545 = zext i1 %544 to i32
  %546 = sext i32 %545 to i64
  %547 = call i64 @llvm.expect.i64(i64 %546, i64 1)
  %548 = icmp ne i64 %547, 0
  br i1 %548, label %549, label %570

549:                                              ; preds = %538
  br label %550

550:                                              ; preds = %549
  %551 = load i32, ptr %4, align 4, !tbaa !25
  %552 = icmp ne i32 %551, -1
  br i1 %552, label %553, label %556

553:                                              ; preds = %550
  %554 = load i32, ptr %4, align 4, !tbaa !25
  %555 = icmp ne i32 %554, 0
  br label %556

556:                                              ; preds = %553, %550
  %557 = phi i1 [ false, %550 ], [ %555, %553 ]
  %558 = xor i1 %557, true
  %559 = xor i1 %558, true
  %560 = xor i1 %559, true
  %561 = zext i1 %560 to i32
  %562 = sext i32 %561 to i64
  %563 = call i64 @llvm.expect.i64(i64 %562, i64 0)
  %564 = icmp ne i64 %563, 0
  br i1 %564, label %565, label %567

565:                                              ; preds = %556
  %566 = load ptr, ptr %3, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %566, ptr noundef @.str.7, ptr noundef @__func__.lck_seize, i32 noundef 369) #8
  unreachable

567:                                              ; preds = %556
  br label %568

568:                                              ; preds = %567
  br label %569

569:                                              ; preds = %568
  br label %570

570:                                              ; preds = %569, %538
  br label %571

571:                                              ; preds = %570
  br label %572

572:                                              ; preds = %571
  %573 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %573, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

574:                                              ; preds = %519, %516, %513, %510, %507
  %575 = load ptr, ptr %3, align 8, !tbaa !5
  %576 = getelementptr inbounds %struct.MDBX_env, ptr %575, i32 0, i32 3
  %577 = getelementptr inbounds %struct.osal_mmap, ptr %576, i32 0, i32 1
  %578 = load i32, ptr %577, align 8, !tbaa !14
  %579 = load i32, ptr @op_setlk, align 4, !tbaa !25
  %580 = load ptr, ptr %3, align 8, !tbaa !5
  %581 = getelementptr inbounds %struct.MDBX_env, ptr %580, i32 0, i32 1
  %582 = load i32, ptr %581, align 4, !tbaa !31
  %583 = and i32 %582, 131072
  %584 = icmp ne i32 %583, 0
  %585 = zext i1 %584 to i64
  %586 = select i1 %584, i32 0, i32 1
  %587 = load ptr, ptr %3, align 8, !tbaa !5
  %588 = getelementptr inbounds %struct.MDBX_env, ptr %587, i32 0, i32 20
  %589 = load i32, ptr %588, align 4, !tbaa !24
  %590 = zext i32 %589 to i64
  %591 = call i32 @lck_op(i32 noundef %578, i32 noundef %579, i32 noundef %586, i64 noundef %590, i64 noundef 1)
  store i32 %591, ptr %4, align 4, !tbaa !25
  %592 = load i32, ptr %4, align 4, !tbaa !25
  %593 = icmp ne i32 %592, 0
  br i1 %593, label %594, label %646

594:                                              ; preds = %574
  br label %595

595:                                              ; preds = %594
  %596 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !29
  %597 = zext i8 %596 to i32
  %598 = icmp sle i32 1, %597
  %599 = xor i1 %598, true
  %600 = xor i1 %599, true
  %601 = zext i1 %600 to i32
  %602 = sext i32 %601 to i64
  %603 = call i64 @llvm.expect.i64(i64 %602, i64 0)
  %604 = icmp ne i64 %603, 0
  br i1 %604, label %605, label %607

605:                                              ; preds = %595
  %606 = load i32, ptr %4, align 4, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.lck_seize, i32 noundef 376, ptr noundef @.str.4, ptr noundef @.str.13, i32 noundef %606)
  br label %607

607:                                              ; preds = %605, %595
  br label %608

608:                                              ; preds = %607
  br label %609

609:                                              ; preds = %608
  br label %610

610:                                              ; preds = %609
  %611 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %612 = zext i8 %611 to i32
  %613 = and i32 %612, 1
  %614 = icmp ne i32 %613, 0
  %615 = xor i1 %614, true
  %616 = xor i1 %615, true
  %617 = zext i1 %616 to i32
  %618 = sext i32 %617 to i64
  %619 = call i64 @llvm.expect.i64(i64 %618, i64 1)
  %620 = icmp ne i64 %619, 0
  br i1 %620, label %621, label %642

621:                                              ; preds = %610
  br label %622

622:                                              ; preds = %621
  %623 = load i32, ptr %4, align 4, !tbaa !25
  %624 = icmp ne i32 %623, -1
  br i1 %624, label %625, label %628

625:                                              ; preds = %622
  %626 = load i32, ptr %4, align 4, !tbaa !25
  %627 = icmp ne i32 %626, 0
  br label %628

628:                                              ; preds = %625, %622
  %629 = phi i1 [ false, %622 ], [ %627, %625 ]
  %630 = xor i1 %629, true
  %631 = xor i1 %630, true
  %632 = xor i1 %631, true
  %633 = zext i1 %632 to i32
  %634 = sext i32 %633 to i64
  %635 = call i64 @llvm.expect.i64(i64 %634, i64 0)
  %636 = icmp ne i64 %635, 0
  br i1 %636, label %637, label %639

637:                                              ; preds = %628
  %638 = load ptr, ptr %3, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %638, ptr noundef @.str.7, ptr noundef @__func__.lck_seize, i32 noundef 377) #8
  unreachable

639:                                              ; preds = %628
  br label %640

640:                                              ; preds = %639
  br label %641

641:                                              ; preds = %640
  br label %642

642:                                              ; preds = %641, %610
  br label %643

643:                                              ; preds = %642
  br label %644

644:                                              ; preds = %643
  %645 = load i32, ptr %4, align 4, !tbaa !25
  store i32 %645, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

646:                                              ; preds = %574
  store i32 0, ptr %2, align 4
  store i32 1, ptr %5, align 4
  br label %647

647:                                              ; preds = %646, %644, %572, %495, %469, %407, %339, %272, %263, %244, %224, %159, %157, %73
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #9
  br label %648

648:                                              ; preds = %647, %48
  %649 = load i32, ptr %2, align 4
  ret i32 %649
}

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

declare void @debug_log(i32 noundef, ptr noundef, i32 noundef, ptr noundef, ...) #6

; Function Attrs: nounwind
declare i32 @sched_yield() #7

; Function Attrs: nounwind uwtable
declare hidden i32 @check_fstat(ptr noundef) #2

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

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

!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, !7, i64 25}
!10 = !{!"libmdbx_globals", !7, i64 0, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !12, i64 27, !11, i64 28, !7, i64 32, !7, i64 40, !13, i64 80, !6, i64 88}
!11 = !{!"int", !7, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !11, i64 24}
!15 = !{!"MDBX_env", !7, i64 0, !11, i64 4, !11, i64 8, !16, i64 16, !11, i64 56, !11, i64 60, !16, i64 64, !6, i64 104, !17, i64 112, !17, i64 114, !17, i64 116, !17, i64 118, !17, i64 120, !17, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !17, i64 130, !11, i64 132, !11, i64 136, !11, i64 140, !11, i64 144, !18, i64 152, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !11, i64 224, !11, i64 228, !11, i64 232, !6, i64 240, !6, i64 248, !13, i64 256, !19, i64 264, !21, i64 320, !12, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !22, i64 392, !7, i64 400, !11, i64 440, !11, i64 444, !6, i64 448, !23, i64 456, !7, i64 496, !7, i64 536}
!16 = !{!"osal_mmap", !7, i64 0, !11, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!17 = !{!"short", !7, i64 0}
!18 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!19 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !13, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !11, i64 28, !11, i64 32, !12, i64 36, !12, i64 37, !12, i64 38, !20, i64 40, !7, i64 48}
!20 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!21 = !{!"", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!22 = !{!"", !13, i64 0}
!23 = !{!"osal_ioring", !11, i64 0, !11, i64 4, !11, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!24 = !{!15, !11, i64 140}
!25 = !{!11, !11, i64 0}
!26 = !{!10, !12, i64 27}
!27 = !{i8 0, i8 2}
!28 = !{}
!29 = !{!10, !7, i64 26}
!30 = !{!15, !11, i64 72}
!31 = !{!15, !11, i64 4}


; 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.libmdbx_globals = type { %union.bin128, i32, i32, i8, i8, i8, i8, i32, %union.logger_union, %union.pthread_mutex_t, i64, ptr }
%union.bin128 = type { %struct.anon }
%struct.anon = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }

@op_setlk = external hidden local_unnamed_addr global i32, align 4
@op_setlkw = external hidden local_unnamed_addr global i32, align 4
@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.3 = external hidden unnamed_addr constant [25 x i8], align 1
@__func__.lck_seize = external hidden unnamed_addr constant [10 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [25 x i8], align 1

; Function Attrs: cold nounwind optsize uwtable
declare hidden void @choice_fcntl() local_unnamed_addr #0

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

; Function Attrs: noreturn
declare void @mdbx_assert_fail(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @osal_getpid() local_unnamed_addr #3

; Function Attrs: cold nounwind optsize uwtable
define dso_local i32 @lck_seize(ptr noundef %0) local_unnamed_addr #0 {
  %2 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %3 = and i8 %2, 1
  %.not = icmp eq i8 %3, 0
  br i1 %.not, label %8, label %4, !prof !13

4:                                                ; preds = %1
  %5 = getelementptr inbounds i8, ptr %0, i64 24
  %6 = load i32, ptr %5, align 8, !tbaa !14
  %.not126 = icmp eq i32 %6, -1
  br i1 %.not126, label %7, label %8, !prof !13

7:                                                ; preds = %4
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.lck_seize, i32 noundef 262) #6
  unreachable

8:                                                ; preds = %1, %4
  %9 = tail call i32 @osal_getpid()
  %10 = getelementptr inbounds i8, ptr %0, i64 140
  %11 = load i32, ptr %10, align 4, !tbaa !24
  %.not127 = icmp eq i32 %9, %11
  br i1 %.not127, label %12, label %.loopexit, !prof !25

12:                                               ; preds = %8
  %13 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 27), align 1, !tbaa !26, !range !27, !noundef !28
  %14 = trunc nuw i8 %13 to i1
  br i1 %14, label %15, label %18, !prof !13

15:                                               ; preds = %12
  %16 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not160 = icmp eq i8 %16, 0
  br i1 %.not160, label %.loopexit, label %17, !prof !25

17:                                               ; preds = %15
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 273, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.5, i32 noundef 37) #7
  br label %.loopexit

18:                                               ; preds = %12
  %19 = load i32, ptr @op_setlk, align 4, !tbaa !30
  %20 = icmp eq i32 %19, 0
  br i1 %20, label %21, label %22, !prof !13

21:                                               ; preds = %18
  tail call void @choice_fcntl() #8
  br label %22

22:                                               ; preds = %21, %18
  %23 = getelementptr inbounds i8, ptr %0, i64 72
  %24 = load i32, ptr %23, align 8, !tbaa !31
  %25 = icmp eq i32 %24, -1
  br i1 %25, label %26, label %.critedge

26:                                               ; preds = %22
  %27 = getelementptr inbounds i8, ptr %0, i64 24
  %28 = load i32, ptr %27, align 8, !tbaa !14
  %29 = load i32, ptr @op_setlk, align 4, !tbaa !30
  %30 = getelementptr inbounds i8, ptr %0, i64 4
  %31 = load i32, ptr %30, align 4, !tbaa !32
  %32 = lshr i32 %31, 17
  %.lobit155 = and i32 %32, 1
  %33 = xor i32 %.lobit155, 1
  %34 = tail call i32 @lck_op(i32 noundef %28, i32 noundef %29, i32 noundef %33, i64 noundef 0, i64 noundef 9223372036853727232)
  %.not156 = icmp eq i32 %34, 0
  br i1 %.not156, label %.loopexit, label %35

35:                                               ; preds = %26
  %36 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not157 = icmp eq i8 %36, 0
  br i1 %.not157, label %38, label %37, !prof !25

37:                                               ; preds = %35
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 287, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.6, i32 noundef %34) #7
  br label %38

38:                                               ; preds = %35, %37
  %39 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %40 = and i8 %39, 1
  %.not158 = icmp ne i8 %40, 0
  %.not159 = icmp eq i32 %34, -1
  %or.cond161 = and i1 %.not159, %.not158
  br i1 %or.cond161, label %41, label %.loopexit, !prof !33

41:                                               ; preds = %38
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.lck_seize, i32 noundef 288) #6
  unreachable

.critedge:                                        ; preds = %22
  %42 = tail call i32 @sched_yield() #7
  %43 = getelementptr inbounds i8, ptr %0, i64 24
  %44 = getelementptr inbounds i8, ptr %0, i64 4
  br label %56

45:                                               ; preds = %100
  %46 = load i32, ptr %23, align 8, !tbaa !31
  %47 = load i32, ptr @op_setlk, align 4, !tbaa !30
  %48 = tail call i32 @lck_op(i32 noundef %46, i32 noundef %47, i32 noundef 2, i64 noundef 0, i64 noundef 1)
  %.not128 = icmp eq i32 %48, 0
  br i1 %.not128, label %56, label %49

49:                                               ; preds = %45
  %50 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not151 = icmp eq i8 %50, 0
  br i1 %.not151, label %52, label %51, !prof !25

51:                                               ; preds = %49
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 301, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.8, i32 noundef %48) #7
  br label %52

52:                                               ; preds = %49, %51
  %53 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %54 = and i8 %53, 1
  %.not152 = icmp ne i8 %54, 0
  %.not153 = icmp eq i32 %48, -1
  %or.cond162 = and i1 %.not153, %.not152
  br i1 %or.cond162, label %55, label %.loopexit, !prof !33

55:                                               ; preds = %52
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.lck_seize, i32 noundef 302) #6
  unreachable

56:                                               ; preds = %.critedge, %45
  %57 = load i32, ptr %23, align 8, !tbaa !31
  %58 = load i32, ptr @op_setlk, align 4, !tbaa !30
  %59 = tail call i32 @lck_op(i32 noundef %57, i32 noundef %58, i32 noundef 1, i64 noundef 0, i64 noundef 1)
  switch i32 %59, label %82 [
    i32 0, label %60
    i32 35, label %89
    i32 16, label %89
    i32 13, label %89
    i32 11, label %89
  ]

60:                                               ; preds = %56
  %61 = tail call i32 @check_fstat(ptr noundef nonnull %0)
  %62 = add i32 %61, -1
  %or.cond = icmp ult i32 %62, -2
  br i1 %or.cond, label %.loopexit, label %63

63:                                               ; preds = %105, %60
  %64 = load i32, ptr %43, align 8, !tbaa !14
  %65 = load i32, ptr @op_setlk, align 4, !tbaa !30
  %66 = load i32, ptr %44, align 4, !tbaa !32
  %67 = lshr i32 %66, 17
  %.lobit = and i32 %67, 1
  %68 = xor i32 %.lobit, 1
  %69 = tail call i32 @lck_op(i32 noundef %64, i32 noundef %65, i32 noundef %68, i64 noundef 0, i64 noundef 9223372036853727232)
  %70 = icmp eq i32 %69, 0
  br i1 %70, label %.loopexit, label %71

71:                                               ; preds = %63
  %72 = tail call i32 @check_fstat(ptr noundef nonnull %0)
  %73 = add i32 %72, -1
  %or.cond3 = icmp ult i32 %73, -2
  br i1 %or.cond3, label %.loopexit, label %74

74:                                               ; preds = %71
  switch i32 %69, label %75 [
    i32 35, label %89
    i32 16, label %89
    i32 13, label %89
    i32 11, label %89
  ]

75:                                               ; preds = %74
  %76 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not133 = icmp eq i8 %76, 0
  br i1 %.not133, label %78, label %77, !prof !25

77:                                               ; preds = %75
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 325, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.9, i32 noundef %69) #7
  br label %78

78:                                               ; preds = %75, %77
  %79 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %80 = and i8 %79, 1
  %.not134 = icmp ne i8 %80, 0
  %.not135 = icmp eq i32 %69, -1
  %or.cond163 = and i1 %.not135, %.not134
  br i1 %or.cond163, label %81, label %.loopexit, !prof !33

81:                                               ; preds = %78
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.lck_seize, i32 noundef 326) #6
  unreachable

82:                                               ; preds = %56
  %83 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not129 = icmp eq i8 %83, 0
  br i1 %.not129, label %85, label %84, !prof !25

84:                                               ; preds = %82
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 332, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.10, i32 noundef %59) #7
  br label %85

85:                                               ; preds = %82, %84
  %86 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %87 = and i8 %86, 1
  %.not130 = icmp ne i8 %87, 0
  %.not131 = icmp eq i32 %59, -1
  %or.cond164 = and i1 %.not131, %.not130
  br i1 %or.cond164, label %88, label %.loopexit, !prof !33

88:                                               ; preds = %85
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.lck_seize, i32 noundef 333) #6
  unreachable

89:                                               ; preds = %56, %56, %56, %56, %74, %74, %74, %74
  %90 = load i32, ptr %23, align 8, !tbaa !31
  %91 = load i32, ptr @op_setlkw, align 4, !tbaa !30
  %92 = tail call i32 @lck_op(i32 noundef %90, i32 noundef %91, i32 noundef 0, i64 noundef 0, i64 noundef 1)
  %.not136 = icmp eq i32 %92, 0
  br i1 %.not136, label %100, label %93

93:                                               ; preds = %89
  %94 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not148 = icmp eq i8 %94, 0
  br i1 %.not148, label %96, label %95, !prof !25

95:                                               ; preds = %93
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 349, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.11, i32 noundef %92) #7
  br label %96

96:                                               ; preds = %93, %95
  %97 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %98 = and i8 %97, 1
  %.not149 = icmp ne i8 %98, 0
  %.not150 = icmp eq i32 %92, -1
  %or.cond165 = and i1 %.not150, %.not149
  br i1 %or.cond165, label %99, label %.loopexit, !prof !33

99:                                               ; preds = %96
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.lck_seize, i32 noundef 350) #6
  unreachable

100:                                              ; preds = %89
  %101 = tail call i32 @check_fstat(ptr noundef nonnull %0)
  switch i32 %101, label %102 [
    i32 -1, label %45
    i32 0, label %105
  ]

102:                                              ; preds = %100
  %103 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not147 = icmp eq i8 %103, 0
  br i1 %.not147, label %.loopexit, label %104, !prof !25

104:                                              ; preds = %102
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 358, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.12, i32 noundef %101) #7
  br label %.loopexit

105:                                              ; preds = %100
  %106 = load i32, ptr %23, align 8, !tbaa !31
  %107 = load i32, ptr @op_setlk, align 4, !tbaa !30
  %108 = tail call i32 @lck_op(i32 noundef %106, i32 noundef %107, i32 noundef 1, i64 noundef 0, i64 noundef 1)
  switch i32 %108, label %109 [
    i32 0, label %63
    i32 35, label %116
    i32 16, label %116
    i32 13, label %116
    i32 11, label %116
  ]

109:                                              ; preds = %105
  %110 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not138 = icmp eq i8 %110, 0
  br i1 %.not138, label %112, label %111, !prof !25

111:                                              ; preds = %109
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 368, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.10, i32 noundef %108) #7
  br label %112

112:                                              ; preds = %109, %111
  %113 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %114 = and i8 %113, 1
  %.not139 = icmp ne i8 %114, 0
  %.not140 = icmp eq i32 %108, -1
  %or.cond166 = and i1 %.not140, %.not139
  br i1 %or.cond166, label %115, label %.loopexit, !prof !33

115:                                              ; preds = %112
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.lck_seize, i32 noundef 369) #6
  unreachable

116:                                              ; preds = %105, %105, %105, %105
  %117 = load i32, ptr %43, align 8, !tbaa !14
  %118 = load i32, ptr @op_setlk, align 4, !tbaa !30
  %119 = load i32, ptr %44, align 4, !tbaa !32
  %120 = lshr i32 %119, 17
  %.lobit142 = and i32 %120, 1
  %121 = xor i32 %.lobit142, 1
  %122 = load i32, ptr %10, align 4, !tbaa !24
  %123 = zext i32 %122 to i64
  %124 = tail call i32 @lck_op(i32 noundef %117, i32 noundef %118, i32 noundef %121, i64 noundef %123, i64 noundef 1)
  %.not143 = icmp eq i32 %124, 0
  br i1 %.not143, label %.loopexit, label %125

125:                                              ; preds = %116
  %126 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !29
  %.not144 = icmp eq i8 %126, 0
  br i1 %.not144, label %128, label %127, !prof !25

127:                                              ; preds = %125
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.lck_seize, i32 noundef 376, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.13, i32 noundef %124) #7
  br label %128

128:                                              ; preds = %125, %127
  %129 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %130 = and i8 %129, 1
  %.not145 = icmp ne i8 %130, 0
  %.not146 = icmp eq i32 %124, -1
  %or.cond167 = and i1 %.not146, %.not145
  br i1 %or.cond167, label %131, label %.loopexit, !prof !33

131:                                              ; preds = %128
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.lck_seize, i32 noundef 377) #6
  unreachable

.loopexit:                                        ; preds = %60, %63, %71, %17, %15, %38, %26, %52, %78, %85, %96, %104, %102, %112, %128, %116, %8
  %.1 = phi i32 [ -30795, %8 ], [ 37, %17 ], [ 37, %15 ], [ %34, %38 ], [ -1, %26 ], [ %48, %52 ], [ %69, %78 ], [ %59, %85 ], [ %92, %96 ], [ %101, %104 ], [ %101, %102 ], [ %108, %112 ], [ %124, %128 ], [ 0, %116 ], [ %72, %71 ], [ -1, %63 ], [ %61, %60 ]
  ret i32 %.1
}

declare void @debug_log(i32 noundef, ptr noundef, i32 noundef, ptr noundef, ...) local_unnamed_addr #4

; Function Attrs: nounwind
declare i32 @sched_yield() local_unnamed_addr #5

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

attributes #0 = { cold nounwind optsize uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { 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 = { noreturn "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 = { 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 #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 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { noreturn nounwind }
attributes #7 = { nounwind }
attributes #8 = { cold }

!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 25}
!6 = !{!"libmdbx_globals", !7, i64 0, !9, i64 16, !9, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !10, i64 27, !9, i64 28, !7, i64 32, !7, i64 40, !11, i64 80, !12, i64 88}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"int", !7, i64 0}
!10 = !{!"_Bool", !7, i64 0}
!11 = !{!"long", !7, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!14 = !{!15, !9, i64 24}
!15 = !{!"MDBX_env", !7, i64 0, !9, i64 4, !9, i64 8, !16, i64 16, !9, i64 56, !9, i64 60, !16, i64 64, !12, i64 104, !17, i64 112, !17, i64 114, !17, i64 116, !17, i64 118, !17, i64 120, !17, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !17, i64 130, !9, i64 132, !9, i64 136, !9, i64 140, !9, i64 144, !18, i64 152, !12, i64 184, !12, i64 192, !12, i64 200, !12, i64 208, !12, i64 216, !9, i64 224, !9, i64 228, !9, i64 232, !12, i64 240, !12, i64 248, !11, i64 256, !19, i64 264, !21, i64 320, !10, i64 360, !12, i64 368, !12, i64 376, !12, i64 384, !22, i64 392, !7, i64 400, !9, i64 440, !9, i64 444, !12, i64 448, !23, i64 456, !7, i64 496, !7, i64 536}
!16 = !{!"osal_mmap", !7, i64 0, !9, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!17 = !{!"short", !7, i64 0}
!18 = !{!"", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24}
!19 = !{!"", !9, i64 0, !9, i64 4, !9, i64 8, !9, i64 12, !11, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !9, i64 28, !9, i64 32, !10, i64 36, !10, i64 37, !10, i64 38, !20, i64 40, !7, i64 48}
!20 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!21 = !{!"", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!22 = !{!"", !11, i64 0}
!23 = !{!"osal_ioring", !9, i64 0, !9, i64 4, !9, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!24 = !{!15, !9, i64 140}
!25 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!26 = !{!6, !10, i64 27}
!27 = !{i8 0, i8 2}
!28 = !{}
!29 = !{!6, !7, i64 26}
!30 = !{!9, !9, i64 0}
!31 = !{!15, !9, i64 72}
!32 = !{!15, !9, i64 4}
!33 = !{!"branch_weights", i32 2000, i32 4002001}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopSimplifyPass,LoopUnrollPass,LowerExpectIntrinsicPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass