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

; 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.6 }
%struct.anon.6 = 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_txn = type { i32, i32, i64, i64, ptr, ptr, %struct.geo, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, %struct.MDBX_canary, ptr, %union.anon.1 }
%struct.geo = type { i16, i16, i32, i32, %union.anon, %union.anon.0 }
%union.anon = type { i32 }
%union.anon.0 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.1 = type { %struct.anon.2 }
%struct.anon.2 = type { %struct.troika, ptr, %struct.anon.3, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.4 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.3 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.4 = type { %struct.anon.5 }
%struct.anon.5 = type { i64, ptr }
%struct.dpl = type { i64, i64, i64, i64, [18 x %struct.dp] }
%struct.dp = type { ptr, i32, i32 }
%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.9, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.10, %struct.anon.14, i8, ptr, ptr, ptr, %struct.anon.15, %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.8, i32, i64, i64, i64 }
%union.anon.8 = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon.9 = type { ptr, ptr, ptr, ptr }
%struct.anon.10 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.11, %union.anon.12 }
%struct.anon.11 = type { i16, i16, i16, i16 }
%union.anon.12 = type { i32 }
%struct.anon.14 = type { i64, i64, i64, i64, i64 }
%struct.anon.15 = type { i64 }
%struct.osal_ioring = type { i32, i32, i32, ptr, ptr, ptr }
%union.mdbx_atomic_uint64_t = type { i64 }
%struct.page = type <{ i64, i16, i16, %union.anon.16, i32, [0 x i16] }>
%union.anon.16 = type { i32 }

@globals = external global %struct.libmdbx_globals, align 8
@.str = external hidden unnamed_addr constant [36 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [40 x i8], align 1
@__func__.dpl_check = external hidden unnamed_addr constant [10 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [105 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1

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

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local ptr @debug_dpl_find(ptr noundef, i32 noundef) #3

; Function Attrs: cold nounwind optsize uwtable
define dso_local zeroext i1 @dpl_check(ptr noundef %0) #4 {
  %2 = alloca i1, align 1
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca ptr, align 8
  store ptr %0, ptr %3, align 8, !tbaa !5
  br label %16

16:                                               ; preds = %1
  %17 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %18 = zext i8 %17 to i32
  %19 = and i32 %18, 1
  %20 = icmp ne i32 %19, 0
  %21 = xor i1 %20, true
  %22 = xor i1 %21, true
  %23 = zext i1 %22 to i32
  %24 = sext i32 %23 to i64
  %25 = call i64 @llvm.expect.i64(i64 %24, i64 1)
  %26 = icmp ne i64 %25, 0
  br i1 %26, label %27, label %47

27:                                               ; preds = %16
  br label %28

28:                                               ; preds = %27
  %29 = load ptr, ptr %3, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.MDBX_txn, ptr %29, i32 0, i32 1
  %31 = load i32, ptr %30, align 4, !tbaa !14
  %32 = and i32 %31, 131072
  %33 = icmp eq i32 %32, 0
  %34 = xor i1 %33, true
  %35 = xor i1 %34, true
  %36 = xor i1 %35, true
  %37 = zext i1 %36 to i32
  %38 = sext i32 %37 to i64
  %39 = call i64 @llvm.expect.i64(i64 %38, i64 0)
  %40 = icmp ne i64 %39, 0
  br i1 %40, label %41, label %45

41:                                               ; preds = %28
  %42 = load ptr, ptr %3, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.MDBX_txn, ptr %42, i32 0, i32 9
  %44 = load ptr, ptr %43, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %44, ptr noundef @.str, ptr noundef @__func__.dpl_check, i32 noundef 317) #6
  unreachable

45:                                               ; preds = %28
  br label %46

46:                                               ; preds = %45
  br label %47

47:                                               ; preds = %46, %16
  br label %48

48:                                               ; preds = %47
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #7
  %49 = load ptr, ptr %3, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.MDBX_txn, ptr %49, i32 0, i32 17
  %51 = getelementptr inbounds %struct.anon.2, ptr %50, i32 0, i32 7
  %52 = load ptr, ptr %51, align 8, !tbaa !20
  store ptr %52, ptr %4, align 8, !tbaa !5
  %53 = load ptr, ptr %4, align 8, !tbaa !5
  %54 = icmp ne ptr %53, null
  br i1 %54, label %94, label %55

55:                                               ; preds = %48
  br label %56

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

67:                                               ; preds = %56
  br label %68

68:                                               ; preds = %67
  %69 = load ptr, ptr %3, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.MDBX_txn, ptr %69, i32 0, i32 1
  %71 = load i32, ptr %70, align 4, !tbaa !14
  %72 = and i32 %71, 524288
  %73 = icmp ne i32 %72, 0
  br i1 %73, label %74, label %75

74:                                               ; preds = %68
  br label %75

75:                                               ; preds = %74, %68
  %76 = phi i1 [ false, %68 ], [ true, %74 ]
  %77 = xor i1 %76, true
  %78 = xor i1 %77, true
  %79 = xor i1 %78, true
  %80 = zext i1 %79 to i32
  %81 = sext i32 %80 to i64
  %82 = call i64 @llvm.expect.i64(i64 %81, i64 0)
  %83 = icmp ne i64 %82, 0
  br i1 %83, label %84, label %88

84:                                               ; preds = %75
  %85 = load ptr, ptr %3, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.MDBX_txn, ptr %85, i32 0, i32 9
  %87 = load ptr, ptr %86, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %87, ptr noundef @.str.9, ptr noundef @__func__.dpl_check, i32 noundef 320) #6
  unreachable

88:                                               ; preds = %75
  br label %89

89:                                               ; preds = %88
  br label %90

90:                                               ; preds = %89
  br label %91

91:                                               ; preds = %90, %56
  br label %92

92:                                               ; preds = %91
  br label %93

93:                                               ; preds = %92
  store i1 true, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %926

94:                                               ; preds = %48
  br label %95

95:                                               ; preds = %94
  %96 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %97 = zext i8 %96 to i32
  %98 = and i32 %97, 1
  %99 = icmp ne i32 %98, 0
  %100 = xor i1 %99, true
  %101 = xor i1 %100, true
  %102 = zext i1 %101 to i32
  %103 = sext i32 %102 to i64
  %104 = call i64 @llvm.expect.i64(i64 %103, i64 1)
  %105 = icmp ne i64 %104, 0
  br i1 %105, label %106, label %130

106:                                              ; preds = %95
  br label %107

107:                                              ; preds = %106
  %108 = load ptr, ptr %3, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.MDBX_txn, ptr %108, i32 0, i32 1
  %110 = load i32, ptr %109, align 4, !tbaa !14
  %111 = and i32 %110, 524288
  %112 = icmp eq i32 %111, 0
  br i1 %112, label %114, label %113

113:                                              ; preds = %107
  br label %114

114:                                              ; preds = %113, %107
  %115 = phi i1 [ true, %107 ], [ false, %113 ]
  %116 = xor i1 %115, true
  %117 = xor i1 %116, true
  %118 = xor i1 %117, true
  %119 = zext i1 %118 to i32
  %120 = sext i32 %119 to i64
  %121 = call i64 @llvm.expect.i64(i64 %120, i64 0)
  %122 = icmp ne i64 %121, 0
  br i1 %122, label %123, label %127

123:                                              ; preds = %114
  %124 = load ptr, ptr %3, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.MDBX_txn, ptr %124, i32 0, i32 9
  %126 = load ptr, ptr %125, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %126, ptr noundef @.str.1, ptr noundef @__func__.dpl_check, i32 noundef 323) #6
  unreachable

127:                                              ; preds = %114
  br label %128

128:                                              ; preds = %127
  br label %129

129:                                              ; preds = %128
  br label %130

130:                                              ; preds = %129, %95
  br label %131

131:                                              ; preds = %130
  br label %132

132:                                              ; preds = %131
  br label %133

133:                                              ; preds = %132
  %134 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %135 = zext i8 %134 to i32
  %136 = and i32 %135, 1
  %137 = icmp ne i32 %136, 0
  %138 = xor i1 %137, true
  %139 = xor i1 %138, true
  %140 = zext i1 %139 to i32
  %141 = sext i32 %140 to i64
  %142 = call i64 @llvm.expect.i64(i64 %141, i64 1)
  %143 = icmp ne i64 %142, 0
  br i1 %143, label %144, label %176

144:                                              ; preds = %133
  br label %145

145:                                              ; preds = %144
  %146 = load ptr, ptr %4, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.dpl, ptr %146, i32 0, i32 4
  %148 = getelementptr inbounds [18 x %struct.dp], ptr %147, i64 0, i64 0
  %149 = getelementptr inbounds %struct.dp, ptr %148, i32 0, i32 1
  %150 = load i32, ptr %149, align 8, !tbaa !21
  %151 = icmp eq i32 %150, 0
  br i1 %151, label %152, label %163

152:                                              ; preds = %145
  %153 = load ptr, ptr %4, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.dpl, ptr %153, i32 0, i32 4
  %155 = load ptr, ptr %4, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.dpl, ptr %155, i32 0, i32 1
  %157 = load i64, ptr %156, align 8, !tbaa !23
  %158 = add i64 %157, 1
  %159 = getelementptr inbounds [18 x %struct.dp], ptr %154, i64 0, i64 %158
  %160 = getelementptr inbounds %struct.dp, ptr %159, i32 0, i32 1
  %161 = load i32, ptr %160, align 8, !tbaa !21
  %162 = icmp eq i32 %161, -1
  br label %163

163:                                              ; preds = %152, %145
  %164 = phi i1 [ false, %145 ], [ %162, %152 ]
  %165 = xor i1 %164, true
  %166 = xor i1 %165, true
  %167 = xor i1 %166, true
  %168 = zext i1 %167 to i32
  %169 = sext i32 %168 to i64
  %170 = call i64 @llvm.expect.i64(i64 %169, i64 0)
  %171 = icmp ne i64 %170, 0
  br i1 %171, label %172, label %173

172:                                              ; preds = %163
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.3, ptr noundef @__func__.dpl_check, i32 noundef 325) #6
  unreachable

173:                                              ; preds = %163
  br label %174

174:                                              ; preds = %173
  br label %175

175:                                              ; preds = %174
  br label %176

176:                                              ; preds = %175, %133
  br label %177

177:                                              ; preds = %176
  br label %178

178:                                              ; preds = %177
  br label %179

179:                                              ; preds = %178
  %180 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %181 = zext i8 %180 to i32
  %182 = and i32 %181, 1
  %183 = icmp ne i32 %182, 0
  %184 = xor i1 %183, true
  %185 = xor i1 %184, true
  %186 = zext i1 %185 to i32
  %187 = sext i32 %186 to i64
  %188 = call i64 @llvm.expect.i64(i64 %187, i64 1)
  %189 = icmp ne i64 %188, 0
  br i1 %189, label %190, label %236

190:                                              ; preds = %179
  br label %191

191:                                              ; preds = %190
  %192 = load ptr, ptr %3, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.MDBX_txn, ptr %192, i32 0, i32 17
  %194 = getelementptr inbounds %struct.anon.2, ptr %193, i32 0, i32 6
  %195 = load i64, ptr %194, align 8, !tbaa !20
  %196 = load ptr, ptr %4, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.dpl, ptr %196, i32 0, i32 1
  %198 = load i64, ptr %197, align 8, !tbaa !23
  %199 = add i64 %195, %198
  %200 = load ptr, ptr %3, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.MDBX_txn, ptr %200, i32 0, i32 4
  %202 = load ptr, ptr %201, align 8, !tbaa !25
  %203 = icmp ne ptr %202, null
  br i1 %203, label %204, label %211

204:                                              ; preds = %191
  %205 = load ptr, ptr %3, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.MDBX_txn, ptr %205, i32 0, i32 4
  %207 = load ptr, ptr %206, align 8, !tbaa !25
  %208 = getelementptr inbounds %struct.MDBX_txn, ptr %207, i32 0, i32 17
  %209 = getelementptr inbounds %struct.anon.2, ptr %208, i32 0, i32 6
  %210 = load i64, ptr %209, align 8, !tbaa !20
  br label %219

211:                                              ; preds = %191
  %212 = load ptr, ptr %3, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.MDBX_txn, ptr %212, i32 0, i32 9
  %214 = load ptr, ptr %213, align 8, !tbaa !19
  %215 = getelementptr inbounds %struct.MDBX_env, ptr %214, i32 0, i32 34
  %216 = getelementptr inbounds %struct.anon.10, ptr %215, i32 0, i32 2
  %217 = load i32, ptr %216, align 8, !tbaa !26
  %218 = zext i32 %217 to i64
  br label %219

219:                                              ; preds = %211, %204
  %220 = phi i64 [ %210, %204 ], [ %218, %211 ]
  %221 = icmp eq i64 %199, %220
  %222 = xor i1 %221, true
  %223 = xor i1 %222, true
  %224 = xor i1 %223, true
  %225 = zext i1 %224 to i32
  %226 = sext i32 %225 to i64
  %227 = call i64 @llvm.expect.i64(i64 %226, i64 0)
  %228 = icmp ne i64 %227, 0
  br i1 %228, label %229, label %233

229:                                              ; preds = %219
  %230 = load ptr, ptr %3, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.MDBX_txn, ptr %230, i32 0, i32 9
  %232 = load ptr, ptr %231, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %232, ptr noundef @.str.19, ptr noundef @__func__.dpl_check, i32 noundef 327) #6
  unreachable

233:                                              ; preds = %219
  br label %234

234:                                              ; preds = %233
  br label %235

235:                                              ; preds = %234
  br label %236

236:                                              ; preds = %235, %179
  br label %237

237:                                              ; preds = %236
  br label %238

238:                                              ; preds = %237
  %239 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %240 = zext i8 %239 to i32
  %241 = and i32 %240, 2
  %242 = icmp ne i32 %241, 0
  %243 = xor i1 %242, true
  %244 = xor i1 %243, true
  %245 = zext i1 %244 to i32
  %246 = sext i32 %245 to i64
  %247 = call i64 @llvm.expect.i64(i64 %246, i64 0)
  %248 = icmp ne i64 %247, 0
  br i1 %248, label %250, label %249

249:                                              ; preds = %238
  store i1 true, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %926

250:                                              ; preds = %238
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #7
  store i64 0, ptr %6, align 8, !tbaa !35
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  store i64 0, ptr %7, align 8, !tbaa !35
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  %251 = load ptr, ptr %4, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.dpl, ptr %251, i32 0, i32 1
  %253 = load i64, ptr %252, align 8, !tbaa !23
  store i64 %253, ptr %8, align 8, !tbaa !35
  br label %254

254:                                              ; preds = %748, %250
  %255 = load i64, ptr %8, align 8, !tbaa !35
  %256 = icmp ugt i64 %255, 0
  br i1 %256, label %258, label %257

257:                                              ; preds = %254
  store i32 22, ptr %5, align 4
  br label %751

258:                                              ; preds = %254
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #7
  %259 = load ptr, ptr %4, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.dpl, ptr %259, i32 0, i32 4
  %261 = load i64, ptr %8, align 8, !tbaa !35
  %262 = getelementptr inbounds [18 x %struct.dp], ptr %260, i64 0, i64 %261
  %263 = getelementptr inbounds %struct.dp, ptr %262, i32 0, i32 0
  %264 = load ptr, ptr %263, align 8, !tbaa !36
  store ptr %264, ptr %9, align 8, !tbaa !5
  %265 = load ptr, ptr %9, align 8, !tbaa !5
  %266 = icmp ne ptr %265, null
  br i1 %266, label %268, label %267

267:                                              ; preds = %258
  store i32 24, ptr %5, align 4
  br label %745

268:                                              ; preds = %258
  br label %269

269:                                              ; preds = %268
  %270 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %271 = zext i8 %270 to i32
  %272 = and i32 %271, 1
  %273 = icmp ne i32 %272, 0
  %274 = xor i1 %273, true
  %275 = xor i1 %274, true
  %276 = zext i1 %275 to i32
  %277 = sext i32 %276 to i64
  %278 = call i64 @llvm.expect.i64(i64 %277, i64 1)
  %279 = icmp ne i64 %278, 0
  br i1 %279, label %280, label %306

280:                                              ; preds = %269
  br label %281

281:                                              ; preds = %280
  %282 = load ptr, ptr %9, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.page, ptr %282, i32 0, i32 4
  %284 = load i32, ptr %283, align 1, !tbaa !37
  %285 = load ptr, ptr %4, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.dpl, ptr %285, i32 0, i32 4
  %287 = load i64, ptr %8, align 8, !tbaa !35
  %288 = getelementptr inbounds [18 x %struct.dp], ptr %286, i64 0, i64 %287
  %289 = getelementptr inbounds %struct.dp, ptr %288, i32 0, i32 1
  %290 = load i32, ptr %289, align 8, !tbaa !21
  %291 = icmp eq i32 %284, %290
  %292 = xor i1 %291, true
  %293 = xor i1 %292, true
  %294 = xor i1 %293, true
  %295 = zext i1 %294 to i32
  %296 = sext i32 %295 to i64
  %297 = call i64 @llvm.expect.i64(i64 %296, i64 0)
  %298 = icmp ne i64 %297, 0
  br i1 %298, label %299, label %303

299:                                              ; preds = %281
  %300 = load ptr, ptr %3, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.MDBX_txn, ptr %300, i32 0, i32 9
  %302 = load ptr, ptr %301, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %302, ptr noundef @.str.20, ptr noundef @__func__.dpl_check, i32 noundef 338) #6
  unreachable

303:                                              ; preds = %281
  br label %304

304:                                              ; preds = %303
  br label %305

305:                                              ; preds = %304
  br label %306

306:                                              ; preds = %305, %269
  br label %307

307:                                              ; preds = %306
  br label %308

308:                                              ; preds = %307
  %309 = load ptr, ptr %9, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.page, ptr %309, i32 0, i32 4
  %311 = load i32, ptr %310, align 1, !tbaa !37
  %312 = load ptr, ptr %4, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.dpl, ptr %312, i32 0, i32 4
  %314 = load i64, ptr %8, align 8, !tbaa !35
  %315 = getelementptr inbounds [18 x %struct.dp], ptr %313, i64 0, i64 %314
  %316 = getelementptr inbounds %struct.dp, ptr %315, i32 0, i32 1
  %317 = load i32, ptr %316, align 8, !tbaa !21
  %318 = icmp ne i32 %311, %317
  %319 = xor i1 %318, true
  %320 = xor i1 %319, true
  %321 = zext i1 %320 to i32
  %322 = sext i32 %321 to i64
  %323 = call i64 @llvm.expect.i64(i64 %322, i64 0)
  %324 = icmp ne i64 %323, 0
  br i1 %324, label %325, label %326

325:                                              ; preds = %308
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %745

326:                                              ; preds = %308
  %327 = load ptr, ptr %3, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.MDBX_txn, ptr %327, i32 0, i32 1
  %329 = load i32, ptr %328, align 4, !tbaa !14
  %330 = and i32 %329, 524288
  %331 = icmp eq i32 %330, 0
  br i1 %331, label %332, label %381

332:                                              ; preds = %326
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #7
  %333 = load ptr, ptr %3, align 8, !tbaa !5
  %334 = load i64, ptr %8, align 8, !tbaa !35
  %335 = call i32 @dpl_age(ptr noundef %333, i64 noundef %334) #8
  store i32 %335, ptr %10, align 4, !tbaa !37
  br label %336

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

347:                                              ; preds = %336
  br label %348

348:                                              ; preds = %347
  %349 = load i32, ptr %10, align 4, !tbaa !37
  %350 = icmp ult i32 %349, 1431655765
  %351 = xor i1 %350, true
  %352 = xor i1 %351, true
  %353 = xor i1 %352, true
  %354 = zext i1 %353 to i32
  %355 = sext i32 %354 to i64
  %356 = call i64 @llvm.expect.i64(i64 %355, i64 0)
  %357 = icmp ne i64 %356, 0
  br i1 %357, label %358, label %362

358:                                              ; preds = %348
  %359 = load ptr, ptr %3, align 8, !tbaa !5
  %360 = getelementptr inbounds %struct.MDBX_txn, ptr %359, i32 0, i32 9
  %361 = load ptr, ptr %360, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %361, ptr noundef @.str.21, ptr noundef @__func__.dpl_check, i32 noundef 344) #6
  unreachable

362:                                              ; preds = %348
  br label %363

363:                                              ; preds = %362
  br label %364

364:                                              ; preds = %363
  br label %365

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

366:                                              ; preds = %365
  br label %367

367:                                              ; preds = %366
  %368 = load i32, ptr %10, align 4, !tbaa !37
  %369 = icmp ugt i32 %368, 1431655765
  %370 = xor i1 %369, true
  %371 = xor i1 %370, true
  %372 = zext i1 %371 to i32
  %373 = sext i32 %372 to i64
  %374 = call i64 @llvm.expect.i64(i64 %373, i64 0)
  %375 = icmp ne i64 %374, 0
  br i1 %375, label %376, label %377

376:                                              ; preds = %367
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %378

377:                                              ; preds = %367
  store i32 0, ptr %5, align 4
  br label %378

378:                                              ; preds = %377, %376
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #7
  %379 = load i32, ptr %5, align 4
  switch i32 %379, label %745 [
    i32 0, label %380
  ]

380:                                              ; preds = %378
  br label %381

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

382:                                              ; preds = %381
  %383 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %384 = zext i8 %383 to i32
  %385 = and i32 %384, 1
  %386 = icmp ne i32 %385, 0
  %387 = xor i1 %386, true
  %388 = xor i1 %387, true
  %389 = zext i1 %388 to i32
  %390 = sext i32 %389 to i64
  %391 = call i64 @llvm.expect.i64(i64 %390, i64 1)
  %392 = icmp ne i64 %391, 0
  br i1 %392, label %393, label %420

393:                                              ; preds = %382
  br label %394

394:                                              ; preds = %393
  %395 = load ptr, ptr %9, align 8, !tbaa !5
  %396 = getelementptr inbounds %struct.page, ptr %395, i32 0, i32 2
  %397 = load i16, ptr %396, align 1, !tbaa !38
  %398 = zext i16 %397 to i32
  %399 = icmp eq i32 %398, 16384
  br i1 %399, label %404, label %400

400:                                              ; preds = %394
  %401 = load ptr, ptr %3, align 8, !tbaa !5
  %402 = load ptr, ptr %9, align 8, !tbaa !5
  %403 = call zeroext i1 @is_modifable(ptr noundef %401, ptr noundef %402) #8
  br label %404

404:                                              ; preds = %400, %394
  %405 = phi i1 [ true, %394 ], [ %403, %400 ]
  %406 = xor i1 %405, true
  %407 = xor i1 %406, true
  %408 = xor i1 %407, true
  %409 = zext i1 %408 to i32
  %410 = sext i32 %409 to i64
  %411 = call i64 @llvm.expect.i64(i64 %410, i64 0)
  %412 = icmp ne i64 %411, 0
  br i1 %412, label %413, label %417

413:                                              ; preds = %404
  %414 = load ptr, ptr %3, align 8, !tbaa !5
  %415 = getelementptr inbounds %struct.MDBX_txn, ptr %414, i32 0, i32 9
  %416 = load ptr, ptr %415, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %416, ptr noundef @.str.22, ptr noundef @__func__.dpl_check, i32 noundef 349) #6
  unreachable

417:                                              ; preds = %404
  br label %418

418:                                              ; preds = %417
  br label %419

419:                                              ; preds = %418
  br label %420

420:                                              ; preds = %419, %382
  br label %421

421:                                              ; preds = %420
  br label %422

422:                                              ; preds = %421
  %423 = load ptr, ptr %9, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.page, ptr %423, i32 0, i32 2
  %425 = load i16, ptr %424, align 1, !tbaa !38
  %426 = zext i16 %425 to i32
  %427 = icmp eq i32 %426, 16384
  br i1 %427, label %428, label %431

428:                                              ; preds = %422
  %429 = load i64, ptr %6, align 8, !tbaa !35
  %430 = add i64 %429, 1
  store i64 %430, ptr %6, align 8, !tbaa !35
  br label %444

431:                                              ; preds = %422
  %432 = load ptr, ptr %3, align 8, !tbaa !5
  %433 = load ptr, ptr %9, align 8, !tbaa !5
  %434 = call zeroext i1 @is_modifable(ptr noundef %432, ptr noundef %433) #8
  %435 = xor i1 %434, true
  %436 = xor i1 %435, true
  %437 = xor i1 %436, true
  %438 = zext i1 %437 to i32
  %439 = sext i32 %438 to i64
  %440 = call i64 @llvm.expect.i64(i64 %439, i64 0)
  %441 = icmp ne i64 %440, 0
  br i1 %441, label %442, label %443

442:                                              ; preds = %431
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %745

443:                                              ; preds = %431
  br label %444

444:                                              ; preds = %443, %428
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #7
  %445 = load ptr, ptr %4, align 8, !tbaa !5
  %446 = load i64, ptr %8, align 8, !tbaa !35
  %447 = call i32 @dpl_npages(ptr noundef %445, i64 noundef %446) #8
  store i32 %447, ptr %11, align 4, !tbaa !37
  %448 = load i32, ptr %11, align 4, !tbaa !37
  %449 = zext i32 %448 to i64
  %450 = load i64, ptr %7, align 8, !tbaa !35
  %451 = add i64 %450, %449
  store i64 %451, ptr %7, align 8, !tbaa !35
  br label %452

452:                                              ; preds = %444
  %453 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %454 = zext i8 %453 to i32
  %455 = and i32 %454, 1
  %456 = icmp ne i32 %455, 0
  %457 = xor i1 %456, true
  %458 = xor i1 %457, true
  %459 = zext i1 %458 to i32
  %460 = sext i32 %459 to i64
  %461 = call i64 @llvm.expect.i64(i64 %460, i64 1)
  %462 = icmp ne i64 %461, 0
  br i1 %462, label %463, label %489

463:                                              ; preds = %452
  br label %464

464:                                              ; preds = %463
  %465 = load ptr, ptr %3, align 8, !tbaa !5
  %466 = getelementptr inbounds %struct.MDBX_txn, ptr %465, i32 0, i32 6
  %467 = getelementptr inbounds %struct.geo, ptr %466, i32 0, i32 5
  %468 = load i32, ptr %467, align 8, !tbaa !20
  %469 = load ptr, ptr %9, align 8, !tbaa !5
  %470 = getelementptr inbounds %struct.page, ptr %469, i32 0, i32 4
  %471 = load i32, ptr %470, align 1, !tbaa !37
  %472 = load i32, ptr %11, align 4, !tbaa !37
  %473 = add i32 %471, %472
  %474 = icmp uge i32 %468, %473
  %475 = xor i1 %474, true
  %476 = xor i1 %475, true
  %477 = xor i1 %476, true
  %478 = zext i1 %477 to i32
  %479 = sext i32 %478 to i64
  %480 = call i64 @llvm.expect.i64(i64 %479, i64 0)
  %481 = icmp ne i64 %480, 0
  br i1 %481, label %482, label %486

482:                                              ; preds = %464
  %483 = load ptr, ptr %3, align 8, !tbaa !5
  %484 = getelementptr inbounds %struct.MDBX_txn, ptr %483, i32 0, i32 9
  %485 = load ptr, ptr %484, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %485, ptr noundef @.str.23, ptr noundef @__func__.dpl_check, i32 noundef 357) #6
  unreachable

486:                                              ; preds = %464
  br label %487

487:                                              ; preds = %486
  br label %488

488:                                              ; preds = %487
  br label %489

489:                                              ; preds = %488, %452
  br label %490

490:                                              ; preds = %489
  br label %491

491:                                              ; preds = %490
  %492 = load ptr, ptr %3, align 8, !tbaa !5
  %493 = getelementptr inbounds %struct.MDBX_txn, ptr %492, i32 0, i32 6
  %494 = getelementptr inbounds %struct.geo, ptr %493, i32 0, i32 5
  %495 = load i32, ptr %494, align 8, !tbaa !20
  %496 = load ptr, ptr %9, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.page, ptr %496, i32 0, i32 4
  %498 = load i32, ptr %497, align 1, !tbaa !37
  %499 = load i32, ptr %11, align 4, !tbaa !37
  %500 = add i32 %498, %499
  %501 = icmp ult i32 %495, %500
  %502 = xor i1 %501, true
  %503 = xor i1 %502, true
  %504 = zext i1 %503 to i32
  %505 = sext i32 %504 to i64
  %506 = call i64 @llvm.expect.i64(i64 %505, i64 0)
  %507 = icmp ne i64 %506, 0
  br i1 %507, label %508, label %509

508:                                              ; preds = %491
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %744

509:                                              ; preds = %491
  %510 = load i64, ptr %8, align 8, !tbaa !35
  %511 = load ptr, ptr %4, align 8, !tbaa !5
  %512 = getelementptr inbounds %struct.dpl, ptr %511, i32 0, i32 0
  %513 = load i64, ptr %512, align 8, !tbaa !39
  %514 = icmp ult i64 %510, %513
  br i1 %514, label %515, label %580

515:                                              ; preds = %509
  br label %516

516:                                              ; preds = %515
  %517 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %518 = zext i8 %517 to i32
  %519 = and i32 %518, 1
  %520 = icmp ne i32 %519, 0
  %521 = xor i1 %520, true
  %522 = xor i1 %521, true
  %523 = zext i1 %522 to i32
  %524 = sext i32 %523 to i64
  %525 = call i64 @llvm.expect.i64(i64 %524, i64 1)
  %526 = icmp ne i64 %525, 0
  br i1 %526, label %527, label %556

527:                                              ; preds = %516
  br label %528

528:                                              ; preds = %527
  %529 = load ptr, ptr %4, align 8, !tbaa !5
  %530 = getelementptr inbounds %struct.dpl, ptr %529, i32 0, i32 4
  %531 = load i64, ptr %8, align 8, !tbaa !35
  %532 = add i64 %531, 1
  %533 = getelementptr inbounds [18 x %struct.dp], ptr %530, i64 0, i64 %532
  %534 = getelementptr inbounds %struct.dp, ptr %533, i32 0, i32 1
  %535 = load i32, ptr %534, align 8, !tbaa !21
  %536 = load ptr, ptr %9, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.page, ptr %536, i32 0, i32 4
  %538 = load i32, ptr %537, align 1, !tbaa !37
  %539 = load i32, ptr %11, align 4, !tbaa !37
  %540 = add i32 %538, %539
  %541 = icmp uge i32 %535, %540
  %542 = xor i1 %541, true
  %543 = xor i1 %542, true
  %544 = xor i1 %543, true
  %545 = zext i1 %544 to i32
  %546 = sext i32 %545 to i64
  %547 = call i64 @llvm.expect.i64(i64 %546, i64 0)
  %548 = icmp ne i64 %547, 0
  br i1 %548, label %549, label %553

549:                                              ; preds = %528
  %550 = load ptr, ptr %3, align 8, !tbaa !5
  %551 = getelementptr inbounds %struct.MDBX_txn, ptr %550, i32 0, i32 9
  %552 = load ptr, ptr %551, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %552, ptr noundef @.str.24, ptr noundef @__func__.dpl_check, i32 noundef 362) #6
  unreachable

553:                                              ; preds = %528
  br label %554

554:                                              ; preds = %553
  br label %555

555:                                              ; preds = %554
  br label %556

556:                                              ; preds = %555, %516
  br label %557

557:                                              ; preds = %556
  br label %558

558:                                              ; preds = %557
  %559 = load ptr, ptr %4, align 8, !tbaa !5
  %560 = getelementptr inbounds %struct.dpl, ptr %559, i32 0, i32 4
  %561 = load i64, ptr %8, align 8, !tbaa !35
  %562 = add i64 %561, 1
  %563 = getelementptr inbounds [18 x %struct.dp], ptr %560, i64 0, i64 %562
  %564 = getelementptr inbounds %struct.dp, ptr %563, i32 0, i32 1
  %565 = load i32, ptr %564, align 8, !tbaa !21
  %566 = load ptr, ptr %9, align 8, !tbaa !5
  %567 = getelementptr inbounds %struct.page, ptr %566, i32 0, i32 4
  %568 = load i32, ptr %567, align 1, !tbaa !37
  %569 = load i32, ptr %11, align 4, !tbaa !37
  %570 = add i32 %568, %569
  %571 = icmp ult i32 %565, %570
  %572 = xor i1 %571, true
  %573 = xor i1 %572, true
  %574 = zext i1 %573 to i32
  %575 = sext i32 %574 to i64
  %576 = call i64 @llvm.expect.i64(i64 %575, i64 0)
  %577 = icmp ne i64 %576, 0
  br i1 %577, label %578, label %579

578:                                              ; preds = %558
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %744

579:                                              ; preds = %558
  br label %580

580:                                              ; preds = %579, %509
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  %581 = load ptr, ptr %3, align 8, !tbaa !5
  %582 = getelementptr inbounds %struct.MDBX_txn, ptr %581, i32 0, i32 17
  %583 = getelementptr inbounds %struct.anon.2, ptr %582, i32 0, i32 1
  %584 = load ptr, ptr %583, align 8, !tbaa !20
  %585 = load ptr, ptr %9, align 8, !tbaa !5
  %586 = getelementptr inbounds %struct.page, ptr %585, i32 0, i32 4
  %587 = load i32, ptr %586, align 1, !tbaa !37
  %588 = load ptr, ptr %3, align 8, !tbaa !5
  %589 = getelementptr inbounds %struct.MDBX_txn, ptr %588, i32 0, i32 6
  %590 = getelementptr inbounds %struct.geo, ptr %589, i32 0, i32 5
  %591 = load i32, ptr %590, align 8, !tbaa !20
  %592 = zext i32 %591 to i64
  %593 = call i64 @pnl_search(ptr noundef %584, i32 noundef %587, i64 noundef %592) #8
  store i64 %593, ptr %12, align 8, !tbaa !35
  br label %594

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

605:                                              ; preds = %594
  br label %606

606:                                              ; preds = %605
  %607 = load i64, ptr %12, align 8, !tbaa !35
  %608 = load ptr, ptr %3, align 8, !tbaa !5
  %609 = getelementptr inbounds %struct.MDBX_txn, ptr %608, i32 0, i32 17
  %610 = getelementptr inbounds %struct.anon.2, ptr %609, i32 0, i32 1
  %611 = load ptr, ptr %610, align 8, !tbaa !20
  %612 = getelementptr inbounds i32, ptr %611, i64 0
  %613 = load i32, ptr %612, align 4, !tbaa !37
  %614 = zext i32 %613 to i64
  %615 = icmp ugt i64 %607, %614
  br i1 %615, label %628, label %616

616:                                              ; preds = %606
  %617 = load ptr, ptr %3, align 8, !tbaa !5
  %618 = getelementptr inbounds %struct.MDBX_txn, ptr %617, i32 0, i32 17
  %619 = getelementptr inbounds %struct.anon.2, ptr %618, i32 0, i32 1
  %620 = load ptr, ptr %619, align 8, !tbaa !20
  %621 = load i64, ptr %12, align 8, !tbaa !35
  %622 = getelementptr inbounds i32, ptr %620, i64 %621
  %623 = load i32, ptr %622, align 4, !tbaa !37
  %624 = load ptr, ptr %9, align 8, !tbaa !5
  %625 = getelementptr inbounds %struct.page, ptr %624, i32 0, i32 4
  %626 = load i32, ptr %625, align 1, !tbaa !37
  %627 = icmp ne i32 %623, %626
  br label %628

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

637:                                              ; preds = %628
  %638 = load ptr, ptr %3, align 8, !tbaa !5
  %639 = getelementptr inbounds %struct.MDBX_txn, ptr %638, i32 0, i32 9
  %640 = load ptr, ptr %639, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %640, ptr noundef @.str.25, ptr noundef @__func__.dpl_check, i32 noundef 368) #6
  unreachable

641:                                              ; preds = %628
  br label %642

642:                                              ; preds = %641
  br label %643

643:                                              ; preds = %642
  br label %644

644:                                              ; preds = %643, %594
  br label %645

645:                                              ; preds = %644
  br label %646

646:                                              ; preds = %645
  %647 = load i64, ptr %12, align 8, !tbaa !35
  %648 = load ptr, ptr %3, align 8, !tbaa !5
  %649 = getelementptr inbounds %struct.MDBX_txn, ptr %648, i32 0, i32 17
  %650 = getelementptr inbounds %struct.anon.2, ptr %649, i32 0, i32 1
  %651 = load ptr, ptr %650, align 8, !tbaa !20
  %652 = getelementptr inbounds i32, ptr %651, i64 0
  %653 = load i32, ptr %652, align 4, !tbaa !37
  %654 = zext i32 %653 to i64
  %655 = icmp ule i64 %647, %654
  br i1 %655, label %656, label %675

656:                                              ; preds = %646
  %657 = load ptr, ptr %3, align 8, !tbaa !5
  %658 = getelementptr inbounds %struct.MDBX_txn, ptr %657, i32 0, i32 17
  %659 = getelementptr inbounds %struct.anon.2, ptr %658, i32 0, i32 1
  %660 = load ptr, ptr %659, align 8, !tbaa !20
  %661 = load i64, ptr %12, align 8, !tbaa !35
  %662 = getelementptr inbounds i32, ptr %660, i64 %661
  %663 = load i32, ptr %662, align 4, !tbaa !37
  %664 = load ptr, ptr %9, align 8, !tbaa !5
  %665 = getelementptr inbounds %struct.page, ptr %664, i32 0, i32 4
  %666 = load i32, ptr %665, align 1, !tbaa !37
  %667 = icmp eq i32 %663, %666
  %668 = xor i1 %667, true
  %669 = xor i1 %668, true
  %670 = zext i1 %669 to i32
  %671 = sext i32 %670 to i64
  %672 = call i64 @llvm.expect.i64(i64 %671, i64 0)
  %673 = icmp ne i64 %672, 0
  br i1 %673, label %674, label %675

674:                                              ; preds = %656
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %743

675:                                              ; preds = %656, %646
  %676 = load i32, ptr %11, align 4, !tbaa !37
  %677 = icmp ugt i32 %676, 1
  br i1 %677, label %678, label %742

678:                                              ; preds = %675
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #7
  %679 = load ptr, ptr %3, align 8, !tbaa !5
  %680 = getelementptr inbounds %struct.MDBX_txn, ptr %679, i32 0, i32 17
  %681 = getelementptr inbounds %struct.anon.2, ptr %680, i32 0, i32 1
  %682 = load ptr, ptr %681, align 8, !tbaa !20
  %683 = load ptr, ptr %9, align 8, !tbaa !5
  %684 = getelementptr inbounds %struct.page, ptr %683, i32 0, i32 4
  %685 = load i32, ptr %684, align 1, !tbaa !37
  %686 = load i32, ptr %11, align 4, !tbaa !37
  %687 = add i32 %685, %686
  %688 = sub i32 %687, 1
  %689 = load ptr, ptr %3, align 8, !tbaa !5
  %690 = getelementptr inbounds %struct.MDBX_txn, ptr %689, i32 0, i32 6
  %691 = getelementptr inbounds %struct.geo, ptr %690, i32 0, i32 5
  %692 = load i32, ptr %691, align 8, !tbaa !20
  %693 = zext i32 %692 to i64
  %694 = call i64 @pnl_search(ptr noundef %682, i32 noundef %688, i64 noundef %693) #8
  store i64 %694, ptr %13, align 8, !tbaa !35
  br label %695

695:                                              ; preds = %678
  %696 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %697 = zext i8 %696 to i32
  %698 = and i32 %697, 1
  %699 = icmp ne i32 %698, 0
  %700 = xor i1 %699, true
  %701 = xor i1 %700, true
  %702 = zext i1 %701 to i32
  %703 = sext i32 %702 to i64
  %704 = call i64 @llvm.expect.i64(i64 %703, i64 1)
  %705 = icmp ne i64 %704, 0
  br i1 %705, label %706, label %725

706:                                              ; preds = %695
  br label %707

707:                                              ; preds = %706
  %708 = load i64, ptr %12, align 8, !tbaa !35
  %709 = load i64, ptr %13, align 8, !tbaa !35
  %710 = icmp eq i64 %708, %709
  %711 = xor i1 %710, true
  %712 = xor i1 %711, true
  %713 = xor i1 %712, true
  %714 = zext i1 %713 to i32
  %715 = sext i32 %714 to i64
  %716 = call i64 @llvm.expect.i64(i64 %715, i64 0)
  %717 = icmp ne i64 %716, 0
  br i1 %717, label %718, label %722

718:                                              ; preds = %707
  %719 = load ptr, ptr %3, align 8, !tbaa !5
  %720 = getelementptr inbounds %struct.MDBX_txn, ptr %719, i32 0, i32 9
  %721 = load ptr, ptr %720, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %721, ptr noundef @.str.26, ptr noundef @__func__.dpl_check, i32 noundef 373) #6
  unreachable

722:                                              ; preds = %707
  br label %723

723:                                              ; preds = %722
  br label %724

724:                                              ; preds = %723
  br label %725

725:                                              ; preds = %724, %695
  br label %726

726:                                              ; preds = %725
  br label %727

727:                                              ; preds = %726
  %728 = load i64, ptr %12, align 8, !tbaa !35
  %729 = load i64, ptr %13, align 8, !tbaa !35
  %730 = icmp ne i64 %728, %729
  %731 = xor i1 %730, true
  %732 = xor i1 %731, true
  %733 = zext i1 %732 to i32
  %734 = sext i32 %733 to i64
  %735 = call i64 @llvm.expect.i64(i64 %734, i64 0)
  %736 = icmp ne i64 %735, 0
  br i1 %736, label %737, label %738

737:                                              ; preds = %727
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %739

738:                                              ; preds = %727
  store i32 0, ptr %5, align 4
  br label %739

739:                                              ; preds = %738, %737
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #7
  %740 = load i32, ptr %5, align 4
  switch i32 %740, label %743 [
    i32 0, label %741
  ]

741:                                              ; preds = %739
  br label %742

742:                                              ; preds = %741, %675
  store i32 0, ptr %5, align 4
  br label %743

743:                                              ; preds = %742, %739, %674
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  br label %744

744:                                              ; preds = %743, %578, %508
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #7
  br label %745

745:                                              ; preds = %744, %442, %378, %325, %267
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #7
  %746 = load i32, ptr %5, align 4
  switch i32 %746, label %751 [
    i32 0, label %747
    i32 24, label %748
  ]

747:                                              ; preds = %745
  br label %748

748:                                              ; preds = %747, %745
  %749 = load i64, ptr %8, align 8, !tbaa !35
  %750 = add i64 %749, -1
  store i64 %750, ptr %8, align 8, !tbaa !35
  br label %254, !llvm.loop !40

751:                                              ; preds = %745, %257
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  %752 = load i32, ptr %5, align 4
  switch i32 %752, label %925 [
    i32 22, label %753
  ]

753:                                              ; preds = %751
  br label %754

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

765:                                              ; preds = %754
  br label %766

766:                                              ; preds = %765
  %767 = load i64, ptr %6, align 8, !tbaa !35
  %768 = load ptr, ptr %3, align 8, !tbaa !5
  %769 = getelementptr inbounds %struct.MDBX_txn, ptr %768, i32 0, i32 17
  %770 = getelementptr inbounds %struct.anon.2, ptr %769, i32 0, i32 10
  %771 = load i64, ptr %770, align 8, !tbaa !20
  %772 = icmp eq i64 %767, %771
  %773 = xor i1 %772, true
  %774 = xor i1 %773, true
  %775 = xor i1 %774, true
  %776 = zext i1 %775 to i32
  %777 = sext i32 %776 to i64
  %778 = call i64 @llvm.expect.i64(i64 %777, i64 0)
  %779 = icmp ne i64 %778, 0
  br i1 %779, label %780, label %784

780:                                              ; preds = %766
  %781 = load ptr, ptr %3, align 8, !tbaa !5
  %782 = getelementptr inbounds %struct.MDBX_txn, ptr %781, i32 0, i32 9
  %783 = load ptr, ptr %782, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %783, ptr noundef @.str.27, ptr noundef @__func__.dpl_check, i32 noundef 379) #6
  unreachable

784:                                              ; preds = %766
  br label %785

785:                                              ; preds = %784
  br label %786

786:                                              ; preds = %785
  br label %787

787:                                              ; preds = %786, %754
  br label %788

788:                                              ; preds = %787
  br label %789

789:                                              ; preds = %788
  %790 = load i64, ptr %6, align 8, !tbaa !35
  %791 = load ptr, ptr %3, align 8, !tbaa !5
  %792 = getelementptr inbounds %struct.MDBX_txn, ptr %791, i32 0, i32 17
  %793 = getelementptr inbounds %struct.anon.2, ptr %792, i32 0, i32 10
  %794 = load i64, ptr %793, align 8, !tbaa !20
  %795 = icmp ne i64 %790, %794
  %796 = xor i1 %795, true
  %797 = xor i1 %796, true
  %798 = zext i1 %797 to i32
  %799 = sext i32 %798 to i64
  %800 = call i64 @llvm.expect.i64(i64 %799, i64 0)
  %801 = icmp ne i64 %800, 0
  br i1 %801, label %802, label %803

802:                                              ; preds = %789
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %925

803:                                              ; preds = %789
  br label %804

804:                                              ; preds = %803
  %805 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %806 = zext i8 %805 to i32
  %807 = and i32 %806, 1
  %808 = icmp ne i32 %807, 0
  %809 = xor i1 %808, true
  %810 = xor i1 %809, true
  %811 = zext i1 %810 to i32
  %812 = sext i32 %811 to i64
  %813 = call i64 @llvm.expect.i64(i64 %812, i64 1)
  %814 = icmp ne i64 %813, 0
  br i1 %814, label %815, label %836

815:                                              ; preds = %804
  br label %816

816:                                              ; preds = %815
  %817 = load i64, ptr %7, align 8, !tbaa !35
  %818 = load ptr, ptr %4, align 8, !tbaa !5
  %819 = getelementptr inbounds %struct.dpl, ptr %818, i32 0, i32 2
  %820 = load i64, ptr %819, align 8, !tbaa !42
  %821 = icmp eq i64 %817, %820
  %822 = xor i1 %821, true
  %823 = xor i1 %822, true
  %824 = xor i1 %823, true
  %825 = zext i1 %824 to i32
  %826 = sext i32 %825 to i64
  %827 = call i64 @llvm.expect.i64(i64 %826, i64 0)
  %828 = icmp ne i64 %827, 0
  br i1 %828, label %829, label %833

829:                                              ; preds = %816
  %830 = load ptr, ptr %3, align 8, !tbaa !5
  %831 = getelementptr inbounds %struct.MDBX_txn, ptr %830, i32 0, i32 9
  %832 = load ptr, ptr %831, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %832, ptr noundef @.str.28, ptr noundef @__func__.dpl_check, i32 noundef 383) #6
  unreachable

833:                                              ; preds = %816
  br label %834

834:                                              ; preds = %833
  br label %835

835:                                              ; preds = %834
  br label %836

836:                                              ; preds = %835, %804
  br label %837

837:                                              ; preds = %836
  br label %838

838:                                              ; preds = %837
  %839 = load i64, ptr %7, align 8, !tbaa !35
  %840 = load ptr, ptr %4, align 8, !tbaa !5
  %841 = getelementptr inbounds %struct.dpl, ptr %840, i32 0, i32 2
  %842 = load i64, ptr %841, align 8, !tbaa !42
  %843 = icmp ne i64 %839, %842
  %844 = xor i1 %843, true
  %845 = xor i1 %844, true
  %846 = zext i1 %845 to i32
  %847 = sext i32 %846 to i64
  %848 = call i64 @llvm.expect.i64(i64 %847, i64 0)
  %849 = icmp ne i64 %848, 0
  br i1 %849, label %850, label %851

850:                                              ; preds = %838
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %925

851:                                              ; preds = %838
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  store i64 1, ptr %14, align 8, !tbaa !35
  br label %852

852:                                              ; preds = %919, %851
  %853 = load i64, ptr %14, align 8, !tbaa !35
  %854 = load ptr, ptr %3, align 8, !tbaa !5
  %855 = getelementptr inbounds %struct.MDBX_txn, ptr %854, i32 0, i32 17
  %856 = getelementptr inbounds %struct.anon.2, ptr %855, i32 0, i32 8
  %857 = load ptr, ptr %856, align 8, !tbaa !20
  %858 = getelementptr inbounds i32, ptr %857, i64 0
  %859 = load i32, ptr %858, align 4, !tbaa !37
  %860 = zext i32 %859 to i64
  %861 = icmp ule i64 %853, %860
  br i1 %861, label %863, label %862

862:                                              ; preds = %852
  store i32 61, ptr %5, align 4
  br label %922

863:                                              ; preds = %852
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #7
  %864 = load ptr, ptr %3, align 8, !tbaa !5
  %865 = load ptr, ptr %3, align 8, !tbaa !5
  %866 = getelementptr inbounds %struct.MDBX_txn, ptr %865, i32 0, i32 17
  %867 = getelementptr inbounds %struct.anon.2, ptr %866, i32 0, i32 8
  %868 = load ptr, ptr %867, align 8, !tbaa !20
  %869 = load i64, ptr %14, align 8, !tbaa !35
  %870 = getelementptr inbounds i32, ptr %868, i64 %869
  %871 = load i32, ptr %870, align 4, !tbaa !37
  %872 = call ptr @debug_dpl_find(ptr noundef %864, i32 noundef %871)
  store ptr %872, ptr %15, align 8, !tbaa !5
  br label %873

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

884:                                              ; preds = %873
  br label %885

885:                                              ; preds = %884
  %886 = load ptr, ptr %15, align 8, !tbaa !5
  %887 = icmp ne ptr %886, null
  %888 = xor i1 %887, true
  %889 = xor i1 %888, true
  %890 = xor i1 %889, true
  %891 = xor i1 %890, true
  %892 = zext i1 %891 to i32
  %893 = sext i32 %892 to i64
  %894 = call i64 @llvm.expect.i64(i64 %893, i64 0)
  %895 = icmp ne i64 %894, 0
  br i1 %895, label %896, label %900

896:                                              ; preds = %885
  %897 = load ptr, ptr %3, align 8, !tbaa !5
  %898 = getelementptr inbounds %struct.MDBX_txn, ptr %897, i32 0, i32 9
  %899 = load ptr, ptr %898, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %899, ptr noundef @.str.29, ptr noundef @__func__.dpl_check, i32 noundef 389) #6
  unreachable

900:                                              ; preds = %885
  br label %901

901:                                              ; preds = %900
  br label %902

902:                                              ; preds = %901
  br label %903

903:                                              ; preds = %902, %873
  br label %904

904:                                              ; preds = %903
  br label %905

905:                                              ; preds = %904
  %906 = load ptr, ptr %15, align 8, !tbaa !5
  %907 = icmp ne ptr %906, null
  %908 = xor i1 %907, true
  %909 = xor i1 %908, true
  %910 = zext i1 %909 to i32
  %911 = sext i32 %910 to i64
  %912 = call i64 @llvm.expect.i64(i64 %911, i64 0)
  %913 = icmp ne i64 %912, 0
  br i1 %913, label %914, label %915

914:                                              ; preds = %905
  store i1 false, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %916

915:                                              ; preds = %905
  store i32 0, ptr %5, align 4
  br label %916

916:                                              ; preds = %915, %914
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #7
  %917 = load i32, ptr %5, align 4
  switch i32 %917, label %922 [
    i32 0, label %918
  ]

918:                                              ; preds = %916
  br label %919

919:                                              ; preds = %918
  %920 = load i64, ptr %14, align 8, !tbaa !35
  %921 = add i64 %920, 1
  store i64 %921, ptr %14, align 8, !tbaa !35
  br label %852, !llvm.loop !43

922:                                              ; preds = %916, %862
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  %923 = load i32, ptr %5, align 4
  switch i32 %923, label %925 [
    i32 61, label %924
  ]

924:                                              ; preds = %922
  store i1 true, ptr %2, align 1
  store i32 1, ptr %5, align 4
  br label %925

925:                                              ; preds = %924, %922, %850, %802, %751
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #7
  br label %926

926:                                              ; preds = %925, %249, %93
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #7
  %927 = load i1, ptr %2, align 1
  ret i1 %927
}

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden zeroext i1 @is_modifable(ptr noundef, ptr noundef) #5

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !7, i64 25}
!10 = !{!"libmdbx_globals", !7, i64 0, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !12, i64 27, !11, i64 28, !7, i64 32, !7, i64 40, !13, i64 80, !6, i64 88}
!11 = !{!"int", !7, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !11, i64 4}
!15 = !{!"MDBX_txn", !11, i64 0, !11, i64 4, !13, i64 8, !13, i64 16, !6, i64 24, !6, i64 32, !16, i64 40, !13, i64 64, !13, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !18, i64 128, !6, i64 160, !7, i64 168}
!16 = !{!"geo", !17, i64 0, !17, i64 2, !11, i64 4, !11, i64 8, !7, i64 12, !7, i64 16}
!17 = !{!"short", !7, i64 0}
!18 = !{!"MDBX_canary", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24}
!19 = !{!15, !6, i64 80}
!20 = !{!7, !7, i64 0}
!21 = !{!22, !11, i64 8}
!22 = !{!"dp", !6, i64 0, !11, i64 8, !11, i64 12}
!23 = !{!24, !13, i64 8}
!24 = !{!"dpl", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !7, i64 32}
!25 = !{!15, !6, i64 24}
!26 = !{!27, !11, i64 272}
!27 = !{!"MDBX_env", !7, i64 0, !11, i64 4, !11, i64 8, !28, i64 16, !11, i64 56, !11, i64 60, !28, i64 64, !6, i64 104, !17, i64 112, !17, i64 114, !17, i64 116, !17, i64 118, !17, i64 120, !17, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !17, i64 130, !11, i64 132, !11, i64 136, !11, i64 140, !11, i64 144, !29, i64 152, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !11, i64 224, !11, i64 228, !11, i64 232, !6, i64 240, !6, i64 248, !13, i64 256, !30, i64 264, !32, i64 320, !12, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !33, i64 392, !7, i64 400, !11, i64 440, !11, i64 444, !6, i64 448, !34, i64 456, !7, i64 496, !7, i64 536}
!28 = !{!"osal_mmap", !7, i64 0, !11, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!29 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!30 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !13, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !11, i64 28, !11, i64 32, !12, i64 36, !12, i64 37, !12, i64 38, !31, i64 40, !7, i64 48}
!31 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!32 = !{!"", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!33 = !{!"", !13, i64 0}
!34 = !{!"osal_ioring", !11, i64 0, !11, i64 4, !11, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!35 = !{!13, !13, i64 0}
!36 = !{!22, !6, i64 0}
!37 = !{!11, !11, i64 0}
!38 = !{!17, !17, i64 0}
!39 = !{!24, !13, i64 0}
!40 = distinct !{!40, !41}
!41 = !{!"llvm.loop.mustprogress"}
!42 = !{!24, !13, i64 16}
!43 = distinct !{!43, !41}


; 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.6 }
%struct.anon.6 = 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.dp = type { ptr, i32, i32 }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str = external hidden unnamed_addr constant [36 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [40 x i8], align 1
@__func__.dpl_check = external hidden unnamed_addr constant [10 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [105 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1

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

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

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

4:                                                ; preds = %1
  %5 = getelementptr inbounds i8, ptr %0, i64 4
  %6 = load i32, ptr %5, align 4, !tbaa !14
  %7 = and i32 %6, 131072
  %.not143 = icmp eq i32 %7, 0
  br i1 %.not143, label %.thread, label %8, !prof !19

8:                                                ; preds = %4
  %9 = getelementptr inbounds i8, ptr %0, i64 80
  %10 = load ptr, ptr %9, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %10, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.dpl_check, i32 noundef 317) #4
  unreachable

11:                                               ; preds = %1
  %12 = getelementptr inbounds i8, ptr %0, i64 496
  %13 = load ptr, ptr %12, align 8, !tbaa !21
  %.not144 = icmp eq ptr %13, null
  br i1 %.not144, label %.loopexit, label %57

.thread:                                          ; preds = %4
  %14 = getelementptr inbounds i8, ptr %0, i64 496
  %15 = load ptr, ptr %14, align 8, !tbaa !21
  %.not144186 = icmp eq ptr %15, null
  %16 = and i32 %6, 524288
  %.not146 = icmp eq i32 %16, 0
  br i1 %.not144186, label %17, label %21

17:                                               ; preds = %.thread
  br i1 %.not146, label %18, label %.loopexit, !prof !13

18:                                               ; preds = %17
  %19 = getelementptr inbounds i8, ptr %0, i64 80
  %20 = load ptr, ptr %19, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %20, ptr noundef nonnull @.str.9, ptr noundef nonnull @__func__.dpl_check, i32 noundef 320) #4
  unreachable

21:                                               ; preds = %.thread
  br i1 %.not146, label %25, label %22, !prof !19

22:                                               ; preds = %21
  %23 = getelementptr inbounds i8, ptr %0, i64 80
  %24 = load ptr, ptr %23, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %24, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.dpl_check, i32 noundef 323) #4
  unreachable

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %15, i64 40
  %27 = load i32, ptr %26, align 8, !tbaa !22
  %28 = icmp eq i32 %27, 0
  br i1 %28, label %29, label %.critedge, !prof !19

29:                                               ; preds = %25
  %30 = getelementptr inbounds i8, ptr %15, i64 32
  %31 = getelementptr inbounds i8, ptr %15, i64 8
  %32 = load i64, ptr %31, align 8, !tbaa !24
  %33 = add i64 %32, 1
  %34 = getelementptr inbounds [18 x %struct.dp], ptr %30, i64 0, i64 %33, i32 1
  %35 = load i32, ptr %34, align 8, !tbaa !22
  %36 = icmp eq i32 %35, -1
  br i1 %36, label %37, label %.critedge, !prof !19

.critedge:                                        ; preds = %25, %29
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.dpl_check, i32 noundef 325) #4
  unreachable

37:                                               ; preds = %29
  %38 = getelementptr inbounds i8, ptr %0, i64 488
  %39 = load i64, ptr %38, align 8, !tbaa !21
  %40 = add i64 %32, %39
  %41 = getelementptr inbounds i8, ptr %0, i64 24
  %42 = load ptr, ptr %41, align 8, !tbaa !26
  %.not151 = icmp eq ptr %42, null
  br i1 %.not151, label %46, label %43

43:                                               ; preds = %37
  %44 = getelementptr inbounds i8, ptr %42, i64 488
  %45 = load i64, ptr %44, align 8, !tbaa !21
  br label %52

46:                                               ; preds = %37
  %47 = getelementptr inbounds i8, ptr %0, i64 80
  %48 = load ptr, ptr %47, align 8, !tbaa !20
  %49 = getelementptr inbounds i8, ptr %48, i64 272
  %50 = load i32, ptr %49, align 8, !tbaa !27
  %51 = zext i32 %50 to i64
  br label %52

52:                                               ; preds = %46, %43
  %53 = phi i64 [ %45, %43 ], [ %51, %46 ]
  %.not152 = icmp eq i64 %40, %53
  br i1 %.not152, label %57, label %54, !prof !19

54:                                               ; preds = %52
  %55 = getelementptr inbounds i8, ptr %0, i64 80
  %56 = load ptr, ptr %55, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %56, ptr noundef nonnull @.str.19, ptr noundef nonnull @__func__.dpl_check, i32 noundef 327) #4
  unreachable

57:                                               ; preds = %11, %52
  %58 = phi ptr [ %15, %52 ], [ %13, %11 ]
  %59 = and i8 %2, 2
  %.not153 = icmp eq i8 %59, 0
  br i1 %.not153, label %.loopexit, label %60, !prof !19

60:                                               ; preds = %57
  %61 = getelementptr inbounds i8, ptr %58, i64 8
  %62 = load i64, ptr %61, align 8, !tbaa !24
  %.not154221 = icmp eq i64 %62, 0
  br i1 %.not154221, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %60
  %63 = getelementptr inbounds i8, ptr %58, i64 32
  %64 = getelementptr inbounds i8, ptr %0, i64 4
  %.not159 = icmp ne i8 %3, 0
  %65 = getelementptr inbounds i8, ptr %0, i64 56
  %66 = getelementptr inbounds i8, ptr %0, i64 200
  br label %67

67:                                               ; preds = %.lr.ph, %138
  %.0128225 = phi i64 [ 0, %.lr.ph ], [ %.2130, %138 ]
  %.0132224 = phi i64 [ 0, %.lr.ph ], [ %.1133, %138 ]
  %.0135222 = phi i64 [ %62, %.lr.ph ], [ %139, %138 ]
  %68 = getelementptr inbounds [18 x %struct.dp], ptr %63, i64 0, i64 %.0135222
  %69 = load ptr, ptr %68, align 8, !tbaa !36
  %.not155 = icmp eq ptr %69, null
  br i1 %.not155, label %138, label %70

70:                                               ; preds = %67
  %.phi.trans.insert = getelementptr inbounds i8, ptr %69, i64 16
  %.pre = load i32, ptr %.phi.trans.insert, align 1, !tbaa !37
  %.phi.trans.insert235 = getelementptr inbounds i8, ptr %68, i64 8
  %.pre236 = load i32, ptr %.phi.trans.insert235, align 8, !tbaa !22
  %.not158 = icmp eq i32 %.pre, %.pre236
  br i1 %.not, label %75, label %71, !prof !13

71:                                               ; preds = %70
  br i1 %.not158, label %.thread253, label %72, !prof !19

72:                                               ; preds = %71
  %73 = getelementptr inbounds i8, ptr %0, i64 80
  %74 = load ptr, ptr %73, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %74, ptr noundef nonnull @.str.20, ptr noundef nonnull @__func__.dpl_check, i32 noundef 338) #4
  unreachable

75:                                               ; preds = %70
  br i1 %.not158, label %.thread253, label %.loopexit, !prof !38

.thread253:                                       ; preds = %71, %75
  %76 = phi i32 [ %.pre236, %75 ], [ %.pre, %71 ]
  %77 = load i32, ptr %64, align 4, !tbaa !14
  %78 = and i32 %77, 524288
  %79 = icmp eq i32 %78, 0
  br i1 %79, label %80, label %88

80:                                               ; preds = %.thread253
  %81 = tail call i32 @dpl_age(ptr noundef nonnull %0, i64 noundef %.0135222) #5
  %82 = icmp ugt i32 %81, 1431655764
  %or.cond = select i1 %.not159, i1 %82, i1 false
  br i1 %or.cond, label %83, label %86, !prof !39

83:                                               ; preds = %80
  %84 = getelementptr inbounds i8, ptr %0, i64 80
  %85 = load ptr, ptr %84, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %85, ptr noundef nonnull @.str.21, ptr noundef nonnull @__func__.dpl_check, i32 noundef 344) #4
  unreachable

86:                                               ; preds = %80
  %87 = icmp ult i32 %81, 1431655766
  br i1 %87, label %88, label %.loopexit

88:                                               ; preds = %.thread253, %86
  %.phi.trans.insert237 = getelementptr inbounds i8, ptr %69, i64 10
  %.pre238 = load i16, ptr %.phi.trans.insert237, align 1, !tbaa !40
  %89 = icmp eq i16 %.pre238, 16384
  br i1 %.not, label %.critedge181, label %90, !prof !13

90:                                               ; preds = %88
  br i1 %89, label %.critedge181.thread, label %91

91:                                               ; preds = %90
  %92 = tail call zeroext i1 @is_modifable(ptr noundef nonnull %0, ptr noundef nonnull %69) #5
  br i1 %92, label %.critedge181.thread255, label %93, !prof !19

93:                                               ; preds = %91
  %94 = getelementptr inbounds i8, ptr %0, i64 80
  %95 = load ptr, ptr %94, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %95, ptr noundef nonnull @.str.22, ptr noundef nonnull @__func__.dpl_check, i32 noundef 349) #4
  unreachable

.critedge181:                                     ; preds = %88
  br i1 %89, label %.critedge181.thread, label %.critedge181.thread255

.critedge181.thread:                              ; preds = %90, %.critedge181
  %96 = add i64 %.0128225, 1
  br label %98

.critedge181.thread255:                           ; preds = %91, %.critedge181
  %97 = tail call zeroext i1 @is_modifable(ptr noundef nonnull %0, ptr noundef nonnull %69) #5
  br i1 %97, label %98, label %.loopexit, !prof !19

98:                                               ; preds = %.critedge181.thread255, %.critedge181.thread
  %.1129 = phi i64 [ %96, %.critedge181.thread ], [ %.0128225, %.critedge181.thread255 ]
  %99 = tail call i32 @dpl_npages(ptr noundef nonnull %58, i64 noundef %.0135222) #5
  %100 = zext i32 %99 to i64
  %101 = add i64 %.0132224, %100
  %.pre239 = load i32, ptr %65, align 8, !tbaa !21
  %.pre249 = add i32 %99, %76
  %.not162 = icmp uge i32 %.pre239, %.pre249
  %or.cond257.not = select i1 %.not, i1 true, i1 %.not162
  br i1 %or.cond257.not, label %._crit_edge248, label %102, !prof !41

102:                                              ; preds = %98
  %103 = getelementptr inbounds i8, ptr %0, i64 80
  %104 = load ptr, ptr %103, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %104, ptr noundef nonnull @.str.23, ptr noundef nonnull @__func__.dpl_check, i32 noundef 357) #4
  unreachable

._crit_edge248:                                   ; preds = %98
  %105 = icmp ult i32 %.pre239, %.pre249
  br i1 %105, label %.loopexit, label %106, !prof !13

106:                                              ; preds = %._crit_edge248
  %107 = load i64, ptr %58, align 8, !tbaa !42
  %108 = icmp ult i64 %.0135222, %107
  br i1 %108, label %109, label %114

109:                                              ; preds = %106
  %.pre245 = add nuw i64 %.0135222, 1
  %.phi.trans.insert246 = getelementptr inbounds [18 x %struct.dp], ptr %63, i64 0, i64 %.pre245, i32 1
  %.pre247 = load i32, ptr %.phi.trans.insert246, align 8, !tbaa !22
  %.not164 = icmp uge i32 %.pre247, %.pre249
  %or.cond259.not = select i1 %.not, i1 true, i1 %.not164
  br i1 %or.cond259.not, label %._crit_edge240, label %110, !prof !41

110:                                              ; preds = %109
  %111 = getelementptr inbounds i8, ptr %0, i64 80
  %112 = load ptr, ptr %111, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %112, ptr noundef nonnull @.str.24, ptr noundef nonnull @__func__.dpl_check, i32 noundef 362) #4
  unreachable

._crit_edge240:                                   ; preds = %109
  %113 = icmp ult i32 %.pre247, %.pre249
  br i1 %113, label %.loopexit, label %114, !prof !13

114:                                              ; preds = %._crit_edge240, %106
  %115 = load ptr, ptr %66, align 8, !tbaa !21
  %116 = zext i32 %.pre239 to i64
  %117 = tail call i64 @pnl_search(ptr noundef %115, i32 noundef %76, i64 noundef %116) #5
  %.pre241 = load i32, ptr %115, align 4, !tbaa !37
  %.pre251 = zext i32 %.pre241 to i64
  %118 = icmp ugt i64 %117, %.pre251
  %or.cond260 = select i1 %.not, i1 true, i1 %118
  br i1 %or.cond260, label %.critedge183, label %119, !prof !43

119:                                              ; preds = %114
  %120 = getelementptr inbounds i32, ptr %115, i64 %117
  %121 = load i32, ptr %120, align 4, !tbaa !37
  %.not203 = icmp eq i32 %121, %76
  br i1 %.not203, label %122, label %.critedge183, !prof !13

122:                                              ; preds = %119
  %123 = getelementptr inbounds i8, ptr %0, i64 80
  %124 = load ptr, ptr %123, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %124, ptr noundef nonnull @.str.25, ptr noundef nonnull @__func__.dpl_check, i32 noundef 368) #4
  unreachable

.critedge183:                                     ; preds = %114, %119
  %.not166 = icmp ugt i64 %117, %.pre251
  br i1 %.not166, label %129, label %125

125:                                              ; preds = %.critedge183
  %126 = getelementptr inbounds i32, ptr %115, i64 %117
  %127 = load i32, ptr %126, align 4, !tbaa !37
  %128 = icmp eq i32 %127, %76
  br i1 %128, label %.loopexit, label %129, !prof !13

129:                                              ; preds = %125, %.critedge183
  %130 = icmp ugt i32 %99, 1
  br i1 %130, label %131, label %138

131:                                              ; preds = %129
  %132 = add i32 %.pre249, -1
  %133 = tail call i64 @pnl_search(ptr noundef nonnull %115, i32 noundef %132, i64 noundef %116) #5
  %.not168 = icmp eq i64 %117, %133
  %or.cond184 = select i1 %.not, i1 true, i1 %.not168
  br i1 %or.cond184, label %137, label %134, !prof !41

134:                                              ; preds = %131
  %135 = getelementptr inbounds i8, ptr %0, i64 80
  %136 = load ptr, ptr %135, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %136, ptr noundef nonnull @.str.26, ptr noundef nonnull @__func__.dpl_check, i32 noundef 373) #4
  unreachable

137:                                              ; preds = %131
  br i1 %.not168, label %138, label %.loopexit

138:                                              ; preds = %129, %137, %67
  %.1133 = phi i64 [ %.0132224, %67 ], [ %101, %137 ], [ %101, %129 ]
  %.2130 = phi i64 [ %.0128225, %67 ], [ %.1129, %137 ], [ %.1129, %129 ]
  %139 = add i64 %.0135222, -1
  %.not154 = icmp eq i64 %139, 0
  br i1 %.not154, label %._crit_edge, label %67, !llvm.loop !44

._crit_edge:                                      ; preds = %138, %60
  %.0132.lcssa = phi i64 [ 0, %60 ], [ %.1133, %138 ]
  %.0128.lcssa = phi i64 [ 0, %60 ], [ %.2130, %138 ]
  %140 = getelementptr inbounds i8, ptr %0, i64 520
  %141 = load i64, ptr %140, align 8, !tbaa !21
  %.not172 = icmp eq i64 %.0128.lcssa, %141
  br i1 %.not, label %146, label %142, !prof !13

142:                                              ; preds = %._crit_edge
  br i1 %.not172, label %.thread200, label %143, !prof !19

143:                                              ; preds = %142
  %144 = getelementptr inbounds i8, ptr %0, i64 80
  %145 = load ptr, ptr %144, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %145, ptr noundef nonnull @.str.27, ptr noundef nonnull @__func__.dpl_check, i32 noundef 379) #4
  unreachable

146:                                              ; preds = %._crit_edge
  br i1 %.not172, label %._crit_edge242, label %.loopexit, !prof !19

._crit_edge242:                                   ; preds = %146
  %.phi.trans.insert243 = getelementptr inbounds i8, ptr %58, i64 16
  %.pre244 = load i64, ptr %.phi.trans.insert243, align 8, !tbaa !46
  br label %152

.thread200:                                       ; preds = %142
  %147 = getelementptr inbounds i8, ptr %58, i64 16
  %148 = load i64, ptr %147, align 8, !tbaa !46
  %.not174 = icmp eq i64 %.0132.lcssa, %148
  br i1 %.not174, label %152, label %149, !prof !19

149:                                              ; preds = %.thread200
  %150 = getelementptr inbounds i8, ptr %0, i64 80
  %151 = load ptr, ptr %150, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %151, ptr noundef nonnull @.str.28, ptr noundef nonnull @__func__.dpl_check, i32 noundef 383) #4
  unreachable

152:                                              ; preds = %._crit_edge242, %.thread200
  %153 = phi i64 [ %.pre244, %._crit_edge242 ], [ %.0132.lcssa, %.thread200 ]
  %.not175 = icmp eq i64 %.0132.lcssa, %153
  br i1 %.not175, label %.preheader, label %.loopexit, !prof !19

.preheader:                                       ; preds = %152
  %154 = getelementptr inbounds i8, ptr %0, i64 504
  %155 = load ptr, ptr %154, align 8, !tbaa !21
  %156 = load i32, ptr %155, align 4, !tbaa !37
  %.not176227 = icmp eq i32 %156, 0
  br i1 %.not176227, label %.loopexit, label %.lr.ph229

157:                                              ; preds = %171
  %158 = add nuw nsw i64 %.0119228, 1
  %159 = load ptr, ptr %154, align 8, !tbaa !21
  %160 = load i32, ptr %159, align 4, !tbaa !37
  %161 = zext i32 %160 to i64
  %.not176.not = icmp ult i64 %.0119228, %161
  br i1 %.not176.not, label %.lr.ph229, label %.loopexit, !llvm.loop !47

.lr.ph229:                                        ; preds = %.preheader, %157
  %162 = phi ptr [ %159, %157 ], [ %155, %.preheader ]
  %.0119228 = phi i64 [ %158, %157 ], [ 1, %.preheader ]
  %163 = getelementptr inbounds i32, ptr %162, i64 %.0119228
  %164 = load i32, ptr %163, align 4, !tbaa !37
  %165 = tail call ptr @debug_dpl_find(ptr noundef nonnull %0, i32 noundef %164)
  %166 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %167 = and i8 %166, 1
  %.not177 = icmp eq i8 %167, 0
  %.not178 = icmp eq ptr %165, null
  %or.cond185 = select i1 %.not177, i1 true, i1 %.not178
  br i1 %or.cond185, label %171, label %168, !prof !41

168:                                              ; preds = %.lr.ph229
  %169 = getelementptr inbounds i8, ptr %0, i64 80
  %170 = load ptr, ptr %169, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %170, ptr noundef nonnull @.str.29, ptr noundef nonnull @__func__.dpl_check, i32 noundef 389) #4
  unreachable

171:                                              ; preds = %.lr.ph229
  br i1 %.not178, label %157, label %.loopexit

.loopexit:                                        ; preds = %125, %137, %._crit_edge240, %._crit_edge248, %.critedge181.thread255, %75, %86, %157, %171, %.preheader, %11, %146, %152, %57, %17
  %.13 = phi i1 [ true, %17 ], [ true, %57 ], [ false, %146 ], [ false, %152 ], [ true, %11 ], [ true, %.preheader ], [ %.not178, %171 ], [ %.not178, %157 ], [ false, %86 ], [ false, %75 ], [ false, %.critedge181.thread255 ], [ false, %._crit_edge248 ], [ false, %._crit_edge240 ], [ false, %137 ], [ false, %125 ]
  ret i1 %.13
}

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

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare hidden zeroext i1 @is_modifable(ptr noundef, ptr noundef) local_unnamed_addr #3

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 25}
!6 = !{!"libmdbx_globals", !7, i64 0, !9, i64 16, !9, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !10, i64 27, !9, i64 28, !7, i64 32, !7, i64 40, !11, i64 80, !12, i64 88}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"int", !7, i64 0}
!10 = !{!"_Bool", !7, i64 0}
!11 = !{!"long", !7, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!14 = !{!15, !9, i64 4}
!15 = !{!"MDBX_txn", !9, i64 0, !9, i64 4, !11, i64 8, !11, i64 16, !12, i64 24, !12, i64 32, !16, i64 40, !11, i64 64, !11, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120, !18, i64 128, !12, i64 160, !7, i64 168}
!16 = !{!"geo", !17, i64 0, !17, i64 2, !9, i64 4, !9, i64 8, !7, i64 12, !7, i64 16}
!17 = !{!"short", !7, i64 0}
!18 = !{!"MDBX_canary", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24}
!19 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!20 = !{!15, !12, i64 80}
!21 = !{!7, !7, i64 0}
!22 = !{!23, !9, i64 8}
!23 = !{!"dp", !12, i64 0, !9, i64 8, !9, i64 12}
!24 = !{!25, !11, i64 8}
!25 = !{!"dpl", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !7, i64 32}
!26 = !{!15, !12, i64 24}
!27 = !{!28, !9, i64 272}
!28 = !{!"MDBX_env", !7, i64 0, !9, i64 4, !9, i64 8, !29, i64 16, !9, i64 56, !9, i64 60, !29, i64 64, !12, i64 104, !17, i64 112, !17, i64 114, !17, i64 116, !17, i64 118, !17, i64 120, !17, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !17, i64 130, !9, i64 132, !9, i64 136, !9, i64 140, !9, i64 144, !30, i64 152, !12, i64 184, !12, i64 192, !12, i64 200, !12, i64 208, !12, i64 216, !9, i64 224, !9, i64 228, !9, i64 232, !12, i64 240, !12, i64 248, !11, i64 256, !31, i64 264, !33, i64 320, !10, i64 360, !12, i64 368, !12, i64 376, !12, i64 384, !34, i64 392, !7, i64 400, !9, i64 440, !9, i64 444, !12, i64 448, !35, i64 456, !7, i64 496, !7, i64 536}
!29 = !{!"osal_mmap", !7, i64 0, !9, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!30 = !{!"", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24}
!31 = !{!"", !9, i64 0, !9, i64 4, !9, i64 8, !9, i64 12, !11, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !9, i64 28, !9, i64 32, !10, i64 36, !10, i64 37, !10, i64 38, !32, i64 40, !7, i64 48}
!32 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!33 = !{!"", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!34 = !{!"", !11, i64 0}
!35 = !{!"osal_ioring", !9, i64 0, !9, i64 4, !9, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!36 = !{!23, !12, i64 0}
!37 = !{!9, !9, i64 0}
!38 = !{!"branch_weights", !"expected", i32 1072668, i32 2146410980}
!39 = !{!"branch_weights", i32 2000, i32 4002001}
!40 = !{!17, !17, i64 0}
!41 = !{!"branch_weights", i32 4002001, i32 2000}
!42 = !{!25, !11, i64 0}
!43 = !{!"branch_weights", i32 2002, i32 2000}
!44 = distinct !{!44, !45}
!45 = !{!"llvm.loop.mustprogress"}
!46 = !{!25, !11, i64 16}
!47 = distinct !{!47, !45}


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