; 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 }

@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
@__func__.dpl_sift = external hidden unnamed_addr constant [9 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [120 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: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #3

; Function Attrs: hot noinline nounwind willreturn memory(read) uwtable
declare dso_local i64 @dpl_search(ptr noundef, i32 noundef) #4

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

; Function Attrs: nounwind uwtable
define dso_local void @dpl_sift(ptr noundef %0, ptr noundef %1, i1 noundef zeroext %2) #6 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i8, align 1
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i8, align 1
  %18 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  %19 = zext i1 %2 to i8
  store i8 %19, ptr %6, align 1, !tbaa !9
  br label %20

20:                                               ; preds = %3
  %21 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %22 = zext i8 %21 to i32
  %23 = and i32 %22, 1
  %24 = icmp ne i32 %23, 0
  %25 = xor i1 %24, true
  %26 = xor i1 %25, true
  %27 = zext i1 %26 to i32
  %28 = sext i32 %27 to i64
  %29 = call i64 @llvm.expect.i64(i64 %28, i64 1)
  %30 = icmp ne i64 %29, 0
  br i1 %30, label %31, label %51

31:                                               ; preds = %20
  br label %32

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

45:                                               ; preds = %32
  %46 = load ptr, ptr %4, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.MDBX_txn, ptr %46, i32 0, i32 9
  %48 = load ptr, ptr %47, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %48, ptr noundef @.str, ptr noundef @__func__.dpl_sift, i32 noundef 414) #9
  unreachable

49:                                               ; preds = %32
  br label %50

50:                                               ; preds = %49
  br label %51

51:                                               ; preds = %50, %20
  br label %52

52:                                               ; preds = %51
  br label %53

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

64:                                               ; preds = %53
  br label %65

65:                                               ; preds = %64
  %66 = load ptr, ptr %4, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.MDBX_txn, ptr %66, i32 0, i32 1
  %68 = load i32, ptr %67, align 4, !tbaa !15
  %69 = and i32 %68, 524288
  %70 = icmp eq i32 %69, 0
  br i1 %70, label %72, label %71

71:                                               ; preds = %65
  br label %72

72:                                               ; preds = %71, %65
  %73 = phi i1 [ true, %65 ], [ false, %71 ]
  %74 = xor i1 %73, true
  %75 = xor i1 %74, true
  %76 = xor i1 %75, true
  %77 = zext i1 %76 to i32
  %78 = sext i32 %77 to i64
  %79 = call i64 @llvm.expect.i64(i64 %78, i64 0)
  %80 = icmp ne i64 %79, 0
  br i1 %80, label %81, label %85

81:                                               ; preds = %72
  %82 = load ptr, ptr %4, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.MDBX_txn, ptr %82, i32 0, i32 9
  %84 = load ptr, ptr %83, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %84, ptr noundef @.str.1, ptr noundef @__func__.dpl_sift, i32 noundef 415) #9
  unreachable

85:                                               ; preds = %72
  br label %86

86:                                               ; preds = %85
  br label %87

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

88:                                               ; preds = %87
  %89 = load ptr, ptr %5, align 8, !tbaa !5
  %90 = getelementptr inbounds i32, ptr %89, i64 0
  %91 = load i32, ptr %90, align 4, !tbaa !21
  %92 = zext i32 %91 to i64
  %93 = icmp ne i64 %92, 0
  br i1 %93, label %94, label %618

94:                                               ; preds = %88
  %95 = load ptr, ptr %4, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.MDBX_txn, ptr %95, i32 0, i32 17
  %97 = getelementptr inbounds %struct.anon.2, ptr %96, i32 0, i32 7
  %98 = load ptr, ptr %97, align 8, !tbaa !22
  %99 = getelementptr inbounds %struct.dpl, ptr %98, i32 0, i32 1
  %100 = load i64, ptr %99, align 8, !tbaa !23
  %101 = icmp ne i64 %100, 0
  br i1 %101, label %102, label %618

102:                                              ; preds = %94
  br label %103

103:                                              ; preds = %102
  %104 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %105 = zext i8 %104 to i32
  %106 = and i32 %105, 1
  %107 = icmp ne i32 %106, 0
  %108 = xor i1 %107, true
  %109 = xor i1 %108, true
  %110 = zext i1 %109 to i32
  %111 = sext i32 %110 to i64
  %112 = call i64 @llvm.expect.i64(i64 %111, i64 1)
  %113 = icmp ne i64 %112, 0
  br i1 %113, label %114, label %141

114:                                              ; preds = %103
  br label %115

115:                                              ; preds = %114
  %116 = load ptr, ptr %5, align 8, !tbaa !5
  %117 = load ptr, ptr %4, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.MDBX_txn, ptr %117, i32 0, i32 6
  %119 = getelementptr inbounds %struct.geo, ptr %118, i32 0, i32 5
  %120 = load i32, ptr %119, align 8, !tbaa !22
  %121 = zext i32 %120 to i64
  %122 = load i8, ptr %6, align 1, !tbaa !9, !range !25, !noundef !26
  %123 = trunc i8 %122 to i1
  %124 = zext i1 %123 to i32
  %125 = zext i32 %124 to i64
  %126 = shl i64 %121, %125
  %127 = call zeroext i1 @pnl_check_allocated(ptr noundef %116, i64 noundef %126)
  %128 = xor i1 %127, true
  %129 = xor i1 %128, true
  %130 = xor i1 %129, true
  %131 = zext i1 %130 to i32
  %132 = sext i32 %131 to i64
  %133 = call i64 @llvm.expect.i64(i64 %132, i64 0)
  %134 = icmp ne i64 %133, 0
  br i1 %134, label %135, label %139

135:                                              ; preds = %115
  %136 = load ptr, ptr %4, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.MDBX_txn, ptr %136, i32 0, i32 9
  %138 = load ptr, ptr %137, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %138, ptr noundef @.str.32, ptr noundef @__func__.dpl_sift, i32 noundef 417) #9
  unreachable

139:                                              ; preds = %115
  br label %140

140:                                              ; preds = %139
  br label %141

141:                                              ; preds = %140, %103
  br label %142

142:                                              ; preds = %141
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #10
  %143 = load ptr, ptr %4, align 8, !tbaa !5
  %144 = call ptr @dpl_sort(ptr noundef %143)
  store ptr %144, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #10
  store i64 -1, ptr %8, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #10
  %145 = load ptr, ptr %5, align 8, !tbaa !5
  %146 = getelementptr inbounds i32, ptr %145, i64 0
  %147 = load i32, ptr %146, align 4, !tbaa !21
  %148 = zext i32 %147 to i64
  store i64 %148, ptr %9, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #10
  store i64 0, ptr %10, align 8, !tbaa !27
  br label %149

149:                                              ; preds = %142
  %150 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %151 = zext i8 %150 to i32
  %152 = and i32 %151, 1
  %153 = icmp ne i32 %152, 0
  %154 = xor i1 %153, true
  %155 = xor i1 %154, true
  %156 = zext i1 %155 to i32
  %157 = sext i32 %156 to i64
  %158 = call i64 @llvm.expect.i64(i64 %157, i64 1)
  %159 = icmp ne i64 %158, 0
  br i1 %159, label %160, label %184

160:                                              ; preds = %149
  br label %161

161:                                              ; preds = %160
  %162 = load ptr, ptr %5, align 8, !tbaa !5
  %163 = load i64, ptr %9, align 8, !tbaa !27
  %164 = getelementptr inbounds i32, ptr %162, i64 %163
  %165 = load i32, ptr %164, align 4, !tbaa !21
  %166 = load ptr, ptr %5, align 8, !tbaa !5
  %167 = getelementptr inbounds i32, ptr %166, i64 1
  %168 = load i32, ptr %167, align 4, !tbaa !21
  %169 = icmp ule i32 %165, %168
  %170 = xor i1 %169, true
  %171 = xor i1 %170, true
  %172 = xor i1 %171, true
  %173 = zext i1 %172 to i32
  %174 = sext i32 %173 to i64
  %175 = call i64 @llvm.expect.i64(i64 %174, i64 0)
  %176 = icmp ne i64 %175, 0
  br i1 %176, label %177, label %181

177:                                              ; preds = %161
  %178 = load ptr, ptr %4, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.MDBX_txn, ptr %178, i32 0, i32 9
  %180 = load ptr, ptr %179, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %180, ptr noundef @.str.33, ptr noundef @__func__.dpl_sift, i32 noundef 424) #9
  unreachable

181:                                              ; preds = %161
  br label %182

182:                                              ; preds = %181
  br label %183

183:                                              ; preds = %182
  br label %184

184:                                              ; preds = %183, %149
  br label %185

185:                                              ; preds = %184
  br label %186

186:                                              ; preds = %185
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #10
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #10
  %187 = load ptr, ptr %4, align 8, !tbaa !5
  %188 = load ptr, ptr %5, align 8, !tbaa !5
  %189 = load i64, ptr %9, align 8, !tbaa !27
  %190 = getelementptr inbounds i32, ptr %188, i64 %189
  %191 = load i32, ptr %190, align 4, !tbaa !21
  %192 = load i8, ptr %6, align 1, !tbaa !9, !range !25, !noundef !26
  %193 = trunc i8 %192 to i1
  %194 = zext i1 %193 to i32
  %195 = lshr i32 %191, %194
  %196 = call i64 @dpl_search(ptr noundef %187, i32 noundef %195) #11
  store i64 %196, ptr %12, align 8, !tbaa !27
  br label %197

197:                                              ; preds = %186
  %198 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %199 = zext i8 %198 to i32
  %200 = and i32 %199, 1
  %201 = icmp ne i32 %200, 0
  %202 = xor i1 %201, true
  %203 = xor i1 %202, true
  %204 = zext i1 %203 to i32
  %205 = sext i32 %204 to i64
  %206 = call i64 @llvm.expect.i64(i64 %205, i64 1)
  %207 = icmp ne i64 %206, 0
  br i1 %207, label %208, label %231

208:                                              ; preds = %197
  br label %209

209:                                              ; preds = %208
  %210 = load ptr, ptr %7, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.dpl, ptr %210, i32 0, i32 0
  %212 = load i64, ptr %211, align 8, !tbaa !28
  %213 = load ptr, ptr %7, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.dpl, ptr %213, i32 0, i32 1
  %215 = load i64, ptr %214, align 8, !tbaa !23
  %216 = icmp eq i64 %212, %215
  %217 = xor i1 %216, true
  %218 = xor i1 %217, true
  %219 = xor i1 %218, true
  %220 = zext i1 %219 to i32
  %221 = sext i32 %220 to i64
  %222 = call i64 @llvm.expect.i64(i64 %221, i64 0)
  %223 = icmp ne i64 %222, 0
  br i1 %223, label %224, label %228

224:                                              ; preds = %209
  %225 = load ptr, ptr %4, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.MDBX_txn, ptr %225, i32 0, i32 9
  %227 = load ptr, ptr %226, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %227, ptr noundef @.str.34, ptr noundef @__func__.dpl_sift, i32 noundef 427) #9
  unreachable

228:                                              ; preds = %209
  br label %229

229:                                              ; preds = %228
  br label %230

230:                                              ; preds = %229
  br label %231

231:                                              ; preds = %230, %197
  br label %232

232:                                              ; preds = %231
  br label %233

233:                                              ; preds = %232
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #10
  %234 = load i64, ptr %9, align 8, !tbaa !27
  store i64 %234, ptr %13, align 8, !tbaa !27
  br label %235

235:                                              ; preds = %610, %233
  %236 = load i64, ptr %12, align 8, !tbaa !27
  %237 = load ptr, ptr %7, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.dpl, ptr %237, i32 0, i32 1
  %239 = load i64, ptr %238, align 8, !tbaa !23
  %240 = icmp ule i64 %236, %239
  br i1 %240, label %242, label %241

241:                                              ; preds = %235
  store i32 22, ptr %14, align 4
  br label %612

242:                                              ; preds = %235
  br label %243

243:                                              ; preds = %242
  %244 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %245 = zext i8 %244 to i32
  %246 = and i32 %245, 1
  %247 = icmp ne i32 %246, 0
  %248 = xor i1 %247, true
  %249 = xor i1 %248, true
  %250 = zext i1 %249 to i32
  %251 = sext i32 %250 to i64
  %252 = call i64 @llvm.expect.i64(i64 %251, i64 1)
  %253 = icmp ne i64 %252, 0
  br i1 %253, label %254, label %269

254:                                              ; preds = %243
  br label %255

255:                                              ; preds = %254
  %256 = load i64, ptr %13, align 8, !tbaa !27
  %257 = icmp ne i64 %256, 0
  %258 = xor i1 %257, true
  %259 = xor i1 %258, true
  %260 = xor i1 %259, true
  %261 = zext i1 %260 to i32
  %262 = sext i32 %261 to i64
  %263 = call i64 @llvm.expect.i64(i64 %262, i64 0)
  %264 = icmp ne i64 %263, 0
  br i1 %264, label %265, label %266

265:                                              ; preds = %255
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.35, ptr noundef @__func__.dpl_sift, i32 noundef 429) #9
  unreachable

266:                                              ; preds = %255
  br label %267

267:                                              ; preds = %266
  br label %268

268:                                              ; preds = %267
  br label %269

269:                                              ; preds = %268, %243
  br label %270

270:                                              ; preds = %269
  br label %271

271:                                              ; preds = %270
  br label %272

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

283:                                              ; preds = %272
  br label %284

284:                                              ; preds = %283
  %285 = load i8, ptr %6, align 1, !tbaa !9, !range !25, !noundef !26
  %286 = trunc i8 %285 to i1
  br i1 %286, label %287, label %294

287:                                              ; preds = %284
  %288 = load ptr, ptr %5, align 8, !tbaa !5
  %289 = load i64, ptr %13, align 8, !tbaa !27
  %290 = getelementptr inbounds i32, ptr %288, i64 %289
  %291 = load i32, ptr %290, align 4, !tbaa !21
  %292 = and i32 %291, 1
  %293 = icmp eq i32 %292, 0
  br label %294

294:                                              ; preds = %287, %284
  %295 = phi i1 [ true, %284 ], [ %293, %287 ]
  %296 = xor i1 %295, true
  %297 = xor i1 %296, true
  %298 = xor i1 %297, true
  %299 = zext i1 %298 to i32
  %300 = sext i32 %299 to i64
  %301 = call i64 @llvm.expect.i64(i64 %300, i64 0)
  %302 = icmp ne i64 %301, 0
  br i1 %302, label %303, label %307

303:                                              ; preds = %294
  %304 = load ptr, ptr %4, align 8, !tbaa !5
  %305 = getelementptr inbounds %struct.MDBX_txn, ptr %304, i32 0, i32 9
  %306 = load ptr, ptr %305, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %306, ptr noundef @.str.36, ptr noundef @__func__.dpl_sift, i32 noundef 430) #9
  unreachable

307:                                              ; preds = %294
  br label %308

308:                                              ; preds = %307
  br label %309

309:                                              ; preds = %308
  br label %310

310:                                              ; preds = %309, %272
  br label %311

311:                                              ; preds = %310
  br label %312

312:                                              ; preds = %311
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #10
  %313 = load ptr, ptr %5, align 8, !tbaa !5
  %314 = load i64, ptr %13, align 8, !tbaa !27
  %315 = getelementptr inbounds i32, ptr %313, i64 %314
  %316 = load i32, ptr %315, align 4, !tbaa !21
  %317 = load i8, ptr %6, align 1, !tbaa !9, !range !25, !noundef !26
  %318 = trunc i8 %317 to i1
  %319 = zext i1 %318 to i32
  %320 = lshr i32 %316, %319
  store i32 %320, ptr %15, align 4, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #10
  %321 = load ptr, ptr %7, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.dpl, ptr %321, i32 0, i32 4
  %323 = load i64, ptr %12, align 8, !tbaa !27
  %324 = getelementptr inbounds [18 x %struct.dp], ptr %322, i64 0, i64 %323
  %325 = getelementptr inbounds %struct.dp, ptr %324, i32 0, i32 1
  %326 = load i32, ptr %325, align 8, !tbaa !29
  store i32 %326, ptr %16, align 4, !tbaa !21
  %327 = load i32, ptr %16, align 4, !tbaa !21
  %328 = load i32, ptr %15, align 4, !tbaa !21
  %329 = icmp ne i32 %327, %328
  %330 = xor i1 %329, true
  %331 = xor i1 %330, true
  %332 = zext i1 %331 to i32
  %333 = sext i32 %332 to i64
  %334 = call i64 @llvm.expect.i64(i64 %333, i64 1)
  %335 = icmp ne i64 %334, 0
  br i1 %335, label %336, label %363

336:                                              ; preds = %312
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #10
  %337 = load i32, ptr %16, align 4, !tbaa !21
  %338 = load i32, ptr %15, align 4, !tbaa !21
  %339 = icmp ult i32 %337, %338
  %340 = zext i1 %339 to i8
  store i8 %340, ptr %17, align 1, !tbaa !9
  %341 = load i8, ptr %17, align 1, !tbaa !9, !range !25, !noundef !26
  %342 = trunc i8 %341 to i1
  %343 = zext i1 %342 to i64
  %344 = load i64, ptr %12, align 8, !tbaa !27
  %345 = add i64 %344, %343
  store i64 %345, ptr %12, align 8, !tbaa !27
  %346 = load i8, ptr %17, align 1, !tbaa !9, !range !25, !noundef !26
  %347 = trunc i8 %346 to i1
  %348 = zext i1 %347 to i64
  %349 = select i1 %347, i64 0, i64 -1
  %350 = load i64, ptr %13, align 8, !tbaa !27
  %351 = add nsw i64 %350, %349
  store i64 %351, ptr %13, align 8, !tbaa !27
  %352 = load i64, ptr %13, align 8, !tbaa !27
  %353 = icmp ne i64 %352, 0
  %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 1)
  %359 = icmp ne i64 %358, 0
  br i1 %359, label %360, label %361

360:                                              ; preds = %336
  store i32 23, ptr %14, align 4
  br label %362, !llvm.loop !31

361:                                              ; preds = %336
  store i32 1, ptr %14, align 4
  br label %362

362:                                              ; preds = %361, %360
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #10
  br label %610

363:                                              ; preds = %312
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #10
  %364 = load i64, ptr %12, align 8, !tbaa !27
  store i64 %364, ptr %11, align 8, !tbaa !27
  br label %365

365:                                              ; preds = %529, %363
  %366 = load ptr, ptr %7, align 8, !tbaa !5
  %367 = load i64, ptr %12, align 8, !tbaa !27
  %368 = call i32 @dpl_npages(ptr noundef %366, i64 noundef %367) #12
  store i32 %368, ptr %18, align 4, !tbaa !21
  %369 = load i32, ptr %18, align 4, !tbaa !21
  %370 = zext i32 %369 to i64
  %371 = load ptr, ptr %7, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.dpl, ptr %371, i32 0, i32 2
  %373 = load i64, ptr %372, align 8, !tbaa !33
  %374 = sub i64 %373, %370
  store i64 %374, ptr %372, align 8, !tbaa !33
  %375 = load ptr, ptr %4, align 8, !tbaa !5
  %376 = getelementptr inbounds %struct.MDBX_txn, ptr %375, i32 0, i32 9
  %377 = load ptr, ptr %376, align 8, !tbaa !20
  %378 = load ptr, ptr %7, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.dpl, ptr %378, i32 0, i32 4
  %380 = load i64, ptr %12, align 8, !tbaa !27
  %381 = getelementptr inbounds [18 x %struct.dp], ptr %379, i64 0, i64 %380
  %382 = getelementptr inbounds %struct.dp, ptr %381, i32 0, i32 0
  %383 = load ptr, ptr %382, align 8, !tbaa !34
  %384 = load i32, ptr %18, align 4, !tbaa !21
  %385 = zext i32 %384 to i64
  call void @page_shadow_release(ptr noundef %377, ptr noundef %383, i64 noundef %385)
  %386 = load i64, ptr %12, align 8, !tbaa !27
  %387 = add i64 %386, 1
  store i64 %387, ptr %12, align 8, !tbaa !27
  br label %388

388:                                              ; preds = %528, %365
  %389 = load i64, ptr %13, align 8, !tbaa !27
  %390 = add nsw i64 %389, -1
  store i64 %390, ptr %13, align 8, !tbaa !27
  %391 = load i64, ptr %13, align 8, !tbaa !27
  %392 = icmp eq i64 %391, 0
  %393 = xor i1 %392, true
  %394 = xor i1 %393, true
  %395 = zext i1 %394 to i32
  %396 = sext i32 %395 to i64
  %397 = call i64 @llvm.expect.i64(i64 %396, i64 0)
  %398 = icmp ne i64 %397, 0
  br i1 %398, label %399, label %418

399:                                              ; preds = %388
  br label %400

400:                                              ; preds = %406, %399
  %401 = load i64, ptr %12, align 8, !tbaa !27
  %402 = load ptr, ptr %7, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.dpl, ptr %402, i32 0, i32 1
  %404 = load i64, ptr %403, align 8, !tbaa !23
  %405 = icmp ule i64 %401, %404
  br i1 %405, label %406, label %417

406:                                              ; preds = %400
  %407 = load ptr, ptr %7, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.dpl, ptr %407, i32 0, i32 4
  %409 = load i64, ptr %11, align 8, !tbaa !27
  %410 = add i64 %409, 1
  store i64 %410, ptr %11, align 8, !tbaa !27
  %411 = getelementptr inbounds [18 x %struct.dp], ptr %408, i64 0, i64 %409
  %412 = load ptr, ptr %7, align 8, !tbaa !5
  %413 = getelementptr inbounds %struct.dpl, ptr %412, i32 0, i32 4
  %414 = load i64, ptr %12, align 8, !tbaa !27
  %415 = add i64 %414, 1
  store i64 %415, ptr %12, align 8, !tbaa !27
  %416 = getelementptr inbounds [18 x %struct.dp], ptr %413, i64 0, i64 %414
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %411, ptr align 8 %416, i64 16, i1 false), !tbaa.struct !35
  br label %400, !llvm.loop !36

417:                                              ; preds = %400
  br label %532

418:                                              ; preds = %388
  br label %419

419:                                              ; preds = %530, %418
  %420 = load i64, ptr %12, align 8, !tbaa !27
  %421 = load ptr, ptr %7, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.dpl, ptr %421, i32 0, i32 1
  %423 = load i64, ptr %422, align 8, !tbaa !23
  %424 = icmp ule i64 %420, %423
  br i1 %424, label %425, label %531

425:                                              ; preds = %419
  br label %426

426:                                              ; preds = %425
  %427 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %428 = zext i8 %427 to i32
  %429 = and i32 %428, 1
  %430 = icmp ne i32 %429, 0
  %431 = xor i1 %430, true
  %432 = xor i1 %431, true
  %433 = zext i1 %432 to i32
  %434 = sext i32 %433 to i64
  %435 = call i64 @llvm.expect.i64(i64 %434, i64 1)
  %436 = icmp ne i64 %435, 0
  br i1 %436, label %437, label %452

437:                                              ; preds = %426
  br label %438

438:                                              ; preds = %437
  %439 = load i64, ptr %13, align 8, !tbaa !27
  %440 = icmp ne i64 %439, 0
  %441 = xor i1 %440, true
  %442 = xor i1 %441, true
  %443 = xor i1 %442, true
  %444 = zext i1 %443 to i32
  %445 = sext i32 %444 to i64
  %446 = call i64 @llvm.expect.i64(i64 %445, i64 0)
  %447 = icmp ne i64 %446, 0
  br i1 %447, label %448, label %449

448:                                              ; preds = %438
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.35, ptr noundef @__func__.dpl_sift, i32 noundef 458) #9
  unreachable

449:                                              ; preds = %438
  br label %450

450:                                              ; preds = %449
  br label %451

451:                                              ; preds = %450
  br label %452

452:                                              ; preds = %451, %426
  br label %453

453:                                              ; preds = %452
  br label %454

454:                                              ; preds = %453
  br label %455

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

466:                                              ; preds = %455
  br label %467

467:                                              ; preds = %466
  %468 = load i8, ptr %6, align 1, !tbaa !9, !range !25, !noundef !26
  %469 = trunc i8 %468 to i1
  br i1 %469, label %470, label %477

470:                                              ; preds = %467
  %471 = load ptr, ptr %5, align 8, !tbaa !5
  %472 = load i64, ptr %13, align 8, !tbaa !27
  %473 = getelementptr inbounds i32, ptr %471, i64 %472
  %474 = load i32, ptr %473, align 4, !tbaa !21
  %475 = and i32 %474, 1
  %476 = icmp eq i32 %475, 0
  br label %477

477:                                              ; preds = %470, %467
  %478 = phi i1 [ true, %467 ], [ %476, %470 ]
  %479 = xor i1 %478, true
  %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 %490

486:                                              ; preds = %477
  %487 = load ptr, ptr %4, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.MDBX_txn, ptr %487, i32 0, i32 9
  %489 = load ptr, ptr %488, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %489, ptr noundef @.str.36, ptr noundef @__func__.dpl_sift, i32 noundef 459) #9
  unreachable

490:                                              ; preds = %477
  br label %491

491:                                              ; preds = %490
  br label %492

492:                                              ; preds = %491
  br label %493

493:                                              ; preds = %492, %455
  br label %494

494:                                              ; preds = %493
  br label %495

495:                                              ; preds = %494
  %496 = load ptr, ptr %5, align 8, !tbaa !5
  %497 = load i64, ptr %13, align 8, !tbaa !27
  %498 = getelementptr inbounds i32, ptr %496, i64 %497
  %499 = load i32, ptr %498, align 4, !tbaa !21
  %500 = load i8, ptr %6, align 1, !tbaa !9, !range !25, !noundef !26
  %501 = trunc i8 %500 to i1
  %502 = zext i1 %501 to i32
  %503 = lshr i32 %499, %502
  store i32 %503, ptr %15, align 4, !tbaa !21
  %504 = load ptr, ptr %7, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.dpl, ptr %504, i32 0, i32 4
  %506 = load i64, ptr %12, align 8, !tbaa !27
  %507 = getelementptr inbounds [18 x %struct.dp], ptr %505, i64 0, i64 %506
  %508 = getelementptr inbounds %struct.dp, ptr %507, i32 0, i32 1
  %509 = load i32, ptr %508, align 8, !tbaa !29
  store i32 %509, ptr %16, align 4, !tbaa !21
  %510 = load i32, ptr %16, align 4, !tbaa !21
  %511 = load i32, ptr %15, align 4, !tbaa !21
  %512 = icmp ult i32 %510, %511
  br i1 %512, label %513, label %524

513:                                              ; preds = %495
  %514 = load ptr, ptr %7, align 8, !tbaa !5
  %515 = getelementptr inbounds %struct.dpl, ptr %514, i32 0, i32 4
  %516 = load i64, ptr %11, align 8, !tbaa !27
  %517 = add i64 %516, 1
  store i64 %517, ptr %11, align 8, !tbaa !27
  %518 = getelementptr inbounds [18 x %struct.dp], ptr %515, i64 0, i64 %516
  %519 = load ptr, ptr %7, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.dpl, ptr %519, i32 0, i32 4
  %521 = load i64, ptr %12, align 8, !tbaa !27
  %522 = add i64 %521, 1
  store i64 %522, ptr %12, align 8, !tbaa !27
  %523 = getelementptr inbounds [18 x %struct.dp], ptr %520, i64 0, i64 %521
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %518, ptr align 8 %523, i64 16, i1 false), !tbaa.struct !35
  br label %530

524:                                              ; preds = %495
  %525 = load i32, ptr %16, align 4, !tbaa !21
  %526 = load i32, ptr %15, align 4, !tbaa !21
  %527 = icmp ugt i32 %525, %526
  br i1 %527, label %528, label %529

528:                                              ; preds = %524
  br label %388

529:                                              ; preds = %524
  br label %365

530:                                              ; preds = %513
  br label %419, !llvm.loop !37

531:                                              ; preds = %419
  br label %532

532:                                              ; preds = %531, %417
  %533 = load ptr, ptr %7, align 8, !tbaa !5
  %534 = load i64, ptr %11, align 8, !tbaa !27
  %535 = sub i64 %534, 1
  %536 = call i64 @dpl_setlen(ptr noundef %533, i64 noundef %535)
  %537 = load ptr, ptr %7, align 8, !tbaa !5
  %538 = getelementptr inbounds %struct.dpl, ptr %537, i32 0, i32 0
  store i64 %536, ptr %538, align 8, !tbaa !28
  %539 = load i64, ptr %12, align 8, !tbaa !27
  %540 = load i64, ptr %11, align 8, !tbaa !27
  %541 = sub i64 %539, %540
  %542 = load ptr, ptr %4, align 8, !tbaa !5
  %543 = getelementptr inbounds %struct.MDBX_txn, ptr %542, i32 0, i32 17
  %544 = getelementptr inbounds %struct.anon.2, ptr %543, i32 0, i32 6
  %545 = load i64, ptr %544, align 8, !tbaa !22
  %546 = add i64 %545, %541
  store i64 %546, ptr %544, align 8, !tbaa !22
  br label %547

547:                                              ; preds = %532
  %548 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %549 = zext i8 %548 to i32
  %550 = and i32 %549, 1
  %551 = icmp ne i32 %550, 0
  %552 = xor i1 %551, true
  %553 = xor i1 %552, true
  %554 = zext i1 %553 to i32
  %555 = sext i32 %554 to i64
  %556 = call i64 @llvm.expect.i64(i64 %555, i64 1)
  %557 = icmp ne i64 %556, 0
  br i1 %557, label %558, label %607

558:                                              ; preds = %547
  br label %559

559:                                              ; preds = %558
  %560 = load ptr, ptr %4, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct.MDBX_txn, ptr %560, i32 0, i32 17
  %562 = getelementptr inbounds %struct.anon.2, ptr %561, i32 0, i32 6
  %563 = load i64, ptr %562, align 8, !tbaa !22
  %564 = load ptr, ptr %4, align 8, !tbaa !5
  %565 = getelementptr inbounds %struct.MDBX_txn, ptr %564, i32 0, i32 17
  %566 = getelementptr inbounds %struct.anon.2, ptr %565, i32 0, i32 7
  %567 = load ptr, ptr %566, align 8, !tbaa !22
  %568 = getelementptr inbounds %struct.dpl, ptr %567, i32 0, i32 1
  %569 = load i64, ptr %568, align 8, !tbaa !23
  %570 = add i64 %563, %569
  %571 = load ptr, ptr %4, align 8, !tbaa !5
  %572 = getelementptr inbounds %struct.MDBX_txn, ptr %571, i32 0, i32 4
  %573 = load ptr, ptr %572, align 8, !tbaa !38
  %574 = icmp ne ptr %573, null
  br i1 %574, label %575, label %582

575:                                              ; preds = %559
  %576 = load ptr, ptr %4, align 8, !tbaa !5
  %577 = getelementptr inbounds %struct.MDBX_txn, ptr %576, i32 0, i32 4
  %578 = load ptr, ptr %577, align 8, !tbaa !38
  %579 = getelementptr inbounds %struct.MDBX_txn, ptr %578, i32 0, i32 17
  %580 = getelementptr inbounds %struct.anon.2, ptr %579, i32 0, i32 6
  %581 = load i64, ptr %580, align 8, !tbaa !22
  br label %590

582:                                              ; preds = %559
  %583 = load ptr, ptr %4, align 8, !tbaa !5
  %584 = getelementptr inbounds %struct.MDBX_txn, ptr %583, i32 0, i32 9
  %585 = load ptr, ptr %584, align 8, !tbaa !20
  %586 = getelementptr inbounds %struct.MDBX_env, ptr %585, i32 0, i32 34
  %587 = getelementptr inbounds %struct.anon.10, ptr %586, i32 0, i32 2
  %588 = load i32, ptr %587, align 8, !tbaa !39
  %589 = zext i32 %588 to i64
  br label %590

590:                                              ; preds = %582, %575
  %591 = phi i64 [ %581, %575 ], [ %589, %582 ]
  %592 = icmp eq i64 %570, %591
  %593 = xor i1 %592, true
  %594 = xor i1 %593, true
  %595 = xor i1 %594, true
  %596 = zext i1 %595 to i32
  %597 = sext i32 %596 to i64
  %598 = call i64 @llvm.expect.i64(i64 %597, i64 0)
  %599 = icmp ne i64 %598, 0
  br i1 %599, label %600, label %604

600:                                              ; preds = %590
  %601 = load ptr, ptr %4, align 8, !tbaa !5
  %602 = getelementptr inbounds %struct.MDBX_txn, ptr %601, i32 0, i32 9
  %603 = load ptr, ptr %602, align 8, !tbaa !20
  call void @mdbx_assert_fail(ptr noundef %603, ptr noundef @.str.37, ptr noundef @__func__.dpl_sift, i32 noundef 473) #9
  unreachable

604:                                              ; preds = %590
  br label %605

605:                                              ; preds = %604
  br label %606

606:                                              ; preds = %605
  br label %607

607:                                              ; preds = %606, %547
  br label %608

608:                                              ; preds = %607
  br label %609

609:                                              ; preds = %608
  store i32 1, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #10
  br label %610

610:                                              ; preds = %609, %362
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #10
  %611 = load i32, ptr %14, align 4
  switch i32 %611, label %612 [
    i32 23, label %235
  ]

612:                                              ; preds = %610, %241
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #10
  %613 = load i32, ptr %14, align 4
  switch i32 %613, label %615 [
    i32 22, label %614
  ]

614:                                              ; preds = %612
  store i32 0, ptr %14, align 4
  br label %615

615:                                              ; preds = %614, %612
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #10
  %616 = load i32, ptr %14, align 4
  switch i32 %616, label %619 [
    i32 0, label %617
    i32 1, label %618
  ]

617:                                              ; preds = %615
  br label %618

618:                                              ; preds = %617, %615, %94, %88
  ret void

619:                                              ; preds = %615
  unreachable
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @pnl_check_allocated(ptr noundef, i64 noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @dpl_sort(ptr noundef) #7

declare void @page_shadow_release(ptr noundef, ptr noundef, i64 noundef) #8

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @dpl_setlen(ptr noundef, i64 noundef) #7

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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { hot noinline 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 = { 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 = { 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 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { "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 = { noreturn }
attributes #10 = { nounwind }
attributes #11 = { hot nounwind willreturn memory(read) }
attributes #12 = { 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, !10, i64 0}
!10 = !{!"_Bool", !7, i64 0}
!11 = !{!12, !7, i64 25}
!12 = !{!"libmdbx_globals", !7, i64 0, !13, i64 16, !13, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !10, i64 27, !13, i64 28, !7, i64 32, !7, i64 40, !14, i64 80, !6, i64 88}
!13 = !{!"int", !7, i64 0}
!14 = !{!"long", !7, i64 0}
!15 = !{!16, !13, i64 4}
!16 = !{!"MDBX_txn", !13, i64 0, !13, i64 4, !14, i64 8, !14, i64 16, !6, i64 24, !6, i64 32, !17, 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, !19, i64 128, !6, i64 160, !7, i64 168}
!17 = !{!"geo", !18, i64 0, !18, i64 2, !13, i64 4, !13, i64 8, !7, i64 12, !7, i64 16}
!18 = !{!"short", !7, i64 0}
!19 = !{!"MDBX_canary", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24}
!20 = !{!16, !6, i64 80}
!21 = !{!13, !13, i64 0}
!22 = !{!7, !7, i64 0}
!23 = !{!24, !14, i64 8}
!24 = !{!"dpl", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24, !7, i64 32}
!25 = !{i8 0, i8 2}
!26 = !{}
!27 = !{!14, !14, i64 0}
!28 = !{!24, !14, i64 0}
!29 = !{!30, !13, i64 8}
!30 = !{!"dp", !6, i64 0, !13, i64 8, !13, i64 12}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = !{!24, !14, i64 16}
!34 = !{!30, !6, i64 0}
!35 = !{i64 0, i64 8, !5, i64 8, i64 4, !21, i64 12, i64 4, !21}
!36 = distinct !{!36, !32}
!37 = distinct !{!37, !32}
!38 = !{!16, !6, i64 24}
!39 = !{!40, !13, i64 272}
!40 = !{!"MDBX_env", !7, i64 0, !13, i64 4, !13, i64 8, !41, i64 16, !13, i64 56, !13, i64 60, !41, i64 64, !6, i64 104, !18, i64 112, !18, i64 114, !18, i64 116, !18, i64 118, !18, i64 120, !18, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !18, i64 130, !13, i64 132, !13, i64 136, !13, i64 140, !13, i64 144, !42, i64 152, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !13, i64 224, !13, i64 228, !13, i64 232, !6, i64 240, !6, i64 248, !14, i64 256, !43, i64 264, !45, i64 320, !10, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !46, i64 392, !7, i64 400, !13, i64 440, !13, i64 444, !6, i64 448, !47, i64 456, !7, i64 496, !7, i64 536}
!41 = !{!"osal_mmap", !7, i64 0, !13, i64 8, !14, i64 16, !14, i64 24, !14, i64 32}
!42 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!43 = !{!"", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !14, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !13, i64 28, !13, i64 32, !10, i64 36, !10, i64 37, !10, i64 38, !44, i64 40, !7, i64 48}
!44 = !{!"", !18, i64 0, !18, i64 2, !18, i64 4, !18, i64 6}
!45 = !{!"", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24, !14, i64 32}
!46 = !{!"", !14, i64 0}
!47 = !{!"osal_ioring", !13, i64 0, !13, i64 4, !13, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}


; 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
@__func__.dpl_sift = external hidden unnamed_addr constant [9 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [120 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: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1

; Function Attrs: hot mustprogress nofree noinline nounwind willreturn memory(read) uwtable
declare dso_local i64 @dpl_search(ptr noundef, i32 noundef) local_unnamed_addr #2

; 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: nounwind uwtable
define dso_local void @dpl_sift(ptr noundef %0, ptr noundef %1, i1 noundef zeroext %2) local_unnamed_addr #4 {
  %4 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %5 = and i8 %4, 1
  %.not = icmp eq i8 %5, 0
  br i1 %.not, label %.thread, label %6, !prof !13

6:                                                ; preds = %3
  %7 = getelementptr inbounds i8, ptr %0, i64 4
  %8 = load i32, ptr %7, align 4, !tbaa !14
  %9 = and i32 %8, 131072
  %.not114 = icmp eq i32 %9, 0
  br i1 %.not114, label %13, label %10, !prof !19

10:                                               ; preds = %6
  %11 = getelementptr inbounds i8, ptr %0, i64 80
  %12 = load ptr, ptr %11, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %12, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 414) #7
  unreachable

13:                                               ; preds = %6
  %14 = and i32 %8, 524288
  %.not116 = icmp eq i32 %14, 0
  br i1 %.not116, label %.thread, label %15, !prof !19

15:                                               ; preds = %13
  %16 = getelementptr inbounds i8, ptr %0, i64 80
  %17 = load ptr, ptr %16, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %17, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 415) #7
  unreachable

.thread:                                          ; preds = %3, %13
  %18 = load i32, ptr %1, align 4, !tbaa !21
  %.not117 = icmp eq i32 %18, 0
  br i1 %.not117, label %.thread142, label %19

19:                                               ; preds = %.thread
  %20 = getelementptr inbounds i8, ptr %0, i64 496
  %21 = load ptr, ptr %20, align 8, !tbaa !22
  %22 = getelementptr inbounds i8, ptr %21, i64 8
  %23 = load i64, ptr %22, align 8, !tbaa !23
  %.not118 = icmp eq i64 %23, 0
  br i1 %.not118, label %.thread142, label %24

24:                                               ; preds = %19
  br i1 %.not, label %35, label %25, !prof !13

25:                                               ; preds = %24
  %26 = getelementptr inbounds i8, ptr %0, i64 56
  %27 = load i32, ptr %26, align 8, !tbaa !22
  %28 = zext i32 %27 to i64
  %29 = zext i1 %2 to i64
  %30 = shl nuw nsw i64 %28, %29
  %31 = tail call zeroext i1 @pnl_check_allocated(ptr noundef nonnull %1, i64 noundef %30)
  br i1 %31, label %35, label %32, !prof !19

32:                                               ; preds = %25
  %33 = getelementptr inbounds i8, ptr %0, i64 80
  %34 = load ptr, ptr %33, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %34, ptr noundef nonnull @.str.32, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 417) #7
  unreachable

35:                                               ; preds = %24, %25
  %36 = tail call ptr @dpl_sort(ptr noundef nonnull %0)
  %37 = load i32, ptr %1, align 4, !tbaa !21
  %38 = zext i32 %37 to i64
  %39 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1
  %.fr263 = freeze i8 %39
  %40 = and i8 %.fr263, 1
  %.not120 = icmp eq i8 %40, 0
  %.phi.trans.insert = getelementptr inbounds i32, ptr %1, i64 %38
  %.pre = load i32, ptr %.phi.trans.insert, align 4, !tbaa !21
  br i1 %.not120, label %._crit_edge330, label %41, !prof !13

41:                                               ; preds = %35
  %42 = getelementptr inbounds i8, ptr %1, i64 4
  %43 = load i32, ptr %42, align 4, !tbaa !21
  %.not121 = icmp ugt i32 %.pre, %43
  br i1 %.not121, label %44, label %50, !prof !13

44:                                               ; preds = %41
  %45 = getelementptr inbounds i8, ptr %0, i64 80
  %46 = load ptr, ptr %45, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %46, ptr noundef nonnull @.str.33, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 424) #7
  unreachable

._crit_edge330:                                   ; preds = %35
  %47 = zext i1 %2 to i32
  %48 = lshr i32 %.pre, %47
  %49 = tail call i64 @dpl_search(ptr noundef nonnull %0, i32 noundef %48) #8
  %.phi.trans.insert331 = getelementptr inbounds i8, ptr %36, i64 8
  %.pre332 = load i64, ptr %.phi.trans.insert331, align 8, !tbaa !23
  br label %60

50:                                               ; preds = %41
  %51 = zext i1 %2 to i32
  %52 = lshr i32 %.pre, %51
  %53 = tail call i64 @dpl_search(ptr noundef nonnull %0, i32 noundef %52) #8
  %54 = load i64, ptr %36, align 8, !tbaa !25
  %55 = getelementptr inbounds i8, ptr %36, i64 8
  %56 = load i64, ptr %55, align 8, !tbaa !23
  %.not123 = icmp eq i64 %54, %56
  br i1 %.not123, label %60, label %57, !prof !19

57:                                               ; preds = %50
  %58 = getelementptr inbounds i8, ptr %0, i64 80
  %59 = load ptr, ptr %58, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %59, ptr noundef nonnull @.str.34, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 427) #7
  unreachable

60:                                               ; preds = %._crit_edge330, %50
  %61 = phi i64 [ %49, %._crit_edge330 ], [ %53, %50 ]
  %62 = phi i32 [ %47, %._crit_edge330 ], [ %51, %50 ]
  %63 = phi i64 [ %.pre332, %._crit_edge330 ], [ %54, %50 ]
  %64 = getelementptr inbounds i8, ptr %36, i64 8
  %65 = and i8 %.fr263, 1
  %.not127 = icmp ne i8 %65, 0
  %brmerge.not = and i1 %.not127, %2
  %66 = getelementptr inbounds i8, ptr %36, i64 32
  br i1 %brmerge.not, label %.split.us.split, label %.split, !prof !26

.split.us.split:                                  ; preds = %60, %76
  %.0105.us = phi i64 [ %81, %76 ], [ %38, %60 ]
  %.097.us = phi i64 [ %79, %76 ], [ %61, %60 ]
  %.not124.us = icmp ugt i64 %.097.us, %63
  br i1 %.not124.us, label %.thread142, label %67

67:                                               ; preds = %.split.us.split
  %.not126.us = icmp eq i64 %.0105.us, 0
  br i1 %.not126.us, label %.split181.us, label %68, !prof !27

68:                                               ; preds = %67
  %69 = getelementptr inbounds i32, ptr %1, i64 %.0105.us
  %70 = load i32, ptr %69, align 4, !tbaa !21
  %71 = and i32 %70, 1
  %72 = icmp eq i32 %71, 0
  br i1 %72, label %.critedge.us, label %.split183.us, !prof !19

.critedge.us:                                     ; preds = %68
  %73 = lshr exact i32 %70, %62
  %74 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.097.us, i32 1
  %75 = load i32, ptr %74, align 8, !tbaa !28
  %.not128.us = icmp eq i32 %75, %73
  br i1 %.not128.us, label %.preheader150, label %76, !prof !13

76:                                               ; preds = %.critedge.us
  %77 = icmp ult i32 %75, %73
  %78 = zext i1 %77 to i64
  %79 = add i64 %.097.us, %78
  %not..us = xor i1 %77, true
  %80 = sext i1 %not..us to i64
  %81 = add nsw i64 %.0105.us, %80
  %.not136.us = icmp eq i64 %81, 0
  br i1 %.not136.us, label %.thread142, label %.split.us.split, !prof !13

.split:                                           ; preds = %60
  %.not125.not = icmp eq i8 %65, 0
  br i1 %.not125.not, label %.split.split.us, label %.split.split

.split.split.us:                                  ; preds = %.split, %87
  %.0105.us186 = phi i64 [ %92, %87 ], [ %38, %.split ]
  %.097.us187 = phi i64 [ %90, %87 ], [ %61, %.split ]
  %.not124.us188 = icmp ugt i64 %.097.us187, %63
  br i1 %.not124.us188, label %.thread142, label %.critedge.us191

.critedge.us191:                                  ; preds = %.split.split.us
  %82 = getelementptr inbounds i32, ptr %1, i64 %.0105.us186
  %83 = load i32, ptr %82, align 4, !tbaa !21
  %84 = lshr i32 %83, %62
  %85 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.097.us187, i32 1
  %86 = load i32, ptr %85, align 8, !tbaa !28
  %.not128.us192 = icmp eq i32 %86, %84
  br i1 %.not128.us192, label %.preheader150, label %87, !prof !13

87:                                               ; preds = %.critedge.us191
  %88 = icmp ult i32 %86, %84
  %89 = zext i1 %88 to i64
  %90 = add i64 %.097.us187, %89
  %not..us193 = xor i1 %88, true
  %91 = sext i1 %not..us193 to i64
  %92 = add nsw i64 %.0105.us186, %91
  %.not136.us194 = icmp eq i64 %92, 0
  br i1 %.not136.us194, label %.thread142, label %.split.split.us, !prof !13

.split.split:                                     ; preds = %.split, %132
  %.0105 = phi i64 [ %137, %132 ], [ %38, %.split ]
  %.097 = phi i64 [ %135, %132 ], [ %61, %.split ]
  %.not124 = icmp ugt i64 %.097, %63
  br i1 %.not124, label %.thread142, label %93

93:                                               ; preds = %.split.split
  %.not126 = icmp eq i64 %.0105, 0
  br i1 %.not126, label %.split181.us, label %.critedge, !prof !27

.split181.us:                                     ; preds = %93, %67
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.35, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 429) #7
  unreachable

.critedge:                                        ; preds = %93
  %94 = getelementptr inbounds i32, ptr %1, i64 %.0105
  %95 = load i32, ptr %94, align 4, !tbaa !21
  %96 = lshr i32 %95, %62
  %97 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.097, i32 1
  %98 = load i32, ptr %97, align 8, !tbaa !28
  %.not128 = icmp eq i32 %98, %96
  br i1 %.not128, label %.preheader150, label %132, !prof !13

.split183.us:                                     ; preds = %68
  %99 = getelementptr inbounds i8, ptr %0, i64 80
  %100 = load ptr, ptr %99, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %100, ptr noundef nonnull @.str.36, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 430) #7
  unreachable

.preheader150:                                    ; preds = %.critedge, %.critedge.us191, %.critedge.us
  %.us-phi = phi i64 [ %.0105.us, %.critedge.us ], [ %.0105.us186, %.critedge.us191 ], [ %.0105, %.critedge ]
  %.us-phi184 = phi i64 [ %.097.us, %.critedge.us ], [ %.097.us187, %.critedge.us191 ], [ %.097, %.critedge ]
  %101 = getelementptr inbounds i8, ptr %36, i64 16
  %102 = getelementptr inbounds i8, ptr %0, i64 80
  br i1 %2, label %.split222.us.us, label %.split222

.split222.us.us:                                  ; preds = %.split214.us226.us, %.preheader150
  %.1106.us = phi i64 [ %.us-phi, %.preheader150 ], [ %112, %.split214.us226.us ]
  %.198.us = phi i64 [ %.us-phi184, %.preheader150 ], [ %.4101206.us224.us, %.split214.us226.us ]
  %.0.us = phi i64 [ %.us-phi184, %.preheader150 ], [ %.3207.us223.us, %.split214.us226.us ]
  %103 = tail call i32 @dpl_npages(ptr noundef nonnull %36, i64 noundef %.198.us) #9
  %104 = zext i32 %103 to i64
  %105 = load i64, ptr %101, align 8, !tbaa !30
  %106 = sub i64 %105, %104
  store i64 %106, ptr %101, align 8, !tbaa !30
  %107 = load ptr, ptr %102, align 8, !tbaa !20
  %108 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.198.us
  %109 = load ptr, ptr %108, align 8, !tbaa !31
  tail call void @page_shadow_release(ptr noundef %107, ptr noundef %109, i64 noundef %104) #10
  %110 = add i64 %.198.us, 1
  br label %111

111:                                              ; preds = %.split214.us226.us, %.split222.us.us
  %.2107.us.us = phi i64 [ %.1106.us, %.split222.us.us ], [ %112, %.split214.us226.us ]
  %.299.us.us = phi i64 [ %110, %.split222.us.us ], [ %.4101206.us224.us, %.split214.us226.us ]
  %.1.us.us = phi i64 [ %.0.us, %.split222.us.us ], [ %.3207.us223.us, %.split214.us226.us ]
  %112 = add nsw i64 %.2107.us.us, -1
  %113 = icmp eq i64 %112, 0
  br i1 %113, label %.preheader, label %.preheader147.us.us, !prof !13

114:                                              ; preds = %.lr.ph.us.us, %125
  %.3207.us223.us = phi i64 [ %.1.us.us, %.lr.ph.us.us ], [ %126, %125 ]
  %.4101206.us224.us = phi i64 [ %.299.us.us, %.lr.ph.us.us ], [ %128, %125 ]
  %115 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %116 = and i8 %115, 1
  %.not131.us.us.not = icmp eq i8 %116, 0
  %.pre333 = load i32, ptr %131, align 4, !tbaa !21
  %117 = and i32 %.pre333, 1
  %118 = icmp eq i32 %117, 0
  %or.cond = select i1 %.not131.us.us.not, i1 true, i1 %118
  br i1 %or.cond, label %.critedge138.us225.us, label %.split237.us, !prof !32

.critedge138.us225.us:                            ; preds = %114
  %119 = lshr i32 %.pre333, %62
  %120 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.4101206.us224.us
  %121 = getelementptr inbounds i8, ptr %120, i64 8
  %122 = load i32, ptr %121, align 8, !tbaa !28
  %123 = icmp ult i32 %122, %119
  br i1 %123, label %125, label %.split214.us226.us

.split214.us226.us:                               ; preds = %.critedge138.us225.us
  %124 = icmp ugt i32 %122, %119
  br i1 %124, label %111, label %.split222.us.us

125:                                              ; preds = %.critedge138.us225.us
  %126 = add i64 %.3207.us223.us, 1
  %127 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.3207.us223.us
  %128 = add i64 %.4101206.us224.us, 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %127, ptr noundef nonnull align 8 dereferenceable(16) %120, i64 16, i1 false), !tbaa.struct !33
  %129 = load i64, ptr %64, align 8, !tbaa !23
  %.not129.us231.us = icmp ugt i64 %128, %129
  br i1 %.not129.us231.us, label %.loopexit, label %114, !llvm.loop !35

.preheader147.us.us:                              ; preds = %111
  %130 = load i64, ptr %64, align 8, !tbaa !23
  %.not129205.us.us = icmp ugt i64 %.299.us.us, %130
  br i1 %.not129205.us.us, label %.loopexit, label %.lr.ph.us.us

.lr.ph.us.us:                                     ; preds = %.preheader147.us.us
  %131 = getelementptr inbounds i32, ptr %1, i64 %112
  br label %114

132:                                              ; preds = %.critedge
  %133 = icmp ult i32 %98, %96
  %134 = zext i1 %133 to i64
  %135 = add i64 %.097, %134
  %not. = xor i1 %133, true
  %136 = sext i1 %not. to i64
  %137 = add nsw i64 %.0105, %136
  %.not136 = icmp eq i64 %137, 0
  br i1 %.not136, label %.thread142, label %.split.split, !prof !13

.split222:                                        ; preds = %.split214.us, %.preheader150
  %.1106 = phi i64 [ %.us-phi, %.preheader150 ], [ %148, %.split214.us ]
  %.198 = phi i64 [ %.us-phi184, %.preheader150 ], [ %.4101206.us, %.split214.us ]
  %.0 = phi i64 [ %.us-phi184, %.preheader150 ], [ %.3207.us, %.split214.us ]
  %138 = tail call i32 @dpl_npages(ptr noundef nonnull %36, i64 noundef %.198) #9
  %139 = zext i32 %138 to i64
  %140 = load i64, ptr %101, align 8, !tbaa !30
  %141 = sub i64 %140, %139
  store i64 %141, ptr %101, align 8, !tbaa !30
  %142 = load ptr, ptr %102, align 8, !tbaa !20
  %143 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.198
  %144 = load ptr, ptr %143, align 8, !tbaa !31
  tail call void @page_shadow_release(ptr noundef %142, ptr noundef %144, i64 noundef %139) #10
  %145 = add i64 %.198, 1
  br label %147

.split237.us:                                     ; preds = %114
  %146 = load ptr, ptr %102, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %146, ptr noundef nonnull @.str.36, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 459) #7
  unreachable

147:                                              ; preds = %.split214.us, %.split222
  %.2107 = phi i64 [ %.1106, %.split222 ], [ %148, %.split214.us ]
  %.299 = phi i64 [ %145, %.split222 ], [ %.4101206.us, %.split214.us ]
  %.1 = phi i64 [ %.0, %.split222 ], [ %.3207.us, %.split214.us ]
  %148 = add nsw i64 %.2107, -1
  %149 = icmp eq i64 %148, 0
  br i1 %149, label %.preheader, label %.preheader147, !prof !13

.preheader147:                                    ; preds = %147
  %150 = load i64, ptr %64, align 8, !tbaa !23
  %.not129205 = icmp ugt i64 %.299, %150
  br i1 %.not129205, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader147
  %151 = getelementptr inbounds i32, ptr %1, i64 %148
  br label %.critedge138.us

.critedge138.us:                                  ; preds = %158, %.lr.ph
  %.3207.us = phi i64 [ %.1, %.lr.ph ], [ %159, %158 ]
  %.4101206.us = phi i64 [ %.299, %.lr.ph ], [ %161, %158 ]
  %152 = load i32, ptr %151, align 4, !tbaa !21
  %153 = lshr i32 %152, %62
  %154 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.4101206.us
  %155 = getelementptr inbounds i8, ptr %154, i64 8
  %156 = load i32, ptr %155, align 8, !tbaa !28
  %157 = icmp ult i32 %156, %153
  br i1 %157, label %158, label %.split214.us

158:                                              ; preds = %.critedge138.us
  %159 = add i64 %.3207.us, 1
  %160 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.3207.us
  %161 = add i64 %.4101206.us, 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %160, ptr noundef nonnull align 8 dereferenceable(16) %154, i64 16, i1 false), !tbaa.struct !33
  %162 = load i64, ptr %64, align 8, !tbaa !23
  %.not129.us = icmp ugt i64 %161, %162
  br i1 %.not129.us, label %.loopexit, label %.critedge138.us, !llvm.loop !35

.split214.us:                                     ; preds = %.critedge138.us
  %163 = icmp ugt i32 %156, %153
  br i1 %163, label %147, label %.split222

.preheader:                                       ; preds = %147, %111
  %.us-phi234 = phi i64 [ %.299.us.us, %111 ], [ %.299, %147 ]
  %.us-phi235 = phi i64 [ %.1.us.us, %111 ], [ %.1, %147 ]
  %164 = load i64, ptr %64, align 8, !tbaa !23
  %.not132258 = icmp ugt i64 %.us-phi234, %164
  br i1 %.not132258, label %.loopexit, label %.lr.ph261

.lr.ph261:                                        ; preds = %.preheader, %.lr.ph261
  %.2260 = phi i64 [ %165, %.lr.ph261 ], [ %.us-phi235, %.preheader ]
  %.3100259 = phi i64 [ %167, %.lr.ph261 ], [ %.us-phi234, %.preheader ]
  %165 = add i64 %.2260, 1
  %166 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.2260
  %167 = add i64 %.3100259, 1
  %168 = getelementptr inbounds [18 x %struct.dp], ptr %66, i64 0, i64 %.3100259
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %166, ptr noundef nonnull align 8 dereferenceable(16) %168, i64 16, i1 false), !tbaa.struct !33
  %169 = load i64, ptr %64, align 8, !tbaa !23
  %.not132 = icmp ugt i64 %167, %169
  br i1 %.not132, label %.loopexit, label %.lr.ph261, !llvm.loop !37

.loopexit:                                        ; preds = %.preheader147, %158, %.preheader147.us.us, %125, %.lr.ph261, %.preheader
  %.5 = phi i64 [ %.us-phi234, %.preheader ], [ %167, %.lr.ph261 ], [ %128, %125 ], [ %.299.us.us, %.preheader147.us.us ], [ %161, %158 ], [ %.299, %.preheader147 ]
  %.4 = phi i64 [ %.us-phi235, %.preheader ], [ %165, %.lr.ph261 ], [ %126, %125 ], [ %.1.us.us, %.preheader147.us.us ], [ %159, %158 ], [ %.1, %.preheader147 ]
  %170 = add i64 %.4, -1
  %171 = tail call i64 @dpl_setlen(ptr noundef nonnull %36, i64 noundef %170)
  store i64 %171, ptr %36, align 8, !tbaa !25
  %172 = sub i64 %.5, %.4
  %173 = getelementptr inbounds i8, ptr %0, i64 488
  %174 = load i64, ptr %173, align 8, !tbaa !22
  %175 = add i64 %174, %172
  store i64 %175, ptr %173, align 8, !tbaa !22
  %176 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %177 = and i8 %176, 1
  %.not133 = icmp eq i8 %177, 0
  br i1 %.not133, label %.thread142, label %178, !prof !13

178:                                              ; preds = %.loopexit
  %179 = load ptr, ptr %20, align 8, !tbaa !22
  %180 = getelementptr inbounds i8, ptr %179, i64 8
  %181 = load i64, ptr %180, align 8, !tbaa !23
  %182 = add i64 %181, %175
  %183 = getelementptr inbounds i8, ptr %0, i64 24
  %184 = load ptr, ptr %183, align 8, !tbaa !38
  %.not134 = icmp eq ptr %184, null
  br i1 %.not134, label %188, label %185

185:                                              ; preds = %178
  %186 = getelementptr inbounds i8, ptr %184, i64 488
  %187 = load i64, ptr %186, align 8, !tbaa !22
  br label %193

188:                                              ; preds = %178
  %189 = load ptr, ptr %102, align 8, !tbaa !20
  %190 = getelementptr inbounds i8, ptr %189, i64 272
  %191 = load i32, ptr %190, align 8, !tbaa !39
  %192 = zext i32 %191 to i64
  br label %193

193:                                              ; preds = %188, %185
  %194 = phi i64 [ %187, %185 ], [ %192, %188 ]
  %.not135 = icmp eq i64 %182, %194
  br i1 %.not135, label %.thread142, label %195, !prof !19

195:                                              ; preds = %193
  %196 = load ptr, ptr %102, align 8, !tbaa !20
  tail call void @mdbx_assert_fail(ptr noundef %196, ptr noundef nonnull @.str.37, ptr noundef nonnull @__func__.dpl_sift, i32 noundef 473) #7
  unreachable

.thread142:                                       ; preds = %132, %.split.split, %.split.split.us, %87, %.split.us.split, %76, %.loopexit, %193, %19, %.thread
  ret void
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @pnl_check_allocated(ptr noundef, i64 noundef) local_unnamed_addr #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @dpl_sort(ptr noundef) local_unnamed_addr #5

declare void @page_shadow_release(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #6

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @dpl_setlen(ptr noundef, i64 noundef) local_unnamed_addr #5

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 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 = !{!9, !9, i64 0}
!22 = !{!7, !7, i64 0}
!23 = !{!24, !11, i64 8}
!24 = !{!"dpl", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !7, i64 32}
!25 = !{!24, !11, i64 0}
!26 = !{!"branch_weights", i32 2000, i32 2002}
!27 = !{!"branch_weights", i32 2000, i32 4002001}
!28 = !{!29, !9, i64 8}
!29 = !{!"dp", !12, i64 0, !9, i64 8, !9, i64 12}
!30 = !{!24, !11, i64 16}
!31 = !{!29, !12, i64 0}
!32 = !{!"branch_weights", i32 8006002, i32 2000}
!33 = !{i64 0, i64 8, !34, i64 8, i64 4, !21, i64 12, i64 4, !21}
!34 = !{!12, !12, i64 0}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}
!37 = distinct !{!37, !36}
!38 = !{!15, !12, i64 24}
!39 = !{!40, !9, i64 272}
!40 = !{!"MDBX_env", !7, i64 0, !9, i64 4, !9, i64 8, !41, i64 16, !9, i64 56, !9, i64 60, !41, 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, !42, 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, !43, i64 264, !45, i64 320, !10, i64 360, !12, i64 368, !12, i64 376, !12, i64 384, !46, i64 392, !7, i64 400, !9, i64 440, !9, i64 444, !12, i64 448, !47, i64 456, !7, i64 496, !7, i64 536}
!41 = !{!"osal_mmap", !7, i64 0, !9, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!42 = !{!"", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24}
!43 = !{!"", !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, !44, i64 40, !7, i64 48}
!44 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!45 = !{!"", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!46 = !{!"", !11, i64 0}
!47 = !{!"osal_ioring", !9, i64 0, !9, i64 4, !9, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}


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