; LLVM IR from erthink/libmdbx :: src (page-ops)

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

%struct.libmdbx_globals = type { %union.bin128, i32, i32, i8, i8, i8, i8, i32, %union.logger_union, %union.pthread_mutex_t, i64, ptr }
%union.bin128 = type { %struct.anon }
%struct.anon = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.page_get_result = type { ptr, i32 }
%struct.MDBX_cursor = type { i32, %union.anon, i8, i8, ptr, ptr, ptr, ptr, ptr, [32 x ptr], [32 x i16], ptr, ptr }
%union.anon = type { i16 }
%struct.page = type <{ i64, i16, i16, %union.anon.10, i32, [0 x i16] }>
%union.anon.10 = type { i32 }
%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.4 }
%struct.geo = type { i16, i16, i32, i32, %union.anon.2, %union.anon.3 }
%union.anon.2 = type { i32 }
%union.anon.3 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.4 = type { %struct.anon.6 }
%struct.anon.6 = type { %struct.troika, ptr, %struct.anon.7, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.8 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.7 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.8 = type { %struct.anon.9 }
%struct.anon.9 = type { i64, ptr }
%struct.dpl = type { i64, i64, i64, i64, [18 x %struct.dp] }
%struct.dp = type { ptr, i32, i32 }
%struct.anon.1 = type { i8, i8 }
%struct.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }
%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.13, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.14, %struct.anon.18, i8, ptr, ptr, ptr, %struct.anon.19, %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.12, i32, i64, i64, i64 }
%union.anon.12 = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon.13 = type { ptr, ptr, ptr, ptr }
%struct.anon.14 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.15, %union.anon.16 }
%struct.anon.15 = type { i16, i16, i16, i16 }
%union.anon.16 = type { i32 }
%struct.anon.18 = type { i64, i64, i64, i64, i64 }
%struct.anon.19 = 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.11 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [52 x i8], align 1
@__func__.page_retire_ex = external hidden unnamed_addr constant [15 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.63 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.64 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.65 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.66 = external hidden unnamed_addr constant [38 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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @outer_tree(ptr noundef) #4

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

; 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) #5

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @spill_search(ptr noundef, i32 noundef) #4

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

declare void @spill_remove(ptr noundef, i64 noundef, i64 noundef) #2

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @page_retire_ex(ptr noundef %0, i32 noundef %1, ptr noundef %2, i32 noundef %3) #8 {
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i32, align 4
  %16 = alloca %struct.page_get_result, align 8
  %17 = alloca %struct.page_get_result, align 8
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca %struct.page_get_result, align 8
  %22 = alloca i8, align 1
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store i32 %1, ptr %7, align 4, !tbaa !9
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #10
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #10
  %30 = load ptr, ptr %6, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.MDBX_cursor, ptr %30, i32 0, i32 5
  %32 = load ptr, ptr %31, align 8, !tbaa !11
  store ptr %32, ptr %11, align 8, !tbaa !5
  br label %33

33:                                               ; preds = %4
  %34 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %35 = zext i8 %34 to i32
  %36 = and i32 %35, 1
  %37 = icmp ne i32 %36, 0
  %38 = xor i1 %37, true
  %39 = xor i1 %38, true
  %40 = zext i1 %39 to i32
  %41 = sext i32 %40 to i64
  %42 = call i64 @llvm.expect.i64(i64 %41, i64 1)
  %43 = icmp ne i64 %42, 0
  br i1 %43, label %44, label %79

44:                                               ; preds = %33
  br label %45

45:                                               ; preds = %44
  %46 = load ptr, ptr %8, align 8, !tbaa !5
  %47 = icmp ne ptr %46, null
  br i1 %47, label %48, label %63

48:                                               ; preds = %45
  %49 = load ptr, ptr %8, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.page, ptr %49, i32 0, i32 4
  %51 = load i32, ptr %50, align 1, !tbaa !9
  %52 = load i32, ptr %7, align 4, !tbaa !9
  %53 = icmp eq i32 %51, %52
  br i1 %53, label %54, label %61

54:                                               ; preds = %48
  %55 = load ptr, ptr %8, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.page, ptr %55, i32 0, i32 2
  %57 = load i16, ptr %56, align 1, !tbaa !17
  %58 = zext i16 %57 to i32
  %59 = load i32, ptr %9, align 4, !tbaa !9
  %60 = icmp eq i32 %58, %59
  br label %61

61:                                               ; preds = %54, %48
  %62 = phi i1 [ false, %48 ], [ %60, %54 ]
  br label %63

63:                                               ; preds = %61, %45
  %64 = phi i1 [ true, %45 ], [ %62, %61 ]
  %65 = xor i1 %64, true
  %66 = xor i1 %65, true
  %67 = xor i1 %66, true
  %68 = zext i1 %67 to i32
  %69 = sext i32 %68 to i64
  %70 = call i64 @llvm.expect.i64(i64 %69, i64 0)
  %71 = icmp ne i64 %70, 0
  br i1 %71, label %72, label %76

72:                                               ; preds = %63
  %73 = load ptr, ptr %11, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.MDBX_txn, ptr %73, i32 0, i32 9
  %75 = load ptr, ptr %74, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %75, ptr noundef @.str.31, ptr noundef @__func__.page_retire_ex, i32 noundef 391) #11
  unreachable

76:                                               ; preds = %63
  br label %77

77:                                               ; preds = %76
  br label %78

78:                                               ; preds = %77
  br label %79

79:                                               ; preds = %78, %33
  br label %80

80:                                               ; preds = %79
  br label %81

81:                                               ; preds = %80
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #10
  store i64 0, ptr %12, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #10
  store i64 0, ptr %13, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #10
  store i64 1, ptr %14, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #10
  store i32 0, ptr %15, align 4, !tbaa !9
  %82 = load ptr, ptr %8, align 8, !tbaa !5
  %83 = icmp ne ptr %82, null
  %84 = xor i1 %83, true
  %85 = xor i1 %84, true
  %86 = xor i1 %85, true
  %87 = zext i1 %86 to i32
  %88 = sext i32 %87 to i64
  %89 = call i64 @llvm.expect.i64(i64 %88, i64 0)
  %90 = icmp ne i64 %89, 0
  br i1 %90, label %91, label %492

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

102:                                              ; preds = %91
  %103 = load i32, ptr %9, align 4, !tbaa !9
  %104 = icmp ne i32 %103, 0
  br i1 %104, label %105, label %211

105:                                              ; preds = %102
  call void @llvm.lifetime.start.p0(i64 16, ptr %16) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %17) #10
  %106 = load ptr, ptr %6, align 8, !tbaa !5
  %107 = load i32, ptr %7, align 4, !tbaa !9
  %108 = load ptr, ptr %11, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.MDBX_txn, ptr %108, i32 0, i32 8
  %110 = load i64, ptr %109, align 8, !tbaa !24
  %111 = call { ptr, i32 } @page_get_any(ptr noundef %106, i32 noundef %107, i64 noundef %110)
  %112 = getelementptr inbounds { ptr, i32 }, ptr %17, i32 0, i32 0
  %113 = extractvalue { ptr, i32 } %111, 0
  store ptr %113, ptr %112, align 8
  %114 = getelementptr inbounds { ptr, i32 }, ptr %17, i32 0, i32 1
  %115 = extractvalue { ptr, i32 } %111, 1
  store i32 %115, ptr %114, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %16, ptr align 8 %17, i64 16, i1 false), !tbaa.struct !25
  call void @llvm.lifetime.end.p0(i64 16, ptr %17) #10
  %116 = getelementptr inbounds %struct.page_get_result, ptr %16, i32 0, i32 1
  %117 = load i32, ptr %116, align 8, !tbaa !26
  %118 = icmp ne i32 %117, 0
  %119 = xor i1 %118, true
  %120 = xor i1 %119, true
  %121 = zext i1 %120 to i32
  %122 = sext i32 %121 to i64
  %123 = call i64 @llvm.expect.i64(i64 %122, i64 0)
  %124 = icmp ne i64 %123, 0
  br i1 %124, label %125, label %128

125:                                              ; preds = %105
  %126 = getelementptr inbounds %struct.page_get_result, ptr %16, i32 0, i32 1
  %127 = load i32, ptr %126, align 8, !tbaa !26
  store i32 %127, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %208

128:                                              ; preds = %105
  br label %129

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

140:                                              ; preds = %129
  br label %141

141:                                              ; preds = %140
  %142 = getelementptr inbounds %struct.page_get_result, ptr %16, i32 0, i32 0
  %143 = load ptr, ptr %142, align 8, !tbaa !28
  %144 = getelementptr inbounds %struct.page, ptr %143, i32 0, i32 2
  %145 = load i16, ptr %144, align 1, !tbaa !17
  %146 = zext i16 %145 to i32
  %147 = and i32 %146, -8193
  %148 = load i32, ptr %9, align 4, !tbaa !9
  %149 = and i32 %148, -32769
  %150 = icmp eq i32 %147, %149
  %151 = xor i1 %150, true
  %152 = xor i1 %151, true
  %153 = xor i1 %152, true
  %154 = zext i1 %153 to i32
  %155 = sext i32 %154 to i64
  %156 = call i64 @llvm.expect.i64(i64 %155, i64 0)
  %157 = icmp ne i64 %156, 0
  br i1 %157, label %158, label %162

158:                                              ; preds = %141
  %159 = load ptr, ptr %11, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.MDBX_txn, ptr %159, i32 0, i32 9
  %161 = load ptr, ptr %160, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %161, ptr noundef @.str.32, ptr noundef @__func__.page_retire_ex, i32 noundef 413) #11
  unreachable

162:                                              ; preds = %141
  br label %163

163:                                              ; preds = %162
  br label %164

164:                                              ; preds = %163
  br label %165

165:                                              ; preds = %164, %129
  br label %166

166:                                              ; preds = %165
  br label %167

167:                                              ; preds = %166
  br label %168

168:                                              ; preds = %167
  %169 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %170 = zext i8 %169 to i32
  %171 = and i32 %170, 1
  %172 = icmp ne i32 %171, 0
  %173 = xor i1 %172, true
  %174 = xor i1 %173, true
  %175 = zext i1 %174 to i32
  %176 = sext i32 %175 to i64
  %177 = call i64 @llvm.expect.i64(i64 %176, i64 1)
  %178 = icmp ne i64 %177, 0
  br i1 %178, label %179, label %205

179:                                              ; preds = %168
  br label %180

180:                                              ; preds = %179
  %181 = load i32, ptr %9, align 4, !tbaa !9
  %182 = and i32 %181, 32768
  %183 = icmp ne i32 %182, 0
  br i1 %183, label %184, label %189

184:                                              ; preds = %180
  %185 = load ptr, ptr %11, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.page_get_result, ptr %16, i32 0, i32 0
  %187 = load ptr, ptr %186, align 8, !tbaa !28
  %188 = call zeroext i1 @is_frozen(ptr noundef %185, ptr noundef %187) #12
  br label %189

189:                                              ; preds = %184, %180
  %190 = phi i1 [ true, %180 ], [ %188, %184 ]
  %191 = xor i1 %190, true
  %192 = xor i1 %191, true
  %193 = xor i1 %192, true
  %194 = zext i1 %193 to i32
  %195 = sext i32 %194 to i64
  %196 = call i64 @llvm.expect.i64(i64 %195, i64 0)
  %197 = icmp ne i64 %196, 0
  br i1 %197, label %198, label %202

198:                                              ; preds = %189
  %199 = load ptr, ptr %11, align 8, !tbaa !5
  %200 = getelementptr inbounds %struct.MDBX_txn, ptr %199, i32 0, i32 9
  %201 = load ptr, ptr %200, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %201, ptr noundef @.str.33, ptr noundef @__func__.page_retire_ex, i32 noundef 414) #11
  unreachable

202:                                              ; preds = %189
  br label %203

203:                                              ; preds = %202
  br label %204

204:                                              ; preds = %203
  br label %205

205:                                              ; preds = %204, %168
  br label %206

206:                                              ; preds = %205
  br label %207

207:                                              ; preds = %206
  store i32 0, ptr %18, align 4
  br label %208

208:                                              ; preds = %207, %125
  call void @llvm.lifetime.end.p0(i64 16, ptr %16) #10
  %209 = load i32, ptr %18, align 4
  switch i32 %209, label %2056 [
    i32 0, label %210
  ]

210:                                              ; preds = %208
  br label %211

211:                                              ; preds = %210, %102, %91
  %212 = load i32, ptr %9, align 4, !tbaa !9
  %213 = and i32 %212, 32768
  %214 = icmp ne i32 %213, 0
  br i1 %214, label %215, label %326

215:                                              ; preds = %211
  store i32 1, ptr %15, align 4, !tbaa !9
  %216 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %217 = zext i8 %216 to i32
  %218 = and i32 %217, 1
  %219 = icmp ne i32 %218, 0
  %220 = xor i1 %219, true
  %221 = xor i1 %220, true
  %222 = zext i1 %221 to i32
  %223 = sext i32 %222 to i64
  %224 = call i64 @llvm.expect.i64(i64 %223, i64 1)
  %225 = icmp ne i64 %224, 0
  br i1 %225, label %226, label %325

226:                                              ; preds = %215
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #10
  %227 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %227, ptr %19, align 8, !tbaa !5
  br label %228

228:                                              ; preds = %320, %226
  %229 = load ptr, ptr %19, align 8, !tbaa !5
  %230 = icmp ne ptr %229, null
  br i1 %230, label %232, label %231

231:                                              ; preds = %228
  store i32 14, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #10
  br label %324

232:                                              ; preds = %228
  br label %233

233:                                              ; preds = %232
  %234 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %235 = zext i8 %234 to i32
  %236 = and i32 %235, 1
  %237 = icmp ne i32 %236, 0
  %238 = xor i1 %237, true
  %239 = xor i1 %238, true
  %240 = zext i1 %239 to i32
  %241 = sext i32 %240 to i64
  %242 = call i64 @llvm.expect.i64(i64 %241, i64 1)
  %243 = icmp ne i64 %242, 0
  br i1 %243, label %244, label %274

244:                                              ; preds = %233
  br label %245

245:                                              ; preds = %244
  %246 = load ptr, ptr %11, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.MDBX_txn, ptr %246, i32 0, i32 17
  %248 = getelementptr inbounds %struct.anon.6, ptr %247, i32 0, i32 11
  %249 = getelementptr inbounds %struct.anon.9, ptr %248, i32 0, i32 1
  %250 = load ptr, ptr %249, align 8, !tbaa !29
  %251 = icmp ne ptr %250, null
  br i1 %251, label %252, label %258

252:                                              ; preds = %245
  %253 = load ptr, ptr %19, align 8, !tbaa !5
  %254 = load i32, ptr %7, align 4, !tbaa !9
  %255 = call i64 @spill_search(ptr noundef %253, i32 noundef %254)
  %256 = icmp ne i64 %255, 0
  %257 = xor i1 %256, true
  br label %258

258:                                              ; preds = %252, %245
  %259 = phi i1 [ true, %245 ], [ %257, %252 ]
  %260 = xor i1 %259, true
  %261 = xor i1 %260, true
  %262 = xor i1 %261, true
  %263 = zext i1 %262 to i32
  %264 = sext i32 %263 to i64
  %265 = call i64 @llvm.expect.i64(i64 %264, i64 0)
  %266 = icmp ne i64 %265, 0
  br i1 %266, label %267, label %271

267:                                              ; preds = %258
  %268 = load ptr, ptr %11, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.MDBX_txn, ptr %268, i32 0, i32 9
  %270 = load ptr, ptr %269, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %270, ptr noundef @.str.34, ptr noundef @__func__.page_retire_ex, i32 noundef 420) #11
  unreachable

271:                                              ; preds = %258
  br label %272

272:                                              ; preds = %271
  br label %273

273:                                              ; preds = %272
  br label %274

274:                                              ; preds = %273, %233
  br label %275

275:                                              ; preds = %274
  br label %276

276:                                              ; preds = %275
  br label %277

277:                                              ; preds = %276
  %278 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %279 = zext i8 %278 to i32
  %280 = and i32 %279, 1
  %281 = icmp ne i32 %280, 0
  %282 = xor i1 %281, true
  %283 = xor i1 %282, true
  %284 = zext i1 %283 to i32
  %285 = sext i32 %284 to i64
  %286 = call i64 @llvm.expect.i64(i64 %285, i64 1)
  %287 = icmp ne i64 %286, 0
  br i1 %287, label %288, label %317

288:                                              ; preds = %277
  br label %289

289:                                              ; preds = %288
  %290 = load ptr, ptr %19, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.MDBX_txn, ptr %290, i32 0, i32 17
  %292 = getelementptr inbounds %struct.anon.6, ptr %291, i32 0, i32 7
  %293 = load ptr, ptr %292, align 8, !tbaa !29
  %294 = icmp ne ptr %293, null
  br i1 %294, label %295, label %301

295:                                              ; preds = %289
  %296 = load ptr, ptr %19, align 8, !tbaa !5
  %297 = load i32, ptr %7, align 4, !tbaa !9
  %298 = call ptr @debug_dpl_find(ptr noundef %296, i32 noundef %297)
  %299 = icmp ne ptr %298, null
  %300 = xor i1 %299, true
  br label %301

301:                                              ; preds = %295, %289
  %302 = phi i1 [ true, %289 ], [ %300, %295 ]
  %303 = xor i1 %302, true
  %304 = xor i1 %303, true
  %305 = xor i1 %304, true
  %306 = zext i1 %305 to i32
  %307 = sext i32 %306 to i64
  %308 = call i64 @llvm.expect.i64(i64 %307, i64 0)
  %309 = icmp ne i64 %308, 0
  br i1 %309, label %310, label %314

310:                                              ; preds = %301
  %311 = load ptr, ptr %11, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.MDBX_txn, ptr %311, i32 0, i32 9
  %313 = load ptr, ptr %312, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %313, ptr noundef @.str.35, ptr noundef @__func__.page_retire_ex, i32 noundef 421) #11
  unreachable

314:                                              ; preds = %301
  br label %315

315:                                              ; preds = %314
  br label %316

316:                                              ; preds = %315
  br label %317

317:                                              ; preds = %316, %277
  br label %318

318:                                              ; preds = %317
  br label %319

319:                                              ; preds = %318
  br label %320

320:                                              ; preds = %319
  %321 = load ptr, ptr %19, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.MDBX_txn, ptr %321, i32 0, i32 4
  %323 = load ptr, ptr %322, align 8, !tbaa !30
  store ptr %323, ptr %19, align 8, !tbaa !5
  br label %228, !llvm.loop !31

324:                                              ; preds = %231
  br label %325

325:                                              ; preds = %324, %215
  br label %938

326:                                              ; preds = %211
  %327 = load i32, ptr %9, align 4, !tbaa !9
  %328 = icmp ne i32 %327, 0
  br i1 %328, label %329, label %417

329:                                              ; preds = %326
  %330 = load ptr, ptr %11, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.MDBX_txn, ptr %330, i32 0, i32 17
  %332 = getelementptr inbounds %struct.anon.6, ptr %331, i32 0, i32 7
  %333 = load ptr, ptr %332, align 8, !tbaa !29
  %334 = icmp ne ptr %333, null
  br i1 %334, label %335, label %417

335:                                              ; preds = %329
  %336 = load ptr, ptr %11, align 8, !tbaa !5
  %337 = load i32, ptr %7, align 4, !tbaa !9
  %338 = call i64 @dpl_exist(ptr noundef %336, i32 noundef %337) #12
  store i64 %338, ptr %12, align 8, !tbaa !23
  %339 = icmp ne i64 %338, 0
  br i1 %339, label %340, label %383

340:                                              ; preds = %335
  %341 = load ptr, ptr %11, align 8, !tbaa !5
  %342 = getelementptr inbounds %struct.MDBX_txn, ptr %341, i32 0, i32 17
  %343 = getelementptr inbounds %struct.anon.6, ptr %342, i32 0, i32 7
  %344 = load ptr, ptr %343, align 8, !tbaa !29
  %345 = getelementptr inbounds %struct.dpl, ptr %344, i32 0, i32 4
  %346 = load i64, ptr %12, align 8, !tbaa !23
  %347 = getelementptr inbounds [18 x %struct.dp], ptr %345, i64 0, i64 %346
  %348 = getelementptr inbounds %struct.dp, ptr %347, i32 0, i32 0
  %349 = load ptr, ptr %348, align 8, !tbaa !33
  store ptr %349, ptr %8, align 8, !tbaa !5
  br label %350

350:                                              ; preds = %340
  %351 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %352 = zext i8 %351 to i32
  %353 = and i32 %352, 1
  %354 = icmp ne i32 %353, 0
  %355 = xor i1 %354, true
  %356 = xor i1 %355, true
  %357 = zext i1 %356 to i32
  %358 = sext i32 %357 to i64
  %359 = call i64 @llvm.expect.i64(i64 %358, i64 1)
  %360 = icmp ne i64 %359, 0
  br i1 %360, label %361, label %380

361:                                              ; preds = %350
  br label %362

362:                                              ; preds = %361
  %363 = load ptr, ptr %11, align 8, !tbaa !5
  %364 = load ptr, ptr %8, align 8, !tbaa !5
  %365 = call zeroext i1 @is_modifable(ptr noundef %363, ptr noundef %364) #12
  %366 = xor i1 %365, true
  %367 = xor i1 %366, true
  %368 = xor i1 %367, true
  %369 = zext i1 %368 to i32
  %370 = sext i32 %369 to i64
  %371 = call i64 @llvm.expect.i64(i64 %370, i64 0)
  %372 = icmp ne i64 %371, 0
  br i1 %372, label %373, label %377

373:                                              ; preds = %362
  %374 = load ptr, ptr %11, align 8, !tbaa !5
  %375 = getelementptr inbounds %struct.MDBX_txn, ptr %374, i32 0, i32 9
  %376 = load ptr, ptr %375, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %376, ptr noundef @.str.36, ptr noundef @__func__.page_retire_ex, i32 noundef 428) #11
  unreachable

377:                                              ; preds = %362
  br label %378

378:                                              ; preds = %377
  br label %379

379:                                              ; preds = %378
  br label %380

380:                                              ; preds = %379, %350
  br label %381

381:                                              ; preds = %380
  br label %382

382:                                              ; preds = %381
  store i32 4, ptr %15, align 4, !tbaa !9
  br label %938

383:                                              ; preds = %335
  %384 = load ptr, ptr %11, align 8, !tbaa !5
  %385 = load i32, ptr %7, align 4, !tbaa !9
  %386 = call i64 @spill_search(ptr noundef %384, i32 noundef %385)
  store i64 %386, ptr %13, align 8, !tbaa !23
  %387 = icmp ne i64 %386, 0
  br i1 %387, label %388, label %389

388:                                              ; preds = %383
  store i32 2, ptr %15, align 4, !tbaa !9
  br label %938

389:                                              ; preds = %383
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #10
  %390 = load ptr, ptr %11, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.MDBX_txn, ptr %390, i32 0, i32 4
  %392 = load ptr, ptr %391, align 8, !tbaa !30
  store ptr %392, ptr %20, align 8, !tbaa !5
  br label %393

393:                                              ; preds = %410, %389
  %394 = load ptr, ptr %20, align 8, !tbaa !5
  %395 = icmp ne ptr %394, null
  br i1 %395, label %397, label %396

396:                                              ; preds = %393
  store i32 30, ptr %18, align 4
  br label %414

397:                                              ; preds = %393
  %398 = load ptr, ptr %20, align 8, !tbaa !5
  %399 = load i32, ptr %7, align 4, !tbaa !9
  %400 = call i64 @dpl_exist(ptr noundef %398, i32 noundef %399) #12
  %401 = icmp ne i64 %400, 0
  br i1 %401, label %402, label %403

402:                                              ; preds = %397
  store i32 3, ptr %15, align 4, !tbaa !9
  store i32 25, ptr %18, align 4
  br label %414

403:                                              ; preds = %397
  %404 = load ptr, ptr %20, align 8, !tbaa !5
  %405 = load i32, ptr %7, align 4, !tbaa !9
  %406 = call i64 @spill_search(ptr noundef %404, i32 noundef %405)
  %407 = icmp ne i64 %406, 0
  br i1 %407, label %408, label %409

408:                                              ; preds = %403
  store i32 2, ptr %15, align 4, !tbaa !9
  store i32 25, ptr %18, align 4
  br label %414

409:                                              ; preds = %403
  br label %410

410:                                              ; preds = %409
  %411 = load ptr, ptr %20, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.MDBX_txn, ptr %411, i32 0, i32 4
  %413 = load ptr, ptr %412, align 8, !tbaa !30
  store ptr %413, ptr %20, align 8, !tbaa !5
  br label %393, !llvm.loop !35

414:                                              ; preds = %408, %402, %396
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #10
  %415 = load i32, ptr %18, align 4
  switch i32 %415, label %2056 [
    i32 30, label %416
    i32 25, label %938
  ]

416:                                              ; preds = %414
  store i32 1, ptr %15, align 4, !tbaa !9
  br label %938

417:                                              ; preds = %329, %326
  br label %418

418:                                              ; preds = %417
  call void @llvm.lifetime.start.p0(i64 16, ptr %21) #10
  %419 = load ptr, ptr %6, align 8, !tbaa !5
  %420 = load i32, ptr %7, align 4, !tbaa !9
  %421 = load ptr, ptr %11, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.MDBX_txn, ptr %421, i32 0, i32 8
  %423 = load i64, ptr %422, align 8, !tbaa !24
  %424 = call { ptr, i32 } @page_get_any(ptr noundef %419, i32 noundef %420, i64 noundef %423)
  %425 = getelementptr inbounds { ptr, i32 }, ptr %21, i32 0, i32 0
  %426 = extractvalue { ptr, i32 } %424, 0
  store ptr %426, ptr %425, align 8
  %427 = getelementptr inbounds { ptr, i32 }, ptr %21, i32 0, i32 1
  %428 = extractvalue { ptr, i32 } %424, 1
  store i32 %428, ptr %427, align 8
  %429 = getelementptr inbounds %struct.page_get_result, ptr %21, i32 0, i32 1
  %430 = load i32, ptr %429, align 8, !tbaa !26
  %431 = icmp ne i32 %430, 0
  %432 = xor i1 %431, true
  %433 = xor i1 %432, true
  %434 = zext i1 %433 to i32
  %435 = sext i32 %434 to i64
  %436 = call i64 @llvm.expect.i64(i64 %435, i64 0)
  %437 = icmp ne i64 %436, 0
  br i1 %437, label %438, label %441

438:                                              ; preds = %418
  %439 = getelementptr inbounds %struct.page_get_result, ptr %21, i32 0, i32 1
  %440 = load i32, ptr %439, align 8, !tbaa !26
  store i32 %440, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %489

441:                                              ; preds = %418
  %442 = getelementptr inbounds %struct.page_get_result, ptr %21, i32 0, i32 0
  %443 = load ptr, ptr %442, align 8, !tbaa !28
  store ptr %443, ptr %8, align 8, !tbaa !5
  br label %444

444:                                              ; preds = %441
  %445 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %446 = zext i8 %445 to i32
  %447 = and i32 %446, 1
  %448 = icmp ne i32 %447, 0
  %449 = xor i1 %448, true
  %450 = xor i1 %449, true
  %451 = zext i1 %450 to i32
  %452 = sext i32 %451 to i64
  %453 = call i64 @llvm.expect.i64(i64 %452, i64 1)
  %454 = icmp ne i64 %453, 0
  br i1 %454, label %455, label %482

455:                                              ; preds = %444
  br label %456

456:                                              ; preds = %455
  %457 = load i32, ptr %9, align 4, !tbaa !9
  %458 = icmp ne i32 %457, 0
  br i1 %458, label %459, label %466

459:                                              ; preds = %456
  %460 = load ptr, ptr %8, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.page, ptr %460, i32 0, i32 2
  %462 = load i16, ptr %461, align 1, !tbaa !17
  %463 = zext i16 %462 to i32
  %464 = load i32, ptr %9, align 4, !tbaa !9
  %465 = icmp eq i32 %463, %464
  br label %466

466:                                              ; preds = %459, %456
  %467 = phi i1 [ true, %456 ], [ %465, %459 ]
  %468 = xor i1 %467, true
  %469 = xor i1 %468, true
  %470 = xor i1 %469, true
  %471 = zext i1 %470 to i32
  %472 = sext i32 %471 to i64
  %473 = call i64 @llvm.expect.i64(i64 %472, i64 0)
  %474 = icmp ne i64 %473, 0
  br i1 %474, label %475, label %479

475:                                              ; preds = %466
  %476 = load ptr, ptr %11, align 8, !tbaa !5
  %477 = getelementptr inbounds %struct.MDBX_txn, ptr %476, i32 0, i32 9
  %478 = load ptr, ptr %477, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %478, ptr noundef @.str.37, ptr noundef @__func__.page_retire_ex, i32 noundef 454) #11
  unreachable

479:                                              ; preds = %466
  br label %480

480:                                              ; preds = %479
  br label %481

481:                                              ; preds = %480
  br label %482

482:                                              ; preds = %481, %444
  br label %483

483:                                              ; preds = %482
  br label %484

484:                                              ; preds = %483
  %485 = load ptr, ptr %8, align 8, !tbaa !5
  %486 = getelementptr inbounds %struct.page, ptr %485, i32 0, i32 2
  %487 = load i16, ptr %486, align 1, !tbaa !17
  %488 = zext i16 %487 to i32
  store i32 %488, ptr %9, align 4, !tbaa !9
  store i32 0, ptr %18, align 4
  br label %489

489:                                              ; preds = %484, %438
  call void @llvm.lifetime.end.p0(i64 16, ptr %21) #10
  %490 = load i32, ptr %18, align 4
  switch i32 %490, label %2056 [
    i32 0, label %491
  ]

491:                                              ; preds = %489
  br label %492

492:                                              ; preds = %491, %81
  %493 = load ptr, ptr %11, align 8, !tbaa !5
  %494 = load ptr, ptr %8, align 8, !tbaa !5
  %495 = call zeroext i1 @is_frozen(ptr noundef %493, ptr noundef %494) #12
  br i1 %495, label %496, label %678

496:                                              ; preds = %492
  store i32 1, ptr %15, align 4, !tbaa !9
  br label %497

497:                                              ; preds = %496
  %498 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %499 = zext i8 %498 to i32
  %500 = and i32 %499, 1
  %501 = icmp ne i32 %500, 0
  %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 1)
  %507 = icmp ne i64 %506, 0
  br i1 %507, label %508, label %528

508:                                              ; preds = %497
  br label %509

509:                                              ; preds = %508
  %510 = load ptr, ptr %11, align 8, !tbaa !5
  %511 = load ptr, ptr %8, align 8, !tbaa !5
  %512 = call zeroext i1 @is_modifable(ptr noundef %510, ptr noundef %511) #12
  %513 = xor i1 %512, true
  %514 = xor i1 %513, true
  %515 = xor i1 %514, true
  %516 = xor i1 %515, true
  %517 = zext i1 %516 to i32
  %518 = sext i32 %517 to i64
  %519 = call i64 @llvm.expect.i64(i64 %518, i64 0)
  %520 = icmp ne i64 %519, 0
  br i1 %520, label %521, label %525

521:                                              ; preds = %509
  %522 = load ptr, ptr %11, align 8, !tbaa !5
  %523 = getelementptr inbounds %struct.MDBX_txn, ptr %522, i32 0, i32 9
  %524 = load ptr, ptr %523, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %524, ptr noundef @.str.38, ptr noundef @__func__.page_retire_ex, i32 noundef 460) #11
  unreachable

525:                                              ; preds = %509
  br label %526

526:                                              ; preds = %525
  br label %527

527:                                              ; preds = %526
  br label %528

528:                                              ; preds = %527, %497
  br label %529

529:                                              ; preds = %528
  br label %530

530:                                              ; preds = %529
  br label %531

531:                                              ; preds = %530
  %532 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %533 = zext i8 %532 to i32
  %534 = and i32 %533, 1
  %535 = icmp ne i32 %534, 0
  %536 = xor i1 %535, true
  %537 = xor i1 %536, true
  %538 = zext i1 %537 to i32
  %539 = sext i32 %538 to i64
  %540 = call i64 @llvm.expect.i64(i64 %539, i64 1)
  %541 = icmp ne i64 %540, 0
  br i1 %541, label %542, label %562

542:                                              ; preds = %531
  br label %543

543:                                              ; preds = %542
  %544 = load ptr, ptr %11, align 8, !tbaa !5
  %545 = load ptr, ptr %8, align 8, !tbaa !5
  %546 = call zeroext i1 @is_spilled(ptr noundef %544, ptr noundef %545) #12
  %547 = xor i1 %546, true
  %548 = xor i1 %547, true
  %549 = xor i1 %548, true
  %550 = xor i1 %549, true
  %551 = zext i1 %550 to i32
  %552 = sext i32 %551 to i64
  %553 = call i64 @llvm.expect.i64(i64 %552, i64 0)
  %554 = icmp ne i64 %553, 0
  br i1 %554, label %555, label %559

555:                                              ; preds = %543
  %556 = load ptr, ptr %11, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct.MDBX_txn, ptr %556, i32 0, i32 9
  %558 = load ptr, ptr %557, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %558, ptr noundef @.str.39, ptr noundef @__func__.page_retire_ex, i32 noundef 461) #11
  unreachable

559:                                              ; preds = %543
  br label %560

560:                                              ; preds = %559
  br label %561

561:                                              ; preds = %560
  br label %562

562:                                              ; preds = %561, %531
  br label %563

563:                                              ; preds = %562
  br label %564

564:                                              ; preds = %563
  br label %565

565:                                              ; preds = %564
  %566 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %567 = zext i8 %566 to i32
  %568 = and i32 %567, 1
  %569 = icmp ne i32 %568, 0
  %570 = xor i1 %569, true
  %571 = xor i1 %570, true
  %572 = zext i1 %571 to i32
  %573 = sext i32 %572 to i64
  %574 = call i64 @llvm.expect.i64(i64 %573, i64 1)
  %575 = icmp ne i64 %574, 0
  br i1 %575, label %576, label %596

576:                                              ; preds = %565
  br label %577

577:                                              ; preds = %576
  %578 = load ptr, ptr %11, align 8, !tbaa !5
  %579 = load ptr, ptr %8, align 8, !tbaa !5
  %580 = call zeroext i1 @is_shadowed(ptr noundef %578, ptr noundef %579) #12
  %581 = xor i1 %580, true
  %582 = xor i1 %581, true
  %583 = xor i1 %582, true
  %584 = xor i1 %583, true
  %585 = zext i1 %584 to i32
  %586 = sext i32 %585 to i64
  %587 = call i64 @llvm.expect.i64(i64 %586, i64 0)
  %588 = icmp ne i64 %587, 0
  br i1 %588, label %589, label %593

589:                                              ; preds = %577
  %590 = load ptr, ptr %11, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct.MDBX_txn, ptr %590, i32 0, i32 9
  %592 = load ptr, ptr %591, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %592, ptr noundef @.str.40, ptr noundef @__func__.page_retire_ex, i32 noundef 462) #11
  unreachable

593:                                              ; preds = %577
  br label %594

594:                                              ; preds = %593
  br label %595

595:                                              ; preds = %594
  br label %596

596:                                              ; preds = %595, %565
  br label %597

597:                                              ; preds = %596
  br label %598

598:                                              ; preds = %597
  br label %599

599:                                              ; preds = %598
  %600 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %601 = zext i8 %600 to i32
  %602 = and i32 %601, 1
  %603 = icmp ne i32 %602, 0
  %604 = xor i1 %603, true
  %605 = xor i1 %604, true
  %606 = zext i1 %605 to i32
  %607 = sext i32 %606 to i64
  %608 = call i64 @llvm.expect.i64(i64 %607, i64 1)
  %609 = icmp ne i64 %608, 0
  br i1 %609, label %610, label %631

610:                                              ; preds = %599
  br label %611

611:                                              ; preds = %610
  %612 = load ptr, ptr %11, align 8, !tbaa !5
  %613 = load i32, ptr %7, align 4, !tbaa !9
  %614 = call ptr @debug_dpl_find(ptr noundef %612, i32 noundef %613)
  %615 = icmp ne ptr %614, null
  %616 = xor i1 %615, true
  %617 = xor i1 %616, true
  %618 = xor i1 %617, true
  %619 = xor i1 %618, true
  %620 = zext i1 %619 to i32
  %621 = sext i32 %620 to i64
  %622 = call i64 @llvm.expect.i64(i64 %621, i64 0)
  %623 = icmp ne i64 %622, 0
  br i1 %623, label %624, label %628

624:                                              ; preds = %611
  %625 = load ptr, ptr %11, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.MDBX_txn, ptr %625, i32 0, i32 9
  %627 = load ptr, ptr %626, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %627, ptr noundef @.str.41, ptr noundef @__func__.page_retire_ex, i32 noundef 463) #11
  unreachable

628:                                              ; preds = %611
  br label %629

629:                                              ; preds = %628
  br label %630

630:                                              ; preds = %629
  br label %631

631:                                              ; preds = %630, %599
  br label %632

632:                                              ; preds = %631
  br label %633

633:                                              ; preds = %632
  br label %634

634:                                              ; preds = %633
  %635 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %636 = zext i8 %635 to i32
  %637 = and i32 %636, 1
  %638 = icmp ne i32 %637, 0
  %639 = xor i1 %638, true
  %640 = xor i1 %639, true
  %641 = zext i1 %640 to i32
  %642 = sext i32 %641 to i64
  %643 = call i64 @llvm.expect.i64(i64 %642, i64 1)
  %644 = icmp ne i64 %643, 0
  br i1 %644, label %645, label %675

645:                                              ; preds = %634
  br label %646

646:                                              ; preds = %645
  %647 = load ptr, ptr %11, align 8, !tbaa !5
  %648 = getelementptr inbounds %struct.MDBX_txn, ptr %647, i32 0, i32 17
  %649 = getelementptr inbounds %struct.anon.6, ptr %648, i32 0, i32 11
  %650 = getelementptr inbounds %struct.anon.9, ptr %649, i32 0, i32 1
  %651 = load ptr, ptr %650, align 8, !tbaa !29
  %652 = icmp ne ptr %651, null
  br i1 %652, label %653, label %659

653:                                              ; preds = %646
  %654 = load ptr, ptr %11, align 8, !tbaa !5
  %655 = load i32, ptr %7, align 4, !tbaa !9
  %656 = call i64 @spill_search(ptr noundef %654, i32 noundef %655)
  %657 = icmp ne i64 %656, 0
  %658 = xor i1 %657, true
  br label %659

659:                                              ; preds = %653, %646
  %660 = phi i1 [ true, %646 ], [ %658, %653 ]
  %661 = xor i1 %660, true
  %662 = xor i1 %661, true
  %663 = xor i1 %662, true
  %664 = zext i1 %663 to i32
  %665 = sext i32 %664 to i64
  %666 = call i64 @llvm.expect.i64(i64 %665, i64 0)
  %667 = icmp ne i64 %666, 0
  br i1 %667, label %668, label %672

668:                                              ; preds = %659
  %669 = load ptr, ptr %11, align 8, !tbaa !5
  %670 = getelementptr inbounds %struct.MDBX_txn, ptr %669, i32 0, i32 9
  %671 = load ptr, ptr %670, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %671, ptr noundef @.str.42, ptr noundef @__func__.page_retire_ex, i32 noundef 464) #11
  unreachable

672:                                              ; preds = %659
  br label %673

673:                                              ; preds = %672
  br label %674

674:                                              ; preds = %673
  br label %675

675:                                              ; preds = %674, %634
  br label %676

676:                                              ; preds = %675
  br label %677

677:                                              ; preds = %676
  br label %937

678:                                              ; preds = %492
  %679 = load ptr, ptr %11, align 8, !tbaa !5
  %680 = load ptr, ptr %8, align 8, !tbaa !5
  %681 = call zeroext i1 @is_modifable(ptr noundef %679, ptr noundef %680) #12
  br i1 %681, label %682, label %779

682:                                              ; preds = %678
  store i32 4, ptr %15, align 4, !tbaa !9
  %683 = load ptr, ptr %11, align 8, !tbaa !5
  %684 = getelementptr inbounds %struct.MDBX_txn, ptr %683, i32 0, i32 17
  %685 = getelementptr inbounds %struct.anon.6, ptr %684, i32 0, i32 7
  %686 = load ptr, ptr %685, align 8, !tbaa !29
  %687 = icmp ne ptr %686, null
  br i1 %687, label %688, label %692

688:                                              ; preds = %682
  %689 = load ptr, ptr %11, align 8, !tbaa !5
  %690 = load i32, ptr %7, align 4, !tbaa !9
  %691 = call i64 @dpl_exist(ptr noundef %689, i32 noundef %690) #12
  store i64 %691, ptr %12, align 8, !tbaa !23
  br label %692

692:                                              ; preds = %688, %682
  br label %693

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

704:                                              ; preds = %693
  br label %705

705:                                              ; preds = %704
  %706 = load ptr, ptr %11, align 8, !tbaa !5
  %707 = getelementptr inbounds %struct.MDBX_txn, ptr %706, i32 0, i32 1
  %708 = load i32, ptr %707, align 4, !tbaa !36
  %709 = and i32 %708, 524288
  %710 = icmp ne i32 %709, 0
  br i1 %710, label %716, label %711

711:                                              ; preds = %705
  %712 = load ptr, ptr %11, align 8, !tbaa !5
  %713 = load ptr, ptr %8, align 8, !tbaa !5
  %714 = call zeroext i1 @is_spilled(ptr noundef %712, ptr noundef %713) #12
  %715 = xor i1 %714, true
  br label %716

716:                                              ; preds = %711, %705
  %717 = phi i1 [ true, %705 ], [ %715, %711 ]
  %718 = xor i1 %717, true
  %719 = xor i1 %718, true
  %720 = xor i1 %719, true
  %721 = zext i1 %720 to i32
  %722 = sext i32 %721 to i64
  %723 = call i64 @llvm.expect.i64(i64 %722, i64 0)
  %724 = icmp ne i64 %723, 0
  br i1 %724, label %725, label %729

725:                                              ; preds = %716
  %726 = load ptr, ptr %11, align 8, !tbaa !5
  %727 = getelementptr inbounds %struct.MDBX_txn, ptr %726, i32 0, i32 9
  %728 = load ptr, ptr %727, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %728, ptr noundef @.str.43, ptr noundef @__func__.page_retire_ex, i32 noundef 469) #11
  unreachable

729:                                              ; preds = %716
  br label %730

730:                                              ; preds = %729
  br label %731

731:                                              ; preds = %730
  br label %732

732:                                              ; preds = %731, %693
  br label %733

733:                                              ; preds = %732
  br label %734

734:                                              ; preds = %733
  br label %735

735:                                              ; preds = %734
  %736 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %737 = zext i8 %736 to i32
  %738 = and i32 %737, 1
  %739 = icmp ne i32 %738, 0
  %740 = xor i1 %739, true
  %741 = xor i1 %740, true
  %742 = zext i1 %741 to i32
  %743 = sext i32 %742 to i64
  %744 = call i64 @llvm.expect.i64(i64 %743, i64 1)
  %745 = icmp ne i64 %744, 0
  br i1 %745, label %746, label %776

746:                                              ; preds = %735
  br label %747

747:                                              ; preds = %746
  %748 = load ptr, ptr %11, align 8, !tbaa !5
  %749 = getelementptr inbounds %struct.MDBX_txn, ptr %748, i32 0, i32 17
  %750 = getelementptr inbounds %struct.anon.6, ptr %749, i32 0, i32 11
  %751 = getelementptr inbounds %struct.anon.9, ptr %750, i32 0, i32 1
  %752 = load ptr, ptr %751, align 8, !tbaa !29
  %753 = icmp ne ptr %752, null
  br i1 %753, label %754, label %760

754:                                              ; preds = %747
  %755 = load ptr, ptr %11, align 8, !tbaa !5
  %756 = load i32, ptr %7, align 4, !tbaa !9
  %757 = call i64 @spill_search(ptr noundef %755, i32 noundef %756)
  %758 = icmp ne i64 %757, 0
  %759 = xor i1 %758, true
  br label %760

760:                                              ; preds = %754, %747
  %761 = phi i1 [ true, %747 ], [ %759, %754 ]
  %762 = xor i1 %761, true
  %763 = xor i1 %762, true
  %764 = xor i1 %763, true
  %765 = zext i1 %764 to i32
  %766 = sext i32 %765 to i64
  %767 = call i64 @llvm.expect.i64(i64 %766, i64 0)
  %768 = icmp ne i64 %767, 0
  br i1 %768, label %769, label %773

769:                                              ; preds = %760
  %770 = load ptr, ptr %11, align 8, !tbaa !5
  %771 = getelementptr inbounds %struct.MDBX_txn, ptr %770, i32 0, i32 9
  %772 = load ptr, ptr %771, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %772, ptr noundef @.str.42, ptr noundef @__func__.page_retire_ex, i32 noundef 470) #11
  unreachable

773:                                              ; preds = %760
  br label %774

774:                                              ; preds = %773
  br label %775

775:                                              ; preds = %774
  br label %776

776:                                              ; preds = %775, %735
  br label %777

777:                                              ; preds = %776
  br label %778

778:                                              ; preds = %777
  br label %936

779:                                              ; preds = %678
  %780 = load ptr, ptr %11, align 8, !tbaa !5
  %781 = load ptr, ptr %8, align 8, !tbaa !5
  %782 = call zeroext i1 @is_shadowed(ptr noundef %780, ptr noundef %781) #12
  br i1 %782, label %783, label %863

783:                                              ; preds = %779
  store i32 3, ptr %15, align 4, !tbaa !9
  br label %784

784:                                              ; preds = %783
  %785 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %786 = zext i8 %785 to i32
  %787 = and i32 %786, 1
  %788 = icmp ne i32 %787, 0
  %789 = xor i1 %788, true
  %790 = xor i1 %789, true
  %791 = zext i1 %790 to i32
  %792 = sext i32 %791 to i64
  %793 = call i64 @llvm.expect.i64(i64 %792, i64 1)
  %794 = icmp ne i64 %793, 0
  br i1 %794, label %795, label %825

795:                                              ; preds = %784
  br label %796

796:                                              ; preds = %795
  %797 = load ptr, ptr %11, align 8, !tbaa !5
  %798 = getelementptr inbounds %struct.MDBX_txn, ptr %797, i32 0, i32 17
  %799 = getelementptr inbounds %struct.anon.6, ptr %798, i32 0, i32 11
  %800 = getelementptr inbounds %struct.anon.9, ptr %799, i32 0, i32 1
  %801 = load ptr, ptr %800, align 8, !tbaa !29
  %802 = icmp ne ptr %801, null
  br i1 %802, label %803, label %809

803:                                              ; preds = %796
  %804 = load ptr, ptr %11, align 8, !tbaa !5
  %805 = load i32, ptr %7, align 4, !tbaa !9
  %806 = call i64 @spill_search(ptr noundef %804, i32 noundef %805)
  %807 = icmp ne i64 %806, 0
  %808 = xor i1 %807, true
  br label %809

809:                                              ; preds = %803, %796
  %810 = phi i1 [ true, %796 ], [ %808, %803 ]
  %811 = xor i1 %810, true
  %812 = xor i1 %811, true
  %813 = xor i1 %812, true
  %814 = zext i1 %813 to i32
  %815 = sext i32 %814 to i64
  %816 = call i64 @llvm.expect.i64(i64 %815, i64 0)
  %817 = icmp ne i64 %816, 0
  br i1 %817, label %818, label %822

818:                                              ; preds = %809
  %819 = load ptr, ptr %11, align 8, !tbaa !5
  %820 = getelementptr inbounds %struct.MDBX_txn, ptr %819, i32 0, i32 9
  %821 = load ptr, ptr %820, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %821, ptr noundef @.str.42, ptr noundef @__func__.page_retire_ex, i32 noundef 473) #11
  unreachable

822:                                              ; preds = %809
  br label %823

823:                                              ; preds = %822
  br label %824

824:                                              ; preds = %823
  br label %825

825:                                              ; preds = %824, %784
  br label %826

826:                                              ; preds = %825
  br label %827

827:                                              ; preds = %826
  br label %828

828:                                              ; preds = %827
  %829 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %830 = zext i8 %829 to i32
  %831 = and i32 %830, 1
  %832 = icmp ne i32 %831, 0
  %833 = xor i1 %832, true
  %834 = xor i1 %833, true
  %835 = zext i1 %834 to i32
  %836 = sext i32 %835 to i64
  %837 = call i64 @llvm.expect.i64(i64 %836, i64 1)
  %838 = icmp ne i64 %837, 0
  br i1 %838, label %839, label %860

839:                                              ; preds = %828
  br label %840

840:                                              ; preds = %839
  %841 = load ptr, ptr %11, align 8, !tbaa !5
  %842 = load i32, ptr %7, align 4, !tbaa !9
  %843 = call ptr @debug_dpl_find(ptr noundef %841, i32 noundef %842)
  %844 = icmp ne ptr %843, null
  %845 = xor i1 %844, true
  %846 = xor i1 %845, true
  %847 = xor i1 %846, true
  %848 = xor i1 %847, true
  %849 = zext i1 %848 to i32
  %850 = sext i32 %849 to i64
  %851 = call i64 @llvm.expect.i64(i64 %850, i64 0)
  %852 = icmp ne i64 %851, 0
  br i1 %852, label %853, label %857

853:                                              ; preds = %840
  %854 = load ptr, ptr %11, align 8, !tbaa !5
  %855 = getelementptr inbounds %struct.MDBX_txn, ptr %854, i32 0, i32 9
  %856 = load ptr, ptr %855, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %856, ptr noundef @.str.41, ptr noundef @__func__.page_retire_ex, i32 noundef 474) #11
  unreachable

857:                                              ; preds = %840
  br label %858

858:                                              ; preds = %857
  br label %859

859:                                              ; preds = %858
  br label %860

860:                                              ; preds = %859, %828
  br label %861

861:                                              ; preds = %860
  br label %862

862:                                              ; preds = %861
  br label %935

863:                                              ; preds = %779
  br label %864

864:                                              ; preds = %863
  %865 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %866 = zext i8 %865 to i32
  %867 = and i32 %866, 1
  %868 = icmp ne i32 %867, 0
  %869 = xor i1 %868, true
  %870 = xor i1 %869, true
  %871 = zext i1 %870 to i32
  %872 = sext i32 %871 to i64
  %873 = call i64 @llvm.expect.i64(i64 %872, i64 1)
  %874 = icmp ne i64 %873, 0
  br i1 %874, label %875, label %894

875:                                              ; preds = %864
  br label %876

876:                                              ; preds = %875
  %877 = load ptr, ptr %11, align 8, !tbaa !5
  %878 = load ptr, ptr %8, align 8, !tbaa !5
  %879 = call zeroext i1 @is_spilled(ptr noundef %877, ptr noundef %878) #12
  %880 = xor i1 %879, true
  %881 = xor i1 %880, true
  %882 = xor i1 %881, true
  %883 = zext i1 %882 to i32
  %884 = sext i32 %883 to i64
  %885 = call i64 @llvm.expect.i64(i64 %884, i64 0)
  %886 = icmp ne i64 %885, 0
  br i1 %886, label %887, label %891

887:                                              ; preds = %876
  %888 = load ptr, ptr %11, align 8, !tbaa !5
  %889 = getelementptr inbounds %struct.MDBX_txn, ptr %888, i32 0, i32 9
  %890 = load ptr, ptr %889, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %890, ptr noundef @.str.11, ptr noundef @__func__.page_retire_ex, i32 noundef 476) #11
  unreachable

891:                                              ; preds = %876
  br label %892

892:                                              ; preds = %891
  br label %893

893:                                              ; preds = %892
  br label %894

894:                                              ; preds = %893, %864
  br label %895

895:                                              ; preds = %894
  br label %896

896:                                              ; preds = %895
  store i32 2, ptr %15, align 4, !tbaa !9
  %897 = load ptr, ptr %11, align 8, !tbaa !5
  %898 = load i32, ptr %7, align 4, !tbaa !9
  %899 = call i64 @spill_search(ptr noundef %897, i32 noundef %898)
  store i64 %899, ptr %13, align 8, !tbaa !23
  br label %900

900:                                              ; preds = %896
  %901 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %902 = zext i8 %901 to i32
  %903 = and i32 %902, 1
  %904 = icmp ne i32 %903, 0
  %905 = xor i1 %904, true
  %906 = xor i1 %905, true
  %907 = zext i1 %906 to i32
  %908 = sext i32 %907 to i64
  %909 = call i64 @llvm.expect.i64(i64 %908, i64 1)
  %910 = icmp ne i64 %909, 0
  br i1 %910, label %911, label %932

911:                                              ; preds = %900
  br label %912

912:                                              ; preds = %911
  %913 = load ptr, ptr %11, align 8, !tbaa !5
  %914 = load i32, ptr %7, align 4, !tbaa !9
  %915 = call ptr @debug_dpl_find(ptr noundef %913, i32 noundef %914)
  %916 = icmp ne ptr %915, null
  %917 = xor i1 %916, true
  %918 = xor i1 %917, true
  %919 = xor i1 %918, true
  %920 = xor i1 %919, true
  %921 = zext i1 %920 to i32
  %922 = sext i32 %921 to i64
  %923 = call i64 @llvm.expect.i64(i64 %922, i64 0)
  %924 = icmp ne i64 %923, 0
  br i1 %924, label %925, label %929

925:                                              ; preds = %912
  %926 = load ptr, ptr %11, align 8, !tbaa !5
  %927 = getelementptr inbounds %struct.MDBX_txn, ptr %926, i32 0, i32 9
  %928 = load ptr, ptr %927, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %928, ptr noundef @.str.41, ptr noundef @__func__.page_retire_ex, i32 noundef 479) #11
  unreachable

929:                                              ; preds = %912
  br label %930

930:                                              ; preds = %929
  br label %931

931:                                              ; preds = %930
  br label %932

932:                                              ; preds = %931, %900
  br label %933

933:                                              ; preds = %932
  br label %934

934:                                              ; preds = %933
  br label %935

935:                                              ; preds = %934, %862
  br label %936

936:                                              ; preds = %935, %778
  br label %937

937:                                              ; preds = %936, %677
  br label %938

938:                                              ; preds = %937, %416, %414, %388, %382, %325
  %939 = load i32, ptr %9, align 4, !tbaa !9
  %940 = and i32 %939, 4
  %941 = icmp eq i32 %940, 0
  %942 = xor i1 %941, true
  %943 = xor i1 %942, true
  %944 = zext i1 %943 to i32
  %945 = sext i32 %944 to i64
  %946 = call i64 @llvm.expect.i64(i64 %945, i64 1)
  %947 = icmp ne i64 %946, 0
  br i1 %947, label %948, label %1212

948:                                              ; preds = %938
  call void @llvm.lifetime.start.p0(i64 1, ptr %22) #10
  %949 = load i32, ptr %9, align 4, !tbaa !9
  %950 = and i32 %949, 1
  %951 = icmp ne i32 %950, 0
  %952 = zext i1 %951 to i8
  store i8 %952, ptr %22, align 1, !tbaa !37
  br label %953

953:                                              ; preds = %948
  %954 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %955 = zext i8 %954 to i32
  %956 = and i32 %955, 1
  %957 = icmp ne i32 %956, 0
  %958 = xor i1 %957, true
  %959 = xor i1 %958, true
  %960 = zext i1 %959 to i32
  %961 = sext i32 %960 to i64
  %962 = call i64 @llvm.expect.i64(i64 %961, i64 1)
  %963 = icmp ne i64 %962, 0
  br i1 %963, label %964, label %990

964:                                              ; preds = %953
  br label %965

965:                                              ; preds = %964
  %966 = load i32, ptr %9, align 4, !tbaa !9
  %967 = and i32 %966, 2
  %968 = icmp eq i32 %967, 0
  %969 = zext i1 %968 to i32
  %970 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %971 = trunc i8 %970 to i1
  %972 = zext i1 %971 to i32
  %973 = icmp eq i32 %969, %972
  %974 = xor i1 %973, true
  %975 = xor i1 %974, true
  %976 = xor i1 %975, true
  %977 = zext i1 %976 to i32
  %978 = sext i32 %977 to i64
  %979 = call i64 @llvm.expect.i64(i64 %978, i64 0)
  %980 = icmp ne i64 %979, 0
  br i1 %980, label %981, label %987

981:                                              ; preds = %965
  %982 = load ptr, ptr %6, align 8, !tbaa !5
  %983 = getelementptr inbounds %struct.MDBX_cursor, ptr %982, i32 0, i32 5
  %984 = load ptr, ptr %983, align 8, !tbaa !11
  %985 = getelementptr inbounds %struct.MDBX_txn, ptr %984, i32 0, i32 9
  %986 = load ptr, ptr %985, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %986, ptr noundef @.str.44, ptr noundef @__func__.page_retire_ex, i32 noundef 486) #11
  unreachable

987:                                              ; preds = %965
  br label %988

988:                                              ; preds = %987
  br label %989

989:                                              ; preds = %988
  br label %990

990:                                              ; preds = %989, %953
  br label %991

991:                                              ; preds = %990
  br label %992

992:                                              ; preds = %991
  %993 = load ptr, ptr %6, align 8, !tbaa !5
  %994 = getelementptr inbounds %struct.MDBX_cursor, ptr %993, i32 0, i32 1
  %995 = getelementptr inbounds %struct.anon.1, ptr %994, i32 0, i32 0
  %996 = load i8, ptr %995, align 4, !tbaa !29
  %997 = sext i8 %996 to i32
  %998 = and i32 %997, 1
  %999 = icmp ne i32 %998, 0
  %1000 = xor i1 %999, true
  %1001 = xor i1 %1000, true
  %1002 = zext i1 %1001 to i32
  %1003 = sext i32 %1002 to i64
  %1004 = call i64 @llvm.expect.i64(i64 %1003, i64 0)
  %1005 = icmp ne i64 %1004, 0
  br i1 %1005, label %1006, label %1106

1006:                                             ; preds = %992
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #10
  %1007 = load ptr, ptr %6, align 8, !tbaa !5
  %1008 = call ptr @outer_tree(ptr noundef %1007)
  store ptr %1008, ptr %23, align 8, !tbaa !5
  br label %1009

1009:                                             ; preds = %1006
  %1010 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1011 = zext i8 %1010 to i32
  %1012 = and i32 %1011, 1
  %1013 = icmp ne i32 %1012, 0
  %1014 = xor i1 %1013, true
  %1015 = xor i1 %1014, true
  %1016 = zext i1 %1015 to i32
  %1017 = sext i32 %1016 to i64
  %1018 = call i64 @llvm.expect.i64(i64 %1017, i64 1)
  %1019 = icmp ne i64 %1018, 0
  br i1 %1019, label %1020, label %1047

1020:                                             ; preds = %1009
  br label %1021

1021:                                             ; preds = %1020
  %1022 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1023 = trunc i8 %1022 to i1
  br i1 %1023, label %1024, label %1029

1024:                                             ; preds = %1021
  %1025 = load ptr, ptr %23, align 8, !tbaa !5
  %1026 = getelementptr inbounds %struct.tree, ptr %1025, i32 0, i32 4
  %1027 = load i32, ptr %1026, align 4, !tbaa !40
  %1028 = icmp ugt i32 %1027, 0
  br label %1029

1029:                                             ; preds = %1024, %1021
  %1030 = phi i1 [ true, %1021 ], [ %1028, %1024 ]
  %1031 = xor i1 %1030, true
  %1032 = xor i1 %1031, true
  %1033 = xor i1 %1032, true
  %1034 = zext i1 %1033 to i32
  %1035 = sext i32 %1034 to i64
  %1036 = call i64 @llvm.expect.i64(i64 %1035, i64 0)
  %1037 = icmp ne i64 %1036, 0
  br i1 %1037, label %1038, label %1044

1038:                                             ; preds = %1029
  %1039 = load ptr, ptr %6, align 8, !tbaa !5
  %1040 = getelementptr inbounds %struct.MDBX_cursor, ptr %1039, i32 0, i32 5
  %1041 = load ptr, ptr %1040, align 8, !tbaa !11
  %1042 = getelementptr inbounds %struct.MDBX_txn, ptr %1041, i32 0, i32 9
  %1043 = load ptr, ptr %1042, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1043, ptr noundef @.str.45, ptr noundef @__func__.page_retire_ex, i32 noundef 489) #11
  unreachable

1044:                                             ; preds = %1029
  br label %1045

1045:                                             ; preds = %1044
  br label %1046

1046:                                             ; preds = %1045
  br label %1047

1047:                                             ; preds = %1046, %1009
  br label %1048

1048:                                             ; preds = %1047
  br label %1049

1049:                                             ; preds = %1048
  %1050 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1051 = trunc i8 %1050 to i1
  %1052 = zext i1 %1051 to i32
  %1053 = load ptr, ptr %23, align 8, !tbaa !5
  %1054 = getelementptr inbounds %struct.tree, ptr %1053, i32 0, i32 4
  %1055 = load i32, ptr %1054, align 4, !tbaa !40
  %1056 = sub i32 %1055, %1052
  store i32 %1056, ptr %1054, align 4, !tbaa !40
  br label %1057

1057:                                             ; preds = %1049
  %1058 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1059 = zext i8 %1058 to i32
  %1060 = and i32 %1059, 1
  %1061 = icmp ne i32 %1060, 0
  %1062 = xor i1 %1061, true
  %1063 = xor i1 %1062, true
  %1064 = zext i1 %1063 to i32
  %1065 = sext i32 %1064 to i64
  %1066 = call i64 @llvm.expect.i64(i64 %1065, i64 1)
  %1067 = icmp ne i64 %1066, 0
  br i1 %1067, label %1068, label %1095

1068:                                             ; preds = %1057
  br label %1069

1069:                                             ; preds = %1068
  %1070 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1071 = trunc i8 %1070 to i1
  br i1 %1071, label %1077, label %1072

1072:                                             ; preds = %1069
  %1073 = load ptr, ptr %23, align 8, !tbaa !5
  %1074 = getelementptr inbounds %struct.tree, ptr %1073, i32 0, i32 5
  %1075 = load i32, ptr %1074, align 4, !tbaa !42
  %1076 = icmp ugt i32 %1075, 0
  br label %1077

1077:                                             ; preds = %1072, %1069
  %1078 = phi i1 [ true, %1069 ], [ %1076, %1072 ]
  %1079 = xor i1 %1078, true
  %1080 = xor i1 %1079, true
  %1081 = xor i1 %1080, true
  %1082 = zext i1 %1081 to i32
  %1083 = sext i32 %1082 to i64
  %1084 = call i64 @llvm.expect.i64(i64 %1083, i64 0)
  %1085 = icmp ne i64 %1084, 0
  br i1 %1085, label %1086, label %1092

1086:                                             ; preds = %1077
  %1087 = load ptr, ptr %6, align 8, !tbaa !5
  %1088 = getelementptr inbounds %struct.MDBX_cursor, ptr %1087, i32 0, i32 5
  %1089 = load ptr, ptr %1088, align 8, !tbaa !11
  %1090 = getelementptr inbounds %struct.MDBX_txn, ptr %1089, i32 0, i32 9
  %1091 = load ptr, ptr %1090, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1091, ptr noundef @.str.46, ptr noundef @__func__.page_retire_ex, i32 noundef 491) #11
  unreachable

1092:                                             ; preds = %1077
  br label %1093

1093:                                             ; preds = %1092
  br label %1094

1094:                                             ; preds = %1093
  br label %1095

1095:                                             ; preds = %1094, %1057
  br label %1096

1096:                                             ; preds = %1095
  br label %1097

1097:                                             ; preds = %1096
  %1098 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1099 = trunc i8 %1098 to i1
  %1100 = zext i1 %1099 to i32
  %1101 = sub nsw i32 1, %1100
  %1102 = load ptr, ptr %23, align 8, !tbaa !5
  %1103 = getelementptr inbounds %struct.tree, ptr %1102, i32 0, i32 5
  %1104 = load i32, ptr %1103, align 4, !tbaa !42
  %1105 = sub i32 %1104, %1101
  store i32 %1105, ptr %1103, align 4, !tbaa !42
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #10
  br label %1106

1106:                                             ; preds = %1097, %992
  br label %1107

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

1118:                                             ; preds = %1107
  br label %1119

1119:                                             ; preds = %1118
  %1120 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1121 = trunc i8 %1120 to i1
  br i1 %1121, label %1122, label %1129

1122:                                             ; preds = %1119
  %1123 = load ptr, ptr %6, align 8, !tbaa !5
  %1124 = getelementptr inbounds %struct.MDBX_cursor, ptr %1123, i32 0, i32 6
  %1125 = load ptr, ptr %1124, align 8, !tbaa !43
  %1126 = getelementptr inbounds %struct.tree, ptr %1125, i32 0, i32 4
  %1127 = load i32, ptr %1126, align 4, !tbaa !40
  %1128 = icmp ugt i32 %1127, 0
  br label %1129

1129:                                             ; preds = %1122, %1119
  %1130 = phi i1 [ true, %1119 ], [ %1128, %1122 ]
  %1131 = xor i1 %1130, true
  %1132 = xor i1 %1131, true
  %1133 = xor i1 %1132, true
  %1134 = zext i1 %1133 to i32
  %1135 = sext i32 %1134 to i64
  %1136 = call i64 @llvm.expect.i64(i64 %1135, i64 0)
  %1137 = icmp ne i64 %1136, 0
  br i1 %1137, label %1138, label %1144

1138:                                             ; preds = %1129
  %1139 = load ptr, ptr %6, align 8, !tbaa !5
  %1140 = getelementptr inbounds %struct.MDBX_cursor, ptr %1139, i32 0, i32 5
  %1141 = load ptr, ptr %1140, align 8, !tbaa !11
  %1142 = getelementptr inbounds %struct.MDBX_txn, ptr %1141, i32 0, i32 9
  %1143 = load ptr, ptr %1142, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1143, ptr noundef @.str.47, ptr noundef @__func__.page_retire_ex, i32 noundef 494) #11
  unreachable

1144:                                             ; preds = %1129
  br label %1145

1145:                                             ; preds = %1144
  br label %1146

1146:                                             ; preds = %1145
  br label %1147

1147:                                             ; preds = %1146, %1107
  br label %1148

1148:                                             ; preds = %1147
  br label %1149

1149:                                             ; preds = %1148
  %1150 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1151 = trunc i8 %1150 to i1
  %1152 = zext i1 %1151 to i32
  %1153 = load ptr, ptr %6, align 8, !tbaa !5
  %1154 = getelementptr inbounds %struct.MDBX_cursor, ptr %1153, i32 0, i32 6
  %1155 = load ptr, ptr %1154, align 8, !tbaa !43
  %1156 = getelementptr inbounds %struct.tree, ptr %1155, i32 0, i32 4
  %1157 = load i32, ptr %1156, align 4, !tbaa !40
  %1158 = sub i32 %1157, %1152
  store i32 %1158, ptr %1156, align 4, !tbaa !40
  br label %1159

1159:                                             ; preds = %1149
  %1160 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1161 = zext i8 %1160 to i32
  %1162 = and i32 %1161, 1
  %1163 = icmp ne i32 %1162, 0
  %1164 = xor i1 %1163, true
  %1165 = xor i1 %1164, true
  %1166 = zext i1 %1165 to i32
  %1167 = sext i32 %1166 to i64
  %1168 = call i64 @llvm.expect.i64(i64 %1167, i64 1)
  %1169 = icmp ne i64 %1168, 0
  br i1 %1169, label %1170, label %1199

1170:                                             ; preds = %1159
  br label %1171

1171:                                             ; preds = %1170
  %1172 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1173 = trunc i8 %1172 to i1
  br i1 %1173, label %1181, label %1174

1174:                                             ; preds = %1171
  %1175 = load ptr, ptr %6, align 8, !tbaa !5
  %1176 = getelementptr inbounds %struct.MDBX_cursor, ptr %1175, i32 0, i32 6
  %1177 = load ptr, ptr %1176, align 8, !tbaa !43
  %1178 = getelementptr inbounds %struct.tree, ptr %1177, i32 0, i32 5
  %1179 = load i32, ptr %1178, align 4, !tbaa !42
  %1180 = icmp ugt i32 %1179, 0
  br label %1181

1181:                                             ; preds = %1174, %1171
  %1182 = phi i1 [ true, %1171 ], [ %1180, %1174 ]
  %1183 = xor i1 %1182, true
  %1184 = xor i1 %1183, true
  %1185 = xor i1 %1184, true
  %1186 = zext i1 %1185 to i32
  %1187 = sext i32 %1186 to i64
  %1188 = call i64 @llvm.expect.i64(i64 %1187, i64 0)
  %1189 = icmp ne i64 %1188, 0
  br i1 %1189, label %1190, label %1196

1190:                                             ; preds = %1181
  %1191 = load ptr, ptr %6, align 8, !tbaa !5
  %1192 = getelementptr inbounds %struct.MDBX_cursor, ptr %1191, i32 0, i32 5
  %1193 = load ptr, ptr %1192, align 8, !tbaa !11
  %1194 = getelementptr inbounds %struct.MDBX_txn, ptr %1193, i32 0, i32 9
  %1195 = load ptr, ptr %1194, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1195, ptr noundef @.str.48, ptr noundef @__func__.page_retire_ex, i32 noundef 496) #11
  unreachable

1196:                                             ; preds = %1181
  br label %1197

1197:                                             ; preds = %1196
  br label %1198

1198:                                             ; preds = %1197
  br label %1199

1199:                                             ; preds = %1198, %1159
  br label %1200

1200:                                             ; preds = %1199
  br label %1201

1201:                                             ; preds = %1200
  %1202 = load i8, ptr %22, align 1, !tbaa !37, !range !38, !noundef !39
  %1203 = trunc i8 %1202 to i1
  %1204 = zext i1 %1203 to i32
  %1205 = sub nsw i32 1, %1204
  %1206 = load ptr, ptr %6, align 8, !tbaa !5
  %1207 = getelementptr inbounds %struct.MDBX_cursor, ptr %1206, i32 0, i32 6
  %1208 = load ptr, ptr %1207, align 8, !tbaa !43
  %1209 = getelementptr inbounds %struct.tree, ptr %1208, i32 0, i32 5
  %1210 = load i32, ptr %1209, align 4, !tbaa !42
  %1211 = sub i32 %1210, %1205
  store i32 %1211, ptr %1209, align 4, !tbaa !42
  call void @llvm.lifetime.end.p0(i64 1, ptr %22) #10
  br label %1265

1212:                                             ; preds = %938
  %1213 = load ptr, ptr %8, align 8, !tbaa !5
  %1214 = getelementptr inbounds %struct.page, ptr %1213, i32 0, i32 3
  %1215 = load i32, ptr %1214, align 1, !tbaa !29
  %1216 = zext i32 %1215 to i64
  store i64 %1216, ptr %14, align 8, !tbaa !23
  br label %1217

1217:                                             ; preds = %1212
  %1218 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1219 = zext i8 %1218 to i32
  %1220 = and i32 %1219, 1
  %1221 = icmp ne i32 %1220, 0
  %1222 = xor i1 %1221, true
  %1223 = xor i1 %1222, true
  %1224 = zext i1 %1223 to i32
  %1225 = sext i32 %1224 to i64
  %1226 = call i64 @llvm.expect.i64(i64 %1225, i64 1)
  %1227 = icmp ne i64 %1226, 0
  br i1 %1227, label %1228, label %1254

1228:                                             ; preds = %1217
  br label %1229

1229:                                             ; preds = %1228
  %1230 = load ptr, ptr %6, align 8, !tbaa !5
  %1231 = getelementptr inbounds %struct.MDBX_cursor, ptr %1230, i32 0, i32 6
  %1232 = load ptr, ptr %1231, align 8, !tbaa !43
  %1233 = getelementptr inbounds %struct.tree, ptr %1232, i32 0, i32 6
  %1234 = load i32, ptr %1233, align 4, !tbaa !44
  %1235 = zext i32 %1234 to i64
  %1236 = load i64, ptr %14, align 8, !tbaa !23
  %1237 = icmp uge i64 %1235, %1236
  %1238 = xor i1 %1237, true
  %1239 = xor i1 %1238, true
  %1240 = xor i1 %1239, true
  %1241 = zext i1 %1240 to i32
  %1242 = sext i32 %1241 to i64
  %1243 = call i64 @llvm.expect.i64(i64 %1242, i64 0)
  %1244 = icmp ne i64 %1243, 0
  br i1 %1244, label %1245, label %1251

1245:                                             ; preds = %1229
  %1246 = load ptr, ptr %6, align 8, !tbaa !5
  %1247 = getelementptr inbounds %struct.MDBX_cursor, ptr %1246, i32 0, i32 5
  %1248 = load ptr, ptr %1247, align 8, !tbaa !11
  %1249 = getelementptr inbounds %struct.MDBX_txn, ptr %1248, i32 0, i32 9
  %1250 = load ptr, ptr %1249, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1250, ptr noundef @.str.49, ptr noundef @__func__.page_retire_ex, i32 noundef 500) #11
  unreachable

1251:                                             ; preds = %1229
  br label %1252

1252:                                             ; preds = %1251
  br label %1253

1253:                                             ; preds = %1252
  br label %1254

1254:                                             ; preds = %1253, %1217
  br label %1255

1255:                                             ; preds = %1254
  br label %1256

1256:                                             ; preds = %1255
  %1257 = load i64, ptr %14, align 8, !tbaa !23
  %1258 = trunc i64 %1257 to i32
  %1259 = load ptr, ptr %6, align 8, !tbaa !5
  %1260 = getelementptr inbounds %struct.MDBX_cursor, ptr %1259, i32 0, i32 6
  %1261 = load ptr, ptr %1260, align 8, !tbaa !43
  %1262 = getelementptr inbounds %struct.tree, ptr %1261, i32 0, i32 6
  %1263 = load i32, ptr %1262, align 4, !tbaa !44
  %1264 = sub i32 %1263, %1258
  store i32 %1264, ptr %1262, align 4, !tbaa !44
  br label %1265

1265:                                             ; preds = %1256, %1201
  %1266 = load i32, ptr %15, align 4, !tbaa !9
  %1267 = icmp eq i32 %1266, 1
  br i1 %1267, label %1268, label %1325

1268:                                             ; preds = %1265
  br label %1269

1269:                                             ; preds = %2055, %1936, %1268
  br label %1270

1270:                                             ; preds = %1269
  %1271 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !45
  %1272 = zext i8 %1271 to i32
  %1273 = icmp sle i32 5, %1272
  %1274 = xor i1 %1273, true
  %1275 = xor i1 %1274, true
  %1276 = zext i1 %1275 to i32
  %1277 = sext i32 %1276 to i64
  %1278 = call i64 @llvm.expect.i64(i64 %1277, i64 0)
  %1279 = icmp ne i64 %1278, 0
  br i1 %1279, label %1280, label %1283

1280:                                             ; preds = %1270
  %1281 = load i64, ptr %14, align 8, !tbaa !23
  %1282 = load i32, ptr %7, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.page_retire_ex, i32 noundef 506, ptr noundef @.str.50, i64 noundef %1281, i32 noundef %1282)
  br label %1283

1283:                                             ; preds = %1280, %1270
  br label %1284

1284:                                             ; preds = %1283
  br label %1285

1285:                                             ; preds = %1284
  %1286 = load ptr, ptr %11, align 8, !tbaa !5
  %1287 = getelementptr inbounds %struct.MDBX_txn, ptr %1286, i32 0, i32 17
  %1288 = getelementptr inbounds %struct.anon.6, ptr %1287, i32 0, i32 8
  %1289 = load i32, ptr %7, align 4, !tbaa !9
  %1290 = load i64, ptr %14, align 8, !tbaa !23
  %1291 = call i32 @pnl_append_span(ptr noundef %1288, i32 noundef %1289, i64 noundef %1290)
  store i32 %1291, ptr %10, align 4, !tbaa !9
  br label %1292

1292:                                             ; preds = %1285
  %1293 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1294 = zext i8 %1293 to i32
  %1295 = and i32 %1294, 1
  %1296 = icmp ne i32 %1295, 0
  %1297 = xor i1 %1296, true
  %1298 = xor i1 %1297, true
  %1299 = zext i1 %1298 to i32
  %1300 = sext i32 %1299 to i64
  %1301 = call i64 @llvm.expect.i64(i64 %1300, i64 1)
  %1302 = icmp ne i64 %1301, 0
  br i1 %1302, label %1303, label %1321

1303:                                             ; preds = %1292
  br label %1304

1304:                                             ; preds = %1303
  %1305 = load ptr, ptr %11, align 8, !tbaa !5
  %1306 = call zeroext i1 @dpl_check(ptr noundef %1305)
  %1307 = xor i1 %1306, true
  %1308 = xor i1 %1307, true
  %1309 = xor i1 %1308, true
  %1310 = zext i1 %1309 to i32
  %1311 = sext i32 %1310 to i64
  %1312 = call i64 @llvm.expect.i64(i64 %1311, i64 0)
  %1313 = icmp ne i64 %1312, 0
  br i1 %1313, label %1314, label %1318

1314:                                             ; preds = %1304
  %1315 = load ptr, ptr %11, align 8, !tbaa !5
  %1316 = getelementptr inbounds %struct.MDBX_txn, ptr %1315, i32 0, i32 9
  %1317 = load ptr, ptr %1316, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1317, ptr noundef @.str.51, ptr noundef @__func__.page_retire_ex, i32 noundef 508) #11
  unreachable

1318:                                             ; preds = %1304
  br label %1319

1319:                                             ; preds = %1318
  br label %1320

1320:                                             ; preds = %1319
  br label %1321

1321:                                             ; preds = %1320, %1292
  br label %1322

1322:                                             ; preds = %1321
  br label %1323

1323:                                             ; preds = %1322
  %1324 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1324, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %2056

1325:                                             ; preds = %1265
  %1326 = load i32, ptr %7, align 4, !tbaa !9
  %1327 = zext i32 %1326 to i64
  %1328 = load i64, ptr %14, align 8, !tbaa !23
  %1329 = add i64 %1327, %1328
  %1330 = load ptr, ptr %11, align 8, !tbaa !5
  %1331 = getelementptr inbounds %struct.MDBX_txn, ptr %1330, i32 0, i32 6
  %1332 = getelementptr inbounds %struct.geo, ptr %1331, i32 0, i32 5
  %1333 = load i32, ptr %1332, align 8, !tbaa !29
  %1334 = zext i32 %1333 to i64
  %1335 = icmp eq i64 %1329, %1334
  %1336 = xor i1 %1335, true
  %1337 = xor i1 %1336, true
  %1338 = zext i1 %1337 to i32
  %1339 = sext i32 %1338 to i64
  %1340 = call i64 @llvm.expect.i64(i64 %1339, i64 0)
  %1341 = icmp ne i64 %1340, 0
  br i1 %1341, label %1342, label %1590

1342:                                             ; preds = %1325
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #10
  store ptr null, ptr %24, align 8, !tbaa !5
  %1343 = load i32, ptr %15, align 4, !tbaa !9
  %1344 = icmp eq i32 %1343, 4
  br i1 %1344, label %1345, label %1350

1345:                                             ; preds = %1342
  store ptr @.str.52, ptr %24, align 8, !tbaa !5
  %1346 = load ptr, ptr %11, align 8, !tbaa !5
  %1347 = load i64, ptr %12, align 8, !tbaa !23
  %1348 = load ptr, ptr %8, align 8, !tbaa !5
  %1349 = load i64, ptr %14, align 8, !tbaa !23
  call void @page_wash(ptr noundef %1346, i64 noundef %1347, ptr noundef %1348, i64 noundef %1349)
  br label %1566

1350:                                             ; preds = %1342
  %1351 = load i64, ptr %13, align 8, !tbaa !23
  %1352 = icmp ne i64 %1351, 0
  br i1 %1352, label %1353, label %1389

1353:                                             ; preds = %1350
  store ptr @.str.53, ptr %24, align 8, !tbaa !5
  br label %1354

1354:                                             ; preds = %1353
  %1355 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1356 = zext i8 %1355 to i32
  %1357 = and i32 %1356, 1
  %1358 = icmp ne i32 %1357, 0
  %1359 = xor i1 %1358, true
  %1360 = xor i1 %1359, true
  %1361 = zext i1 %1360 to i32
  %1362 = sext i32 %1361 to i64
  %1363 = call i64 @llvm.expect.i64(i64 %1362, i64 1)
  %1364 = icmp ne i64 %1363, 0
  br i1 %1364, label %1365, label %1383

1365:                                             ; preds = %1354
  br label %1366

1366:                                             ; preds = %1365
  %1367 = load i32, ptr %15, align 4, !tbaa !9
  %1368 = icmp eq i32 %1367, 2
  %1369 = xor i1 %1368, true
  %1370 = xor i1 %1369, true
  %1371 = xor i1 %1370, true
  %1372 = zext i1 %1371 to i32
  %1373 = sext i32 %1372 to i64
  %1374 = call i64 @llvm.expect.i64(i64 %1373, i64 0)
  %1375 = icmp ne i64 %1374, 0
  br i1 %1375, label %1376, label %1380

1376:                                             ; preds = %1366
  %1377 = load ptr, ptr %11, align 8, !tbaa !5
  %1378 = getelementptr inbounds %struct.MDBX_txn, ptr %1377, i32 0, i32 9
  %1379 = load ptr, ptr %1378, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1379, ptr noundef @.str.54, ptr noundef @__func__.page_retire_ex, i32 noundef 529) #11
  unreachable

1380:                                             ; preds = %1366
  br label %1381

1381:                                             ; preds = %1380
  br label %1382

1382:                                             ; preds = %1381
  br label %1383

1383:                                             ; preds = %1382, %1354
  br label %1384

1384:                                             ; preds = %1383
  br label %1385

1385:                                             ; preds = %1384
  %1386 = load ptr, ptr %11, align 8, !tbaa !5
  %1387 = load i64, ptr %13, align 8, !tbaa !23
  %1388 = load i64, ptr %14, align 8, !tbaa !23
  call void @spill_remove(ptr noundef %1386, i64 noundef %1387, i64 noundef %1388)
  br label %1565

1389:                                             ; preds = %1350
  store ptr @.str.55, ptr %24, align 8, !tbaa !5
  %1390 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1391 = zext i8 %1390 to i32
  %1392 = and i32 %1391, 1
  %1393 = icmp ne i32 %1392, 0
  %1394 = xor i1 %1393, true
  %1395 = xor i1 %1394, true
  %1396 = zext i1 %1395 to i32
  %1397 = sext i32 %1396 to i64
  %1398 = call i64 @llvm.expect.i64(i64 %1397, i64 1)
  %1399 = icmp ne i64 %1398, 0
  br i1 %1399, label %1400, label %1527

1400:                                             ; preds = %1389
  %1401 = load ptr, ptr %8, align 8, !tbaa !5
  %1402 = icmp ne ptr %1401, null
  br i1 %1402, label %1403, label %1527

1403:                                             ; preds = %1400
  store ptr null, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #10
  %1404 = load ptr, ptr %11, align 8, !tbaa !5
  %1405 = getelementptr inbounds %struct.MDBX_txn, ptr %1404, i32 0, i32 4
  %1406 = load ptr, ptr %1405, align 8, !tbaa !30
  store ptr %1406, ptr %25, align 8, !tbaa !5
  br label %1407

1407:                                             ; preds = %1489, %1403
  %1408 = load ptr, ptr %25, align 8, !tbaa !5
  %1409 = icmp ne ptr %1408, null
  br i1 %1409, label %1411, label %1410

1410:                                             ; preds = %1407
  store i32 116, ptr %18, align 4
  br label %1493

1411:                                             ; preds = %1407
  %1412 = load ptr, ptr %25, align 8, !tbaa !5
  %1413 = load i32, ptr %7, align 4, !tbaa !9
  %1414 = call i64 @spill_search(ptr noundef %1412, i32 noundef %1413)
  %1415 = icmp ne i64 %1414, 0
  br i1 %1415, label %1416, label %1449

1416:                                             ; preds = %1411
  store ptr @.str.56, ptr %24, align 8, !tbaa !5
  br label %1417

1417:                                             ; preds = %1416
  %1418 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1419 = zext i8 %1418 to i32
  %1420 = and i32 %1419, 1
  %1421 = icmp ne i32 %1420, 0
  %1422 = xor i1 %1421, true
  %1423 = xor i1 %1422, true
  %1424 = zext i1 %1423 to i32
  %1425 = sext i32 %1424 to i64
  %1426 = call i64 @llvm.expect.i64(i64 %1425, i64 1)
  %1427 = icmp ne i64 %1426, 0
  br i1 %1427, label %1428, label %1446

1428:                                             ; preds = %1417
  br label %1429

1429:                                             ; preds = %1428
  %1430 = load i32, ptr %15, align 4, !tbaa !9
  %1431 = icmp eq i32 %1430, 2
  %1432 = xor i1 %1431, true
  %1433 = xor i1 %1432, true
  %1434 = xor i1 %1433, true
  %1435 = zext i1 %1434 to i32
  %1436 = sext i32 %1435 to i64
  %1437 = call i64 @llvm.expect.i64(i64 %1436, i64 0)
  %1438 = icmp ne i64 %1437, 0
  br i1 %1438, label %1439, label %1443

1439:                                             ; preds = %1429
  %1440 = load ptr, ptr %11, align 8, !tbaa !5
  %1441 = getelementptr inbounds %struct.MDBX_txn, ptr %1440, i32 0, i32 9
  %1442 = load ptr, ptr %1441, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1442, ptr noundef @.str.54, ptr noundef @__func__.page_retire_ex, i32 noundef 541) #11
  unreachable

1443:                                             ; preds = %1429
  br label %1444

1444:                                             ; preds = %1443
  br label %1445

1445:                                             ; preds = %1444
  br label %1446

1446:                                             ; preds = %1445, %1417
  br label %1447

1447:                                             ; preds = %1446
  br label %1448

1448:                                             ; preds = %1447
  store i32 116, ptr %18, align 4
  br label %1493

1449:                                             ; preds = %1411
  %1450 = load ptr, ptr %8, align 8, !tbaa !5
  %1451 = load ptr, ptr %25, align 8, !tbaa !5
  %1452 = load i32, ptr %7, align 4, !tbaa !9
  %1453 = call ptr @debug_dpl_find(ptr noundef %1451, i32 noundef %1452)
  %1454 = icmp eq ptr %1450, %1453
  br i1 %1454, label %1455, label %1488

1455:                                             ; preds = %1449
  store ptr @.str.57, ptr %24, align 8, !tbaa !5
  br label %1456

1456:                                             ; preds = %1455
  %1457 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1458 = zext i8 %1457 to i32
  %1459 = and i32 %1458, 1
  %1460 = icmp ne i32 %1459, 0
  %1461 = xor i1 %1460, true
  %1462 = xor i1 %1461, true
  %1463 = zext i1 %1462 to i32
  %1464 = sext i32 %1463 to i64
  %1465 = call i64 @llvm.expect.i64(i64 %1464, i64 1)
  %1466 = icmp ne i64 %1465, 0
  br i1 %1466, label %1467, label %1485

1467:                                             ; preds = %1456
  br label %1468

1468:                                             ; preds = %1467
  %1469 = load i32, ptr %15, align 4, !tbaa !9
  %1470 = icmp eq i32 %1469, 3
  %1471 = xor i1 %1470, true
  %1472 = xor i1 %1471, true
  %1473 = xor i1 %1472, true
  %1474 = zext i1 %1473 to i32
  %1475 = sext i32 %1474 to i64
  %1476 = call i64 @llvm.expect.i64(i64 %1475, i64 0)
  %1477 = icmp ne i64 %1476, 0
  br i1 %1477, label %1478, label %1482

1478:                                             ; preds = %1468
  %1479 = load ptr, ptr %11, align 8, !tbaa !5
  %1480 = getelementptr inbounds %struct.MDBX_txn, ptr %1479, i32 0, i32 9
  %1481 = load ptr, ptr %1480, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1481, ptr noundef @.str.58, ptr noundef @__func__.page_retire_ex, i32 noundef 546) #11
  unreachable

1482:                                             ; preds = %1468
  br label %1483

1483:                                             ; preds = %1482
  br label %1484

1484:                                             ; preds = %1483
  br label %1485

1485:                                             ; preds = %1484, %1456
  br label %1486

1486:                                             ; preds = %1485
  br label %1487

1487:                                             ; preds = %1486
  store i32 116, ptr %18, align 4
  br label %1493

1488:                                             ; preds = %1449
  br label %1489

1489:                                             ; preds = %1488
  %1490 = load ptr, ptr %25, align 8, !tbaa !5
  %1491 = getelementptr inbounds %struct.MDBX_txn, ptr %1490, i32 0, i32 4
  %1492 = load ptr, ptr %1491, align 8, !tbaa !30
  store ptr %1492, ptr %25, align 8, !tbaa !5
  br label %1407, !llvm.loop !46

1493:                                             ; preds = %1487, %1448, %1410
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #10
  br label %1494

1494:                                             ; preds = %1493
  br label %1495

1495:                                             ; preds = %1494
  %1496 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1497 = zext i8 %1496 to i32
  %1498 = and i32 %1497, 1
  %1499 = icmp ne i32 %1498, 0
  %1500 = xor i1 %1499, true
  %1501 = xor i1 %1500, true
  %1502 = zext i1 %1501 to i32
  %1503 = sext i32 %1502 to i64
  %1504 = call i64 @llvm.expect.i64(i64 %1503, i64 1)
  %1505 = icmp ne i64 %1504, 0
  br i1 %1505, label %1506, label %1524

1506:                                             ; preds = %1495
  br label %1507

1507:                                             ; preds = %1506
  %1508 = load ptr, ptr %24, align 8, !tbaa !5
  %1509 = icmp ne ptr %1508, null
  %1510 = xor i1 %1509, true
  %1511 = xor i1 %1510, true
  %1512 = xor i1 %1511, true
  %1513 = zext i1 %1512 to i32
  %1514 = sext i32 %1513 to i64
  %1515 = call i64 @llvm.expect.i64(i64 %1514, i64 0)
  %1516 = icmp ne i64 %1515, 0
  br i1 %1516, label %1517, label %1521

1517:                                             ; preds = %1507
  %1518 = load ptr, ptr %11, align 8, !tbaa !5
  %1519 = getelementptr inbounds %struct.MDBX_txn, ptr %1518, i32 0, i32 9
  %1520 = load ptr, ptr %1519, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1520, ptr noundef @.str.59, ptr noundef @__func__.page_retire_ex, i32 noundef 550) #11
  unreachable

1521:                                             ; preds = %1507
  br label %1522

1522:                                             ; preds = %1521
  br label %1523

1523:                                             ; preds = %1522
  br label %1524

1524:                                             ; preds = %1523, %1495
  br label %1525

1525:                                             ; preds = %1524
  br label %1526

1526:                                             ; preds = %1525
  br label %1527

1527:                                             ; preds = %1526, %1400, %1389
  br label %1528

1528:                                             ; preds = %1527
  %1529 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1530 = zext i8 %1529 to i32
  %1531 = and i32 %1530, 1
  %1532 = icmp ne i32 %1531, 0
  %1533 = xor i1 %1532, true
  %1534 = xor i1 %1533, true
  %1535 = zext i1 %1534 to i32
  %1536 = sext i32 %1535 to i64
  %1537 = call i64 @llvm.expect.i64(i64 %1536, i64 1)
  %1538 = icmp ne i64 %1537, 0
  br i1 %1538, label %1539, label %1562

1539:                                             ; preds = %1528
  br label %1540

1540:                                             ; preds = %1539
  %1541 = load i32, ptr %15, align 4, !tbaa !9
  %1542 = icmp eq i32 %1541, 2
  br i1 %1542, label %1546, label %1543

1543:                                             ; preds = %1540
  %1544 = load i32, ptr %15, align 4, !tbaa !9
  %1545 = icmp eq i32 %1544, 3
  br label %1546

1546:                                             ; preds = %1543, %1540
  %1547 = phi i1 [ true, %1540 ], [ %1545, %1543 ]
  %1548 = xor i1 %1547, true
  %1549 = xor i1 %1548, true
  %1550 = xor i1 %1549, true
  %1551 = zext i1 %1550 to i32
  %1552 = sext i32 %1551 to i64
  %1553 = call i64 @llvm.expect.i64(i64 %1552, i64 0)
  %1554 = icmp ne i64 %1553, 0
  br i1 %1554, label %1555, label %1559

1555:                                             ; preds = %1546
  %1556 = load ptr, ptr %11, align 8, !tbaa !5
  %1557 = getelementptr inbounds %struct.MDBX_txn, ptr %1556, i32 0, i32 9
  %1558 = load ptr, ptr %1557, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1558, ptr noundef @.str.60, ptr noundef @__func__.page_retire_ex, i32 noundef 552) #11
  unreachable

1559:                                             ; preds = %1546
  br label %1560

1560:                                             ; preds = %1559
  br label %1561

1561:                                             ; preds = %1560
  br label %1562

1562:                                             ; preds = %1561, %1528
  br label %1563

1563:                                             ; preds = %1562
  br label %1564

1564:                                             ; preds = %1563
  br label %1565

1565:                                             ; preds = %1564, %1385
  br label %1566

1566:                                             ; preds = %1565, %1345
  br label %1567

1567:                                             ; preds = %1566
  %1568 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !45
  %1569 = zext i8 %1568 to i32
  %1570 = icmp sle i32 5, %1569
  %1571 = xor i1 %1570, true
  %1572 = xor i1 %1571, true
  %1573 = zext i1 %1572 to i32
  %1574 = sext i32 %1573 to i64
  %1575 = call i64 @llvm.expect.i64(i64 %1574, i64 0)
  %1576 = icmp ne i64 %1575, 0
  br i1 %1576, label %1577, label %1581

1577:                                             ; preds = %1567
  %1578 = load i64, ptr %14, align 8, !tbaa !23
  %1579 = load ptr, ptr %24, align 8, !tbaa !5
  %1580 = load i32, ptr %7, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.page_retire_ex, i32 noundef 554, ptr noundef @.str.61, i64 noundef %1578, ptr noundef %1579, i32 noundef %1580)
  br label %1581

1581:                                             ; preds = %1577, %1567
  br label %1582

1582:                                             ; preds = %1581
  br label %1583

1583:                                             ; preds = %1582
  %1584 = load i32, ptr %7, align 4, !tbaa !9
  %1585 = load ptr, ptr %11, align 8, !tbaa !5
  %1586 = getelementptr inbounds %struct.MDBX_txn, ptr %1585, i32 0, i32 6
  %1587 = getelementptr inbounds %struct.geo, ptr %1586, i32 0, i32 5
  store i32 %1584, ptr %1587, align 8, !tbaa !29
  %1588 = load ptr, ptr %11, align 8, !tbaa !5
  %1589 = call zeroext i1 @txn_refund(ptr noundef %1588)
  store i32 0, ptr %5, align 4
  store i32 1, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #10
  br label %2056

1590:                                             ; preds = %1325
  %1591 = load i32, ptr %15, align 4, !tbaa !9
  %1592 = icmp eq i32 %1591, 4
  br i1 %1592, label %1593, label %1911

1593:                                             ; preds = %1590
  %1594 = load i64, ptr %14, align 8, !tbaa !23
  %1595 = icmp eq i64 %1594, 1
  br i1 %1595, label %1596, label %1600

1596:                                             ; preds = %1593
  %1597 = load ptr, ptr %11, align 8, !tbaa !5
  %1598 = load i32, ptr %7, align 4, !tbaa !9
  %1599 = call zeroext i1 @suitable4loose(ptr noundef %1597, i32 noundef %1598)
  br label %1600

1600:                                             ; preds = %1596, %1593
  %1601 = phi i1 [ false, %1593 ], [ %1599, %1596 ]
  %1602 = xor i1 %1601, true
  %1603 = xor i1 %1602, true
  %1604 = zext i1 %1603 to i32
  %1605 = sext i32 %1604 to i64
  %1606 = call i64 @llvm.expect.i64(i64 %1605, i64 1)
  %1607 = icmp ne i64 %1606, 0
  br i1 %1607, label %1608, label %1719

1608:                                             ; preds = %1600
  %1609 = load i64, ptr %12, align 8, !tbaa !23
  %1610 = icmp ne i64 %1609, 0
  br i1 %1610, label %1617, label %1611

1611:                                             ; preds = %1608
  %1612 = load ptr, ptr %11, align 8, !tbaa !5
  %1613 = getelementptr inbounds %struct.MDBX_txn, ptr %1612, i32 0, i32 17
  %1614 = getelementptr inbounds %struct.anon.6, ptr %1613, i32 0, i32 7
  %1615 = load ptr, ptr %1614, align 8, !tbaa !29
  %1616 = icmp ne ptr %1615, null
  br i1 %1616, label %1719, label %1617

1617:                                             ; preds = %1611, %1608
  br label %1618

1618:                                             ; preds = %1617
  %1619 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !45
  %1620 = zext i8 %1619 to i32
  %1621 = icmp sle i32 5, %1620
  %1622 = xor i1 %1621, true
  %1623 = xor i1 %1622, true
  %1624 = zext i1 %1623 to i32
  %1625 = sext i32 %1624 to i64
  %1626 = call i64 @llvm.expect.i64(i64 %1625, i64 0)
  %1627 = icmp ne i64 %1626, 0
  br i1 %1627, label %1628, label %1630

1628:                                             ; preds = %1618
  %1629 = load i32, ptr %7, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.page_retire_ex, i32 noundef 564, ptr noundef @.str.62, i32 noundef %1629)
  br label %1630

1630:                                             ; preds = %1628, %1618
  br label %1631

1631:                                             ; preds = %1630
  br label %1632

1632:                                             ; preds = %1631
  %1633 = load ptr, ptr %8, align 8, !tbaa !5
  %1634 = call ptr @page_data(ptr noundef %1633) #12
  %1635 = load ptr, ptr %11, align 8, !tbaa !5
  %1636 = getelementptr inbounds %struct.MDBX_txn, ptr %1635, i32 0, i32 9
  %1637 = load ptr, ptr %1636, align 8, !tbaa !19
  %1638 = getelementptr inbounds %struct.MDBX_env, ptr %1637, i32 0, i32 2
  %1639 = load i32, ptr %1638, align 8, !tbaa !47
  %1640 = sub i32 %1639, 20
  %1641 = zext i32 %1640 to i64
  call void @llvm.memset.p0.i64(ptr align 1 %1634, i8 -1, i64 %1641, i1 false)
  %1642 = load ptr, ptr %8, align 8, !tbaa !5
  %1643 = getelementptr inbounds %struct.page, ptr %1642, i32 0, i32 0
  store i64 -1, ptr %1643, align 1, !tbaa !23
  %1644 = load ptr, ptr %8, align 8, !tbaa !5
  %1645 = getelementptr inbounds %struct.page, ptr %1644, i32 0, i32 2
  store i16 16384, ptr %1645, align 1, !tbaa !17
  %1646 = load ptr, ptr %11, align 8, !tbaa !5
  %1647 = getelementptr inbounds %struct.MDBX_txn, ptr %1646, i32 0, i32 17
  %1648 = getelementptr inbounds %struct.anon.6, ptr %1647, i32 0, i32 9
  %1649 = load ptr, ptr %1648, align 8, !tbaa !29
  %1650 = load ptr, ptr %8, align 8, !tbaa !5
  %1651 = getelementptr inbounds %struct.page, ptr %1650, i32 0, i32 5
  %1652 = getelementptr inbounds [0 x i16], ptr %1651, i64 0, i64 0
  %1653 = ptrtoint ptr %1652 to i64
  %1654 = add nsw i64 %1653, 4
  %1655 = inttoptr i64 %1654 to ptr
  store ptr %1649, ptr %1655, align 8, !tbaa !5
  %1656 = load ptr, ptr %8, align 8, !tbaa !5
  %1657 = load ptr, ptr %11, align 8, !tbaa !5
  %1658 = getelementptr inbounds %struct.MDBX_txn, ptr %1657, i32 0, i32 17
  %1659 = getelementptr inbounds %struct.anon.6, ptr %1658, i32 0, i32 9
  store ptr %1656, ptr %1659, align 8, !tbaa !29
  %1660 = load ptr, ptr %11, align 8, !tbaa !5
  %1661 = getelementptr inbounds %struct.MDBX_txn, ptr %1660, i32 0, i32 17
  %1662 = getelementptr inbounds %struct.anon.6, ptr %1661, i32 0, i32 10
  %1663 = load i64, ptr %1662, align 8, !tbaa !29
  %1664 = add i64 %1663, 1
  store i64 %1664, ptr %1662, align 8, !tbaa !29
  %1665 = load i32, ptr %7, align 4, !tbaa !9
  %1666 = add i32 %1665, 2
  %1667 = load ptr, ptr %11, align 8, !tbaa !5
  %1668 = getelementptr inbounds %struct.MDBX_txn, ptr %1667, i32 0, i32 17
  %1669 = getelementptr inbounds %struct.anon.6, ptr %1668, i32 0, i32 4
  %1670 = load i32, ptr %1669, align 4, !tbaa !29
  %1671 = icmp ugt i32 %1666, %1670
  br i1 %1671, label %1672, label %1675

1672:                                             ; preds = %1632
  %1673 = load i32, ptr %7, align 4, !tbaa !9
  %1674 = add i32 %1673, 2
  br label %1680

1675:                                             ; preds = %1632
  %1676 = load ptr, ptr %11, align 8, !tbaa !5
  %1677 = getelementptr inbounds %struct.MDBX_txn, ptr %1676, i32 0, i32 17
  %1678 = getelementptr inbounds %struct.anon.6, ptr %1677, i32 0, i32 4
  %1679 = load i32, ptr %1678, align 4, !tbaa !29
  br label %1680

1680:                                             ; preds = %1675, %1672
  %1681 = phi i32 [ %1674, %1672 ], [ %1679, %1675 ]
  %1682 = load ptr, ptr %11, align 8, !tbaa !5
  %1683 = getelementptr inbounds %struct.MDBX_txn, ptr %1682, i32 0, i32 17
  %1684 = getelementptr inbounds %struct.anon.6, ptr %1683, i32 0, i32 4
  store i32 %1681, ptr %1684, align 4, !tbaa !29
  br label %1685

1685:                                             ; preds = %1680
  br label %1686

1686:                                             ; preds = %1685
  %1687 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !45
  %1688 = zext i8 %1687 to i32
  %1689 = icmp sle i32 6, %1688
  %1690 = xor i1 %1689, true
  %1691 = xor i1 %1690, true
  %1692 = zext i1 %1691 to i32
  %1693 = sext i32 %1692 to i64
  %1694 = call i64 @llvm.expect.i64(i64 %1693, i64 0)
  %1695 = icmp ne i64 %1694, 0
  br i1 %1695, label %1696, label %1706

1696:                                             ; preds = %1686
  %1697 = load ptr, ptr %8, align 8, !tbaa !5
  %1698 = call ptr @page_data(ptr noundef %1697) #12
  %1699 = load ptr, ptr %11, align 8, !tbaa !5
  %1700 = getelementptr inbounds %struct.MDBX_txn, ptr %1699, i32 0, i32 9
  %1701 = load ptr, ptr %1700, align 8, !tbaa !19
  %1702 = getelementptr inbounds %struct.MDBX_env, ptr %1701, i32 0, i32 2
  %1703 = load i32, ptr %1702, align 8, !tbaa !47
  %1704 = sub i32 %1703, 20
  %1705 = zext i32 %1704 to i64
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.page_retire_ex, i32 noundef 576, ptr noundef @.str.30, ptr noundef %1698, i64 noundef %1705, i32 noundef 576)
  br label %1706

1706:                                             ; preds = %1696, %1686
  br label %1707

1707:                                             ; preds = %1706
  br label %1708

1708:                                             ; preds = %1707
  %1709 = load ptr, ptr %8, align 8, !tbaa !5
  %1710 = call ptr @page_data(ptr noundef %1709) #12
  %1711 = load ptr, ptr %11, align 8, !tbaa !5
  %1712 = getelementptr inbounds %struct.MDBX_txn, ptr %1711, i32 0, i32 9
  %1713 = load ptr, ptr %1712, align 8, !tbaa !19
  %1714 = getelementptr inbounds %struct.MDBX_env, ptr %1713, i32 0, i32 2
  %1715 = load i32, ptr %1714, align 8, !tbaa !47
  %1716 = sub i32 %1715, 20
  br label %1717

1717:                                             ; preds = %1708
  br label %1718

1718:                                             ; preds = %1717
  store i32 0, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %2056

1719:                                             ; preds = %1611, %1600
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #10
  %1720 = load ptr, ptr %11, align 8, !tbaa !5
  %1721 = getelementptr inbounds %struct.MDBX_txn, ptr %1720, i32 0, i32 4
  %1722 = load ptr, ptr %1721, align 8, !tbaa !30
  store ptr %1722, ptr %26, align 8, !tbaa !5
  br label %1723

1723:                                             ; preds = %1748, %1719
  %1724 = load ptr, ptr %26, align 8, !tbaa !5
  %1725 = icmp ne ptr %1724, null
  br i1 %1725, label %1726, label %1732

1726:                                             ; preds = %1723
  %1727 = load ptr, ptr %26, align 8, !tbaa !5
  %1728 = getelementptr inbounds %struct.MDBX_txn, ptr %1727, i32 0, i32 1
  %1729 = load i32, ptr %1728, align 4, !tbaa !36
  %1730 = and i32 %1729, 8
  %1731 = icmp ne i32 %1730, 0
  br label %1732

1732:                                             ; preds = %1726, %1723
  %1733 = phi i1 [ false, %1723 ], [ %1731, %1726 ]
  br i1 %1733, label %1735, label %1734

1734:                                             ; preds = %1732
  store i32 143, ptr %18, align 4
  br label %1752

1735:                                             ; preds = %1732
  %1736 = load ptr, ptr %26, align 8, !tbaa !5
  %1737 = load i32, ptr %7, align 4, !tbaa !9
  %1738 = load i64, ptr %14, align 8, !tbaa !23
  %1739 = call zeroext i1 @spill_intersect(ptr noundef %1736, i32 noundef %1737, i64 noundef %1738)
  br i1 %1739, label %1740, label %1741

1740:                                             ; preds = %1735
  store i32 146, ptr %18, align 4
  br label %1752

1741:                                             ; preds = %1735
  %1742 = load ptr, ptr %26, align 8, !tbaa !5
  %1743 = load i32, ptr %7, align 4, !tbaa !9
  %1744 = load i64, ptr %14, align 8, !tbaa !23
  %1745 = call zeroext i1 @dpl_intersect(ptr noundef %1742, i32 noundef %1743, i64 noundef %1744) #12
  br i1 %1745, label %1746, label %1747

1746:                                             ; preds = %1741
  store i32 146, ptr %18, align 4
  br label %1752

1747:                                             ; preds = %1741
  br label %1748

1748:                                             ; preds = %1747
  %1749 = load ptr, ptr %26, align 8, !tbaa !5
  %1750 = getelementptr inbounds %struct.MDBX_txn, ptr %1749, i32 0, i32 4
  %1751 = load ptr, ptr %1750, align 8, !tbaa !30
  store ptr %1751, ptr %26, align 8, !tbaa !5
  br label %1723, !llvm.loop !56

1752:                                             ; preds = %1746, %1740, %1734
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #10
  %1753 = load i32, ptr %18, align 4
  switch i32 %1753, label %2056 [
    i32 143, label %1754
    i32 146, label %1809
  ]

1754:                                             ; preds = %1752
  %1755 = load ptr, ptr %11, align 8, !tbaa !5
  %1756 = load ptr, ptr %8, align 8, !tbaa !5
  %1757 = load i32, ptr %7, align 4, !tbaa !9
  %1758 = load i64, ptr %14, align 8, !tbaa !23
  call void @page_kill(ptr noundef %1755, ptr noundef %1756, i32 noundef %1757, i64 noundef %1758) #13
  %1759 = load ptr, ptr %11, align 8, !tbaa !5
  %1760 = getelementptr inbounds %struct.MDBX_txn, ptr %1759, i32 0, i32 1
  %1761 = load i32, ptr %1760, align 4, !tbaa !36
  %1762 = and i32 %1761, 524288
  %1763 = icmp eq i32 %1762, 0
  br i1 %1763, label %1764, label %1808

1764:                                             ; preds = %1754
  br label %1765

1765:                                             ; preds = %1764
  br label %1766

1766:                                             ; preds = %1765
  %1767 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !45
  %1768 = zext i8 %1767 to i32
  %1769 = icmp sle i32 6, %1768
  %1770 = xor i1 %1769, true
  %1771 = xor i1 %1770, true
  %1772 = zext i1 %1771 to i32
  %1773 = sext i32 %1772 to i64
  %1774 = call i64 @llvm.expect.i64(i64 %1773, i64 0)
  %1775 = icmp ne i64 %1774, 0
  br i1 %1775, label %1776, label %1790

1776:                                             ; preds = %1766
  %1777 = load ptr, ptr %11, align 8, !tbaa !5
  %1778 = getelementptr inbounds %struct.MDBX_txn, ptr %1777, i32 0, i32 9
  %1779 = load ptr, ptr %1778, align 8, !tbaa !19
  %1780 = load i32, ptr %7, align 4, !tbaa !9
  %1781 = zext i32 %1780 to i64
  %1782 = call ptr @pgno2page(ptr noundef %1779, i64 noundef %1781) #12
  %1783 = call ptr @page_data(ptr noundef %1782) #12
  %1784 = load ptr, ptr %11, align 8, !tbaa !5
  %1785 = getelementptr inbounds %struct.MDBX_txn, ptr %1784, i32 0, i32 9
  %1786 = load ptr, ptr %1785, align 8, !tbaa !19
  %1787 = load i64, ptr %14, align 8, !tbaa !23
  %1788 = call i64 @pgno2bytes(ptr noundef %1786, i64 noundef %1787) #12
  %1789 = sub i64 %1788, 20
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.page_retire_ex, i32 noundef 601, ptr noundef @.str.30, ptr noundef %1783, i64 noundef %1789, i32 noundef 601)
  br label %1790

1790:                                             ; preds = %1776, %1766
  br label %1791

1791:                                             ; preds = %1790
  br label %1792

1792:                                             ; preds = %1791
  %1793 = load ptr, ptr %11, align 8, !tbaa !5
  %1794 = getelementptr inbounds %struct.MDBX_txn, ptr %1793, i32 0, i32 9
  %1795 = load ptr, ptr %1794, align 8, !tbaa !19
  %1796 = load i32, ptr %7, align 4, !tbaa !9
  %1797 = zext i32 %1796 to i64
  %1798 = call ptr @pgno2page(ptr noundef %1795, i64 noundef %1797) #12
  %1799 = call ptr @page_data(ptr noundef %1798) #12
  %1800 = load ptr, ptr %11, align 8, !tbaa !5
  %1801 = getelementptr inbounds %struct.MDBX_txn, ptr %1800, i32 0, i32 9
  %1802 = load ptr, ptr %1801, align 8, !tbaa !19
  %1803 = load i64, ptr %14, align 8, !tbaa !23
  %1804 = call i64 @pgno2bytes(ptr noundef %1802, i64 noundef %1803) #12
  %1805 = sub i64 %1804, 20
  br label %1806

1806:                                             ; preds = %1792
  br label %1807

1807:                                             ; preds = %1806
  br label %1808

1808:                                             ; preds = %1807, %1754
  br label %1809

1809:                                             ; preds = %1808, %1752
  %1810 = load ptr, ptr %11, align 8, !tbaa !5
  %1811 = load i64, ptr %12, align 8, !tbaa !23
  %1812 = load ptr, ptr %8, align 8, !tbaa !5
  %1813 = load i64, ptr %14, align 8, !tbaa !23
  call void @page_wash(ptr noundef %1810, i64 noundef %1811, ptr noundef %1812, i64 noundef %1813)
  br label %1814

1814:                                             ; preds = %2054, %1938, %1809
  br label %1815

1815:                                             ; preds = %1814
  %1816 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !45
  %1817 = zext i8 %1816 to i32
  %1818 = icmp sle i32 5, %1817
  %1819 = xor i1 %1818, true
  %1820 = xor i1 %1819, true
  %1821 = zext i1 %1820 to i32
  %1822 = sext i32 %1821 to i64
  %1823 = call i64 @llvm.expect.i64(i64 %1822, i64 0)
  %1824 = icmp ne i64 %1823, 0
  br i1 %1824, label %1825, label %1828

1825:                                             ; preds = %1815
  %1826 = load i64, ptr %14, align 8, !tbaa !23
  %1827 = load i32, ptr %7, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.page_retire_ex, i32 noundef 610, ptr noundef @.str.63, i64 noundef %1826, ptr noundef @.str.52, i32 noundef %1827)
  br label %1828

1828:                                             ; preds = %1825, %1815
  br label %1829

1829:                                             ; preds = %1828
  br label %1830

1830:                                             ; preds = %1829
  %1831 = load ptr, ptr %11, align 8, !tbaa !5
  %1832 = getelementptr inbounds %struct.MDBX_txn, ptr %1831, i32 0, i32 17
  %1833 = getelementptr inbounds %struct.anon.6, ptr %1832, i32 0, i32 1
  %1834 = load i32, ptr %7, align 4, !tbaa !9
  %1835 = load i64, ptr %14, align 8, !tbaa !23
  %1836 = call i32 @pnl_insert_span(ptr noundef %1833, i32 noundef %1834, i64 noundef %1835)
  store i32 %1836, ptr %10, align 4, !tbaa !9
  br label %1837

1837:                                             ; preds = %1830
  %1838 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1839 = zext i8 %1838 to i32
  %1840 = and i32 %1839, 1
  %1841 = icmp ne i32 %1840, 0
  %1842 = xor i1 %1841, true
  %1843 = xor i1 %1842, true
  %1844 = zext i1 %1843 to i32
  %1845 = sext i32 %1844 to i64
  %1846 = call i64 @llvm.expect.i64(i64 %1845, i64 1)
  %1847 = icmp ne i64 %1846, 0
  br i1 %1847, label %1848, label %1875

1848:                                             ; preds = %1837
  br label %1849

1849:                                             ; preds = %1848
  %1850 = load ptr, ptr %11, align 8, !tbaa !5
  %1851 = getelementptr inbounds %struct.MDBX_txn, ptr %1850, i32 0, i32 17
  %1852 = getelementptr inbounds %struct.anon.6, ptr %1851, i32 0, i32 1
  %1853 = load ptr, ptr %1852, align 8, !tbaa !29
  %1854 = load ptr, ptr %11, align 8, !tbaa !5
  %1855 = getelementptr inbounds %struct.MDBX_txn, ptr %1854, i32 0, i32 6
  %1856 = getelementptr inbounds %struct.geo, ptr %1855, i32 0, i32 5
  %1857 = load i32, ptr %1856, align 8, !tbaa !29
  %1858 = sub i32 %1857, 1
  %1859 = zext i32 %1858 to i64
  %1860 = call zeroext i1 @pnl_check_allocated(ptr noundef %1853, i64 noundef %1859)
  %1861 = xor i1 %1860, true
  %1862 = xor i1 %1861, true
  %1863 = xor i1 %1862, true
  %1864 = zext i1 %1863 to i32
  %1865 = sext i32 %1864 to i64
  %1866 = call i64 @llvm.expect.i64(i64 %1865, i64 0)
  %1867 = icmp ne i64 %1866, 0
  br i1 %1867, label %1868, label %1872

1868:                                             ; preds = %1849
  %1869 = load ptr, ptr %11, align 8, !tbaa !5
  %1870 = getelementptr inbounds %struct.MDBX_txn, ptr %1869, i32 0, i32 9
  %1871 = load ptr, ptr %1870, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1871, ptr noundef @.str.64, ptr noundef @__func__.page_retire_ex, i32 noundef 612) #11
  unreachable

1872:                                             ; preds = %1849
  br label %1873

1873:                                             ; preds = %1872
  br label %1874

1874:                                             ; preds = %1873
  br label %1875

1875:                                             ; preds = %1874, %1837
  br label %1876

1876:                                             ; preds = %1875
  br label %1877

1877:                                             ; preds = %1876
  br label %1878

1878:                                             ; preds = %1877
  %1879 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1880 = zext i8 %1879 to i32
  %1881 = and i32 %1880, 1
  %1882 = icmp ne i32 %1881, 0
  %1883 = xor i1 %1882, true
  %1884 = xor i1 %1883, true
  %1885 = zext i1 %1884 to i32
  %1886 = sext i32 %1885 to i64
  %1887 = call i64 @llvm.expect.i64(i64 %1886, i64 1)
  %1888 = icmp ne i64 %1887, 0
  br i1 %1888, label %1889, label %1907

1889:                                             ; preds = %1878
  br label %1890

1890:                                             ; preds = %1889
  %1891 = load ptr, ptr %11, align 8, !tbaa !5
  %1892 = call zeroext i1 @dpl_check(ptr noundef %1891)
  %1893 = xor i1 %1892, true
  %1894 = xor i1 %1893, true
  %1895 = xor i1 %1894, true
  %1896 = zext i1 %1895 to i32
  %1897 = sext i32 %1896 to i64
  %1898 = call i64 @llvm.expect.i64(i64 %1897, i64 0)
  %1899 = icmp ne i64 %1898, 0
  br i1 %1899, label %1900, label %1904

1900:                                             ; preds = %1890
  %1901 = load ptr, ptr %11, align 8, !tbaa !5
  %1902 = getelementptr inbounds %struct.MDBX_txn, ptr %1901, i32 0, i32 9
  %1903 = load ptr, ptr %1902, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1903, ptr noundef @.str.51, ptr noundef @__func__.page_retire_ex, i32 noundef 613) #11
  unreachable

1904:                                             ; preds = %1890
  br label %1905

1905:                                             ; preds = %1904
  br label %1906

1906:                                             ; preds = %1905
  br label %1907

1907:                                             ; preds = %1906, %1878
  br label %1908

1908:                                             ; preds = %1907
  br label %1909

1909:                                             ; preds = %1908
  %1910 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1910, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %2056

1911:                                             ; preds = %1590
  %1912 = load i64, ptr %13, align 8, !tbaa !23
  %1913 = icmp ne i64 %1912, 0
  br i1 %1913, label %1914, label %1939

1914:                                             ; preds = %1911
  %1915 = load ptr, ptr %11, align 8, !tbaa !5
  %1916 = load i64, ptr %13, align 8, !tbaa !23
  %1917 = load i64, ptr %14, align 8, !tbaa !23
  call void @spill_remove(ptr noundef %1915, i64 noundef %1916, i64 noundef %1917)
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #10
  %1918 = load ptr, ptr %11, align 8, !tbaa !5
  %1919 = getelementptr inbounds %struct.MDBX_txn, ptr %1918, i32 0, i32 4
  %1920 = load ptr, ptr %1919, align 8, !tbaa !30
  store ptr %1920, ptr %27, align 8, !tbaa !5
  br label %1921

1921:                                             ; preds = %1932, %1914
  %1922 = load ptr, ptr %27, align 8, !tbaa !5
  %1923 = icmp ne ptr %1922, null
  br i1 %1923, label %1925, label %1924

1924:                                             ; preds = %1921
  store i32 162, ptr %18, align 4
  br label %1936

1925:                                             ; preds = %1921
  %1926 = load ptr, ptr %27, align 8, !tbaa !5
  %1927 = load i32, ptr %7, align 4, !tbaa !9
  %1928 = call i64 @dpl_exist(ptr noundef %1926, i32 noundef %1927) #12
  %1929 = icmp ne i64 %1928, 0
  br i1 %1929, label %1930, label %1931

1930:                                             ; preds = %1925
  store i32 105, ptr %18, align 4
  br label %1936

1931:                                             ; preds = %1925
  br label %1932

1932:                                             ; preds = %1931
  %1933 = load ptr, ptr %27, align 8, !tbaa !5
  %1934 = getelementptr inbounds %struct.MDBX_txn, ptr %1933, i32 0, i32 4
  %1935 = load ptr, ptr %1934, align 8, !tbaa !30
  store ptr %1935, ptr %27, align 8, !tbaa !5
  br label %1921, !llvm.loop !57

1936:                                             ; preds = %1930, %1924
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #10
  %1937 = load i32, ptr %18, align 4
  switch i32 %1937, label %2058 [
    i32 162, label %1938
    i32 105, label %1269
  ]

1938:                                             ; preds = %1936
  br label %1814

1939:                                             ; preds = %1911
  %1940 = load i32, ptr %15, align 4, !tbaa !9
  %1941 = icmp eq i32 %1940, 3
  br i1 %1941, label %1942, label %2055

1942:                                             ; preds = %1939
  %1943 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1944 = zext i8 %1943 to i32
  %1945 = and i32 %1944, 1
  %1946 = icmp ne i32 %1945, 0
  %1947 = xor i1 %1946, true
  %1948 = xor i1 %1947, true
  %1949 = zext i1 %1948 to i32
  %1950 = sext i32 %1949 to i64
  %1951 = call i64 @llvm.expect.i64(i64 %1950, i64 1)
  %1952 = icmp ne i64 %1951, 0
  br i1 %1952, label %1953, label %2054

1953:                                             ; preds = %1942
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #10
  store ptr null, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #10
  %1954 = load ptr, ptr %11, align 8, !tbaa !5
  %1955 = getelementptr inbounds %struct.MDBX_txn, ptr %1954, i32 0, i32 4
  %1956 = load ptr, ptr %1955, align 8, !tbaa !30
  store ptr %1956, ptr %29, align 8, !tbaa !5
  br label %1957

1957:                                             ; preds = %2006, %1953
  %1958 = load ptr, ptr %29, align 8, !tbaa !5
  %1959 = icmp ne ptr %1958, null
  br i1 %1959, label %1960, label %1964

1960:                                             ; preds = %1957
  %1961 = load ptr, ptr %28, align 8, !tbaa !5
  %1962 = icmp ne ptr %1961, null
  %1963 = xor i1 %1962, true
  br label %1964

1964:                                             ; preds = %1960, %1957
  %1965 = phi i1 [ false, %1957 ], [ %1963, %1960 ]
  br i1 %1965, label %1967, label %1966

1966:                                             ; preds = %1964
  store i32 165, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #10
  br label %2010

1967:                                             ; preds = %1964
  br label %1968

1968:                                             ; preds = %1967
  %1969 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %1970 = zext i8 %1969 to i32
  %1971 = and i32 %1970, 1
  %1972 = icmp ne i32 %1971, 0
  %1973 = xor i1 %1972, true
  %1974 = xor i1 %1973, true
  %1975 = zext i1 %1974 to i32
  %1976 = sext i32 %1975 to i64
  %1977 = call i64 @llvm.expect.i64(i64 %1976, i64 1)
  %1978 = icmp ne i64 %1977, 0
  br i1 %1978, label %1979, label %2000

1979:                                             ; preds = %1968
  br label %1980

1980:                                             ; preds = %1979
  %1981 = load ptr, ptr %29, align 8, !tbaa !5
  %1982 = load i32, ptr %7, align 4, !tbaa !9
  %1983 = call i64 @spill_search(ptr noundef %1981, i32 noundef %1982)
  %1984 = icmp ne i64 %1983, 0
  %1985 = xor i1 %1984, true
  %1986 = xor i1 %1985, true
  %1987 = xor i1 %1986, true
  %1988 = xor i1 %1987, true
  %1989 = zext i1 %1988 to i32
  %1990 = sext i32 %1989 to i64
  %1991 = call i64 @llvm.expect.i64(i64 %1990, i64 0)
  %1992 = icmp ne i64 %1991, 0
  br i1 %1992, label %1993, label %1997

1993:                                             ; preds = %1980
  %1994 = load ptr, ptr %11, align 8, !tbaa !5
  %1995 = getelementptr inbounds %struct.MDBX_txn, ptr %1994, i32 0, i32 9
  %1996 = load ptr, ptr %1995, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1996, ptr noundef @.str.65, ptr noundef @__func__.page_retire_ex, i32 noundef 640) #11
  unreachable

1997:                                             ; preds = %1980
  br label %1998

1998:                                             ; preds = %1997
  br label %1999

1999:                                             ; preds = %1998
  br label %2000

2000:                                             ; preds = %1999, %1968
  br label %2001

2001:                                             ; preds = %2000
  br label %2002

2002:                                             ; preds = %2001
  %2003 = load ptr, ptr %29, align 8, !tbaa !5
  %2004 = load i32, ptr %7, align 4, !tbaa !9
  %2005 = call ptr @debug_dpl_find(ptr noundef %2003, i32 noundef %2004)
  store ptr %2005, ptr %28, align 8, !tbaa !5
  br label %2006

2006:                                             ; preds = %2002
  %2007 = load ptr, ptr %29, align 8, !tbaa !5
  %2008 = getelementptr inbounds %struct.MDBX_txn, ptr %2007, i32 0, i32 4
  %2009 = load ptr, ptr %2008, align 8, !tbaa !30
  store ptr %2009, ptr %29, align 8, !tbaa !5
  br label %1957, !llvm.loop !58

2010:                                             ; preds = %1966
  br label %2011

2011:                                             ; preds = %2010
  %2012 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %2013 = zext i8 %2012 to i32
  %2014 = and i32 %2013, 1
  %2015 = icmp ne i32 %2014, 0
  %2016 = xor i1 %2015, true
  %2017 = xor i1 %2016, true
  %2018 = zext i1 %2017 to i32
  %2019 = sext i32 %2018 to i64
  %2020 = call i64 @llvm.expect.i64(i64 %2019, i64 1)
  %2021 = icmp ne i64 %2020, 0
  br i1 %2021, label %2022, label %2051

2022:                                             ; preds = %2011
  br label %2023

2023:                                             ; preds = %2022
  %2024 = load ptr, ptr %28, align 8, !tbaa !5
  %2025 = icmp ne ptr %2024, null
  br i1 %2025, label %2026, label %2035

2026:                                             ; preds = %2023
  %2027 = load ptr, ptr %8, align 8, !tbaa !5
  %2028 = icmp ne ptr %2027, null
  br i1 %2028, label %2029, label %2033

2029:                                             ; preds = %2026
  %2030 = load ptr, ptr %28, align 8, !tbaa !5
  %2031 = load ptr, ptr %8, align 8, !tbaa !5
  %2032 = icmp eq ptr %2030, %2031
  br label %2033

2033:                                             ; preds = %2029, %2026
  %2034 = phi i1 [ true, %2026 ], [ %2032, %2029 ]
  br label %2035

2035:                                             ; preds = %2033, %2023
  %2036 = phi i1 [ false, %2023 ], [ %2034, %2033 ]
  %2037 = xor i1 %2036, true
  %2038 = xor i1 %2037, true
  %2039 = xor i1 %2038, true
  %2040 = zext i1 %2039 to i32
  %2041 = sext i32 %2040 to i64
  %2042 = call i64 @llvm.expect.i64(i64 %2041, i64 0)
  %2043 = icmp ne i64 %2042, 0
  br i1 %2043, label %2044, label %2048

2044:                                             ; preds = %2035
  %2045 = load ptr, ptr %11, align 8, !tbaa !5
  %2046 = getelementptr inbounds %struct.MDBX_txn, ptr %2045, i32 0, i32 9
  %2047 = load ptr, ptr %2046, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %2047, ptr noundef @.str.66, ptr noundef @__func__.page_retire_ex, i32 noundef 643) #11
  unreachable

2048:                                             ; preds = %2035
  br label %2049

2049:                                             ; preds = %2048
  br label %2050

2050:                                             ; preds = %2049
  br label %2051

2051:                                             ; preds = %2050, %2011
  br label %2052

2052:                                             ; preds = %2051
  br label %2053

2053:                                             ; preds = %2052
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #10
  br label %2054

2054:                                             ; preds = %2053, %1942
  br label %1814

2055:                                             ; preds = %1939
  br label %1269

2056:                                             ; preds = %1909, %1752, %1718, %1583, %1323, %489, %414, %208
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #10
  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 4, ptr %10) #10
  %2057 = load i32, ptr %5, align 4
  ret i32 %2057

2058:                                             ; preds = %1936
  unreachable
}

declare { ptr, i32 } @page_get_any(ptr noundef, i32 noundef, i64 noundef) #2

declare ptr @debug_dpl_find(ptr noundef, i32 noundef) #2

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

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

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

declare zeroext i1 @dpl_check(ptr noundef) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @page_wash(ptr noundef, i64 noundef, ptr noundef, i64 noundef) #4

declare zeroext i1 @txn_refund(ptr noundef) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @suitable4loose(ptr noundef, i32 noundef) #4

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden ptr @page_data(ptr noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @spill_intersect(ptr noundef, i32 noundef, i64 noundef) #4

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden zeroext i1 @dpl_intersect(ptr noundef, i32 noundef, i64 noundef) #7

; Function Attrs: cold nounwind optsize uwtable
declare hidden void @page_kill(ptr noundef, ptr noundef, i32 noundef, i64 noundef) #9

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 16}
!12 = !{!"MDBX_cursor", !10, i64 0, !7, i64 4, !7, i64 6, !7, i64 7, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !7, i64 48, !7, i64 304, !6, i64 368, !6, i64 376}
!13 = !{!14, !7, i64 25}
!14 = !{!"libmdbx_globals", !7, i64 0, !10, i64 16, !10, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !15, i64 27, !10, i64 28, !7, i64 32, !7, i64 40, !16, i64 80, !6, i64 88}
!15 = !{!"_Bool", !7, i64 0}
!16 = !{!"long", !7, i64 0}
!17 = !{!18, !18, i64 0}
!18 = !{!"short", !7, i64 0}
!19 = !{!20, !6, i64 80}
!20 = !{!"MDBX_txn", !10, i64 0, !10, i64 4, !16, i64 8, !16, i64 16, !6, i64 24, !6, i64 32, !21, i64 40, !16, i64 64, !16, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !22, i64 128, !6, i64 160, !7, i64 168}
!21 = !{!"geo", !18, i64 0, !18, i64 2, !10, i64 4, !10, i64 8, !7, i64 12, !7, i64 16}
!22 = !{!"MDBX_canary", !16, i64 0, !16, i64 8, !16, i64 16, !16, i64 24}
!23 = !{!16, !16, i64 0}
!24 = !{!20, !16, i64 72}
!25 = !{i64 0, i64 8, !5, i64 8, i64 4, !9}
!26 = !{!27, !10, i64 8}
!27 = !{!"page_get_result", !6, i64 0, !10, i64 8}
!28 = !{!27, !6, i64 0}
!29 = !{!7, !7, i64 0}
!30 = !{!20, !6, i64 24}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = !{!34, !6, i64 0}
!34 = !{!"dp", !6, i64 0, !10, i64 8, !10, i64 12}
!35 = distinct !{!35, !32}
!36 = !{!20, !10, i64 4}
!37 = !{!15, !15, i64 0}
!38 = !{i8 0, i8 2}
!39 = !{}
!40 = !{!41, !10, i64 12}
!41 = !{!"tree", !18, i64 0, !18, i64 2, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !16, i64 24, !16, i64 32, !16, i64 40}
!42 = !{!41, !10, i64 16}
!43 = !{!12, !6, i64 24}
!44 = !{!41, !10, i64 20}
!45 = !{!14, !7, i64 26}
!46 = distinct !{!46, !32}
!47 = !{!48, !10, i64 8}
!48 = !{!"MDBX_env", !7, i64 0, !10, i64 4, !10, i64 8, !49, i64 16, !10, i64 56, !10, i64 60, !49, 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, !10, i64 132, !10, i64 136, !10, i64 140, !10, i64 144, !50, i64 152, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !10, i64 224, !10, i64 228, !10, i64 232, !6, i64 240, !6, i64 248, !16, i64 256, !51, i64 264, !53, i64 320, !15, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !54, i64 392, !7, i64 400, !10, i64 440, !10, i64 444, !6, i64 448, !55, i64 456, !7, i64 496, !7, i64 536}
!49 = !{!"osal_mmap", !7, i64 0, !10, i64 8, !16, i64 16, !16, i64 24, !16, i64 32}
!50 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!51 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !16, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !10, i64 28, !10, i64 32, !15, i64 36, !15, i64 37, !15, i64 38, !52, i64 40, !7, i64 48}
!52 = !{!"", !18, i64 0, !18, i64 2, !18, i64 4, !18, i64 6}
!53 = !{!"", !16, i64 0, !16, i64 8, !16, i64 16, !16, i64 24, !16, i64 32}
!54 = !{!"", !16, i64 0}
!55 = !{!"osal_ioring", !10, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!56 = distinct !{!56, !32}
!57 = distinct !{!57, !32}
!58 = distinct !{!58, !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 }
%struct.anon = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.dp = type { ptr, i32, i32 }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.11 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [52 x i8], align 1
@__func__.page_retire_ex = external hidden unnamed_addr constant [15 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.63 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.64 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.65 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.66 = external hidden unnamed_addr constant [38 x i8], align 1

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @spill_search(ptr noundef, i32 noundef) local_unnamed_addr #2

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

declare void @spill_remove(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #1

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @page_retire_ex(ptr noundef %0, i32 noundef %1, ptr noundef %2, i32 noundef %3) local_unnamed_addr #5 {
  %5 = getelementptr inbounds i8, ptr %0, i64 16
  %6 = load ptr, ptr %5, align 8, !tbaa !5
  %7 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %8 = and i8 %7, 1
  %.not = icmp eq i8 %8, 0
  %.not326 = icmp eq ptr %2, null
  br i1 %.not, label %.critedge419, label %9, !prof !15

9:                                                ; preds = %4
  br i1 %.not326, label %22, label %10, !prof !16

10:                                               ; preds = %9
  %11 = getelementptr inbounds i8, ptr %2, i64 16
  %12 = load i32, ptr %11, align 1, !tbaa !17
  %13 = icmp eq i32 %12, %1
  br i1 %13, label %14, label %.critedge421

14:                                               ; preds = %10
  %15 = getelementptr inbounds i8, ptr %2, i64 10
  %16 = load i16, ptr %15, align 1, !tbaa !18
  %17 = zext i16 %16 to i32
  %18 = icmp eq i32 %17, %3
  br i1 %18, label %.critedge419.thread, label %.critedge421, !prof !20

.critedge421:                                     ; preds = %10, %14
  %19 = getelementptr inbounds i8, ptr %6, i64 80
  %20 = load ptr, ptr %19, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %20, ptr noundef nonnull @.str.31, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 391) #8
  unreachable

.critedge419:                                     ; preds = %4
  br i1 %.not326, label %.thread, label %.critedge419.thread, !prof !25

.thread:                                          ; preds = %.critedge419
  %21 = icmp ne i32 %3, 0
  br label %.critedge423

22:                                               ; preds = %9
  %.not543 = icmp eq i32 %3, 0
  br i1 %.not543, label %.thread552, label %23, !prof !26

23:                                               ; preds = %22
  %24 = getelementptr inbounds i8, ptr %6, i64 72
  %25 = load i64, ptr %24, align 8, !tbaa !27
  %26 = tail call { ptr, i32 } @page_get_any(ptr noundef nonnull %0, i32 noundef %1, i64 noundef %25) #9
  %27 = extractvalue { ptr, i32 } %26, 0
  %28 = extractvalue { ptr, i32 } %26, 1
  %.not327 = icmp eq i32 %28, 0
  br i1 %.not327, label %29, label %.critedge424, !prof !20

29:                                               ; preds = %23
  %30 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %31 = and i8 %30, 1
  %.not328 = icmp eq i8 %31, 0
  br i1 %.not328, label %.critedge423, label %32, !prof !15

32:                                               ; preds = %29
  %33 = getelementptr inbounds i8, ptr %27, i64 10
  %34 = load i16, ptr %33, align 1, !tbaa !18
  %35 = and i16 %34, -8193
  %36 = zext i16 %35 to i32
  %37 = and i32 %3, -32769
  %.not329 = icmp eq i32 %37, %36
  br i1 %.not329, label %41, label %38, !prof !20

38:                                               ; preds = %32
  %39 = getelementptr inbounds i8, ptr %6, i64 80
  %40 = load ptr, ptr %39, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %40, ptr noundef nonnull @.str.32, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 413) #8
  unreachable

41:                                               ; preds = %32
  %42 = and i32 %3, 32768
  %.not331 = icmp eq i32 %42, 0
  br i1 %.not331, label %.critedge423, label %43, !prof !28

43:                                               ; preds = %41
  %44 = tail call zeroext i1 @is_frozen(ptr noundef nonnull %6, ptr noundef nonnull %27) #10
  br i1 %44, label %.critedge423, label %45, !prof !20

45:                                               ; preds = %43
  %46 = getelementptr inbounds i8, ptr %6, i64 80
  %47 = load ptr, ptr %46, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %47, ptr noundef nonnull @.str.33, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 414) #8
  unreachable

.critedge423:                                     ; preds = %29, %43, %41, %.thread
  %.pre517 = phi i8 [ %7, %.thread ], [ %30, %41 ], [ %30, %43 ], [ %30, %29 ]
  %48 = phi i1 [ %21, %.thread ], [ true, %41 ], [ true, %43 ], [ true, %29 ]
  %49 = and i32 %3, 32768
  %.not332 = icmp eq i32 %49, 0
  br i1 %.not332, label %74, label %50

50:                                               ; preds = %.critedge423
  %51 = and i8 %.pre517, 1
  %.not364 = icmp eq i8 %51, 0
  %.not365506 = icmp eq ptr %6, null
  %or.cond = select i1 %.not364, i1 true, i1 %.not365506
  br i1 %or.cond, label %.critedge432, label %.lr.ph, !prof !29

.lr.ph:                                           ; preds = %50
  %52 = getelementptr inbounds i8, ptr %6, i64 536
  br label %53

53:                                               ; preds = %.lr.ph, %.critedge428
  %54 = phi i8 [ %.pre517, %.lr.ph ], [ %71, %.critedge428 ]
  %.0303507 = phi ptr [ %6, %.lr.ph ], [ %73, %.critedge428 ]
  %55 = and i8 %54, 1
  %.not412 = icmp eq i8 %55, 0
  br i1 %.not412, label %.critedge428, label %56, !prof !15

56:                                               ; preds = %53
  %57 = load ptr, ptr %52, align 8, !tbaa !30
  %.not413 = icmp eq ptr %57, null
  br i1 %.not413, label %.critedge426.thread549, label %58

58:                                               ; preds = %56
  %59 = tail call i64 @spill_search(ptr noundef nonnull %.0303507, i32 noundef %1)
  %.not414 = icmp eq i64 %59, 0
  br i1 %.not414, label %.critedge426, label %60, !prof !20

60:                                               ; preds = %58
  %61 = getelementptr inbounds i8, ptr %6, i64 80
  %62 = load ptr, ptr %61, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %62, ptr noundef nonnull @.str.34, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 420) #8
  unreachable

.critedge426:                                     ; preds = %58
  %.pre518 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %.pre541 = and i8 %.pre518, 1
  %.not415 = icmp eq i8 %.pre541, 0
  br i1 %.not415, label %.critedge428, label %.critedge426.thread549, !prof !31

.critedge426.thread549:                           ; preds = %56, %.critedge426
  %63 = phi i8 [ %.pre518, %.critedge426 ], [ %54, %56 ]
  %64 = getelementptr inbounds i8, ptr %.0303507, i64 496
  %65 = load ptr, ptr %64, align 8, !tbaa !30
  %.not416 = icmp eq ptr %65, null
  br i1 %.not416, label %.critedge428, label %66

66:                                               ; preds = %.critedge426.thread549
  %67 = tail call ptr @debug_dpl_find(ptr noundef nonnull %.0303507, i32 noundef %1) #9
  %.not417 = icmp eq ptr %67, null
  %.pre = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  br i1 %.not417, label %.critedge428, label %68, !prof !20

68:                                               ; preds = %66
  %69 = getelementptr inbounds i8, ptr %6, i64 80
  %70 = load ptr, ptr %69, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %70, ptr noundef nonnull @.str.35, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 421) #8
  unreachable

.critedge428:                                     ; preds = %53, %.critedge426.thread549, %.critedge426, %66
  %71 = phi i8 [ %63, %.critedge426.thread549 ], [ %.pre518, %.critedge426 ], [ %.pre, %66 ], [ %54, %53 ]
  %72 = getelementptr inbounds i8, ptr %.0303507, i64 24
  %73 = load ptr, ptr %72, align 8, !tbaa !32
  %.not365 = icmp eq ptr %73, null
  br i1 %.not365, label %.critedge432, label %53, !llvm.loop !33

74:                                               ; preds = %.critedge423
  br i1 %48, label %75, label %.thread552

75:                                               ; preds = %74
  %76 = getelementptr inbounds i8, ptr %6, i64 496
  %77 = load ptr, ptr %76, align 8, !tbaa !30
  %.not333 = icmp eq ptr %77, null
  br i1 %.not333, label %.thread552, label %78

78:                                               ; preds = %75
  %79 = tail call i64 @dpl_exist(ptr noundef nonnull %6, i32 noundef %1) #10
  %.not358 = icmp eq i64 %79, 0
  br i1 %.not358, label %90, label %80

80:                                               ; preds = %78
  %81 = getelementptr inbounds i8, ptr %77, i64 32
  %82 = getelementptr inbounds [18 x %struct.dp], ptr %81, i64 0, i64 %79
  %83 = load ptr, ptr %82, align 8, !tbaa !35
  %84 = and i8 %.pre517, 1
  %.not363 = icmp eq i8 %84, 0
  br i1 %.not363, label %.critedge432, label %85, !prof !15

85:                                               ; preds = %80
  %86 = tail call zeroext i1 @is_modifable(ptr noundef nonnull %6, ptr noundef %83) #10
  br i1 %86, label %.critedge432, label %87, !prof !20

87:                                               ; preds = %85
  %88 = getelementptr inbounds i8, ptr %6, i64 80
  %89 = load ptr, ptr %88, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %89, ptr noundef nonnull @.str.36, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 428) #8
  unreachable

90:                                               ; preds = %78
  %91 = tail call i64 @spill_search(ptr noundef nonnull %6, i32 noundef %1)
  %.not359 = icmp eq i64 %91, 0
  br i1 %.not359, label %.preheader500, label %.critedge432

.preheader500:                                    ; preds = %90, %94
  %.pn = phi ptr [ %.0302, %94 ], [ %6, %90 ]
  %.0302.in = getelementptr inbounds i8, ptr %.pn, i64 24
  %.0302 = load ptr, ptr %.0302.in, align 8, !tbaa !32
  %.not360 = icmp eq ptr %.0302, null
  br i1 %.not360, label %.critedge432.loopexit, label %92

92:                                               ; preds = %.preheader500
  %93 = tail call i64 @dpl_exist(ptr noundef nonnull %.0302, i32 noundef %1) #10
  %.not361 = icmp eq i64 %93, 0
  br i1 %.not361, label %94, label %.critedge432.loopexit

94:                                               ; preds = %92
  %95 = tail call i64 @spill_search(ptr noundef nonnull %.0302, i32 noundef %1)
  %.not362 = icmp eq i64 %95, 0
  br i1 %.not362, label %.preheader500, label %.critedge432.loopexit, !llvm.loop !37

.thread552:                                       ; preds = %22, %74, %75
  %.not578 = phi i1 [ true, %74 ], [ false, %75 ], [ true, %22 ]
  %96 = getelementptr inbounds i8, ptr %6, i64 72
  %97 = load i64, ptr %96, align 8, !tbaa !27
  %98 = tail call { ptr, i32 } @page_get_any(ptr noundef nonnull %0, i32 noundef %1, i64 noundef %97) #9
  %99 = extractvalue { ptr, i32 } %98, 1
  %.not334 = icmp eq i32 %99, 0
  br i1 %.not334, label %100, label %.critedge424, !prof !20

100:                                              ; preds = %.thread552
  %101 = extractvalue { ptr, i32 } %98, 0
  %102 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %103 = and i8 %102, 1
  %.not335 = icmp eq i8 %103, 0
  %brmerge457.not.not579 = or i1 %.not578, %.not335
  %104 = getelementptr inbounds i8, ptr %101, i64 10
  %105 = load i16, ptr %104, align 1, !tbaa !18
  %106 = zext i16 %105 to i32
  %107 = icmp eq i32 %106, %3
  %or.cond576 = select i1 %brmerge457.not.not579, i1 true, i1 %107
  br i1 %or.cond576, label %.critedge419.thread, label %108, !prof !38

108:                                              ; preds = %100
  %109 = getelementptr inbounds i8, ptr %6, i64 80
  %110 = load ptr, ptr %109, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %110, ptr noundef nonnull @.str.37, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 454) #8
  unreachable

.critedge419.thread:                              ; preds = %100, %14, %.critedge419
  %111 = phi i8 [ %7, %.critedge419 ], [ %7, %14 ], [ %102, %100 ]
  %.1298 = phi i32 [ %3, %.critedge419 ], [ %3, %14 ], [ %106, %100 ]
  %.1295 = phi ptr [ %2, %.critedge419 ], [ %2, %14 ], [ %101, %100 ]
  %112 = tail call zeroext i1 @is_frozen(ptr noundef %6, ptr noundef nonnull %.1295) #10
  br i1 %112, label %113, label %143

113:                                              ; preds = %.critedge419.thread
  %114 = and i8 %111, 1
  %.not350 = icmp eq i8 %114, 0
  br i1 %.not350, label %.critedge432, label %115, !prof !15

115:                                              ; preds = %113
  %116 = tail call zeroext i1 @is_modifable(ptr noundef %6, ptr noundef nonnull %.1295) #10
  br i1 %116, label %117, label %120, !prof !15

117:                                              ; preds = %115
  %118 = getelementptr inbounds i8, ptr %6, i64 80
  %119 = load ptr, ptr %118, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %119, ptr noundef nonnull @.str.38, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 460) #8
  unreachable

120:                                              ; preds = %115
  %121 = tail call zeroext i1 @is_spilled(ptr noundef %6, ptr noundef nonnull %.1295) #10
  br i1 %121, label %122, label %125, !prof !15

122:                                              ; preds = %120
  %123 = getelementptr inbounds i8, ptr %6, i64 80
  %124 = load ptr, ptr %123, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %124, ptr noundef nonnull @.str.39, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 461) #8
  unreachable

125:                                              ; preds = %120
  %126 = tail call zeroext i1 @is_shadowed(ptr noundef %6, ptr noundef nonnull %.1295) #10
  br i1 %126, label %127, label %130, !prof !15

127:                                              ; preds = %125
  %128 = getelementptr inbounds i8, ptr %6, i64 80
  %129 = load ptr, ptr %128, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %129, ptr noundef nonnull @.str.40, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 462) #8
  unreachable

130:                                              ; preds = %125
  %131 = tail call ptr @debug_dpl_find(ptr noundef %6, i32 noundef %1) #9
  %.not354 = icmp eq ptr %131, null
  br i1 %.not354, label %.thread479, label %132, !prof !20

132:                                              ; preds = %130
  %133 = getelementptr inbounds i8, ptr %6, i64 80
  %134 = load ptr, ptr %133, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %134, ptr noundef nonnull @.str.41, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 463) #8
  unreachable

.thread479:                                       ; preds = %130
  %.pre521 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %.pre531 = and i8 %.pre521, 1
  %.not355 = icmp eq i8 %.pre531, 0
  br i1 %.not355, label %.critedge432, label %135, !prof !31

135:                                              ; preds = %.thread479
  %136 = getelementptr inbounds i8, ptr %6, i64 536
  %137 = load ptr, ptr %136, align 8, !tbaa !30
  %.not356 = icmp eq ptr %137, null
  br i1 %.not356, label %.critedge432, label %138

138:                                              ; preds = %135
  %139 = tail call i64 @spill_search(ptr noundef nonnull %6, i32 noundef %1)
  %.not357 = icmp eq i64 %139, 0
  br i1 %.not357, label %.critedge432, label %140, !prof !20

140:                                              ; preds = %138
  %141 = getelementptr inbounds i8, ptr %6, i64 80
  %142 = load ptr, ptr %141, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %142, ptr noundef nonnull @.str.42, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 464) #8
  unreachable

143:                                              ; preds = %.critedge419.thread
  %144 = tail call zeroext i1 @is_modifable(ptr noundef %6, ptr noundef nonnull %.1295) #10
  br i1 %144, label %145, label %169

145:                                              ; preds = %143
  %146 = getelementptr inbounds i8, ptr %6, i64 496
  %147 = load ptr, ptr %146, align 8, !tbaa !30
  %.not344 = icmp eq ptr %147, null
  br i1 %.not344, label %150, label %148

148:                                              ; preds = %145
  %149 = tail call i64 @dpl_exist(ptr noundef nonnull %6, i32 noundef %1) #10
  br label %150

150:                                              ; preds = %145, %148
  %.0300 = phi i64 [ %149, %148 ], [ 0, %145 ]
  %151 = and i8 %111, 1
  %.not345 = icmp eq i8 %151, 0
  br i1 %.not345, label %.critedge432, label %152, !prof !15

152:                                              ; preds = %150
  %153 = getelementptr inbounds i8, ptr %6, i64 4
  %154 = load i32, ptr %153, align 4, !tbaa !39
  %155 = and i32 %154, 524288
  %.not346 = icmp eq i32 %155, 0
  br i1 %.not346, label %156, label %161

156:                                              ; preds = %152
  %157 = tail call zeroext i1 @is_spilled(ptr noundef nonnull %6, ptr noundef nonnull %.1295) #10
  br i1 %157, label %158, label %161, !prof !15

158:                                              ; preds = %156
  %159 = getelementptr inbounds i8, ptr %6, i64 80
  %160 = load ptr, ptr %159, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %160, ptr noundef nonnull @.str.43, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 469) #8
  unreachable

161:                                              ; preds = %152, %156
  %162 = getelementptr inbounds i8, ptr %6, i64 536
  %163 = load ptr, ptr %162, align 8, !tbaa !30
  %.not348 = icmp eq ptr %163, null
  br i1 %.not348, label %.critedge432, label %164

164:                                              ; preds = %161
  %165 = tail call i64 @spill_search(ptr noundef nonnull %6, i32 noundef %1)
  %.not349 = icmp eq i64 %165, 0
  br i1 %.not349, label %.critedge432, label %166, !prof !20

166:                                              ; preds = %164
  %167 = getelementptr inbounds i8, ptr %6, i64 80
  %168 = load ptr, ptr %167, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %168, ptr noundef nonnull @.str.42, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 470) #8
  unreachable

169:                                              ; preds = %143
  %170 = tail call zeroext i1 @is_shadowed(ptr noundef %6, ptr noundef nonnull %.1295) #10
  %171 = and i8 %111, 1
  %.not339 = icmp eq i8 %171, 0
  br i1 %170, label %172, label %185

172:                                              ; preds = %169
  br i1 %.not339, label %.critedge432, label %173, !prof !15

173:                                              ; preds = %172
  %174 = getelementptr inbounds i8, ptr %6, i64 536
  %175 = load ptr, ptr %174, align 8, !tbaa !30
  %.not340 = icmp eq ptr %175, null
  br i1 %.not340, label %.critedge438.thread558, label %176

176:                                              ; preds = %173
  %177 = tail call i64 @spill_search(ptr noundef nonnull %6, i32 noundef %1)
  %.not341 = icmp eq i64 %177, 0
  br i1 %.not341, label %.critedge438, label %178, !prof !20

178:                                              ; preds = %176
  %179 = getelementptr inbounds i8, ptr %6, i64 80
  %180 = load ptr, ptr %179, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %180, ptr noundef nonnull @.str.42, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 473) #8
  unreachable

.critedge438:                                     ; preds = %176
  %.pre520 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %.pre539 = and i8 %.pre520, 1
  %.not342 = icmp eq i8 %.pre539, 0
  br i1 %.not342, label %.critedge432, label %.critedge438.thread558, !prof !31

.critedge438.thread558:                           ; preds = %173, %.critedge438
  %181 = tail call ptr @debug_dpl_find(ptr noundef nonnull %6, i32 noundef %1) #9
  %.not343 = icmp eq ptr %181, null
  br i1 %.not343, label %.critedge432, label %182, !prof !20

182:                                              ; preds = %.critedge438.thread558
  %183 = getelementptr inbounds i8, ptr %6, i64 80
  %184 = load ptr, ptr %183, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %184, ptr noundef nonnull @.str.41, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 474) #8
  unreachable

185:                                              ; preds = %169
  br i1 %.not339, label %191, label %186, !prof !15

186:                                              ; preds = %185
  %187 = tail call zeroext i1 @is_spilled(ptr noundef %6, ptr noundef nonnull %.1295) #10
  br i1 %187, label %191, label %188, !prof !20

188:                                              ; preds = %186
  %189 = getelementptr inbounds i8, ptr %6, i64 80
  %190 = load ptr, ptr %189, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %190, ptr noundef nonnull @.str.11, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 476) #8
  unreachable

191:                                              ; preds = %186, %185
  %192 = tail call i64 @spill_search(ptr noundef %6, i32 noundef %1)
  %193 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %194 = and i8 %193, 1
  %.not337 = icmp eq i8 %194, 0
  br i1 %.not337, label %.critedge432, label %195, !prof !15

195:                                              ; preds = %191
  %196 = tail call ptr @debug_dpl_find(ptr noundef %6, i32 noundef %1) #9
  %.not338 = icmp eq ptr %196, null
  br i1 %.not338, label %.critedge432, label %197, !prof !20

197:                                              ; preds = %195
  %198 = getelementptr inbounds i8, ptr %6, i64 80
  %199 = load ptr, ptr %198, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %199, ptr noundef nonnull @.str.41, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 479) #8
  unreachable

.critedge432.loopexit:                            ; preds = %.preheader500, %92, %94
  %.ph514 = phi i1 [ false, %.preheader500 ], [ false, %94 ], [ true, %92 ]
  %.not410.ph = phi i1 [ false, %.preheader500 ], [ true, %94 ], [ false, %92 ]
  %.not408.ph = xor i1 %.not360, true
  br label %.critedge432

.critedge432:                                     ; preds = %.critedge428, %172, %113, %.critedge432.loopexit, %150, %161, %135, %90, %80, %85, %138, %.thread479, %.critedge438.thread558, %.critedge438, %195, %191, %164, %50
  %200 = phi i1 [ true, %50 ], [ true, %138 ], [ true, %.thread479 ], [ false, %164 ], [ false, %.critedge438.thread558 ], [ false, %.critedge438 ], [ false, %195 ], [ false, %191 ], [ false, %85 ], [ false, %80 ], [ false, %90 ], [ true, %135 ], [ false, %161 ], [ false, %150 ], [ %.not360, %.critedge432.loopexit ], [ true, %113 ], [ false, %172 ], [ true, %.critedge428 ]
  %201 = phi i1 [ false, %50 ], [ false, %138 ], [ false, %.thread479 ], [ true, %164 ], [ false, %.critedge438.thread558 ], [ false, %.critedge438 ], [ false, %195 ], [ false, %191 ], [ true, %85 ], [ true, %80 ], [ false, %90 ], [ false, %135 ], [ true, %161 ], [ true, %150 ], [ false, %.critedge432.loopexit ], [ false, %113 ], [ false, %172 ], [ false, %.critedge428 ]
  %202 = phi i1 [ false, %50 ], [ false, %138 ], [ false, %.thread479 ], [ false, %164 ], [ true, %.critedge438.thread558 ], [ true, %.critedge438 ], [ false, %195 ], [ false, %191 ], [ false, %85 ], [ false, %80 ], [ false, %90 ], [ false, %135 ], [ false, %161 ], [ false, %150 ], [ %.ph514, %.critedge432.loopexit ], [ false, %113 ], [ true, %172 ], [ false, %.critedge428 ]
  %.not410 = phi i1 [ false, %50 ], [ false, %138 ], [ false, %.thread479 ], [ false, %164 ], [ false, %.critedge438.thread558 ], [ false, %.critedge438 ], [ true, %195 ], [ true, %191 ], [ false, %85 ], [ false, %80 ], [ true, %90 ], [ false, %135 ], [ false, %161 ], [ false, %150 ], [ %.not410.ph, %.critedge432.loopexit ], [ false, %113 ], [ false, %172 ], [ false, %.critedge428 ]
  %.not408 = phi i1 [ false, %50 ], [ false, %138 ], [ false, %.thread479 ], [ false, %164 ], [ true, %.critedge438.thread558 ], [ true, %.critedge438 ], [ true, %195 ], [ true, %191 ], [ false, %85 ], [ false, %80 ], [ true, %90 ], [ false, %135 ], [ false, %161 ], [ false, %150 ], [ %.not408.ph, %.critedge432.loopexit ], [ false, %113 ], [ true, %172 ], [ false, %.critedge428 ]
  %.0309 = phi i64 [ 0, %50 ], [ 0, %138 ], [ 0, %.thread479 ], [ 0, %164 ], [ 0, %.critedge438.thread558 ], [ 0, %.critedge438 ], [ %192, %195 ], [ %192, %191 ], [ 0, %85 ], [ 0, %80 ], [ %91, %90 ], [ 0, %135 ], [ 0, %161 ], [ 0, %150 ], [ 0, %.critedge432.loopexit ], [ 0, %113 ], [ 0, %172 ], [ 0, %.critedge428 ]
  %.1301 = phi i64 [ 0, %50 ], [ 0, %138 ], [ 0, %.thread479 ], [ %.0300, %164 ], [ 0, %.critedge438.thread558 ], [ 0, %.critedge438 ], [ 0, %195 ], [ 0, %191 ], [ %79, %85 ], [ %79, %80 ], [ 0, %90 ], [ 0, %135 ], [ %.0300, %161 ], [ %.0300, %150 ], [ 0, %.critedge432.loopexit ], [ 0, %113 ], [ 0, %172 ], [ 0, %.critedge428 ]
  %.2299 = phi i32 [ %3, %50 ], [ %.1298, %138 ], [ %.1298, %.thread479 ], [ %.1298, %164 ], [ %.1298, %.critedge438.thread558 ], [ %.1298, %.critedge438 ], [ %.1298, %195 ], [ %.1298, %191 ], [ %3, %85 ], [ %3, %80 ], [ %3, %90 ], [ %.1298, %135 ], [ %.1298, %161 ], [ %.1298, %150 ], [ %3, %.critedge432.loopexit ], [ %.1298, %113 ], [ %.1298, %172 ], [ %3, %.critedge428 ]
  %.2296 = phi ptr [ null, %50 ], [ %.1295, %138 ], [ %.1295, %.thread479 ], [ %.1295, %164 ], [ %.1295, %.critedge438.thread558 ], [ %.1295, %.critedge438 ], [ %.1295, %195 ], [ %.1295, %191 ], [ %83, %85 ], [ %83, %80 ], [ null, %90 ], [ %.1295, %135 ], [ %.1295, %161 ], [ %.1295, %150 ], [ %2, %.critedge432.loopexit ], [ %.1295, %113 ], [ %.1295, %172 ], [ %2, %.critedge428 ]
  %203 = and i32 %.2299, 4
  %204 = icmp eq i32 %203, 0
  %205 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %206 = and i8 %205, 1
  br i1 %204, label %207, label %268, !prof !20

207:                                              ; preds = %.critedge432
  %208 = and i32 %.2299, 1
  %.not375 = icmp eq i32 %208, 0
  %.not368 = icmp eq i8 %206, 0
  br i1 %.not368, label %216, label %209, !prof !15

209:                                              ; preds = %207
  %210 = lshr i32 %.2299, 1
  %.lobit369 = xor i32 %210, %.2299
  %211 = and i32 %.lobit369, 1
  %.not370 = icmp eq i32 %211, 0
  br i1 %.not370, label %212, label %216, !prof !15

212:                                              ; preds = %209
  %213 = load ptr, ptr %5, align 8, !tbaa !5
  %214 = getelementptr inbounds i8, ptr %213, i64 80
  %215 = load ptr, ptr %214, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %215, ptr noundef nonnull @.str.44, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 486) #8
  unreachable

216:                                              ; preds = %209, %207
  %217 = getelementptr inbounds i8, ptr %0, i64 4
  %218 = load i8, ptr %217, align 4, !tbaa !30
  %219 = and i8 %218, 1
  %.not371 = icmp eq i8 %219, 0
  br i1 %.not371, label %244, label %220, !prof !20

220:                                              ; preds = %216
  %221 = tail call ptr @outer_tree(ptr noundef nonnull %0)
  %222 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %223 = and i8 %222, 1
  %.not372 = icmp eq i8 %223, 0
  %brmerge458 = or i1 %.not375, %.not372
  %224 = getelementptr inbounds i8, ptr %221, i64 12
  %225 = load i32, ptr %224, align 4, !tbaa !40
  br i1 %brmerge458, label %.critedge440, label %226, !prof !29

226:                                              ; preds = %220
  %.not495 = icmp eq i32 %225, 0
  br i1 %.not495, label %228, label %.critedge440.thread, !prof !15

.critedge440.thread:                              ; preds = %226
  %227 = sub nuw i32 %225, %208
  store i32 %227, ptr %224, align 4, !tbaa !40
  br label %.critedge442

228:                                              ; preds = %226
  %229 = load ptr, ptr %5, align 8, !tbaa !5
  %230 = getelementptr inbounds i8, ptr %229, i64 80
  %231 = load ptr, ptr %230, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %231, ptr noundef nonnull @.str.45, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 489) #8
  unreachable

.critedge440:                                     ; preds = %220
  %232 = sub i32 %225, %208
  store i32 %232, ptr %224, align 4, !tbaa !40
  %.not375.not = xor i1 %.not375, true
  %brmerge459 = or i1 %.not372, %.not375.not
  br i1 %brmerge459, label %.critedge442, label %233, !prof !42

233:                                              ; preds = %.critedge440
  %234 = getelementptr inbounds i8, ptr %221, i64 16
  %235 = load i32, ptr %234, align 4, !tbaa !43
  %.not496 = icmp eq i32 %235, 0
  br i1 %.not496, label %236, label %.critedge442, !prof !15

236:                                              ; preds = %233
  %237 = load ptr, ptr %5, align 8, !tbaa !5
  %238 = getelementptr inbounds i8, ptr %237, i64 80
  %239 = load ptr, ptr %238, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %239, ptr noundef nonnull @.str.46, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 491) #8
  unreachable

.critedge442:                                     ; preds = %.critedge440.thread, %.critedge440, %233
  %240 = xor i32 %208, 1
  %241 = getelementptr inbounds i8, ptr %221, i64 16
  %242 = load i32, ptr %241, align 4, !tbaa !43
  %243 = sub i32 %242, %240
  store i32 %243, ptr %241, align 4, !tbaa !43
  br label %244

244:                                              ; preds = %216, %.critedge442
  %.pre-phi533 = phi i8 [ %206, %216 ], [ %223, %.critedge442 ]
  %245 = phi i8 [ %205, %216 ], [ %222, %.critedge442 ]
  %.not374 = icmp eq i8 %.pre-phi533, 0
  %brmerge460 = or i1 %.not375, %.not374
  %246 = getelementptr inbounds i8, ptr %0, i64 24
  %247 = load ptr, ptr %246, align 8, !tbaa !44
  %248 = getelementptr inbounds i8, ptr %247, i64 12
  %249 = load i32, ptr %248, align 4, !tbaa !40
  br i1 %brmerge460, label %.critedge444, label %250, !prof !29

250:                                              ; preds = %244
  %.not497 = icmp eq i32 %249, 0
  br i1 %.not497, label %252, label %.critedge444.thread, !prof !15

.critedge444.thread:                              ; preds = %250
  %251 = sub nuw i32 %249, %208
  store i32 %251, ptr %248, align 4, !tbaa !40
  br label %.critedge446

252:                                              ; preds = %250
  %253 = load ptr, ptr %5, align 8, !tbaa !5
  %254 = getelementptr inbounds i8, ptr %253, i64 80
  %255 = load ptr, ptr %254, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %255, ptr noundef nonnull @.str.47, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 494) #8
  unreachable

.critedge444:                                     ; preds = %244
  %256 = sub i32 %249, %208
  store i32 %256, ptr %248, align 4, !tbaa !40
  %.not375.not461 = xor i1 %.not375, true
  %brmerge462 = or i1 %.not374, %.not375.not461
  br i1 %brmerge462, label %.critedge446, label %257, !prof !45

257:                                              ; preds = %.critedge444
  %258 = getelementptr inbounds i8, ptr %247, i64 16
  %259 = load i32, ptr %258, align 4, !tbaa !43
  %.not498 = icmp eq i32 %259, 0
  br i1 %.not498, label %260, label %.critedge446, !prof !15

260:                                              ; preds = %257
  %261 = load ptr, ptr %5, align 8, !tbaa !5
  %262 = getelementptr inbounds i8, ptr %261, i64 80
  %263 = load ptr, ptr %262, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %263, ptr noundef nonnull @.str.48, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 496) #8
  unreachable

.critedge446:                                     ; preds = %.critedge444.thread, %.critedge444, %257
  %264 = xor i32 %208, 1
  %265 = getelementptr inbounds i8, ptr %247, i64 16
  %266 = load i32, ptr %265, align 4, !tbaa !43
  %267 = sub i32 %266, %264
  store i32 %267, ptr %265, align 4, !tbaa !43
  br label %278

268:                                              ; preds = %.critedge432
  %269 = getelementptr inbounds i8, ptr %.2296, i64 12
  %270 = load i32, ptr %269, align 1, !tbaa !30
  %.not366 = icmp ne i8 %206, 0
  %.phi.trans.insert523 = getelementptr inbounds i8, ptr %0, i64 24
  %.pre524 = load ptr, ptr %.phi.trans.insert523, align 8, !tbaa !44
  %.phi.trans.insert525 = getelementptr inbounds i8, ptr %.pre524, i64 20
  %.pre526 = load i32, ptr %.phi.trans.insert525, align 4, !tbaa !46
  %.not367 = icmp ult i32 %.pre526, %270
  %or.cond577 = select i1 %.not366, i1 %.not367, i1 false
  br i1 %or.cond577, label %271, label %._crit_edge522, !prof !47

271:                                              ; preds = %268
  %272 = load ptr, ptr %5, align 8, !tbaa !5
  %273 = getelementptr inbounds i8, ptr %272, i64 80
  %274 = load ptr, ptr %273, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %274, ptr noundef nonnull @.str.49, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 500) #8
  unreachable

._crit_edge522:                                   ; preds = %268
  %275 = zext i32 %270 to i64
  %276 = getelementptr inbounds i8, ptr %.pre524, i64 20
  %277 = sub i32 %.pre526, %270
  store i32 %277, ptr %276, align 4, !tbaa !46
  br label %278

278:                                              ; preds = %._crit_edge522, %.critedge446
  %279 = phi i8 [ %245, %.critedge446 ], [ %205, %._crit_edge522 ]
  %.0310 = phi i64 [ 1, %.critedge446 ], [ %275, %._crit_edge522 ]
  br i1 %200, label %.loopexit, label %293

.loopexit:                                        ; preds = %435, %437, %278
  %280 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !48
  %281 = icmp ugt i8 %280, 4
  br i1 %281, label %282, label %283, !prof !15

282:                                              ; preds = %.loopexit
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 506, ptr noundef nonnull @.str.50, i64 noundef %.0310, i32 noundef %1) #9
  br label %283

283:                                              ; preds = %282, %.loopexit
  %284 = getelementptr inbounds i8, ptr %6, i64 504
  %285 = tail call i32 @pnl_append_span(ptr noundef nonnull %284, i32 noundef %1, i64 noundef %.0310) #9
  %286 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %287 = and i8 %286, 1
  %.not411 = icmp eq i8 %287, 0
  br i1 %.not411, label %.critedge424, label %288, !prof !15

288:                                              ; preds = %283
  %289 = tail call zeroext i1 @dpl_check(ptr noundef %6) #9
  br i1 %289, label %.critedge424, label %290, !prof !20

290:                                              ; preds = %288
  %291 = getelementptr inbounds i8, ptr %6, i64 80
  %292 = load ptr, ptr %291, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %292, ptr noundef nonnull @.str.51, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 508) #8
  unreachable

293:                                              ; preds = %278
  %294 = zext i32 %1 to i64
  %295 = add nuw nsw i64 %.0310, %294
  %296 = getelementptr inbounds i8, ptr %6, i64 56
  %297 = load i32, ptr %296, align 8, !tbaa !30
  %298 = zext i32 %297 to i64
  %299 = icmp eq i64 %295, %298
  br i1 %299, label %300, label %343, !prof !15

300:                                              ; preds = %293
  br i1 %201, label %301, label %302

301:                                              ; preds = %300
  tail call void @page_wash(ptr noundef nonnull %6, i64 noundef %.1301, ptr noundef %.2296, i64 noundef %.0310)
  br label %.thread485.thread

302:                                              ; preds = %300
  %.not397 = icmp eq i64 %.0309, 0
  %303 = and i8 %279, 1
  br i1 %.not397, label %309, label %304

304:                                              ; preds = %302
  %.not409 = icmp eq i8 %303, 0
  %or.cond447 = or i1 %.not410, %.not409
  br i1 %or.cond447, label %308, label %305, !prof !49

305:                                              ; preds = %304
  %306 = getelementptr inbounds i8, ptr %6, i64 80
  %307 = load ptr, ptr %306, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %307, ptr noundef nonnull @.str.54, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 529) #8
  unreachable

308:                                              ; preds = %304
  tail call void @spill_remove(ptr noundef nonnull %6, i64 noundef %.0309, i64 noundef %.0310) #9
  br label %.thread485.thread

309:                                              ; preds = %302
  %310 = icmp ne i8 %303, 0
  %311 = icmp ne ptr %.2296, null
  %or.cond4 = select i1 %310, i1 %311, i1 false
  br i1 %or.cond4, label %.preheader, label %.thread485, !prof !50

.preheader:                                       ; preds = %309, %320
  %.pn400 = phi ptr [ %.0289, %320 ], [ %6, %309 ]
  %.0289.in = getelementptr inbounds i8, ptr %.pn400, i64 24
  %.0289 = load ptr, ptr %.0289.in, align 8, !tbaa !32
  %.not398.not = icmp eq ptr %.0289, null
  br i1 %.not398.not, label %329, label %312

312:                                              ; preds = %.preheader
  %313 = tail call i64 @spill_search(ptr noundef nonnull %.0289, i32 noundef %1)
  %.not399 = icmp eq i64 %313, 0
  br i1 %.not399, label %320, label %314

314:                                              ; preds = %312
  %315 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %316 = and i8 %315, 1
  %.not403 = icmp eq i8 %316, 0
  %or.cond448 = or i1 %.not410, %.not403
  br i1 %or.cond448, label %.thread485, label %317, !prof !49

317:                                              ; preds = %314
  %318 = getelementptr inbounds i8, ptr %6, i64 80
  %319 = load ptr, ptr %318, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %319, ptr noundef nonnull @.str.54, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 541) #8
  unreachable

320:                                              ; preds = %312
  %321 = tail call ptr @debug_dpl_find(ptr noundef nonnull %.0289, i32 noundef %1) #9
  %322 = icmp eq ptr %.2296, %321
  br i1 %322, label %323, label %.preheader, !llvm.loop !51

323:                                              ; preds = %320
  %324 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %325 = and i8 %324, 1
  %.not401 = icmp eq i8 %325, 0
  %or.cond449 = or i1 %202, %.not401
  br i1 %or.cond449, label %.thread485, label %326, !prof !49

326:                                              ; preds = %323
  %327 = getelementptr inbounds i8, ptr %6, i64 80
  %328 = load ptr, ptr %327, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %328, ptr noundef nonnull @.str.58, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 546) #8
  unreachable

329:                                              ; preds = %.preheader
  %330 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %331 = and i8 %330, 1
  %.not405 = icmp eq i8 %331, 0
  br i1 %.not405, label %.thread485.thread, label %332, !prof !52

332:                                              ; preds = %329
  %333 = getelementptr inbounds i8, ptr %6, i64 80
  %334 = load ptr, ptr %333, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %334, ptr noundef nonnull @.str.59, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 550) #8
  unreachable

.thread485:                                       ; preds = %314, %323, %309
  %.pre-phi534 = phi i8 [ %316, %314 ], [ %325, %323 ], [ %303, %309 ]
  %.1 = phi ptr [ @.str.56, %314 ], [ @.str.57, %323 ], [ @.str.55, %309 ]
  %.not407 = icmp eq i8 %.pre-phi534, 0
  %or.cond450 = or i1 %.not408, %.not407
  br i1 %or.cond450, label %.thread485.thread, label %335, !prof !53

335:                                              ; preds = %.thread485
  %336 = getelementptr inbounds i8, ptr %6, i64 80
  %337 = load ptr, ptr %336, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %337, ptr noundef nonnull @.str.60, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 552) #8
  unreachable

.thread485.thread:                                ; preds = %329, %301, %.thread485, %308
  %.2 = phi ptr [ @.str.52, %301 ], [ @.str.53, %308 ], [ %.1, %.thread485 ], [ null, %329 ]
  %338 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !48
  %339 = icmp ugt i8 %338, 4
  br i1 %339, label %340, label %341, !prof !15

340:                                              ; preds = %.thread485.thread
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 554, ptr noundef nonnull @.str.61, i64 noundef %.0310, ptr noundef %.2, i32 noundef %1) #9
  br label %341

341:                                              ; preds = %340, %.thread485.thread
  store i32 %1, ptr %296, align 8, !tbaa !30
  %342 = tail call zeroext i1 @txn_refund(ptr noundef %6) #9
  br label %.critedge424

343:                                              ; preds = %293
  br i1 %201, label %344, label %432

344:                                              ; preds = %343
  %345 = icmp eq i64 %.0310, 1
  br i1 %345, label %346, label %.critedge452.preheader, !prof !20

346:                                              ; preds = %344
  %347 = tail call zeroext i1 @suitable4loose(ptr noundef nonnull %6, i32 noundef %1)
  br i1 %347, label %348, label %.critedge452.preheader, !prof !20

.critedge452.preheader:                           ; preds = %344, %349, %346
  br label %.critedge452

348:                                              ; preds = %346
  %.not390 = icmp eq i64 %.1301, 0
  br i1 %.not390, label %349, label %352

349:                                              ; preds = %348
  %350 = getelementptr inbounds i8, ptr %6, i64 496
  %351 = load ptr, ptr %350, align 8, !tbaa !30
  %.not391 = icmp eq ptr %351, null
  br i1 %.not391, label %352, label %.critedge452.preheader

352:                                              ; preds = %348, %349
  %353 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !48
  %354 = icmp ugt i8 %353, 4
  br i1 %354, label %355, label %356, !prof !15

355:                                              ; preds = %352
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 564, ptr noundef nonnull @.str.62, i32 noundef %1) #9
  br label %356

356:                                              ; preds = %355, %352
  %357 = tail call ptr @page_data(ptr noundef %.2296) #10
  %358 = getelementptr inbounds i8, ptr %6, i64 80
  %359 = load ptr, ptr %358, align 8, !tbaa !21
  %360 = getelementptr inbounds i8, ptr %359, i64 8
  %361 = load i32, ptr %360, align 8, !tbaa !54
  %362 = add i32 %361, -20
  %363 = zext i32 %362 to i64
  tail call void @llvm.memset.p0.i64(ptr align 1 %357, i8 -1, i64 %363, i1 false)
  store i64 -1, ptr %.2296, align 1, !tbaa !63
  %364 = getelementptr inbounds i8, ptr %.2296, i64 10
  store i16 16384, ptr %364, align 1, !tbaa !18
  %365 = getelementptr inbounds i8, ptr %6, i64 512
  %366 = load ptr, ptr %365, align 8, !tbaa !30
  %367 = getelementptr inbounds i8, ptr %.2296, i64 20
  %368 = ptrtoint ptr %367 to i64
  %369 = add nsw i64 %368, 4
  %370 = inttoptr i64 %369 to ptr
  store ptr %366, ptr %370, align 8, !tbaa !64
  store ptr %.2296, ptr %365, align 8, !tbaa !30
  %371 = getelementptr inbounds i8, ptr %6, i64 520
  %372 = load i64, ptr %371, align 8, !tbaa !30
  %373 = add i64 %372, 1
  store i64 %373, ptr %371, align 8, !tbaa !30
  %374 = add i32 %1, 2
  %375 = getelementptr inbounds i8, ptr %6, i64 476
  %376 = load i32, ptr %375, align 4, !tbaa !30
  %. = tail call i32 @llvm.umax.i32(i32 %374, i32 %376)
  store i32 %., ptr %375, align 4, !tbaa !30
  %377 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !48
  %378 = icmp ugt i8 %377, 5
  br i1 %378, label %379, label %.critedge424, !prof !15

379:                                              ; preds = %356
  %380 = tail call ptr @page_data(ptr noundef nonnull %.2296) #10
  %381 = load ptr, ptr %358, align 8, !tbaa !21
  %382 = getelementptr inbounds i8, ptr %381, i64 8
  %383 = load i32, ptr %382, align 8, !tbaa !54
  %384 = add i32 %383, -20
  %385 = zext i32 %384 to i64
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 576, ptr noundef nonnull @.str.30, ptr noundef %380, i64 noundef %385, i32 noundef 576) #9
  br label %.critedge424

.critedge452:                                     ; preds = %.critedge452.preheader, %392
  %.pn394 = phi ptr [ %.0288, %392 ], [ %6, %.critedge452.preheader ]
  %.0288.in = getelementptr inbounds i8, ptr %.pn394, i64 24
  %.0288 = load ptr, ptr %.0288.in, align 8, !tbaa !32
  %.not392 = icmp eq ptr %.0288, null
  br i1 %.not392, label %394, label %386

386:                                              ; preds = %.critedge452
  %387 = getelementptr inbounds i8, ptr %.0288, i64 4
  %388 = load i32, ptr %387, align 4, !tbaa !39
  %389 = and i32 %388, 8
  %.not393 = icmp eq i32 %389, 0
  br i1 %.not393, label %394, label %390

390:                                              ; preds = %386
  %391 = tail call zeroext i1 @spill_intersect(ptr noundef nonnull %.0288, i32 noundef %1, i64 noundef %.0310)
  br i1 %391, label %.critedge, label %392

392:                                              ; preds = %390
  %393 = tail call zeroext i1 @dpl_intersect(ptr noundef nonnull %.0288, i32 noundef %1, i64 noundef %.0310) #10
  br i1 %393, label %.critedge, label %.critedge452, !llvm.loop !65

394:                                              ; preds = %.critedge452, %386
  tail call void @page_kill(ptr noundef %6, ptr noundef %.2296, i32 noundef %1, i64 noundef %.0310) #11
  %395 = getelementptr inbounds i8, ptr %6, i64 4
  %396 = load i32, ptr %395, align 4, !tbaa !39
  %397 = and i32 %396, 524288
  %398 = icmp eq i32 %397, 0
  %399 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2
  %400 = icmp ugt i8 %399, 5
  %or.cond464 = select i1 %398, i1 %400, i1 false
  br i1 %or.cond464, label %401, label %.critedge, !prof !66

401:                                              ; preds = %394
  %402 = getelementptr inbounds i8, ptr %6, i64 80
  %403 = load ptr, ptr %402, align 8, !tbaa !21
  %404 = tail call ptr @pgno2page(ptr noundef %403, i64 noundef %294) #10
  %405 = tail call ptr @page_data(ptr noundef %404) #10
  %406 = tail call i64 @pgno2bytes(ptr noundef %403, i64 noundef %.0310) #10
  %407 = add i64 %406, -20
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 601, ptr noundef nonnull @.str.30, ptr noundef %405, i64 noundef %407, i32 noundef 601) #9
  br label %.critedge

.critedge:                                        ; preds = %390, %392, %401, %394
  tail call void @page_wash(ptr noundef %6, i64 noundef %.1301, ptr noundef %.2296, i64 noundef %.0310)
  br label %.thread491

.thread491:                                       ; preds = %434, %._crit_edge, %453, %438, %.critedge
  %408 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !48
  %409 = icmp ugt i8 %408, 4
  br i1 %409, label %410, label %411, !prof !15

410:                                              ; preds = %.thread491
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 610, ptr noundef nonnull @.str.63, i64 noundef %.0310, ptr noundef nonnull @.str.52, i32 noundef %1) #9
  br label %411

411:                                              ; preds = %410, %.thread491
  %412 = getelementptr inbounds i8, ptr %6, i64 200
  %413 = tail call i32 @pnl_insert_span(ptr noundef nonnull %412, i32 noundef %1, i64 noundef %.0310) #9
  %414 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %415 = and i8 %414, 1
  %.not395 = icmp eq i8 %415, 0
  br i1 %.not395, label %.critedge424, label %416, !prof !15

416:                                              ; preds = %411
  %417 = load ptr, ptr %412, align 8, !tbaa !30
  %418 = load i32, ptr %296, align 8, !tbaa !30
  %419 = add i32 %418, -1
  %420 = zext i32 %419 to i64
  %421 = tail call zeroext i1 @pnl_check_allocated(ptr noundef %417, i64 noundef %420)
  br i1 %421, label %425, label %422, !prof !20

422:                                              ; preds = %416
  %423 = getelementptr inbounds i8, ptr %6, i64 80
  %424 = load ptr, ptr %423, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %424, ptr noundef nonnull @.str.64, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 612) #8
  unreachable

425:                                              ; preds = %416
  %.pre529 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %.pre535 = and i8 %.pre529, 1
  %426 = icmp eq i8 %.pre535, 0
  br i1 %426, label %.critedge424, label %427, !prof !31

427:                                              ; preds = %425
  %428 = tail call zeroext i1 @dpl_check(ptr noundef nonnull %6) #9
  br i1 %428, label %.critedge424, label %429, !prof !20

429:                                              ; preds = %427
  %430 = getelementptr inbounds i8, ptr %6, i64 80
  %431 = load ptr, ptr %430, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %431, ptr noundef nonnull @.str.51, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 613) #8
  unreachable

432:                                              ; preds = %343
  %.not377 = icmp eq i64 %.0309, 0
  br i1 %.not377, label %437, label %433

433:                                              ; preds = %432
  tail call void @spill_remove(ptr noundef nonnull %6, i64 noundef %.0309, i64 noundef %.0310) #9
  br label %434

434:                                              ; preds = %435, %433
  %.pn389 = phi ptr [ %6, %433 ], [ %.0287, %435 ]
  %.0287.in = getelementptr inbounds i8, ptr %.pn389, i64 24
  %.0287 = load ptr, ptr %.0287.in, align 8, !tbaa !32
  %.not387 = icmp eq ptr %.0287, null
  br i1 %.not387, label %.thread491, label %435

435:                                              ; preds = %434
  %436 = tail call i64 @dpl_exist(ptr noundef nonnull %.0287, i32 noundef %1) #10
  %.not388 = icmp eq i64 %436, 0
  br i1 %.not388, label %434, label %.loopexit, !llvm.loop !67

437:                                              ; preds = %432
  br i1 %202, label %438, label %.loopexit

438:                                              ; preds = %437
  %439 = and i8 %279, 1
  %.not378 = icmp eq i8 %439, 0
  br i1 %.not378, label %.thread491, label %.preheader499, !prof !15

.preheader499:                                    ; preds = %438
  %.0.in508 = getelementptr inbounds i8, ptr %6, i64 24
  %.0509 = load ptr, ptr %.0.in508, align 8, !tbaa !32
  %.not513 = icmp eq ptr %.0509, null
  br i1 %.not513, label %.critedge454, label %.lr.ph511, !prof !68

._crit_edge:                                      ; preds = %448
  %.pre527 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %.pre537 = and i8 %.pre527, 1
  %440 = icmp eq i8 %.pre537, 0
  br i1 %440, label %.thread491, label %452, !prof !69

.lr.ph511:                                        ; preds = %.preheader499, %448
  %.0510 = phi ptr [ %.0, %448 ], [ %.0509, %.preheader499 ]
  %441 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %442 = and i8 %441, 1
  %.not384 = icmp eq i8 %442, 0
  br i1 %.not384, label %448, label %443, !prof !15

443:                                              ; preds = %.lr.ph511
  %444 = tail call i64 @spill_search(ptr noundef nonnull %.0510, i32 noundef %1)
  %.not385 = icmp eq i64 %444, 0
  br i1 %.not385, label %448, label %445, !prof !20

445:                                              ; preds = %443
  %446 = getelementptr inbounds i8, ptr %6, i64 80
  %447 = load ptr, ptr %446, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %447, ptr noundef nonnull @.str.65, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 640) #8
  unreachable

448:                                              ; preds = %443, %.lr.ph511
  %449 = tail call ptr @debug_dpl_find(ptr noundef nonnull %.0510, i32 noundef %1) #9
  %.0.in = getelementptr inbounds i8, ptr %.0510, i64 24
  %.0 = load ptr, ptr %.0.in, align 8, !tbaa !32
  %450 = icmp ne ptr %.0, null
  %.not379 = icmp eq ptr %449, null
  %451 = select i1 %450, i1 %.not379, i1 false
  br i1 %451, label %.lr.ph511, label %._crit_edge, !llvm.loop !70

452:                                              ; preds = %._crit_edge
  br i1 %.not379, label %.critedge454, label %453, !prof !31

453:                                              ; preds = %452
  %.not381 = icmp ne ptr %.2296, null
  %454 = icmp ne ptr %449, %.2296
  %.not383 = select i1 %.not381, i1 %454, i1 false
  br i1 %.not383, label %.critedge454, label %.thread491, !prof !15

.critedge454:                                     ; preds = %.preheader499, %452, %453
  %455 = getelementptr inbounds i8, ptr %6, i64 80
  %456 = load ptr, ptr %455, align 8, !tbaa !21
  tail call void @mdbx_assert_fail(ptr noundef %456, ptr noundef nonnull @.str.66, ptr noundef nonnull @__func__.page_retire_ex, i32 noundef 643) #8
  unreachable

.critedge424:                                     ; preds = %411, %.thread552, %23, %425, %427, %356, %379, %283, %288, %341
  %.5 = phi i32 [ 0, %341 ], [ %285, %288 ], [ %285, %283 ], [ 0, %379 ], [ 0, %356 ], [ %413, %427 ], [ %413, %425 ], [ %28, %23 ], [ %99, %.thread552 ], [ %413, %411 ]
  ret i32 %.5
}

declare { ptr, i32 } @page_get_any(ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #1

declare ptr @debug_dpl_find(ptr noundef, i32 noundef) local_unnamed_addr #1

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

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

declare i32 @pnl_append_span(ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #1

declare zeroext i1 @dpl_check(ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @page_wash(ptr noundef, i64 noundef, ptr noundef, i64 noundef) local_unnamed_addr #2

declare zeroext i1 @txn_refund(ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @suitable4loose(ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare hidden ptr @page_data(ptr noundef) local_unnamed_addr #4

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

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

; Function Attrs: cold nounwind optsize uwtable
declare hidden void @page_kill(ptr noundef, ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #6

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

declare i32 @pnl_insert_span(ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #1

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 16}
!6 = !{!"MDBX_cursor", !7, i64 0, !8, i64 4, !8, i64 6, !8, i64 7, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !8, i64 48, !8, i64 304, !10, i64 368, !10, i64 376}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!12, !8, i64 25}
!12 = !{!"libmdbx_globals", !8, i64 0, !7, i64 16, !7, i64 20, !8, i64 24, !8, i64 25, !8, i64 26, !13, i64 27, !7, i64 28, !8, i64 32, !8, i64 40, !14, i64 80, !10, i64 88}
!13 = !{!"_Bool", !8, i64 0}
!14 = !{!"long", !8, i64 0}
!15 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!16 = !{!"branch_weights", i32 1, i32 1}
!17 = !{!7, !7, i64 0}
!18 = !{!19, !19, i64 0}
!19 = !{!"short", !8, i64 0}
!20 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!21 = !{!22, !10, i64 80}
!22 = !{!"MDBX_txn", !7, i64 0, !7, i64 4, !14, i64 8, !14, i64 16, !10, i64 24, !10, i64 32, !23, i64 40, !14, i64 64, !14, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !24, i64 128, !10, i64 160, !8, i64 168}
!23 = !{!"geo", !19, i64 0, !19, i64 2, !7, i64 4, !7, i64 8, !8, i64 12, !8, i64 16}
!24 = !{!"MDBX_canary", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24}
!25 = !{!"branch_weights", !"expected", i32 1073741069, i32 1073742579}
!26 = !{!"branch_weights", i32 1073741825, i32 1073741823}
!27 = !{!22, !14, i64 72}
!28 = !{!"branch_weights", i32 1073741556, i32 1073742092}
!29 = !{!"branch_weights", i32 2002, i32 2000}
!30 = !{!8, !8, i64 0}
!31 = !{!"branch_weights", !"expected", i32 0, i32 -2147483648}
!32 = !{!22, !10, i64 24}
!33 = distinct !{!33, !34}
!34 = !{!"llvm.loop.mustprogress"}
!35 = !{!36, !10, i64 0}
!36 = !{!"dp", !10, i64 0, !7, i64 8, !7, i64 12}
!37 = distinct !{!37, !34}
!38 = !{!"branch_weights", i32 8006002, i32 2000}
!39 = !{!22, !7, i64 4}
!40 = !{!41, !7, i64 12}
!41 = !{!"tree", !19, i64 0, !19, i64 2, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !14, i64 24, !14, i64 32, !14, i64 40}
!42 = !{!"branch_weights", i32 2681138, i32 2144802510}
!43 = !{!41, !7, i64 16}
!44 = !{!6, !10, i64 24}
!45 = !{!"branch_weights", i32 2681137, i32 2144802511}
!46 = !{!41, !7, i64 20}
!47 = !{!"branch_weights", i32 2000, i32 4002001}
!48 = !{!12, !8, i64 26}
!49 = !{!"branch_weights", i32 4002001, i32 2000}
!50 = !{!"branch_weights", i32 2000, i32 2002}
!51 = distinct !{!51, !34}
!52 = !{!"branch_weights", i32 2144366178, i32 3117470}
!53 = !{!"branch_weights", i32 2146188591, i32 1295057}
!54 = !{!55, !7, i64 8}
!55 = !{!"MDBX_env", !8, i64 0, !7, i64 4, !7, i64 8, !56, i64 16, !7, i64 56, !7, i64 60, !56, i64 64, !10, i64 104, !19, i64 112, !19, i64 114, !19, i64 116, !19, i64 118, !19, i64 120, !19, i64 122, !8, i64 124, !8, i64 128, !8, i64 129, !19, i64 130, !7, i64 132, !7, i64 136, !7, i64 140, !7, i64 144, !57, i64 152, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !7, i64 224, !7, i64 228, !7, i64 232, !10, i64 240, !10, i64 248, !14, i64 256, !58, i64 264, !60, i64 320, !13, i64 360, !10, i64 368, !10, i64 376, !10, i64 384, !61, i64 392, !8, i64 400, !7, i64 440, !7, i64 444, !10, i64 448, !62, i64 456, !8, i64 496, !8, i64 536}
!56 = !{!"osal_mmap", !8, i64 0, !7, i64 8, !14, i64 16, !14, i64 24, !14, i64 32}
!57 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24}
!58 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !14, i64 16, !8, i64 24, !8, i64 25, !8, i64 26, !8, i64 27, !7, i64 28, !7, i64 32, !13, i64 36, !13, i64 37, !13, i64 38, !59, i64 40, !8, i64 48}
!59 = !{!"", !19, i64 0, !19, i64 2, !19, i64 4, !19, i64 6}
!60 = !{!"", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24, !14, i64 32}
!61 = !{!"", !14, i64 0}
!62 = !{!"osal_ioring", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!63 = !{!14, !14, i64 0}
!64 = !{!10, !10, i64 0}
!65 = distinct !{!65, !34}
!66 = !{!"branch_weights", i32 1, i32 4001}
!67 = distinct !{!67, !34}
!68 = !{!"branch_weights", i32 1073205, i32 2146410443}
!69 = !{!"branch_weights", !"expected", i32 1727425, i32 2145756223}
!70 = distinct !{!70, !34}


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