; LLVM IR from erthink/libmdbx :: src (dxb)

; 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.5 }
%struct.anon.5 = 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.8, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.9, %struct.anon.13, i8, ptr, ptr, ptr, %struct.anon.14, %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.7, i32, i64, i64, i64 }
%union.anon.7 = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon.8 = type { ptr, ptr, ptr, ptr }
%struct.anon.9 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.10, %union.anon.11 }
%struct.anon.10 = type { i16, i16, i16, i16 }
%union.anon.11 = type { i32 }
%struct.anon.13 = type { i64, i64, i64, i64, i64 }
%struct.anon.14 = type { i64 }
%struct.osal_ioring = type { i32, i32, i32, ptr, ptr, ptr }
%union.mdbx_atomic_uint64_t = type { i64 }
%struct.shared_lck = type { i64, i32, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, [2 x %union.mdbx_atomic_uint32_t], [16 x i8], %struct.pgops, [16 x i8], %union.pthread_mutex_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, i32, %struct.anon.17, %union.pthread_mutex_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, [16 x i8], [0 x %struct.reader_slot] }
%struct.pgops = type { %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %struct.anon.15 }
%struct.anon.15 = type { %struct.gc_prof_stat, %struct.gc_prof_stat, i32, i32, i32, i32, i32 }
%struct.gc_prof_stat = type { i64, i64, i32, i32, i32, i32, %struct.anon.16 }
%struct.anon.16 = type { i64, i64, i32 }
%struct.anon.17 = type { [4 x i32], [4 x i64] }
%struct.reader_slot = type { %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint64_t }
%struct.MDBX_txn = type { i32, i32, i64, i64, ptr, ptr, %struct.geo, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, %struct.MDBX_canary, ptr, %union.anon.18 }
%struct.geo = type { i16, i16, i32, i32, %union.anon.0, %union.anon.1 }
%union.anon.0 = type { i32 }
%union.anon.1 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.18 = type { %struct.anon.20 }
%struct.anon.20 = type { %struct.troika, ptr, %struct.anon.21, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.22 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.21 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.22 = type { %struct.anon.23 }
%struct.anon.23 = type { i64, ptr }

@globals = external global %struct.libmdbx_globals, align 8
@.str.8 = external hidden unnamed_addr constant [24 x i8], align 1
@__func__.dxb_resize = external hidden unnamed_addr constant [11 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [88 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [85 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [82 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [82 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [39 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(none)
declare i64 @llvm.expect.i64(i64, i64) #1

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

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

; Function Attrs: cold nounwind optsize uwtable
define dso_local i32 @dxb_resize(ptr noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, i32 noundef %4) #3 {
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  %16 = alloca i32, align 4
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca ptr, align 8
  %22 = alloca i32, align 4
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i8, align 1
  %30 = alloca i8, align 1
  %31 = alloca i32, align 4
  store ptr %0, ptr %7, align 8, !tbaa !5
  store i32 %1, ptr %8, align 4, !tbaa !9
  store i32 %2, ptr %9, align 4, !tbaa !9
  store i32 %3, ptr %10, align 4, !tbaa !9
  store i32 %4, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #11
  %32 = load ptr, ptr %7, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.MDBX_env, ptr %32, i32 0, i32 46
  %34 = call i32 @osal_fastmutex_acquire(ptr noundef %33)
  store i32 %34, ptr %12, align 4, !tbaa !9
  %35 = load i32, ptr %12, align 4, !tbaa !9
  %36 = icmp ne i32 %35, 0
  %37 = xor i1 %36, true
  %38 = xor i1 %37, true
  %39 = zext i1 %38 to i32
  %40 = sext i32 %39 to i64
  %41 = call i64 @llvm.expect.i64(i64 %40, i64 0)
  %42 = icmp ne i64 %41, 0
  br i1 %42, label %43, label %45

43:                                               ; preds = %5
  %44 = load i32, ptr %12, align 4, !tbaa !9
  store i32 %44, ptr %6, align 4
  store i32 1, ptr %13, align 4
  br label %1194

45:                                               ; preds = %5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #11
  %46 = load ptr, ptr %7, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.MDBX_env, ptr %46, i32 0, i32 3
  %48 = getelementptr inbounds %struct.osal_mmap, ptr %47, i32 0, i32 3
  %49 = load i64, ptr %48, align 8, !tbaa !11
  store i64 %49, ptr %14, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #11
  %50 = load ptr, ptr %7, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.MDBX_env, ptr %50, i32 0, i32 3
  %52 = getelementptr inbounds %struct.osal_mmap, ptr %51, i32 0, i32 2
  %53 = load i64, ptr %52, align 8, !tbaa !24
  store i64 %53, ptr %15, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #11
  %54 = load ptr, ptr %7, align 8, !tbaa !5
  %55 = load i64, ptr %15, align 8, !tbaa !23
  %56 = call i32 @bytes2pgno(ptr noundef %54, i64 noundef %55) #12
  store i32 %56, ptr %16, align 4, !tbaa !9
  br label %57

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

68:                                               ; preds = %57
  br label %69

69:                                               ; preds = %68
  %70 = load i32, ptr %10, align 4, !tbaa !9
  %71 = load i32, ptr %9, align 4, !tbaa !9
  %72 = icmp uge i32 %70, %71
  %73 = xor i1 %72, true
  %74 = xor i1 %73, true
  %75 = xor i1 %74, true
  %76 = zext i1 %75 to i32
  %77 = sext i32 %76 to i64
  %78 = call i64 @llvm.expect.i64(i64 %77, i64 0)
  %79 = icmp ne i64 %78, 0
  br i1 %79, label %80, label %82

80:                                               ; preds = %69
  %81 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %81, ptr noundef @.str.8, ptr noundef @__func__.dxb_resize, i32 noundef 134) #13
  unreachable

82:                                               ; preds = %69
  br label %83

83:                                               ; preds = %82
  br label %84

84:                                               ; preds = %83
  br label %85

85:                                               ; preds = %84, %57
  br label %86

86:                                               ; preds = %85
  br label %87

87:                                               ; preds = %86
  br label %88

88:                                               ; preds = %87
  %89 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %90 = zext i8 %89 to i32
  %91 = and i32 %90, 1
  %92 = icmp ne i32 %91, 0
  %93 = xor i1 %92, true
  %94 = xor i1 %93, true
  %95 = zext i1 %94 to i32
  %96 = sext i32 %95 to i64
  %97 = call i64 @llvm.expect.i64(i64 %96, i64 1)
  %98 = icmp ne i64 %97, 0
  br i1 %98, label %99, label %116

99:                                               ; preds = %88
  br label %100

100:                                              ; preds = %99
  %101 = load i32, ptr %9, align 4, !tbaa !9
  %102 = load i32, ptr %8, align 4, !tbaa !9
  %103 = icmp uge i32 %101, %102
  %104 = xor i1 %103, true
  %105 = xor i1 %104, true
  %106 = xor i1 %105, true
  %107 = zext i1 %106 to i32
  %108 = sext i32 %107 to i64
  %109 = call i64 @llvm.expect.i64(i64 %108, i64 0)
  %110 = icmp ne i64 %109, 0
  br i1 %110, label %111, label %113

111:                                              ; preds = %100
  %112 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %112, ptr noundef @.str.9, ptr noundef @__func__.dxb_resize, i32 noundef 135) #13
  unreachable

113:                                              ; preds = %100
  br label %114

114:                                              ; preds = %113
  br label %115

115:                                              ; preds = %114
  br label %116

116:                                              ; preds = %115, %88
  br label %117

117:                                              ; preds = %116
  br label %118

118:                                              ; preds = %117
  %119 = load i32, ptr %11, align 4, !tbaa !9
  %120 = icmp ult i32 %119, 2
  br i1 %120, label %121, label %127

121:                                              ; preds = %118
  %122 = load i32, ptr %9, align 4, !tbaa !9
  %123 = load i32, ptr %16, align 4, !tbaa !9
  %124 = icmp ule i32 %122, %123
  br i1 %124, label %125, label %127

125:                                              ; preds = %121
  %126 = load i32, ptr %16, align 4, !tbaa !9
  store i32 %126, ptr %10, align 4, !tbaa !9
  br label %127

127:                                              ; preds = %125, %121, %118
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #11
  %128 = load ptr, ptr %7, align 8, !tbaa !5
  %129 = load i32, ptr %10, align 4, !tbaa !9
  %130 = zext i32 %129 to i64
  %131 = call i64 @pgno_align2os_bytes(ptr noundef %128, i64 noundef %130) #12
  store i64 %131, ptr %17, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #11
  %132 = load ptr, ptr %7, align 8, !tbaa !5
  %133 = load i32, ptr %9, align 4, !tbaa !9
  %134 = zext i32 %133 to i64
  %135 = call i64 @pgno_align2os_bytes(ptr noundef %132, i64 noundef %134) #12
  store i64 %135, ptr %18, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #11
  %136 = load ptr, ptr %7, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.MDBX_env, ptr %136, i32 0, i32 3
  %138 = getelementptr inbounds %struct.osal_mmap, ptr %137, i32 0, i32 0
  %139 = load ptr, ptr %138, align 8, !tbaa !27
  store ptr %139, ptr %19, align 8, !tbaa !5
  br label %140

140:                                              ; preds = %127
  %141 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !28
  %142 = zext i8 %141 to i32
  %143 = icmp sle i32 4, %142
  %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 %159

150:                                              ; preds = %140
  %151 = load ptr, ptr %7, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.MDBX_env, ptr %151, i32 0, i32 1
  %153 = load i32, ptr %152, align 4, !tbaa !29
  %154 = load i32, ptr %11, align 4, !tbaa !9
  %155 = load i64, ptr %14, align 8, !tbaa !23
  %156 = load i64, ptr %18, align 8, !tbaa !23
  %157 = load i64, ptr %15, align 8, !tbaa !23
  %158 = load i64, ptr %17, align 8, !tbaa !23
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 4, ptr noundef @__func__.dxb_resize, i32 noundef 148, ptr noundef @.str.10, i32 noundef %153, i32 noundef %154, i64 noundef %155, i64 noundef %156, i64 noundef %157, i64 noundef %158)
  br label %159

159:                                              ; preds = %150, %140
  br label %160

160:                                              ; preds = %159
  br label %161

161:                                              ; preds = %160
  br label %162

162:                                              ; preds = %161
  %163 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %164 = zext i8 %163 to i32
  %165 = and i32 %164, 1
  %166 = icmp ne i32 %165, 0
  %167 = xor i1 %166, true
  %168 = xor i1 %167, true
  %169 = zext i1 %168 to i32
  %170 = sext i32 %169 to i64
  %171 = call i64 @llvm.expect.i64(i64 %170, i64 1)
  %172 = icmp ne i64 %171, 0
  br i1 %172, label %173, label %190

173:                                              ; preds = %162
  br label %174

174:                                              ; preds = %173
  %175 = load i64, ptr %17, align 8, !tbaa !23
  %176 = load i64, ptr %18, align 8, !tbaa !23
  %177 = icmp uge i64 %175, %176
  %178 = xor i1 %177, true
  %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 = %174
  %186 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %186, ptr noundef @.str.11, ptr noundef @__func__.dxb_resize, i32 noundef 150) #13
  unreachable

187:                                              ; preds = %174
  br label %188

188:                                              ; preds = %187
  br label %189

189:                                              ; preds = %188
  br label %190

190:                                              ; preds = %189, %162
  br label %191

191:                                              ; preds = %190
  br label %192

192:                                              ; preds = %191
  br label %193

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

204:                                              ; preds = %193
  br label %205

205:                                              ; preds = %204
  %206 = load ptr, ptr %7, align 8, !tbaa !5
  %207 = load i64, ptr %18, align 8, !tbaa !23
  %208 = call i32 @bytes2pgno(ptr noundef %206, i64 noundef %207) #12
  %209 = load i32, ptr %9, align 4, !tbaa !9
  %210 = icmp uge i32 %208, %209
  %211 = xor i1 %210, true
  %212 = xor i1 %211, true
  %213 = xor i1 %212, true
  %214 = zext i1 %213 to i32
  %215 = sext i32 %214 to i64
  %216 = call i64 @llvm.expect.i64(i64 %215, i64 0)
  %217 = icmp ne i64 %216, 0
  br i1 %217, label %218, label %220

218:                                              ; preds = %205
  %219 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %219, ptr noundef @.str.12, ptr noundef @__func__.dxb_resize, i32 noundef 151) #13
  unreachable

220:                                              ; preds = %205
  br label %221

221:                                              ; preds = %220
  br label %222

222:                                              ; preds = %221
  br label %223

223:                                              ; preds = %222, %193
  br label %224

224:                                              ; preds = %223
  br label %225

225:                                              ; preds = %224
  br label %226

226:                                              ; preds = %225
  %227 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %228 = zext i8 %227 to i32
  %229 = and i32 %228, 1
  %230 = icmp ne i32 %229, 0
  %231 = xor i1 %230, true
  %232 = xor i1 %231, true
  %233 = zext i1 %232 to i32
  %234 = sext i32 %233 to i64
  %235 = call i64 @llvm.expect.i64(i64 %234, i64 1)
  %236 = icmp ne i64 %235, 0
  br i1 %236, label %237, label %256

237:                                              ; preds = %226
  br label %238

238:                                              ; preds = %237
  %239 = load ptr, ptr %7, align 8, !tbaa !5
  %240 = load i64, ptr %17, align 8, !tbaa !23
  %241 = call i32 @bytes2pgno(ptr noundef %239, i64 noundef %240) #12
  %242 = load i32, ptr %10, align 4, !tbaa !9
  %243 = icmp uge i32 %241, %242
  %244 = xor i1 %243, true
  %245 = xor i1 %244, true
  %246 = xor i1 %245, true
  %247 = zext i1 %246 to i32
  %248 = sext i32 %247 to i64
  %249 = call i64 @llvm.expect.i64(i64 %248, i64 0)
  %250 = icmp ne i64 %249, 0
  br i1 %250, label %251, label %253

251:                                              ; preds = %238
  %252 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %252, ptr noundef @.str.13, ptr noundef @__func__.dxb_resize, i32 noundef 152) #13
  unreachable

253:                                              ; preds = %238
  br label %254

254:                                              ; preds = %253
  br label %255

255:                                              ; preds = %254
  br label %256

256:                                              ; preds = %255, %226
  br label %257

257:                                              ; preds = %256
  br label %258

258:                                              ; preds = %257
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #11
  %259 = load ptr, ptr %7, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.MDBX_env, ptr %259, i32 0, i32 1
  %261 = load i32, ptr %260, align 4, !tbaa !29
  %262 = and i32 %261, 1769472
  store i32 %262, ptr %20, align 4, !tbaa !9
  %263 = load i32, ptr %11, align 4, !tbaa !9
  %264 = icmp uge i32 %263, 1
  br i1 %264, label %265, label %268

265:                                              ; preds = %258
  %266 = load i32, ptr %20, align 4, !tbaa !9
  %267 = or i32 %266, 1073741824
  store i32 %267, ptr %20, align 4, !tbaa !9
  br label %268

268:                                              ; preds = %265, %258
  %269 = load i64, ptr %17, align 8, !tbaa !23
  %270 = load ptr, ptr %7, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.MDBX_env, ptr %270, i32 0, i32 3
  %272 = getelementptr inbounds %struct.osal_mmap, ptr %271, i32 0, i32 2
  %273 = load i64, ptr %272, align 8, !tbaa !24
  %274 = icmp eq i64 %269, %273
  br i1 %274, label %275, label %290

275:                                              ; preds = %268
  %276 = load i64, ptr %18, align 8, !tbaa !23
  %277 = load ptr, ptr %7, align 8, !tbaa !5
  %278 = getelementptr inbounds %struct.MDBX_env, ptr %277, i32 0, i32 3
  %279 = getelementptr inbounds %struct.osal_mmap, ptr %278, i32 0, i32 3
  %280 = load i64, ptr %279, align 8, !tbaa !11
  %281 = icmp eq i64 %276, %280
  br i1 %281, label %282, label %290

282:                                              ; preds = %275
  %283 = load i64, ptr %18, align 8, !tbaa !23
  %284 = load ptr, ptr %7, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.MDBX_env, ptr %284, i32 0, i32 3
  %286 = getelementptr inbounds %struct.osal_mmap, ptr %285, i32 0, i32 4
  %287 = load i64, ptr %286, align 8, !tbaa !30
  %288 = icmp eq i64 %283, %287
  br i1 %288, label %289, label %290

289:                                              ; preds = %282
  br label %867

290:                                              ; preds = %282, %275, %268
  %291 = load ptr, ptr %7, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.MDBX_env, ptr %291, i32 0, i32 1
  %293 = load i32, ptr %292, align 4, !tbaa !29
  %294 = and i32 %293, 2097152
  %295 = icmp eq i32 %294, 0
  br i1 %295, label %296, label %411

296:                                              ; preds = %290
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #11
  %297 = load ptr, ptr %7, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.MDBX_env, ptr %297, i32 0, i32 6
  %299 = getelementptr inbounds %struct.osal_mmap, ptr %298, i32 0, i32 0
  %300 = load ptr, ptr %299, align 8, !tbaa !27
  store ptr %300, ptr %21, align 8, !tbaa !5
  %301 = load i32, ptr %11, align 4, !tbaa !9
  %302 = icmp eq i32 %301, 2
  br i1 %302, label %303, label %407

303:                                              ; preds = %296
  %304 = load i64, ptr %17, align 8, !tbaa !23
  %305 = load ptr, ptr %7, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.MDBX_env, ptr %305, i32 0, i32 3
  %307 = getelementptr inbounds %struct.osal_mmap, ptr %306, i32 0, i32 2
  %308 = load i64, ptr %307, align 8, !tbaa !24
  %309 = icmp ne i64 %304, %308
  br i1 %309, label %310, label %407

310:                                              ; preds = %303
  %311 = load i32, ptr %20, align 4, !tbaa !9
  %312 = or i32 %311, 768
  store i32 %312, ptr %20, align 4, !tbaa !9
  %313 = load ptr, ptr %21, align 8, !tbaa !5
  %314 = icmp ne ptr %313, null
  br i1 %314, label %315, label %406

315:                                              ; preds = %310
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #11
  %316 = load ptr, ptr %7, align 8, !tbaa !5
  %317 = call i32 @lck_rdt_lock(ptr noundef %316)
  store i32 %317, ptr %22, align 4, !tbaa !9
  %318 = load i32, ptr %22, align 4, !tbaa !9
  %319 = icmp ne i32 %318, -1
  br i1 %319, label %320, label %323

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

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

331:                                              ; preds = %323
  %332 = load i32, ptr %22, align 4, !tbaa !9
  store i32 %332, ptr %12, align 4, !tbaa !9
  store i32 24, ptr %13, align 4
  br label %403

333:                                              ; preds = %323
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #11
  %334 = load ptr, ptr %21, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.shared_lck, ptr %334, i32 0, i32 20
  %336 = call i32 @atomic_load32(ptr noundef %335, i32 noundef 1)
  %337 = zext i32 %336 to i64
  store i64 %337, ptr %23, align 8, !tbaa !23
  br label %338

338:                                              ; preds = %333
  %339 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %340 = zext i8 %339 to i32
  %341 = and i32 %340, 1
  %342 = icmp ne i32 %341, 0
  %343 = xor i1 %342, true
  %344 = xor i1 %343, true
  %345 = zext i1 %344 to i32
  %346 = sext i32 %345 to i64
  %347 = call i64 @llvm.expect.i64(i64 %346, i64 1)
  %348 = icmp ne i64 %347, 0
  br i1 %348, label %349, label %365

349:                                              ; preds = %338
  br label %350

350:                                              ; preds = %349
  %351 = load i32, ptr %11, align 4, !tbaa !9
  %352 = icmp eq i32 %351, 2
  %353 = xor i1 %352, true
  %354 = xor i1 %353, true
  %355 = xor i1 %354, true
  %356 = zext i1 %355 to i32
  %357 = sext i32 %356 to i64
  %358 = call i64 @llvm.expect.i64(i64 %357, i64 0)
  %359 = icmp ne i64 %358, 0
  br i1 %359, label %360, label %362

360:                                              ; preds = %350
  %361 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %361, ptr noundef @.str.14, ptr noundef @__func__.dxb_resize, i32 noundef 200) #13
  unreachable

362:                                              ; preds = %350
  br label %363

363:                                              ; preds = %362
  br label %364

364:                                              ; preds = %363
  br label %365

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

366:                                              ; preds = %365
  br label %367

367:                                              ; preds = %366
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #11
  store i64 0, ptr %24, align 8, !tbaa !23
  br label %368

368:                                              ; preds = %398, %367
  %369 = load i64, ptr %24, align 8, !tbaa !23
  %370 = load i64, ptr %23, align 8, !tbaa !23
  %371 = icmp ult i64 %369, %370
  br i1 %371, label %373, label %372

372:                                              ; preds = %368
  store i32 29, ptr %13, align 4
  br label %401

373:                                              ; preds = %368
  %374 = load ptr, ptr %21, align 8, !tbaa !5
  %375 = getelementptr inbounds %struct.shared_lck, ptr %374, i32 0, i32 23
  %376 = load i64, ptr %24, align 8, !tbaa !23
  %377 = getelementptr inbounds [0 x %struct.reader_slot], ptr %375, i64 0, i64 %376
  %378 = getelementptr inbounds %struct.reader_slot, ptr %377, i32 0, i32 2
  %379 = load volatile i32, ptr %378, align 16, !tbaa !27
  %380 = load ptr, ptr %7, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.MDBX_env, ptr %380, i32 0, i32 20
  %382 = load i32, ptr %381, align 4, !tbaa !31
  %383 = icmp eq i32 %379, %382
  br i1 %383, label %384, label %397

384:                                              ; preds = %373
  %385 = load ptr, ptr %21, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.shared_lck, ptr %385, i32 0, i32 23
  %387 = load i64, ptr %24, align 8, !tbaa !23
  %388 = getelementptr inbounds [0 x %struct.reader_slot], ptr %386, i64 0, i64 %387
  %389 = getelementptr inbounds %struct.reader_slot, ptr %388, i32 0, i32 1
  %390 = load volatile i64, ptr %389, align 8, !tbaa !27
  %391 = call i64 @osal_thread_self()
  %392 = icmp ne i64 %390, %391
  br i1 %392, label %393, label %397

393:                                              ; preds = %384
  %394 = load ptr, ptr %7, align 8, !tbaa !5
  call void @lck_rdt_unlock(ptr noundef %394)
  %395 = load i32, ptr %20, align 4, !tbaa !9
  %396 = and i32 %395, -769
  store i32 %396, ptr %20, align 4, !tbaa !9
  store i32 29, ptr %13, align 4
  br label %401

397:                                              ; preds = %384, %373
  br label %398

398:                                              ; preds = %397
  %399 = load i64, ptr %24, align 8, !tbaa !23
  %400 = add i64 %399, 1
  store i64 %400, ptr %24, align 8, !tbaa !23
  br label %368, !llvm.loop !32

401:                                              ; preds = %393, %372
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #11
  br label %402

402:                                              ; preds = %401
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #11
  store i32 0, ptr %13, align 4
  br label %403

403:                                              ; preds = %402, %331
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #11
  %404 = load i32, ptr %13, align 4
  switch i32 %404, label %408 [
    i32 0, label %405
  ]

405:                                              ; preds = %403
  br label %406

406:                                              ; preds = %405, %310
  br label %407

407:                                              ; preds = %406, %303, %296
  store i32 0, ptr %13, align 4
  br label %408

408:                                              ; preds = %407, %403
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #11
  %409 = load i32, ptr %13, align 4
  switch i32 %409, label %1193 [
    i32 0, label %410
    i32 24, label %867
  ]

410:                                              ; preds = %408
  br label %411

411:                                              ; preds = %410, %290
  %412 = load i32, ptr %20, align 4, !tbaa !9
  %413 = and i32 %412, 768
  %414 = icmp ne i32 %413, 0
  br i1 %414, label %415, label %416

415:                                              ; preds = %411
  br label %420

416:                                              ; preds = %411
  %417 = load ptr, ptr %7, align 8, !tbaa !5
  %418 = load i64, ptr %18, align 8, !tbaa !23
  %419 = call i32 @bytes2pgno(ptr noundef %417, i64 noundef %418) #12
  br label %420

420:                                              ; preds = %416, %415
  %421 = phi i32 [ 0, %415 ], [ %419, %416 ]
  store i32 %421, ptr %25, align 4, !tbaa !9
  %422 = load i32, ptr %20, align 4, !tbaa !9
  %423 = and i32 %422, 768
  %424 = icmp ne i32 %423, 0
  br i1 %424, label %425, label %465

425:                                              ; preds = %420
  %426 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mincore_clean_cache(ptr noundef %426)
  %427 = load ptr, ptr %7, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.MDBX_env, ptr %427, i32 0, i32 1
  %429 = load i32, ptr %428, align 4, !tbaa !29
  %430 = and i32 %429, 524288
  %431 = icmp ne i32 %430, 0
  br i1 %431, label %432, label %464

432:                                              ; preds = %425
  %433 = load ptr, ptr %7, align 8, !tbaa !5
  %434 = getelementptr inbounds %struct.MDBX_env, ptr %433, i32 0, i32 7
  %435 = load ptr, ptr %434, align 8, !tbaa !34
  %436 = getelementptr inbounds %struct.shared_lck, ptr %435, i32 0, i32 14
  %437 = load volatile i64, ptr %436, align 8, !tbaa !27
  %438 = icmp ne i64 %437, 0
  br i1 %438, label %439, label %464

439:                                              ; preds = %432
  %440 = load ptr, ptr %7, align 8, !tbaa !5
  %441 = getelementptr inbounds %struct.MDBX_env, ptr %440, i32 0, i32 7
  %442 = load ptr, ptr %441, align 8, !tbaa !34
  %443 = getelementptr inbounds %struct.shared_lck, ptr %442, i32 0, i32 9
  %444 = getelementptr inbounds %struct.pgops, ptr %443, i32 0, i32 8
  %445 = load volatile i64, ptr %444, align 64, !tbaa !27
  %446 = add i64 %445, 1
  store volatile i64 %446, ptr %444, align 64, !tbaa !27
  %447 = load ptr, ptr %7, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.MDBX_env, ptr %447, i32 0, i32 3
  %449 = load ptr, ptr %7, align 8, !tbaa !5
  %450 = load i32, ptr %8, align 4, !tbaa !9
  %451 = zext i32 %450 to i64
  %452 = call i64 @pgno_align2os_bytes(ptr noundef %449, i64 noundef %451) #12
  %453 = call i32 @osal_msync(ptr noundef %448, i64 noundef 0, i64 noundef %452, i32 noundef 0)
  store i32 %453, ptr %12, align 4, !tbaa !9
  %454 = load i32, ptr %12, align 4, !tbaa !9
  %455 = icmp ne i32 %454, 0
  %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 %463

462:                                              ; preds = %439
  br label %867

463:                                              ; preds = %439
  br label %464

464:                                              ; preds = %463, %432, %425
  br label %465

465:                                              ; preds = %464, %420
  %466 = load ptr, ptr %7, align 8, !tbaa !5
  %467 = load i32, ptr %25, align 4, !tbaa !9
  %468 = load i64, ptr %18, align 8, !tbaa !23
  call void @munlock_after(ptr noundef %466, i32 noundef %467, i64 noundef %468)
  %469 = load i64, ptr %18, align 8, !tbaa !23
  %470 = load i64, ptr %14, align 8, !tbaa !23
  %471 = icmp ult i64 %469, %470
  br i1 %471, label %472, label %639

472:                                              ; preds = %465
  %473 = load i32, ptr %11, align 4, !tbaa !9
  %474 = icmp ugt i32 %473, 0
  br i1 %474, label %475, label %639

475:                                              ; preds = %472
  br label %476

476:                                              ; preds = %475
  %477 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !28
  %478 = zext i8 %477 to i32
  %479 = icmp sle i32 3, %478
  %480 = xor i1 %479, true
  %481 = xor i1 %480, true
  %482 = zext i1 %481 to i32
  %483 = sext i32 %482 to i64
  %484 = call i64 @llvm.expect.i64(i64 %483, i64 0)
  %485 = icmp ne i64 %484, 0
  br i1 %485, label %486, label %498

486:                                              ; preds = %476
  %487 = load ptr, ptr %7, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.MDBX_env, ptr %487, i32 0, i32 1
  %489 = load i32, ptr %488, align 4, !tbaa !29
  %490 = and i32 %489, 524288
  %491 = icmp ne i32 %490, 0
  %492 = zext i1 %491 to i64
  %493 = select i1 %491, ptr @.str.16, ptr @.str.17
  %494 = load i32, ptr %9, align 4, !tbaa !9
  %495 = load ptr, ptr %7, align 8, !tbaa !5
  %496 = load i64, ptr %14, align 8, !tbaa !23
  %497 = call i32 @bytes2pgno(ptr noundef %495, i64 noundef %496) #12
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 3, ptr noundef @__func__.dxb_resize, i32 noundef 232, ptr noundef @.str.15, ptr noundef %493, i32 noundef %494, i32 noundef %497)
  br label %498

498:                                              ; preds = %486, %476
  br label %499

499:                                              ; preds = %498
  br label %500

500:                                              ; preds = %499
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #11
  %501 = load ptr, ptr %7, align 8, !tbaa !5
  %502 = getelementptr inbounds %struct.MDBX_env, ptr %501, i32 0, i32 7
  %503 = load ptr, ptr %502, align 8, !tbaa !34
  %504 = getelementptr inbounds %struct.shared_lck, ptr %503, i32 0, i32 7
  %505 = getelementptr inbounds [2 x %union.mdbx_atomic_uint32_t], ptr %504, i64 0, i64 1
  %506 = call i32 @atomic_load32(ptr noundef %505, i32 noundef 0)
  store i32 %506, ptr %26, align 4, !tbaa !9
  store i32 -1, ptr %12, align 4, !tbaa !9
  %507 = load ptr, ptr %7, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.MDBX_env, ptr %507, i32 0, i32 1
  %509 = load i32, ptr %508, align 4, !tbaa !29
  %510 = and i32 %509, 524288
  %511 = icmp ne i32 %510, 0
  br i1 %511, label %512, label %533

512:                                              ; preds = %500
  %513 = load ptr, ptr %7, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.MDBX_env, ptr %513, i32 0, i32 3
  %515 = getelementptr inbounds %struct.osal_mmap, ptr %514, i32 0, i32 0
  %516 = load ptr, ptr %515, align 8, !tbaa !27
  %517 = ptrtoint ptr %516 to i64
  %518 = load i64, ptr %18, align 8, !tbaa !23
  %519 = add nsw i64 %517, %518
  %520 = inttoptr i64 %519 to ptr
  %521 = load i64, ptr %14, align 8, !tbaa !23
  %522 = load i64, ptr %18, align 8, !tbaa !23
  %523 = sub i64 %521, %522
  %524 = call i32 @madvise(ptr noundef %520, i64 noundef %523, i32 noundef 9) #11
  %525 = icmp ne i32 %524, 0
  br i1 %525, label %526, label %530

526:                                              ; preds = %512
  %527 = call ptr @__errno_location() #14
  %528 = load i32, ptr %527, align 4, !tbaa !9
  %529 = call i32 @ignore_enosys(i32 noundef %528)
  br label %531

530:                                              ; preds = %512
  br label %531

531:                                              ; preds = %530, %526
  %532 = phi i32 [ %529, %526 ], [ 0, %530 ]
  store i32 %532, ptr %12, align 4, !tbaa !9
  br label %533

533:                                              ; preds = %531, %500
  %534 = load i32, ptr %12, align 4, !tbaa !9
  %535 = icmp eq i32 %534, -1
  br i1 %535, label %536, label %557

536:                                              ; preds = %533
  %537 = load ptr, ptr %7, align 8, !tbaa !5
  %538 = getelementptr inbounds %struct.MDBX_env, ptr %537, i32 0, i32 3
  %539 = getelementptr inbounds %struct.osal_mmap, ptr %538, i32 0, i32 0
  %540 = load ptr, ptr %539, align 8, !tbaa !27
  %541 = ptrtoint ptr %540 to i64
  %542 = load i64, ptr %18, align 8, !tbaa !23
  %543 = add nsw i64 %541, %542
  %544 = inttoptr i64 %543 to ptr
  %545 = load i64, ptr %14, align 8, !tbaa !23
  %546 = load i64, ptr %18, align 8, !tbaa !23
  %547 = sub i64 %545, %546
  %548 = call i32 @madvise(ptr noundef %544, i64 noundef %547, i32 noundef 4) #11
  %549 = icmp ne i32 %548, 0
  br i1 %549, label %550, label %554

550:                                              ; preds = %536
  %551 = call ptr @__errno_location() #14
  %552 = load i32, ptr %551, align 4, !tbaa !9
  %553 = call i32 @ignore_enosys(i32 noundef %552)
  br label %555

554:                                              ; preds = %536
  br label %555

555:                                              ; preds = %554, %550
  %556 = phi i32 [ %553, %550 ], [ 0, %554 ]
  store i32 %556, ptr %12, align 4, !tbaa !9
  br label %557

557:                                              ; preds = %555, %533
  %558 = load i32, ptr %12, align 4, !tbaa !9
  %559 = icmp ne i32 %558, -1
  br i1 %559, label %560, label %563

560:                                              ; preds = %557
  %561 = load i32, ptr %12, align 4, !tbaa !9
  %562 = icmp ne i32 %561, 0
  br label %563

563:                                              ; preds = %560, %557
  %564 = phi i1 [ false, %557 ], [ %562, %560 ]
  %565 = xor i1 %564, true
  %566 = xor i1 %565, true
  %567 = zext i1 %566 to i32
  %568 = sext i32 %567 to i64
  %569 = call i64 @llvm.expect.i64(i64 %568, i64 0)
  %570 = icmp ne i64 %569, 0
  br i1 %570, label %571, label %629

571:                                              ; preds = %563
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #11
  %572 = load ptr, ptr %7, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.MDBX_env, ptr %572, i32 0, i32 7
  %574 = load ptr, ptr %573, align 8, !tbaa !34
  %575 = getelementptr inbounds %struct.shared_lck, ptr %574, i32 0, i32 7
  %576 = getelementptr inbounds [2 x %union.mdbx_atomic_uint32_t], ptr %575, i64 0, i64 0
  %577 = call i32 @atomic_load32(ptr noundef %576, i32 noundef 0)
  store i32 %577, ptr %27, align 4, !tbaa !9
  %578 = load i32, ptr %12, align 4, !tbaa !9
  %579 = icmp eq i32 %578, 22
  br i1 %579, label %580, label %603

580:                                              ; preds = %571
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #11
  %581 = load i32, ptr %27, align 4, !tbaa !9
  %582 = load i32, ptr %26, align 4, !tbaa !9
  %583 = sub i32 %581, %582
  %584 = icmp ne i32 %583, 0
  %585 = zext i1 %584 to i64
  %586 = select i1 %584, i32 3, i32 2
  store i32 %586, ptr %28, align 4, !tbaa !9
  %587 = load i32, ptr %28, align 4, !tbaa !9
  %588 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !28
  %589 = zext i8 %588 to i32
  %590 = icmp sle i32 %587, %589
  %591 = xor i1 %590, true
  %592 = xor i1 %591, true
  %593 = zext i1 %592 to i32
  %594 = sext i32 %593 to i64
  %595 = call i64 @llvm.expect.i64(i64 %594, i64 0)
  %596 = icmp ne i64 %595, 0
  br i1 %596, label %597, label %602

597:                                              ; preds = %580
  %598 = load i32, ptr %28, align 4, !tbaa !9
  %599 = load i32, ptr %12, align 4, !tbaa !9
  %600 = load i32, ptr %27, align 4, !tbaa !9
  %601 = load i32, ptr %26, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef %598, ptr noundef @__func__.dxb_resize, i32 noundef 258, ptr noundef @.str.18, ptr noundef @.str.19, i32 noundef %599, i32 noundef %600, i32 noundef %601)
  br label %602

602:                                              ; preds = %597, %580
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #11
  br label %625

603:                                              ; preds = %571
  br label %604

604:                                              ; preds = %603
  %605 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !28
  %606 = zext i8 %605 to i32
  %607 = icmp sle i32 1, %606
  %608 = xor i1 %607, true
  %609 = xor i1 %608, true
  %610 = zext i1 %609 to i32
  %611 = sext i32 %610 to i64
  %612 = call i64 @llvm.expect.i64(i64 %611, i64 0)
  %613 = icmp ne i64 %612, 0
  br i1 %613, label %614, label %622

614:                                              ; preds = %604
  %615 = load i64, ptr %18, align 8, !tbaa !23
  %616 = load i64, ptr %14, align 8, !tbaa !23
  %617 = load i64, ptr %18, align 8, !tbaa !23
  %618 = sub i64 %616, %617
  %619 = load i32, ptr %27, align 4, !tbaa !9
  %620 = load i32, ptr %26, align 4, !tbaa !9
  %621 = load i32, ptr %12, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.dxb_resize, i32 noundef 264, ptr noundef @.str.20, ptr noundef @.str.21, ptr noundef @.str.17, i64 noundef %615, i64 noundef %618, i32 noundef %619, i32 noundef %620, i32 noundef %621)
  br label %622

622:                                              ; preds = %614, %604
  br label %623

623:                                              ; preds = %622
  br label %624

624:                                              ; preds = %623
  store i32 24, ptr %13, align 4
  br label %626

625:                                              ; preds = %602
  store i32 0, ptr %13, align 4
  br label %626

626:                                              ; preds = %625, %624
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #11
  %627 = load i32, ptr %13, align 4
  switch i32 %627, label %636 [
    i32 0, label %628
  ]

628:                                              ; preds = %626
  br label %635

629:                                              ; preds = %563
  %630 = load i32, ptr %9, align 4, !tbaa !9
  %631 = load ptr, ptr %7, align 8, !tbaa !5
  %632 = getelementptr inbounds %struct.MDBX_env, ptr %631, i32 0, i32 7
  %633 = load ptr, ptr %632, align 8, !tbaa !34
  %634 = getelementptr inbounds %struct.shared_lck, ptr %633, i32 0, i32 16
  store volatile i32 %630, ptr %634, align 8, !tbaa !27
  br label %635

635:                                              ; preds = %629, %628
  store i32 0, ptr %13, align 4
  br label %636

636:                                              ; preds = %635, %626
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #11
  %637 = load i32, ptr %13, align 4
  switch i32 %637, label %1193 [
    i32 0, label %638
    i32 24, label %867
  ]

638:                                              ; preds = %636
  br label %639

639:                                              ; preds = %638, %472, %465
  %640 = load i32, ptr %20, align 4, !tbaa !9
  %641 = load ptr, ptr %7, align 8, !tbaa !5
  %642 = getelementptr inbounds %struct.MDBX_env, ptr %641, i32 0, i32 3
  %643 = load i64, ptr %18, align 8, !tbaa !23
  %644 = load i64, ptr %17, align 8, !tbaa !23
  %645 = call i32 @osal_mresize(i32 noundef %640, ptr noundef %642, i64 noundef %643, i64 noundef %644)
  store i32 %645, ptr %12, align 4, !tbaa !9
  br label %646

646:                                              ; preds = %639
  %647 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %648 = zext i8 %647 to i32
  %649 = and i32 %648, 1
  %650 = icmp ne i32 %649, 0
  %651 = xor i1 %650, true
  %652 = xor i1 %651, true
  %653 = zext i1 %652 to i32
  %654 = sext i32 %653 to i64
  %655 = call i64 @llvm.expect.i64(i64 %654, i64 1)
  %656 = icmp ne i64 %655, 0
  br i1 %656, label %657, label %680

657:                                              ; preds = %646
  br label %658

658:                                              ; preds = %657
  %659 = load ptr, ptr %7, align 8, !tbaa !5
  %660 = getelementptr inbounds %struct.MDBX_env, ptr %659, i32 0, i32 3
  %661 = getelementptr inbounds %struct.osal_mmap, ptr %660, i32 0, i32 2
  %662 = load i64, ptr %661, align 8, !tbaa !24
  %663 = load ptr, ptr %7, align 8, !tbaa !5
  %664 = getelementptr inbounds %struct.MDBX_env, ptr %663, i32 0, i32 3
  %665 = getelementptr inbounds %struct.osal_mmap, ptr %664, i32 0, i32 3
  %666 = load i64, ptr %665, align 8, !tbaa !11
  %667 = icmp uge i64 %662, %666
  %668 = xor i1 %667, true
  %669 = xor i1 %668, true
  %670 = xor i1 %669, true
  %671 = zext i1 %670 to i32
  %672 = sext i32 %671 to i64
  %673 = call i64 @llvm.expect.i64(i64 %672, i64 0)
  %674 = icmp ne i64 %673, 0
  br i1 %674, label %675, label %677

675:                                              ; preds = %658
  %676 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %676, ptr noundef @.str.22, ptr noundef @__func__.dxb_resize, i32 noundef 272) #13
  unreachable

677:                                              ; preds = %658
  br label %678

678:                                              ; preds = %677
  br label %679

679:                                              ; preds = %678
  br label %680

680:                                              ; preds = %679, %646
  br label %681

681:                                              ; preds = %680
  br label %682

682:                                              ; preds = %681
  %683 = load i32, ptr %12, align 4, !tbaa !9
  %684 = icmp eq i32 %683, 0
  br i1 %684, label %685, label %866

685:                                              ; preds = %682
  br label %686

686:                                              ; preds = %685
  %687 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %688 = zext i8 %687 to i32
  %689 = and i32 %688, 1
  %690 = icmp ne i32 %689, 0
  %691 = xor i1 %690, true
  %692 = xor i1 %691, true
  %693 = zext i1 %692 to i32
  %694 = sext i32 %693 to i64
  %695 = call i64 @llvm.expect.i64(i64 %694, i64 1)
  %696 = icmp ne i64 %695, 0
  br i1 %696, label %697, label %717

697:                                              ; preds = %686
  br label %698

698:                                              ; preds = %697
  %699 = load i64, ptr %17, align 8, !tbaa !23
  %700 = load ptr, ptr %7, align 8, !tbaa !5
  %701 = getelementptr inbounds %struct.MDBX_env, ptr %700, i32 0, i32 3
  %702 = getelementptr inbounds %struct.osal_mmap, ptr %701, i32 0, i32 2
  %703 = load i64, ptr %702, align 8, !tbaa !24
  %704 = icmp eq i64 %699, %703
  %705 = xor i1 %704, true
  %706 = xor i1 %705, true
  %707 = xor i1 %706, true
  %708 = zext i1 %707 to i32
  %709 = sext i32 %708 to i64
  %710 = call i64 @llvm.expect.i64(i64 %709, i64 0)
  %711 = icmp ne i64 %710, 0
  br i1 %711, label %712, label %714

712:                                              ; preds = %698
  %713 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %713, ptr noundef @.str.23, ptr noundef @__func__.dxb_resize, i32 noundef 275) #13
  unreachable

714:                                              ; preds = %698
  br label %715

715:                                              ; preds = %714
  br label %716

716:                                              ; preds = %715
  br label %717

717:                                              ; preds = %716, %686
  br label %718

718:                                              ; preds = %717
  br label %719

719:                                              ; preds = %718
  br label %720

720:                                              ; preds = %719
  %721 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %722 = zext i8 %721 to i32
  %723 = and i32 %722, 1
  %724 = icmp ne i32 %723, 0
  %725 = xor i1 %724, true
  %726 = xor i1 %725, true
  %727 = zext i1 %726 to i32
  %728 = sext i32 %727 to i64
  %729 = call i64 @llvm.expect.i64(i64 %728, i64 1)
  %730 = icmp ne i64 %729, 0
  br i1 %730, label %731, label %751

731:                                              ; preds = %720
  br label %732

732:                                              ; preds = %731
  %733 = load i64, ptr %18, align 8, !tbaa !23
  %734 = load ptr, ptr %7, align 8, !tbaa !5
  %735 = getelementptr inbounds %struct.MDBX_env, ptr %734, i32 0, i32 3
  %736 = getelementptr inbounds %struct.osal_mmap, ptr %735, i32 0, i32 4
  %737 = load i64, ptr %736, align 8, !tbaa !30
  %738 = icmp ule i64 %733, %737
  %739 = xor i1 %738, true
  %740 = xor i1 %739, true
  %741 = xor i1 %740, true
  %742 = zext i1 %741 to i32
  %743 = sext i32 %742 to i64
  %744 = call i64 @llvm.expect.i64(i64 %743, i64 0)
  %745 = icmp ne i64 %744, 0
  br i1 %745, label %746, label %748

746:                                              ; preds = %732
  %747 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %747, ptr noundef @.str.24, ptr noundef @__func__.dxb_resize, i32 noundef 276) #13
  unreachable

748:                                              ; preds = %732
  br label %749

749:                                              ; preds = %748
  br label %750

750:                                              ; preds = %749
  br label %751

751:                                              ; preds = %750, %720
  br label %752

752:                                              ; preds = %751
  br label %753

753:                                              ; preds = %752
  %754 = load i32, ptr %11, align 4, !tbaa !9
  %755 = icmp eq i32 %754, 2
  br i1 %755, label %756, label %791

756:                                              ; preds = %753
  br label %757

757:                                              ; preds = %756
  %758 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %759 = zext i8 %758 to i32
  %760 = and i32 %759, 1
  %761 = icmp ne i32 %760, 0
  %762 = xor i1 %761, true
  %763 = xor i1 %762, true
  %764 = zext i1 %763 to i32
  %765 = sext i32 %764 to i64
  %766 = call i64 @llvm.expect.i64(i64 %765, i64 1)
  %767 = icmp ne i64 %766, 0
  br i1 %767, label %768, label %788

768:                                              ; preds = %757
  br label %769

769:                                              ; preds = %768
  %770 = load i64, ptr %18, align 8, !tbaa !23
  %771 = load ptr, ptr %7, align 8, !tbaa !5
  %772 = getelementptr inbounds %struct.MDBX_env, ptr %771, i32 0, i32 3
  %773 = getelementptr inbounds %struct.osal_mmap, ptr %772, i32 0, i32 3
  %774 = load i64, ptr %773, align 8, !tbaa !11
  %775 = icmp eq i64 %770, %774
  %776 = xor i1 %775, true
  %777 = xor i1 %776, true
  %778 = xor i1 %777, true
  %779 = zext i1 %778 to i32
  %780 = sext i32 %779 to i64
  %781 = call i64 @llvm.expect.i64(i64 %780, i64 0)
  %782 = icmp ne i64 %781, 0
  br i1 %782, label %783, label %785

783:                                              ; preds = %769
  %784 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %784, ptr noundef @.str.25, ptr noundef @__func__.dxb_resize, i32 noundef 278) #13
  unreachable

785:                                              ; preds = %769
  br label %786

786:                                              ; preds = %785
  br label %787

787:                                              ; preds = %786
  br label %788

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

789:                                              ; preds = %788
  br label %790

790:                                              ; preds = %789
  br label %826

791:                                              ; preds = %753
  br label %792

792:                                              ; preds = %791
  %793 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %794 = zext i8 %793 to i32
  %795 = and i32 %794, 1
  %796 = icmp ne i32 %795, 0
  %797 = xor i1 %796, true
  %798 = xor i1 %797, true
  %799 = zext i1 %798 to i32
  %800 = sext i32 %799 to i64
  %801 = call i64 @llvm.expect.i64(i64 %800, i64 1)
  %802 = icmp ne i64 %801, 0
  br i1 %802, label %803, label %823

803:                                              ; preds = %792
  br label %804

804:                                              ; preds = %803
  %805 = load i64, ptr %18, align 8, !tbaa !23
  %806 = load ptr, ptr %7, align 8, !tbaa !5
  %807 = getelementptr inbounds %struct.MDBX_env, ptr %806, i32 0, i32 3
  %808 = getelementptr inbounds %struct.osal_mmap, ptr %807, i32 0, i32 3
  %809 = load i64, ptr %808, align 8, !tbaa !11
  %810 = icmp ule i64 %805, %809
  %811 = xor i1 %810, true
  %812 = xor i1 %811, true
  %813 = xor i1 %812, true
  %814 = zext i1 %813 to i32
  %815 = sext i32 %814 to i64
  %816 = call i64 @llvm.expect.i64(i64 %815, i64 0)
  %817 = icmp ne i64 %816, 0
  br i1 %817, label %818, label %820

818:                                              ; preds = %804
  %819 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %819, ptr noundef @.str.26, ptr noundef @__func__.dxb_resize, i32 noundef 280) #13
  unreachable

820:                                              ; preds = %804
  br label %821

821:                                              ; preds = %820
  br label %822

822:                                              ; preds = %821
  br label %823

823:                                              ; preds = %822, %792
  br label %824

824:                                              ; preds = %823
  br label %825

825:                                              ; preds = %824
  br label %826

826:                                              ; preds = %825, %790
  %827 = load i32, ptr %9, align 4, !tbaa !9
  %828 = load ptr, ptr %7, align 8, !tbaa !5
  %829 = getelementptr inbounds %struct.MDBX_env, ptr %828, i32 0, i32 7
  %830 = load ptr, ptr %829, align 8, !tbaa !34
  %831 = getelementptr inbounds %struct.shared_lck, ptr %830, i32 0, i32 16
  store volatile i32 %827, ptr %831, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 1, ptr %29) #11
  %832 = load ptr, ptr %7, align 8, !tbaa !5
  %833 = getelementptr inbounds %struct.MDBX_env, ptr %832, i32 0, i32 1
  %834 = load i32, ptr %833, align 4, !tbaa !29
  %835 = and i32 %834, 8388608
  %836 = icmp ne i32 %835, 0
  br i1 %836, label %843, label %837

837:                                              ; preds = %826
  %838 = load i64, ptr %18, align 8, !tbaa !23
  %839 = load i64, ptr %14, align 8, !tbaa !23
  %840 = sub nsw i64 0, %839
  %841 = call i32 @mdbx_is_readahead_reasonable(i64 noundef %838, i64 noundef %840)
  %842 = icmp ne i32 %841, 0
  br label %843

843:                                              ; preds = %837, %826
  %844 = phi i1 [ false, %826 ], [ %842, %837 ]
  %845 = zext i1 %844 to i8
  store i8 %845, ptr %29, align 1, !tbaa !35
  call void @llvm.lifetime.start.p0(i64 1, ptr %30) #11
  %846 = load i64, ptr %17, align 8, !tbaa !23
  %847 = load i64, ptr %15, align 8, !tbaa !23
  %848 = icmp ne i64 %846, %847
  br i1 %848, label %856, label %849

849:                                              ; preds = %843
  %850 = load ptr, ptr %7, align 8, !tbaa !5
  %851 = getelementptr inbounds %struct.MDBX_env, ptr %850, i32 0, i32 3
  %852 = getelementptr inbounds %struct.osal_mmap, ptr %851, i32 0, i32 0
  %853 = load ptr, ptr %852, align 8, !tbaa !27
  %854 = load ptr, ptr %19, align 8, !tbaa !5
  %855 = icmp ne ptr %853, %854
  br label %856

856:                                              ; preds = %849, %843
  %857 = phi i1 [ true, %843 ], [ %855, %849 ]
  %858 = zext i1 %857 to i8
  store i8 %858, ptr %30, align 1, !tbaa !35
  %859 = load ptr, ptr %7, align 8, !tbaa !5
  %860 = load i32, ptr %9, align 4, !tbaa !9
  %861 = load i8, ptr %29, align 1, !tbaa !35, !range !36, !noundef !37
  %862 = trunc i8 %861 to i1
  %863 = load i8, ptr %30, align 1, !tbaa !35, !range !36, !noundef !37
  %864 = trunc i8 %863 to i1
  %865 = call i32 @dxb_set_readahead(ptr noundef %859, i32 noundef %860, i1 noundef zeroext %862, i1 noundef zeroext %864)
  store i32 %865, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 1, ptr %30) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %29) #11
  br label %866

866:                                              ; preds = %856, %682
  br label %867

867:                                              ; preds = %866, %636, %462, %408, %289
  %868 = load i32, ptr %12, align 4, !tbaa !9
  %869 = icmp eq i32 %868, 0
  br i1 %869, label %870, label %1064

870:                                              ; preds = %867
  br label %871

871:                                              ; preds = %870
  %872 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %873 = zext i8 %872 to i32
  %874 = and i32 %873, 1
  %875 = icmp ne i32 %874, 0
  %876 = xor i1 %875, true
  %877 = xor i1 %876, true
  %878 = zext i1 %877 to i32
  %879 = sext i32 %878 to i64
  %880 = call i64 @llvm.expect.i64(i64 %879, i64 1)
  %881 = icmp ne i64 %880, 0
  br i1 %881, label %882, label %905

882:                                              ; preds = %871
  br label %883

883:                                              ; preds = %882
  %884 = load ptr, ptr %7, align 8, !tbaa !5
  %885 = getelementptr inbounds %struct.MDBX_env, ptr %884, i32 0, i32 3
  %886 = getelementptr inbounds %struct.osal_mmap, ptr %885, i32 0, i32 2
  %887 = load i64, ptr %886, align 8, !tbaa !24
  %888 = load ptr, ptr %7, align 8, !tbaa !5
  %889 = getelementptr inbounds %struct.MDBX_env, ptr %888, i32 0, i32 3
  %890 = getelementptr inbounds %struct.osal_mmap, ptr %889, i32 0, i32 3
  %891 = load i64, ptr %890, align 8, !tbaa !11
  %892 = icmp uge i64 %887, %891
  %893 = xor i1 %892, true
  %894 = xor i1 %893, true
  %895 = xor i1 %894, true
  %896 = zext i1 %895 to i32
  %897 = sext i32 %896 to i64
  %898 = call i64 @llvm.expect.i64(i64 %897, i64 0)
  %899 = icmp ne i64 %898, 0
  br i1 %899, label %900, label %902

900:                                              ; preds = %883
  %901 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %901, ptr noundef @.str.22, ptr noundef @__func__.dxb_resize, i32 noundef 294) #13
  unreachable

902:                                              ; preds = %883
  br label %903

903:                                              ; preds = %902
  br label %904

904:                                              ; preds = %903
  br label %905

905:                                              ; preds = %904, %871
  br label %906

906:                                              ; preds = %905
  br label %907

907:                                              ; preds = %906
  br label %908

908:                                              ; preds = %907
  %909 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %910 = zext i8 %909 to i32
  %911 = and i32 %910, 1
  %912 = icmp ne i32 %911, 0
  %913 = xor i1 %912, true
  %914 = xor i1 %913, true
  %915 = zext i1 %914 to i32
  %916 = sext i32 %915 to i64
  %917 = call i64 @llvm.expect.i64(i64 %916, i64 1)
  %918 = icmp ne i64 %917, 0
  br i1 %918, label %919, label %939

919:                                              ; preds = %908
  br label %920

920:                                              ; preds = %919
  %921 = load i64, ptr %17, align 8, !tbaa !23
  %922 = load ptr, ptr %7, align 8, !tbaa !5
  %923 = getelementptr inbounds %struct.MDBX_env, ptr %922, i32 0, i32 3
  %924 = getelementptr inbounds %struct.osal_mmap, ptr %923, i32 0, i32 2
  %925 = load i64, ptr %924, align 8, !tbaa !24
  %926 = icmp eq i64 %921, %925
  %927 = xor i1 %926, true
  %928 = xor i1 %927, true
  %929 = xor i1 %928, true
  %930 = zext i1 %929 to i32
  %931 = sext i32 %930 to i64
  %932 = call i64 @llvm.expect.i64(i64 %931, i64 0)
  %933 = icmp ne i64 %932, 0
  br i1 %933, label %934, label %936

934:                                              ; preds = %920
  %935 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %935, ptr noundef @.str.23, ptr noundef @__func__.dxb_resize, i32 noundef 295) #13
  unreachable

936:                                              ; preds = %920
  br label %937

937:                                              ; preds = %936
  br label %938

938:                                              ; preds = %937
  br label %939

939:                                              ; preds = %938, %908
  br label %940

940:                                              ; preds = %939
  br label %941

941:                                              ; preds = %940
  br label %942

942:                                              ; preds = %941
  %943 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %944 = zext i8 %943 to i32
  %945 = and i32 %944, 1
  %946 = icmp ne i32 %945, 0
  %947 = xor i1 %946, true
  %948 = xor i1 %947, true
  %949 = zext i1 %948 to i32
  %950 = sext i32 %949 to i64
  %951 = call i64 @llvm.expect.i64(i64 %950, i64 1)
  %952 = icmp ne i64 %951, 0
  br i1 %952, label %953, label %973

953:                                              ; preds = %942
  br label %954

954:                                              ; preds = %953
  %955 = load i64, ptr %18, align 8, !tbaa !23
  %956 = load ptr, ptr %7, align 8, !tbaa !5
  %957 = getelementptr inbounds %struct.MDBX_env, ptr %956, i32 0, i32 3
  %958 = getelementptr inbounds %struct.osal_mmap, ptr %957, i32 0, i32 4
  %959 = load i64, ptr %958, align 8, !tbaa !30
  %960 = icmp ule i64 %955, %959
  %961 = xor i1 %960, true
  %962 = xor i1 %961, true
  %963 = xor i1 %962, true
  %964 = zext i1 %963 to i32
  %965 = sext i32 %964 to i64
  %966 = call i64 @llvm.expect.i64(i64 %965, i64 0)
  %967 = icmp ne i64 %966, 0
  br i1 %967, label %968, label %970

968:                                              ; preds = %954
  %969 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %969, ptr noundef @.str.24, ptr noundef @__func__.dxb_resize, i32 noundef 296) #13
  unreachable

970:                                              ; preds = %954
  br label %971

971:                                              ; preds = %970
  br label %972

972:                                              ; preds = %971
  br label %973

973:                                              ; preds = %972, %942
  br label %974

974:                                              ; preds = %973
  br label %975

975:                                              ; preds = %974
  %976 = load i32, ptr %11, align 4, !tbaa !9
  %977 = icmp eq i32 %976, 2
  br i1 %977, label %978, label %1013

978:                                              ; preds = %975
  br label %979

979:                                              ; preds = %978
  %980 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %981 = zext i8 %980 to i32
  %982 = and i32 %981, 1
  %983 = icmp ne i32 %982, 0
  %984 = xor i1 %983, true
  %985 = xor i1 %984, true
  %986 = zext i1 %985 to i32
  %987 = sext i32 %986 to i64
  %988 = call i64 @llvm.expect.i64(i64 %987, i64 1)
  %989 = icmp ne i64 %988, 0
  br i1 %989, label %990, label %1010

990:                                              ; preds = %979
  br label %991

991:                                              ; preds = %990
  %992 = load i64, ptr %18, align 8, !tbaa !23
  %993 = load ptr, ptr %7, align 8, !tbaa !5
  %994 = getelementptr inbounds %struct.MDBX_env, ptr %993, i32 0, i32 3
  %995 = getelementptr inbounds %struct.osal_mmap, ptr %994, i32 0, i32 3
  %996 = load i64, ptr %995, align 8, !tbaa !11
  %997 = icmp eq i64 %992, %996
  %998 = xor i1 %997, true
  %999 = xor i1 %998, true
  %1000 = xor i1 %999, true
  %1001 = zext i1 %1000 to i32
  %1002 = sext i32 %1001 to i64
  %1003 = call i64 @llvm.expect.i64(i64 %1002, i64 0)
  %1004 = icmp ne i64 %1003, 0
  br i1 %1004, label %1005, label %1007

1005:                                             ; preds = %991
  %1006 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %1006, ptr noundef @.str.25, ptr noundef @__func__.dxb_resize, i32 noundef 298) #13
  unreachable

1007:                                             ; preds = %991
  br label %1008

1008:                                             ; preds = %1007
  br label %1009

1009:                                             ; preds = %1008
  br label %1010

1010:                                             ; preds = %1009, %979
  br label %1011

1011:                                             ; preds = %1010
  br label %1012

1012:                                             ; preds = %1011
  br label %1048

1013:                                             ; preds = %975
  br label %1014

1014:                                             ; preds = %1013
  %1015 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %1016 = zext i8 %1015 to i32
  %1017 = and i32 %1016, 1
  %1018 = icmp ne i32 %1017, 0
  %1019 = xor i1 %1018, true
  %1020 = xor i1 %1019, true
  %1021 = zext i1 %1020 to i32
  %1022 = sext i32 %1021 to i64
  %1023 = call i64 @llvm.expect.i64(i64 %1022, i64 1)
  %1024 = icmp ne i64 %1023, 0
  br i1 %1024, label %1025, label %1045

1025:                                             ; preds = %1014
  br label %1026

1026:                                             ; preds = %1025
  %1027 = load i64, ptr %18, align 8, !tbaa !23
  %1028 = load ptr, ptr %7, align 8, !tbaa !5
  %1029 = getelementptr inbounds %struct.MDBX_env, ptr %1028, i32 0, i32 3
  %1030 = getelementptr inbounds %struct.osal_mmap, ptr %1029, i32 0, i32 3
  %1031 = load i64, ptr %1030, align 8, !tbaa !11
  %1032 = icmp ule i64 %1027, %1031
  %1033 = xor i1 %1032, true
  %1034 = xor i1 %1033, true
  %1035 = xor i1 %1034, true
  %1036 = zext i1 %1035 to i32
  %1037 = sext i32 %1036 to i64
  %1038 = call i64 @llvm.expect.i64(i64 %1037, i64 0)
  %1039 = icmp ne i64 %1038, 0
  br i1 %1039, label %1040, label %1042

1040:                                             ; preds = %1026
  %1041 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %1041, ptr noundef @.str.26, ptr noundef @__func__.dxb_resize, i32 noundef 300) #13
  unreachable

1042:                                             ; preds = %1026
  br label %1043

1043:                                             ; preds = %1042
  br label %1044

1044:                                             ; preds = %1043
  br label %1045

1045:                                             ; preds = %1044, %1014
  br label %1046

1046:                                             ; preds = %1045
  br label %1047

1047:                                             ; preds = %1046
  br label %1048

1048:                                             ; preds = %1047, %1012
  %1049 = load ptr, ptr %7, align 8, !tbaa !5
  %1050 = getelementptr inbounds %struct.MDBX_env, ptr %1049, i32 0, i32 3
  %1051 = getelementptr inbounds %struct.osal_mmap, ptr %1050, i32 0, i32 3
  %1052 = load i64, ptr %1051, align 8, !tbaa !11
  %1053 = load ptr, ptr %7, align 8, !tbaa !5
  %1054 = getelementptr inbounds %struct.MDBX_env, ptr %1053, i32 0, i32 35
  %1055 = getelementptr inbounds %struct.anon.13, ptr %1054, i32 0, i32 2
  store i64 %1052, ptr %1055, align 8, !tbaa !38
  %1056 = load ptr, ptr %7, align 8, !tbaa !5
  %1057 = getelementptr inbounds %struct.MDBX_env, ptr %1056, i32 0, i32 3
  %1058 = getelementptr inbounds %struct.osal_mmap, ptr %1057, i32 0, i32 2
  %1059 = load i64, ptr %1058, align 8, !tbaa !24
  %1060 = load ptr, ptr %7, align 8, !tbaa !5
  %1061 = getelementptr inbounds %struct.MDBX_env, ptr %1060, i32 0, i32 35
  %1062 = getelementptr inbounds %struct.anon.13, ptr %1061, i32 0, i32 1
  store i64 %1059, ptr %1062, align 8, !tbaa !39
  %1063 = load ptr, ptr %7, align 8, !tbaa !5
  call void @env_options_adjust_defaults(ptr noundef %1063)
  br label %1171

1064:                                             ; preds = %867
  %1065 = load i32, ptr %12, align 4, !tbaa !9
  %1066 = icmp ne i32 %1065, -30785
  br i1 %1066, label %1067, label %1090

1067:                                             ; preds = %1064
  %1068 = load i32, ptr %12, align 4, !tbaa !9
  %1069 = icmp ne i32 %1068, 1
  br i1 %1069, label %1070, label %1090

1070:                                             ; preds = %1067
  br label %1071

1071:                                             ; preds = %1070
  %1072 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !28
  %1073 = zext i8 %1072 to i32
  %1074 = icmp sle i32 1, %1073
  %1075 = xor i1 %1074, true
  %1076 = xor i1 %1075, true
  %1077 = zext i1 %1076 to i32
  %1078 = sext i32 %1077 to i64
  %1079 = call i64 @llvm.expect.i64(i64 %1078, i64 0)
  %1080 = icmp ne i64 %1079, 0
  br i1 %1080, label %1081, label %1087

1081:                                             ; preds = %1071
  %1082 = load i64, ptr %14, align 8, !tbaa !23
  %1083 = load i64, ptr %18, align 8, !tbaa !23
  %1084 = load i64, ptr %15, align 8, !tbaa !23
  %1085 = load i64, ptr %17, align 8, !tbaa !23
  %1086 = load i32, ptr %12, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.dxb_resize, i32 noundef 318, ptr noundef @.str.27, i64 noundef %1082, i64 noundef %1083, i64 noundef %1084, i64 noundef %1085, i32 noundef %1086)
  br label %1087

1087:                                             ; preds = %1081, %1071
  br label %1088

1088:                                             ; preds = %1087
  br label %1089

1089:                                             ; preds = %1088
  br label %1147

1090:                                             ; preds = %1067, %1064
  br label %1091

1091:                                             ; preds = %1090
  %1092 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !28
  %1093 = zext i8 %1092 to i32
  %1094 = icmp sle i32 2, %1093
  %1095 = xor i1 %1094, true
  %1096 = xor i1 %1095, true
  %1097 = zext i1 %1096 to i32
  %1098 = sext i32 %1097 to i64
  %1099 = call i64 @llvm.expect.i64(i64 %1098, i64 0)
  %1100 = icmp ne i64 %1099, 0
  br i1 %1100, label %1101, label %1107

1101:                                             ; preds = %1091
  %1102 = load i64, ptr %14, align 8, !tbaa !23
  %1103 = load i64, ptr %18, align 8, !tbaa !23
  %1104 = load i64, ptr %15, align 8, !tbaa !23
  %1105 = load i64, ptr %17, align 8, !tbaa !23
  %1106 = load i32, ptr %12, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 2, ptr noundef @__func__.dxb_resize, i32 noundef 323, ptr noundef @.str.28, i64 noundef %1102, i64 noundef %1103, i64 noundef %1104, i64 noundef %1105, i32 noundef %1106)
  br label %1107

1107:                                             ; preds = %1101, %1091
  br label %1108

1108:                                             ; preds = %1107
  br label %1109

1109:                                             ; preds = %1108
  br label %1110

1110:                                             ; preds = %1109
  %1111 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !25
  %1112 = zext i8 %1111 to i32
  %1113 = and i32 %1112, 1
  %1114 = icmp ne i32 %1113, 0
  %1115 = xor i1 %1114, true
  %1116 = xor i1 %1115, true
  %1117 = zext i1 %1116 to i32
  %1118 = sext i32 %1117 to i64
  %1119 = call i64 @llvm.expect.i64(i64 %1118, i64 1)
  %1120 = icmp ne i64 %1119, 0
  br i1 %1120, label %1121, label %1144

1121:                                             ; preds = %1110
  br label %1122

1122:                                             ; preds = %1121
  %1123 = load ptr, ptr %7, align 8, !tbaa !5
  %1124 = getelementptr inbounds %struct.MDBX_env, ptr %1123, i32 0, i32 3
  %1125 = getelementptr inbounds %struct.osal_mmap, ptr %1124, i32 0, i32 2
  %1126 = load i64, ptr %1125, align 8, !tbaa !24
  %1127 = load ptr, ptr %7, align 8, !tbaa !5
  %1128 = getelementptr inbounds %struct.MDBX_env, ptr %1127, i32 0, i32 3
  %1129 = getelementptr inbounds %struct.osal_mmap, ptr %1128, i32 0, i32 3
  %1130 = load i64, ptr %1129, align 8, !tbaa !11
  %1131 = icmp uge i64 %1126, %1130
  %1132 = xor i1 %1131, true
  %1133 = xor i1 %1132, true
  %1134 = xor i1 %1133, true
  %1135 = zext i1 %1134 to i32
  %1136 = sext i32 %1135 to i64
  %1137 = call i64 @llvm.expect.i64(i64 %1136, i64 0)
  %1138 = icmp ne i64 %1137, 0
  br i1 %1138, label %1139, label %1141

1139:                                             ; preds = %1122
  %1140 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %1140, ptr noundef @.str.22, ptr noundef @__func__.dxb_resize, i32 noundef 324) #13
  unreachable

1141:                                             ; preds = %1122
  br label %1142

1142:                                             ; preds = %1141
  br label %1143

1143:                                             ; preds = %1142
  br label %1144

1144:                                             ; preds = %1143, %1110
  br label %1145

1145:                                             ; preds = %1144
  br label %1146

1146:                                             ; preds = %1145
  br label %1147

1147:                                             ; preds = %1146, %1089
  %1148 = load ptr, ptr %7, align 8, !tbaa !5
  %1149 = getelementptr inbounds %struct.MDBX_env, ptr %1148, i32 0, i32 3
  %1150 = getelementptr inbounds %struct.osal_mmap, ptr %1149, i32 0, i32 0
  %1151 = load ptr, ptr %1150, align 8, !tbaa !27
  %1152 = icmp ne ptr %1151, null
  br i1 %1152, label %1170, label %1153

1153:                                             ; preds = %1147
  %1154 = load ptr, ptr %7, align 8, !tbaa !5
  %1155 = getelementptr inbounds %struct.MDBX_env, ptr %1154, i32 0, i32 1
  %1156 = load i32, ptr %1155, align 4, !tbaa !29
  %1157 = or i32 %1156, -2147483648
  store i32 %1157, ptr %1155, align 4, !tbaa !29
  %1158 = load ptr, ptr %7, align 8, !tbaa !5
  %1159 = getelementptr inbounds %struct.MDBX_env, ptr %1158, i32 0, i32 39
  %1160 = load ptr, ptr %1159, align 8, !tbaa !40
  %1161 = icmp ne ptr %1160, null
  br i1 %1161, label %1162, label %1169

1162:                                             ; preds = %1153
  %1163 = load ptr, ptr %7, align 8, !tbaa !5
  %1164 = getelementptr inbounds %struct.MDBX_env, ptr %1163, i32 0, i32 39
  %1165 = load ptr, ptr %1164, align 8, !tbaa !40
  %1166 = getelementptr inbounds %struct.MDBX_txn, ptr %1165, i32 0, i32 1
  %1167 = load i32, ptr %1166, align 4, !tbaa !41
  %1168 = or i32 %1167, 2
  store i32 %1168, ptr %1166, align 4, !tbaa !41
  br label %1169

1169:                                             ; preds = %1162, %1153
  store i32 -30795, ptr %12, align 4, !tbaa !9
  br label %1170

1170:                                             ; preds = %1169, %1147
  br label %1171

1171:                                             ; preds = %1170, %1048
  %1172 = load ptr, ptr %7, align 8, !tbaa !5
  %1173 = getelementptr inbounds %struct.MDBX_env, ptr %1172, i32 0, i32 6
  %1174 = getelementptr inbounds %struct.osal_mmap, ptr %1173, i32 0, i32 0
  %1175 = load ptr, ptr %1174, align 8, !tbaa !27
  %1176 = icmp ne ptr %1175, null
  br i1 %1176, label %1177, label %1183

1177:                                             ; preds = %1171
  %1178 = load i32, ptr %20, align 4, !tbaa !9
  %1179 = and i32 %1178, 768
  %1180 = icmp ne i32 %1179, 0
  br i1 %1180, label %1181, label %1183

1181:                                             ; preds = %1177
  %1182 = load ptr, ptr %7, align 8, !tbaa !5
  call void @lck_rdt_unlock(ptr noundef %1182)
  br label %1183

1183:                                             ; preds = %1181, %1177, %1171
  %1184 = load ptr, ptr %7, align 8, !tbaa !5
  %1185 = getelementptr inbounds %struct.MDBX_env, ptr %1184, i32 0, i32 46
  %1186 = call i32 @osal_fastmutex_release(ptr noundef %1185)
  store i32 %1186, ptr %31, align 4, !tbaa !9
  %1187 = load i32, ptr %31, align 4, !tbaa !9
  %1188 = icmp ne i32 %1187, 0
  br i1 %1188, label %1189, label %1191

1189:                                             ; preds = %1183
  %1190 = load i32, ptr %31, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 0, ptr noundef @__func__.dxb_resize, i32 noundef 348, ptr noundef @.str.29, i32 noundef %1190)
  store i32 -30795, ptr %6, align 4
  store i32 1, ptr %13, align 4
  br label %1193

1191:                                             ; preds = %1183
  %1192 = load i32, ptr %12, align 4, !tbaa !9
  store i32 %1192, ptr %6, align 4
  store i32 1, ptr %13, align 4
  br label %1193

1193:                                             ; preds = %1191, %1189, %636, %408
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #11
  br label %1194

1194:                                             ; preds = %1193, %43
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #11
  %1195 = load i32, ptr %6, align 4
  ret i32 %1195
}

declare i32 @osal_fastmutex_acquire(ptr noundef) #2

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden i32 @bytes2pgno(ptr noundef, i64 noundef) #4

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

; Function Attrs: nounwind willreturn memory(read)
declare i64 @pgno_align2os_bytes(ptr noundef, i64 noundef) #6

declare i32 @lck_rdt_lock(ptr noundef) #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @atomic_load32(ptr noundef, i32 noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @osal_thread_self() #8

declare void @lck_rdt_unlock(ptr noundef) #2

declare void @mincore_clean_cache(ptr noundef) #2

declare i32 @osal_msync(ptr noundef, i64 noundef, i64 noundef, i32 noundef) #2

declare void @munlock_after(ptr noundef, i32 noundef, i64 noundef) #2

; Function Attrs: nounwind
declare i32 @madvise(ptr noundef, i64 noundef, i32 noundef) #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @ignore_enosys(i32 noundef) #8

; Function Attrs: nounwind willreturn memory(none)
declare ptr @__errno_location() #10

declare i32 @osal_mresize(i32 noundef, ptr noundef, i64 noundef, i64 noundef) #2

declare i32 @mdbx_is_readahead_reasonable(i64 noundef, i64 noundef) #2

; Function Attrs: cold nounwind optsize uwtable
declare dso_local i32 @dxb_set_readahead(ptr noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext) #3

declare void @env_options_adjust_defaults(ptr noundef) #2

declare i32 @osal_fastmutex_release(ptr noundef) #2

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

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


; 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.5 }
%struct.anon.5 = 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.reader_slot = type { %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint64_t }
%union.mdbx_atomic_uint32_t = type { i32 }
%union.mdbx_atomic_uint64_t = type { i64 }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.8 = external hidden unnamed_addr constant [24 x i8], align 1
@__func__.dxb_resize = external hidden unnamed_addr constant [11 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [88 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [85 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [82 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [82 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [39 x i8], align 1

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

; Function Attrs: cold nounwind optsize uwtable
define dso_local i32 @dxb_resize(ptr noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, i32 noundef %4) local_unnamed_addr #1 {
  %6 = getelementptr inbounds i8, ptr %0, i64 496
  %7 = tail call i32 @osal_fastmutex_acquire(ptr noundef nonnull %6) #9
  %.not = icmp eq i32 %7, 0
  br i1 %.not, label %8, label %247, !prof !5

8:                                                ; preds = %5
  %9 = getelementptr inbounds i8, ptr %0, i64 16
  %10 = getelementptr inbounds i8, ptr %0, i64 40
  %11 = load i64, ptr %10, align 8, !tbaa !6
  %12 = getelementptr inbounds i8, ptr %0, i64 32
  %13 = load i64, ptr %12, align 8, !tbaa !22
  %14 = tail call i32 @bytes2pgno(ptr noundef %0, i64 noundef %13) #10
  %15 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !23
  %16 = and i8 %15, 1
  %.not242 = icmp ne i8 %16, 0
  %.not243 = icmp ult i32 %3, %2
  %or.cond299 = and i1 %.not243, %.not242
  br i1 %or.cond299, label %17, label %18, !prof !25

17:                                               ; preds = %8
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.8, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 134) #11
  unreachable

18:                                               ; preds = %8
  %.not245 = icmp ult i32 %2, %1
  %or.cond300 = and i1 %.not245, %.not242
  br i1 %or.cond300, label %19, label %20, !prof !25

19:                                               ; preds = %18
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.9, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 135) #11
  unreachable

20:                                               ; preds = %18
  %21 = icmp ugt i32 %4, 1
  %.not246 = icmp ult i32 %14, %2
  %or.cond301 = select i1 %21, i1 true, i1 %.not246
  %.0214 = select i1 %or.cond301, i32 %3, i32 %14
  %22 = zext i32 %.0214 to i64
  %23 = tail call i64 @pgno_align2os_bytes(ptr noundef nonnull %0, i64 noundef %22) #10
  %24 = zext i32 %2 to i64
  %25 = tail call i64 @pgno_align2os_bytes(ptr noundef nonnull %0, i64 noundef %24) #10
  %26 = load ptr, ptr %9, align 8, !tbaa !26
  %27 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !27
  %28 = icmp ugt i8 %27, 3
  br i1 %28, label %29, label %32, !prof !28

29:                                               ; preds = %20
  %30 = getelementptr inbounds i8, ptr %0, i64 4
  %31 = load i32, ptr %30, align 4, !tbaa !29
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 4, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 148, ptr noundef nonnull @.str.10, i32 noundef %31, i32 noundef %4, i64 noundef %11, i64 noundef %25, i64 noundef %13, i64 noundef %23) #9
  %.pre = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !23
  %.pre360 = and i8 %.pre, 1
  br label %32

32:                                               ; preds = %20, %29
  %.pre-phi = phi i8 [ %16, %20 ], [ %.pre360, %29 ]
  %.not247 = icmp ne i8 %.pre-phi, 0
  %.not248 = icmp ult i64 %23, %25
  %or.cond302 = select i1 %.not247, i1 %.not248, i1 false
  br i1 %or.cond302, label %33, label %34, !prof !25

33:                                               ; preds = %32
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.11, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 150) #11
  unreachable

34:                                               ; preds = %32
  %.not249 = icmp eq i8 %.pre-phi, 0
  br i1 %.not249, label %.thread, label %35, !prof !28

35:                                               ; preds = %34
  %36 = tail call i32 @bytes2pgno(ptr noundef nonnull %0, i64 noundef %25) #10
  %.not250 = icmp ult i32 %36, %2
  br i1 %.not250, label %37, label %38, !prof !28

37:                                               ; preds = %35
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.12, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 151) #11
  unreachable

38:                                               ; preds = %35
  %39 = tail call i32 @bytes2pgno(ptr noundef nonnull %0, i64 noundef %23) #10
  %.not252 = icmp ult i32 %39, %.0214
  br i1 %.not252, label %40, label %.thread, !prof !28

40:                                               ; preds = %38
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.13, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 152) #11
  unreachable

.thread:                                          ; preds = %34, %38
  %41 = getelementptr inbounds i8, ptr %0, i64 4
  %42 = load i32, ptr %41, align 4, !tbaa !29
  %43 = and i32 %42, 1769472
  %.not253 = icmp eq i32 %4, 0
  %44 = or disjoint i32 %43, 1073741824
  %spec.select = select i1 %.not253, i32 %43, i32 %44
  %45 = load i64, ptr %12, align 8, !tbaa !22
  %46 = icmp eq i64 %23, %45
  br i1 %46, label %47, label %54

47:                                               ; preds = %.thread
  %48 = load i64, ptr %10, align 8, !tbaa !6
  %49 = icmp eq i64 %25, %48
  br i1 %49, label %50, label %54

50:                                               ; preds = %47
  %51 = getelementptr inbounds i8, ptr %0, i64 48
  %52 = load i64, ptr %51, align 8, !tbaa !30
  %53 = icmp eq i64 %25, %52
  br i1 %53, label %.thread333, label %54

54:                                               ; preds = %50, %47, %.thread
  %55 = and i32 %42, 2097152
  %56 = icmp eq i32 %55, 0
  br i1 %56, label %57, label %.thread305

57:                                               ; preds = %54
  %58 = getelementptr inbounds i8, ptr %0, i64 64
  %59 = load ptr, ptr %58, align 8, !tbaa !26
  %60 = icmp ne i32 %4, 2
  %brmerge = or i1 %60, %46
  br i1 %brmerge, label %.thread305, label %61

61:                                               ; preds = %57
  %62 = or disjoint i32 %43, 1073742592
  %.not255 = icmp eq ptr %59, null
  br i1 %.not255, label %.thread305, label %63

63:                                               ; preds = %61
  %64 = tail call i32 @lck_rdt_lock(ptr noundef nonnull %0) #9
  %65 = add i32 %64, 1
  %66 = icmp ult i32 %65, 2
  br i1 %66, label %67, label %.thread348, !prof !5

67:                                               ; preds = %63
  %68 = getelementptr inbounds i8, ptr %59, i64 488
  %69 = tail call i32 @atomic_load32(ptr noundef nonnull %68, i32 noundef 1)
  %70 = zext i32 %69 to i64
  %.not354 = icmp eq i32 %69, 0
  br i1 %.not354, label %.thread305, label %.lr.ph

.lr.ph:                                           ; preds = %67
  %71 = getelementptr inbounds i8, ptr %59, i64 512
  %72 = getelementptr inbounds i8, ptr %0, i64 140
  br label %73

73:                                               ; preds = %.lr.ph, %84
  %.0228353 = phi i64 [ 0, %.lr.ph ], [ %85, %84 ]
  %74 = getelementptr inbounds [0 x %struct.reader_slot], ptr %71, i64 0, i64 %.0228353
  %75 = getelementptr inbounds i8, ptr %74, i64 16
  %76 = load volatile i32, ptr %75, align 16, !tbaa !26
  %77 = load i32, ptr %72, align 4, !tbaa !31
  %78 = icmp eq i32 %76, %77
  br i1 %78, label %79, label %84

79:                                               ; preds = %73
  %80 = getelementptr inbounds i8, ptr %74, i64 8
  %81 = load volatile i64, ptr %80, align 8, !tbaa !26
  %82 = tail call i64 @osal_thread_self()
  %.not257 = icmp eq i64 %81, %82
  br i1 %.not257, label %84, label %83

83:                                               ; preds = %79
  tail call void @lck_rdt_unlock(ptr noundef nonnull %0) #9
  br label %.thread305

84:                                               ; preds = %73, %79
  %85 = add nuw nsw i64 %.0228353, 1
  %exitcond.not = icmp eq i64 %85, %70
  br i1 %exitcond.not, label %.thread305, label %73, !llvm.loop !32

.thread305:                                       ; preds = %84, %67, %83, %57, %61, %54
  %.5226 = phi i32 [ %spec.select, %54 ], [ %spec.select, %57 ], [ %62, %61 ], [ %spec.select, %83 ], [ %62, %67 ], [ %62, %84 ]
  %86 = and i32 %.5226, 768
  %.not258 = icmp eq i32 %86, 0
  br i1 %.not258, label %.thread309, label %88

.thread309:                                       ; preds = %.thread305
  %87 = tail call i32 @bytes2pgno(ptr noundef nonnull %0, i64 noundef %25) #10
  br label %103

88:                                               ; preds = %.thread305
  tail call void @mincore_clean_cache(ptr noundef nonnull %0) #9
  %89 = load i32, ptr %41, align 4, !tbaa !29
  %90 = and i32 %89, 524288
  %.not259 = icmp eq i32 %90, 0
  br i1 %.not259, label %103, label %91

91:                                               ; preds = %88
  %92 = getelementptr inbounds i8, ptr %0, i64 104
  %93 = load ptr, ptr %92, align 8, !tbaa !34
  %94 = getelementptr inbounds i8, ptr %93, i64 376
  %95 = load volatile i64, ptr %94, align 8, !tbaa !26
  %.not260 = icmp eq i64 %95, 0
  br i1 %.not260, label %103, label %96

96:                                               ; preds = %91
  %97 = getelementptr inbounds i8, ptr %93, i64 128
  %98 = load volatile i64, ptr %97, align 64, !tbaa !26
  %99 = add i64 %98, 1
  store volatile i64 %99, ptr %97, align 64, !tbaa !26
  %100 = zext i32 %1 to i64
  %101 = tail call i64 @pgno_align2os_bytes(ptr noundef nonnull %0, i64 noundef %100) #10
  %102 = tail call i32 @osal_msync(ptr noundef nonnull %9, i64 noundef 0, i64 noundef %101, i32 noundef 0) #9
  %.not261 = icmp eq i32 %102, 0
  br i1 %.not261, label %103, label %.thread348, !prof !5

103:                                              ; preds = %.thread309, %88, %91, %96
  %104 = phi i32 [ %87, %.thread309 ], [ 0, %88 ], [ 0, %91 ], [ 0, %96 ]
  tail call void @munlock_after(ptr noundef nonnull %0, i32 noundef %104, i64 noundef %25) #9
  %105 = icmp ult i64 %25, %11
  %106 = icmp ne i32 %4, 0
  %or.cond = and i1 %106, %105
  br i1 %or.cond, label %107, label %.thread324

107:                                              ; preds = %103
  %108 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !27
  %109 = icmp ugt i8 %108, 2
  br i1 %109, label %110, label %115, !prof !28

110:                                              ; preds = %107
  %111 = load i32, ptr %41, align 4, !tbaa !29
  %112 = and i32 %111, 524288
  %.not262 = icmp eq i32 %112, 0
  %113 = select i1 %.not262, ptr @.str.17, ptr @.str.16
  %114 = tail call i32 @bytes2pgno(ptr noundef nonnull %0, i64 noundef %11) #10
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 3, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 232, ptr noundef nonnull @.str.15, ptr noundef nonnull %113, i32 noundef %2, i32 noundef %114) #9
  br label %115

115:                                              ; preds = %110, %107
  %116 = getelementptr inbounds i8, ptr %0, i64 104
  %117 = load ptr, ptr %116, align 8, !tbaa !34
  %118 = getelementptr inbounds i8, ptr %117, i64 44
  %119 = tail call i32 @atomic_load32(ptr noundef nonnull %118, i32 noundef 0)
  %120 = load i32, ptr %41, align 4, !tbaa !29
  %121 = and i32 %120, 524288
  %.not263 = icmp eq i32 %121, 0
  br i1 %.not263, label %..thread310_crit_edge, label %122

..thread310_crit_edge:                            ; preds = %115
  %.pre363 = sub i64 %11, %25
  br label %.thread310

122:                                              ; preds = %115
  %123 = load ptr, ptr %9, align 8, !tbaa !26
  %124 = ptrtoint ptr %123 to i64
  %125 = add nsw i64 %25, %124
  %126 = inttoptr i64 %125 to ptr
  %127 = sub i64 %11, %25
  %128 = tail call i32 @madvise(ptr noundef %126, i64 noundef %127, i32 noundef 9) #9
  %.not264 = icmp eq i32 %128, 0
  br i1 %.not264, label %.thread315, label %129

129:                                              ; preds = %122
  %130 = tail call ptr @__errno_location() #12
  %131 = load i32, ptr %130, align 4, !tbaa !35
  %132 = tail call i32 @ignore_enosys(i32 noundef %131)
  %133 = icmp eq i32 %132, -1
  br i1 %133, label %.thread310, label %143

.thread310:                                       ; preds = %..thread310_crit_edge, %129
  %.pre-phi364 = phi i64 [ %.pre363, %..thread310_crit_edge ], [ %127, %129 ]
  %134 = load ptr, ptr %9, align 8, !tbaa !26
  %135 = ptrtoint ptr %134 to i64
  %136 = add nsw i64 %25, %135
  %137 = inttoptr i64 %136 to ptr
  %138 = tail call i32 @madvise(ptr noundef %137, i64 noundef %.pre-phi364, i32 noundef 4) #9
  %.not265 = icmp eq i32 %138, 0
  br i1 %.not265, label %.thread315, label %139

139:                                              ; preds = %.thread310
  %140 = tail call ptr @__errno_location() #12
  %141 = load i32, ptr %140, align 4, !tbaa !35
  %142 = tail call i32 @ignore_enosys(i32 noundef %141)
  br label %143

143:                                              ; preds = %139, %129
  %.4 = phi i32 [ %132, %129 ], [ %142, %139 ]
  %144 = add i32 %.4, -1
  %145 = icmp ult i32 %144, -2
  br i1 %145, label %146, label %.thread315, !prof !36

146:                                              ; preds = %143
  %147 = load ptr, ptr %116, align 8, !tbaa !34
  %148 = getelementptr inbounds i8, ptr %147, i64 40
  %149 = tail call i32 @atomic_load32(ptr noundef nonnull %148, i32 noundef 0)
  %150 = icmp eq i32 %.4, 22
  br i1 %150, label %151, label %156

151:                                              ; preds = %146
  %.not267 = icmp eq i32 %149, %119
  %152 = select i1 %.not267, i32 2, i32 3
  %153 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !27
  %154 = zext i8 %153 to i32
  %.not268 = icmp ugt i32 %152, %154
  br i1 %.not268, label %.thread324, label %155, !prof !5

155:                                              ; preds = %151
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef %152, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 258, ptr noundef nonnull @.str.18, ptr noundef nonnull @.str.19, i32 noundef 22, i32 noundef %149, i32 noundef %119) #9
  br label %.thread324

156:                                              ; preds = %146
  %157 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !27
  %.not266 = icmp eq i8 %157, 0
  br i1 %.not266, label %.thread348, label %158, !prof !5

158:                                              ; preds = %156
  %159 = sub i64 %11, %25
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 264, ptr noundef nonnull @.str.20, ptr noundef nonnull @.str.21, ptr noundef nonnull @.str.17, i64 noundef %25, i64 noundef %159, i32 noundef %149, i32 noundef %119, i32 noundef %.4) #9
  br label %.thread348

.thread315:                                       ; preds = %122, %.thread310, %143
  %160 = load ptr, ptr %116, align 8, !tbaa !34
  %161 = getelementptr inbounds i8, ptr %160, i64 392
  store volatile i32 %2, ptr %161, align 8, !tbaa !26
  br label %.thread324

.thread324:                                       ; preds = %155, %151, %.thread315, %103
  %162 = tail call i32 @osal_mresize(i32 noundef %.5226, ptr noundef nonnull %9, i64 noundef %25, i64 noundef %23) #9
  %163 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !23
  %164 = and i8 %163, 1
  %.not269 = icmp eq i8 %164, 0
  br i1 %.not269, label %169, label %165, !prof !28

165:                                              ; preds = %.thread324
  %166 = load i64, ptr %12, align 8, !tbaa !22
  %167 = load i64, ptr %10, align 8, !tbaa !6
  %.not270 = icmp ult i64 %166, %167
  br i1 %.not270, label %168, label %.thread327, !prof !28

168:                                              ; preds = %165
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.22, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 272) #11
  unreachable

169:                                              ; preds = %.thread324
  %170 = icmp eq i32 %162, 0
  br i1 %170, label %183, label %.thread348

.thread327:                                       ; preds = %165
  %171 = icmp eq i32 %162, 0
  br i1 %171, label %172, label %.thread348

172:                                              ; preds = %.thread327
  %.not272 = icmp eq i64 %23, %166
  br i1 %.not272, label %174, label %173, !prof !5

173:                                              ; preds = %172
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.23, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 275) #11
  unreachable

174:                                              ; preds = %172
  %175 = getelementptr inbounds i8, ptr %0, i64 48
  %176 = load i64, ptr %175, align 8, !tbaa !30
  %.not274 = icmp ugt i64 %25, %176
  br i1 %.not274, label %177, label %.thread330, !prof !28

177:                                              ; preds = %174
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.24, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 276) #11
  unreachable

.thread330:                                       ; preds = %174
  %178 = icmp eq i32 %4, 2
  br i1 %178, label %179, label %181

179:                                              ; preds = %.thread330
  %.not278 = icmp eq i64 %25, %167
  br i1 %.not278, label %183, label %180, !prof !5

180:                                              ; preds = %179
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.25, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 278) #11
  unreachable

181:                                              ; preds = %.thread330
  %.not276 = icmp ugt i64 %25, %167
  br i1 %.not276, label %182, label %183, !prof !28

182:                                              ; preds = %181
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.26, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 280) #11
  unreachable

183:                                              ; preds = %169, %181, %179
  %184 = getelementptr inbounds i8, ptr %0, i64 104
  %185 = load ptr, ptr %184, align 8, !tbaa !34
  %186 = getelementptr inbounds i8, ptr %185, i64 392
  store volatile i32 %2, ptr %186, align 8, !tbaa !26
  %187 = load i32, ptr %41, align 4, !tbaa !29
  %188 = and i32 %187, 8388608
  %.not279 = icmp eq i32 %188, 0
  br i1 %.not279, label %189, label %193

189:                                              ; preds = %183
  %190 = sub nsw i64 0, %11
  %191 = tail call i32 @mdbx_is_readahead_reasonable(i64 noundef %25, i64 noundef %190) #9
  %192 = icmp ne i32 %191, 0
  br label %193

193:                                              ; preds = %189, %183
  %194 = phi i1 [ false, %183 ], [ %192, %189 ]
  %.not280 = icmp eq i64 %23, %13
  br i1 %.not280, label %195, label %198

195:                                              ; preds = %193
  %196 = load ptr, ptr %9, align 8, !tbaa !26
  %197 = icmp ne ptr %196, %26
  br label %198

198:                                              ; preds = %195, %193
  %199 = phi i1 [ true, %193 ], [ %197, %195 ]
  %200 = tail call i32 @dxb_set_readahead(ptr noundef nonnull %0, i32 noundef %2, i1 noundef zeroext %194, i1 noundef zeroext %199)
  br label %.thread348

.thread348:                                       ; preds = %63, %.thread327, %156, %158, %169, %198, %96
  %.6227 = phi i32 [ %.5226, %96 ], [ %.5226, %198 ], [ %.5226, %169 ], [ %.5226, %158 ], [ %.5226, %156 ], [ %.5226, %.thread327 ], [ %62, %63 ]
  %.5 = phi i32 [ %102, %96 ], [ %200, %198 ], [ %162, %169 ], [ %.4, %158 ], [ %.4, %156 ], [ %162, %.thread327 ], [ %64, %63 ]
  switch i32 %.5, label %214 [
    i32 0, label %.thread348..thread333_crit_edge
    i32 -30785, label %217
    i32 1, label %217
  ]

.thread348..thread333_crit_edge:                  ; preds = %.thread348
  %.pre355 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !23
  %.pre356.pre = load i64, ptr %10, align 8, !tbaa !6
  %.pre357.pre = load i64, ptr %12, align 8, !tbaa !22
  %.pre361 = and i8 %.pre355, 1
  br label %.thread333

.thread333:                                       ; preds = %.thread348..thread333_crit_edge, %50
  %.pre-phi362 = phi i8 [ %.pre361, %.thread348..thread333_crit_edge ], [ %.pre-phi, %50 ]
  %.pre357 = phi i64 [ %.pre357.pre, %.thread348..thread333_crit_edge ], [ %23, %50 ]
  %.pre356 = phi i64 [ %.pre356.pre, %.thread348..thread333_crit_edge ], [ %25, %50 ]
  %.6227337 = phi i32 [ %.6227, %.thread348..thread333_crit_edge ], [ %spec.select, %50 ]
  %.not286 = icmp eq i8 %.pre-phi362, 0
  br i1 %.not286, label %.thread340, label %201, !prof !28

201:                                              ; preds = %.thread333
  %.not287 = icmp ult i64 %.pre357, %.pre356
  br i1 %.not287, label %202, label %203, !prof !28

202:                                              ; preds = %201
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.22, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 294) #11
  unreachable

203:                                              ; preds = %201
  %.not289 = icmp eq i64 %23, %.pre357
  br i1 %.not289, label %205, label %204, !prof !5

204:                                              ; preds = %203
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.23, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 295) #11
  unreachable

205:                                              ; preds = %203
  %206 = getelementptr inbounds i8, ptr %0, i64 48
  %207 = load i64, ptr %206, align 8, !tbaa !30
  %.not291 = icmp ugt i64 %25, %207
  br i1 %.not291, label %208, label %.thread341, !prof !28

208:                                              ; preds = %205
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.24, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 296) #11
  unreachable

.thread341:                                       ; preds = %205
  %209 = icmp eq i32 %4, 2
  br i1 %209, label %.thread342, label %.thread343

.thread342:                                       ; preds = %.thread341
  %.not295 = icmp eq i64 %25, %.pre356
  br i1 %.not295, label %.thread340, label %210, !prof !5

210:                                              ; preds = %.thread342
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.25, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 298) #11
  unreachable

.thread343:                                       ; preds = %.thread341
  %.not293 = icmp ugt i64 %25, %.pre356
  br i1 %.not293, label %211, label %.thread340, !prof !28

211:                                              ; preds = %.thread343
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.26, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 300) #11
  unreachable

.thread340:                                       ; preds = %.thread333, %.thread343, %.thread342
  %212 = getelementptr inbounds i8, ptr %0, i64 336
  store i64 %.pre356, ptr %212, align 8, !tbaa !37
  %213 = getelementptr inbounds i8, ptr %0, i64 328
  store i64 %.pre357, ptr %213, align 8, !tbaa !38
  tail call void @env_options_adjust_defaults(ptr noundef nonnull %0) #9
  br label %239

214:                                              ; preds = %.thread348
  %215 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !27
  %.not283 = icmp eq i8 %215, 0
  br i1 %.not283, label %228, label %216, !prof !5

216:                                              ; preds = %214
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 318, ptr noundef nonnull @.str.27, i64 noundef %11, i64 noundef %25, i64 noundef %13, i64 noundef %23, i32 noundef %.5) #9
  br label %228

217:                                              ; preds = %.thread348, %.thread348
  %218 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !27
  %219 = icmp ugt i8 %218, 1
  br i1 %219, label %220, label %221, !prof !28

220:                                              ; preds = %217
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 2, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 323, ptr noundef nonnull @.str.28, i64 noundef %11, i64 noundef %25, i64 noundef %13, i64 noundef %23, i32 noundef %.5) #9
  br label %221

221:                                              ; preds = %217, %220
  %222 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !23
  %223 = and i8 %222, 1
  %.not281 = icmp eq i8 %223, 0
  br i1 %.not281, label %228, label %224, !prof !28

224:                                              ; preds = %221
  %225 = load i64, ptr %12, align 8, !tbaa !22
  %226 = load i64, ptr %10, align 8, !tbaa !6
  %.not282 = icmp ult i64 %225, %226
  br i1 %.not282, label %227, label %228, !prof !28

227:                                              ; preds = %224
  tail call void @mdbx_assert_fail(ptr noundef nonnull %0, ptr noundef nonnull @.str.22, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 324) #11
  unreachable

228:                                              ; preds = %221, %224, %214, %216
  %229 = load ptr, ptr %9, align 8, !tbaa !26
  %.not284 = icmp eq ptr %229, null
  br i1 %.not284, label %230, label %239

230:                                              ; preds = %228
  %231 = load i32, ptr %41, align 4, !tbaa !29
  %232 = or i32 %231, -2147483648
  store i32 %232, ptr %41, align 4, !tbaa !29
  %233 = getelementptr inbounds i8, ptr %0, i64 384
  %234 = load ptr, ptr %233, align 8, !tbaa !39
  %.not285 = icmp eq ptr %234, null
  br i1 %.not285, label %239, label %235

235:                                              ; preds = %230
  %236 = getelementptr inbounds i8, ptr %234, i64 4
  %237 = load i32, ptr %236, align 4, !tbaa !40
  %238 = or i32 %237, 2
  store i32 %238, ptr %236, align 4, !tbaa !40
  br label %239

239:                                              ; preds = %230, %235, %228, %.thread340
  %.6227336 = phi i32 [ %.6227337, %.thread340 ], [ %.6227, %228 ], [ %.6227, %235 ], [ %.6227, %230 ]
  %.6 = phi i32 [ 0, %.thread340 ], [ %.5, %228 ], [ -30795, %235 ], [ -30795, %230 ]
  %240 = getelementptr inbounds i8, ptr %0, i64 64
  %241 = load ptr, ptr %240, align 8, !tbaa !26
  %.not296 = icmp eq ptr %241, null
  %242 = and i32 %.6227336, 768
  %.not297 = icmp eq i32 %242, 0
  %or.cond303 = select i1 %.not296, i1 true, i1 %.not297
  br i1 %or.cond303, label %244, label %243

243:                                              ; preds = %239
  tail call void @lck_rdt_unlock(ptr noundef nonnull %0) #9
  br label %244

244:                                              ; preds = %243, %239
  %245 = tail call i32 @osal_fastmutex_release(ptr noundef nonnull %6) #9
  %.not298 = icmp eq i32 %245, 0
  br i1 %.not298, label %247, label %246

246:                                              ; preds = %244
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 0, ptr noundef nonnull @__func__.dxb_resize, i32 noundef 348, ptr noundef nonnull @.str.29, i32 noundef %245) #9
  br label %247

247:                                              ; preds = %246, %244, %5
  %.1 = phi i32 [ %7, %5 ], [ -30795, %246 ], [ %.6, %244 ]
  ret i32 %.1
}

declare i32 @osal_fastmutex_acquire(ptr noundef) local_unnamed_addr #0

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare hidden i32 @bytes2pgno(ptr noundef, i64 noundef) local_unnamed_addr #2

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

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

declare i32 @lck_rdt_lock(ptr noundef) local_unnamed_addr #0

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @atomic_load32(ptr noundef, i32 noundef) local_unnamed_addr #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @osal_thread_self() local_unnamed_addr #6

declare void @lck_rdt_unlock(ptr noundef) local_unnamed_addr #0

declare void @mincore_clean_cache(ptr noundef) local_unnamed_addr #0

declare i32 @osal_msync(ptr noundef, i64 noundef, i64 noundef, i32 noundef) local_unnamed_addr #0

declare void @munlock_after(ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind
declare i32 @madvise(ptr noundef, i64 noundef, i32 noundef) local_unnamed_addr #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @ignore_enosys(i32 noundef) local_unnamed_addr #6

; Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)
declare ptr @__errno_location() local_unnamed_addr #8

declare i32 @osal_mresize(i32 noundef, ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #0

declare i32 @mdbx_is_readahead_reasonable(i64 noundef, i64 noundef) local_unnamed_addr #0

; Function Attrs: cold nounwind optsize uwtable
declare dso_local i32 @dxb_set_readahead(ptr noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #1

declare void @env_options_adjust_defaults(ptr noundef) local_unnamed_addr #0

declare i32 @osal_fastmutex_release(ptr noundef) local_unnamed_addr #0

attributes #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 = { 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 = { inlinehint mustprogress nofree nounwind willreturn memory(read) 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 = { mustprogress nofree nounwind willreturn memory(read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { alwaysinline 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 #6 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { nounwind "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 = { mustprogress nofree nosync nounwind willreturn memory(none) "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 #9 = { nounwind }
attributes #10 = { nounwind willreturn memory(read) }
attributes #11 = { noreturn nounwind }
attributes #12 = { nounwind willreturn memory(none) }

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


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