; LLVM IR from erthink/libmdbx :: src (tree-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.6 }
%struct.anon.6 = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.cursor_couple = type { %struct.MDBX_cursor, ptr, %struct.inner_cursor }
%struct.MDBX_cursor = type { i32, %union.anon.8, i8, i8, ptr, ptr, ptr, ptr, ptr, [32 x ptr], [32 x i16], ptr, ptr }
%union.anon.8 = type { i16 }
%struct.inner_cursor = type { %struct.MDBX_cursor, %struct.tree }
%struct.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }
%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.12 }
%struct.geo = type { i16, i16, i32, i32, %union.anon.10, %union.anon.11 }
%union.anon.10 = type { i32 }
%union.anon.11 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.12 = type { %struct.anon.14 }
%struct.anon.14 = type { %struct.troika, ptr, %struct.anon.15, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.16 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.15 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.16 = type { %struct.anon.17 }
%struct.anon.17 = type { i64, ptr }
%struct.anon.9 = type { i8, i8 }
%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, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.0, %struct.anon.4, i8, ptr, ptr, ptr, %struct.anon.5, %union.pthread_mutex_t, i32, i32, ptr, %struct.osal_ioring, %union.pthread_mutex_t, [71 x %union.mdbx_atomic_uint64_t] }
%struct.osal_mmap = type { %union.anon, i32, i64, i64, i64 }
%union.anon = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon = type { ptr, ptr, ptr, ptr }
%struct.anon.0 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.1, %union.anon.2 }
%struct.anon.1 = type { i16, i16, i16, i16 }
%union.anon.2 = type { i32 }
%struct.anon.4 = type { i64, i64, i64, i64, i64 }
%struct.anon.5 = type { i64 }
%struct.osal_ioring = type { i32, i32, i32, ptr, ptr, ptr }
%union.mdbx_atomic_uint64_t = type { i64 }
%struct.page = type <{ i64, i16, i16, %union.anon.18, i32, [0 x i16] }>
%union.anon.18 = type { i32 }

@globals = external global %struct.libmdbx_globals, align 8
@.str.5 = external hidden unnamed_addr constant [22 x i8], align 1
@__func__.tree_rebalance = external hidden unnamed_addr constant [15 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [72 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [79 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [87 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [93 x i8], align 1

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden i64 @page_space(ptr noundef) #1

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

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

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden i64 @page_numkeys(ptr noundef) #1

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

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden i32 @node_pgno(ptr noalias noundef) #1

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @tree_rebalance(ptr noundef %0) #5 {
  %2 = alloca i32, align 4
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i8, align 1
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i8, align 1
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca i64, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i64, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca %struct.cursor_couple, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  %31 = alloca i64, align 8
  %32 = alloca i64, align 8
  %33 = alloca i8, align 1
  %34 = alloca i8, align 1
  %35 = alloca i8, align 1
  %36 = alloca i64, align 8
  store ptr %0, ptr %3, align 8, !tbaa !5
  br label %37

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

48:                                               ; preds = %37
  br label %49

49:                                               ; preds = %48
  %50 = load ptr, ptr %3, align 8, !tbaa !5
  %51 = call zeroext i1 @cursor_is_tracked(ptr noundef %50)
  %52 = xor i1 %51, true
  %53 = xor i1 %52, true
  %54 = xor i1 %53, true
  %55 = zext i1 %54 to i32
  %56 = sext i32 %55 to i64
  %57 = call i64 @llvm.expect.i64(i64 %56, i64 0)
  %58 = icmp ne i64 %57, 0
  br i1 %58, label %59, label %65

59:                                               ; preds = %49
  %60 = load ptr, ptr %3, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.MDBX_cursor, ptr %60, i32 0, i32 5
  %62 = load ptr, ptr %61, align 8, !tbaa !14
  %63 = getelementptr inbounds %struct.MDBX_txn, ptr %62, i32 0, i32 9
  %64 = load ptr, ptr %63, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %64, ptr noundef @.str.5, ptr noundef @__func__.tree_rebalance, i32 noundef 672) #7
  unreachable

65:                                               ; preds = %49
  br label %66

66:                                               ; preds = %65
  br label %67

67:                                               ; preds = %66, %37
  br label %68

68:                                               ; preds = %67
  br label %69

69:                                               ; preds = %68
  %70 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %71 = zext i8 %70 to i32
  %72 = and i32 %71, 1
  %73 = icmp ne i32 %72, 0
  %74 = xor i1 %73, true
  %75 = xor i1 %74, true
  %76 = zext i1 %75 to i32
  %77 = sext i32 %76 to i64
  %78 = call i64 @llvm.expect.i64(i64 %77, i64 1)
  %79 = icmp ne i64 %78, 0
  br i1 %79, label %80, label %103

80:                                               ; preds = %69
  br label %81

81:                                               ; preds = %80
  %82 = load ptr, ptr %3, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.MDBX_cursor, ptr %82, i32 0, i32 1
  %84 = getelementptr inbounds %struct.anon.9, ptr %83, i32 0, i32 1
  %85 = load i8, ptr %84, align 1, !tbaa !21
  %86 = sext i8 %85 to i32
  %87 = icmp sge i32 %86, 0
  %88 = xor i1 %87, true
  %89 = xor i1 %88, true
  %90 = xor i1 %89, true
  %91 = zext i1 %90 to i32
  %92 = sext i32 %91 to i64
  %93 = call i64 @llvm.expect.i64(i64 %92, i64 0)
  %94 = icmp ne i64 %93, 0
  br i1 %94, label %95, label %101

95:                                               ; preds = %81
  %96 = load ptr, ptr %3, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.MDBX_cursor, ptr %96, i32 0, i32 5
  %98 = load ptr, ptr %97, align 8, !tbaa !14
  %99 = getelementptr inbounds %struct.MDBX_txn, ptr %98, i32 0, i32 9
  %100 = load ptr, ptr %99, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %100, ptr noundef @.str.6, ptr noundef @__func__.tree_rebalance, i32 noundef 673) #7
  unreachable

101:                                              ; preds = %81
  br label %102

102:                                              ; preds = %101
  br label %103

103:                                              ; preds = %102, %69
  br label %104

104:                                              ; preds = %103
  br label %105

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

116:                                              ; preds = %105
  br label %117

117:                                              ; preds = %116
  %118 = load ptr, ptr %3, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.MDBX_cursor, ptr %118, i32 0, i32 1
  %120 = getelementptr inbounds %struct.anon.9, ptr %119, i32 0, i32 1
  %121 = load i8, ptr %120, align 1, !tbaa !21
  %122 = sext i8 %121 to i32
  %123 = add nsw i32 %122, 1
  %124 = load ptr, ptr %3, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.MDBX_cursor, ptr %124, i32 0, i32 6
  %126 = load ptr, ptr %125, align 8, !tbaa !22
  %127 = getelementptr inbounds %struct.tree, ptr %126, i32 0, i32 1
  %128 = load i16, ptr %127, align 2, !tbaa !23
  %129 = zext i16 %128 to i32
  %130 = icmp slt i32 %123, %129
  br i1 %130, label %145, label %131

131:                                              ; preds = %117
  %132 = load ptr, ptr %3, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.MDBX_cursor, ptr %132, i32 0, i32 9
  %134 = load ptr, ptr %3, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.MDBX_cursor, ptr %134, i32 0, i32 6
  %136 = load ptr, ptr %135, align 8, !tbaa !22
  %137 = getelementptr inbounds %struct.tree, ptr %136, i32 0, i32 1
  %138 = load i16, ptr %137, align 2, !tbaa !23
  %139 = zext i16 %138 to i32
  %140 = sub nsw i32 %139, 1
  %141 = sext i32 %140 to i64
  %142 = getelementptr inbounds [32 x ptr], ptr %133, i64 0, i64 %141
  %143 = load ptr, ptr %142, align 8, !tbaa !5
  %144 = call zeroext i1 @is_leaf(ptr noundef %143) #8
  br label %145

145:                                              ; preds = %131, %117
  %146 = phi i1 [ true, %117 ], [ %144, %131 ]
  %147 = xor i1 %146, true
  %148 = xor i1 %147, true
  %149 = xor i1 %148, true
  %150 = zext i1 %149 to i32
  %151 = sext i32 %150 to i64
  %152 = call i64 @llvm.expect.i64(i64 %151, i64 0)
  %153 = icmp ne i64 %152, 0
  br i1 %153, label %154, label %160

154:                                              ; preds = %145
  %155 = load ptr, ptr %3, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.MDBX_cursor, ptr %155, i32 0, i32 5
  %157 = load ptr, ptr %156, align 8, !tbaa !14
  %158 = getelementptr inbounds %struct.MDBX_txn, ptr %157, i32 0, i32 9
  %159 = load ptr, ptr %158, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %159, ptr noundef @.str.7, ptr noundef @__func__.tree_rebalance, i32 noundef 674) #7
  unreachable

160:                                              ; preds = %145
  br label %161

161:                                              ; preds = %160
  br label %162

162:                                              ; preds = %161, %105
  br label %163

163:                                              ; preds = %162
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #9
  %164 = load ptr, ptr %3, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.MDBX_cursor, ptr %164, i32 0, i32 9
  %166 = load ptr, ptr %3, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.MDBX_cursor, ptr %166, i32 0, i32 1
  %168 = getelementptr inbounds %struct.anon.9, ptr %167, i32 0, i32 1
  %169 = load i8, ptr %168, align 1, !tbaa !21
  %170 = sext i8 %169 to i64
  %171 = getelementptr inbounds [32 x ptr], ptr %165, i64 0, i64 %170
  %172 = load ptr, ptr %171, align 8, !tbaa !5
  store ptr %172, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %5) #9
  %173 = load ptr, ptr %4, align 8, !tbaa !5
  %174 = call zeroext i8 @page_type(ptr noundef %173) #8
  store i8 %174, ptr %5, align 1, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #9
  %175 = load i8, ptr %5, align 1, !tbaa !21
  %176 = zext i8 %175 to i32
  %177 = and i32 %176, 1
  %178 = sext i32 %177 to i64
  %179 = add i64 %178, 1
  store i64 %179, ptr %6, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #9
  %180 = load ptr, ptr %3, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.MDBX_cursor, ptr %180, i32 0, i32 5
  %182 = load ptr, ptr %181, align 8, !tbaa !14
  %183 = getelementptr inbounds %struct.MDBX_txn, ptr %182, i32 0, i32 9
  %184 = load ptr, ptr %183, align 8, !tbaa !16
  %185 = getelementptr inbounds %struct.MDBX_env, ptr %184, i32 0, i32 17
  %186 = load i16, ptr %185, align 2, !tbaa !26
  %187 = zext i16 %186 to i64
  store i64 %187, ptr %7, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 1, ptr %8) #9
  %188 = load ptr, ptr %3, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.MDBX_cursor, ptr %188, i32 0, i32 5
  %190 = load ptr, ptr %189, align 8, !tbaa !14
  %191 = getelementptr inbounds %struct.MDBX_txn, ptr %190, i32 0, i32 9
  %192 = load ptr, ptr %191, align 8, !tbaa !16
  %193 = getelementptr inbounds %struct.MDBX_env, ptr %192, i32 0, i32 34
  %194 = getelementptr inbounds %struct.anon.0, ptr %193, i32 0, i32 12
  %195 = load i8, ptr %194, align 1, !tbaa !35, !range !36, !noundef !37
  %196 = trunc i8 %195 to i1
  %197 = zext i1 %196 to i8
  store i8 %197, ptr %8, align 1, !tbaa !38
  %198 = load ptr, ptr %3, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.MDBX_cursor, ptr %198, i32 0, i32 6
  %200 = load ptr, ptr %199, align 8, !tbaa !22
  %201 = load ptr, ptr %3, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.MDBX_cursor, ptr %201, i32 0, i32 5
  %203 = load ptr, ptr %202, align 8, !tbaa !14
  %204 = getelementptr inbounds %struct.MDBX_txn, ptr %203, i32 0, i32 10
  %205 = load ptr, ptr %204, align 8, !tbaa !39
  %206 = getelementptr inbounds %struct.tree, ptr %205, i64 0
  %207 = icmp eq ptr %200, %206
  %208 = xor i1 %207, true
  %209 = xor i1 %208, true
  %210 = zext i1 %209 to i32
  %211 = sext i32 %210 to i64
  %212 = call i64 @llvm.expect.i64(i64 %211, i64 0)
  %213 = icmp ne i64 %212, 0
  br i1 %213, label %214, label %244

214:                                              ; preds = %163
  store i8 1, ptr %8, align 1, !tbaa !38
  %215 = load ptr, ptr %3, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.MDBX_cursor, ptr %215, i32 0, i32 5
  %217 = load ptr, ptr %216, align 8, !tbaa !14
  %218 = getelementptr inbounds %struct.MDBX_txn, ptr %217, i32 0, i32 9
  %219 = load ptr, ptr %218, align 8, !tbaa !16
  %220 = call i64 @page_space(ptr noundef %219) #8
  store i64 %220, ptr %7, align 8, !tbaa !25
  %221 = load ptr, ptr %3, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.MDBX_cursor, ptr %221, i32 0, i32 5
  %223 = load ptr, ptr %222, align 8, !tbaa !14
  %224 = call i64 @gc_stockpile(ptr noundef %223) #8
  %225 = load ptr, ptr %3, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.MDBX_cursor, ptr %225, i32 0, i32 6
  %227 = load ptr, ptr %226, align 8, !tbaa !22
  %228 = getelementptr inbounds %struct.tree, ptr %227, i32 0, i32 1
  %229 = load i16, ptr %228, align 2, !tbaa !23
  %230 = zext i16 %229 to i32
  %231 = load ptr, ptr %3, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.MDBX_cursor, ptr %231, i32 0, i32 6
  %233 = load ptr, ptr %232, align 8, !tbaa !22
  %234 = getelementptr inbounds %struct.tree, ptr %233, i32 0, i32 1
  %235 = load i16, ptr %234, align 2, !tbaa !23
  %236 = zext i16 %235 to i32
  %237 = add nsw i32 %230, %236
  %238 = sext i32 %237 to i64
  %239 = icmp ugt i64 %224, %238
  br i1 %239, label %240, label %243

240:                                              ; preds = %214
  %241 = load i64, ptr %7, align 8, !tbaa !25
  %242 = lshr i64 %241, 1
  store i64 %242, ptr %7, align 8, !tbaa !25
  br label %243

243:                                              ; preds = %240, %214
  br label %244

244:                                              ; preds = %243, %163
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #9
  %245 = load ptr, ptr %4, align 8, !tbaa !5
  %246 = call i64 @page_numkeys(ptr noundef %245) #8
  store i64 %246, ptr %9, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #9
  %247 = load ptr, ptr %4, align 8, !tbaa !5
  %248 = call i64 @page_room(ptr noundef %247) #8
  store i64 %248, ptr %10, align 8, !tbaa !25
  br label %249

249:                                              ; preds = %244
  %250 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %251 = zext i8 %250 to i32
  %252 = icmp sle i32 5, %251
  %253 = xor i1 %252, true
  %254 = xor i1 %253, true
  %255 = zext i1 %254 to i32
  %256 = sext i32 %255 to i64
  %257 = call i64 @llvm.expect.i64(i64 %256, i64 0)
  %258 = icmp ne i64 %257, 0
  br i1 %258, label %259, label %292

259:                                              ; preds = %249
  %260 = load ptr, ptr %4, align 8, !tbaa !5
  %261 = call zeroext i1 @is_leaf(ptr noundef %260) #8
  %262 = zext i1 %261 to i64
  %263 = select i1 %261, ptr @.str.9, ptr @.str.10
  %264 = load ptr, ptr %4, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.page, ptr %264, i32 0, i32 4
  %266 = load i32, ptr %265, align 1, !tbaa !41
  %267 = load i64, ptr %9, align 8, !tbaa !25
  %268 = load ptr, ptr %3, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.MDBX_cursor, ptr %268, i32 0, i32 5
  %270 = load ptr, ptr %269, align 8, !tbaa !14
  %271 = getelementptr inbounds %struct.MDBX_txn, ptr %270, i32 0, i32 9
  %272 = load ptr, ptr %271, align 8, !tbaa !16
  %273 = load ptr, ptr %4, align 8, !tbaa !5
  %274 = call i32 @page_fill_percentum_x10(ptr noundef %272, ptr noundef %273) #8
  %275 = udiv i32 %274, 10
  %276 = load ptr, ptr %3, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.MDBX_cursor, ptr %276, i32 0, i32 5
  %278 = load ptr, ptr %277, align 8, !tbaa !14
  %279 = getelementptr inbounds %struct.MDBX_txn, ptr %278, i32 0, i32 9
  %280 = load ptr, ptr %279, align 8, !tbaa !16
  %281 = load ptr, ptr %4, align 8, !tbaa !5
  %282 = call i32 @page_fill_percentum_x10(ptr noundef %280, ptr noundef %281) #8
  %283 = urem i32 %282, 10
  %284 = load ptr, ptr %3, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.MDBX_cursor, ptr %284, i32 0, i32 5
  %286 = load ptr, ptr %285, align 8, !tbaa !14
  %287 = getelementptr inbounds %struct.MDBX_txn, ptr %286, i32 0, i32 9
  %288 = load ptr, ptr %287, align 8, !tbaa !16
  %289 = load ptr, ptr %4, align 8, !tbaa !5
  %290 = call i64 @page_used(ptr noundef %288, ptr noundef %289) #8
  %291 = load i64, ptr %10, align 8, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 699, ptr noundef @.str.8, ptr noundef %263, i32 noundef %266, i64 noundef %267, i32 noundef %275, i32 noundef %283, i64 noundef %290, i64 noundef %291)
  br label %292

292:                                              ; preds = %259, %249
  br label %293

293:                                              ; preds = %292
  br label %294

294:                                              ; preds = %293
  br label %295

295:                                              ; preds = %294
  %296 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %297 = zext i8 %296 to i32
  %298 = and i32 %297, 1
  %299 = icmp ne i32 %298, 0
  %300 = xor i1 %299, true
  %301 = xor i1 %300, true
  %302 = zext i1 %301 to i32
  %303 = sext i32 %302 to i64
  %304 = call i64 @llvm.expect.i64(i64 %303, i64 1)
  %305 = icmp ne i64 %304, 0
  br i1 %305, label %306, label %329

306:                                              ; preds = %295
  br label %307

307:                                              ; preds = %306
  %308 = load ptr, ptr %3, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.MDBX_cursor, ptr %308, i32 0, i32 5
  %310 = load ptr, ptr %309, align 8, !tbaa !14
  %311 = load ptr, ptr %4, align 8, !tbaa !5
  %312 = call zeroext i1 @is_modifable(ptr noundef %310, ptr noundef %311) #8
  %313 = xor i1 %312, true
  %314 = xor i1 %313, true
  %315 = xor i1 %314, true
  %316 = zext i1 %315 to i32
  %317 = sext i32 %316 to i64
  %318 = call i64 @llvm.expect.i64(i64 %317, i64 0)
  %319 = icmp ne i64 %318, 0
  br i1 %319, label %320, label %326

320:                                              ; preds = %307
  %321 = load ptr, ptr %3, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.MDBX_cursor, ptr %321, i32 0, i32 5
  %323 = load ptr, ptr %322, align 8, !tbaa !14
  %324 = getelementptr inbounds %struct.MDBX_txn, ptr %323, i32 0, i32 9
  %325 = load ptr, ptr %324, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %325, ptr noundef @.str.11, ptr noundef @__func__.tree_rebalance, i32 noundef 700) #7
  unreachable

326:                                              ; preds = %307
  br label %327

327:                                              ; preds = %326
  br label %328

328:                                              ; preds = %327
  br label %329

329:                                              ; preds = %328, %295
  br label %330

330:                                              ; preds = %329
  br label %331

331:                                              ; preds = %330
  %332 = load i64, ptr %9, align 8, !tbaa !25
  %333 = load i64, ptr %6, align 8, !tbaa !25
  %334 = icmp ult i64 %332, %333
  %335 = xor i1 %334, true
  %336 = xor i1 %335, true
  %337 = zext i1 %336 to i32
  %338 = sext i32 %337 to i64
  %339 = call i64 @llvm.expect.i64(i64 %338, i64 0)
  %340 = icmp ne i64 %339, 0
  br i1 %340, label %341, label %360

341:                                              ; preds = %331
  br label %342

342:                                              ; preds = %341
  %343 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %344 = zext i8 %343 to i32
  %345 = icmp sle i32 5, %344
  %346 = xor i1 %345, true
  %347 = xor i1 %346, true
  %348 = zext i1 %347 to i32
  %349 = sext i32 %348 to i64
  %350 = call i64 @llvm.expect.i64(i64 %349, i64 0)
  %351 = icmp ne i64 %350, 0
  br i1 %351, label %352, label %357

352:                                              ; preds = %342
  %353 = load ptr, ptr %4, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.page, ptr %353, i32 0, i32 4
  %355 = load i32, ptr %354, align 1, !tbaa !41
  %356 = load i64, ptr %6, align 8, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 703, ptr noundef @.str.12, i32 noundef %355, i64 noundef %356)
  br label %357

357:                                              ; preds = %352, %342
  br label %358

358:                                              ; preds = %357
  br label %359

359:                                              ; preds = %358
  br label %449

360:                                              ; preds = %331
  %361 = load i64, ptr %10, align 8, !tbaa !25
  %362 = load i64, ptr %7, align 8, !tbaa !25
  %363 = icmp ugt i64 %361, %362
  %364 = xor i1 %363, true
  %365 = xor i1 %364, true
  %366 = zext i1 %365 to i32
  %367 = sext i32 %366 to i64
  %368 = call i64 @llvm.expect.i64(i64 %367, i64 0)
  %369 = icmp ne i64 %368, 0
  br i1 %369, label %370, label %390

370:                                              ; preds = %360
  br label %371

371:                                              ; preds = %370
  %372 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %373 = zext i8 %372 to i32
  %374 = icmp sle i32 5, %373
  %375 = xor i1 %374, true
  %376 = xor i1 %375, true
  %377 = zext i1 %376 to i32
  %378 = sext i32 %377 to i64
  %379 = call i64 @llvm.expect.i64(i64 %378, i64 0)
  %380 = icmp ne i64 %379, 0
  br i1 %380, label %381, label %387

381:                                              ; preds = %371
  %382 = load ptr, ptr %4, align 8, !tbaa !5
  %383 = getelementptr inbounds %struct.page, ptr %382, i32 0, i32 4
  %384 = load i32, ptr %383, align 1, !tbaa !41
  %385 = load i64, ptr %10, align 8, !tbaa !25
  %386 = load i64, ptr %7, align 8, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 705, ptr noundef @.str.13, i32 noundef %384, i64 noundef %385, i64 noundef %386)
  br label %387

387:                                              ; preds = %381, %371
  br label %388

388:                                              ; preds = %387
  br label %389

389:                                              ; preds = %388
  br label %448

390:                                              ; preds = %360
  br label %391

391:                                              ; preds = %390
  %392 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %393 = zext i8 %392 to i32
  %394 = icmp sle i32 5, %393
  %395 = xor i1 %394, true
  %396 = xor i1 %395, true
  %397 = zext i1 %396 to i32
  %398 = sext i32 %397 to i64
  %399 = call i64 @llvm.expect.i64(i64 %398, i64 0)
  %400 = icmp ne i64 %399, 0
  br i1 %400, label %401, label %407

401:                                              ; preds = %391
  %402 = load ptr, ptr %4, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.page, ptr %402, i32 0, i32 4
  %404 = load i32, ptr %403, align 1, !tbaa !41
  %405 = load i64, ptr %10, align 8, !tbaa !25
  %406 = load i64, ptr %7, align 8, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 707, ptr noundef @.str.14, i32 noundef %404, i64 noundef %405, i64 noundef %406)
  br label %407

407:                                              ; preds = %401, %391
  br label %408

408:                                              ; preds = %407
  br label %409

409:                                              ; preds = %408
  br label %410

410:                                              ; preds = %409
  %411 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %412 = zext i8 %411 to i32
  %413 = and i32 %412, 1
  %414 = icmp ne i32 %413, 0
  %415 = xor i1 %414, true
  %416 = xor i1 %415, true
  %417 = zext i1 %416 to i32
  %418 = sext i32 %417 to i64
  %419 = call i64 @llvm.expect.i64(i64 %418, i64 1)
  %420 = icmp ne i64 %419, 0
  br i1 %420, label %421, label %445

421:                                              ; preds = %410
  br label %422

422:                                              ; preds = %421
  %423 = load ptr, ptr %3, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.MDBX_cursor, ptr %423, i32 0, i32 6
  %425 = load ptr, ptr %424, align 8, !tbaa !22
  %426 = getelementptr inbounds %struct.tree, ptr %425, i32 0, i32 8
  %427 = load i64, ptr %426, align 4, !tbaa !42
  %428 = icmp ugt i64 %427, 0
  %429 = xor i1 %428, true
  %430 = xor i1 %429, true
  %431 = xor i1 %430, true
  %432 = zext i1 %431 to i32
  %433 = sext i32 %432 to i64
  %434 = call i64 @llvm.expect.i64(i64 %433, i64 0)
  %435 = icmp ne i64 %434, 0
  br i1 %435, label %436, label %442

436:                                              ; preds = %422
  %437 = load ptr, ptr %3, align 8, !tbaa !5
  %438 = getelementptr inbounds %struct.MDBX_cursor, ptr %437, i32 0, i32 5
  %439 = load ptr, ptr %438, align 8, !tbaa !14
  %440 = getelementptr inbounds %struct.MDBX_txn, ptr %439, i32 0, i32 9
  %441 = load ptr, ptr %440, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %441, ptr noundef @.str.15, ptr noundef @__func__.tree_rebalance, i32 noundef 708) #7
  unreachable

442:                                              ; preds = %422
  br label %443

443:                                              ; preds = %442
  br label %444

444:                                              ; preds = %443
  br label %445

445:                                              ; preds = %444, %410
  br label %446

446:                                              ; preds = %445
  br label %447

447:                                              ; preds = %446
  store i32 0, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2421

448:                                              ; preds = %389
  br label %449

449:                                              ; preds = %448, %359
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #9
  %450 = load ptr, ptr %3, align 8, !tbaa !5
  %451 = getelementptr inbounds %struct.MDBX_cursor, ptr %450, i32 0, i32 1
  %452 = getelementptr inbounds %struct.anon.9, ptr %451, i32 0, i32 1
  %453 = load i8, ptr %452, align 1, !tbaa !21
  %454 = sext i8 %453 to i32
  %455 = icmp eq i32 %454, 0
  br i1 %455, label %456, label %1105

456:                                              ; preds = %449
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %457 = load ptr, ptr %3, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.MDBX_cursor, ptr %457, i32 0, i32 9
  %459 = getelementptr inbounds [32 x ptr], ptr %458, i64 0, i64 0
  %460 = load ptr, ptr %459, align 8, !tbaa !5
  store ptr %460, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #9
  %461 = load ptr, ptr %13, align 8, !tbaa !5
  %462 = call i64 @page_numkeys(ptr noundef %461) #8
  store i64 %462, ptr %14, align 8, !tbaa !25
  br label %463

463:                                              ; preds = %456
  %464 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %465 = zext i8 %464 to i32
  %466 = and i32 %465, 1
  %467 = icmp ne i32 %466, 0
  %468 = xor i1 %467, true
  %469 = xor i1 %468, true
  %470 = zext i1 %469 to i32
  %471 = sext i32 %470 to i64
  %472 = call i64 @llvm.expect.i64(i64 %471, i64 1)
  %473 = icmp ne i64 %472, 0
  br i1 %473, label %474, label %503

474:                                              ; preds = %463
  br label %475

475:                                              ; preds = %474
  %476 = load ptr, ptr %3, align 8, !tbaa !5
  %477 = getelementptr inbounds %struct.MDBX_cursor, ptr %476, i32 0, i32 6
  %478 = load ptr, ptr %477, align 8, !tbaa !22
  %479 = getelementptr inbounds %struct.tree, ptr %478, i32 0, i32 8
  %480 = load i64, ptr %479, align 4, !tbaa !42
  %481 = icmp eq i64 %480, 0
  %482 = zext i1 %481 to i32
  %483 = load i64, ptr %14, align 8, !tbaa !25
  %484 = icmp eq i64 %483, 0
  %485 = zext i1 %484 to i32
  %486 = icmp eq i32 %482, %485
  %487 = xor i1 %486, true
  %488 = xor i1 %487, true
  %489 = xor i1 %488, true
  %490 = zext i1 %489 to i32
  %491 = sext i32 %490 to i64
  %492 = call i64 @llvm.expect.i64(i64 %491, i64 0)
  %493 = icmp ne i64 %492, 0
  br i1 %493, label %494, label %500

494:                                              ; preds = %475
  %495 = load ptr, ptr %3, align 8, !tbaa !5
  %496 = getelementptr inbounds %struct.MDBX_cursor, ptr %495, i32 0, i32 5
  %497 = load ptr, ptr %496, align 8, !tbaa !14
  %498 = getelementptr inbounds %struct.MDBX_txn, ptr %497, i32 0, i32 9
  %499 = load ptr, ptr %498, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %499, ptr noundef @.str.16, ptr noundef @__func__.tree_rebalance, i32 noundef 716) #7
  unreachable

500:                                              ; preds = %475
  br label %501

501:                                              ; preds = %500
  br label %502

502:                                              ; preds = %501
  br label %503

503:                                              ; preds = %502, %463
  br label %504

504:                                              ; preds = %503
  br label %505

505:                                              ; preds = %504
  %506 = load i64, ptr %14, align 8, !tbaa !25
  %507 = icmp eq i64 %506, 0
  br i1 %507, label %508, label %718

508:                                              ; preds = %505
  br label %509

509:                                              ; preds = %508
  %510 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %511 = zext i8 %510 to i32
  %512 = icmp sle i32 5, %511
  %513 = xor i1 %512, true
  %514 = xor i1 %513, true
  %515 = zext i1 %514 to i32
  %516 = sext i32 %515 to i64
  %517 = call i64 @llvm.expect.i64(i64 %516, i64 0)
  %518 = icmp ne i64 %517, 0
  br i1 %518, label %519, label %520

519:                                              ; preds = %509
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 718, ptr noundef @.str.17, ptr noundef @.str.18)
  br label %520

520:                                              ; preds = %519, %509
  br label %521

521:                                              ; preds = %520
  br label %522

522:                                              ; preds = %521
  br label %523

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

534:                                              ; preds = %523
  br label %535

535:                                              ; preds = %534
  %536 = load ptr, ptr %13, align 8, !tbaa !5
  %537 = call zeroext i1 @is_leaf(ptr noundef %536) #8
  %538 = xor i1 %537, true
  %539 = xor i1 %538, true
  %540 = xor i1 %539, true
  %541 = zext i1 %540 to i32
  %542 = sext i32 %541 to i64
  %543 = call i64 @llvm.expect.i64(i64 %542, i64 0)
  %544 = icmp ne i64 %543, 0
  br i1 %544, label %545, label %551

545:                                              ; preds = %535
  %546 = load ptr, ptr %3, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.MDBX_cursor, ptr %546, i32 0, i32 5
  %548 = load ptr, ptr %547, align 8, !tbaa !14
  %549 = getelementptr inbounds %struct.MDBX_txn, ptr %548, i32 0, i32 9
  %550 = load ptr, ptr %549, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %550, ptr noundef @.str.19, ptr noundef @__func__.tree_rebalance, i32 noundef 719) #7
  unreachable

551:                                              ; preds = %535
  br label %552

552:                                              ; preds = %551
  br label %553

553:                                              ; preds = %552
  br label %554

554:                                              ; preds = %553, %523
  br label %555

555:                                              ; preds = %554
  br label %556

556:                                              ; preds = %555
  br label %557

557:                                              ; preds = %556
  %558 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %559 = zext i8 %558 to i32
  %560 = and i32 %559, 1
  %561 = icmp ne i32 %560, 0
  %562 = xor i1 %561, true
  %563 = xor i1 %562, true
  %564 = zext i1 %563 to i32
  %565 = sext i32 %564 to i64
  %566 = call i64 @llvm.expect.i64(i64 %565, i64 1)
  %567 = icmp ne i64 %566, 0
  br i1 %567, label %568, label %592

568:                                              ; preds = %557
  br label %569

569:                                              ; preds = %568
  %570 = load ptr, ptr %3, align 8, !tbaa !5
  %571 = call ptr @cursor_dbi_state(ptr noundef %570) #8
  %572 = load i8, ptr %571, align 1, !tbaa !21
  %573 = zext i8 %572 to i32
  %574 = and i32 %573, 1
  %575 = icmp ne i32 %574, 0
  %576 = xor i1 %575, true
  %577 = xor i1 %576, true
  %578 = xor i1 %577, true
  %579 = zext i1 %578 to i32
  %580 = sext i32 %579 to i64
  %581 = call i64 @llvm.expect.i64(i64 %580, i64 0)
  %582 = icmp ne i64 %581, 0
  br i1 %582, label %583, label %589

583:                                              ; preds = %569
  %584 = load ptr, ptr %3, align 8, !tbaa !5
  %585 = getelementptr inbounds %struct.MDBX_cursor, ptr %584, i32 0, i32 5
  %586 = load ptr, ptr %585, align 8, !tbaa !14
  %587 = getelementptr inbounds %struct.MDBX_txn, ptr %586, i32 0, i32 9
  %588 = load ptr, ptr %587, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %588, ptr noundef @.str.20, ptr noundef @__func__.tree_rebalance, i32 noundef 720) #7
  unreachable

589:                                              ; preds = %569
  br label %590

590:                                              ; preds = %589
  br label %591

591:                                              ; preds = %590
  br label %592

592:                                              ; preds = %591, %557
  br label %593

593:                                              ; preds = %592
  br label %594

594:                                              ; preds = %593
  br label %595

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

606:                                              ; preds = %595
  br label %607

607:                                              ; preds = %606
  %608 = load ptr, ptr %3, align 8, !tbaa !5
  %609 = getelementptr inbounds %struct.MDBX_cursor, ptr %608, i32 0, i32 6
  %610 = load ptr, ptr %609, align 8, !tbaa !22
  %611 = getelementptr inbounds %struct.tree, ptr %610, i32 0, i32 4
  %612 = load i32, ptr %611, align 4, !tbaa !43
  %613 = icmp eq i32 %612, 0
  br i1 %613, label %614, label %628

614:                                              ; preds = %607
  %615 = load ptr, ptr %3, align 8, !tbaa !5
  %616 = getelementptr inbounds %struct.MDBX_cursor, ptr %615, i32 0, i32 6
  %617 = load ptr, ptr %616, align 8, !tbaa !22
  %618 = getelementptr inbounds %struct.tree, ptr %617, i32 0, i32 6
  %619 = load i32, ptr %618, align 4, !tbaa !44
  %620 = icmp eq i32 %619, 0
  br i1 %620, label %621, label %628

621:                                              ; preds = %614
  %622 = load ptr, ptr %3, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.MDBX_cursor, ptr %622, i32 0, i32 6
  %624 = load ptr, ptr %623, align 8, !tbaa !22
  %625 = getelementptr inbounds %struct.tree, ptr %624, i32 0, i32 5
  %626 = load i32, ptr %625, align 4, !tbaa !45
  %627 = icmp eq i32 %626, 1
  br label %628

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

637:                                              ; preds = %628
  %638 = load ptr, ptr %3, align 8, !tbaa !5
  %639 = getelementptr inbounds %struct.MDBX_cursor, ptr %638, i32 0, i32 5
  %640 = load ptr, ptr %639, align 8, !tbaa !14
  %641 = getelementptr inbounds %struct.MDBX_txn, ptr %640, i32 0, i32 9
  %642 = load ptr, ptr %641, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %642, ptr noundef @.str.21, ptr noundef @__func__.tree_rebalance, i32 noundef 721) #7
  unreachable

643:                                              ; preds = %628
  br label %644

644:                                              ; preds = %643
  br label %645

645:                                              ; preds = %644
  br label %646

646:                                              ; preds = %645, %595
  br label %647

647:                                              ; preds = %646
  br label %648

648:                                              ; preds = %647
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #9
  %649 = load ptr, ptr %3, align 8, !tbaa !5
  %650 = getelementptr inbounds %struct.MDBX_cursor, ptr %649, i32 0, i32 5
  %651 = load ptr, ptr %650, align 8, !tbaa !14
  %652 = getelementptr inbounds %struct.MDBX_txn, ptr %651, i32 0, i32 14
  %653 = load ptr, ptr %652, align 8, !tbaa !46
  %654 = load ptr, ptr %3, align 8, !tbaa !5
  %655 = call i64 @cursor_dbi(ptr noundef %654) #8
  %656 = getelementptr inbounds ptr, ptr %653, i64 %655
  %657 = load ptr, ptr %656, align 8, !tbaa !5
  store ptr %657, ptr %15, align 8, !tbaa !5
  br label %658

658:                                              ; preds = %698, %648
  %659 = load ptr, ptr %15, align 8, !tbaa !5
  %660 = icmp ne ptr %659, null
  br i1 %660, label %662, label %661

661:                                              ; preds = %658
  store i32 48, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #9
  br label %702

662:                                              ; preds = %658
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #9
  %663 = load ptr, ptr %3, align 8, !tbaa !5
  %664 = getelementptr inbounds %struct.MDBX_cursor, ptr %663, i32 0, i32 1
  %665 = getelementptr inbounds %struct.anon.9, ptr %664, i32 0, i32 0
  %666 = load i8, ptr %665, align 4, !tbaa !21
  %667 = sext i8 %666 to i32
  %668 = and i32 %667, 1
  %669 = icmp ne i32 %668, 0
  br i1 %669, label %670, label %675

670:                                              ; preds = %662
  %671 = load ptr, ptr %15, align 8, !tbaa !5
  %672 = getelementptr inbounds %struct.MDBX_cursor, ptr %671, i32 0, i32 8
  %673 = load ptr, ptr %672, align 8, !tbaa !47
  %674 = getelementptr inbounds %struct.inner_cursor, ptr %673, i32 0, i32 0
  br label %677

675:                                              ; preds = %662
  %676 = load ptr, ptr %15, align 8, !tbaa !5
  br label %677

677:                                              ; preds = %675, %670
  %678 = phi ptr [ %674, %670 ], [ %676, %675 ]
  store ptr %678, ptr %16, align 8, !tbaa !5
  %679 = load ptr, ptr %16, align 8, !tbaa !5
  %680 = call zeroext i1 @is_poor(ptr noundef %679) #8
  br i1 %680, label %697, label %681

681:                                              ; preds = %677
  %682 = load ptr, ptr %16, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.MDBX_cursor, ptr %682, i32 0, i32 9
  %684 = getelementptr inbounds [32 x ptr], ptr %683, i64 0, i64 0
  %685 = load ptr, ptr %684, align 8, !tbaa !5
  %686 = load ptr, ptr %13, align 8, !tbaa !5
  %687 = icmp eq ptr %685, %686
  br i1 %687, label %688, label %697

688:                                              ; preds = %681
  %689 = load ptr, ptr %16, align 8, !tbaa !5
  call void @be_poor(ptr noundef %689)
  %690 = load ptr, ptr %16, align 8, !tbaa !5
  %691 = getelementptr inbounds %struct.MDBX_cursor, ptr %690, i32 0, i32 1
  %692 = getelementptr inbounds %struct.anon.9, ptr %691, i32 0, i32 0
  %693 = load i8, ptr %692, align 4, !tbaa !21
  %694 = sext i8 %693 to i32
  %695 = or i32 %694, 8
  %696 = trunc i32 %695 to i8
  store i8 %696, ptr %692, align 4, !tbaa !21
  br label %697

697:                                              ; preds = %688, %681, %677
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #9
  br label %698

698:                                              ; preds = %697
  %699 = load ptr, ptr %15, align 8, !tbaa !5
  %700 = getelementptr inbounds %struct.MDBX_cursor, ptr %699, i32 0, i32 11
  %701 = load ptr, ptr %700, align 8, !tbaa !48
  store ptr %701, ptr %15, align 8, !tbaa !5
  br label %658, !llvm.loop !49

702:                                              ; preds = %661
  %703 = load ptr, ptr %13, align 8, !tbaa !5
  %704 = call zeroext i1 @is_subpage(ptr noundef %703) #8
  br i1 %704, label %705, label %706

705:                                              ; preds = %702
  store i32 0, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %1104

706:                                              ; preds = %702
  %707 = load ptr, ptr %3, align 8, !tbaa !5
  %708 = getelementptr inbounds %struct.MDBX_cursor, ptr %707, i32 0, i32 6
  %709 = load ptr, ptr %708, align 8, !tbaa !22
  %710 = getelementptr inbounds %struct.tree, ptr %709, i32 0, i32 3
  store i32 -1, ptr %710, align 4, !tbaa !51
  %711 = load ptr, ptr %3, align 8, !tbaa !5
  %712 = getelementptr inbounds %struct.MDBX_cursor, ptr %711, i32 0, i32 6
  %713 = load ptr, ptr %712, align 8, !tbaa !22
  %714 = getelementptr inbounds %struct.tree, ptr %713, i32 0, i32 1
  store i16 0, ptr %714, align 2, !tbaa !23
  %715 = load ptr, ptr %3, align 8, !tbaa !5
  %716 = load ptr, ptr %13, align 8, !tbaa !5
  %717 = call i32 @page_retire(ptr noundef %715, ptr noundef %716)
  store i32 %717, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %1104

718:                                              ; preds = %505
  %719 = load ptr, ptr %13, align 8, !tbaa !5
  %720 = call zeroext i1 @is_subpage(ptr noundef %719) #8
  br i1 %720, label %721, label %770

721:                                              ; preds = %718
  br label %722

722:                                              ; preds = %721
  %723 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %724 = zext i8 %723 to i32
  %725 = icmp sle i32 5, %724
  %726 = xor i1 %725, true
  %727 = xor i1 %726, true
  %728 = zext i1 %727 to i32
  %729 = sext i32 %728 to i64
  %730 = call i64 @llvm.expect.i64(i64 %729, i64 0)
  %731 = icmp ne i64 %730, 0
  br i1 %731, label %732, label %733

732:                                              ; preds = %722
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 739, ptr noundef @.str.17, ptr noundef @.str.22)
  br label %733

733:                                              ; preds = %732, %722
  br label %734

734:                                              ; preds = %733
  br label %735

735:                                              ; preds = %734
  br label %736

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

747:                                              ; preds = %736
  br label %748

748:                                              ; preds = %747
  %749 = load ptr, ptr %4, align 8, !tbaa !5
  %750 = call zeroext i1 @is_leaf(ptr noundef %749) #8
  %751 = xor i1 %750, true
  %752 = xor i1 %751, true
  %753 = xor i1 %752, true
  %754 = zext i1 %753 to i32
  %755 = sext i32 %754 to i64
  %756 = call i64 @llvm.expect.i64(i64 %755, i64 0)
  %757 = icmp ne i64 %756, 0
  br i1 %757, label %758, label %764

758:                                              ; preds = %748
  %759 = load ptr, ptr %3, align 8, !tbaa !5
  %760 = getelementptr inbounds %struct.MDBX_cursor, ptr %759, i32 0, i32 5
  %761 = load ptr, ptr %760, align 8, !tbaa !14
  %762 = getelementptr inbounds %struct.MDBX_txn, ptr %761, i32 0, i32 9
  %763 = load ptr, ptr %762, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %763, ptr noundef @.str.23, ptr noundef @__func__.tree_rebalance, i32 noundef 740) #7
  unreachable

764:                                              ; preds = %748
  br label %765

765:                                              ; preds = %764
  br label %766

766:                                              ; preds = %765
  br label %767

767:                                              ; preds = %766, %736
  br label %768

768:                                              ; preds = %767
  br label %769

769:                                              ; preds = %768
  store i32 0, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %1104

770:                                              ; preds = %718
  %771 = load ptr, ptr %13, align 8, !tbaa !5
  %772 = call zeroext i1 @is_branch(ptr noundef %771) #8
  br i1 %772, label %773, label %1082

773:                                              ; preds = %770
  %774 = load i64, ptr %14, align 8, !tbaa !25
  %775 = icmp eq i64 %774, 1
  br i1 %775, label %776, label %1082

776:                                              ; preds = %773
  br label %777

777:                                              ; preds = %776
  %778 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %779 = zext i8 %778 to i32
  %780 = icmp sle i32 5, %779
  %781 = xor i1 %780, true
  %782 = xor i1 %781, true
  %783 = zext i1 %782 to i32
  %784 = sext i32 %783 to i64
  %785 = call i64 @llvm.expect.i64(i64 %784, i64 0)
  %786 = icmp ne i64 %785, 0
  br i1 %786, label %787, label %788

787:                                              ; preds = %777
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 744, ptr noundef @.str.17, ptr noundef @.str.24)
  br label %788

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

789:                                              ; preds = %788
  br label %790

790:                                              ; preds = %789
  %791 = load ptr, ptr %13, align 8, !tbaa !5
  %792 = call ptr @page_node(ptr noundef %791, i64 noundef 0) #8
  %793 = call i32 @node_pgno(ptr noundef %792) #8
  %794 = load ptr, ptr %3, align 8, !tbaa !5
  %795 = getelementptr inbounds %struct.MDBX_cursor, ptr %794, i32 0, i32 6
  %796 = load ptr, ptr %795, align 8, !tbaa !22
  %797 = getelementptr inbounds %struct.tree, ptr %796, i32 0, i32 3
  store i32 %793, ptr %797, align 4, !tbaa !51
  %798 = load ptr, ptr %3, align 8, !tbaa !5
  %799 = load ptr, ptr %3, align 8, !tbaa !5
  %800 = getelementptr inbounds %struct.MDBX_cursor, ptr %799, i32 0, i32 6
  %801 = load ptr, ptr %800, align 8, !tbaa !22
  %802 = getelementptr inbounds %struct.tree, ptr %801, i32 0, i32 3
  %803 = load i32, ptr %802, align 4, !tbaa !51
  %804 = load ptr, ptr %3, align 8, !tbaa !5
  %805 = getelementptr inbounds %struct.MDBX_cursor, ptr %804, i32 0, i32 9
  %806 = getelementptr inbounds [32 x ptr], ptr %805, i64 0, i64 0
  %807 = load ptr, ptr %13, align 8, !tbaa !5
  %808 = getelementptr inbounds %struct.page, ptr %807, i32 0, i32 0
  %809 = load i64, ptr %808, align 1, !tbaa !25
  %810 = call i32 @page_get(ptr noundef %798, i32 noundef %803, ptr noundef %806, i64 noundef %809)
  store i32 %810, ptr %12, align 4, !tbaa !41
  %811 = load i32, ptr %12, align 4, !tbaa !41
  %812 = icmp ne i32 %811, 0
  %813 = xor i1 %812, true
  %814 = xor i1 %813, true
  %815 = zext i1 %814 to i32
  %816 = sext i32 %815 to i64
  %817 = call i64 @llvm.expect.i64(i64 %816, i64 0)
  %818 = icmp ne i64 %817, 0
  br i1 %818, label %819, label %821

819:                                              ; preds = %790
  %820 = load i32, ptr %12, align 4, !tbaa !41
  store i32 %820, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %1104

821:                                              ; preds = %790
  %822 = load ptr, ptr %3, align 8, !tbaa !5
  %823 = getelementptr inbounds %struct.MDBX_cursor, ptr %822, i32 0, i32 6
  %824 = load ptr, ptr %823, align 8, !tbaa !22
  %825 = getelementptr inbounds %struct.tree, ptr %824, i32 0, i32 1
  %826 = load i16, ptr %825, align 2, !tbaa !23
  %827 = add i16 %826, -1
  store i16 %827, ptr %825, align 2, !tbaa !23
  %828 = load ptr, ptr %3, align 8, !tbaa !5
  %829 = getelementptr inbounds %struct.MDBX_cursor, ptr %828, i32 0, i32 10
  %830 = getelementptr inbounds [32 x i16], ptr %829, i64 0, i64 1
  %831 = load i16, ptr %830, align 2, !tbaa !52
  %832 = load ptr, ptr %3, align 8, !tbaa !5
  %833 = getelementptr inbounds %struct.MDBX_cursor, ptr %832, i32 0, i32 10
  %834 = getelementptr inbounds [32 x i16], ptr %833, i64 0, i64 0
  store i16 %831, ptr %834, align 8, !tbaa !52
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #9
  store i64 1, ptr %17, align 8, !tbaa !25
  br label %835

835:                                              ; preds = %866, %821
  %836 = load i64, ptr %17, align 8, !tbaa !25
  %837 = load ptr, ptr %3, align 8, !tbaa !5
  %838 = getelementptr inbounds %struct.MDBX_cursor, ptr %837, i32 0, i32 6
  %839 = load ptr, ptr %838, align 8, !tbaa !22
  %840 = getelementptr inbounds %struct.tree, ptr %839, i32 0, i32 1
  %841 = load i16, ptr %840, align 2, !tbaa !23
  %842 = zext i16 %841 to i64
  %843 = icmp slt i64 %836, %842
  br i1 %843, label %845, label %844

844:                                              ; preds = %835
  store i32 59, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #9
  br label %869

845:                                              ; preds = %835
  %846 = load ptr, ptr %3, align 8, !tbaa !5
  %847 = getelementptr inbounds %struct.MDBX_cursor, ptr %846, i32 0, i32 9
  %848 = load i64, ptr %17, align 8, !tbaa !25
  %849 = add nsw i64 %848, 1
  %850 = getelementptr inbounds [32 x ptr], ptr %847, i64 0, i64 %849
  %851 = load ptr, ptr %850, align 8, !tbaa !5
  %852 = load ptr, ptr %3, align 8, !tbaa !5
  %853 = getelementptr inbounds %struct.MDBX_cursor, ptr %852, i32 0, i32 9
  %854 = load i64, ptr %17, align 8, !tbaa !25
  %855 = getelementptr inbounds [32 x ptr], ptr %853, i64 0, i64 %854
  store ptr %851, ptr %855, align 8, !tbaa !5
  %856 = load ptr, ptr %3, align 8, !tbaa !5
  %857 = getelementptr inbounds %struct.MDBX_cursor, ptr %856, i32 0, i32 10
  %858 = load i64, ptr %17, align 8, !tbaa !25
  %859 = add nsw i64 %858, 1
  %860 = getelementptr inbounds [32 x i16], ptr %857, i64 0, i64 %859
  %861 = load i16, ptr %860, align 2, !tbaa !52
  %862 = load ptr, ptr %3, align 8, !tbaa !5
  %863 = getelementptr inbounds %struct.MDBX_cursor, ptr %862, i32 0, i32 10
  %864 = load i64, ptr %17, align 8, !tbaa !25
  %865 = getelementptr inbounds [32 x i16], ptr %863, i64 0, i64 %864
  store i16 %861, ptr %865, align 2, !tbaa !52
  br label %866

866:                                              ; preds = %845
  %867 = load i64, ptr %17, align 8, !tbaa !25
  %868 = add nsw i64 %867, 1
  store i64 %868, ptr %17, align 8, !tbaa !25
  br label %835, !llvm.loop !53

869:                                              ; preds = %844
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #9
  %870 = load ptr, ptr %3, align 8, !tbaa !5
  %871 = getelementptr inbounds %struct.MDBX_cursor, ptr %870, i32 0, i32 5
  %872 = load ptr, ptr %871, align 8, !tbaa !14
  %873 = getelementptr inbounds %struct.MDBX_txn, ptr %872, i32 0, i32 14
  %874 = load ptr, ptr %873, align 8, !tbaa !46
  %875 = load ptr, ptr %3, align 8, !tbaa !5
  %876 = call i64 @cursor_dbi(ptr noundef %875) #8
  %877 = getelementptr inbounds ptr, ptr %874, i64 %876
  %878 = load ptr, ptr %877, align 8, !tbaa !5
  store ptr %878, ptr %18, align 8, !tbaa !5
  br label %879

879:                                              ; preds = %954, %869
  %880 = load ptr, ptr %18, align 8, !tbaa !5
  %881 = icmp ne ptr %880, null
  br i1 %881, label %883, label %882

882:                                              ; preds = %879
  store i32 62, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #9
  br label %958

883:                                              ; preds = %879
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #9
  %884 = load ptr, ptr %3, align 8, !tbaa !5
  %885 = getelementptr inbounds %struct.MDBX_cursor, ptr %884, i32 0, i32 1
  %886 = getelementptr inbounds %struct.anon.9, ptr %885, i32 0, i32 0
  %887 = load i8, ptr %886, align 4, !tbaa !21
  %888 = sext i8 %887 to i32
  %889 = and i32 %888, 1
  %890 = icmp ne i32 %889, 0
  br i1 %890, label %891, label %896

891:                                              ; preds = %883
  %892 = load ptr, ptr %18, align 8, !tbaa !5
  %893 = getelementptr inbounds %struct.MDBX_cursor, ptr %892, i32 0, i32 8
  %894 = load ptr, ptr %893, align 8, !tbaa !47
  %895 = getelementptr inbounds %struct.inner_cursor, ptr %894, i32 0, i32 0
  br label %898

896:                                              ; preds = %883
  %897 = load ptr, ptr %18, align 8, !tbaa !5
  br label %898

898:                                              ; preds = %896, %891
  %899 = phi ptr [ %895, %891 ], [ %897, %896 ]
  store ptr %899, ptr %19, align 8, !tbaa !5
  %900 = load ptr, ptr %3, align 8, !tbaa !5
  %901 = load ptr, ptr %19, align 8, !tbaa !5
  %902 = call zeroext i1 @is_related(ptr noundef %900, ptr noundef %901)
  br i1 %902, label %903, label %953

903:                                              ; preds = %898
  %904 = load ptr, ptr %19, align 8, !tbaa !5
  %905 = getelementptr inbounds %struct.MDBX_cursor, ptr %904, i32 0, i32 9
  %906 = getelementptr inbounds [32 x ptr], ptr %905, i64 0, i64 0
  %907 = load ptr, ptr %906, align 8, !tbaa !5
  %908 = load ptr, ptr %13, align 8, !tbaa !5
  %909 = icmp eq ptr %907, %908
  br i1 %909, label %910, label %953

910:                                              ; preds = %903
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #9
  store i64 0, ptr %20, align 8, !tbaa !25
  br label %911

911:                                              ; preds = %942, %910
  %912 = load i64, ptr %20, align 8, !tbaa !25
  %913 = load ptr, ptr %3, align 8, !tbaa !5
  %914 = getelementptr inbounds %struct.MDBX_cursor, ptr %913, i32 0, i32 6
  %915 = load ptr, ptr %914, align 8, !tbaa !22
  %916 = getelementptr inbounds %struct.tree, ptr %915, i32 0, i32 1
  %917 = load i16, ptr %916, align 2, !tbaa !23
  %918 = zext i16 %917 to i64
  %919 = icmp slt i64 %912, %918
  br i1 %919, label %921, label %920

920:                                              ; preds = %911
  store i32 65, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #9
  br label %945

921:                                              ; preds = %911
  %922 = load ptr, ptr %19, align 8, !tbaa !5
  %923 = getelementptr inbounds %struct.MDBX_cursor, ptr %922, i32 0, i32 9
  %924 = load i64, ptr %20, align 8, !tbaa !25
  %925 = add nsw i64 %924, 1
  %926 = getelementptr inbounds [32 x ptr], ptr %923, i64 0, i64 %925
  %927 = load ptr, ptr %926, align 8, !tbaa !5
  %928 = load ptr, ptr %19, align 8, !tbaa !5
  %929 = getelementptr inbounds %struct.MDBX_cursor, ptr %928, i32 0, i32 9
  %930 = load i64, ptr %20, align 8, !tbaa !25
  %931 = getelementptr inbounds [32 x ptr], ptr %929, i64 0, i64 %930
  store ptr %927, ptr %931, align 8, !tbaa !5
  %932 = load ptr, ptr %19, align 8, !tbaa !5
  %933 = getelementptr inbounds %struct.MDBX_cursor, ptr %932, i32 0, i32 10
  %934 = load i64, ptr %20, align 8, !tbaa !25
  %935 = add nsw i64 %934, 1
  %936 = getelementptr inbounds [32 x i16], ptr %933, i64 0, i64 %935
  %937 = load i16, ptr %936, align 2, !tbaa !52
  %938 = load ptr, ptr %19, align 8, !tbaa !5
  %939 = getelementptr inbounds %struct.MDBX_cursor, ptr %938, i32 0, i32 10
  %940 = load i64, ptr %20, align 8, !tbaa !25
  %941 = getelementptr inbounds [32 x i16], ptr %939, i64 0, i64 %940
  store i16 %937, ptr %941, align 2, !tbaa !52
  br label %942

942:                                              ; preds = %921
  %943 = load i64, ptr %20, align 8, !tbaa !25
  %944 = add nsw i64 %943, 1
  store i64 %944, ptr %20, align 8, !tbaa !25
  br label %911, !llvm.loop !54

945:                                              ; preds = %920
  %946 = load ptr, ptr %19, align 8, !tbaa !5
  %947 = getelementptr inbounds %struct.MDBX_cursor, ptr %946, i32 0, i32 1
  %948 = getelementptr inbounds %struct.anon.9, ptr %947, i32 0, i32 1
  %949 = load i8, ptr %948, align 1, !tbaa !21
  %950 = sext i8 %949 to i32
  %951 = sub nsw i32 %950, 1
  %952 = trunc i32 %951 to i8
  store i8 %952, ptr %948, align 1, !tbaa !21
  br label %953

953:                                              ; preds = %945, %903, %898
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #9
  br label %954

954:                                              ; preds = %953
  %955 = load ptr, ptr %18, align 8, !tbaa !5
  %956 = getelementptr inbounds %struct.MDBX_cursor, ptr %955, i32 0, i32 11
  %957 = load ptr, ptr %956, align 8, !tbaa !48
  store ptr %957, ptr %18, align 8, !tbaa !5
  br label %879, !llvm.loop !55

958:                                              ; preds = %882
  br label %959

959:                                              ; preds = %958
  %960 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %961 = zext i8 %960 to i32
  %962 = and i32 %961, 1
  %963 = icmp ne i32 %962, 0
  %964 = xor i1 %963, true
  %965 = xor i1 %964, true
  %966 = zext i1 %965 to i32
  %967 = sext i32 %966 to i64
  %968 = call i64 @llvm.expect.i64(i64 %967, i64 1)
  %969 = icmp ne i64 %968, 0
  br i1 %969, label %970, label %1015

970:                                              ; preds = %959
  br label %971

971:                                              ; preds = %970
  %972 = load ptr, ptr %3, align 8, !tbaa !5
  %973 = getelementptr inbounds %struct.MDBX_cursor, ptr %972, i32 0, i32 9
  %974 = load ptr, ptr %3, align 8, !tbaa !5
  %975 = getelementptr inbounds %struct.MDBX_cursor, ptr %974, i32 0, i32 1
  %976 = getelementptr inbounds %struct.anon.9, ptr %975, i32 0, i32 1
  %977 = load i8, ptr %976, align 1, !tbaa !21
  %978 = sext i8 %977 to i64
  %979 = getelementptr inbounds [32 x ptr], ptr %973, i64 0, i64 %978
  %980 = load ptr, ptr %979, align 8, !tbaa !5
  %981 = call zeroext i1 @is_leaf(ptr noundef %980) #8
  br i1 %981, label %997, label %982

982:                                              ; preds = %971
  %983 = load ptr, ptr %3, align 8, !tbaa !5
  %984 = getelementptr inbounds %struct.MDBX_cursor, ptr %983, i32 0, i32 9
  %985 = load ptr, ptr %3, align 8, !tbaa !5
  %986 = getelementptr inbounds %struct.MDBX_cursor, ptr %985, i32 0, i32 1
  %987 = getelementptr inbounds %struct.anon.9, ptr %986, i32 0, i32 1
  %988 = load i8, ptr %987, align 1, !tbaa !21
  %989 = sext i8 %988 to i64
  %990 = getelementptr inbounds [32 x ptr], ptr %984, i64 0, i64 %989
  %991 = load ptr, ptr %990, align 8, !tbaa !5
  %992 = call zeroext i8 @page_type(ptr noundef %991) #8
  %993 = zext i8 %992 to i32
  %994 = load i8, ptr %5, align 1, !tbaa !21
  %995 = zext i8 %994 to i32
  %996 = icmp eq i32 %993, %995
  br label %997

997:                                              ; preds = %982, %971
  %998 = phi i1 [ true, %971 ], [ %996, %982 ]
  %999 = xor i1 %998, true
  %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 %1012

1006:                                             ; preds = %997
  %1007 = load ptr, ptr %3, align 8, !tbaa !5
  %1008 = getelementptr inbounds %struct.MDBX_cursor, ptr %1007, i32 0, i32 5
  %1009 = load ptr, ptr %1008, align 8, !tbaa !14
  %1010 = getelementptr inbounds %struct.MDBX_txn, ptr %1009, i32 0, i32 9
  %1011 = load ptr, ptr %1010, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1011, ptr noundef @.str.25, ptr noundef @__func__.tree_rebalance, i32 noundef 767) #7
  unreachable

1012:                                             ; preds = %997
  br label %1013

1013:                                             ; preds = %1012
  br label %1014

1014:                                             ; preds = %1013
  br label %1015

1015:                                             ; preds = %1014, %959
  br label %1016

1016:                                             ; preds = %1015
  br label %1017

1017:                                             ; preds = %1016
  br label %1018

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

1029:                                             ; preds = %1018
  br label %1030

1030:                                             ; preds = %1029
  %1031 = load ptr, ptr %3, align 8, !tbaa !5
  %1032 = getelementptr inbounds %struct.MDBX_cursor, ptr %1031, i32 0, i32 1
  %1033 = getelementptr inbounds %struct.anon.9, ptr %1032, i32 0, i32 1
  %1034 = load i8, ptr %1033, align 1, !tbaa !21
  %1035 = sext i8 %1034 to i32
  %1036 = add nsw i32 %1035, 1
  %1037 = load ptr, ptr %3, align 8, !tbaa !5
  %1038 = getelementptr inbounds %struct.MDBX_cursor, ptr %1037, i32 0, i32 6
  %1039 = load ptr, ptr %1038, align 8, !tbaa !22
  %1040 = getelementptr inbounds %struct.tree, ptr %1039, i32 0, i32 1
  %1041 = load i16, ptr %1040, align 2, !tbaa !23
  %1042 = zext i16 %1041 to i32
  %1043 = icmp slt i32 %1036, %1042
  br i1 %1043, label %1058, label %1044

1044:                                             ; preds = %1030
  %1045 = load ptr, ptr %3, align 8, !tbaa !5
  %1046 = getelementptr inbounds %struct.MDBX_cursor, ptr %1045, i32 0, i32 9
  %1047 = load ptr, ptr %3, align 8, !tbaa !5
  %1048 = getelementptr inbounds %struct.MDBX_cursor, ptr %1047, i32 0, i32 6
  %1049 = load ptr, ptr %1048, align 8, !tbaa !22
  %1050 = getelementptr inbounds %struct.tree, ptr %1049, i32 0, i32 1
  %1051 = load i16, ptr %1050, align 2, !tbaa !23
  %1052 = zext i16 %1051 to i32
  %1053 = sub nsw i32 %1052, 1
  %1054 = sext i32 %1053 to i64
  %1055 = getelementptr inbounds [32 x ptr], ptr %1046, i64 0, i64 %1054
  %1056 = load ptr, ptr %1055, align 8, !tbaa !5
  %1057 = call zeroext i1 @is_leaf(ptr noundef %1056) #8
  br label %1058

1058:                                             ; preds = %1044, %1030
  %1059 = phi i1 [ true, %1030 ], [ %1057, %1044 ]
  %1060 = xor i1 %1059, true
  %1061 = xor i1 %1060, true
  %1062 = xor i1 %1061, true
  %1063 = zext i1 %1062 to i32
  %1064 = sext i32 %1063 to i64
  %1065 = call i64 @llvm.expect.i64(i64 %1064, i64 0)
  %1066 = icmp ne i64 %1065, 0
  br i1 %1066, label %1067, label %1073

1067:                                             ; preds = %1058
  %1068 = load ptr, ptr %3, align 8, !tbaa !5
  %1069 = getelementptr inbounds %struct.MDBX_cursor, ptr %1068, i32 0, i32 5
  %1070 = load ptr, ptr %1069, align 8, !tbaa !14
  %1071 = getelementptr inbounds %struct.MDBX_txn, ptr %1070, i32 0, i32 9
  %1072 = load ptr, ptr %1071, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1072, ptr noundef @.str.7, ptr noundef @__func__.tree_rebalance, i32 noundef 768) #7
  unreachable

1073:                                             ; preds = %1058
  br label %1074

1074:                                             ; preds = %1073
  br label %1075

1075:                                             ; preds = %1074
  br label %1076

1076:                                             ; preds = %1075, %1018
  br label %1077

1077:                                             ; preds = %1076
  br label %1078

1078:                                             ; preds = %1077
  %1079 = load ptr, ptr %3, align 8, !tbaa !5
  %1080 = load ptr, ptr %13, align 8, !tbaa !5
  %1081 = call i32 @page_retire(ptr noundef %1079, ptr noundef %1080)
  store i32 %1081, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %1104

1082:                                             ; preds = %773, %770
  br label %1083

1083:                                             ; preds = %1082
  %1084 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %1085 = zext i8 %1084 to i32
  %1086 = icmp sle i32 5, %1085
  %1087 = xor i1 %1086, true
  %1088 = xor i1 %1087, true
  %1089 = zext i1 %1088 to i32
  %1090 = sext i32 %1089 to i64
  %1091 = call i64 @llvm.expect.i64(i64 %1090, i64 0)
  %1092 = icmp ne i64 %1091, 0
  br i1 %1092, label %1093, label %1101

1093:                                             ; preds = %1083
  %1094 = load ptr, ptr %13, align 8, !tbaa !5
  %1095 = getelementptr inbounds %struct.page, ptr %1094, i32 0, i32 4
  %1096 = load i32, ptr %1095, align 1, !tbaa !41
  %1097 = load ptr, ptr %13, align 8, !tbaa !5
  %1098 = getelementptr inbounds %struct.page, ptr %1097, i32 0, i32 2
  %1099 = load i16, ptr %1098, align 1, !tbaa !52
  %1100 = zext i16 %1099 to i32
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.tree_rebalance, i32 noundef 771, ptr noundef @.str.26, i32 noundef %1096, i32 noundef %1100)
  br label %1101

1101:                                             ; preds = %1093, %1083
  br label %1102

1102:                                             ; preds = %1101
  br label %1103

1103:                                             ; preds = %1102
  store i32 0, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %1104

1104:                                             ; preds = %1103, %1078, %819, %769, %706, %705
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  br label %2420

1105:                                             ; preds = %449
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #9
  %1106 = load ptr, ptr %3, align 8, !tbaa !5
  %1107 = getelementptr inbounds %struct.MDBX_cursor, ptr %1106, i32 0, i32 1
  %1108 = getelementptr inbounds %struct.anon.9, ptr %1107, i32 0, i32 1
  %1109 = load i8, ptr %1108, align 1, !tbaa !21
  %1110 = sext i8 %1109 to i32
  %1111 = sub nsw i32 %1110, 1
  %1112 = sext i32 %1111 to i64
  store i64 %1112, ptr %21, align 8, !tbaa !25
  br label %1113

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

1124:                                             ; preds = %1113
  br label %1125

1125:                                             ; preds = %1124
  %1126 = load ptr, ptr %3, align 8, !tbaa !5
  %1127 = getelementptr inbounds %struct.MDBX_cursor, ptr %1126, i32 0, i32 9
  %1128 = load i64, ptr %21, align 8, !tbaa !25
  %1129 = getelementptr inbounds [32 x ptr], ptr %1127, i64 0, i64 %1128
  %1130 = load ptr, ptr %1129, align 8, !tbaa !5
  %1131 = call zeroext i1 @is_branch(ptr noundef %1130) #8
  %1132 = xor i1 %1131, true
  %1133 = xor i1 %1132, true
  %1134 = xor i1 %1133, true
  %1135 = zext i1 %1134 to i32
  %1136 = sext i32 %1135 to i64
  %1137 = call i64 @llvm.expect.i64(i64 %1136, i64 0)
  %1138 = icmp ne i64 %1137, 0
  br i1 %1138, label %1139, label %1145

1139:                                             ; preds = %1125
  %1140 = load ptr, ptr %3, align 8, !tbaa !5
  %1141 = getelementptr inbounds %struct.MDBX_cursor, ptr %1140, i32 0, i32 5
  %1142 = load ptr, ptr %1141, align 8, !tbaa !14
  %1143 = getelementptr inbounds %struct.MDBX_txn, ptr %1142, i32 0, i32 9
  %1144 = load ptr, ptr %1143, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1144, ptr noundef @.str.27, ptr noundef @__func__.tree_rebalance, i32 noundef 778) #7
  unreachable

1145:                                             ; preds = %1125
  br label %1146

1146:                                             ; preds = %1145
  br label %1147

1147:                                             ; preds = %1146
  br label %1148

1148:                                             ; preds = %1147, %1113
  br label %1149

1149:                                             ; preds = %1148
  br label %1150

1150:                                             ; preds = %1149
  br label %1151

1151:                                             ; preds = %1150
  %1152 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1153 = zext i8 %1152 to i32
  %1154 = and i32 %1153, 1
  %1155 = icmp ne i32 %1154, 0
  %1156 = xor i1 %1155, true
  %1157 = xor i1 %1156, true
  %1158 = zext i1 %1157 to i32
  %1159 = sext i32 %1158 to i64
  %1160 = call i64 @llvm.expect.i64(i64 %1159, i64 1)
  %1161 = icmp ne i64 %1160, 0
  br i1 %1161, label %1162, label %1186

1162:                                             ; preds = %1151
  br label %1163

1163:                                             ; preds = %1162
  %1164 = load ptr, ptr %3, align 8, !tbaa !5
  %1165 = getelementptr inbounds %struct.MDBX_cursor, ptr %1164, i32 0, i32 9
  %1166 = getelementptr inbounds [32 x ptr], ptr %1165, i64 0, i64 0
  %1167 = load ptr, ptr %1166, align 8, !tbaa !5
  %1168 = call zeroext i1 @is_subpage(ptr noundef %1167) #8
  %1169 = xor i1 %1168, true
  %1170 = xor i1 %1169, true
  %1171 = xor i1 %1170, true
  %1172 = xor i1 %1171, true
  %1173 = zext i1 %1172 to i32
  %1174 = sext i32 %1173 to i64
  %1175 = call i64 @llvm.expect.i64(i64 %1174, i64 0)
  %1176 = icmp ne i64 %1175, 0
  br i1 %1176, label %1177, label %1183

1177:                                             ; preds = %1163
  %1178 = load ptr, ptr %3, align 8, !tbaa !5
  %1179 = getelementptr inbounds %struct.MDBX_cursor, ptr %1178, i32 0, i32 5
  %1180 = load ptr, ptr %1179, align 8, !tbaa !14
  %1181 = getelementptr inbounds %struct.MDBX_txn, ptr %1180, i32 0, i32 9
  %1182 = load ptr, ptr %1181, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1182, ptr noundef @.str.28, ptr noundef @__func__.tree_rebalance, i32 noundef 779) #7
  unreachable

1183:                                             ; preds = %1163
  br label %1184

1184:                                             ; preds = %1183
  br label %1185

1185:                                             ; preds = %1184
  br label %1186

1186:                                             ; preds = %1185, %1151
  br label %1187

1187:                                             ; preds = %1186
  br label %1188

1188:                                             ; preds = %1187
  br label %1189

1189:                                             ; preds = %1188
  %1190 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1191 = zext i8 %1190 to i32
  %1192 = and i32 %1191, 1
  %1193 = icmp ne i32 %1192, 0
  %1194 = xor i1 %1193, true
  %1195 = xor i1 %1194, true
  %1196 = zext i1 %1195 to i32
  %1197 = sext i32 %1196 to i64
  %1198 = call i64 @llvm.expect.i64(i64 %1197, i64 1)
  %1199 = icmp ne i64 %1198, 0
  br i1 %1199, label %1200, label %1225

1200:                                             ; preds = %1189
  br label %1201

1201:                                             ; preds = %1200
  %1202 = load ptr, ptr %3, align 8, !tbaa !5
  %1203 = getelementptr inbounds %struct.MDBX_cursor, ptr %1202, i32 0, i32 9
  %1204 = load i64, ptr %21, align 8, !tbaa !25
  %1205 = getelementptr inbounds [32 x ptr], ptr %1203, i64 0, i64 %1204
  %1206 = load ptr, ptr %1205, align 8, !tbaa !5
  %1207 = call i64 @page_numkeys(ptr noundef %1206) #8
  %1208 = icmp ugt i64 %1207, 1
  %1209 = xor i1 %1208, true
  %1210 = xor i1 %1209, true
  %1211 = xor i1 %1210, true
  %1212 = zext i1 %1211 to i32
  %1213 = sext i32 %1212 to i64
  %1214 = call i64 @llvm.expect.i64(i64 %1213, i64 0)
  %1215 = icmp ne i64 %1214, 0
  br i1 %1215, label %1216, label %1222

1216:                                             ; preds = %1201
  %1217 = load ptr, ptr %3, align 8, !tbaa !5
  %1218 = getelementptr inbounds %struct.MDBX_cursor, ptr %1217, i32 0, i32 5
  %1219 = load ptr, ptr %1218, align 8, !tbaa !14
  %1220 = getelementptr inbounds %struct.MDBX_txn, ptr %1219, i32 0, i32 9
  %1221 = load ptr, ptr %1220, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1221, ptr noundef @.str.29, ptr noundef @__func__.tree_rebalance, i32 noundef 780) #7
  unreachable

1222:                                             ; preds = %1201
  br label %1223

1223:                                             ; preds = %1222
  br label %1224

1224:                                             ; preds = %1223
  br label %1225

1225:                                             ; preds = %1224, %1189
  br label %1226

1226:                                             ; preds = %1225
  br label %1227

1227:                                             ; preds = %1226
  call void @llvm.lifetime.start.p0(i64 824, ptr %22) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #9
  %1228 = load ptr, ptr %3, align 8, !tbaa !5
  %1229 = call ptr @cursor_clone(ptr noundef %1228, ptr noundef %22)
  store ptr %1229, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #9
  store ptr null, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #9
  store ptr null, ptr %25, align 8, !tbaa !5
  %1230 = load ptr, ptr %23, align 8, !tbaa !5
  %1231 = getelementptr inbounds %struct.MDBX_cursor, ptr %1230, i32 0, i32 10
  %1232 = load i64, ptr %21, align 8, !tbaa !25
  %1233 = getelementptr inbounds [32 x i16], ptr %1231, i64 0, i64 %1232
  %1234 = load i16, ptr %1233, align 2, !tbaa !52
  %1235 = zext i16 %1234 to i32
  %1236 = icmp sgt i32 %1235, 0
  br i1 %1236, label %1237, label %1324

1237:                                             ; preds = %1227
  %1238 = load ptr, ptr %23, align 8, !tbaa !5
  %1239 = load ptr, ptr %23, align 8, !tbaa !5
  %1240 = getelementptr inbounds %struct.MDBX_cursor, ptr %1239, i32 0, i32 9
  %1241 = load i64, ptr %21, align 8, !tbaa !25
  %1242 = getelementptr inbounds [32 x ptr], ptr %1240, i64 0, i64 %1241
  %1243 = load ptr, ptr %1242, align 8, !tbaa !5
  %1244 = load ptr, ptr %23, align 8, !tbaa !5
  %1245 = getelementptr inbounds %struct.MDBX_cursor, ptr %1244, i32 0, i32 10
  %1246 = load i64, ptr %21, align 8, !tbaa !25
  %1247 = getelementptr inbounds [32 x i16], ptr %1245, i64 0, i64 %1246
  %1248 = load i16, ptr %1247, align 2, !tbaa !52
  %1249 = zext i16 %1248 to i32
  %1250 = sub nsw i32 %1249, 1
  %1251 = sext i32 %1250 to i64
  %1252 = call ptr @page_node(ptr noundef %1243, i64 noundef %1251) #8
  %1253 = call i32 @node_pgno(ptr noundef %1252) #8
  %1254 = load ptr, ptr %3, align 8, !tbaa !5
  %1255 = getelementptr inbounds %struct.MDBX_cursor, ptr %1254, i32 0, i32 9
  %1256 = load ptr, ptr %3, align 8, !tbaa !5
  %1257 = getelementptr inbounds %struct.MDBX_cursor, ptr %1256, i32 0, i32 1
  %1258 = getelementptr inbounds %struct.anon.9, ptr %1257, i32 0, i32 1
  %1259 = load i8, ptr %1258, align 1, !tbaa !21
  %1260 = sext i8 %1259 to i64
  %1261 = getelementptr inbounds [32 x ptr], ptr %1255, i64 0, i64 %1260
  %1262 = load ptr, ptr %1261, align 8, !tbaa !5
  %1263 = getelementptr inbounds %struct.page, ptr %1262, i32 0, i32 0
  %1264 = load i64, ptr %1263, align 1, !tbaa !25
  %1265 = call i32 @page_get(ptr noundef %1238, i32 noundef %1253, ptr noundef %24, i64 noundef %1264)
  store i32 %1265, ptr %12, align 4, !tbaa !41
  %1266 = load i32, ptr %12, align 4, !tbaa !41
  %1267 = icmp ne i32 %1266, 0
  %1268 = xor i1 %1267, true
  %1269 = xor i1 %1268, true
  %1270 = zext i1 %1269 to i32
  %1271 = sext i32 %1270 to i64
  %1272 = call i64 @llvm.expect.i64(i64 %1271, i64 0)
  %1273 = icmp ne i64 %1272, 0
  br i1 %1273, label %1274, label %1276

1274:                                             ; preds = %1237
  %1275 = load i32, ptr %12, align 4, !tbaa !41
  store i32 %1275, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2419

1276:                                             ; preds = %1237
  br label %1277

1277:                                             ; preds = %1276
  %1278 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1279 = zext i8 %1278 to i32
  %1280 = and i32 %1279, 1
  %1281 = icmp ne i32 %1280, 0
  %1282 = xor i1 %1281, true
  %1283 = xor i1 %1282, true
  %1284 = zext i1 %1283 to i32
  %1285 = sext i32 %1284 to i64
  %1286 = call i64 @llvm.expect.i64(i64 %1285, i64 1)
  %1287 = icmp ne i64 %1286, 0
  br i1 %1287, label %1288, label %1321

1288:                                             ; preds = %1277
  br label %1289

1289:                                             ; preds = %1288
  %1290 = load ptr, ptr %24, align 8, !tbaa !5
  %1291 = call zeroext i8 @page_type(ptr noundef %1290) #8
  %1292 = zext i8 %1291 to i32
  %1293 = load ptr, ptr %3, align 8, !tbaa !5
  %1294 = getelementptr inbounds %struct.MDBX_cursor, ptr %1293, i32 0, i32 9
  %1295 = load ptr, ptr %3, align 8, !tbaa !5
  %1296 = getelementptr inbounds %struct.MDBX_cursor, ptr %1295, i32 0, i32 1
  %1297 = getelementptr inbounds %struct.anon.9, ptr %1296, i32 0, i32 1
  %1298 = load i8, ptr %1297, align 1, !tbaa !21
  %1299 = sext i8 %1298 to i64
  %1300 = getelementptr inbounds [32 x ptr], ptr %1294, i64 0, i64 %1299
  %1301 = load ptr, ptr %1300, align 8, !tbaa !5
  %1302 = call zeroext i8 @page_type(ptr noundef %1301) #8
  %1303 = zext i8 %1302 to i32
  %1304 = icmp eq i32 %1292, %1303
  %1305 = xor i1 %1304, true
  %1306 = xor i1 %1305, true
  %1307 = xor i1 %1306, true
  %1308 = zext i1 %1307 to i32
  %1309 = sext i32 %1308 to i64
  %1310 = call i64 @llvm.expect.i64(i64 %1309, i64 0)
  %1311 = icmp ne i64 %1310, 0
  br i1 %1311, label %1312, label %1318

1312:                                             ; preds = %1289
  %1313 = load ptr, ptr %3, align 8, !tbaa !5
  %1314 = getelementptr inbounds %struct.MDBX_cursor, ptr %1313, i32 0, i32 5
  %1315 = load ptr, ptr %1314, align 8, !tbaa !14
  %1316 = getelementptr inbounds %struct.MDBX_txn, ptr %1315, i32 0, i32 9
  %1317 = load ptr, ptr %1316, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1317, ptr noundef @.str.30, ptr noundef @__func__.tree_rebalance, i32 noundef 795) #7
  unreachable

1318:                                             ; preds = %1289
  br label %1319

1319:                                             ; preds = %1318
  br label %1320

1320:                                             ; preds = %1319
  br label %1321

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

1322:                                             ; preds = %1321
  br label %1323

1323:                                             ; preds = %1322
  br label %1324

1324:                                             ; preds = %1323, %1227
  %1325 = load ptr, ptr %23, align 8, !tbaa !5
  %1326 = getelementptr inbounds %struct.MDBX_cursor, ptr %1325, i32 0, i32 10
  %1327 = load i64, ptr %21, align 8, !tbaa !25
  %1328 = getelementptr inbounds [32 x i16], ptr %1326, i64 0, i64 %1327
  %1329 = load i16, ptr %1328, align 2, !tbaa !52
  %1330 = zext i16 %1329 to i64
  %1331 = add i64 %1330, 1
  %1332 = load ptr, ptr %23, align 8, !tbaa !5
  %1333 = getelementptr inbounds %struct.MDBX_cursor, ptr %1332, i32 0, i32 9
  %1334 = load i64, ptr %21, align 8, !tbaa !25
  %1335 = getelementptr inbounds [32 x ptr], ptr %1333, i64 0, i64 %1334
  %1336 = load ptr, ptr %1335, align 8, !tbaa !5
  %1337 = call i64 @page_numkeys(ptr noundef %1336) #8
  %1338 = icmp ult i64 %1331, %1337
  br i1 %1338, label %1339, label %1425

1339:                                             ; preds = %1324
  %1340 = load ptr, ptr %23, align 8, !tbaa !5
  %1341 = load ptr, ptr %23, align 8, !tbaa !5
  %1342 = getelementptr inbounds %struct.MDBX_cursor, ptr %1341, i32 0, i32 9
  %1343 = load i64, ptr %21, align 8, !tbaa !25
  %1344 = getelementptr inbounds [32 x ptr], ptr %1342, i64 0, i64 %1343
  %1345 = load ptr, ptr %1344, align 8, !tbaa !5
  %1346 = load ptr, ptr %23, align 8, !tbaa !5
  %1347 = getelementptr inbounds %struct.MDBX_cursor, ptr %1346, i32 0, i32 10
  %1348 = load i64, ptr %21, align 8, !tbaa !25
  %1349 = getelementptr inbounds [32 x i16], ptr %1347, i64 0, i64 %1348
  %1350 = load i16, ptr %1349, align 2, !tbaa !52
  %1351 = zext i16 %1350 to i64
  %1352 = add i64 %1351, 1
  %1353 = call ptr @page_node(ptr noundef %1345, i64 noundef %1352) #8
  %1354 = call i32 @node_pgno(ptr noundef %1353) #8
  %1355 = load ptr, ptr %3, align 8, !tbaa !5
  %1356 = getelementptr inbounds %struct.MDBX_cursor, ptr %1355, i32 0, i32 9
  %1357 = load ptr, ptr %3, align 8, !tbaa !5
  %1358 = getelementptr inbounds %struct.MDBX_cursor, ptr %1357, i32 0, i32 1
  %1359 = getelementptr inbounds %struct.anon.9, ptr %1358, i32 0, i32 1
  %1360 = load i8, ptr %1359, align 1, !tbaa !21
  %1361 = sext i8 %1360 to i64
  %1362 = getelementptr inbounds [32 x ptr], ptr %1356, i64 0, i64 %1361
  %1363 = load ptr, ptr %1362, align 8, !tbaa !5
  %1364 = getelementptr inbounds %struct.page, ptr %1363, i32 0, i32 0
  %1365 = load i64, ptr %1364, align 1, !tbaa !25
  %1366 = call i32 @page_get(ptr noundef %1340, i32 noundef %1354, ptr noundef %25, i64 noundef %1365)
  store i32 %1366, ptr %12, align 4, !tbaa !41
  %1367 = load i32, ptr %12, align 4, !tbaa !41
  %1368 = icmp ne i32 %1367, 0
  %1369 = xor i1 %1368, true
  %1370 = xor i1 %1369, true
  %1371 = zext i1 %1370 to i32
  %1372 = sext i32 %1371 to i64
  %1373 = call i64 @llvm.expect.i64(i64 %1372, i64 0)
  %1374 = icmp ne i64 %1373, 0
  br i1 %1374, label %1375, label %1377

1375:                                             ; preds = %1339
  %1376 = load i32, ptr %12, align 4, !tbaa !41
  store i32 %1376, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2419

1377:                                             ; preds = %1339
  br label %1378

1378:                                             ; preds = %1377
  %1379 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1380 = zext i8 %1379 to i32
  %1381 = and i32 %1380, 1
  %1382 = icmp ne i32 %1381, 0
  %1383 = xor i1 %1382, true
  %1384 = xor i1 %1383, true
  %1385 = zext i1 %1384 to i32
  %1386 = sext i32 %1385 to i64
  %1387 = call i64 @llvm.expect.i64(i64 %1386, i64 1)
  %1388 = icmp ne i64 %1387, 0
  br i1 %1388, label %1389, label %1422

1389:                                             ; preds = %1378
  br label %1390

1390:                                             ; preds = %1389
  %1391 = load ptr, ptr %25, align 8, !tbaa !5
  %1392 = call zeroext i8 @page_type(ptr noundef %1391) #8
  %1393 = zext i8 %1392 to i32
  %1394 = load ptr, ptr %3, align 8, !tbaa !5
  %1395 = getelementptr inbounds %struct.MDBX_cursor, ptr %1394, i32 0, i32 9
  %1396 = load ptr, ptr %3, align 8, !tbaa !5
  %1397 = getelementptr inbounds %struct.MDBX_cursor, ptr %1396, i32 0, i32 1
  %1398 = getelementptr inbounds %struct.anon.9, ptr %1397, i32 0, i32 1
  %1399 = load i8, ptr %1398, align 1, !tbaa !21
  %1400 = sext i8 %1399 to i64
  %1401 = getelementptr inbounds [32 x ptr], ptr %1395, i64 0, i64 %1400
  %1402 = load ptr, ptr %1401, align 8, !tbaa !5
  %1403 = call zeroext i8 @page_type(ptr noundef %1402) #8
  %1404 = zext i8 %1403 to i32
  %1405 = icmp eq i32 %1393, %1404
  %1406 = xor i1 %1405, true
  %1407 = xor i1 %1406, true
  %1408 = xor i1 %1407, true
  %1409 = zext i1 %1408 to i32
  %1410 = sext i32 %1409 to i64
  %1411 = call i64 @llvm.expect.i64(i64 %1410, i64 0)
  %1412 = icmp ne i64 %1411, 0
  br i1 %1412, label %1413, label %1419

1413:                                             ; preds = %1390
  %1414 = load ptr, ptr %3, align 8, !tbaa !5
  %1415 = getelementptr inbounds %struct.MDBX_cursor, ptr %1414, i32 0, i32 5
  %1416 = load ptr, ptr %1415, align 8, !tbaa !14
  %1417 = getelementptr inbounds %struct.MDBX_txn, ptr %1416, i32 0, i32 9
  %1418 = load ptr, ptr %1417, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1418, ptr noundef @.str.31, ptr noundef @__func__.tree_rebalance, i32 noundef 802) #7
  unreachable

1419:                                             ; preds = %1390
  br label %1420

1420:                                             ; preds = %1419
  br label %1421

1421:                                             ; preds = %1420
  br label %1422

1422:                                             ; preds = %1421, %1378
  br label %1423

1423:                                             ; preds = %1422
  br label %1424

1424:                                             ; preds = %1423
  br label %1425

1425:                                             ; preds = %1424, %1324
  br label %1426

1426:                                             ; preds = %1425
  %1427 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1428 = zext i8 %1427 to i32
  %1429 = and i32 %1428, 1
  %1430 = icmp ne i32 %1429, 0
  %1431 = xor i1 %1430, true
  %1432 = xor i1 %1431, true
  %1433 = zext i1 %1432 to i32
  %1434 = sext i32 %1433 to i64
  %1435 = call i64 @llvm.expect.i64(i64 %1434, i64 1)
  %1436 = icmp ne i64 %1435, 0
  br i1 %1436, label %1437, label %1462

1437:                                             ; preds = %1426
  br label %1438

1438:                                             ; preds = %1437
  %1439 = load ptr, ptr %24, align 8, !tbaa !5
  %1440 = icmp ne ptr %1439, null
  br i1 %1440, label %1444, label %1441

1441:                                             ; preds = %1438
  %1442 = load ptr, ptr %25, align 8, !tbaa !5
  %1443 = icmp ne ptr %1442, null
  br label %1444

1444:                                             ; preds = %1441, %1438
  %1445 = phi i1 [ true, %1438 ], [ %1443, %1441 ]
  %1446 = xor i1 %1445, true
  %1447 = xor i1 %1446, true
  %1448 = xor i1 %1447, true
  %1449 = zext i1 %1448 to i32
  %1450 = sext i32 %1449 to i64
  %1451 = call i64 @llvm.expect.i64(i64 %1450, i64 0)
  %1452 = icmp ne i64 %1451, 0
  br i1 %1452, label %1453, label %1459

1453:                                             ; preds = %1444
  %1454 = load ptr, ptr %3, align 8, !tbaa !5
  %1455 = getelementptr inbounds %struct.MDBX_cursor, ptr %1454, i32 0, i32 5
  %1456 = load ptr, ptr %1455, align 8, !tbaa !14
  %1457 = getelementptr inbounds %struct.MDBX_txn, ptr %1456, i32 0, i32 9
  %1458 = load ptr, ptr %1457, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1458, ptr noundef @.str.32, ptr noundef @__func__.tree_rebalance, i32 noundef 804) #7
  unreachable

1459:                                             ; preds = %1444
  br label %1460

1460:                                             ; preds = %1459
  br label %1461

1461:                                             ; preds = %1460
  br label %1462

1462:                                             ; preds = %1461, %1426
  br label %1463

1463:                                             ; preds = %1462
  br label %1464

1464:                                             ; preds = %1463
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #9
  %1465 = load ptr, ptr %3, align 8, !tbaa !5
  %1466 = getelementptr inbounds %struct.MDBX_cursor, ptr %1465, i32 0, i32 10
  %1467 = load ptr, ptr %3, align 8, !tbaa !5
  %1468 = getelementptr inbounds %struct.MDBX_cursor, ptr %1467, i32 0, i32 1
  %1469 = getelementptr inbounds %struct.anon.9, ptr %1468, i32 0, i32 1
  %1470 = load i8, ptr %1469, align 1, !tbaa !21
  %1471 = sext i8 %1470 to i64
  %1472 = getelementptr inbounds [32 x i16], ptr %1466, i64 0, i64 %1471
  %1473 = load i16, ptr %1472, align 2, !tbaa !52
  %1474 = zext i16 %1473 to i64
  store i64 %1474, ptr %26, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #9
  %1475 = load ptr, ptr %23, align 8, !tbaa !5
  %1476 = getelementptr inbounds %struct.MDBX_cursor, ptr %1475, i32 0, i32 10
  %1477 = load i64, ptr %21, align 8, !tbaa !25
  %1478 = getelementptr inbounds [32 x i16], ptr %1476, i64 0, i64 %1477
  %1479 = load i16, ptr %1478, align 2, !tbaa !52
  %1480 = zext i16 %1479 to i64
  store i64 %1480, ptr %27, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #9
  %1481 = load ptr, ptr %23, align 8, !tbaa !5
  %1482 = getelementptr inbounds %struct.MDBX_cursor, ptr %1481, i32 0, i32 9
  %1483 = load ptr, ptr %23, align 8, !tbaa !5
  %1484 = getelementptr inbounds %struct.MDBX_cursor, ptr %1483, i32 0, i32 1
  %1485 = getelementptr inbounds %struct.anon.9, ptr %1484, i32 0, i32 1
  %1486 = load i8, ptr %1485, align 1, !tbaa !21
  %1487 = sext i8 %1486 to i64
  %1488 = getelementptr inbounds [32 x ptr], ptr %1482, i64 0, i64 %1487
  %1489 = load ptr, ptr %1488, align 8, !tbaa !5
  %1490 = call i64 @page_numkeys(ptr noundef %1489) #8
  store i64 %1490, ptr %28, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #9
  %1491 = load ptr, ptr %24, align 8, !tbaa !5
  %1492 = icmp ne ptr %1491, null
  br i1 %1492, label %1493, label %1496

1493:                                             ; preds = %1464
  %1494 = load ptr, ptr %24, align 8, !tbaa !5
  %1495 = call i64 @page_room(ptr noundef %1494) #8
  br label %1497

1496:                                             ; preds = %1464
  br label %1497

1497:                                             ; preds = %1496, %1493
  %1498 = phi i64 [ %1495, %1493 ], [ 0, %1496 ]
  store i64 %1498, ptr %29, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #9
  %1499 = load ptr, ptr %25, align 8, !tbaa !5
  %1500 = icmp ne ptr %1499, null
  br i1 %1500, label %1501, label %1504

1501:                                             ; preds = %1497
  %1502 = load ptr, ptr %25, align 8, !tbaa !5
  %1503 = call i64 @page_room(ptr noundef %1502) #8
  br label %1505

1504:                                             ; preds = %1497
  br label %1505

1505:                                             ; preds = %1504, %1501
  %1506 = phi i64 [ %1503, %1501 ], [ 0, %1504 ]
  store i64 %1506, ptr %30, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #9
  %1507 = load ptr, ptr %24, align 8, !tbaa !5
  %1508 = icmp ne ptr %1507, null
  br i1 %1508, label %1509, label %1512

1509:                                             ; preds = %1505
  %1510 = load ptr, ptr %24, align 8, !tbaa !5
  %1511 = call i64 @page_numkeys(ptr noundef %1510) #8
  br label %1513

1512:                                             ; preds = %1505
  br label %1513

1513:                                             ; preds = %1512, %1509
  %1514 = phi i64 [ %1511, %1509 ], [ 0, %1512 ]
  store i64 %1514, ptr %31, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #9
  %1515 = load ptr, ptr %25, align 8, !tbaa !5
  %1516 = icmp ne ptr %1515, null
  br i1 %1516, label %1517, label %1520

1517:                                             ; preds = %1513
  %1518 = load ptr, ptr %25, align 8, !tbaa !5
  %1519 = call i64 @page_numkeys(ptr noundef %1518) #8
  br label %1521

1520:                                             ; preds = %1513
  br label %1521

1521:                                             ; preds = %1520, %1517
  %1522 = phi i64 [ %1519, %1517 ], [ 0, %1520 ]
  store i64 %1522, ptr %32, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 1, ptr %33) #9
  %1523 = load ptr, ptr %24, align 8, !tbaa !5
  %1524 = icmp ne ptr %1523, null
  br i1 %1524, label %1525, label %1528

1525:                                             ; preds = %1521
  %1526 = load ptr, ptr %25, align 8, !tbaa !5
  %1527 = icmp ne ptr %1526, null
  br label %1528

1528:                                             ; preds = %1525, %1521
  %1529 = phi i1 [ false, %1521 ], [ %1527, %1525 ]
  %1530 = xor i1 %1529, true
  %1531 = zext i1 %1530 to i8
  store i8 %1531, ptr %33, align 1, !tbaa !38
  br label %1532

1532:                                             ; preds = %2370, %2366, %2362, %1528
  br label %1533

1533:                                             ; preds = %1532
  %1534 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1535 = zext i8 %1534 to i32
  %1536 = and i32 %1535, 1
  %1537 = icmp ne i32 %1536, 0
  %1538 = xor i1 %1537, true
  %1539 = xor i1 %1538, true
  %1540 = zext i1 %1539 to i32
  %1541 = sext i32 %1540 to i64
  %1542 = call i64 @llvm.expect.i64(i64 %1541, i64 1)
  %1543 = icmp ne i64 %1542, 0
  br i1 %1543, label %1544, label %1568

1544:                                             ; preds = %1533
  br label %1545

1545:                                             ; preds = %1544
  %1546 = load ptr, ptr %3, align 8, !tbaa !5
  %1547 = getelementptr inbounds %struct.MDBX_cursor, ptr %1546, i32 0, i32 1
  %1548 = getelementptr inbounds %struct.anon.9, ptr %1547, i32 0, i32 1
  %1549 = load i8, ptr %1548, align 1, !tbaa !21
  %1550 = sext i8 %1549 to i32
  %1551 = icmp sgt i32 %1550, 0
  %1552 = xor i1 %1551, true
  %1553 = xor i1 %1552, true
  %1554 = xor i1 %1553, true
  %1555 = zext i1 %1554 to i32
  %1556 = sext i32 %1555 to i64
  %1557 = call i64 @llvm.expect.i64(i64 %1556, i64 0)
  %1558 = icmp ne i64 %1557, 0
  br i1 %1558, label %1559, label %1565

1559:                                             ; preds = %1545
  %1560 = load ptr, ptr %3, align 8, !tbaa !5
  %1561 = getelementptr inbounds %struct.MDBX_cursor, ptr %1560, i32 0, i32 5
  %1562 = load ptr, ptr %1561, align 8, !tbaa !14
  %1563 = getelementptr inbounds %struct.MDBX_txn, ptr %1562, i32 0, i32 9
  %1564 = load ptr, ptr %1563, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1564, ptr noundef @.str.33, ptr noundef @__func__.tree_rebalance, i32 noundef 830) #7
  unreachable

1565:                                             ; preds = %1545
  br label %1566

1566:                                             ; preds = %1565
  br label %1567

1567:                                             ; preds = %1566
  br label %1568

1568:                                             ; preds = %1567, %1533
  br label %1569

1569:                                             ; preds = %1568
  br label %1570

1570:                                             ; preds = %1569
  %1571 = load ptr, ptr %24, align 8, !tbaa !5
  %1572 = icmp ne ptr %1571, null
  br i1 %1572, label %1573, label %1584

1573:                                             ; preds = %1570
  %1574 = load i8, ptr %33, align 1, !tbaa !38, !range !36, !noundef !37
  %1575 = trunc i8 %1574 to i1
  br i1 %1575, label %1582, label %1576

1576:                                             ; preds = %1573
  %1577 = load ptr, ptr %3, align 8, !tbaa !5
  %1578 = getelementptr inbounds %struct.MDBX_cursor, ptr %1577, i32 0, i32 5
  %1579 = load ptr, ptr %1578, align 8, !tbaa !14
  %1580 = load ptr, ptr %24, align 8, !tbaa !5
  %1581 = call zeroext i1 @is_modifable(ptr noundef %1579, ptr noundef %1580) #8
  br label %1582

1582:                                             ; preds = %1576, %1573
  %1583 = phi i1 [ true, %1573 ], [ %1581, %1576 ]
  br label %1584

1584:                                             ; preds = %1582, %1570
  %1585 = phi i1 [ false, %1570 ], [ %1583, %1582 ]
  %1586 = zext i1 %1585 to i8
  store i8 %1586, ptr %34, align 1, !tbaa !38
  %1587 = load ptr, ptr %25, align 8, !tbaa !5
  %1588 = icmp ne ptr %1587, null
  br i1 %1588, label %1589, label %1600

1589:                                             ; preds = %1584
  %1590 = load i8, ptr %33, align 1, !tbaa !38, !range !36, !noundef !37
  %1591 = trunc i8 %1590 to i1
  br i1 %1591, label %1598, label %1592

1592:                                             ; preds = %1589
  %1593 = load ptr, ptr %3, align 8, !tbaa !5
  %1594 = getelementptr inbounds %struct.MDBX_cursor, ptr %1593, i32 0, i32 5
  %1595 = load ptr, ptr %1594, align 8, !tbaa !14
  %1596 = load ptr, ptr %25, align 8, !tbaa !5
  %1597 = call zeroext i1 @is_modifable(ptr noundef %1595, ptr noundef %1596) #8
  br label %1598

1598:                                             ; preds = %1592, %1589
  %1599 = phi i1 [ true, %1589 ], [ %1597, %1592 ]
  br label %1600

1600:                                             ; preds = %1598, %1584
  %1601 = phi i1 [ false, %1584 ], [ %1599, %1598 ]
  %1602 = zext i1 %1601 to i8
  store i8 %1602, ptr %35, align 1, !tbaa !38
  %1603 = load i8, ptr %34, align 1, !tbaa !38, !range !36, !noundef !37
  %1604 = trunc i8 %1603 to i1
  br i1 %1604, label %1605, label %1826

1605:                                             ; preds = %1600
  %1606 = load i64, ptr %29, align 8, !tbaa !25
  %1607 = load i64, ptr %7, align 8, !tbaa !25
  %1608 = icmp ugt i64 %1606, %1607
  br i1 %1608, label %1609, label %1826

1609:                                             ; preds = %1605
  %1610 = load i64, ptr %29, align 8, !tbaa !25
  %1611 = load i64, ptr %30, align 8, !tbaa !25
  %1612 = icmp uge i64 %1610, %1611
  br i1 %1612, label %1613, label %1826

1613:                                             ; preds = %1609
  br label %1614

1614:                                             ; preds = %1613
  %1615 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1616 = zext i8 %1615 to i32
  %1617 = and i32 %1616, 1
  %1618 = icmp ne i32 %1617, 0
  %1619 = xor i1 %1618, true
  %1620 = xor i1 %1619, true
  %1621 = zext i1 %1620 to i32
  %1622 = sext i32 %1621 to i64
  %1623 = call i64 @llvm.expect.i64(i64 %1622, i64 1)
  %1624 = icmp ne i64 %1623, 0
  br i1 %1624, label %1625, label %1646

1625:                                             ; preds = %1614
  br label %1626

1626:                                             ; preds = %1625
  %1627 = load i64, ptr %31, align 8, !tbaa !25
  %1628 = load i64, ptr %6, align 8, !tbaa !25
  %1629 = icmp uge i64 %1627, %1628
  %1630 = xor i1 %1629, true
  %1631 = xor i1 %1630, true
  %1632 = xor i1 %1631, true
  %1633 = zext i1 %1632 to i32
  %1634 = sext i32 %1633 to i64
  %1635 = call i64 @llvm.expect.i64(i64 %1634, i64 0)
  %1636 = icmp ne i64 %1635, 0
  br i1 %1636, label %1637, label %1643

1637:                                             ; preds = %1626
  %1638 = load ptr, ptr %3, align 8, !tbaa !5
  %1639 = getelementptr inbounds %struct.MDBX_cursor, ptr %1638, i32 0, i32 5
  %1640 = load ptr, ptr %1639, align 8, !tbaa !14
  %1641 = getelementptr inbounds %struct.MDBX_txn, ptr %1640, i32 0, i32 9
  %1642 = load ptr, ptr %1641, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1642, ptr noundef @.str.34, ptr noundef @__func__.tree_rebalance, i32 noundef 835) #7
  unreachable

1643:                                             ; preds = %1626
  br label %1644

1644:                                             ; preds = %1643
  br label %1645

1645:                                             ; preds = %1644
  br label %1646

1646:                                             ; preds = %1645, %1614
  br label %1647

1647:                                             ; preds = %1646
  br label %1648

1648:                                             ; preds = %1647
  %1649 = load ptr, ptr %24, align 8, !tbaa !5
  %1650 = load ptr, ptr %23, align 8, !tbaa !5
  %1651 = getelementptr inbounds %struct.MDBX_cursor, ptr %1650, i32 0, i32 9
  %1652 = load ptr, ptr %23, align 8, !tbaa !5
  %1653 = getelementptr inbounds %struct.MDBX_cursor, ptr %1652, i32 0, i32 1
  %1654 = getelementptr inbounds %struct.anon.9, ptr %1653, i32 0, i32 1
  %1655 = load i8, ptr %1654, align 1, !tbaa !21
  %1656 = sext i8 %1655 to i64
  %1657 = getelementptr inbounds [32 x ptr], ptr %1651, i64 0, i64 %1656
  store ptr %1649, ptr %1657, align 8, !tbaa !5
  %1658 = load i64, ptr %27, align 8, !tbaa !25
  %1659 = sub i64 %1658, 1
  %1660 = trunc i64 %1659 to i16
  %1661 = load ptr, ptr %23, align 8, !tbaa !5
  %1662 = getelementptr inbounds %struct.MDBX_cursor, ptr %1661, i32 0, i32 10
  %1663 = load ptr, ptr %23, align 8, !tbaa !5
  %1664 = getelementptr inbounds %struct.MDBX_cursor, ptr %1663, i32 0, i32 1
  %1665 = getelementptr inbounds %struct.anon.9, ptr %1664, i32 0, i32 1
  %1666 = load i8, ptr %1665, align 1, !tbaa !21
  %1667 = sext i8 %1666 to i32
  %1668 = sub nsw i32 %1667, 1
  %1669 = sext i32 %1668 to i64
  %1670 = getelementptr inbounds [32 x i16], ptr %1662, i64 0, i64 %1669
  store i16 %1660, ptr %1670, align 2, !tbaa !52
  %1671 = load i64, ptr %31, align 8, !tbaa !25
  %1672 = sub i64 %1671, 1
  %1673 = trunc i64 %1672 to i16
  %1674 = load ptr, ptr %23, align 8, !tbaa !5
  %1675 = getelementptr inbounds %struct.MDBX_cursor, ptr %1674, i32 0, i32 10
  %1676 = load ptr, ptr %23, align 8, !tbaa !5
  %1677 = getelementptr inbounds %struct.MDBX_cursor, ptr %1676, i32 0, i32 1
  %1678 = getelementptr inbounds %struct.anon.9, ptr %1677, i32 0, i32 1
  %1679 = load i8, ptr %1678, align 1, !tbaa !21
  %1680 = sext i8 %1679 to i64
  %1681 = getelementptr inbounds [32 x i16], ptr %1675, i64 0, i64 %1680
  store i16 %1673, ptr %1681, align 2, !tbaa !52
  %1682 = load ptr, ptr %3, align 8, !tbaa !5
  %1683 = getelementptr inbounds %struct.MDBX_cursor, ptr %1682, i32 0, i32 10
  %1684 = load ptr, ptr %3, align 8, !tbaa !5
  %1685 = getelementptr inbounds %struct.MDBX_cursor, ptr %1684, i32 0, i32 1
  %1686 = getelementptr inbounds %struct.anon.9, ptr %1685, i32 0, i32 1
  %1687 = load i8, ptr %1686, align 1, !tbaa !21
  %1688 = sext i8 %1687 to i64
  %1689 = getelementptr inbounds [32 x i16], ptr %1683, i64 0, i64 %1688
  store i16 0, ptr %1689, align 2, !tbaa !52
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #9
  %1690 = load i64, ptr %26, align 8, !tbaa !25
  %1691 = load i64, ptr %31, align 8, !tbaa !25
  %1692 = add i64 %1690, %1691
  store i64 %1692, ptr %36, align 8, !tbaa !25
  %1693 = load ptr, ptr %3, align 8, !tbaa !5
  %1694 = getelementptr inbounds %struct.MDBX_cursor, ptr %1693, i32 0, i32 10
  %1695 = load ptr, ptr %23, align 8, !tbaa !5
  %1696 = getelementptr inbounds %struct.MDBX_cursor, ptr %1695, i32 0, i32 1
  %1697 = getelementptr inbounds %struct.anon.9, ptr %1696, i32 0, i32 1
  %1698 = load i8, ptr %1697, align 1, !tbaa !21
  %1699 = sext i8 %1698 to i64
  %1700 = getelementptr inbounds [32 x i16], ptr %1694, i64 0, i64 %1699
  %1701 = load i16, ptr %1700, align 2, !tbaa !52
  %1702 = zext i16 %1701 to i32
  %1703 = add nsw i32 %1702, 1
  %1704 = load ptr, ptr %23, align 8, !tbaa !5
  %1705 = getelementptr inbounds %struct.MDBX_cursor, ptr %1704, i32 0, i32 10
  %1706 = load ptr, ptr %23, align 8, !tbaa !5
  %1707 = getelementptr inbounds %struct.MDBX_cursor, ptr %1706, i32 0, i32 1
  %1708 = getelementptr inbounds %struct.anon.9, ptr %1707, i32 0, i32 1
  %1709 = load i8, ptr %1708, align 1, !tbaa !21
  %1710 = sext i8 %1709 to i64
  %1711 = getelementptr inbounds [32 x i16], ptr %1705, i64 0, i64 %1710
  %1712 = load i16, ptr %1711, align 2, !tbaa !52
  %1713 = zext i16 %1712 to i32
  %1714 = add nsw i32 %1713, %1703
  %1715 = trunc i32 %1714 to i16
  store i16 %1715, ptr %1711, align 2, !tbaa !52
  %1716 = load ptr, ptr %23, align 8, !tbaa !5
  %1717 = getelementptr inbounds %struct.MDBX_cursor, ptr %1716, i32 0, i32 5
  %1718 = load ptr, ptr %1717, align 8, !tbaa !14
  %1719 = getelementptr inbounds %struct.MDBX_txn, ptr %1718, i32 0, i32 14
  %1720 = load ptr, ptr %1719, align 8, !tbaa !46
  %1721 = load ptr, ptr %23, align 8, !tbaa !5
  %1722 = call i64 @cursor_dbi(ptr noundef %1721) #8
  %1723 = getelementptr inbounds ptr, ptr %1720, i64 %1722
  %1724 = load ptr, ptr %1723, align 8, !tbaa !5
  %1725 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %1726 = getelementptr inbounds %struct.MDBX_cursor, ptr %1725, i32 0, i32 11
  store ptr %1724, ptr %1726, align 8, !tbaa !56
  %1727 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %1728 = load ptr, ptr %23, align 8, !tbaa !5
  %1729 = getelementptr inbounds %struct.MDBX_cursor, ptr %1728, i32 0, i32 5
  %1730 = load ptr, ptr %1729, align 8, !tbaa !14
  %1731 = getelementptr inbounds %struct.MDBX_txn, ptr %1730, i32 0, i32 14
  %1732 = load ptr, ptr %1731, align 8, !tbaa !46
  %1733 = load ptr, ptr %23, align 8, !tbaa !5
  %1734 = call i64 @cursor_dbi(ptr noundef %1733) #8
  %1735 = getelementptr inbounds ptr, ptr %1732, i64 %1734
  store ptr %1727, ptr %1735, align 8, !tbaa !5
  %1736 = load ptr, ptr %3, align 8, !tbaa !5
  %1737 = load ptr, ptr %23, align 8, !tbaa !5
  %1738 = call i32 @page_merge(ptr noundef %1736, ptr noundef %1737)
  store i32 %1738, ptr %12, align 4, !tbaa !41
  %1739 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %1740 = getelementptr inbounds %struct.MDBX_cursor, ptr %1739, i32 0, i32 11
  %1741 = load ptr, ptr %1740, align 8, !tbaa !56
  %1742 = load ptr, ptr %23, align 8, !tbaa !5
  %1743 = getelementptr inbounds %struct.MDBX_cursor, ptr %1742, i32 0, i32 5
  %1744 = load ptr, ptr %1743, align 8, !tbaa !14
  %1745 = getelementptr inbounds %struct.MDBX_txn, ptr %1744, i32 0, i32 14
  %1746 = load ptr, ptr %1745, align 8, !tbaa !46
  %1747 = load ptr, ptr %23, align 8, !tbaa !5
  %1748 = call i64 @cursor_dbi(ptr noundef %1747) #8
  %1749 = getelementptr inbounds ptr, ptr %1746, i64 %1748
  store ptr %1741, ptr %1749, align 8, !tbaa !5
  %1750 = load i32, ptr %12, align 4, !tbaa !41
  %1751 = icmp ne i32 %1750, -1
  %1752 = xor i1 %1751, true
  %1753 = xor i1 %1752, true
  %1754 = zext i1 %1753 to i32
  %1755 = sext i32 %1754 to i64
  %1756 = call i64 @llvm.expect.i64(i64 %1755, i64 1)
  %1757 = icmp ne i64 %1756, 0
  br i1 %1757, label %1758, label %1822

1758:                                             ; preds = %1648
  %1759 = load ptr, ptr %23, align 8, !tbaa !5
  %1760 = load ptr, ptr %3, align 8, !tbaa !5
  %1761 = call ptr @cursor_cpstk(ptr noundef %1759, ptr noundef %1760)
  %1762 = load i64, ptr %36, align 8, !tbaa !25
  %1763 = trunc i64 %1762 to i16
  %1764 = load ptr, ptr %3, align 8, !tbaa !5
  %1765 = getelementptr inbounds %struct.MDBX_cursor, ptr %1764, i32 0, i32 10
  %1766 = load ptr, ptr %3, align 8, !tbaa !5
  %1767 = getelementptr inbounds %struct.MDBX_cursor, ptr %1766, i32 0, i32 1
  %1768 = getelementptr inbounds %struct.anon.9, ptr %1767, i32 0, i32 1
  %1769 = load i8, ptr %1768, align 1, !tbaa !21
  %1770 = sext i8 %1769 to i64
  %1771 = getelementptr inbounds [32 x i16], ptr %1765, i64 0, i64 %1770
  store i16 %1763, ptr %1771, align 2, !tbaa !52
  br label %1772

1772:                                             ; preds = %1758
  %1773 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1774 = zext i8 %1773 to i32
  %1775 = and i32 %1774, 1
  %1776 = icmp ne i32 %1775, 0
  %1777 = xor i1 %1776, true
  %1778 = xor i1 %1777, true
  %1779 = zext i1 %1778 to i32
  %1780 = sext i32 %1779 to i64
  %1781 = call i64 @llvm.expect.i64(i64 %1780, i64 1)
  %1782 = icmp ne i64 %1781, 0
  br i1 %1782, label %1783, label %1818

1783:                                             ; preds = %1772
  br label %1784

1784:                                             ; preds = %1783
  %1785 = load i32, ptr %12, align 4, !tbaa !41
  %1786 = icmp ne i32 %1785, 0
  br i1 %1786, label %1800, label %1787

1787:                                             ; preds = %1784
  %1788 = load ptr, ptr %3, align 8, !tbaa !5
  %1789 = getelementptr inbounds %struct.MDBX_cursor, ptr %1788, i32 0, i32 9
  %1790 = load ptr, ptr %3, align 8, !tbaa !5
  %1791 = getelementptr inbounds %struct.MDBX_cursor, ptr %1790, i32 0, i32 1
  %1792 = getelementptr inbounds %struct.anon.9, ptr %1791, i32 0, i32 1
  %1793 = load i8, ptr %1792, align 1, !tbaa !21
  %1794 = sext i8 %1793 to i64
  %1795 = getelementptr inbounds [32 x ptr], ptr %1789, i64 0, i64 %1794
  %1796 = load ptr, ptr %1795, align 8, !tbaa !5
  %1797 = call i64 @page_numkeys(ptr noundef %1796) #8
  %1798 = load i64, ptr %6, align 8, !tbaa !25
  %1799 = icmp uge i64 %1797, %1798
  br label %1800

1800:                                             ; preds = %1787, %1784
  %1801 = phi i1 [ true, %1784 ], [ %1799, %1787 ]
  %1802 = xor i1 %1801, true
  %1803 = xor i1 %1802, true
  %1804 = xor i1 %1803, true
  %1805 = zext i1 %1804 to i32
  %1806 = sext i32 %1805 to i64
  %1807 = call i64 @llvm.expect.i64(i64 %1806, i64 0)
  %1808 = icmp ne i64 %1807, 0
  br i1 %1808, label %1809, label %1815

1809:                                             ; preds = %1800
  %1810 = load ptr, ptr %3, align 8, !tbaa !5
  %1811 = getelementptr inbounds %struct.MDBX_cursor, ptr %1810, i32 0, i32 5
  %1812 = load ptr, ptr %1811, align 8, !tbaa !14
  %1813 = getelementptr inbounds %struct.MDBX_txn, ptr %1812, i32 0, i32 9
  %1814 = load ptr, ptr %1813, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1814, ptr noundef @.str.35, ptr noundef @__func__.tree_rebalance, i32 noundef 849) #7
  unreachable

1815:                                             ; preds = %1800
  br label %1816

1816:                                             ; preds = %1815
  br label %1817

1817:                                             ; preds = %1816
  br label %1818

1818:                                             ; preds = %1817, %1772
  br label %1819

1819:                                             ; preds = %1818
  br label %1820

1820:                                             ; preds = %1819
  %1821 = load i32, ptr %12, align 4, !tbaa !41
  store i32 %1821, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %1823

1822:                                             ; preds = %1648
  store i32 0, ptr %11, align 4
  br label %1823

1823:                                             ; preds = %1822, %1820
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #9
  %1824 = load i32, ptr %11, align 4
  switch i32 %1824, label %2418 [
    i32 0, label %1825
  ]

1825:                                             ; preds = %1823
  br label %1826

1826:                                             ; preds = %1825, %1609, %1605, %1600
  %1827 = load i8, ptr %35, align 1, !tbaa !38, !range !36, !noundef !37
  %1828 = trunc i8 %1827 to i1
  br i1 %1828, label %1829, label %2013

1829:                                             ; preds = %1826
  %1830 = load i64, ptr %30, align 8, !tbaa !25
  %1831 = load i64, ptr %7, align 8, !tbaa !25
  %1832 = icmp ugt i64 %1830, %1831
  br i1 %1832, label %1833, label %2013

1833:                                             ; preds = %1829
  br label %1834

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

1845:                                             ; preds = %1834
  br label %1846

1846:                                             ; preds = %1845
  %1847 = load i64, ptr %32, align 8, !tbaa !25
  %1848 = load i64, ptr %6, align 8, !tbaa !25
  %1849 = icmp uge i64 %1847, %1848
  %1850 = xor i1 %1849, true
  %1851 = xor i1 %1850, true
  %1852 = xor i1 %1851, true
  %1853 = zext i1 %1852 to i32
  %1854 = sext i32 %1853 to i64
  %1855 = call i64 @llvm.expect.i64(i64 %1854, i64 0)
  %1856 = icmp ne i64 %1855, 0
  br i1 %1856, label %1857, label %1863

1857:                                             ; preds = %1846
  %1858 = load ptr, ptr %3, align 8, !tbaa !5
  %1859 = getelementptr inbounds %struct.MDBX_cursor, ptr %1858, i32 0, i32 5
  %1860 = load ptr, ptr %1859, align 8, !tbaa !14
  %1861 = getelementptr inbounds %struct.MDBX_txn, ptr %1860, i32 0, i32 9
  %1862 = load ptr, ptr %1861, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %1862, ptr noundef @.str.36, ptr noundef @__func__.tree_rebalance, i32 noundef 855) #7
  unreachable

1863:                                             ; preds = %1846
  br label %1864

1864:                                             ; preds = %1863
  br label %1865

1865:                                             ; preds = %1864
  br label %1866

1866:                                             ; preds = %1865, %1834
  br label %1867

1867:                                             ; preds = %1866
  br label %1868

1868:                                             ; preds = %1867
  %1869 = load ptr, ptr %25, align 8, !tbaa !5
  %1870 = load ptr, ptr %23, align 8, !tbaa !5
  %1871 = getelementptr inbounds %struct.MDBX_cursor, ptr %1870, i32 0, i32 9
  %1872 = load ptr, ptr %23, align 8, !tbaa !5
  %1873 = getelementptr inbounds %struct.MDBX_cursor, ptr %1872, i32 0, i32 1
  %1874 = getelementptr inbounds %struct.anon.9, ptr %1873, i32 0, i32 1
  %1875 = load i8, ptr %1874, align 1, !tbaa !21
  %1876 = sext i8 %1875 to i64
  %1877 = getelementptr inbounds [32 x ptr], ptr %1871, i64 0, i64 %1876
  store ptr %1869, ptr %1877, align 8, !tbaa !5
  %1878 = load i64, ptr %27, align 8, !tbaa !25
  %1879 = add i64 %1878, 1
  %1880 = trunc i64 %1879 to i16
  %1881 = load ptr, ptr %23, align 8, !tbaa !5
  %1882 = getelementptr inbounds %struct.MDBX_cursor, ptr %1881, i32 0, i32 10
  %1883 = load ptr, ptr %23, align 8, !tbaa !5
  %1884 = getelementptr inbounds %struct.MDBX_cursor, ptr %1883, i32 0, i32 1
  %1885 = getelementptr inbounds %struct.anon.9, ptr %1884, i32 0, i32 1
  %1886 = load i8, ptr %1885, align 1, !tbaa !21
  %1887 = sext i8 %1886 to i32
  %1888 = sub nsw i32 %1887, 1
  %1889 = sext i32 %1888 to i64
  %1890 = getelementptr inbounds [32 x i16], ptr %1882, i64 0, i64 %1889
  store i16 %1880, ptr %1890, align 2, !tbaa !52
  %1891 = load ptr, ptr %23, align 8, !tbaa !5
  %1892 = getelementptr inbounds %struct.MDBX_cursor, ptr %1891, i32 0, i32 10
  %1893 = load ptr, ptr %23, align 8, !tbaa !5
  %1894 = getelementptr inbounds %struct.MDBX_cursor, ptr %1893, i32 0, i32 1
  %1895 = getelementptr inbounds %struct.anon.9, ptr %1894, i32 0, i32 1
  %1896 = load i8, ptr %1895, align 1, !tbaa !21
  %1897 = sext i8 %1896 to i64
  %1898 = getelementptr inbounds [32 x i16], ptr %1892, i64 0, i64 %1897
  store i16 0, ptr %1898, align 2, !tbaa !52
  %1899 = load i64, ptr %28, align 8, !tbaa !25
  %1900 = trunc i64 %1899 to i16
  %1901 = load ptr, ptr %3, align 8, !tbaa !5
  %1902 = getelementptr inbounds %struct.MDBX_cursor, ptr %1901, i32 0, i32 10
  %1903 = load ptr, ptr %3, align 8, !tbaa !5
  %1904 = getelementptr inbounds %struct.MDBX_cursor, ptr %1903, i32 0, i32 1
  %1905 = getelementptr inbounds %struct.anon.9, ptr %1904, i32 0, i32 1
  %1906 = load i8, ptr %1905, align 1, !tbaa !21
  %1907 = sext i8 %1906 to i64
  %1908 = getelementptr inbounds [32 x i16], ptr %1902, i64 0, i64 %1907
  store i16 %1900, ptr %1908, align 2, !tbaa !52
  %1909 = load ptr, ptr %23, align 8, !tbaa !5
  %1910 = getelementptr inbounds %struct.MDBX_cursor, ptr %1909, i32 0, i32 5
  %1911 = load ptr, ptr %1910, align 8, !tbaa !14
  %1912 = getelementptr inbounds %struct.MDBX_txn, ptr %1911, i32 0, i32 14
  %1913 = load ptr, ptr %1912, align 8, !tbaa !46
  %1914 = load ptr, ptr %23, align 8, !tbaa !5
  %1915 = call i64 @cursor_dbi(ptr noundef %1914) #8
  %1916 = getelementptr inbounds ptr, ptr %1913, i64 %1915
  %1917 = load ptr, ptr %1916, align 8, !tbaa !5
  %1918 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %1919 = getelementptr inbounds %struct.MDBX_cursor, ptr %1918, i32 0, i32 11
  store ptr %1917, ptr %1919, align 8, !tbaa !56
  %1920 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %1921 = load ptr, ptr %23, align 8, !tbaa !5
  %1922 = getelementptr inbounds %struct.MDBX_cursor, ptr %1921, i32 0, i32 5
  %1923 = load ptr, ptr %1922, align 8, !tbaa !14
  %1924 = getelementptr inbounds %struct.MDBX_txn, ptr %1923, i32 0, i32 14
  %1925 = load ptr, ptr %1924, align 8, !tbaa !46
  %1926 = load ptr, ptr %23, align 8, !tbaa !5
  %1927 = call i64 @cursor_dbi(ptr noundef %1926) #8
  %1928 = getelementptr inbounds ptr, ptr %1925, i64 %1927
  store ptr %1920, ptr %1928, align 8, !tbaa !5
  %1929 = load ptr, ptr %23, align 8, !tbaa !5
  %1930 = load ptr, ptr %3, align 8, !tbaa !5
  %1931 = call i32 @page_merge(ptr noundef %1929, ptr noundef %1930)
  store i32 %1931, ptr %12, align 4, !tbaa !41
  %1932 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %1933 = getelementptr inbounds %struct.MDBX_cursor, ptr %1932, i32 0, i32 11
  %1934 = load ptr, ptr %1933, align 8, !tbaa !56
  %1935 = load ptr, ptr %23, align 8, !tbaa !5
  %1936 = getelementptr inbounds %struct.MDBX_cursor, ptr %1935, i32 0, i32 5
  %1937 = load ptr, ptr %1936, align 8, !tbaa !14
  %1938 = getelementptr inbounds %struct.MDBX_txn, ptr %1937, i32 0, i32 14
  %1939 = load ptr, ptr %1938, align 8, !tbaa !46
  %1940 = load ptr, ptr %23, align 8, !tbaa !5
  %1941 = call i64 @cursor_dbi(ptr noundef %1940) #8
  %1942 = getelementptr inbounds ptr, ptr %1939, i64 %1941
  store ptr %1934, ptr %1942, align 8, !tbaa !5
  %1943 = load i32, ptr %12, align 4, !tbaa !41
  %1944 = icmp ne i32 %1943, -1
  %1945 = xor i1 %1944, true
  %1946 = xor i1 %1945, true
  %1947 = zext i1 %1946 to i32
  %1948 = sext i32 %1947 to i64
  %1949 = call i64 @llvm.expect.i64(i64 %1948, i64 1)
  %1950 = icmp ne i64 %1949, 0
  br i1 %1950, label %1951, label %2012

1951:                                             ; preds = %1868
  %1952 = load i64, ptr %26, align 8, !tbaa !25
  %1953 = trunc i64 %1952 to i16
  %1954 = load ptr, ptr %3, align 8, !tbaa !5
  %1955 = getelementptr inbounds %struct.MDBX_cursor, ptr %1954, i32 0, i32 10
  %1956 = load ptr, ptr %3, align 8, !tbaa !5
  %1957 = getelementptr inbounds %struct.MDBX_cursor, ptr %1956, i32 0, i32 1
  %1958 = getelementptr inbounds %struct.anon.9, ptr %1957, i32 0, i32 1
  %1959 = load i8, ptr %1958, align 1, !tbaa !21
  %1960 = sext i8 %1959 to i64
  %1961 = getelementptr inbounds [32 x i16], ptr %1955, i64 0, i64 %1960
  store i16 %1953, ptr %1961, align 2, !tbaa !52
  br label %1962

1962:                                             ; preds = %1951
  %1963 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %1964 = zext i8 %1963 to i32
  %1965 = and i32 %1964, 1
  %1966 = icmp ne i32 %1965, 0
  %1967 = xor i1 %1966, true
  %1968 = xor i1 %1967, true
  %1969 = zext i1 %1968 to i32
  %1970 = sext i32 %1969 to i64
  %1971 = call i64 @llvm.expect.i64(i64 %1970, i64 1)
  %1972 = icmp ne i64 %1971, 0
  br i1 %1972, label %1973, label %2008

1973:                                             ; preds = %1962
  br label %1974

1974:                                             ; preds = %1973
  %1975 = load i32, ptr %12, align 4, !tbaa !41
  %1976 = icmp ne i32 %1975, 0
  br i1 %1976, label %1990, label %1977

1977:                                             ; preds = %1974
  %1978 = load ptr, ptr %3, align 8, !tbaa !5
  %1979 = getelementptr inbounds %struct.MDBX_cursor, ptr %1978, i32 0, i32 9
  %1980 = load ptr, ptr %3, align 8, !tbaa !5
  %1981 = getelementptr inbounds %struct.MDBX_cursor, ptr %1980, i32 0, i32 1
  %1982 = getelementptr inbounds %struct.anon.9, ptr %1981, i32 0, i32 1
  %1983 = load i8, ptr %1982, align 1, !tbaa !21
  %1984 = sext i8 %1983 to i64
  %1985 = getelementptr inbounds [32 x ptr], ptr %1979, i64 0, i64 %1984
  %1986 = load ptr, ptr %1985, align 8, !tbaa !5
  %1987 = call i64 @page_numkeys(ptr noundef %1986) #8
  %1988 = load i64, ptr %6, align 8, !tbaa !25
  %1989 = icmp uge i64 %1987, %1988
  br label %1990

1990:                                             ; preds = %1977, %1974
  %1991 = phi i1 [ true, %1974 ], [ %1989, %1977 ]
  %1992 = xor i1 %1991, true
  %1993 = xor i1 %1992, true
  %1994 = xor i1 %1993, true
  %1995 = zext i1 %1994 to i32
  %1996 = sext i32 %1995 to i64
  %1997 = call i64 @llvm.expect.i64(i64 %1996, i64 0)
  %1998 = icmp ne i64 %1997, 0
  br i1 %1998, label %1999, label %2005

1999:                                             ; preds = %1990
  %2000 = load ptr, ptr %3, align 8, !tbaa !5
  %2001 = getelementptr inbounds %struct.MDBX_cursor, ptr %2000, i32 0, i32 5
  %2002 = load ptr, ptr %2001, align 8, !tbaa !14
  %2003 = getelementptr inbounds %struct.MDBX_txn, ptr %2002, i32 0, i32 9
  %2004 = load ptr, ptr %2003, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %2004, ptr noundef @.str.35, ptr noundef @__func__.tree_rebalance, i32 noundef 866) #7
  unreachable

2005:                                             ; preds = %1990
  br label %2006

2006:                                             ; preds = %2005
  br label %2007

2007:                                             ; preds = %2006
  br label %2008

2008:                                             ; preds = %2007, %1962
  br label %2009

2009:                                             ; preds = %2008
  br label %2010

2010:                                             ; preds = %2009
  %2011 = load i32, ptr %12, align 4, !tbaa !41
  store i32 %2011, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2418

2012:                                             ; preds = %1868
  br label %2013

2013:                                             ; preds = %2012, %1829, %1826
  %2014 = load i8, ptr %34, align 1, !tbaa !38, !range !36, !noundef !37
  %2015 = trunc i8 %2014 to i1
  br i1 %2015, label %2016, label %2175

2016:                                             ; preds = %2013
  %2017 = load i64, ptr %31, align 8, !tbaa !25
  %2018 = load i64, ptr %6, align 8, !tbaa !25
  %2019 = icmp ugt i64 %2017, %2018
  br i1 %2019, label %2020, label %2175

2020:                                             ; preds = %2016
  %2021 = load i64, ptr %32, align 8, !tbaa !25
  %2022 = load i64, ptr %31, align 8, !tbaa !25
  %2023 = icmp ule i64 %2021, %2022
  br i1 %2023, label %2028, label %2024

2024:                                             ; preds = %2020
  %2025 = load i64, ptr %30, align 8, !tbaa !25
  %2026 = load i64, ptr %29, align 8, !tbaa !25
  %2027 = icmp uge i64 %2025, %2026
  br i1 %2027, label %2028, label %2175

2028:                                             ; preds = %2024, %2020
  %2029 = load ptr, ptr %24, align 8, !tbaa !5
  %2030 = load ptr, ptr %23, align 8, !tbaa !5
  %2031 = getelementptr inbounds %struct.MDBX_cursor, ptr %2030, i32 0, i32 9
  %2032 = load ptr, ptr %23, align 8, !tbaa !5
  %2033 = getelementptr inbounds %struct.MDBX_cursor, ptr %2032, i32 0, i32 1
  %2034 = getelementptr inbounds %struct.anon.9, ptr %2033, i32 0, i32 1
  %2035 = load i8, ptr %2034, align 1, !tbaa !21
  %2036 = sext i8 %2035 to i64
  %2037 = getelementptr inbounds [32 x ptr], ptr %2031, i64 0, i64 %2036
  store ptr %2029, ptr %2037, align 8, !tbaa !5
  %2038 = load i64, ptr %27, align 8, !tbaa !25
  %2039 = sub i64 %2038, 1
  %2040 = trunc i64 %2039 to i16
  %2041 = load ptr, ptr %23, align 8, !tbaa !5
  %2042 = getelementptr inbounds %struct.MDBX_cursor, ptr %2041, i32 0, i32 10
  %2043 = load ptr, ptr %23, align 8, !tbaa !5
  %2044 = getelementptr inbounds %struct.MDBX_cursor, ptr %2043, i32 0, i32 1
  %2045 = getelementptr inbounds %struct.anon.9, ptr %2044, i32 0, i32 1
  %2046 = load i8, ptr %2045, align 1, !tbaa !21
  %2047 = sext i8 %2046 to i32
  %2048 = sub nsw i32 %2047, 1
  %2049 = sext i32 %2048 to i64
  %2050 = getelementptr inbounds [32 x i16], ptr %2042, i64 0, i64 %2049
  store i16 %2040, ptr %2050, align 2, !tbaa !52
  %2051 = load i64, ptr %31, align 8, !tbaa !25
  %2052 = sub i64 %2051, 1
  %2053 = trunc i64 %2052 to i16
  %2054 = load ptr, ptr %23, align 8, !tbaa !5
  %2055 = getelementptr inbounds %struct.MDBX_cursor, ptr %2054, i32 0, i32 10
  %2056 = load ptr, ptr %23, align 8, !tbaa !5
  %2057 = getelementptr inbounds %struct.MDBX_cursor, ptr %2056, i32 0, i32 1
  %2058 = getelementptr inbounds %struct.anon.9, ptr %2057, i32 0, i32 1
  %2059 = load i8, ptr %2058, align 1, !tbaa !21
  %2060 = sext i8 %2059 to i64
  %2061 = getelementptr inbounds [32 x i16], ptr %2055, i64 0, i64 %2060
  store i16 %2053, ptr %2061, align 2, !tbaa !52
  %2062 = load ptr, ptr %3, align 8, !tbaa !5
  %2063 = getelementptr inbounds %struct.MDBX_cursor, ptr %2062, i32 0, i32 10
  %2064 = load ptr, ptr %3, align 8, !tbaa !5
  %2065 = getelementptr inbounds %struct.MDBX_cursor, ptr %2064, i32 0, i32 1
  %2066 = getelementptr inbounds %struct.anon.9, ptr %2065, i32 0, i32 1
  %2067 = load i8, ptr %2066, align 1, !tbaa !21
  %2068 = sext i8 %2067 to i64
  %2069 = getelementptr inbounds [32 x i16], ptr %2063, i64 0, i64 %2068
  store i16 0, ptr %2069, align 2, !tbaa !52
  %2070 = load ptr, ptr %23, align 8, !tbaa !5
  %2071 = getelementptr inbounds %struct.MDBX_cursor, ptr %2070, i32 0, i32 5
  %2072 = load ptr, ptr %2071, align 8, !tbaa !14
  %2073 = getelementptr inbounds %struct.MDBX_txn, ptr %2072, i32 0, i32 14
  %2074 = load ptr, ptr %2073, align 8, !tbaa !46
  %2075 = load ptr, ptr %23, align 8, !tbaa !5
  %2076 = call i64 @cursor_dbi(ptr noundef %2075) #8
  %2077 = getelementptr inbounds ptr, ptr %2074, i64 %2076
  %2078 = load ptr, ptr %2077, align 8, !tbaa !5
  %2079 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %2080 = getelementptr inbounds %struct.MDBX_cursor, ptr %2079, i32 0, i32 11
  store ptr %2078, ptr %2080, align 8, !tbaa !56
  %2081 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %2082 = load ptr, ptr %23, align 8, !tbaa !5
  %2083 = getelementptr inbounds %struct.MDBX_cursor, ptr %2082, i32 0, i32 5
  %2084 = load ptr, ptr %2083, align 8, !tbaa !14
  %2085 = getelementptr inbounds %struct.MDBX_txn, ptr %2084, i32 0, i32 14
  %2086 = load ptr, ptr %2085, align 8, !tbaa !46
  %2087 = load ptr, ptr %23, align 8, !tbaa !5
  %2088 = call i64 @cursor_dbi(ptr noundef %2087) #8
  %2089 = getelementptr inbounds ptr, ptr %2086, i64 %2088
  store ptr %2081, ptr %2089, align 8, !tbaa !5
  %2090 = load ptr, ptr %23, align 8, !tbaa !5
  %2091 = load ptr, ptr %3, align 8, !tbaa !5
  %2092 = call i32 @node_move(ptr noundef %2090, ptr noundef %2091, i1 noundef zeroext true)
  store i32 %2092, ptr %12, align 4, !tbaa !41
  %2093 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %2094 = getelementptr inbounds %struct.MDBX_cursor, ptr %2093, i32 0, i32 11
  %2095 = load ptr, ptr %2094, align 8, !tbaa !56
  %2096 = load ptr, ptr %23, align 8, !tbaa !5
  %2097 = getelementptr inbounds %struct.MDBX_cursor, ptr %2096, i32 0, i32 5
  %2098 = load ptr, ptr %2097, align 8, !tbaa !14
  %2099 = getelementptr inbounds %struct.MDBX_txn, ptr %2098, i32 0, i32 14
  %2100 = load ptr, ptr %2099, align 8, !tbaa !46
  %2101 = load ptr, ptr %23, align 8, !tbaa !5
  %2102 = call i64 @cursor_dbi(ptr noundef %2101) #8
  %2103 = getelementptr inbounds ptr, ptr %2100, i64 %2102
  store ptr %2095, ptr %2103, align 8, !tbaa !5
  %2104 = load i32, ptr %12, align 4, !tbaa !41
  %2105 = icmp ne i32 %2104, -1
  %2106 = xor i1 %2105, true
  %2107 = xor i1 %2106, true
  %2108 = zext i1 %2107 to i32
  %2109 = sext i32 %2108 to i64
  %2110 = call i64 @llvm.expect.i64(i64 %2109, i64 1)
  %2111 = icmp ne i64 %2110, 0
  br i1 %2111, label %2112, label %2174

2112:                                             ; preds = %2028
  %2113 = load i64, ptr %26, align 8, !tbaa !25
  %2114 = add i64 %2113, 1
  %2115 = trunc i64 %2114 to i16
  %2116 = load ptr, ptr %3, align 8, !tbaa !5
  %2117 = getelementptr inbounds %struct.MDBX_cursor, ptr %2116, i32 0, i32 10
  %2118 = load ptr, ptr %3, align 8, !tbaa !5
  %2119 = getelementptr inbounds %struct.MDBX_cursor, ptr %2118, i32 0, i32 1
  %2120 = getelementptr inbounds %struct.anon.9, ptr %2119, i32 0, i32 1
  %2121 = load i8, ptr %2120, align 1, !tbaa !21
  %2122 = sext i8 %2121 to i64
  %2123 = getelementptr inbounds [32 x i16], ptr %2117, i64 0, i64 %2122
  store i16 %2115, ptr %2123, align 2, !tbaa !52
  br label %2124

2124:                                             ; preds = %2112
  %2125 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %2126 = zext i8 %2125 to i32
  %2127 = and i32 %2126, 1
  %2128 = icmp ne i32 %2127, 0
  %2129 = xor i1 %2128, true
  %2130 = xor i1 %2129, true
  %2131 = zext i1 %2130 to i32
  %2132 = sext i32 %2131 to i64
  %2133 = call i64 @llvm.expect.i64(i64 %2132, i64 1)
  %2134 = icmp ne i64 %2133, 0
  br i1 %2134, label %2135, label %2170

2135:                                             ; preds = %2124
  br label %2136

2136:                                             ; preds = %2135
  %2137 = load i32, ptr %12, align 4, !tbaa !41
  %2138 = icmp ne i32 %2137, 0
  br i1 %2138, label %2152, label %2139

2139:                                             ; preds = %2136
  %2140 = load ptr, ptr %3, align 8, !tbaa !5
  %2141 = getelementptr inbounds %struct.MDBX_cursor, ptr %2140, i32 0, i32 9
  %2142 = load ptr, ptr %3, align 8, !tbaa !5
  %2143 = getelementptr inbounds %struct.MDBX_cursor, ptr %2142, i32 0, i32 1
  %2144 = getelementptr inbounds %struct.anon.9, ptr %2143, i32 0, i32 1
  %2145 = load i8, ptr %2144, align 1, !tbaa !21
  %2146 = sext i8 %2145 to i64
  %2147 = getelementptr inbounds [32 x ptr], ptr %2141, i64 0, i64 %2146
  %2148 = load ptr, ptr %2147, align 8, !tbaa !5
  %2149 = call i64 @page_numkeys(ptr noundef %2148) #8
  %2150 = load i64, ptr %6, align 8, !tbaa !25
  %2151 = icmp uge i64 %2149, %2150
  br label %2152

2152:                                             ; preds = %2139, %2136
  %2153 = phi i1 [ true, %2136 ], [ %2151, %2139 ]
  %2154 = xor i1 %2153, true
  %2155 = xor i1 %2154, true
  %2156 = xor i1 %2155, true
  %2157 = zext i1 %2156 to i32
  %2158 = sext i32 %2157 to i64
  %2159 = call i64 @llvm.expect.i64(i64 %2158, i64 0)
  %2160 = icmp ne i64 %2159, 0
  br i1 %2160, label %2161, label %2167

2161:                                             ; preds = %2152
  %2162 = load ptr, ptr %3, align 8, !tbaa !5
  %2163 = getelementptr inbounds %struct.MDBX_cursor, ptr %2162, i32 0, i32 5
  %2164 = load ptr, ptr %2163, align 8, !tbaa !14
  %2165 = getelementptr inbounds %struct.MDBX_txn, ptr %2164, i32 0, i32 9
  %2166 = load ptr, ptr %2165, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %2166, ptr noundef @.str.35, ptr noundef @__func__.tree_rebalance, i32 noundef 883) #7
  unreachable

2167:                                             ; preds = %2152
  br label %2168

2168:                                             ; preds = %2167
  br label %2169

2169:                                             ; preds = %2168
  br label %2170

2170:                                             ; preds = %2169, %2124
  br label %2171

2171:                                             ; preds = %2170
  br label %2172

2172:                                             ; preds = %2171
  %2173 = load i32, ptr %12, align 4, !tbaa !41
  store i32 %2173, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2418

2174:                                             ; preds = %2028
  br label %2175

2175:                                             ; preds = %2174, %2024, %2016, %2013
  %2176 = load i8, ptr %35, align 1, !tbaa !38, !range !36, !noundef !37
  %2177 = trunc i8 %2176 to i1
  br i1 %2177, label %2178, label %2327

2178:                                             ; preds = %2175
  %2179 = load i64, ptr %32, align 8, !tbaa !25
  %2180 = load i64, ptr %6, align 8, !tbaa !25
  %2181 = icmp ugt i64 %2179, %2180
  br i1 %2181, label %2182, label %2327

2182:                                             ; preds = %2178
  %2183 = load ptr, ptr %25, align 8, !tbaa !5
  %2184 = load ptr, ptr %23, align 8, !tbaa !5
  %2185 = getelementptr inbounds %struct.MDBX_cursor, ptr %2184, i32 0, i32 9
  %2186 = load ptr, ptr %23, align 8, !tbaa !5
  %2187 = getelementptr inbounds %struct.MDBX_cursor, ptr %2186, i32 0, i32 1
  %2188 = getelementptr inbounds %struct.anon.9, ptr %2187, i32 0, i32 1
  %2189 = load i8, ptr %2188, align 1, !tbaa !21
  %2190 = sext i8 %2189 to i64
  %2191 = getelementptr inbounds [32 x ptr], ptr %2185, i64 0, i64 %2190
  store ptr %2183, ptr %2191, align 8, !tbaa !5
  %2192 = load i64, ptr %27, align 8, !tbaa !25
  %2193 = add i64 %2192, 1
  %2194 = trunc i64 %2193 to i16
  %2195 = load ptr, ptr %23, align 8, !tbaa !5
  %2196 = getelementptr inbounds %struct.MDBX_cursor, ptr %2195, i32 0, i32 10
  %2197 = load ptr, ptr %23, align 8, !tbaa !5
  %2198 = getelementptr inbounds %struct.MDBX_cursor, ptr %2197, i32 0, i32 1
  %2199 = getelementptr inbounds %struct.anon.9, ptr %2198, i32 0, i32 1
  %2200 = load i8, ptr %2199, align 1, !tbaa !21
  %2201 = sext i8 %2200 to i32
  %2202 = sub nsw i32 %2201, 1
  %2203 = sext i32 %2202 to i64
  %2204 = getelementptr inbounds [32 x i16], ptr %2196, i64 0, i64 %2203
  store i16 %2194, ptr %2204, align 2, !tbaa !52
  %2205 = load ptr, ptr %23, align 8, !tbaa !5
  %2206 = getelementptr inbounds %struct.MDBX_cursor, ptr %2205, i32 0, i32 10
  %2207 = load ptr, ptr %23, align 8, !tbaa !5
  %2208 = getelementptr inbounds %struct.MDBX_cursor, ptr %2207, i32 0, i32 1
  %2209 = getelementptr inbounds %struct.anon.9, ptr %2208, i32 0, i32 1
  %2210 = load i8, ptr %2209, align 1, !tbaa !21
  %2211 = sext i8 %2210 to i64
  %2212 = getelementptr inbounds [32 x i16], ptr %2206, i64 0, i64 %2211
  store i16 0, ptr %2212, align 2, !tbaa !52
  %2213 = load i64, ptr %28, align 8, !tbaa !25
  %2214 = trunc i64 %2213 to i16
  %2215 = load ptr, ptr %3, align 8, !tbaa !5
  %2216 = getelementptr inbounds %struct.MDBX_cursor, ptr %2215, i32 0, i32 10
  %2217 = load ptr, ptr %3, align 8, !tbaa !5
  %2218 = getelementptr inbounds %struct.MDBX_cursor, ptr %2217, i32 0, i32 1
  %2219 = getelementptr inbounds %struct.anon.9, ptr %2218, i32 0, i32 1
  %2220 = load i8, ptr %2219, align 1, !tbaa !21
  %2221 = sext i8 %2220 to i64
  %2222 = getelementptr inbounds [32 x i16], ptr %2216, i64 0, i64 %2221
  store i16 %2214, ptr %2222, align 2, !tbaa !52
  %2223 = load ptr, ptr %23, align 8, !tbaa !5
  %2224 = getelementptr inbounds %struct.MDBX_cursor, ptr %2223, i32 0, i32 5
  %2225 = load ptr, ptr %2224, align 8, !tbaa !14
  %2226 = getelementptr inbounds %struct.MDBX_txn, ptr %2225, i32 0, i32 14
  %2227 = load ptr, ptr %2226, align 8, !tbaa !46
  %2228 = load ptr, ptr %23, align 8, !tbaa !5
  %2229 = call i64 @cursor_dbi(ptr noundef %2228) #8
  %2230 = getelementptr inbounds ptr, ptr %2227, i64 %2229
  %2231 = load ptr, ptr %2230, align 8, !tbaa !5
  %2232 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %2233 = getelementptr inbounds %struct.MDBX_cursor, ptr %2232, i32 0, i32 11
  store ptr %2231, ptr %2233, align 8, !tbaa !56
  %2234 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %2235 = load ptr, ptr %23, align 8, !tbaa !5
  %2236 = getelementptr inbounds %struct.MDBX_cursor, ptr %2235, i32 0, i32 5
  %2237 = load ptr, ptr %2236, align 8, !tbaa !14
  %2238 = getelementptr inbounds %struct.MDBX_txn, ptr %2237, i32 0, i32 14
  %2239 = load ptr, ptr %2238, align 8, !tbaa !46
  %2240 = load ptr, ptr %23, align 8, !tbaa !5
  %2241 = call i64 @cursor_dbi(ptr noundef %2240) #8
  %2242 = getelementptr inbounds ptr, ptr %2239, i64 %2241
  store ptr %2234, ptr %2242, align 8, !tbaa !5
  %2243 = load ptr, ptr %23, align 8, !tbaa !5
  %2244 = load ptr, ptr %3, align 8, !tbaa !5
  %2245 = call i32 @node_move(ptr noundef %2243, ptr noundef %2244, i1 noundef zeroext false)
  store i32 %2245, ptr %12, align 4, !tbaa !41
  %2246 = getelementptr inbounds %struct.cursor_couple, ptr %22, i32 0, i32 0
  %2247 = getelementptr inbounds %struct.MDBX_cursor, ptr %2246, i32 0, i32 11
  %2248 = load ptr, ptr %2247, align 8, !tbaa !56
  %2249 = load ptr, ptr %23, align 8, !tbaa !5
  %2250 = getelementptr inbounds %struct.MDBX_cursor, ptr %2249, i32 0, i32 5
  %2251 = load ptr, ptr %2250, align 8, !tbaa !14
  %2252 = getelementptr inbounds %struct.MDBX_txn, ptr %2251, i32 0, i32 14
  %2253 = load ptr, ptr %2252, align 8, !tbaa !46
  %2254 = load ptr, ptr %23, align 8, !tbaa !5
  %2255 = call i64 @cursor_dbi(ptr noundef %2254) #8
  %2256 = getelementptr inbounds ptr, ptr %2253, i64 %2255
  store ptr %2248, ptr %2256, align 8, !tbaa !5
  %2257 = load i32, ptr %12, align 4, !tbaa !41
  %2258 = icmp ne i32 %2257, -1
  %2259 = xor i1 %2258, true
  %2260 = xor i1 %2259, true
  %2261 = zext i1 %2260 to i32
  %2262 = sext i32 %2261 to i64
  %2263 = call i64 @llvm.expect.i64(i64 %2262, i64 1)
  %2264 = icmp ne i64 %2263, 0
  br i1 %2264, label %2265, label %2326

2265:                                             ; preds = %2182
  %2266 = load i64, ptr %26, align 8, !tbaa !25
  %2267 = trunc i64 %2266 to i16
  %2268 = load ptr, ptr %3, align 8, !tbaa !5
  %2269 = getelementptr inbounds %struct.MDBX_cursor, ptr %2268, i32 0, i32 10
  %2270 = load ptr, ptr %3, align 8, !tbaa !5
  %2271 = getelementptr inbounds %struct.MDBX_cursor, ptr %2270, i32 0, i32 1
  %2272 = getelementptr inbounds %struct.anon.9, ptr %2271, i32 0, i32 1
  %2273 = load i8, ptr %2272, align 1, !tbaa !21
  %2274 = sext i8 %2273 to i64
  %2275 = getelementptr inbounds [32 x i16], ptr %2269, i64 0, i64 %2274
  store i16 %2267, ptr %2275, align 2, !tbaa !52
  br label %2276

2276:                                             ; preds = %2265
  %2277 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %2278 = zext i8 %2277 to i32
  %2279 = and i32 %2278, 1
  %2280 = icmp ne i32 %2279, 0
  %2281 = xor i1 %2280, true
  %2282 = xor i1 %2281, true
  %2283 = zext i1 %2282 to i32
  %2284 = sext i32 %2283 to i64
  %2285 = call i64 @llvm.expect.i64(i64 %2284, i64 1)
  %2286 = icmp ne i64 %2285, 0
  br i1 %2286, label %2287, label %2322

2287:                                             ; preds = %2276
  br label %2288

2288:                                             ; preds = %2287
  %2289 = load i32, ptr %12, align 4, !tbaa !41
  %2290 = icmp ne i32 %2289, 0
  br i1 %2290, label %2304, label %2291

2291:                                             ; preds = %2288
  %2292 = load ptr, ptr %3, align 8, !tbaa !5
  %2293 = getelementptr inbounds %struct.MDBX_cursor, ptr %2292, i32 0, i32 9
  %2294 = load ptr, ptr %3, align 8, !tbaa !5
  %2295 = getelementptr inbounds %struct.MDBX_cursor, ptr %2294, i32 0, i32 1
  %2296 = getelementptr inbounds %struct.anon.9, ptr %2295, i32 0, i32 1
  %2297 = load i8, ptr %2296, align 1, !tbaa !21
  %2298 = sext i8 %2297 to i64
  %2299 = getelementptr inbounds [32 x ptr], ptr %2293, i64 0, i64 %2298
  %2300 = load ptr, ptr %2299, align 8, !tbaa !5
  %2301 = call i64 @page_numkeys(ptr noundef %2300) #8
  %2302 = load i64, ptr %6, align 8, !tbaa !25
  %2303 = icmp uge i64 %2301, %2302
  br label %2304

2304:                                             ; preds = %2291, %2288
  %2305 = phi i1 [ true, %2288 ], [ %2303, %2291 ]
  %2306 = xor i1 %2305, true
  %2307 = xor i1 %2306, true
  %2308 = xor i1 %2307, true
  %2309 = zext i1 %2308 to i32
  %2310 = sext i32 %2309 to i64
  %2311 = call i64 @llvm.expect.i64(i64 %2310, i64 0)
  %2312 = icmp ne i64 %2311, 0
  br i1 %2312, label %2313, label %2319

2313:                                             ; preds = %2304
  %2314 = load ptr, ptr %3, align 8, !tbaa !5
  %2315 = getelementptr inbounds %struct.MDBX_cursor, ptr %2314, i32 0, i32 5
  %2316 = load ptr, ptr %2315, align 8, !tbaa !14
  %2317 = getelementptr inbounds %struct.MDBX_txn, ptr %2316, i32 0, i32 9
  %2318 = load ptr, ptr %2317, align 8, !tbaa !16
  call void @mdbx_assert_fail(ptr noundef %2318, ptr noundef @.str.35, ptr noundef @__func__.tree_rebalance, i32 noundef 899) #7
  unreachable

2319:                                             ; preds = %2304
  br label %2320

2320:                                             ; preds = %2319
  br label %2321

2321:                                             ; preds = %2320
  br label %2322

2322:                                             ; preds = %2321, %2276
  br label %2323

2323:                                             ; preds = %2322
  br label %2324

2324:                                             ; preds = %2323
  %2325 = load i32, ptr %12, align 4, !tbaa !41
  store i32 %2325, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2418

2326:                                             ; preds = %2182
  br label %2327

2327:                                             ; preds = %2326, %2178, %2175
  %2328 = load i64, ptr %28, align 8, !tbaa !25
  %2329 = load i64, ptr %6, align 8, !tbaa !25
  %2330 = icmp uge i64 %2328, %2329
  br i1 %2330, label %2331, label %2356

2331:                                             ; preds = %2327
  %2332 = load i64, ptr %26, align 8, !tbaa !25
  %2333 = trunc i64 %2332 to i16
  %2334 = load ptr, ptr %3, align 8, !tbaa !5
  %2335 = getelementptr inbounds %struct.MDBX_cursor, ptr %2334, i32 0, i32 10
  %2336 = load ptr, ptr %3, align 8, !tbaa !5
  %2337 = getelementptr inbounds %struct.MDBX_cursor, ptr %2336, i32 0, i32 1
  %2338 = getelementptr inbounds %struct.anon.9, ptr %2337, i32 0, i32 1
  %2339 = load i8, ptr %2338, align 1, !tbaa !21
  %2340 = sext i8 %2339 to i64
  %2341 = getelementptr inbounds [32 x i16], ptr %2335, i64 0, i64 %2340
  store i16 %2333, ptr %2341, align 2, !tbaa !52
  %2342 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !9
  %2343 = zext i8 %2342 to i32
  %2344 = and i32 %2343, 2
  %2345 = icmp ne i32 %2344, 0
  %2346 = xor i1 %2345, true
  %2347 = xor i1 %2346, true
  %2348 = zext i1 %2347 to i32
  %2349 = sext i32 %2348 to i64
  %2350 = call i64 @llvm.expect.i64(i64 %2349, i64 0)
  %2351 = icmp ne i64 %2350, 0
  br i1 %2351, label %2352, label %2355

2352:                                             ; preds = %2331
  %2353 = load ptr, ptr %3, align 8, !tbaa !5
  %2354 = call i32 @cursor_validate_updating(ptr noundef %2353)
  store i32 %2354, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2418

2355:                                             ; preds = %2331
  store i32 0, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2418

2356:                                             ; preds = %2327
  %2357 = load i8, ptr %8, align 1, !tbaa !38, !range !36, !noundef !37
  %2358 = trunc i8 %2357 to i1
  br i1 %2358, label %2359, label %2363

2359:                                             ; preds = %2356
  %2360 = load i64, ptr %7, align 8, !tbaa !25
  %2361 = icmp ugt i64 %2360, 0
  br i1 %2361, label %2362, label %2363

2362:                                             ; preds = %2359
  store i64 0, ptr %7, align 8, !tbaa !25
  br label %1532

2363:                                             ; preds = %2359, %2356
  %2364 = load i8, ptr %33, align 1, !tbaa !38, !range !36, !noundef !37
  %2365 = trunc i8 %2364 to i1
  br i1 %2365, label %2367, label %2366

2366:                                             ; preds = %2363
  store i8 1, ptr %33, align 1, !tbaa !38
  br label %1532

2367:                                             ; preds = %2363
  %2368 = load i64, ptr %7, align 8, !tbaa !25
  %2369 = icmp ugt i64 %2368, 0
  br i1 %2369, label %2370, label %2371

2370:                                             ; preds = %2367
  store i64 0, ptr %7, align 8, !tbaa !25
  br label %1532

2371:                                             ; preds = %2367
  br label %2372

2372:                                             ; preds = %2371
  %2373 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !40
  %2374 = zext i8 %2373 to i32
  %2375 = icmp sle i32 1, %2374
  %2376 = xor i1 %2375, true
  %2377 = xor i1 %2376, true
  %2378 = zext i1 %2377 to i32
  %2379 = sext i32 %2378 to i64
  %2380 = call i64 @llvm.expect.i64(i64 %2379, i64 0)
  %2381 = icmp ne i64 %2380, 0
  br i1 %2381, label %2382, label %2415

2382:                                             ; preds = %2372
  %2383 = load ptr, ptr %4, align 8, !tbaa !5
  %2384 = call zeroext i1 @is_leaf(ptr noundef %2383) #8
  %2385 = zext i1 %2384 to i64
  %2386 = select i1 %2384, ptr @.str.9, ptr @.str.10
  %2387 = load ptr, ptr %4, align 8, !tbaa !5
  %2388 = getelementptr inbounds %struct.page, ptr %2387, i32 0, i32 4
  %2389 = load i32, ptr %2388, align 1, !tbaa !41
  %2390 = load i64, ptr %9, align 8, !tbaa !25
  %2391 = load ptr, ptr %3, align 8, !tbaa !5
  %2392 = getelementptr inbounds %struct.MDBX_cursor, ptr %2391, i32 0, i32 5
  %2393 = load ptr, ptr %2392, align 8, !tbaa !14
  %2394 = getelementptr inbounds %struct.MDBX_txn, ptr %2393, i32 0, i32 9
  %2395 = load ptr, ptr %2394, align 8, !tbaa !16
  %2396 = load ptr, ptr %4, align 8, !tbaa !5
  %2397 = call i32 @page_fill_percentum_x10(ptr noundef %2395, ptr noundef %2396) #8
  %2398 = udiv i32 %2397, 10
  %2399 = load ptr, ptr %3, align 8, !tbaa !5
  %2400 = getelementptr inbounds %struct.MDBX_cursor, ptr %2399, i32 0, i32 5
  %2401 = load ptr, ptr %2400, align 8, !tbaa !14
  %2402 = getelementptr inbounds %struct.MDBX_txn, ptr %2401, i32 0, i32 9
  %2403 = load ptr, ptr %2402, align 8, !tbaa !16
  %2404 = load ptr, ptr %4, align 8, !tbaa !5
  %2405 = call i32 @page_fill_percentum_x10(ptr noundef %2403, ptr noundef %2404) #8
  %2406 = urem i32 %2405, 10
  %2407 = load ptr, ptr %3, align 8, !tbaa !5
  %2408 = getelementptr inbounds %struct.MDBX_cursor, ptr %2407, i32 0, i32 5
  %2409 = load ptr, ptr %2408, align 8, !tbaa !14
  %2410 = getelementptr inbounds %struct.MDBX_txn, ptr %2409, i32 0, i32 9
  %2411 = load ptr, ptr %2410, align 8, !tbaa !16
  %2412 = load ptr, ptr %4, align 8, !tbaa !5
  %2413 = call i64 @page_used(ptr noundef %2411, ptr noundef %2412) #8
  %2414 = load i64, ptr %10, align 8, !tbaa !25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.tree_rebalance, i32 noundef 931, ptr noundef @.str.37, ptr noundef %2386, i32 noundef %2389, i64 noundef %2390, i32 noundef %2398, i32 noundef %2406, i64 noundef %2413, i64 noundef %2414)
  br label %2415

2415:                                             ; preds = %2382, %2372
  br label %2416

2416:                                             ; preds = %2415
  br label %2417

2417:                                             ; preds = %2416
  store i32 -30779, ptr %2, align 4
  store i32 1, ptr %11, align 4
  br label %2418

2418:                                             ; preds = %2417, %2355, %2352, %2324, %2172, %2010, %1823
  call void @llvm.lifetime.end.p0(i64 1, ptr %33) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #9
  br label %2419

2419:                                             ; preds = %2418, %1375, %1274
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #9
  call void @llvm.lifetime.end.p0(i64 824, ptr %22) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #9
  br label %2420

2420:                                             ; preds = %2419, %1104
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #9
  br label %2421

2421:                                             ; preds = %2420, %447
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %8) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %5) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #9
  %2422 = load i32, ptr %2, align 4
  ret i32 %2422
}

declare zeroext i1 @cursor_is_tracked(ptr noundef) #6

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden zeroext i8 @page_type(ptr noundef) #1

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden i64 @gc_stockpile(ptr noundef) #1

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden i64 @page_room(ptr noundef) #1

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

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

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

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

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden i64 @cursor_dbi(ptr noundef) #1

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

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

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

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

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

; Function Attrs: nounwind uwtable
declare hidden ptr @cursor_clone(ptr noundef, ptr noundef) #5

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

declare ptr @cursor_cpstk(ptr noundef, ptr noundef) #6

; Function Attrs: nounwind uwtable
declare hidden i32 @node_move(ptr noundef, ptr noundef, i1 noundef zeroext) #5

declare i32 @cursor_validate_updating(ptr noundef) #6

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

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

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


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.libmdbx_globals = type { %union.bin128, i32, i32, i8, i8, i8, i8, i32, %union.logger_union, %union.pthread_mutex_t, i64, ptr }
%union.bin128 = type { %struct.anon.6 }
%struct.anon.6 = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.cursor_couple = type { %struct.MDBX_cursor, ptr, %struct.inner_cursor }
%struct.MDBX_cursor = type { i32, %union.anon.8, i8, i8, ptr, ptr, ptr, ptr, ptr, [32 x ptr], [32 x i16], ptr, ptr }
%union.anon.8 = type { i16 }
%struct.inner_cursor = type { %struct.MDBX_cursor, %struct.tree }
%struct.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.5 = external hidden unnamed_addr constant [22 x i8], align 1
@__func__.tree_rebalance = external hidden unnamed_addr constant [15 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [72 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [79 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [87 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [93 x i8], align 1

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

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare hidden i32 @node_pgno(ptr noalias noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @page_retire(ptr noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @be_poor(ptr noundef) local_unnamed_addr #3

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

7:                                                ; preds = %1
  %8 = tail call zeroext i1 @cursor_is_tracked(ptr noundef %0) #6
  br i1 %8, label %._crit_edge552, label %9, !prof !14

._crit_edge552:                                   ; preds = %7
  %.pre = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  br label %14

9:                                                ; preds = %7
  %10 = getelementptr inbounds i8, ptr %0, i64 16
  %11 = load ptr, ptr %10, align 8, !tbaa !15
  %12 = getelementptr inbounds i8, ptr %11, i64 80
  %13 = load ptr, ptr %12, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %13, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 672) #7
  unreachable

14:                                               ; preds = %._crit_edge552, %1
  %15 = phi i8 [ %.pre, %._crit_edge552 ], [ %5, %1 ]
  %16 = and i8 %15, 1
  %.not405 = icmp eq i8 %16, 0
  %.phi.trans.insert = getelementptr inbounds i8, ptr %0, i64 5
  %.pre553 = load i8, ptr %.phi.trans.insert, align 1, !tbaa !22
  br i1 %.not405, label %..critedge_crit_edge, label %17, !prof !13

..critedge_crit_edge:                             ; preds = %14
  %.phi.trans.insert554 = getelementptr inbounds i8, ptr %0, i64 24
  %.pre555 = load ptr, ptr %.phi.trans.insert554, align 8, !tbaa !23
  br label %.critedge

17:                                               ; preds = %14
  %18 = icmp slt i8 %.pre553, 0
  br i1 %18, label %19, label %24, !prof !13

19:                                               ; preds = %17
  %20 = getelementptr inbounds i8, ptr %0, i64 16
  %21 = load ptr, ptr %20, align 8, !tbaa !15
  %22 = getelementptr inbounds i8, ptr %21, i64 80
  %23 = load ptr, ptr %22, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %23, ptr noundef nonnull @.str.6, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 673) #7
  unreachable

24:                                               ; preds = %17
  %narrow = add nuw i8 %.pre553, 1
  %25 = getelementptr inbounds i8, ptr %0, i64 24
  %26 = load ptr, ptr %25, align 8, !tbaa !23
  %27 = getelementptr inbounds i8, ptr %26, i64 2
  %28 = load i16, ptr %27, align 2, !tbaa !24
  %29 = zext i8 %narrow to i16
  %30 = icmp ugt i16 %28, %29
  br i1 %30, label %.critedge, label %31

31:                                               ; preds = %24
  %32 = zext nneg i16 %28 to i64
  %33 = getelementptr inbounds i8, ptr %0, i64 48
  %34 = add nsw i64 %32, -1
  %35 = getelementptr inbounds [32 x ptr], ptr %33, i64 0, i64 %34
  %36 = load ptr, ptr %35, align 8, !tbaa !26
  %37 = tail call zeroext i1 @is_leaf(ptr noundef %36) #8
  br i1 %37, label %.critedge, label %38, !prof !14

38:                                               ; preds = %31
  %39 = getelementptr inbounds i8, ptr %0, i64 16
  %40 = load ptr, ptr %39, align 8, !tbaa !15
  %41 = getelementptr inbounds i8, ptr %40, i64 80
  %42 = load ptr, ptr %41, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %42, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 674) #7
  unreachable

.critedge:                                        ; preds = %..critedge_crit_edge, %24, %31
  %43 = phi ptr [ %.pre555, %..critedge_crit_edge ], [ %26, %24 ], [ %26, %31 ]
  %44 = getelementptr inbounds i8, ptr %0, i64 48
  %45 = getelementptr inbounds i8, ptr %0, i64 4
  %46 = getelementptr inbounds i8, ptr %0, i64 5
  %47 = sext i8 %.pre553 to i64
  %48 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %47
  %49 = load ptr, ptr %48, align 8, !tbaa !26
  %50 = tail call zeroext i8 @page_type(ptr noundef %49) #8
  %51 = and i8 %50, 1
  %narrow460 = add nuw nsw i8 %51, 1
  %52 = zext nneg i8 %narrow460 to i64
  %53 = getelementptr inbounds i8, ptr %0, i64 16
  %54 = load ptr, ptr %53, align 8, !tbaa !15
  %55 = getelementptr inbounds i8, ptr %54, i64 80
  %56 = load ptr, ptr %55, align 8, !tbaa !17
  %57 = getelementptr inbounds i8, ptr %56, i64 130
  %58 = load i16, ptr %57, align 2, !tbaa !27
  %59 = zext i16 %58 to i64
  %60 = getelementptr inbounds i8, ptr %56, i64 301
  %61 = load i8, ptr %60, align 1, !tbaa !36, !range !37, !noundef !38
  %62 = getelementptr inbounds i8, ptr %0, i64 24
  %63 = getelementptr inbounds i8, ptr %54, i64 88
  %64 = load ptr, ptr %63, align 8, !tbaa !39
  %65 = icmp eq ptr %43, %64
  br i1 %65, label %66, label %75, !prof !13

66:                                               ; preds = %.critedge
  %67 = tail call i64 @page_space(ptr noundef nonnull %56) #8
  %68 = tail call i64 @gc_stockpile(ptr noundef nonnull %54) #8
  %69 = getelementptr inbounds i8, ptr %43, i64 2
  %70 = load i16, ptr %69, align 2, !tbaa !24
  %71 = zext i16 %70 to i64
  %72 = shl nuw nsw i64 %71, 1
  %73 = icmp ugt i64 %68, %72
  %74 = zext i1 %73 to i64
  %spec.select = lshr i64 %67, %74
  br label %75

75:                                               ; preds = %66, %.critedge
  %.0371 = phi i8 [ %61, %.critedge ], [ 1, %66 ]
  %.0369 = phi i64 [ %59, %.critedge ], [ %spec.select, %66 ]
  %76 = tail call i64 @page_numkeys(ptr noundef %49) #8
  %77 = tail call i64 @page_room(ptr noundef %49) #8
  %78 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %79 = icmp ugt i8 %78, 4
  br i1 %79, label %80, label %89, !prof !13

80:                                               ; preds = %75
  %81 = tail call zeroext i1 @is_leaf(ptr noundef %49) #8
  %82 = select i1 %81, ptr @.str.9, ptr @.str.10
  %83 = getelementptr inbounds i8, ptr %49, i64 16
  %84 = load i32, ptr %83, align 1, !tbaa !41
  %85 = tail call i32 @page_fill_percentum_x10(ptr noundef nonnull %56, ptr noundef %49) #8
  %86 = udiv i32 %85, 10
  %87 = urem i32 %85, 10
  %88 = tail call i64 @page_used(ptr noundef nonnull %56, ptr noundef %49) #8
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 699, ptr noundef nonnull @.str.8, ptr noundef nonnull %82, i32 noundef %84, i64 noundef %76, i32 noundef %86, i32 noundef %87, i64 noundef %88, i64 noundef %77) #6
  %.pre556 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %.pre563 = and i8 %.pre556, 1
  br label %89

89:                                               ; preds = %75, %80
  %.pre-phi = phi i8 [ %16, %75 ], [ %.pre563, %80 ]
  %.not407 = icmp eq i8 %.pre-phi, 0
  br i1 %.not407, label %96, label %90, !prof !13

90:                                               ; preds = %89
  %91 = load ptr, ptr %53, align 8, !tbaa !15
  %92 = tail call zeroext i1 @is_modifable(ptr noundef %91, ptr noundef %49) #8
  br i1 %92, label %96, label %93, !prof !14

93:                                               ; preds = %90
  %94 = getelementptr inbounds i8, ptr %91, i64 80
  %95 = load ptr, ptr %94, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %95, ptr noundef nonnull @.str.11, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 700) #7
  unreachable

96:                                               ; preds = %90, %89
  %97 = icmp ult i64 %76, %52
  br i1 %97, label %98, label %104, !prof !13

98:                                               ; preds = %96
  %99 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %100 = icmp ugt i8 %99, 4
  br i1 %100, label %101, label %125, !prof !13

101:                                              ; preds = %98
  %102 = getelementptr inbounds i8, ptr %49, i64 16
  %103 = load i32, ptr %102, align 1, !tbaa !41
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 703, ptr noundef nonnull @.str.12, i32 noundef %103, i64 noundef %52) #6
  br label %125

104:                                              ; preds = %96
  %105 = icmp ugt i64 %77, %.0369
  %106 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %107 = icmp ugt i8 %106, 4
  br i1 %105, label %108, label %112, !prof !13

108:                                              ; preds = %104
  br i1 %107, label %109, label %125, !prof !13

109:                                              ; preds = %108
  %110 = getelementptr inbounds i8, ptr %49, i64 16
  %111 = load i32, ptr %110, align 1, !tbaa !41
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 705, ptr noundef nonnull @.str.13, i32 noundef %111, i64 noundef %77, i64 noundef %.0369) #6
  br label %125

112:                                              ; preds = %104
  br i1 %107, label %113, label %116, !prof !13

113:                                              ; preds = %112
  %114 = getelementptr inbounds i8, ptr %49, i64 16
  %115 = load i32, ptr %114, align 1, !tbaa !41
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 707, ptr noundef nonnull @.str.14, i32 noundef %115, i64 noundef %77, i64 noundef %.0369) #6
  %.pre557 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %.pre570 = and i8 %.pre557, 1
  br label %116

116:                                              ; preds = %112, %113
  %.pre-phi571 = phi i8 [ %.pre-phi, %112 ], [ %.pre570, %113 ]
  %.not408 = icmp eq i8 %.pre-phi571, 0
  br i1 %.not408, label %724, label %117, !prof !13

117:                                              ; preds = %116
  %118 = load ptr, ptr %62, align 8, !tbaa !23
  %119 = getelementptr inbounds i8, ptr %118, i64 32
  %120 = load i64, ptr %119, align 4, !tbaa !42
  %.not409 = icmp eq i64 %120, 0
  br i1 %.not409, label %121, label %724, !prof !13

121:                                              ; preds = %117
  %122 = load ptr, ptr %53, align 8, !tbaa !15
  %123 = getelementptr inbounds i8, ptr %122, i64 80
  %124 = load ptr, ptr %123, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %124, ptr noundef nonnull @.str.15, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 708) #7
  unreachable

125:                                              ; preds = %109, %108, %98, %101
  %126 = load i8, ptr %46, align 1, !tbaa !22
  %127 = icmp eq i8 %126, 0
  %128 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %129 = and i8 %128, 1
  %.not456 = icmp eq i8 %129, 0
  br i1 %127, label %130, label %335

130:                                              ; preds = %125
  %131 = load ptr, ptr %44, align 8, !tbaa !26
  %132 = tail call i64 @page_numkeys(ptr noundef %131) #8
  br i1 %.not456, label %144, label %133, !prof !13

133:                                              ; preds = %130
  %134 = load ptr, ptr %62, align 8, !tbaa !23
  %135 = getelementptr inbounds i8, ptr %134, i64 32
  %136 = load i64, ptr %135, align 4, !tbaa !42
  %137 = icmp eq i64 %136, 0
  %138 = icmp eq i64 %132, 0
  %139 = xor i1 %138, %137
  br i1 %139, label %140, label %144, !prof !13

140:                                              ; preds = %133
  %141 = load ptr, ptr %53, align 8, !tbaa !15
  %142 = getelementptr inbounds i8, ptr %141, i64 80
  %143 = load ptr, ptr %142, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %143, ptr noundef nonnull @.str.16, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 716) #7
  unreachable

144:                                              ; preds = %133, %130
  %145 = icmp eq i64 %132, 0
  br i1 %145, label %146, label %209

146:                                              ; preds = %144
  %147 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %148 = icmp ugt i8 %147, 4
  br i1 %148, label %149, label %150, !prof !13

149:                                              ; preds = %146
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 718, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18) #6
  %.pre562 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %.pre564 = and i8 %.pre562, 1
  br label %150

150:                                              ; preds = %146, %149
  %.pre-phi565 = phi i8 [ %129, %146 ], [ %.pre564, %149 ]
  %.not464 = icmp eq i8 %.pre-phi565, 0
  br i1 %.not464, label %.thread498, label %151, !prof !13

151:                                              ; preds = %150
  %152 = tail call zeroext i1 @is_leaf(ptr noundef %131) #8
  br i1 %152, label %157, label %153, !prof !14

153:                                              ; preds = %151
  %154 = load ptr, ptr %53, align 8, !tbaa !15
  %155 = getelementptr inbounds i8, ptr %154, i64 80
  %156 = load ptr, ptr %155, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %156, ptr noundef nonnull @.str.19, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 719) #7
  unreachable

157:                                              ; preds = %151
  %158 = tail call ptr @cursor_dbi_state(ptr noundef nonnull %0) #8
  %159 = load i8, ptr %158, align 1, !tbaa !22
  %160 = and i8 %159, 1
  %.not466 = icmp eq i8 %160, 0
  br i1 %.not466, label %161, label %165, !prof !13

161:                                              ; preds = %157
  %162 = load ptr, ptr %53, align 8, !tbaa !15
  %163 = getelementptr inbounds i8, ptr %162, i64 80
  %164 = load ptr, ptr %163, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %164, ptr noundef nonnull @.str.20, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 720) #7
  unreachable

165:                                              ; preds = %157
  %166 = load ptr, ptr %62, align 8, !tbaa !23
  %167 = getelementptr inbounds i8, ptr %166, i64 12
  %168 = load i32, ptr %167, align 4, !tbaa !43
  %169 = icmp eq i32 %168, 0
  br i1 %169, label %170, label %.critedge471, !prof !14

170:                                              ; preds = %165
  %171 = getelementptr inbounds i8, ptr %166, i64 20
  %172 = load i32, ptr %171, align 4, !tbaa !44
  %173 = icmp eq i32 %172, 0
  br i1 %173, label %174, label %.critedge471, !prof !14

174:                                              ; preds = %170
  %175 = getelementptr inbounds i8, ptr %166, i64 16
  %176 = load i32, ptr %175, align 4, !tbaa !45
  %.not504 = icmp eq i32 %176, 1
  br i1 %.not504, label %.thread498, label %.critedge471, !prof !14

.critedge471:                                     ; preds = %170, %165, %174
  %177 = load ptr, ptr %53, align 8, !tbaa !15
  %178 = getelementptr inbounds i8, ptr %177, i64 80
  %179 = load ptr, ptr %178, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %179, ptr noundef nonnull @.str.21, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 721) #7
  unreachable

.thread498:                                       ; preds = %150, %174
  %180 = load ptr, ptr %53, align 8, !tbaa !15
  %181 = getelementptr inbounds i8, ptr %180, i64 120
  %182 = load ptr, ptr %181, align 8, !tbaa !46
  %183 = tail call i64 @cursor_dbi(ptr noundef nonnull %0) #8
  %184 = getelementptr inbounds ptr, ptr %182, i64 %183
  %.0374528 = load ptr, ptr %184, align 8, !tbaa !26
  %.not468529 = icmp eq ptr %.0374528, null
  br i1 %.not468529, label %._crit_edge532, label %.lr.ph531

._crit_edge532:                                   ; preds = %202, %.thread498
  %185 = tail call zeroext i1 @is_subpage(ptr noundef %131) #8
  br i1 %185, label %724, label %204

.lr.ph531:                                        ; preds = %.thread498, %202
  %.0374530 = phi ptr [ %.0374, %202 ], [ %.0374528, %.thread498 ]
  %186 = load i8, ptr %45, align 4, !tbaa !22
  %187 = and i8 %186, 1
  %.not469 = icmp eq i8 %187, 0
  br i1 %.not469, label %191, label %188

188:                                              ; preds = %.lr.ph531
  %189 = getelementptr inbounds i8, ptr %.0374530, i64 40
  %190 = load ptr, ptr %189, align 8, !tbaa !47
  br label %191

191:                                              ; preds = %.lr.ph531, %188
  %192 = phi ptr [ %190, %188 ], [ %.0374530, %.lr.ph531 ]
  %193 = tail call zeroext i1 @is_poor(ptr noundef %192) #8
  br i1 %193, label %202, label %194

194:                                              ; preds = %191
  %195 = getelementptr inbounds i8, ptr %192, i64 48
  %196 = load ptr, ptr %195, align 8, !tbaa !26
  %197 = icmp eq ptr %196, %131
  br i1 %197, label %198, label %202

198:                                              ; preds = %194
  tail call void @be_poor(ptr noundef nonnull %192)
  %199 = getelementptr inbounds i8, ptr %192, i64 4
  %200 = load i8, ptr %199, align 4, !tbaa !22
  %201 = or i8 %200, 8
  store i8 %201, ptr %199, align 4, !tbaa !22
  br label %202

202:                                              ; preds = %198, %194, %191
  %203 = getelementptr inbounds i8, ptr %.0374530, i64 368
  %.0374 = load ptr, ptr %203, align 8, !tbaa !26
  %.not468 = icmp eq ptr %.0374, null
  br i1 %.not468, label %._crit_edge532, label %.lr.ph531, !llvm.loop !48

204:                                              ; preds = %._crit_edge532
  %205 = load ptr, ptr %62, align 8, !tbaa !23
  %206 = getelementptr inbounds i8, ptr %205, i64 8
  store i32 -1, ptr %206, align 4, !tbaa !50
  %207 = getelementptr inbounds i8, ptr %205, i64 2
  store i16 0, ptr %207, align 2, !tbaa !24
  %208 = tail call i32 @page_retire(ptr noundef nonnull %0, ptr noundef %131)
  br label %724

209:                                              ; preds = %144
  %210 = tail call zeroext i1 @is_subpage(ptr noundef %131) #8
  br i1 %210, label %211, label %222

211:                                              ; preds = %209
  %212 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %213 = icmp ugt i8 %212, 4
  br i1 %213, label %214, label %215, !prof !13

214:                                              ; preds = %211
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 739, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.22) #6
  %.pre561 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %.pre566 = and i8 %.pre561, 1
  br label %215

215:                                              ; preds = %211, %214
  %.pre-phi567 = phi i8 [ %129, %211 ], [ %.pre566, %214 ]
  %.not463 = icmp eq i8 %.pre-phi567, 0
  br i1 %.not463, label %724, label %216, !prof !13

216:                                              ; preds = %215
  %217 = tail call zeroext i1 @is_leaf(ptr noundef %49) #8
  br i1 %217, label %724, label %218, !prof !14

218:                                              ; preds = %216
  %219 = load ptr, ptr %53, align 8, !tbaa !15
  %220 = getelementptr inbounds i8, ptr %219, i64 80
  %221 = load ptr, ptr %220, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %221, ptr noundef nonnull @.str.23, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 740) #7
  unreachable

222:                                              ; preds = %209
  %223 = tail call zeroext i1 @is_branch(ptr noundef %131) #8
  %224 = icmp eq i64 %132, 1
  %or.cond = select i1 %223, i1 %224, i1 false
  %225 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %226 = icmp ugt i8 %225, 4
  br i1 %or.cond, label %227, label %328

227:                                              ; preds = %222
  br i1 %226, label %228, label %229, !prof !13

228:                                              ; preds = %227
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 744, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.24) #6
  br label %229

229:                                              ; preds = %228, %227
  %230 = tail call ptr @page_node(ptr noundef %131, i64 noundef 0) #8
  %231 = tail call i32 @node_pgno(ptr noundef %230) #8
  %232 = load ptr, ptr %62, align 8, !tbaa !23
  %233 = getelementptr inbounds i8, ptr %232, i64 8
  store i32 %231, ptr %233, align 4, !tbaa !50
  %234 = load i64, ptr %131, align 1, !tbaa !51
  %235 = tail call i32 @page_get(ptr noundef nonnull %0, i32 noundef %231, ptr noundef nonnull %44, i64 noundef %234)
  %.not457 = icmp eq i32 %235, 0
  br i1 %.not457, label %236, label %724, !prof !14

236:                                              ; preds = %229
  %237 = load ptr, ptr %62, align 8, !tbaa !23
  %238 = getelementptr inbounds i8, ptr %237, i64 2
  %239 = load i16, ptr %238, align 2, !tbaa !24
  %240 = add i16 %239, -1
  store i16 %240, ptr %238, align 2, !tbaa !24
  %241 = getelementptr inbounds i8, ptr %0, i64 304
  %242 = getelementptr inbounds i8, ptr %0, i64 306
  %243 = load i16, ptr %242, align 2, !tbaa !52
  store i16 %243, ptr %241, align 8, !tbaa !52
  %244 = load i16, ptr %238, align 2, !tbaa !24
  %245 = icmp ugt i16 %244, 1
  br i1 %245, label %.lr.ph, label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph, %236
  %246 = load ptr, ptr %53, align 8, !tbaa !15
  %247 = getelementptr inbounds i8, ptr %246, i64 120
  %248 = load ptr, ptr %247, align 8, !tbaa !46
  %249 = tail call i64 @cursor_dbi(ptr noundef nonnull %0) #8
  %250 = getelementptr inbounds ptr, ptr %248, i64 %249
  %.0376522 = load ptr, ptr %250, align 8, !tbaa !26
  %.not458523 = icmp eq ptr %.0376522, null
  br i1 %.not458523, label %._crit_edge527, label %.lr.ph526

.lr.ph:                                           ; preds = %236, %.lr.ph
  %.0375518 = phi i64 [ %251, %.lr.ph ], [ 1, %236 ]
  %251 = add nuw nsw i64 %.0375518, 1
  %252 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %251
  %253 = load ptr, ptr %252, align 8, !tbaa !26
  %254 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %.0375518
  store ptr %253, ptr %254, align 8, !tbaa !26
  %255 = getelementptr inbounds [32 x i16], ptr %241, i64 0, i64 %251
  %256 = load i16, ptr %255, align 2, !tbaa !52
  %257 = getelementptr inbounds [32 x i16], ptr %241, i64 0, i64 %.0375518
  store i16 %256, ptr %257, align 2, !tbaa !52
  %258 = load i16, ptr %238, align 2, !tbaa !24
  %259 = zext i16 %258 to i64
  %260 = icmp ult i64 %251, %259
  br i1 %260, label %.lr.ph, label %._crit_edge, !llvm.loop !53

._crit_edge527:                                   ; preds = %295, %._crit_edge
  %261 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %262 = and i8 %261, 1
  %.not459 = icmp eq i8 %262, 0
  br i1 %.not459, label %.critedge475, label %297, !prof !13

.lr.ph526:                                        ; preds = %._crit_edge, %295
  %.0376524 = phi ptr [ %.0376, %295 ], [ %.0376522, %._crit_edge ]
  %263 = load i8, ptr %45, align 4, !tbaa !22
  %264 = and i8 %263, 1
  %.not462 = icmp eq i8 %264, 0
  br i1 %.not462, label %268, label %265

265:                                              ; preds = %.lr.ph526
  %266 = getelementptr inbounds i8, ptr %.0376524, i64 40
  %267 = load ptr, ptr %266, align 8, !tbaa !47
  br label %268

268:                                              ; preds = %.lr.ph526, %265
  %269 = phi ptr [ %267, %265 ], [ %.0376524, %.lr.ph526 ]
  %270 = tail call zeroext i1 @is_related(ptr noundef nonnull %0, ptr noundef %269)
  br i1 %270, label %271, label %295

271:                                              ; preds = %268
  %272 = getelementptr inbounds i8, ptr %269, i64 48
  %273 = load ptr, ptr %272, align 8, !tbaa !26
  %274 = icmp eq ptr %273, %131
  br i1 %274, label %.preheader, label %295

.preheader:                                       ; preds = %271
  %275 = load ptr, ptr %62, align 8, !tbaa !23
  %276 = getelementptr inbounds i8, ptr %275, i64 2
  %277 = load i16, ptr %276, align 2, !tbaa !24
  %.not539 = icmp eq i16 %277, 0
  br i1 %.not539, label %._crit_edge521, label %.lr.ph520

.lr.ph520:                                        ; preds = %.preheader
  %278 = getelementptr inbounds i8, ptr %269, i64 304
  br label %282

._crit_edge521:                                   ; preds = %282, %.preheader
  %279 = getelementptr inbounds i8, ptr %269, i64 5
  %280 = load i8, ptr %279, align 1, !tbaa !22
  %281 = add i8 %280, -1
  store i8 %281, ptr %279, align 1, !tbaa !22
  br label %295

282:                                              ; preds = %.lr.ph520, %282
  %.0377519 = phi i64 [ 0, %.lr.ph520 ], [ %283, %282 ]
  %283 = add nuw nsw i64 %.0377519, 1
  %284 = getelementptr inbounds [32 x ptr], ptr %272, i64 0, i64 %283
  %285 = load ptr, ptr %284, align 8, !tbaa !26
  %286 = getelementptr inbounds [32 x ptr], ptr %272, i64 0, i64 %.0377519
  store ptr %285, ptr %286, align 8, !tbaa !26
  %287 = getelementptr inbounds [32 x i16], ptr %278, i64 0, i64 %283
  %288 = load i16, ptr %287, align 2, !tbaa !52
  %289 = getelementptr inbounds [32 x i16], ptr %278, i64 0, i64 %.0377519
  store i16 %288, ptr %289, align 2, !tbaa !52
  %290 = load ptr, ptr %62, align 8, !tbaa !23
  %291 = getelementptr inbounds i8, ptr %290, i64 2
  %292 = load i16, ptr %291, align 2, !tbaa !24
  %293 = zext i16 %292 to i64
  %294 = icmp ult i64 %283, %293
  br i1 %294, label %282, label %._crit_edge521, !llvm.loop !54

295:                                              ; preds = %._crit_edge521, %271, %268
  %296 = getelementptr inbounds i8, ptr %.0376524, i64 368
  %.0376 = load ptr, ptr %296, align 8, !tbaa !26
  %.not458 = icmp eq ptr %.0376, null
  br i1 %.not458, label %._crit_edge527, label %.lr.ph526, !llvm.loop !55

297:                                              ; preds = %._crit_edge527
  %298 = load i8, ptr %46, align 1, !tbaa !22
  %299 = sext i8 %298 to i64
  %300 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %299
  %301 = load ptr, ptr %300, align 8, !tbaa !26
  %302 = tail call zeroext i1 @is_leaf(ptr noundef %301) #8
  br i1 %302, label %309, label %303

303:                                              ; preds = %297
  %304 = tail call zeroext i8 @page_type(ptr noundef %301) #8
  %.not503 = icmp eq i8 %304, %50
  br i1 %.not503, label %309, label %305, !prof !14

305:                                              ; preds = %303
  %306 = load ptr, ptr %53, align 8, !tbaa !15
  %307 = getelementptr inbounds i8, ptr %306, i64 80
  %308 = load ptr, ptr %307, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %308, ptr noundef nonnull @.str.25, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 767) #7
  unreachable

309:                                              ; preds = %297, %303
  %310 = sext i8 %298 to i32
  %311 = add nsw i32 %310, 1
  %312 = load ptr, ptr %62, align 8, !tbaa !23
  %313 = getelementptr inbounds i8, ptr %312, i64 2
  %314 = load i16, ptr %313, align 2, !tbaa !24
  %315 = zext i16 %314 to i32
  %316 = icmp slt i32 %311, %315
  br i1 %316, label %.critedge475, label %317

317:                                              ; preds = %309
  %318 = add nsw i32 %315, -1
  %319 = sext i32 %318 to i64
  %320 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %319
  %321 = load ptr, ptr %320, align 8, !tbaa !26
  %322 = tail call zeroext i1 @is_leaf(ptr noundef %321) #8
  br i1 %322, label %.critedge475, label %323, !prof !14

323:                                              ; preds = %317
  %324 = load ptr, ptr %53, align 8, !tbaa !15
  %325 = getelementptr inbounds i8, ptr %324, i64 80
  %326 = load ptr, ptr %325, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %326, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 768) #7
  unreachable

.critedge475:                                     ; preds = %._crit_edge527, %309, %317
  %327 = tail call i32 @page_retire(ptr noundef nonnull %0, ptr noundef nonnull %131)
  br label %724

328:                                              ; preds = %222
  br i1 %226, label %329, label %724, !prof !13

329:                                              ; preds = %328
  %330 = getelementptr inbounds i8, ptr %131, i64 16
  %331 = load i32, ptr %330, align 1, !tbaa !41
  %332 = getelementptr inbounds i8, ptr %131, i64 10
  %333 = load i16, ptr %332, align 1, !tbaa !52
  %334 = zext i16 %333 to i32
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 771, ptr noundef nonnull @.str.26, i32 noundef %331, i32 noundef %334) #6
  br label %724

335:                                              ; preds = %125
  %336 = sext i8 %126 to i64
  %337 = add nsw i64 %336, -1
  br i1 %.not456, label %.thread500, label %338, !prof !13

338:                                              ; preds = %335
  %339 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %337
  %340 = load ptr, ptr %339, align 8, !tbaa !26
  %341 = tail call zeroext i1 @is_branch(ptr noundef %340) #8
  br i1 %341, label %346, label %342, !prof !14

342:                                              ; preds = %338
  %343 = load ptr, ptr %53, align 8, !tbaa !15
  %344 = getelementptr inbounds i8, ptr %343, i64 80
  %345 = load ptr, ptr %344, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %345, ptr noundef nonnull @.str.27, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 778) #7
  unreachable

346:                                              ; preds = %338
  %347 = load ptr, ptr %44, align 8, !tbaa !26
  %348 = tail call zeroext i1 @is_subpage(ptr noundef %347) #8
  br i1 %348, label %349, label %353, !prof !13

349:                                              ; preds = %346
  %350 = load ptr, ptr %53, align 8, !tbaa !15
  %351 = getelementptr inbounds i8, ptr %350, i64 80
  %352 = load ptr, ptr %351, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %352, ptr noundef nonnull @.str.28, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 779) #7
  unreachable

353:                                              ; preds = %346
  %354 = tail call i64 @page_numkeys(ptr noundef %340) #8
  %355 = icmp ult i64 %354, 2
  br i1 %355, label %356, label %.thread500, !prof !13

356:                                              ; preds = %353
  %357 = load ptr, ptr %53, align 8, !tbaa !15
  %358 = getelementptr inbounds i8, ptr %357, i64 80
  %359 = load ptr, ptr %358, align 8, !tbaa !17
  tail call void @mdbx_assert_fail(ptr noundef %359, ptr noundef nonnull @.str.29, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 780) #7
  unreachable

.thread500:                                       ; preds = %335, %353
  call void @llvm.lifetime.start.p0(i64 824, ptr nonnull %2) #6
  %360 = call ptr @cursor_clone(ptr noundef nonnull %0, ptr noundef nonnull %2)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #6
  store ptr null, ptr %3, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #6
  store ptr null, ptr %4, align 8, !tbaa !26
  %361 = getelementptr inbounds i8, ptr %360, i64 304
  %362 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %337
  %363 = load i16, ptr %362, align 2, !tbaa !52
  %.not413 = icmp eq i16 %363, 0
  br i1 %.not413, label %394, label %364

364:                                              ; preds = %.thread500
  %365 = zext i16 %363 to i64
  %366 = getelementptr inbounds i8, ptr %360, i64 48
  %367 = getelementptr inbounds [32 x ptr], ptr %366, i64 0, i64 %337
  %368 = load ptr, ptr %367, align 8, !tbaa !26
  %369 = add nuw nsw i64 %365, 4294967295
  %370 = and i64 %369, 4294967295
  %371 = call ptr @page_node(ptr noundef %368, i64 noundef %370) #8
  %372 = call i32 @node_pgno(ptr noundef %371) #8
  %373 = load i8, ptr %46, align 1, !tbaa !22
  %374 = sext i8 %373 to i64
  %375 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %374
  %376 = load ptr, ptr %375, align 8, !tbaa !26
  %377 = load i64, ptr %376, align 1, !tbaa !51
  %378 = call i32 @page_get(ptr noundef nonnull %360, i32 noundef %372, ptr noundef nonnull %3, i64 noundef %377)
  %.not414 = icmp eq i32 %378, 0
  br i1 %.not414, label %379, label %.critedge484, !prof !14

379:                                              ; preds = %364
  %380 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %381 = and i8 %380, 1
  %.not415 = icmp eq i8 %381, 0
  br i1 %.not415, label %394, label %382, !prof !13

382:                                              ; preds = %379
  %383 = load ptr, ptr %3, align 8, !tbaa !26
  %384 = call zeroext i8 @page_type(ptr noundef %383) #8
  %385 = load i8, ptr %46, align 1, !tbaa !22
  %386 = sext i8 %385 to i64
  %387 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %386
  %388 = load ptr, ptr %387, align 8, !tbaa !26
  %389 = call zeroext i8 @page_type(ptr noundef %388) #8
  %.not416 = icmp eq i8 %384, %389
  br i1 %.not416, label %394, label %390, !prof !14

390:                                              ; preds = %382
  %391 = load ptr, ptr %53, align 8, !tbaa !15
  %392 = getelementptr inbounds i8, ptr %391, i64 80
  %393 = load ptr, ptr %392, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %393, ptr noundef nonnull @.str.30, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 795) #7
  unreachable

394:                                              ; preds = %379, %382, %.thread500
  %395 = load i16, ptr %362, align 2, !tbaa !52
  %396 = zext i16 %395 to i64
  %397 = add nuw nsw i64 %396, 1
  %398 = getelementptr inbounds i8, ptr %360, i64 48
  %399 = getelementptr inbounds [32 x ptr], ptr %398, i64 0, i64 %337
  %400 = load ptr, ptr %399, align 8, !tbaa !26
  %401 = call i64 @page_numkeys(ptr noundef %400) #8
  %402 = icmp ult i64 %397, %401
  br i1 %402, label %403, label %427

403:                                              ; preds = %394
  %404 = call ptr @page_node(ptr noundef %400, i64 noundef %397) #8
  %405 = call i32 @node_pgno(ptr noundef %404) #8
  %406 = load i8, ptr %46, align 1, !tbaa !22
  %407 = sext i8 %406 to i64
  %408 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %407
  %409 = load ptr, ptr %408, align 8, !tbaa !26
  %410 = load i64, ptr %409, align 1, !tbaa !51
  %411 = call i32 @page_get(ptr noundef nonnull %360, i32 noundef %405, ptr noundef nonnull %4, i64 noundef %410)
  %.not417 = icmp eq i32 %411, 0
  br i1 %.not417, label %412, label %.critedge484, !prof !14

412:                                              ; preds = %403
  %413 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %414 = and i8 %413, 1
  %.not418 = icmp eq i8 %414, 0
  br i1 %.not418, label %.thread, label %415, !prof !13

.thread:                                          ; preds = %412
  %.pre560574 = load ptr, ptr %3, align 8, !tbaa !26
  br label %436

415:                                              ; preds = %412
  %416 = load ptr, ptr %4, align 8, !tbaa !26
  %417 = call zeroext i8 @page_type(ptr noundef %416) #8
  %418 = load i8, ptr %46, align 1, !tbaa !22
  %419 = sext i8 %418 to i64
  %420 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %419
  %421 = load ptr, ptr %420, align 8, !tbaa !26
  %422 = call zeroext i8 @page_type(ptr noundef %421) #8
  %.not419 = icmp eq i8 %417, %422
  br i1 %.not419, label %.thread576, label %423, !prof !14

.thread576:                                       ; preds = %415
  %.pre560579 = load ptr, ptr %3, align 8, !tbaa !26
  br label %428

423:                                              ; preds = %415
  %424 = load ptr, ptr %53, align 8, !tbaa !15
  %425 = getelementptr inbounds i8, ptr %424, i64 80
  %426 = load ptr, ptr %425, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %426, ptr noundef nonnull @.str.31, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 802) #7
  unreachable

427:                                              ; preds = %394
  %.pre559 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %.pre568 = and i8 %.pre559, 1
  %.not420 = icmp eq i8 %.pre568, 0
  %.pre560 = load ptr, ptr %3, align 8, !tbaa !26
  br i1 %.not420, label %436, label %428, !prof !56

428:                                              ; preds = %.thread576, %427
  %.pre560580 = phi ptr [ %.pre560579, %.thread576 ], [ %.pre560, %427 ]
  %429 = icmp eq ptr %.pre560580, null
  %430 = load ptr, ptr %4, align 8
  %431 = icmp eq ptr %430, null
  %.not423 = select i1 %429, i1 %431, i1 false
  br i1 %.not423, label %432, label %436, !prof !13

432:                                              ; preds = %428
  %433 = load ptr, ptr %53, align 8, !tbaa !15
  %434 = getelementptr inbounds i8, ptr %433, i64 80
  %435 = load ptr, ptr %434, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %435, ptr noundef nonnull @.str.32, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 804) #7
  unreachable

436:                                              ; preds = %.thread, %428, %427
  %.pre560575 = phi ptr [ %.pre560574, %.thread ], [ %.pre560580, %428 ], [ %.pre560, %427 ]
  %437 = getelementptr inbounds i8, ptr %0, i64 304
  %438 = load i8, ptr %46, align 1, !tbaa !22
  %439 = sext i8 %438 to i64
  %440 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %439
  %441 = load i16, ptr %440, align 2, !tbaa !52
  %442 = load i16, ptr %362, align 2, !tbaa !52
  %443 = getelementptr inbounds i8, ptr %360, i64 5
  %444 = load i8, ptr %443, align 1, !tbaa !22
  %445 = sext i8 %444 to i64
  %446 = getelementptr inbounds [32 x ptr], ptr %398, i64 0, i64 %445
  %447 = load ptr, ptr %446, align 8, !tbaa !26
  %448 = call i64 @page_numkeys(ptr noundef %447) #8
  %.not424 = icmp eq ptr %.pre560575, null
  br i1 %.not424, label %451, label %449

449:                                              ; preds = %436
  %450 = call i64 @page_room(ptr noundef nonnull %.pre560575) #8
  br label %451

451:                                              ; preds = %436, %449
  %452 = phi i64 [ %450, %449 ], [ 0, %436 ]
  %453 = load ptr, ptr %4, align 8
  %.not425 = icmp eq ptr %453, null
  br i1 %.not425, label %456, label %454

454:                                              ; preds = %451
  %455 = call i64 @page_room(ptr noundef nonnull %453) #8
  br label %456

456:                                              ; preds = %451, %454
  %457 = phi i64 [ %455, %454 ], [ 0, %451 ]
  br i1 %.not424, label %460, label %458

458:                                              ; preds = %456
  %459 = call i64 @page_numkeys(ptr noundef nonnull %.pre560575) #8
  br label %460

460:                                              ; preds = %456, %458
  %461 = phi i64 [ %459, %458 ], [ 0, %456 ]
  br i1 %.not425, label %464, label %462

462:                                              ; preds = %460
  %463 = call i64 @page_numkeys(ptr noundef nonnull %453) #8
  br label %464

464:                                              ; preds = %460, %462
  %465 = phi i64 [ %463, %462 ], [ 0, %460 ]
  %.not430 = or i1 %.not424, %.not425
  %466 = zext i1 %.not430 to i8
  %.not434 = icmp ult i64 %452, %457
  %.not436 = icmp ult i64 %461, %52
  %467 = add i16 %442, -1
  %468 = trunc i64 %461 to i16
  %469 = add i16 %468, -1
  %470 = getelementptr inbounds i8, ptr %360, i64 16
  %471 = getelementptr inbounds i8, ptr %2, i64 368
  %.not441 = icmp ult i64 %465, %52
  %472 = add i16 %442, 1
  %473 = trunc i64 %448 to i16
  %474 = icmp ule i64 %461, %52
  %.not443 = icmp ugt i64 %465, %461
  %.not444 = icmp ult i64 %457, %452
  %or.cond486 = select i1 %.not443, i1 %.not444, i1 false
  %475 = icmp ugt i64 %465, %52
  %.not447 = icmp ult i64 %448, %52
  %476 = trunc nuw i8 %.0371 to i1
  br label %.outer

.outer:                                           ; preds = %709, %464
  %.0372.ph = phi i8 [ %.mux, %709 ], [ %466, %464 ]
  %.1370.ph = phi i64 [ %.1370.mux, %709 ], [ %.0369, %464 ]
  %477 = trunc nuw i8 %.0372.ph to i1
  br label %478

478:                                              ; preds = %.outer, %707
  %.1370 = phi i64 [ 0, %707 ], [ %.1370.ph, %.outer ]
  %479 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %480 = and i8 %479, 1
  %.not431 = icmp eq i8 %480, 0
  br i1 %.not431, label %488, label %481, !prof !13

481:                                              ; preds = %478
  %482 = load i8, ptr %46, align 1, !tbaa !22
  %483 = icmp slt i8 %482, 1
  br i1 %483, label %484, label %488, !prof !13

484:                                              ; preds = %481
  %485 = load ptr, ptr %53, align 8, !tbaa !15
  %486 = getelementptr inbounds i8, ptr %485, i64 80
  %487 = load ptr, ptr %486, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %487, ptr noundef nonnull @.str.33, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 830) #7
  unreachable

488:                                              ; preds = %481, %478
  %489 = load ptr, ptr %3, align 8, !tbaa !26
  %.not432 = icmp eq ptr %489, null
  %brmerge533 = select i1 %.not432, i1 true, i1 %477
  %not..not432 = xor i1 %.not432, true
  br i1 %brmerge533, label %493, label %490

490:                                              ; preds = %488
  %491 = load ptr, ptr %53, align 8, !tbaa !15
  %492 = call zeroext i1 @is_modifable(ptr noundef %491, ptr noundef nonnull %489) #8
  br label %493

493:                                              ; preds = %488, %490
  %494 = phi i1 [ %not..not432, %488 ], [ %492, %490 ]
  %495 = load ptr, ptr %4, align 8, !tbaa !26
  %.not433 = icmp eq ptr %495, null
  %brmerge535 = select i1 %.not433, i1 true, i1 %477
  %not..not433 = xor i1 %.not433, true
  br i1 %brmerge535, label %499, label %496

496:                                              ; preds = %493
  %497 = load ptr, ptr %53, align 8, !tbaa !15
  %498 = call zeroext i1 @is_modifable(ptr noundef %497, ptr noundef nonnull %495) #8
  br label %499

499:                                              ; preds = %493, %496
  %500 = phi i1 [ %not..not433, %493 ], [ %498, %496 ]
  %501 = icmp ule i64 %452, %.1370
  %not. = xor i1 %494, true
  %or.cond476 = select i1 %not., i1 true, i1 %501
  %or.cond477 = select i1 %or.cond476, i1 true, i1 %.not434
  br i1 %or.cond477, label %.critedge480, label %502

502:                                              ; preds = %499
  %.not435 = icmp ne i8 %480, 0
  %or.cond478 = select i1 %.not435, i1 %.not436, i1 false
  br i1 %or.cond478, label %503, label %507, !prof !57

503:                                              ; preds = %502
  %504 = load ptr, ptr %53, align 8, !tbaa !15
  %505 = getelementptr inbounds i8, ptr %504, i64 80
  %506 = load ptr, ptr %505, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %506, ptr noundef nonnull @.str.34, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 835) #7
  unreachable

507:                                              ; preds = %502
  %508 = load i8, ptr %443, align 1, !tbaa !22
  %509 = sext i8 %508 to i64
  %510 = getelementptr inbounds [32 x ptr], ptr %398, i64 0, i64 %509
  store ptr %489, ptr %510, align 8, !tbaa !26
  %511 = load i8, ptr %443, align 1, !tbaa !22
  %512 = sext i8 %511 to i64
  %513 = add nsw i64 %512, -1
  %514 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %513
  store i16 %467, ptr %514, align 2, !tbaa !52
  %515 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %512
  store i16 %469, ptr %515, align 2, !tbaa !52
  %516 = load i8, ptr %46, align 1, !tbaa !22
  %517 = sext i8 %516 to i64
  %518 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %517
  store i16 0, ptr %518, align 2, !tbaa !52
  %519 = load i8, ptr %443, align 1, !tbaa !22
  %520 = sext i8 %519 to i64
  %521 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %520
  %522 = load i16, ptr %521, align 2, !tbaa !52
  %523 = add i16 %522, 1
  %524 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %520
  %525 = load i16, ptr %524, align 2, !tbaa !52
  %526 = add i16 %523, %525
  store i16 %526, ptr %524, align 2, !tbaa !52
  %527 = load ptr, ptr %470, align 8, !tbaa !15
  %528 = getelementptr inbounds i8, ptr %527, i64 120
  %529 = load ptr, ptr %528, align 8, !tbaa !46
  %530 = call i64 @cursor_dbi(ptr noundef %360) #8
  %531 = getelementptr inbounds ptr, ptr %529, i64 %530
  %532 = load ptr, ptr %531, align 8, !tbaa !26
  store ptr %532, ptr %471, align 8, !tbaa !58
  %533 = call i64 @cursor_dbi(ptr noundef %360) #8
  %534 = getelementptr inbounds ptr, ptr %529, i64 %533
  store ptr %2, ptr %534, align 8, !tbaa !26
  %535 = call i32 @page_merge(ptr noundef %0, ptr noundef %360)
  %536 = load ptr, ptr %471, align 8, !tbaa !58
  %537 = load ptr, ptr %470, align 8, !tbaa !15
  %538 = getelementptr inbounds i8, ptr %537, i64 120
  %539 = load ptr, ptr %538, align 8, !tbaa !46
  %540 = call i64 @cursor_dbi(ptr noundef %360) #8
  %541 = getelementptr inbounds ptr, ptr %539, i64 %540
  store ptr %536, ptr %541, align 8, !tbaa !26
  %.not437 = icmp eq i32 %535, -1
  br i1 %.not437, label %.critedge480, label %542, !prof !13

542:                                              ; preds = %507
  %543 = call ptr @cursor_cpstk(ptr noundef nonnull %360, ptr noundef nonnull %0) #6
  %544 = add i16 %441, %468
  %545 = load i8, ptr %46, align 1, !tbaa !22
  %546 = sext i8 %545 to i64
  %547 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %546
  store i16 %544, ptr %547, align 2, !tbaa !52
  %548 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %549 = and i8 %548, 1
  %.not438 = icmp ne i8 %549, 0
  %.not439 = icmp eq i32 %535, 0
  %or.cond492 = and i1 %.not439, %.not438
  br i1 %or.cond492, label %550, label %.critedge484, !prof !61

550:                                              ; preds = %542
  %551 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %546
  %552 = load ptr, ptr %551, align 8, !tbaa !26
  %553 = call i64 @page_numkeys(ptr noundef %552) #8
  %.not502 = icmp ult i64 %553, %52
  br i1 %.not502, label %554, label %.critedge484, !prof !13

554:                                              ; preds = %550
  %555 = load ptr, ptr %53, align 8, !tbaa !15
  %556 = getelementptr inbounds i8, ptr %555, i64 80
  %557 = load ptr, ptr %556, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %557, ptr noundef nonnull @.str.35, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 849) #7
  unreachable

.critedge480:                                     ; preds = %507, %499
  %558 = icmp ugt i64 %457, %.1370
  %or.cond481 = select i1 %500, i1 %558, i1 false
  br i1 %or.cond481, label %559, label %609

559:                                              ; preds = %.critedge480
  %560 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %561 = and i8 %560, 1
  %.not440 = icmp ne i8 %561, 0
  %or.cond482 = select i1 %.not440, i1 %.not441, i1 false
  br i1 %or.cond482, label %562, label %566, !prof !57

562:                                              ; preds = %559
  %563 = load ptr, ptr %53, align 8, !tbaa !15
  %564 = getelementptr inbounds i8, ptr %563, i64 80
  %565 = load ptr, ptr %564, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %565, ptr noundef nonnull @.str.36, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 855) #7
  unreachable

566:                                              ; preds = %559
  %567 = load ptr, ptr %4, align 8, !tbaa !26
  %568 = load i8, ptr %443, align 1, !tbaa !22
  %569 = sext i8 %568 to i64
  %570 = getelementptr inbounds [32 x ptr], ptr %398, i64 0, i64 %569
  store ptr %567, ptr %570, align 8, !tbaa !26
  %571 = load i8, ptr %443, align 1, !tbaa !22
  %572 = sext i8 %571 to i64
  %573 = add nsw i64 %572, -1
  %574 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %573
  store i16 %472, ptr %574, align 2, !tbaa !52
  %575 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %572
  store i16 0, ptr %575, align 2, !tbaa !52
  %576 = load i8, ptr %46, align 1, !tbaa !22
  %577 = sext i8 %576 to i64
  %578 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %577
  store i16 %473, ptr %578, align 2, !tbaa !52
  %579 = load ptr, ptr %470, align 8, !tbaa !15
  %580 = getelementptr inbounds i8, ptr %579, i64 120
  %581 = load ptr, ptr %580, align 8, !tbaa !46
  %582 = call i64 @cursor_dbi(ptr noundef %360) #8
  %583 = getelementptr inbounds ptr, ptr %581, i64 %582
  %584 = load ptr, ptr %583, align 8, !tbaa !26
  store ptr %584, ptr %471, align 8, !tbaa !58
  %585 = call i64 @cursor_dbi(ptr noundef %360) #8
  %586 = getelementptr inbounds ptr, ptr %581, i64 %585
  store ptr %2, ptr %586, align 8, !tbaa !26
  %587 = call i32 @page_merge(ptr noundef %360, ptr noundef %0)
  %588 = load ptr, ptr %471, align 8, !tbaa !58
  %589 = load ptr, ptr %470, align 8, !tbaa !15
  %590 = getelementptr inbounds i8, ptr %589, i64 120
  %591 = load ptr, ptr %590, align 8, !tbaa !46
  %592 = call i64 @cursor_dbi(ptr noundef %360) #8
  %593 = getelementptr inbounds ptr, ptr %591, i64 %592
  store ptr %588, ptr %593, align 8, !tbaa !26
  %.not442 = icmp eq i32 %587, -1
  br i1 %.not442, label %609, label %594, !prof !13

594:                                              ; preds = %566
  %595 = load i8, ptr %46, align 1, !tbaa !22
  %596 = sext i8 %595 to i64
  %597 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %596
  store i16 %441, ptr %597, align 2, !tbaa !52
  %598 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %599 = and i8 %598, 1
  %.not454 = icmp ne i8 %599, 0
  %.not455 = icmp eq i32 %587, 0
  %or.cond493 = and i1 %.not455, %.not454
  br i1 %or.cond493, label %600, label %.critedge484, !prof !61

600:                                              ; preds = %594
  %601 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %596
  %602 = load ptr, ptr %601, align 8, !tbaa !26
  %603 = call i64 @page_numkeys(ptr noundef %602) #8
  %604 = icmp ult i64 %603, %52
  br i1 %604, label %605, label %.critedge484, !prof !13

605:                                              ; preds = %600
  %606 = load ptr, ptr %53, align 8, !tbaa !15
  %607 = getelementptr inbounds i8, ptr %606, i64 80
  %608 = load ptr, ptr %607, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %608, ptr noundef nonnull @.str.35, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 866) #7
  unreachable

609:                                              ; preds = %566, %.critedge480
  %or.cond485 = select i1 %not., i1 true, i1 %474
  %brmerge537 = select i1 %or.cond485, i1 true, i1 %or.cond486
  br i1 %brmerge537, label %654, label %610

610:                                              ; preds = %609
  %611 = load ptr, ptr %3, align 8, !tbaa !26
  %612 = load i8, ptr %443, align 1, !tbaa !22
  %613 = sext i8 %612 to i64
  %614 = getelementptr inbounds [32 x ptr], ptr %398, i64 0, i64 %613
  store ptr %611, ptr %614, align 8, !tbaa !26
  %615 = load i8, ptr %443, align 1, !tbaa !22
  %616 = sext i8 %615 to i64
  %617 = add nsw i64 %616, -1
  %618 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %617
  store i16 %467, ptr %618, align 2, !tbaa !52
  %619 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %616
  store i16 %469, ptr %619, align 2, !tbaa !52
  %620 = load i8, ptr %46, align 1, !tbaa !22
  %621 = sext i8 %620 to i64
  %622 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %621
  store i16 0, ptr %622, align 2, !tbaa !52
  %623 = load ptr, ptr %470, align 8, !tbaa !15
  %624 = getelementptr inbounds i8, ptr %623, i64 120
  %625 = load ptr, ptr %624, align 8, !tbaa !46
  %626 = call i64 @cursor_dbi(ptr noundef %360) #8
  %627 = getelementptr inbounds ptr, ptr %625, i64 %626
  %628 = load ptr, ptr %627, align 8, !tbaa !26
  store ptr %628, ptr %471, align 8, !tbaa !58
  %629 = call i64 @cursor_dbi(ptr noundef %360) #8
  %630 = getelementptr inbounds ptr, ptr %625, i64 %629
  store ptr %2, ptr %630, align 8, !tbaa !26
  %631 = call i32 @node_move(ptr noundef %360, ptr noundef %0, i1 noundef zeroext true)
  %632 = load ptr, ptr %471, align 8, !tbaa !58
  %633 = load ptr, ptr %470, align 8, !tbaa !15
  %634 = getelementptr inbounds i8, ptr %633, i64 120
  %635 = load ptr, ptr %634, align 8, !tbaa !46
  %636 = call i64 @cursor_dbi(ptr noundef %360) #8
  %637 = getelementptr inbounds ptr, ptr %635, i64 %636
  store ptr %632, ptr %637, align 8, !tbaa !26
  %.not445 = icmp eq i32 %631, -1
  br i1 %.not445, label %654, label %638, !prof !13

638:                                              ; preds = %610
  %639 = add i16 %441, 1
  %640 = load i8, ptr %46, align 1, !tbaa !22
  %641 = sext i8 %640 to i64
  %642 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %641
  store i16 %639, ptr %642, align 2, !tbaa !52
  %643 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %644 = and i8 %643, 1
  %.not452 = icmp ne i8 %644, 0
  %.not453 = icmp eq i32 %631, 0
  %or.cond494 = and i1 %.not453, %.not452
  br i1 %or.cond494, label %645, label %.critedge484, !prof !61

645:                                              ; preds = %638
  %646 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %641
  %647 = load ptr, ptr %646, align 8, !tbaa !26
  %648 = call i64 @page_numkeys(ptr noundef %647) #8
  %649 = icmp ult i64 %648, %52
  br i1 %649, label %650, label %.critedge484, !prof !13

650:                                              ; preds = %645
  %651 = load ptr, ptr %53, align 8, !tbaa !15
  %652 = getelementptr inbounds i8, ptr %651, i64 80
  %653 = load ptr, ptr %652, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %653, ptr noundef nonnull @.str.35, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 883) #7
  unreachable

654:                                              ; preds = %609, %610
  %or.cond489 = select i1 %500, i1 %475, i1 false
  br i1 %or.cond489, label %655, label %698

655:                                              ; preds = %654
  %656 = load ptr, ptr %4, align 8, !tbaa !26
  %657 = load i8, ptr %443, align 1, !tbaa !22
  %658 = sext i8 %657 to i64
  %659 = getelementptr inbounds [32 x ptr], ptr %398, i64 0, i64 %658
  store ptr %656, ptr %659, align 8, !tbaa !26
  %660 = load i8, ptr %443, align 1, !tbaa !22
  %661 = sext i8 %660 to i64
  %662 = add nsw i64 %661, -1
  %663 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %662
  store i16 %472, ptr %663, align 2, !tbaa !52
  %664 = getelementptr inbounds [32 x i16], ptr %361, i64 0, i64 %661
  store i16 0, ptr %664, align 2, !tbaa !52
  %665 = load i8, ptr %46, align 1, !tbaa !22
  %666 = sext i8 %665 to i64
  %667 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %666
  store i16 %473, ptr %667, align 2, !tbaa !52
  %668 = load ptr, ptr %470, align 8, !tbaa !15
  %669 = getelementptr inbounds i8, ptr %668, i64 120
  %670 = load ptr, ptr %669, align 8, !tbaa !46
  %671 = call i64 @cursor_dbi(ptr noundef %360) #8
  %672 = getelementptr inbounds ptr, ptr %670, i64 %671
  %673 = load ptr, ptr %672, align 8, !tbaa !26
  store ptr %673, ptr %471, align 8, !tbaa !58
  %674 = call i64 @cursor_dbi(ptr noundef %360) #8
  %675 = getelementptr inbounds ptr, ptr %670, i64 %674
  store ptr %2, ptr %675, align 8, !tbaa !26
  %676 = call i32 @node_move(ptr noundef %360, ptr noundef %0, i1 noundef zeroext false)
  %677 = load ptr, ptr %471, align 8, !tbaa !58
  %678 = load ptr, ptr %470, align 8, !tbaa !15
  %679 = getelementptr inbounds i8, ptr %678, i64 120
  %680 = load ptr, ptr %679, align 8, !tbaa !46
  %681 = call i64 @cursor_dbi(ptr noundef %360) #8
  %682 = getelementptr inbounds ptr, ptr %680, i64 %681
  store ptr %677, ptr %682, align 8, !tbaa !26
  %.not446 = icmp eq i32 %676, -1
  br i1 %.not446, label %698, label %683, !prof !13

683:                                              ; preds = %655
  %684 = load i8, ptr %46, align 1, !tbaa !22
  %685 = sext i8 %684 to i64
  %686 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %685
  store i16 %441, ptr %686, align 2, !tbaa !52
  %687 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %688 = and i8 %687, 1
  %.not450 = icmp ne i8 %688, 0
  %.not451 = icmp eq i32 %676, 0
  %or.cond495 = and i1 %.not451, %.not450
  br i1 %or.cond495, label %689, label %.critedge484, !prof !61

689:                                              ; preds = %683
  %690 = getelementptr inbounds [32 x ptr], ptr %44, i64 0, i64 %685
  %691 = load ptr, ptr %690, align 8, !tbaa !26
  %692 = call i64 @page_numkeys(ptr noundef %691) #8
  %693 = icmp ult i64 %692, %52
  br i1 %693, label %694, label %.critedge484, !prof !13

694:                                              ; preds = %689
  %695 = load ptr, ptr %53, align 8, !tbaa !15
  %696 = getelementptr inbounds i8, ptr %695, i64 80
  %697 = load ptr, ptr %696, align 8, !tbaa !17
  call void @mdbx_assert_fail(ptr noundef %697, ptr noundef nonnull @.str.35, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 899) #7
  unreachable

698:                                              ; preds = %655, %654
  br i1 %.not447, label %707, label %699

699:                                              ; preds = %698
  %700 = load i8, ptr %46, align 1, !tbaa !22
  %701 = sext i8 %700 to i64
  %702 = getelementptr inbounds [32 x i16], ptr %437, i64 0, i64 %701
  store i16 %441, ptr %702, align 2, !tbaa !52
  %703 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %704 = and i8 %703, 2
  %.not449 = icmp eq i8 %704, 0
  br i1 %.not449, label %.critedge484, label %705, !prof !14

705:                                              ; preds = %699
  %706 = call i32 @cursor_validate_updating(ptr noundef nonnull %0) #6
  br label %.critedge484

707:                                              ; preds = %698
  %708 = icmp ne i64 %.1370, 0
  %or.cond3 = select i1 %476, i1 %708, i1 false
  br i1 %or.cond3, label %478, label %709

709:                                              ; preds = %707
  %.not496 = xor i1 %477, true
  %brmerge = select i1 %.not496, i1 true, i1 %708
  %.mux = select i1 %477, i8 %.0372.ph, i8 1
  %.1370.mux = select i1 %477, i64 0, i64 %.1370
  br i1 %brmerge, label %.outer, label %710

710:                                              ; preds = %709
  %711 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %.not448 = icmp eq i8 %711, 0
  br i1 %.not448, label %.critedge484, label %712, !prof !14

712:                                              ; preds = %710
  %713 = call zeroext i1 @is_leaf(ptr noundef %49) #8
  %714 = select i1 %713, ptr @.str.9, ptr @.str.10
  %715 = getelementptr inbounds i8, ptr %49, i64 16
  %716 = load i32, ptr %715, align 1, !tbaa !41
  %717 = load ptr, ptr %53, align 8, !tbaa !15
  %718 = getelementptr inbounds i8, ptr %717, i64 80
  %719 = load ptr, ptr %718, align 8, !tbaa !17
  %720 = call i32 @page_fill_percentum_x10(ptr noundef %719, ptr noundef %49) #8
  %721 = udiv i32 %720, 10
  %722 = urem i32 %720, 10
  %723 = call i64 @page_used(ptr noundef %719, ptr noundef %49) #8
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.tree_rebalance, i32 noundef 931, ptr noundef nonnull @.str.37, ptr noundef nonnull %714, i32 noundef %716, i64 noundef %76, i32 noundef %721, i32 noundef %722, i64 noundef %723, i64 noundef %77) #6
  br label %.critedge484

.critedge484:                                     ; preds = %550, %542, %705, %600, %594, %645, %638, %689, %683, %699, %712, %710, %403, %364
  %.5 = phi i32 [ %378, %364 ], [ %411, %403 ], [ %706, %705 ], [ 0, %600 ], [ %587, %594 ], [ 0, %645 ], [ %631, %638 ], [ 0, %689 ], [ %676, %683 ], [ 0, %699 ], [ -30779, %712 ], [ -30779, %710 ], [ %535, %542 ], [ 0, %550 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #6
  call void @llvm.lifetime.end.p0(i64 824, ptr nonnull %2) #6
  br label %724

724:                                              ; preds = %.critedge484, %328, %329, %229, %215, %216, %._crit_edge532, %.critedge475, %204, %116, %117
  %.7 = phi i32 [ 0, %117 ], [ 0, %116 ], [ %.5, %.critedge484 ], [ %208, %204 ], [ %327, %.critedge475 ], [ 0, %._crit_edge532 ], [ 0, %216 ], [ 0, %215 ], [ %235, %229 ], [ 0, %329 ], [ 0, %328 ]
  ret i32 %.7
}

declare zeroext i1 @cursor_is_tracked(ptr noundef) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare hidden zeroext i8 @page_type(ptr noundef) local_unnamed_addr #1

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

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

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

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

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare hidden i64 @page_used(ptr noundef, ptr 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 #1

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @is_related(ptr noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
declare hidden ptr @cursor_clone(ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare hidden i32 @page_merge(ptr noundef, ptr noundef) local_unnamed_addr #4

declare ptr @cursor_cpstk(ptr noundef, ptr noundef) local_unnamed_addr #5

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

declare i32 @cursor_validate_updating(ptr noundef) local_unnamed_addr #5

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

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

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


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